www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Schleifen-logik


Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin

ich habe eine frage:

mainloop:
getKey:  wdr
         in r24, PIND
         sbrc r24, 2
         rjmp getKey

         inc r16
         brne warte
         inc r17
         brne warte

         rol 18

         out PORTB, r18
         rjmp mainloop

warte:   rjmp mainloop


Ich hab zwei Verständisprobleme:

         rjmp getKey
-> wann werden die nächsten folgenden Befehle ausgeführt? weil durch 
rjmp springt man doch einfach zu getKey wieder zurück.

und die nächste Frage:

        brne warte;
-> wenn diese Routine beim ersten mal ausgeführt wird, wird brne warte; 
ausgeführt --> dann wird das prog wieder am anfang gestartet bei 
mainloop --> dann ist man doch wieder in der getKey Schleife?

Irgendwie hab ich noch Schwierigkeiten bei den "Schleifen" wie diese 
durchlaufen werden.

Bernd



Autor: Magnetikus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sollte das (nicht) ins uc Forum ?

Autor: jemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal in der Befehltabelle, was der Befehl 'sbrc' macht.
In diesem konkreten Fall sagt der nämlich: Überspringe den nächsten 
Befehl, wenn Bit 2 in r24 nicht gesetzt (soll heissen 0) ist. Die getKey 
Schleife wird also genau dann nicht mehr ausgeführt, wenn der Taster 
(oder eine sonstige Signalquelle), der am PinD2 hängt, nach Masse zieht 
bzw. der anliegende Pegel als low angesehen wird.

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen dank für deine antwort... hab ich völlig übersehen...

aber wie funktionier es bei brne?

Bernd

Autor: jemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd wrote:
> aber wie funktionier es bei brne?

Der Knackpunkt ist der, dass die bedingten Sprungbefehle
sich auf die momentane Flagzustände stützen. Diese wiederrum
hängen von der letzten Instruktion vor dem bedingten Sprung ab,
welche die Flags verändert hat.

Hier hast du also den Fall, wo mehrere Instruktionen
zusammenspielen um das gewünschte zu erreichen.

Ein BRNE macht seinen Sprung genau dann, wenn das Zero Flag
nicht gesetzt ist. Der vorhergehende INC beeinflusst aber
das Zero Flag. Ist durch die Erhöhung im Register die Zahl
0 entstanden, dann wird das Zero Flag gesetzt. Ist die Zahl
ungleich 0 wird das Zero Flag gelöscht.

Der nachfolgende BRNE wertet das Zero Flag aus, so dass
die Kombination aus beiden Befehlen ergibt:
Ergab die Erhöhung des Registers eine Zahl ungleich 0, dann
wird gesprungen. War die Zahl aber 0, dann wird nicht gesprungen.

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.