www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tastenentprellung


Autor: Patrick R. (pat711)
Datum:

Bewertung
0 lesenswert
nicht 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.
...

#define taster_r (!(PIND & (1<<PIND3)))
#define taster_l (!(PIND & (1<<PIND2)))
#define taster_ok (!(PIND & (1<<PIND4)))

...

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

...

    kont2 = 0;
      
    tasterabfrage();
      
    while (kont2 == 0)      //so l
    {
      if (tast_r == 1)         //rechts
      {
        men_punkt ++;
        kont2 ++;
      }
      else if (tast_l == 1)      //links
      {
        men_punkt --;
        kont2 ++;
      }
      else if (tast_ok == 1)      //OK
      {
        kont ++;
        kont2 ++;
      }
    }
    if (men_punkt == 0)
    {
      men_punkt = 5;
    }
    else if (men_punkt == 7)
    {
      men_punkt = 1;
    }
  }

...

void tasterabfrage(void)
{
  unsigned int zaehler_l = 0, zaehler_r = 0, zaehler_ok = 0;

  for (unsigned int durchg = 0; durchg < 100;  durchg ++)  
  {
    if (taster_l)
    {
      zaehler_l ++;
    }
    if (taster_r)
    {
      zaehler_r ++;
    }
    if (taster_ok)
    {
      zaehler_ok ++;
    }
  }
  
  if (zaehler_l >= 65)
  {
    tast_l = 1;
  }
  else 
  {
    tast_l = 0;
  }
  if (zaehler_r >= 65)
  {
    tast_r = 1;
  }
  else 
  {
    tast_r = 0;
  }
  if (zaehler_ok >= 65)
  {
    tast_ok = 1;
  }
  else 
  {
    tast_ok = 0;
  }
}

...

int main(void)
{
  DDRD = 0xE0;
  DDRC = 0x30;
  PORTD = 0x1C;
  lcd_init();
  set_cursor(0,0);
  lcd_string ("   Guten Tag");
  set_cursor(0,2);
  lcd_string ("   XXXXXXXXX");
  long_delay(1000);
  while(1)
  {
  menue();
  }
}

kann mir vll jemand helfen?

Autor: Ben ___ (burning_silicon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> entschuldigt,
niemals! ;)

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

Autor: Patrick R. (pat711)
Datum:

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

Autor: Patrick R. (pat711)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Patrick R. (pat711)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.