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
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.
vielen dank für deine antwort... hab ich völlig übersehen... aber wie funktionier es bei brne? Bernd
http://atmel.com/dyn/resources/prod_documents/doc0856.pdf http://www.mikrocontroller.net/articles/AVR-Tutorial:_Vergleiche#BRNE_-_Branch_if_Not_Equal Steht alles drin, was man wissen muss.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.