- Akku Tests und Balkonkraftwerk Speicher         
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
    148
    Erst einmal möchte ich euch für eure Gedanken danken!

    Da es sich scheinbar nicht um einen einfachen Logik/Flüchtigkeitsfehler handeln, wird es DER falsche Weg zu sein.
    Mal wieder wollte ich duzende von Fliegen mit einer Funktion erschlagen - Tastenentprellung+Tasetendruck-Zeitmessung+beliebig viele Eingänge, etc.
    Daher werde ich eine andere Linie verfolgen - einfacher, leicht nachvollziehbar. Ich melde mich später sobald ich einen akzeptableren Ansatz habe.
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.669
    Vielleicht fängst Du einfach an. Als Beispiel habe ich gestern schnell was zusammengebastelt. Ohne großen Plan, lang ist das Programm nicht. Ob es funktioniert habe ich nicht probiert, müsste aber.
    Zumindest wird der Ansatz klar. Ausbauen kann man das im Nachhinein immer. Aber alles Stück um Stück, eins nach dem andern. Dann wird es mit der Fehlersuche einfacher.

    Code:
    //öffentliche Variablen
    const int Pin = 9;
    const int pDelay = 250;
    int ButState;
    
    
    //funktionsinterne Variablen
    int pState = -1;
    unsigned long pMillis = millis();
    
    
    void setup(){
    }
    void loop(){
            checkButton();
    }
    void checkButton(){
            if (pMillis <= millis()) {
                    ButState = pState;
                    pInit();
            }else if (digitalRead(Pin) != pState) pInit();
    }
    void pInit(){
            pMillis = millis() + pDelay;
            pState = digitalRead(Pin);
    }
    Der Code enthält loop() und setup(), damit das mit der Arduino IDE einfach kompiliert werden kann. Den Code würde ich auch in ein Objekt in Methoden packen, dann kann man den später als LIB einfügen. Das macht das dann für zukünftige Projekte einfacher.


    MfG

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    Jou, meine Lösung sieht folgend aus - DAS verstehe ich auch...

    HTML-Code:
    void loop() {
      AusgSekTakt(); // Sek.Takt-Anzeige
    
      static unsigned long TasteGedrueckt = 0; 
      static int TasteLiZustand = 0; 
    
      if(Entprell(TasteLiPin) == 1) {
        if(TasteLiZustand == 0) { 
          TasteLiZustand = 1;  
          TasteGedrueckt = millis();
        }
      TZ3("Taste gedrueckt+entprellt seit ", millis() - TasteGedrueckt, " ms"); 
      }
      else TasteLiZustand = 0;
    }
    
    //Tastenentprellung
    int Entprell(int pin){
      static int TastenStatusNeu = 0; 
      static int TastenStatusAlt = 0;
      static unsigned long TastStartZeit = 0;
      
      TastenStatusNeu = digitalRead(pin);
      if(TastenStatusNeu != TastenStatusAlt) {
        TastenStatusAlt = TastenStatusNeu;
        if(TastenStatusNeu == 1) { 
          TastStartZeit = millis();
        }
      }
      if((millis() >= TastStartZeit + EntprellZeit) && TastenStatusNeu == 1)
        return 1;
      else
        return 0;
    }
    Frage:
    1. Hat es irgend welche Vor/Nachteile, ob "TasteGedrueckt", "TasteLiZustand " als static- oder global-Variable deklariert werden? Ohne static funktioniert der loop nicht.
    2. Seht ihr irgend wo einen Fehler oder code-Unsauberkeiten?


    Meine nächsten Baustellen;
    Schritt 01: Rückgabe von 5 Zustands-Peaks; 0=LOW, 1= HIGH, 2=Flanke steigend, 3=Flanke fallend, 5=unbekannt
    Schritt 02: Beliebig viele Tasten/Schalteingänge, teils zeitgleich innerhalb von [ms], entprellen.
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.669
    Mal ne ganz ... Frage: warum steht "AusgSekTakt();" zusammen mit Variablendefinitionen UND dem eigentlichen Code alles in loop()?
    Diesen Code kannst Du nie so in ein anderes Programm exportieren später - Probleme vorprogrammiert.
    Es gibt so was wie einen Programmierstil. Ordnung ist hier die halbe Zeit, der Fehlersuche.



    MfG


  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    Zitat Zitat von Moppi Beitrag anzeigen
    Mal ne ganz ... Frage: warum steht "AusgSekTakt();" zusammen mit Variablendefinitionen UND dem eigentlichen Code alles in loop()?

    Hallo.
    AusgSekTakt() ... ist eine Funktion, die sekündlich tickt+leuchtet und eine Sekundenanzeige im Seriellen Monitor anzeigt - ursprünglich mal als Test-bimbam.
    die static Var. im loop() sind zur schnelleren Übersicht (da wo sie gebraucht werden), als in glob.Var.-Bereich ganz oben im Haeder.
    Stilbruch?
    Wie gehts besser?
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.669
    Ich denke mal, wissen tu ich es ja nicht, dass Du diese Geschichte später woanders einsetzen willst, sprich, das muss alles ausgelagert werden, dass es später eingebunden werden kann. Da fängt man wohl mit einem Programmgerüst dafür an, würde ich jetzt so machen. Ich mache ein Beispiel. Dauert etwas ...

    Programmierst Du auch mit Arduino IDE ?

    MfG

    - - - Aktualisiert - - -

    Es gibt bei Klassen Methoden und Varibalen, die nach außen nutzbar sein sollen und damit "sichtbar" sind, also aufgerufen werden können und es gibt das Gegenteil, Methoden und Variablen, die nur innerhalb der Klasse verwendet werden und damit "privat" sind, also nicht nach außen sichtbar.

    Folgende Dateien könnten im Verzeichnis "libraries" im Arduino-Ordner gespeichert werden (dann dort Verzeichnis "MeinCode" und darin beide Dateien, *.h und *.cpp), damit sie in anderem Arduino-Code eingebunden werden können.


    Beispiel für "MeinCode.h"

    Code:
    #ifndef MeinCode_h
    
    
    #define MeinCode_h
    #include <Arduino.h>
    
    
    class MeinCode    //Klasse "MeinCode"
    {
      //Alle öffentlichen Variablen und Methoden hier bekanntgeben
      public:
        byte val1, val2;                     //Variablen
        MeinCode(unsigned long bps);  //Methode "MeinCode" - Hauptkonstruktor ... wird beim Instanziieren automatisch mit der Klasse aufgerufen
        boolean SendRequest(void);    //Methode von "MeinCode"
        
      //alle nicht öffentlichen Variablen und Methoden hier bekanntgeben
      private:
        void    ClearRBuffer(void);     //Methode
        boolean get2Chars(void);       //Methode
        int a;                                 //Variable
        unsigned long lastMillis;        //Variable
        byte tv1, tv2;                      //Variablen
    };
    
    
    #endif

    Beispiel für "MeinCode.cpp"

    Code:
    #include <Arduino.h>
    #include <MeinCode.h>
    
    //-----------------------------------------------------
    //Hauptkonstruktor
    //-----------------------------------------------------
    MeinCode::MeinCode(unsigned long bps)
    
    {
       .....
    }
    //-----------------------------------------------------
    boolean MeinCode::SendRequest(void)
    {
      ClearRBuffer();
      ....
      return ...;
    }
    //-----------------------------------------------------
    void MeinCode::ClearRBuffer(void)
    {
      ....
    }
    //-----------------------------------------------------
    boolean MeinCode::get2Chars(void)
    {
       ....
       return ....;
    }
    Eingebunden und verwendet wird das später, dann z.B. so.

    Code:
    #include <MeinCode.h>
    
    
    MeinCode meineInstanz();   //Hauptkonstruktor aufrufen, Instanz erzeugen (initialisieren von irgendwas im Code der Klasse "MeinCode")
    
    
    void setup() {
    
    
    }
    
    
    void loop() { 
    
    
        //Methoden (Funktionen) der Klasse "MeinCode" können über meine Instanz angesprochen werden
        if(meineInstanz.SendRequest()){
           . ...
        }
    
        //Variablen können wie Methoden meiner Instanz angesprochen werden
       Serial.print(meineInstanz.val1);
    
    
    }

    Für mehr Informationen siehe hier z.B. (da gibts noch zahlreiche andere Links im Netz) http://www.mintgruen.tu-berlin.de/ro...n:objektorient



    MfG
    Geändert von Moppi (18.04.2020 um 12:25 Uhr)

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    GM Moppi.
    Vielen Dank für deine Ausführungen!

    Tatsächlich beschäftige ich mir hier erst einmal mit Grundlagen, wie Kontaktentprellungen, Mittelwerte, Analogein-/ausgänge, etc.
    Diese werde ich dann in universelle und "griffige" Funktionen stecken, um sie dann später in diversen Programmen nach belieben zu verwenden.
    Hierbei hatte ich daran gedacht, die Funktionen irgend wie in eine Bibliothek zu fassen um via Copy/Paste die Funktionen einzubinden.
    Die von dir beschriebene Methode klingt da irgendwie "flexibler" und professioneller...
    Aber erst wenn die Funktionen super stabil laufen - dauert bei mir also noch etwas.

    Ja, ich programmiere den Teensy 3.2 über Arduino 1.8.5/Teensyduino 1.47.
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

Ähnliche Themen

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

Stichworte

Berechtigungen

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

12V Akku bauen