Forum: Mikrocontroller und Digitale Elektronik Tasterabfrage


von petrus (Gast)


Lesenswert?

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

: Verschoben durch User
von petrus (Gast)


Lesenswert?

oder packt man es am besten in eine for schleife.?

von Timmo H. (masterfx)


Lesenswert?

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)

von petrus (Gast)


Lesenswert?

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

von Dietrich L. (dietrichl)


Lesenswert?

petrus schrieb:
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.

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

von Karl H. (kbuchegg)


Lesenswert?

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
1
int main()
2
{
3
  uint8_t isPressed = 0;
4
5
  ....
6
7
8
  while( 1 )
9
  {
10
11
    if(PIND & (1<<PD5)){
12
      if( !isPressed )
13
        val = val+1;
14
      isPressed = TRUE;
15
    }
16
    else
17
      isPressed = FALSE;
18
19
    ....
20
  }
21
}

Aber irgendwann wird dir Tastenprellen einen Strich durch die Rechnung 
machen.

von Manuel K. (manuel_k38)


Lesenswert?

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.

von petrus (Gast)


Lesenswert?

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.

von Sebastian H. (technik_freak)


Lesenswert?

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.