Forum: Mikrocontroller und Digitale Elektronik Taster Entprellen: Grundroutine (AVR Assembler) nach Peter Dannegger


von Jan Purrucker (Gast)


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

von Εrnst B. (ernst)


Lesenswert?


von Jan Purrucker (Gast)


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

von Gabriel W. (gagosoft)


Lesenswert?

Ernst Bachmann wrote:
> Den hier durchgelesen?
> Beitrag "Tasten entprellen - Bulletproof"
Ich hab's nur überflogen, doch bitte zu beachten der Code richtet sich 
an einen 8051 und keinen AVR.
Im Algorithmus muss kein Unterschied sein, doch Register können 
womöglich nicht zusammenpassen.

von Karl H. (kbuchegg)


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.

von Εrnst B. (ernst)


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...

von Jan Purrucker (Gast)


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

von Hannes L. (hannes)


Lesenswert?

Jan Purrucker wrote:
> aber wo ist jetzt der Trick, dass 4 mal abgetastet wird.

Du hast Dir auch diesen Beitrag durchgelesen?
Beitrag "Re: Bitte um Erklärung der Entprellroutine"

...

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.