mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Programmschleife mit brne


Autor: dom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mmmh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Schleife wird mit

brne  debounce

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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Turbotoni (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: dom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.