www.mikrocontroller.net

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


Autor: Jan Purrucker (Gast)
Datum:

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

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Jan Purrucker (Gast)
Datum:

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

Autor: Gabriel Wegscheider (gagosoft)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Εrnst B✶ (ernst)
Datum:

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

Autor: Jan Purrucker (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

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.