Hallo Zusammen Ich beschäftige mich seit einigen Tagen mit Assembler und habe Probleme mit einer Programmschleife, die ich in einem Buch gefunden habe. Es soll ein LED durch die positive Flanke vom Taster ein- und ausgeschaltet werden. Bei einer positiven Flanke am Port D.2 wird der externe Interrupt 0 (EXT_0) ausgelöst und dadurch eine Verzögerungszeit von 50 µs (50 µs = 185 Takte / 8 Befehle = 23) gestartet um den Taster zu entprellen. In der Hilfe (SiSY AVR) wird mit dem Befehl cpi (Compare) ein fixer Wert mit dem Inhalt eines Register auf true oder false geprüft um die Schleife zu bearbeiten. false = Schleife verlassen --> verstanden Mein Problem ist, dass ich nicht verstehe wie bzw. wann die Programmschleife in diesem Fall beendet wird. EXT_0: push r16 ldi r16, 23 ; 23 Befehle debounce: in r17, PIND andi r17, 0b00000100 cpse r18, r17 ; Springe wenn ungleich ldi r16, 23 mov r18, r17 dec r16 brne debounce ......... Vielen Dank für eure Unterstützung! mfg, dom
Die Schleife wird mit brne debounce fortgesetzt. Im anderen Fall (equal) wird der Befehl nach dem brne ausgeführt, die Schleife also verlassen.
Dazu musst du wissen, dass cp und cpi eigentlich nur eine Subtraktion machen und breq/brne und cpse ihre Entscheidung anhand des Null-Flags treffen: - cpse -- skip if equal -- springe wenn = 0 - brne -- branch if not equal -- springe wenn != 0 Wann immer die ALU des AVR bemüht wird (beim 'Rechnen', also add, inc, dec, sub, sbci, and, or, ...), werden Flags gesetzt. Also auch bei deinem 'andi'. Nun kannst du dir ja ausmalen, wie es weitergeht :-)
wenn die Schleife 23 mal abgearbeitet werden soll, darf man in der schleife nicht die Zählvariable mit 23 nachladen, nach dem anschliesenden DEC ist R16 IMMMER 22 und wird seinen Wert nie ändern
Hi
> cpse r18, r17 ; Springe wenn ungleich
Heisst: Überspringe den nächsten Befehl, wenn r18=r17
Wenn r18<>r17 wird r16 wieder mit 23 geladen. Deine Schleife wird
verlassen wenn dein Tastenpin 23 mal den gleichen Zustand hat.
MfG Spess
Wenn nie nachgeladen wird, wird der Wert 23 im Register pro Schleifendurchlauf um 1 dekrementiert bis er 0 erreicht. Was passiert bei 0? Wie das mit den Flags funktioniert ist mir auch unklar. Wo kann ich mich über die Flags informieren? Vielen Dank, dom
Hi >Was passiert bei 0? Dann geht es mit dem Befehl nach 'brne debounce' weiter. >Wie das mit den Flags funktioniert ist mir auch unklar. >Wo kann ich mich über die Flags informieren? Bei Atmel gibt es ein ausführliches Instruction Set Manual: www.atmel.com/atmel/acrobat/doc0856.pdf MfG Spess
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.