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 :
Verschoben durch User
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.
|
|