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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren