Hi,
entweder schreibst Du
oder: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
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.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
"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







Zitieren

Lesezeichen