Druckknöpfe mit zu vielen Ereignissen

12

Ich schreibe einen MP3-Player, der Informationen auf ein LCD-Display schreibt. Ich würde ihn gerne von der Tastatur auf die Verwendung von Drucktasten umstellen, aber ich erhalte ständig zu viele Tastendrücke. Ich habe versucht, nach oben zu ziehen und die Flanke zu fallen / zu steigen, aber ich erhalte immer noch das gleiche Ergebnis. Weiß jemand, ob dies ein bekanntes Problem ist oder mache ich einfach etwas falsch? Oh, ich mache das auch komplett in C mit WiringPi.

linuxgnuru
quelle
1
Schauen Sie sich unseren Freund für Mikrocontroller an, um noch mehr Softwarelösungen anzubieten. arduino.cc/en/Tutorial/Debounce
Cammy_the_block
Hier ist ein Ausschnitt von etwas, das ich vor einiger Zeit geschrieben habe. if(digitalRead(data) && millis()-startTime > 10){und setze startTime immer dann, wenn es in die for-Schleife eintritt.
Cammy_the_block
frage mich nur; Auf was genau würde ich startTime einstellen?
Linuxgnuru
Irgendein Zeitzähler. Arduino hat die Funktion Millis, die Zeit seit dem Start gibt.
Cammy_the_block
Ah ok, so funktioniert wiringPi wiringpi.com/reference/timing
linuxgnuru

Antworten:

12

Mechanische Tasten und Schalter können unter einem Sprung des Schalters leiden, wenn sie für einige Millisekunden schnell zwischen offen und geschlossen wechseln.

Sie können versuchen, die Taste / den Schalter in Software oder Hardware zu entprellen.

Wahrscheinlich am einfachsten in der Software.

Wenn sich der Pegel ändert (Ein zu Aus oder Aus zu Ein), warten Sie x Millisekunden und lesen Sie den gpio erneut. Wenn es sich noch im neuen Zustand befindet, wird davon ausgegangen, dass es sich um einen echten Übergang handelt. Der Wert von x könnte etwa 20 sein.

Suchen Sie nach Hardware-Lösungen für diese Art von Post

joan
quelle
8

Nehmen Sie sich Zeit, um Jack Ganssles Debouncing-Handbuch zu lesen . Auf der ersten Seite wird das Problem ausführlich erläutert, auf der zweiten Seite wird der Umgang mit Hardware oder Software erläutert. Es gibt keine "perfekte" Entprellmethode, aber viele schlechte!

Dies ist ein Problem, auf das Sie wiederholt stoßen, wenn Sie Software mit Switches verbinden. Es lohnt sich also, sich die Zeit zu nehmen, um es zu verstehen.

Rolinger
quelle
2

In Anwendungen, die einen System-Ticker haben, implementiere ich normalerweise ein Schieberegister.

unsigned char button_checker;

// inside the system ticker

button_checker <<= 1; 
button_checker += INPUT;

if (button_checker == 0xFF) 
{ 
    // button was pressed 
}

Natürlich sollten Sie das Tastendruckereignis nur bei einer steigenden Flanke ausführen.

vsz
quelle
1
Das ist eine interessante Methode. Leicht anpassbar (durch Maskieren der wichtigsten Bits von button_checker), um eine unterschiedliche Anzahl aufeinanderfolgender Lesevorgänge zu erfordern.
25.