Forum: Mikrocontroller und Digitale Elektronik Tastenabfrage in C


von DerSchatten (Gast)


Lesenswert?

Ich versuche gerade in C eine Tastenabfrage zu erstellen.
Bei kurzem Druck soll eine Variable hochgezählt werden. Bei langem Druck 
soll die aktuelle Variable ins EEPROM gespeichert werden:
1
while(1)
2
  {
3
    PORTD = pgm_read_byte(&Tabelle[nKeyPress]);
4
    if (bit_is_clear (PINB, PINB0))
5
    {
6
      if (bPortB) // wenn Taster gedrückt
7
      {
8
        dauer++;
9
          }
10
      else // wenn nicht gedrückt
11
      {
12
        if   (dauer > 10)
13
        {
14
          if (nKeyPress < 8)
15
          {
16
            nKeyPress++;
17
            bPortB = 0;
18
          }
19
          else
20
          {
21
            nKeyPress = 0;
22
            bPortB = 0;
23
          }
24
        }
25
        if   (dauer > 20) // wenn länger gedrückt
26
        {
27
          eeprom_write_byte(&eeFooByte, nKeyPress);
28
          dauer = 0;
29
          Warte (100);
30
        }
31
      }
32
      }
33
      else
34
    {
35
          bPortB = 1;
36
      }
37
  }
38
  return 0;
Ich komme nur einfach nicht klar damit.
Ist das der richtige Weg?

von Karl H. (kbuchegg)


Lesenswert?

DerSchatten schrieb:

> Ich komme nur einfach nicht klar damit.
> Ist das der richtige Weg?

Dein Fragnment ist gar nicht so einfach zu analysieren.
Alles in allem erscheint es mir aber ünverhältnismässig kompliziert für 
die Funktion die es bereitstellt.

Benutze doch einfach die PeDa Entprellung. Die macht das was du vorhast, 
aus dem Stand.
http://www.mikrocontroller.net/articles/Entprellung#Komfortroutine_.28C_f.C3.BCr_AVR.29

von Karl H. (kbuchegg)


Lesenswert?

Dein Hauptproblem wird wohl darin liegen, dass
1
     else // wenn nicht gedrückt
2
      {
3
        if   (dauer > 10)
dieser else Zweig nie betreten wird, da bPortB gar keine Chance hat 
jemals 0 zu werden. Dei einzigen Möglichkeiten dafür befinden sich 
allesamt im else Zweig selber.

von Ch D. (chrisu) Benutzerseite


Lesenswert?

So kann ich das empfehlen, für jeden einfacher(es geht nur um die 
Formatierung.)
1
while(1){
2
        PORTD = pgm_read_byte(&Tabelle[nKeyPress]);
3
        if (bit_is_clear (PINB, PINB0)){
4
                if (bPortB){ // wenn Taster gedrückt
5
                        dauer++;
6
                }
7
                else{ // wenn nicht gedrückt
8
                        if(dauer > 10){
9
                                if (nKeyPress < 8){
10
                                        nKeyPress++;
11
                                        bPortB = 0;
12
                                }
13
                                else{
14
                                        nKeyPress = 0;
15
                                        bPortB = 0;
16
                                }
17
                        }
18
                        if(dauer > 20){ // wenn länger gedrückt
19
                                eeprom_write_byte(&eeFooByte, nKeyPress);
20
                                dauer = 0;
21
                                Warte (100);
22
                        }
23
              }
24
        }
25
        else{
26
                bPortB = 1;
27
        }
28
}
29
return 0;

von DerSchatten (Gast)


Lesenswert?

Hallo Karl,

hab mir das Beispiel angesehen und ausprobiert.
Erstmal 1:1 übernommen.

Das einzige was jedoch passiert ist, das die 3 LEDs sofort zu leuchten 
beginnen, mehr nicht.
So wie ich das verstanden habe sollen die ja erst leuchten wenn einer 
der 3 Taster gedrückt wird oder?
Was bewirkt hier ein langer Tastendruck?

von Tastenpreller (Gast)


Lesenswert?

Hallo DerSchatten,

bitte stelle doch mal den "neuen" Code hinein, sonst kann man den Fehler 
nicht suchen.

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.