Hallo, mein erstes Programm mit Rücksprung funktioniert nicht. Nach Aufruf und Durchlauf von "RCALL wait" springt es zurück nach "start:" und nicht nach "LDI R16,16". Bei anderen Testprogrammen mit RCALL und RET habe ich das gleiche Problem. Der Rücksprung erfolgt immer zum Programmanfang und nicht dahin wo der Stack steht. Was mache ich falsch? Vielen dank! .INCLUDE "M16DEF.INC" RJMP start start: SBI DDRB,3 SBI DDRB,4 loop: LDI R16,8 ;PB3 = 1, PB4 = 0 // 2^3 = 8 OUT PORTB,R16 RCALL wait LDI R16,16 ;PB3 = 0, PB4 = 1 // 2^4 = 16 OUT PORTB, R16 RCALL wait RJMP loop wait: LDI R16,2 ;äußere Schleife wait_1: LDI R17,2 ;innere Schleife wait_2: DEC R17 BRNE wait_2 DEC R16 BRNE wait_1 RET ;Rücksprung
Der Stackpointer muss auch vorbereitet werden. Also vor dem ersten Unterprogrammaufruf so etwas wie: ldi r16,high (STACKBEGINN) out SPH,r16 ldi r16,low (STACKBEGINN) out SPL,r16
als STACKBEGINN bietet sich in der Regel RAMEND an, das im Device-Include-File definiert ist. Also ldi r16,high (RAMEND) out SPH,r16 ldi r16,low (RAMEND) out SPL,r16
SUPER es klappt! Danke an Alle! Prima Gruß aus Moers! Bernd
Die neueren ATMegas und Tinys ab etwa 2007 initialisieren ihren Stack automatisch auf RAMEND, das steht im jeweiligen Datenblatt.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.