Forum: Mikrocontroller und Digitale Elektronik Schleifen-logik


von Bernd (Gast)


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



von Magnetikus (Gast)


Lesenswert?

Sollte das (nicht) ins uc Forum ?

von jemand (Gast)


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.

von Bernd (Gast)


Lesenswert?

vielen dank für deine antwort... hab ich völlig übersehen...

aber wie funktionier es bei brne?

Bernd

von jemand (Gast)


Lesenswert?


von Karl H. (kbuchegg)


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.

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.