www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Rücksprung?


Autor: Steven Zimmermann (stivi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"?

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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

...

Autor: Steven Zimmermann (stivi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dieter Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Hannes

>  RET nur nach (R)JMP...

Bist Du da auch ganz sicher?

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



Autor: Power (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Leidinger (klausleidinger)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.