Forum: Mikrocontroller und Digitale Elektronik ATMega32 erkennt nicht alle Tastendrücke


von Christian Fuchs (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe eine Funktion geschrieben, die mir den momentanen Zustand 
(deaktiviert, positive Flanke, aktiviert, negative Flanke) der 
angeschlossenen Taster ausgibt. (.c-Datei mit der 
flankenerkennungs-Funktion und der entprell-Funktion, sowie die 
dazugehörige .h-Datei sind im Anhang)
Die Grundidee funktioniert anscheinend auch, nur werden manchmal die 
Zustände nicht erkannt, wie z.B. eine positive Flanke, obwohl aktiviert 
wieder erkannt wird.

Die Taster sind alle entprellt (mit einer von mir geschriebenen 
Funktion, die sich an Peter Dannnegers entprellen orientiert. Siehe: 
http://www.mikrocontroller.net/articles/Entprellung#Komfortroutine_.28C_f.C3.BCr_AVR.29) 
und ich habe bereits alle möglichen Strukturen, Zeiger und Variablen die 
diesen Fehler eventuell hervorrufen könnten als volatile deklariert.
Nur jetzt bin ich mit meinem Latein am Ende und im Forum habe ich 
ebenfalls keine Hinweise dazu gefunden (vielleicht war ich aber auch 
einfach nur zu Blind).

Ignoiert bitte die Rechtschreibung im Quellcode, wenn ich mich vertippt 
habe, habe ich den Fehler einfach übernommen ;) .

Danke schon mal im Vorraus.

Christian

von Peter D. (peda)


Lesenswert?

Ich sehe keine Funktion, wo die Tastendrücke abgeholt und gelöscht 
werden.

Meine Funktion speichert ja die Tastendrücke, bis sie abgeholt werden. 
Es wäre Zufall, wenn man sie genau auf der Flanke aufrufen würde.


Peter

von Christian Fuchs (Gast)


Lesenswert?

Danke für die schnelle Antwort.

Die eigentlichen Tastendrücke speichere ich mit:
1
(*key).pressed = (input & (~((*key).save)) ) | ((*key).pressed & (*key).save);    //entprellte Tastenzustände speichern
(vierte Codezeile aus debounceKeys)

Der entprell-Funktion übergebe ich einen Zeiger auf die Struktur 
lbar_btn, die dann wieder in calculateInputStatus abgefragt wird.
Um die Änderung zu erkennen, speichere ich in den Strukturen sBtnStatus 
und sLbarStatus den letzten, von der Funktion calculateInputStatus 
aufgerufenen, Wert von (*key).pressed .
Damit sollte ich eigentlich alle Flanken mitbekommen, vorausgesetzt der 
Taster ist mindestens eine main-loop lang gedrückt. (Dachte ich 
zumindestens)

Christian

von komfortabel entprellter (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Autor: Peter Dannegger

Vielen Dank an dieser Stelle, dass die lange als "unverständlich" 
geltende "Komfortroutine" im Tutorial nun etwas ausführlicher 
beschrieben wird. Hab da lange nicht mehr reingeschaut, daher ist mir 
das jetzt aufgefallen.

Danke :-)

http://www.mikrocontroller.net/wikisoftware/index.php?title=Entprellung&section=14#Funktionsweise

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.