Forum: Mikrocontroller und Digitale Elektronik Programmschleife mit brne


von dom (Gast)


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

von Mmmh (Gast)


Lesenswert?

Die Schleife wird mit

brne  debounce

fortgesetzt.
Im anderen Fall (equal) wird der Befehl nach dem brne ausgeführt, die 
Schleife also verlassen.

von Sven P. (Gast)


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 :-)

von Turbotoni (Gast)


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

von spess53 (Gast)


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

von dom (Gast)


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

von spess53 (Gast)


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

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.