Hi,
entweder schreibst Du
Code:
mainloop: wdr
in r17,PINB
cp r18,r17
brne mainloop
rcall led ; dann mit "ret" zurück
rjmp mainloop
;------------------------------------------------------------------------
led:
rcall myWait_30ms
inc r19
out PORTC,r19
ret ; mit "rcall" zu "led" gesprungen, also mit "ret" zurück
oder:
Code:
mainloop: wdr
in r17,PINB
cp r18,r17
breq led
rjmp mainloop ; Sprung zum Beginn der Hauptprogrammschleife
;Subroutinen
;------------------------------------------------------------------------
led:
rcall myWait_30ms
inc r19
out PORTC,r19
rjmp mainloop ; <<< Diese Zeile ist gemeint
oder:
Code:
mainloop: wdr
in r17,PINB
cpse r18,r17
rjmp mainloop ; Sprung zum Beginn der Hauptprogrammschleife
;Subroutinen
;------------------------------------------------------------------------
led:
rcall myWait_30ms
inc r19
out PORTC,r19
rjmp mainloop ; <<< Diese Zeile ist gemeint
So ist es wenigstens formell richtig. Die Programmlogik habe ich nicht überprüft. "Schön" ist der Code auch nicht -- aber das lernt man erst mit der Zeit.
"rcall" legt die Rücksprungadresse auf den Stack, die von "ret" benutzt wird, zu PC+1 zurückzukehren. Bei "breq" und "rjmp" ist das nicht der Fall, also kannst Du nach einer solchen Verzweigung nicht mit "ret" zurückspringen! Wenn Du es doch versuchst, wird ein Wert vom Stack geholt und als Rücksprungadresse interpretiert -- die zeigt natürlich ins Blaue... Zudem korrumpierst Du damit den Stack(pointer).
Gruß
Fred
Lesezeichen