Forum: Mikrocontroller und Digitale Elektronik Rücksprung?


von Steven Z. (stivi)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

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"?

von Hannes L. (hannes)


Lesenswert?

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

...

von Steven Z. (stivi)


Lesenswert?

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

von Dieter Werner (Gast)


Lesenswert?

@Hannes

>  RET nur nach (R)JMP...

Bist Du da auch ganz sicher?

Ich würde es nur nach (R)CALL nehmen  ;-))



von Power (Gast)


Lesenswert?

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.

von Hannes L. (hannes)


Lesenswert?

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

von Klaus L. (kllei)


Lesenswert?

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
Noch kein Account? Hier anmelden.