Hallo zusammen. Wie kann man das am besten schreiben.?
1 | uint8_t val = 0; |
2 | if(PIND & (1<<PD5)){ |
3 | val = val+1; |
4 | }
|
ich meine, dass bei jedem mal drücken, die variable val um 1 steigt. ich habe gerade ein totales blackout. bitte helft mir danke
|
|
Forum: Mikrocontroller und Digitale Elektronik TasterabfrageHallo zusammen. Wie kann man das am besten schreiben.?
ich meine, dass bei jedem mal drücken, die variable val um 1 steigt. ich habe gerade ein totales blackout. bitte helft mir danke Sofern der Taster nicht prellt, und er einen Pull-Down hat und du ihn auf VCC ziehst möglicher weise. Vorrausgesetzt die Abfrage findet kontinuierlich statt (z.b. in einer while-Schleife) Timmo H. schrieb: > Sofern der Taster nicht prellt, und er einen Pull-Down hat und du ihn > auf VCC ziehst möglicher weise. Vorrausgesetzt die Abfrage findet > kontinuierlich statt (z.b. in einer while-Schleife) stimmt alles petrus schrieb:
> ich meine, dass bei jedem mal drücken, die variable val um 1 steigt. > ich habe gerade ein totales blackout. Wenn das in einer Schleife steht wird val in jedem Schleifendurchlauf um 1 erhöht, solang die Taste gedrückt ist/bleibt, also nicht nur 1x. Gruß Dietrich petrus schrieb: > Timmo H. schrieb: >> Sofern der Taster nicht prellt, und er einen Pull-Down hat und du ihn >> auf VCC ziehst möglicher weise. Vorrausgesetzt die Abfrage findet >> kontinuierlich statt (z.b. in einer while-Schleife) > > stimmt alles Na dann. Eine normale Flankenerkennung mit einer Hilfsvariablen
Aber irgendwann wird dir Tastenprellen einen Strich durch die Rechnung machen. Wir haben solche Abfragen immer in in ein Interrupt mit ca. 20-50ms (abhängig vom Taster) gepackt. Im Interrupt lauft dann die Routine von Karl Heinz Buchegger. Ein wenig experimentieren mit der Interrupt Zeit und dein Code sollte laufen. Karl Heinz Buchegger schrieb: > int main() > { > uint8_t isPressed = 0; > > .... > > while( 1 ) > { > > if(PIND & (1<<PD5)){ > if( !isPressed ) > val = val+1; > isPressed = TRUE; > } > else > isPressed = FALSE; > > .... > } > } kann mir das mal einer erklären.? if(PIND & (1<<PD5)){ val = val+1; } das verstehe ich noch, aber den rest nicht. Hallo,
Es geht bei dem Code von K.H.B. um die Erkennung, ob eine Taste
dauerhaft betätigt wird.
Beispiel:
Deine Abfrage erfolgt alle 5us (Frei gewählt). Jetzt wird der Taster
betätigt und val wird inkrementiert. Nach 5us wird die Abfrage aber
erneut abgearbeitet und das so lange, wie der Taster betätigt wird. Dies
hat zur Folge, dass bei jedem Tastendruck, ein Änderung ein anderer Wert
für val vorhanden ist (wenn testweise vor der Abfrage der Wert 0 ist).
Dieses kann/soll aber nicht sein, sondern es soll geprüft werden, ob ein
Signalwechsel erfolgte => Es ist eine Variable notwendig, die so lange
den Zustand 1 hat, so lange die Taste betätigt wird, Heißt:
Ausgangssituation 1. Aufruf der Abfrage und Taster betätigt:
Die 1. Prüfbedingung ist erfüllt, der Taster ist gedrückt. Jetzt kommt
eine weitere Abfrage, dessen Bedingung (Statusvariable "Taster ist noch
nicht gedrückt") ist zZt. auch erfüllt. Jetzt wird val inkrementiert und
die Statusvariable bekommt den Wert 1("Taster gedrückt").
Wird jetzt die Abfrage erneut aufgerufen, ist die Hauptbedingung "Taster
gedrückt" erfüllt, doch die Bedingung zum inkrementieren ist nicht
erfüllt. Erst wenn der Taster losgelassen wird, bekommt die
Statusvariable den Wert 0("Taster losgelassen") und erst bei einem
erneuten Tastendruck wird val wieder inkrementiert.
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.
|
|