Tastenentprellung

OP #1512356
Lesenswert?

Abend zusammen,

entschuldigt, aber ich habe schon wieder ein Problem :(

Hardware:
Hardware: LCD an PORTB
          Taster l (links)  an PIND2
          Taster r (rechts) an PIND3
          Taster ok (OK)     an PIND4
          alle Taster gegen Masse (interne Pull ups)
          Quartz 16 MHz

Soll-Funktion:
Es soll di Funktion []c tasterabfrage();[/c] aufgerufen werden, in 
welcher jeder Taster 100 mal abgefragt wird, wenn eine bestimmte anzahl 
eine "1" ergibt soll für den jeweiligen Taster eine 1 zurückgegeben 
werden.

Problem:
wenn ich die taster direkt, ohne entprellung abfrage funktioniert 
dies(prellt aber), so allerdings reagiert das menü (sinn des 
programmabschnittes) nicht.
1
...
2

3
#define taster_r (!(PIND & (1<<PIND3)))
4
#define taster_l (!(PIND & (1<<PIND2)))
5
#define taster_ok (!(PIND & (1<<PIND4)))
6

7
...
8

9
volatile unsigned int tast_l = 0, tast_r = 0, tast_ok = 0;
10

11
...
12

13
    kont2 = 0;
14
      
15
    tasterabfrage();
16
      
17
    while (kont2 == 0)      //so l
18
    {
19
      if (tast_r == 1)         //rechts
20
      {
21
        men_punkt ++;
22
        kont2 ++;
23
      }
24
      else if (tast_l == 1)      //links
25
      {
26
        men_punkt --;
27
        kont2 ++;
28
      }
29
      else if (tast_ok == 1)      //OK
30
      {
31
        kont ++;
32
        kont2 ++;
33
      }
34
    }
35
    if (men_punkt == 0)
36
    {
37
      men_punkt = 5;
38
    }
39
    else if (men_punkt == 7)
40
    {
41
      men_punkt = 1;
42
    }
43
  }
44

45
...
46

47
void tasterabfrage(void)
48
{
49
  unsigned int zaehler_l = 0, zaehler_r = 0, zaehler_ok = 0;
50

51
  for (unsigned int durchg = 0; durchg < 100;  durchg ++)  
52
  {
53
    if (taster_l)
54
    {
55
      zaehler_l ++;
56
    }
57
    if (taster_r)
58
    {
59
      zaehler_r ++;
60
    }
61
    if (taster_ok)
62
    {
63
      zaehler_ok ++;
64
    }
65
  }
66
  
67
  if (zaehler_l >= 65)
68
  {
69
    tast_l = 1;
70
  }
71
  else 
72
  {
73
    tast_l = 0;
74
  }
75
  if (zaehler_r >= 65)
76
  {
77
    tast_r = 1;
78
  }
79
  else 
80
  {
81
    tast_r = 0;
82
  }
83
  if (zaehler_ok >= 65)
84
  {
85
    tast_ok = 1;
86
  }
87
  else 
88
  {
89
    tast_ok = 0;
90
  }
91
}
92

93
...
94

95
int main(void)
96
{
97
  DDRD = 0xE0;
98
  DDRC = 0x30;
99
  PORTD = 0x1C;
100
  lcd_init();
101
  set_cursor(0,0);
102
  lcd_string ("   Guten Tag");
103
  set_cursor(0,2);
104
  lcd_string ("   XXXXXXXXX");
105
  long_delay(1000);
106
  while(1)
107
  {
108
  menue();
109
  }
110
}

kann mir vll jemand helfen?
OP #1512366
Lesenswert?

ok hab nu noch nen bug entdeckt und zwar isses eh recht schwer die 
einzelnen menüpunkte zu treffen, da gleich nochmal abgefragt wird, daher 
habe ich ein delay eingabaut. vll änder ich das noch so, dass man die 
taste erst wieder loslassen muss.

trotzdem wäre es noch interresant zu wissen wo der Fehler steckt... muss 
aber nicht sein   thx schonmal so weit

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren