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
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
@Hannes
> RET nur nach (R)JMP...
Bist Du da auch ganz sicher?
Ich würde es nur nach (R)CALL nehmen ;-))
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
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.