Hallo, hab ma wieder eine frage! Folgendes! cp R30,R16 BRSH LED1grün cbi PortD.2 ; Hier ist die grüne LED angeschlossen!!! cp r30,r17 LED1grün: sbi PORTD.2 reti Hier die Frage: Springt der AVR jetzt zurück zu cbi PORTD.2 oder springt der jetzt gleich zu cp R30,R17? Danke! MFG Steven
Gast
#537077
Da springt gar nichts (zumindest nicht definiert), weil es einen Stack
Underflow gibt...
Ein Unterprogramm wird mit "(r)call" aufgerufen und mit "ret" ("reti"
nur bei Interrupt Handlern) beendet. Ein Branch-Befehl wie "brsh"
verzweigt aber nur, ohne dabei eine Rücksprungadresse auf dem Stack
abzulegen. Deshalb wird beim "ret" (oder "reti") ein Wert vom Stack
genommen, der gar nicht da ist. Und dann gehts ins Nirvana.
BTW: Welcher Assembler akzeptiert denn die Schreibweise "PortD.2"?
Steven Zimmermann wrote: > Hallo, hab ma wieder eine frage! > > Folgendes! > > cp R30,R16 > BRSH LED1grün > cbi PortD.2 ; Hier ist die grüne LED angeschlossen!!! > cp r30,r17 > > LED1grün: sbi PORTD.2 > reti > > Hier die Frage: Springt der AVR jetzt zurück zu cbi PORTD.2 oder springt > der jetzt gleich zu cp R30,R17? Er springr dahin, was in den RAM-Zellen steht, auf die der Stackpointer zeigt und verursacht dabei einen Stackunterlauf, der Dein Programm zum Absturz bringt. RETI nimmt man nur für den Rücksprung aus der Interrupt-Behandlungsroutine, RET nur nach (R)JMP... > > > Danke! Nix zu danken, Kundendienst... > > MFG > > Steven ...
Der assembler ist von SiSY,
Aber theoretisch müßte es doch os klappen?
cp R30,r16
BRSH LED1grün
cbi PortD.2
LED1Grün: sbi PortD.2
cp r30,r16
BRSH LED2Blau
:
:
:
der springt doch wenn die bedingung erfüllt ist, nach LED1grün und
arbeitet dann nach unten weiter oder irre ich mich jetzt?
MFG
Gast
#537099
@Hannes
> RET nur nach (R)JMP...
Bist Du da auch ganz sicher?
Ich würde es nur nach (R)CALL nehmen ;-))
Gast
#537107
Der Unterschied zwischen ret und reti ist, dass bei reti das I-Bit (globaler Interrupt im SREG) gesetzt wird. Das kann man immer benutzen wenn's benötigt wird, ist nicht auf ISRs beschränkt.
Dieter Werner wrote: > @Hannes > >> RET nur nach (R)JMP... > > Bist Du da auch ganz sicher? > > Ich würde es nur nach (R)CALL nehmen ;-)) Stimmt... Passiert im Gedränge auf'm Frauenklo... 8-o Ich könnte jetzt zwar schreiben, dass das nur ein kleiner Aufmerksamkeitstest war, aber das kauft mir sowiso keiner ab. Ich könnte meinen Beitrag auch löschen (wird mir noch angeboten), aber ich stehe zu dem Unfug, den ich schreibe. Kein Mensch ist fehlerfrei, wer weiß, wo ich da gerade mit meinen Gedanken war. Aber danke für den Hinweis, so bleibt es wenigstens nicht unwidersprochen stehen. Gruß, Hannes
Steven Zimmermann wrote: > Aber theoretisch müßte es doch os klappen? > > cp R30,r16 > BRSH LED1grün > cbi PortD.2 > LED1Grün: sbi PortD.2 > cp r30,r16 > BRSH LED2Blau > der springt doch wenn die Bedingung erfüllt ist, nach LED1grün und > arbeitet dann nach unten weiter oder irre ich mich jetzt? > Soweit OK, allerdings schaltet das Programm die grüne LED auch ein, wenn das erste BRSH nicht erfüllt ist! Nach dem cbi PortD.2 fehlt ein rjmp: cp R30,r16 BRSH LED1grün cbi PortD.2 rjmp testBlau ; <----- LED1grün: sbi PortD.2 testBlau: cp r30,r16 BRSH LED2Blau Dann noch auf die GROß kleinschreibung achten (OK, nicht bei allen Compilern relevant, bei manchen aber doch, Umlaute wuerde ich auch weglassen) LED1grün != LED1Grün Viel Spaß, Klaus
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.