Forum: Mikrocontroller und Digitale Elektronik Tastenentprellung


von Patrick R. (pat711)


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?

von Ben _. (burning_silicon)


Lesenswert?

> entschuldigt,
niemals! ;)

versuch doch mal 100n kondis über die taster zu löten. damit ist dein 
prellproblem vielleicht schon in hardware gelöst.

von Patrick R. (pat711)


Lesenswert?

habs schon mit 220n versucht ohne wirklichen erfolg.... aber ich werds 
nommel probieren vll war ja n fehler drin ^^

von Patrick R. (pat711)


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

von Peter D. (peda)


Lesenswert?

Nimm einfach ne fertige Entprellroutine. Die liefert Dir gleich das 
Drückereignis, d.h. es ist völlig wurscht, wie lange ne Taste gedrückt 
wird.


Peter

von Patrick R. (pat711)


Lesenswert?

nu funzts so wie ichs oben beschrieben hab, dass ich erst wieder weiter 
mach wenn die taste losgelassen wird. das is eigentlich optimal und es 
sind nur 5 zeilen !!! xD

thx @ all

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.