- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
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 Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    Vor void setup()
    Code:
    volatile int ISR_Uebergabe = 0;
    Ohne static funktionierts einwandfrei - Zufall?
    Code:
    void loop() {
      digitalWrite(LEDgnPin, 1);
      digitalWrite(LEDrtPin, 0);
      __TP__(1);
      ISR_Uebergabe = 1;
      Pausen_ms(3000);
      
      digitalWrite(LEDgnPin, 0);
      digitalWrite(LEDrtPin, 1);
      __TP__(2);
      ISR_Uebergabe = 2;
      Pausen_ms(3000);
    
      digitalWrite(LEDgnPin, 1);
      digitalWrite(LEDrtPin, 1);
      __TP__(3);
      ISR_Uebergabe = 3;
      Pausen_ms(3000);
    }
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  2. #2
    HaWe
    Gast
    also global?
    dann ist es automatisch "static" und "volatile" brauchst du dann überhaupt nicht.

    - - - Aktualisiert - - -
    edit - Frage hat sich erübrigt
    - dann allerdings verstehe ich deinen Code nicht, da muss jemand anderes 'ran

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    Derzeit wird nach Pin-Interrupt, innerhalb der ISR-Funktion "ISR_Taste1()" eine Tastenentprellungs-Funktion "Entprell(Pin)" aufgerufen.
    Dauert ca.30ms.
    Eine Var. mit 1 für Entprellt oder 0 für Fehlerhaft kommt zurück.
    Die "ISR_Uebergabe" wird innerhalb des void loop() verändert

    Code:
    void ISR_Taster1() {  // Funktion wirdausggeführt, sobald ISR auslöst
      if(Entprell(TasterPin1 == 1) {
       if (ISR_Uebergabe == 1) {
         SummerTon();
       }
       if (ISR_Uebergabe == 2) {
         SummerTon();
         Pausen_ms(100);
         SummerTon();
        }
        if (ISR_Uebergabe == 3) {
          SummerTon();
          Pausen_ms(100);
          SummerTon();
          Pausen_ms(100);
         SummerTon();
       }
      }
    }
    Ich Frage mich, ob ich der ISR-Routine nicht zu viel zu mute.
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.210
    Mach das nicht.
    Das geht ganz schnell schief.
    Nimm dir irgendeine Variable, die innerhalb der ISR geändert wird- nichts weiter.
    Alles andere (z.B. die Variable auswerten, dass sie erst ab dem 30. Mal zählt (Entprellung für Arme, einfach, reicht aber oft) mach ausserhalb.

    Wenn du sicher gehen wllst, dann mach in der ISR folgendes:

    -Interrupts deaktivieren
    -tun, was zu tun ist
    -Interrupts aktivieren

    So stellst du sicher, dass innerhalb der ISR kein Interrupt ausgelöst wird- das nämlich ist das Problem mit ISR's.
    Wenn dir sowas passiert, wird die ISR aufgerufen, während sie noch läuft...du kannst dir denken, wie _das_ endet.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  5. #5
    HaWe
    Gast
    Nimm dir irgendeine Variable, die innerhalb der ISR geändert wird- nichts weiter.
    Alles andere (z.B. die Variable auswerten, dass sie erst ab dem 30. Mal zählt (Entprellung für Arme, einfach, reicht aber oft) mach ausserhalb.
    genau, und Variable, die innerhab einer ISR geändert werden, sollten wieder global deklariert werden und volatile sein.
    Geändert von HaWe (22.11.2019 um 12:05 Uhr)

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    Zitat Zitat von Rabenauge Beitrag anzeigen
    -Interrupts deaktivieren
    -tun, was zu tun ist
    -Interrupts aktivieren
    DANKE - toller Hinweis!
    Genau darüber hatte ich mir auch schon Gedanken gemacht.
    noInterrupts(), interrupts() ist die Lösung!
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von Rabenauge Beitrag anzeigen
    -Interrupts deaktivieren
    -tun, was zu tun ist
    -Interrupts aktivieren
    Vorsicht, das geht in die Hose.

    Von vorne mal angefangen. Das Deaktivieren des Interrupts am Anfang ist nicht das erste, was im Interrupthandler passiert. Da laufen noch ein Dutzend oder mehr Assemblerbefehle vorher ab, wie Status und Register retten. Wenn dort der Interrupt nicht automatisch gesperrt wäre, würde der Interrupt sofort wieder zuschlagen, da das Interruptflag noch nicht gelöscht ist. Der Interrupt muß also noch vor dem ersten Assemblerbefehl gesperrt werde, und das geht nur, wenn es automatisch passiert. Und so ist es auch. Beim Eintritt in den Interrupthandler ist mindestens dieser interrupt gesperrt. Den Interrupt im Handler zu deaktivieren ist zwar nicht unbedingt schädlich aber überflüssig und käme auch viel zu spät.

    Das Aktivieren ist aber schlecht. Zwischen dem letzten C-Befehl und dem Ende der Funktion wird das, was am Anfang des Handlers gesichert wurde, wiederhergestellt. Das sind nochmal ein Dutzend oder mehr Befehle. Die laufen jetzt mit offenen Interrupts und das ist gefährlich. Erst ganz am Ende, wenn der Prozessor den Interruptkontext verlassen hat, dürfen die Interrupte wieder zugelassen werden. Daher endet ein Interrupthandler auch nicht mit einem Return (from Subroutine) sondern einem Return from Interrupt. Das heißt häufig RETI. Der stellt den Interrupstatus wieder so ein, wie er vor dem Interrupt war.

    MfG Klebwax
    Geändert von Klebwax (23.11.2019 um 19:42 Uhr)
    Strom fließt auch durch krumme Drähte !

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    Kann sein, aber wie macht man´s besser?

    Zwischen
    attachInterrupt(Taster01Pin, ISR_Taster1, RISING);
    und
    Code:
    ISR_Taster1() {
      noInterrupts(); // alle Interrupts ausschalten
      Variable = Entprellung();  // volatile, ~30ms
      interrupts();  // alle Interrupts wieder einschalten
    }
    ist nicht mehr viel Platz.
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  9. #9
    HaWe
    Gast
    erst mal evt das hier wieder streichen (ich kann es nicht beurteilen, was nun stimmt, Klebwax vs. Rabenauge):
    noInterrupts(); // alle Interrupts ausschalten
    interrupts(); // alle Interrupts wieder einschalten


    ich vermute, 30ms warten ist auch etwas lang für eine ISR, und wenn das so ist: dann eine Statemachine programmieren:
    erst state1=0,
    beim 1.Tastendruck per Interrupt: state1=1 und timestamp1=millis()
    dann millis()-timestamp1 in loop() kontrollieren und sobald 30ms erreicht ist: Tastendruck verarbeiten und state1 wieder auf 0.

    Ich mache das bisher ganz ohne Interrupts in einer C++ Klasse, auch zum Erkennen und Unterscheiden von kurzem Click, langem Press und Doppelklick.
    Aber ich weiß ntl nicht, ob dich meine Lösung interessiert, sonst zeige ich sie dir gerne...

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

Labornetzteil AliExpress