Tasterabfrage

#3253489
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
#3253507
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.
Gast #3253852
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.
#3253900
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.