Ausgabecode der MPLAB-Assembly springt

Ich habe einige Probleme mit dem, was ich für guten Code halte. Dies ist für eine Uni-Aufgabe, aber das ist nicht der Code, den ich einreiche. Dies ist eine Testdatei, um zu verstehen, wie alles funktioniert. Ein Teil dieses Codes wurde in der Aufgabe angegeben: die snum- und binären Abschnitte.

Ich muss jede Zahl nacheinander in snum erhalten und die entsprechende Binärzahl einige Sekunden lang auf einem 7-Segment anzeigen. Es läuft im Debugger bis 'Call Binary', dann springt es wieder auf Start (danach Instructino).

Ich weiß nicht, was ich falsch mache. Irgendwelche Ideen?

; Directive sets processor type .............................

        list  p=16F84A
        #include "P16F84A.INC"

; Set configuration fuses ...................................

        __CONFIG _CP_OFF & _WDT_OFF &_PWRTE_ON & _RC_OSC

; Code protection off, watchdog timer off, power up timer on, RC Clock

        errorlevel  -302        ;No warnings, register not in Bank 0
PCL         EQU     02  ; Program Counter Low
PORTB       EQU     06  ; Port B Data Register
TRISB   EQU 86  ; Port B Data direction register
STATUS  EQU 03  ; Status register
RP0 EQU 05  ; Bank select bit
timer       EQU     0C  ; GPR1 used as delay counter
point       EQU     0D  ; GPR2 used as table pointer

    org 000
    goto    start

snum    addwf   PCL,F
    dt  "0001035020"    ;Substitute your student number
                        ;(10 ASCII digits)

;       Pattern table for seven segment display on Port B ..

binary  addwf   PCL,F
    retlw   b'00111111' ;Set display to 0
    retlw   b'00000110' ;Set display to 1
    retlw   b'01011011' ;Set display to 2
    retlw   b'01001111' ;Set display to 3
    retlw   b'01100110' ;Set display to 4
    retlw   b'01101101' ;Set display to 5
    retlw   b'01111111' ;Set display to 6
    retlw   b'00000111' ;Set display to 7
    retlw   b'01111111' ;Set display to 8
    retlw   b'01101111' ;Set display to 9

; Initialise Port B (Port A defaults to inputs)........

start   bcf STATUS,RP0  ;Bank select 0
    clrf    PORTB   ;Clear Port B data latches
    bsf STATUS,RP0  ;Bank select 1
    movlw   0x00    ;
    movwf   TRISB   ;Set port B lines to output
    bcf STATUS,RP0  ;Bank select 0

; MAIN LOOP
nextdigit   movlw   d'10'
    subwf   point,W
    btfsc   3,2
    goto    nextdigit
    movf    point,W
    call    snum
    call    binary
    movwf   PORTB
    NOP
    NOP
    incf    point
    goto    nextdigit

    end
Anstatt Nummern für Register ( btfsc 3,2) zu verwenden, würde ich Ihnen empfehlen, die Registernamen ( btfsc STATUS, Z) für die Lesbarkeit zu verwenden.
Und verwenden Sie banksel, um die Bank zu wechseln, anstatt mit den Statusbits herumzuspielen.
Muss einen Teil des Aufgabenlernens usw. durchspielen. Danke für die Sache 3 und 2. Ich habe Status und Z-Setup in der größeren Datei, aber es hat nicht funktioniert. Das obige wurde aus vielen Dateien zusammengeworfen
Über Ihren Code könnte noch viel mehr gesagt werden, von dem Ihnen vieles nicht gefallen wird, aber da Sie bereits eine Antwort akzeptiert haben, ist es sowieso sinnlos.

Antworten (1)

Sie initialisieren das Register nicht point. Das bedeutet, dass es jeden Wert halten kann , wenn Sie mit dem Schleifen der nextdigitSchleife beginnen! Versuchen Sie, ein clrf pointunter dem startEtikett hinzuzufügen.

Zum Debuggen: In MPLAB -> Ansicht -> Dateiregister können Sie den Wert von pointwährend der Laufzeit sehen.