MPLabX IDE 5.4'te en basit montaj dosyası nasıl oluşturulur

Aug 19 2020

MPLabX IDE 5.4'te montaj kodlamayı öğrenmeye başladım. Herhangi bir donanım, simülatör veya hata ayıklayıcı bağlamadan, sadece bir nesne kodu dosyası oluşturmak ve bir montaj dosyasından bir liste dosyası oluşturmak istiyorum - sadece IDE'nin çalışıp çalışmadığını kontrol etmek için. Ancak mümkün olan en basit montaj hatlarını oluştururken bile belirsiz hata mesajları almaya devam ettim.

Şekil [1-6] 'da gösterildiği gibi, MPLabX IDE'nin XC8 entegrasyonu ile birlikte düzgün bir şekilde kurulmasını sağlamalıyım (bu, MPASM assembler için pic-as assembly derleyicisini veya başka bir adı paketliyor gibi görünüyor - saatlerce uğraştıktan sonra) ve neden bir MPASM kodu için bir C derleyicisine ihtiyacım olduğunu araştırıyorum, ta ki bunların paketlendiğini anlayana kadar). Daha sonra tek bir yorum satırı ve bir endtalimat içeren bir montaj dosyası oluşturmayı test ettim . Derleme başarıyla oluşturuldu, ancak listeleme dosyası için hiçbir yerde bulamıyorum (tüm dizinlerde arama yapan bir * .lst dosyası bulunamadı).

Daha önce herhangi bir talimat ekler koymaz end, inşa süreci Şekil [7] ' de gösterildiği gibi başarısız oldu .

  1. Montaj kodum neden oluşturulmuyor?
  2. Oluşturma sürecim (başarısız veya başarılı) neden herkes gibi liste dosyasını oluşturmadı

[DÜZENLE]
Montaj kodu dosyası burada. Proje [1-6]. Adımdan oluşturulmuştur. Üç satırlık talimat içeren yeni bir montaj dosyası ( FooFile.asm ) oluşturdum - org, clrw ve end.

Yanıtlar

7 Dan1138 Aug 21 2020 at 03:59

Microchip, MPLABX v5.40'ın en son sürümünü kullanarak 8 bitlik birleştirme dili uygulamaları geliştirmeyi çok zorlaştırdı.

Yardımcı olmak için burada bulabileceğiniz bir PIC16F84A örnek projesi hazırladım .

Bu pic-as (v2.20) kaynak kodudur:

    ;
    ; File:     main.S
    ; Target:   PIC16f84A
    ; Author:   dan1138
    ; Date:     2020-08-20
    ; Compiler: pic-as(v2.20)
    ; IDE:      MPLABX v5.40
    ;
    ; Description:
    ;
    ;   Example project for the PIC16F84A controller using the pic-as(v2.20) tool chain.
    ;
    ; Add this line in the project properties box, pic-as Global Options -> Additional options: 
    ;   -Wa,-a -Wl,-pPor_Vec=0h,-pIsr_Vec=4h
    ;
    ;                           PIC16F84A
    ;                   +----------:_:----------+
    ;             <>  1 : RA2               RA1 : 18 <> 
    ;             <>  2 : RA3               RA0 : 17 <> 
    ;             <>  3 : RA4/T0CKI        OSC1 : 16 <- 4MHz crystal
    ;    ICSP_VPP ->  4 : MCLR             OSC2 : 15 -> 4MHz crystal     
    ;         GND ->  5 : GND               VDD : 14 <- 5v0
    ;             <>  6 : RB0/INT       PGD/RB7 : 13 <> ICSP_PGD
    ;             <>  7 : RB1           PGC/RB6 : 12 <> ICSP_PGC
    ;             <>  8 : RB2               RB5 : 11 <> 
    ;             <>  9 : RB3               RB4 : 10 <> 
    ;                   +-----------------------:
    ;                            DIP-18

        PROCESSOR   16F84A
        PAGEWIDTH   132
        RADIX       DEC

    #include <xc.inc>

    ; PIC16F84A Configuration Bit Settings

     config FOSC = HS        ; Oscillator Selection bits (HS oscillator)
     config WDTE = OFF       ; Watchdog Timer (WDT disabled)
     config PWRTE = OFF      ; Power-up Timer Enable bit (Power-up Timer is disabled)
     config CP = OFF         ; Code Protection bit (Code protection disabled)

      skipnc  MACRO
        btfsc   STATUS,STATUS_C_POSITION
      ENDM

      skipnz  MACRO
        btfsc   STATUS,STATUS_Z_POSITION
      ENDM
    ;
    ; Power-On-Reset entry point
    ;
        PSECT   Por_Vec,global,class=CODE,delta=2
        global  resetVec
    resetVec:
        PAGESEL main                ;jump to the main routine
        goto    main

    ;
    ;   Data space use by interrupt handler to save context
        PSECT   Isr_Data,global,class=RAM,space=1,delta=1,noexec
    ;
        GLOBAL  WREG_save,STATUS_save
    ;
    WREG_save:      DS  1
    STATUS_save:    DS  1
    PCLATH_save:    DS  1
    ;
    ;   Interrupt vector and handler
        PSECT   Isr_Vec,global,class=CODE,delta=2
        GLOBAL  IsrVec
    ;
    IsrVec:
        movwf   WREG_save
        swapf   STATUS,W
        movwf   STATUS_save
        movf    PCLATH,W
        movwf   PCLATH_save
    ;
    IsrHandler:
    ;
    IsrExit:
        movf    PCLATH_save,W
        movwf   PCLATH
        swapf   STATUS_save,W
        movwf   STATUS
        swapf   WREG_save,F
        swapf   WREG_save,W
        retfie                      ; Return from interrupt
        

    ;objects in bank 0 memory
        PSECT   MainData,global,class=RAM,space=1,delta=1,noexec
    max:    DS      1               ;reserve 1 byte for max
    tmp:    DS      1               ;reserve 1 byte for tmp

    /* find the highest PORTB value read, storing this into the object max */
        PSECT   MainCode,global,class=CODE,delta=2
    main:
        BANKSEL TRISB               ;starting point
        movlw   0xFF
        movwf   BANKMASK(TRISB)     ;
        BANKSEL max
        clrf    BANKMASK(max)
    loop:
        BANKSEL PORTB               ;read and store port value
        movf    BANKMASK(PORTB),w
        BANKSEL tmp
        movwf   BANKMASK(tmp)
        subwf   max,w               ;is this value larger than max?
        skipnc
        goto    loop                ;no - read again
        movf    BANKMASK(tmp),w     ;yes - record this new high value
        movwf   BANKMASK(max)
        goto    loop                ;read again
        END     resetVec

Git veri havuzumdan MPLABX projesinin tamamının bir kopyasını edinirseniz lütfen. MPLABX'te bir assembly dili projesi kurma hakkında öğrenmeniz gereken, Microchip'in henüz yeterince ayrıntılı olarak belgelemediği şeyler var.

Mikroçip varsa ben çalışan değilim ve onlar için bunu yapacak kadar bana ödeme yapamadılar.

Okullar sonbahar oturumlarında PIC montaj dilini öğretmeye başladıkça, MPLABX araçlarıyla ilgili sorunların daha fazla sorun haline gelmesini bekliyorum. Bu cevapla amacım, daha fazla öğrenciye yardım etmeye çalışmak, topal aletlerle ilgili önemsiz sorunlar nedeniyle hüsrana uğramamak ve başarısız olmaktır.

2 KMC Aug 19 2020 at 23:33

Microchip'in MPLab X ve XC8 için sahip olduğu belgeler muhtemelen okuduğum en kötü belgelerden bazıları. MPLab X IDE 5.4'te çalışan montajcıyı elde etmek için birden fazla kaynaktan okuduklarımı birleştirmek zorunda kaldım ve bazı tahminlerle. İşte hata veya uyarı mesajları olmadan birleştirilecek montaj kodu.

PROCESSOR 16F84A
#include <xc.inc>
PSECT   code
        org     00
loop:   clrw
        end     loop

Tüm okuduğum öğreticiler ve kitaplar , XC8'deki resimdeki gibi, mevcut yerine MPASM assembler'ı kullanıyor. MPASM ve daha eski MPLab ile, saf montaj kodu sadece oluşturulur. Ancak mevcut XC8 ve pic-as ile, / Applications / microchip / xc8 / v2'yi işaret eden bir yönergeye sahip olduğu /Applications/microchip/xc8/v2.20/pic/include/xc.inc'i dahil ederek başlamalısınız. 20 / pic / include / pic.inc sırayla /Applications/microchip/xc8/v2.20/pic/include/ic_as_chip_select.inc'e işaret eden ve sonunda /Applications/microchip/xc8/v2.20/ PSECT'i tanımlayan pic / include / proc / pic16f84a.inc :

psect udata,class=RAM,space=SPACE_DATA,noexec
psect udata_bank0,class=BANK0,space=SPACE_DATA,noexec
psect code,class=CODE,space=SPACE_CODE,delta=2
psect data,class=STRCODE,space=SPACE_CODE,delta=2,noexec
psect edata,class=EEDATA,space=SPACE_EEPROM,delta=2,noexec

Belirsiz sebep ne olursa olsun psect, montaj kodunun etrafına sarılması gerekir . Açıklama şu şekilde verilmiştir (ne hakkında konuştuğunu veya neden bir C işlev çağrısını parantez sarma gibi bir derleme kodunu sarmam gerektiğine dair hiçbir fikrim yok):

Psects - program bölümlerinin kısaltması - programın ilgili bölümlerini gruplayan ve tutan kaplardır, bu parçaların kaynak kodu kaynak dosyada fiziksel olarak bitişik olmayabilir veya hatta birkaç modüle yayılmış olabilir. Bağlayıcı tarafından belleğe yerleştirilen en küçük varlıklardır.

Listeleme dosyasına gelince: listeleme dosyasını okuma veya çıktı alma talimatı MPLAB® X IDE Kullanım Kılavuzunda (Bölüm 5.16 sayfa 127) belirtilmiştir: Pencere> Hata Ayıklama> Çıktı> DisassemblyListingFile . Alternatif olarak, listeleme dosya outputted edilebilir /MyProject/disassembly/listing.disasm (değil * içinde .lst ekleyerek Mikroçip forum ya da rehber anlaşılacağı! Olarak formatında) -code=0h -Wa,-aiçinde / pic-asLinker / CustomLinkerOptions ProjectProperties (söz edilmez veya XC8 komut satırı altında derleme örnekleri sunduğu MPLAB® XC8 PIC Assembler Kullanım Kılavuzunu Gömülü Mühendisler için okuyarak nereye yerleştireceğimi tahmin ettim. IDE altında oluşturulan dosyaların hiçbiri tüm ayrıntıları sağlamaz - talimatların vektör adreslerini bile göstermez!

Disassembly Listing for FooProject
Generated From:
/Users/*******/Desktop/Foo/dist/default/production/Foo.production.elf


---  /Users/*******/Desktop/Foo/FooFile.asm  ------------------------------------------------------------
                                                  1:     PROCESSOR 16F84A
                                                  2:     #include <xc.inc>
                                                  3:     PSECT code
                                                  4:         ; a commend
                                                  5:        org     00
01FF  0103     CLRW                               6:     loop:  clrw
                                                  7:        end     loop
 

Kendi cevabımı kabul etmeyeceğim. Birisi bulmamı ele alabilir veya psect'in neden orada olduğunu ve vektör adreslerini göstermek için listeleme dosyasını nasıl alacağımı açıklamaya yardımcı olabilirse , cevabını kabul ederim.

[DÜZENLE] -Wa, -a seçeneğini kullanarak MPLabX 5.4 veya X8 (pis-as) CLI ile listeleme dosyasını çıktı almak için.

// Derleyicinin C ön işlemcisini önceden işleyebilmesi için kaynak dosya * .S uzantısı ile bitmelidir $ sudo pic-as -mcpu = 16F84A -Wa, -a SourceFileName.S -o OutputFolderName / OutputFileName