- Labornetzteil AliExpress    Werbung      
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
    HaWe
    Gast
    volatile alleine nutzt nur etwas, wenn die Variablen nicht weiterverarbeitet oder unbemerkt (z.B. bei multithreading) verändert werden könnten. Es wird nur verhindert, dass sie in Registern verbleiben (edit) oder vom Compiler herausoptimiert bleiben.

    ansonsten:
    static
    oder
    volatile static
    Bild  

    wo ist
    ISR_Uebergabe
    definiert?
    Geändert von HaWe (21.11.2019 um 15:03 Uhr)

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

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

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

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    57
    Beiträge
    2.214
    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..

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

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

  8. #8
    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 !

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

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

    Werbung      LiFePO4 Speicher Test