Programmschleife mit brne

Gast #1537335
Lesenswert?
• ▲
▼
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
Gast #1537342
Lesenswert?
• ▲
▼
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 :-)
Gast #1537343
Lesenswert?
• ▲
▼
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
Gast #1537362
Lesenswert?
• ▲
▼
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
Gast #1537370
Lesenswert?
• ▲
▼
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
Gast #1537379
Lesenswert?
• ▲
▼
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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.