- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 28

Thema: Tastenentprellung +++ Fehlerhaft

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    147

    Tastenentprellung +++ Fehlerhaft

    Hallo zusammen.
    Einige Schritte weiter, aber noch nicht perfekt - mein universeller "Tastenentpreller ohne delay".
    Folgender code klappt manchmal, aber nicht immer.
    HTML-Code:
    const int EntprellZeit = 500;   // [ms], Entprellzeit (Testhalber 500ms)
    
    void loop() {
      AusgSekTakt();  //Sek-Takt ohne delay
    
    //Tastenabfrage
      int TasteZustandAlt = 0;        // Tastenzustand einmalig initialisieren
    
      int TasteZustandNeu = digitalRead(TasteLiPin);  // akt. Zustand der Taste auslesen
      if(TasteZustandNeu != TasteZustandAlt)  {       // wenn Tastenzustand verändert
        if(TasteLiEntprell() >= EntprellZeit)  {      // wenn Taste nach Entprellzeit entprellt
          TasteZustandAlt = TasteZustandNeu;          // neuen Tastenzustand übernommen
          
          TextBlock("Taste im AKT. Zustand entprellt!");
        }
      }
    }
    
    //Zeitpunkt der ersten Tasten-Zustandsänderung
    unsigned long TasteLiEntprell()  {
      static unsigned long StartZeitEntprell = 0; // [ms] Startzeit
      static int TasteZustand = 0;                // akt Zustand des Tasters
      TZ(1);//Testanzeige
    
      return Entprellen(TasteLiPin, TasteZustand, StartZeitEntprell);
    }
    
    //prüft Eingang auf AusgZustand und Zeit [ms]
    unsigned long Entprellen(int Pin, int &TasteZustand, unsigned long &StartZeitEntprell)  { 
      if (digitalRead(Pin) != TasteZustand)  {  // Zustandsänderung des Tasters
        TasteZustand = ! TasteZustand;          // Zustand invertieren
        StartZeitEntprell = millis();           // Startzeit speichern
      }
      if (TasteZustand == 1)                    // wenn Taste gedrückt ist
        return millis() - StartZeitEntprell;    // Zeit zurück geben, seit Taste gedrückt wurde
      else
        return 0;                               // 0 zurück geben, wenn Taste nicht gedrückt, oder noch nicht entprellt
    }
    Fehler:
    1. Sobald erstmalig korrekt 500ms-entprellt, zeigt das Prog bei jedem kleinen (<500ms) Tastendruck "Taste im AKT. Zustand entprellt!" an
    2. Wenn die Taste länger als >Entprellzeit gedrückt wird, kommt dauernd "Taste im AKT. Zustand entprellt!",
    obwohl folgende Zeile nur die Veränderung reagieren sollte.
    HTML-Code:
    "if(TasteZustandNeu != TasteZustandAlt)"
    Ich bin mir nicht sicher, ob fälschlicher weise eine dauernde Neuinisialisierung mit "0" erfolgt - sollte eigentlich nur beim Ersten mal init.
    HTML-Code:
     static unsigned long StartZeitEntprell = 0;
     static int TasteZustand = 0;
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    Ich vermute mal, der Fehler liegt darin, das der Entprelltimer bei einem als gültig erkannten Tastendruck nicht zurück gesetzt wird.
    Die Initialisierung des Timers gehört üblicherweise nicht in den Loop!
    Du drückst eine Taste.
    Dein Vergleich Neu Alt merkt das, der Entprelltimer ist auch abgelaufen, also wird der Tastendruck erkannt und übernommen.
    Die Taste prellt nun - Es wird eine offene Taste erkannt und da der Timer nicht zurück gesetzt wurde auch akzeptiert.
    So kann da ein paar mal hin und her gehen.

    Würdest Du bei einem als gültig erkannten Tastendruck den Entprelltimer zurücksetzen würde für die nächste Zeit, bis zum Ablauf des Timers kein weiterer Tastendruck als gültig erkannt.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    147
    Zitat Zitat von wkrug Beitrag anzeigen
    Die Initialisierung des Timers gehört üblicherweise nicht in den Loop!
    " AusgSekTakt(); " ist ein einfacher Sek-Takt für einen Summer

    Zitat Zitat von wkrug Beitrag anzeigen
    und da der Timer nicht zurück gesetzt wurde
    tuh ich das nicht mit?
    HTML-Code:
    StartZeitEntprell = millis();
    - - - Aktualisiert - - -

    ...oder wo steht der Wald, bei all den Bäumen ...
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    ich meine, ich stelle mir manchmal auch durchaus sportliche aufgaben (siehe mein outdoor-projekt) - aber warum verwendest du nicht die bounce-library?
    gruß inka

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    898
    //Tastenabfrage
    int TasteZustandAlt = 0; // Tastenzustand einmalig initialisieren

    Bei der Zeile stimmt ohne "static" schon der Kommentar nicht.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    147
    Hallo Inka, danke für den Hinweis
    Ich würde den Prozess gerne verstehen... wenn ich diese Logik verstehe, bin ich schon mal einen großen Schritt weiter...
    .. und nach Möglichkeit keine zusätzliche Lib einfügen; #include "OneButton.h" ... und mehrer Tastereingänge unabhängig abfragen

    (vielleicht befinde ich mich auch auf dem Holzweg


    Zitat Zitat von Holomino Beitrag anzeigen
    Bei der Zeile stimmt ohne "static" schon der Kommentar nicht.
    Hallo Holomio.
    "static" innerhalb des loop?
    Ist doch eine einmalige Initialisierung - oder was meinst du?
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  7. #7
    HaWe
    Gast
    die loop() ist eine "verkappte" while() / for( ;; ) -Schleife in einer unsichtbaren main() Funktion, in der eine Funktion loop() wiederholt aufgerufen wird - wenn hier Variablen nicht static sind, werden alle Variablenwerte beim erneuten loop()-Durchlauf vergessen.


    Code:
    void setup() { }
    
    void loop() { }
    
    
    int main() {
       setup();
       for( ;; ) {
          loop();
       }
    
    }

Ähnliche Themen

  1. ISR Fehlerhaft
    Von Zille im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 20.01.2014, 19:11
  2. Tastenentprellung-Wiki
    Von Finn91 im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 03.03.2009, 21:37
  3. Schaltung fehlerhaft
    Von Atmelbeginne im Forum PIC Controller
    Antworten: 3
    Letzter Beitrag: 12.09.2008, 17:56
  4. Uartausgabe Fehlerhaft
    Von Picht im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 19.02.2007, 17:45
  5. Tastenentprellung mit Bascom
    Von milisan im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 23.11.2004, 07:06

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen