วิธีสร้างไฟล์ประกอบที่ง่ายที่สุดใน MPLabX IDE 5.4

Aug 19 2020

ฉันเพิ่งเริ่มเรียนรู้การเข้ารหัสแอสเซมบลีใน MPLabX IDE 5.4 โดยไม่ต้องเชื่อมต่อฮาร์ดแวร์ตัวจำลองหรือดีบักเกอร์ฉันแค่ต้องการสร้างไฟล์รหัสออบเจ็กต์และสร้างไฟล์รายการจากไฟล์แอสเซมบลีเพียงเพื่อตรวจสอบว่า IDE ทำงานได้หรือไม่ แต่ฉันยังคงได้รับข้อความแสดงข้อผิดพลาดที่ไม่ชัดเจนแม้จะสร้างสายการประกอบที่ง่ายที่สุด

ดังแสดงในรูปที่[1 - 6]ฉันควรติดตั้ง MPLabX IDE อย่างถูกต้องพร้อมกับการรวม XC8 (ซึ่งดูเหมือนว่าจะรวมกับคอมไพเลอร์ประกอบ pic-as หรือชื่ออื่นสำหรับแอสเซมเบลอร์ MPASM - หลังจากที่ฉันดิ้นรนเป็นเวลาหลายชั่วโมง และค้นหาว่าเหตุใดฉันจึงต้องการคอมไพเลอร์ C สำหรับโค้ด MPASM จนกว่าฉันจะรู้ว่ามันถูกรวมเข้าด้วยกัน) จากนั้นฉันทดสอบการสร้างไฟล์แอสเซมบลีโดยใช้ความคิดเห็นหนึ่งบรรทัดและendคำสั่ง สร้างแอสเซมบลีสำเร็จแล้ว แต่ฉันไม่พบไฟล์รายชื่อที่ใดเลย (ไม่พบไฟล์ * .lst เพียงไฟล์เดียวที่ค้นหาผ่านไดเรกทอรีทั้งหมด)

เร็วที่สุดเท่าที่ฉันจะเพิ่มคำแนะนำใด ๆ ก่อนที่endกระบวนการอาคารล้มเหลวดังแสดงในรูป[7]

  1. เหตุใดรหัสการประกอบของฉันจึงไม่สร้างขึ้น
  2. เหตุใดกระบวนการสร้างของฉันจึงไม่ (ล้มเหลวหรือสำเร็จ) สร้างไฟล์รายการเหมือนคนอื่น ๆ

[แก้ไข]
นี่คือไฟล์รหัสประกอบ โครงการนี้สร้างขึ้นจากขั้นตอนที่ [1-6] ฉันเพิ่งสร้างไฟล์แอสเซมบลีใหม่ ( FooFile.asm ) พร้อมคำสั่งสามบรรทัด - org, clrw และ end

คำตอบ

7 Dan1138 Aug 21 2020 at 03:59

ไมโครชิปได้ทำให้การพัฒนาแอปพลิเคชันภาษาแอสเซมบลี 8 บิตเป็นเรื่องยากมากโดยใช้ MPLABX v5.40 รุ่นล่าสุด

ที่จะช่วยให้ผมได้สร้างขึ้นมาเป็นโครงการตัวอย่าง PIC16F84A คุณสามารถหาได้ที่นี่

นี่คือซอร์สโค้ด pic-as (v2.20):

    ;
    ; 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

หากคุณสามารถขอสำเนาของโครงการ MPLABX ทั้งหมดจากที่เก็บ git ของฉัน มีบางสิ่งที่คุณต้องเรียนรู้เกี่ยวกับการตั้งค่าโปรเจ็กต์ภาษาแอสเซมบลีใน MPLABX ที่ไมโครชิปยังไม่มีรายละเอียดเพียงพอ

ฉันไม่ใช่พนักงานถ้าไมโครชิปและพวกเขาไม่สามารถจ่ายเงินให้ฉันมากพอที่จะทำสิ่งนี้ให้กับพวกเขา

ฉันคาดว่าปัญหาเกี่ยวกับเครื่องมือ MPLABX จะเป็นปัญหามากขึ้นเมื่อโรงเรียนเริ่มสอนภาษาแอสเซมบลีของ PIC ในช่วงฤดูใบไม้ร่วง เป้าหมายของฉันกับคำตอบนี้คือพยายามช่วยก่อนที่จะมีนักเรียนจำนวนมากขึ้นเพื่อไม่ให้หงุดหงิดและล้มเหลวเนื่องจากปัญหาเล็กน้อยเกี่ยวกับเครื่องมือง่อย

2 KMC Aug 19 2020 at 23:33

เอกสารที่ไมโครชิพมีสำหรับ MPLab X และ XC8 อาจเป็นเอกสารที่แย่ที่สุดที่ฉันเคยอ่านมา ฉันต้องเชื่อมโยงสิ่งที่ฉันอ่านจากหลายแหล่งและด้วยการคาดเดาบางอย่างเพื่อให้แอสเซมเบลอร์ทำงานใน MPLab X IDE 5.4 นี่คือรหัสแอสเซมบลีที่จะประกอบโดยไม่มีข้อความแสดงข้อผิดพลาดหรือคำเตือน

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

บทแนะนำและหนังสือที่ฉันอ่านทั้งหมดใช้แอสเซมเบลอร์ MPASM แทนที่จะเป็นการแทนที่ในปัจจุบัน pic-as ใน XC8 ด้วย MPASM และ MPLab รุ่นเก่ารหัสแอสเซมบลีที่แท้จริงจะถูกสร้างขึ้น แต่ด้วย XC8 และ pic-as ปัจจุบันคุณต้องเริ่มต้นด้วยการรวม/Applications/microchip/xc8/v2.20/pic/include/xc.incโดยมีคำสั่งชี้ไปที่/ Applications / microchip / xc8 / v2 20 / pIC / รวม / pic.incซึ่งในรอบมีการชี้คำสั่งเพื่อ/Applications/microchip/xc8/v2.20/pic/include/ic_as_chip_select.incที่จุดที่สุด/Applications/microchip/xc8/v2.20/ pic / include / proc / pic16f84a.incที่กำหนดPSECT :

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

ไม่ว่าจะด้วยเหตุผลใดก็ตามที่คลุมเครือจะต้องมีการpsectพันรอบรหัสการประกอบ คำอธิบายจะได้รับตามนี้ (ฉันไม่รู้ว่ามันกำลังพูดถึงอะไรหรือทำไมฉันต้องห่อรหัสแอสเซมบลีเช่นฉันยึดการเรียกฟังก์ชัน C):

Psects ย่อมาจากส่วนของโปรแกรมเป็นคอนเทนเนอร์ที่จัดกลุ่มและเก็บส่วนที่เกี่ยวข้องของโปรแกรมไว้แม้ว่าซอร์สโค้ดสำหรับส่วนเหล่านี้อาจไม่ได้อยู่ติดกันในซอร์สไฟล์หรืออาจกระจายไปยังโมดูลต่างๆ เป็นเอนทิตีที่เล็กที่สุดที่ตัวเชื่อมโยงเข้าสู่หน่วยความจำ

สำหรับรายชื่อไฟล์: คำแนะนำในการอ่านหรือการส่งออกแฟ้มรายชื่อที่ถูกกล่าวถึงบ้างในคู่มือการใช้MPLAB® X IDE ของ 's (มาตรา 5.16 ในหน้า 127): หน้าต่าง> การแก้จุดบกพร่อง> เอาท์พุท> DisassemblyListingFile หรืออีกวิธีหนึ่งคือสามารถส่งไฟล์รายชื่อไปที่/MyProject/disassembly/listing.disasm (ไม่อยู่ในรูปแบบ* .lstตามที่ฟอรัม Microchip หรือคำแนะนำแนะนำ!) โดยการแทรก-code=0h -Wa,-aในProjectProperties / pic-asLinker / CustomLinkerOptions (ไม่มีการกล่าวถึงหรือ คำแนะนำในคู่มือผู้ใช้ของพวกเขาและฉันเพิ่งจะเดาได้ถูกต้องว่าจะแทรกสิ่งใดจากการอ่านคู่มือผู้ใช้MPLAB® XC8 PIC Assembler สำหรับ Embedded Engineers ) ซึ่งมีตัวอย่างการรวบรวมภายใต้บรรทัดคำสั่ง XC8 ทั้งรายชื่อไฟล์ที่สร้างภายใต้ IDE ไม่ให้รายละเอียดทั้งหมด - มันไม่ได้แสดงที่อยู่เวกเตอร์ของคำแนะนำ!

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
 

ฉันจะไม่ยอมรับคำตอบของตัวเอง หากมีใครสามารถช่วยหาคำตอบของฉันหรืออธิบายได้ว่าทำไมแมลงจึงอยู่ที่นั่นและวิธีรับไฟล์รายชื่อเพื่อแสดงที่อยู่เวกเตอร์ฉันจะยอมรับคำตอบของเขา / เธอ

[แก้ไข] เพื่อส่งออกไฟล์แสดงรายการบน MPLabX 5.4 หรือด้วย X8 (pis-as) CLI โดยใช้ตัวเลือก -Wa, -a

// ซอร์สไฟล์ต้องลงท้ายด้วยนามสกุล *.S เพื่อให้คอมไพเลอร์ประมวลผลล่วงหน้า C พรีโปรเซสเซอร์ $ sudo pic-as -mcpu = 16F84A -Wa, -a SourceFileName.S -o OutputFolderName / OutputFileName