Tastenentprellung

OP #1512356
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
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

Eine eigene Frage? Dieser Thread ist über 16 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.