-         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 28

Thema: Tastenentprellung +++ Fehlerhaft

  1. #11
    Erfahrener Benutzer Robotik Einstein Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    1.974
    Blog-Einträge
    15
    Anzeige

    Praxistest und DIY Projekte
    Ich habe mal ein paar Sekunden den Code angeschaut, deshalb hier zunächst eine Anmerkung, diesen "Tastenzustand einmalig initialisieren" machst Du in loop(), das ist dann nicht einmalig. "int TasteZustandAlt;" außerhalb von setup() und loop(), also global deklarieren. Dann in setup() "int TasteZustandAlt = 0", dann ist es einmalig. Ich fürchte der ganze Code ist nicht so recht durchdacht. Programmablaufpläne können Abhilfe schaffen, zunächst aufzuzeigen, was man tun will. In dem Vorgang der PAP-Erstellung geht man den gesamten Programmablauf theroretisch durch und anhand des PAP kann man sehen, ob das dann alles funktioniert. Es sind dort auch schon Logikfehler zu erkennen. Nachher setzt man den PAP in Progroammcode um.


    MfG

  2. #12
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    09.10.2014
    Beiträge
    5.124
    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.
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  3. #13
    Erfahrener Benutzer Robotik Einstein Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    1.974
    Blog-Einträge
    15
    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

  4. #14
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    09.10.2014
    Beiträge
    5.124
    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
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  5. #15
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    124
    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 | Status: EwigerAnfaenger |

  6. #16
    Erfahrener Benutzer Robotik Einstein Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    1.974
    Blog-Einträge
    15
    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

  7. #17
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    124
    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 | Status: EwigerAnfaenger |

  8. #18
    Erfahrener Benutzer Robotik Einstein Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    1.974
    Blog-Einträge
    15
    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


  9. #19
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    09.10.2014
    Beiträge
    5.124
    natürlich funktioniert es lokal definiert nicht ohne static, das hatten wir doch schon ausgiebig besprochen!
    Globale Variablen aber sind quasi automatisch static, bzw. hier stellt sich das Problem nicht, denn static hat für globale Variaben eine andere Bedeutung (betr. den file scope, was hier nicht stört, wenn es auch global als static definiert würde).
    Man könnte auch sagen, lokale static Variablen sind globale Variablen mit einem auf eine spezielle Funktion lokal eingeschränkten scope.

    PS,
    da ja Arduino C++ nutzt und nicht ANSI C:
    hier gibt es zusätzlich "static" auch für class-Attribute
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  10. #20
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    124
    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 | Status: EwigerAnfaenger |

Seite 2 von 3 ErsteErste 123 LetzteLetzte

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