- SF800 Solar Speicher Tutorial         
Ergebnis 1 bis 10 von 28

Thema: Teensy 3.2 +++ Interrupt, Übergabeparameter

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Zitat Zitat von frabe Beitrag anzeigen
    Mit der "Teensy-Entprell-Lib" werde ich mich auseinandersetzen, befürchte aber eine Einschränkung und Teensy-Abhängigkeit. Kann ja sein, dass ich mal einen Arduino programmiere und die Teensy-Lib hier nicht funktioniert.
    daher mein Bestreben, möglichst allgemeingültig/universell.
    Nein, das ist keine spezielle Teensy Bibliothek. Die funktioniert auf allen Arduinos.


    Ein Pin-Interrupt ist was feines, wenn man damit z.B. auf Daten von einem externen IC reagiert, z.B. AD-Wandler, Netzwerk oder so. Aber bei einem prellenden Taster ist ein Pin-Interrupt doof. Wenn man da die ISR kurz hält, kommt der Interrupt beim Prellen ja immer wieder, da ist man dann wieder beim Versuch des Sperrens.

    Wenn Interrupt dann über einen Timer. Da habe ich kein Problem mit dem was Klebwax gesagt hat. Man macht im Prinzip das gleiche, was die Bounce2 Library macht. Nur das die mit millis schaut, wie lange das Signal anliegt. Bei einem Timer, der z.B. alle 0,1 oder 1 ms auslöst, kann man ja einfach zählen.

    Falls Du Bücher liest, schau mal nach "Practical UML Statecharts in C/C++". Der Mann stellt da zwar sein eigenes Framework vor, was auch ganz lehrreich ist, vergleicht es aber auch mit diversen gängigen Methoden in C und C++ Statemachines zu bauen. Insoweit eine schöne Übersicht. Im übrigen hat er die gegenteilige Meinung zu Klebwax, was die Notwendigkeit von Timern in professionellen Anwendungen betrifft und verdient auch noch Geld damit.


    Zum Entprellen eines Tasters mit einem Timer habe ich jetzt kein Beispiel, aber hier mal ein Extrakt aus einem Sketch für einen Drehgeber (Encoder). Ich habe den Code von diesem Artikel
    https://www.mikrocontroller.net/articles/Drehgeber
    umgeschrieben auf die Teensy IntervalTimer Lib:

    Code:
    constexpr int led = 13;
    constexpr int knob_SW = 2;
    constexpr int knob_DT = 5;
    constexpr int knob_CLK = 6;
    
    IntervalTimer myTimer;
    
    int encoderPosCount = 0;
    volatile int encoderDelta = 0;
    int encoderLast = 0;
    
    void encoderISR() {
      int encoderNew = 0;
    
      // convert gray to binary
      if (digitalReadFast(knob_DT)) {
        encoderNew = 3;
      }
    
      if (digitalReadFast(knob_CLK)) {
        encoderNew ^= 1;
      }
    
      int diff = encoderLast - encoderNew;
    
      if (diff & 1) {
        encoderLast = encoderNew;
        // bit 1 = direction (+/-)
        encoderDelta += (diff & 2) - 1;
      }
    }
    
    int readEncoder() {
      noInterrupts();
      
      int val = encoderDelta;
      encoderDelta = 0;
      
      interrupts();
    
      return val;
    }
    
    int readEncoder2() {
      noInterrupts();
      
      int val = encoderDelta;
      encoderDelta = val & 1;
      
      interrupts();
    
      return val >> 1;
    }
    
    int readEncoder4() {
      noInterrupts();
      
      int val = encoderDelta;
      encoderDelta = val & 3;
      
      interrupts();
    
      return val >> 2;
    }
    
    void setup() {
      pinMode(led, OUTPUT);
      pinMode(knob_SW, INPUT);
      pinMode(knob_DT, INPUT);
      pinMode(knob_CLK, INPUT);
    
      int encoderNew = 0;
      
      if (digitalReadFast(knob_DT))
      {
        encoderNew = 3;
      }
    
      if (digitalReadFast(knob_CLK)) {
        encoderNew ^= 1;
      }
    
      encoderLast = encoderNew;
    
      myTimer.begin(encoderISR, 1000);
    }
    
    void loop() {
    
      encoderPosCount += readEncoder2();
      
      // Ausgabe entfernt
      
      delay(100);
    }
    Geändert von Mxt (24.11.2019 um 15:18 Uhr)

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.667
    Hallo,

    Ich habs in der Vergangenheit so gelöst:




    Code:
    
    //Arduino-Code
    //
    
    
    void setup(){
          pinMode(x,INPUT_PULLUP); //Taster 
    }
    
    
    void digitalWait(int Pin) {
      int i=8;                            //Zählervariable, 8 Durchläufe (min. 240ms Wartezeit, in Schleife, nachdem Taster losgelassen wurde)
      while(i>0) {                        
        while(!digitalRead(Pin)) {i=8;}   //Taster gedrückt, dann setze Zähler i zurück
        if (digitalRead(Pin)) {           //Taster nicht gedrückt?
          delay(30);                      //dann warte 30ms
          i--;                            //und dekrementiere den Zähler i
        }
      }
    }
    
    
    void loop(){
          if (!digitalRead(x)) {    //Ist Taster an Input x gedrückt?
                Mach_Was_Du_Machen_Sollst();
                Mach_Noch_Mehr();
                digitalWait(x);     //sicherstellen, dass Taster losgelassen wurde
          }
    }


    Vielleicht lässt sich das auf einem Teensy ähnlich machen, wenn das so ausreichend wäre.




    MfG

Ähnliche Themen

  1. Teensy 3.2 +++ Interrupttimer via RTC ?
    Von frabe im Forum Arduino -Plattform
    Antworten: 1
    Letzter Beitrag: 22.10.2019, 14:56
  2. Teensy 3.2 +++ I/O-Werte, Analog-In
    Von frabe im Forum Arduino -Plattform
    Antworten: 26
    Letzter Beitrag: 18.10.2019, 08:57
  3. Der Teensy 4.0 ist fertig
    Von Mxt im Forum Arduino -Plattform
    Antworten: 44
    Letzter Beitrag: 12.08.2019, 09:24
  4. Platinenlayout Problem mit Platinenlayout - Adapterplatine für den Teensy 3.1
    Von robonooby im Forum Konstruktion/CAD/3D-Druck/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 9
    Letzter Beitrag: 29.06.2014, 15:09
  5. Tabelle als Übergabeparameter von Subroutine?
    Von screwdriver im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 09.01.2009, 15:45

Stichworte

Berechtigungen

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

12V Akku bauen