- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 28

Thema: Tastenentprellung +++ Fehlerhaft

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    HaWe
    Gast
    wenn man
    static int TasteZustandAlt = 0;
    als lokale Variable in loop() (oder in irgendeiner beliebigen anderen wiederholt aufgerufenen Funktion) im Funktionskopf definiert und initialisiert, wird es nur 1x einmalig bei der ersten Loop-Runde initialisiert, danach nicht mehr: ab dann behält der Wert bei jeder neuen Runde den letzten Wert der vorherigen Runde.

    In diesem Falle funktioniert es aber ja auch nicht mit einer globalen Deklaration, daher liegt der Fehler woanders im Code.

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Das hat mit "static" erst mal nichts zu tun.
    Das Problem mit dieser Variablen offenbart einen generellen Denkfehler - Logikfehler, in der Struktur des Programms.
    Delay() hat seine Berechtigung. Wenn ich das weglassen will, geht das, aber dann muss der Programmcode in Teilstücke zerlegt werden, die einzeln abzuhandeln sind. Um die richtige Reihenfolge der Abarbeitung muss ich mich dann selber kümmern. Im Grunde ist am einfachsten, so etwas dann in Methoden und ein Objekt auszulagern, dann wird im Hauptprogramm nur eine Methode aufgerufen. Der Code ohne delay() ist dann im Objekt gekapselt. Damit macht sich vieles einfacher. Das einfach so in loop() und setup() unterzubringen ist später schlecht verwertbar.
    Komplizierte Dinge werden einfacher, wenn man einen Plan hat. Der wird leider seltenst gemacht.


    MfG

  3. #3
    HaWe
    Gast
    Zitat Zitat von Moppi Beitrag anzeigen
    Das hat mit "static" erst mal nichts zu tun.
    Das Problem mit dieser Variablen offenbart einen generellen Denkfehler - Logikfehler, in der Struktur des Programms.
    Delay() hat seine Berechtigung. Wenn ich das weglassen will, geht das, aber dann muss der Programmcode in Teilstücke zerlegt werden, die einzeln abzuhandeln sind. Um die richtige Reihenfolge der Abarbeitung muss ich mich dann selber kümmern. Im Grunde ist am einfachsten, so etwas dann in Methoden und ein Objekt auszulagern, dann wird im Hauptprogramm nur eine Methode aufgerufen. Der Code ohne delay() ist dann im Objekt gekapselt. Damit macht sich vieles einfacher. Das einfach so in loop() und setup() unterzubringen ist später schlecht verwertbar.
    Komplizierte Dinge werden einfacher, wenn man einen Plan hat. Der wird leider seltenst gemacht.


    MfG
    selbstversändlich hat der Variablenwert von TasteZustandAlt in loop() was mit "static" zu tun, das macht genau den Unterschied aus, ob bei wiederholtem Aufruf der Variablenwert neu initialisiert wird oder den vorigen Wert erhält und damit weitergerechnet wird.
    Lässt man also das "static" in loop() bei der Variablendefinition von TasteZustandAlt weg, wird sie niemals ihren Wert im nächsten loop()-Durchlauf behalten, mit "static" jedoch sehr wohl, und sie wird dann auch nicht immer wieder neu mit 0 initialisiert: dazu muss man sie auch nicht global definieren.
    Der Fehler hier im Programm hat aber wie gesagt sicher nicht ausschließlich damit zu tun.
    Geändert von HaWe (16.04.2020 um 21:15 Uhr) Grund: typo

  4. #4
    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 |

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    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

  6. #6
    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 |

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    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


Ä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. 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