Taster Entprellen: Grundroutine (AVR Assembler) nach Peter Dannegger

Gast #816744
Lesenswert?
• ▲
▼
Hallo allerseits,

ich beschäftige mich gerade mit der Entprellung der Tasten am AVR.
Nun bin ich auf den Link

http://www.mikrocontroller.net/articles/Entprellung

hier auf der Seite gestoßen. Nun möchte ich den Code verstehen, bevor 
ich ihn für mein Projekt einsetze. Kann mir jemand deshalb ein Flowchart 
o.Ä. für die Assembler-Datei von Peter Dannegger aufzeigen? Es geht hier 
nur um den Teil mit dem Label

get8key:

Desweiteren wollte ich fragen was die Register iwr0 und iwr1 bedeuten 
sollen. Ich verstehe wie gesagt die Entprellroutine nicht, die im 
Timer-Interrupt passiert.
Für hilfreiche Antworten wäre ich sehr dankbar.

Gruß
Jan Purrucker
Gast #816769
Lesenswert?
• ▲
▼
Hallo Ernst,

den Artikel habe ich freilich schon durchgelesen, auch die beschriebene 
Funktionsweise schon.
Aber trotzdem verstehe ich den Ablauf in den 10 Zeilen nicht ganz, warum 
hier mehrmals abgetastet wird?

Gruß
Jan
#816775
Lesenswert?
• ▲
▼
Jan Purrucker wrote:

> get8key:
>
> Desweiteren wollte ich fragen was die Register iwr0 und iwr1 bedeuten
> sollen. Ich verstehe wie gesagt die Entprellroutine nicht, die im
> Timer-Interrupt passiert.
> Für hilfreiche Antworten wäre ich sehr dankbar.

Die Funktion ist extrem tricky.

Im Grunde hat er für jede Taste einen 2 Bit Zähler. Allerdings
sind die beiden Bits nicht in einem Byte beisammen, sondern
auf 2 Bytes aufgeteilt

         +---+---+---+---+---+---+---+---+
    iwr0 |   |   |   |   |   |   |   |   |
         +---+---+---+---+---+---+---+---+

         +---+---+---+---+---+---+---+---+
    iwr1 |   |   |   |   |   |   |   |   |
         +---+---+---+---+---+---+---+---+

                                       ^
                                       |
                               Diese beiden Bits (Bit 0 in iwr0
                               und Bit 0 in iwr1) bilden zusammen
                               einen 2 Bit Zähler.
                        Dasselbe für Bit 1, Bit 2 usw.

Der Rest ist im Grunde nur ein Addierer der jeweils 1 zu jedem
Zähler dazuzählen kann. Und zwar für alle 8 Bits gleichzeitig
und abhängig vom Zustand des Port Pins an der jeweilige Bit-
Position.

Wie gesagt: Das Ganze ist extrem tricky. Es macht aber nicht
wirklich etwas, wenn du nicht verstehst, wie das funktioniert.
Die Funkionalität ist so wunderbar, daß man das einfach als
Baustein in sein Programm übernehmen sollte und sich daran
erfreut, daß es funktioniert.
#816776
Lesenswert?
• ▲
▼
Die Funktionsweise in Kürze:
Die zwei/drei Variablen implementieren acht Zähler, die jeweils bis 4 
oder 8 Zählen können.
Dadurch können mit einem Befehl alle acht Zähler gleichzeitig bearbeitet 
werden (SIMD)...
Erfordert etwas Umdenken, weil die Zählbits nicht "längs" in den Bytes 
stehen, sondern "quer" über mehrere Bytes verteilt sind.

Edit: da war kbuchegg wohl schneller und ausführlicher...
Gast #816860
Lesenswert?
• ▲
▼
Hallo Karl-Heinz,

vielen Dank für deine Ausführung. Ok das mit dem Zähler habe ich 
verstanden, aber wo ist jetzt der Trick, dass 4 mal abgetastet wird. Bei 
den par Code-Zeilen sollte es doch nicht so schwierig sein die genaue 
Funktion zu verstehen.
Für weitere hilfreiche Antworten bin ich natürlich sehr dankbar.

Gruß
Jan

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.