User manual

53 54
7.2 Entprellen von mechanischen Tasten per Software
Das Entprellen von Tasten kann man einfach über Delays durchführen. Man muss dazu die Zeit warten, die
einen Prellzyklus dauert.
+
-
9V
1A
C 7-Segment-LED
SCL
SDA
SCL
SDA
+9V
Adr:40,44,48,4C
PCF8574 T
+9V
SCLS DA
+9V
A0
A1
Tx
Rx
PD2
SCLKMOSI
PD3
PD 6
PD 4
PD 5
PD 7
A7
A3
A2
A6
NANO
to
Br ick`R`
3,3V 5V
USB
B0
SS
MISC
B1
C
// DE_18 Tasten Entprellen - 7segment Anzeige als I2C Brick
#include <Wire.h>
// 8574T
#dene i2cseg7x2alsb1 (0x40>>1)
#dene i2cseg7x2amsb1 (0x42>>1)
..... wie vorher ...
/// Code neu:
#dene PORTTASTE 2 // Dort Taste anbringen
void setup() {
Wire.begin(); // I2C Initialisierung
pinMode(PORTTASTE,INPUT_PULLUP); // Taste mti Pullup versehen
}
void loop() { // Schleife
char buffer[10];
static int counter = 0;
sprintf(buffer,“%02d“,counter);
// Taste abfragen, kann prellen
if (digitalRead(PORTTASTE)==LOW) { // Pruefn auf High->low
// Dann noch den den Low-High Übergang abwarten
// Koennte man auch nach dem Delay machen, ist aber nicht
// kritisch.
while (digitalRead(PORTTASTE)==LOW) {
// warten bis losgelassen ! bzw prellt.
}
counter++; // den Counter kann man noch hochzaehlen
delay(40); // dann aber warten damit die Abfrage
// Nicht zu schnell erneut erfolgt
} // Ende der Abfrage High->Low
if (counter > 99) counter = 0; // 0..99 zaehlen zum Test
// Counter ausgeben
display_seg1x(i2cseg7x2amsb1,buffer[0]); // msb zeichen
display_seg1x(i2cseg7x2alsb1,buffer[1]); // lsb zeichen
} // Ende der Schleife
drücken
geschlossen
abfragen
Wartezeit
Algorithmus zum Entprellen:
Das Signal wird erstmal auf den Übergang
nach Low abgefragt, dann wird wie im vorhe-
rigen Programm gewartet bis es auf High geht
(also die Taste vermeindlich losgelassen wird),
danach muss man aber nun warten (hier 40 ms),
bis eine neue Abfrage auf einen High->Low
Übergang durchführt wird. Die Dauer ist von
der verwendeten Tastenart abhängig und muss
ggf. experimentell ermittelt werden. So wird
verhindert, dass die Prellimpulse mit ausgewer-
tet werden.
Was passiert? Wenn man die Taste drückt, sollte bei diesem Versuch
die Ausgabe auf der Anzeige bei jedem Tastendruck um genau eins
erhöht werden also 00,01,02 .... usw. bei jedem Tastendruck.