mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tastenabfrage in C


Autor: DerSchatten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
while(1)
  {
    PORTD = pgm_read_byte(&Tabelle[nKeyPress]);
    if (bit_is_clear (PINB, PINB0))
    {
      if (bPortB) // wenn Taster gedrückt
      {
        dauer++;
          }
      else // wenn nicht gedrückt
      {
        if   (dauer > 10)
        {
          if (nKeyPress < 8)
          {
            nKeyPress++;
            bPortB = 0;
          }
          else
          {
            nKeyPress = 0;
            bPortB = 0;
          }
        }
        if   (dauer > 20) // wenn länger gedrückt
        {
          eeprom_write_byte(&eeFooByte, nKeyPress);
          dauer = 0;
          Warte (100);
        }
      }
      }
      else
    {
          bPortB = 1;
      }
  }
  return 0;
Ich komme nur einfach nicht klar damit.
Ist das der richtige Weg?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Hauptproblem wird wohl darin liegen, dass
     else // wenn nicht gedrückt
      {
        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.

Autor: Ch D. (chrisu) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So kann ich das empfehlen, für jeden einfacher(es geht nur um die 
Formatierung.)
while(1){
        PORTD = pgm_read_byte(&Tabelle[nKeyPress]);
        if (bit_is_clear (PINB, PINB0)){
                if (bPortB){ // wenn Taster gedrückt
                        dauer++;
                }
                else{ // wenn nicht gedrückt
                        if(dauer > 10){
                                if (nKeyPress < 8){
                                        nKeyPress++;
                                        bPortB = 0;
                                }
                                else{
                                        nKeyPress = 0;
                                        bPortB = 0;
                                }
                        }
                        if(dauer > 20){ // wenn länger gedrückt
                                eeprom_write_byte(&eeFooByte, nKeyPress);
                                dauer = 0;
                                Warte (100);
                        }
              }
        }
        else{
                bPortB = 1;
        }
}
return 0;

Autor: DerSchatten (Gast)
Datum:

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

Autor: Tastenpreller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo DerSchatten,

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

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.