- LiFePO4 Speicher Test         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 28

Thema: Teensy 3.2 +++ Interrupt, Übergabeparameter

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    130

    Teensy 3.2 +++ Interrupt, Übergabeparameter

    Anzeige

    Powerstation Test
    Hallo Zusammen.
    Leider finde ich keine praktikable Lösung für die Übergabe vom Pin-Interrupt zum loop().

    Aufgabe:
    Im Loop gibt es verschiedene Prg-Abschnitte und eine Taste zur Auslösung von irgendwas.
    Dieses Taste löst je nach Programmabschnitt eine Funktion aus.
    Bsp:
    Prg-Abschnitt 1 läuft ca. 1Sek, wird hierbei die Taste gedrückt leuchtet eine grüne LED.
    Danach Prg-Abschnitt 2 mit gleicher Taste und roter LED, u.s.w.

    Ich finde keine Verbindung vom Pin-Interrupt zu den jeweiligen Prg-Abschnitten.

    Interrupt ist klar, Entprellung ist klar, Prog-Abschnitte sind klar!
    Vermutlich werde ich mit einer volatile-Variable arbeiten. Sollte der ISR oder der jeweilige Prog-Abschnitt die Var verändern?
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Status: EwigerAnfaenger |

  2. #2
    HaWe
    Gast
    Variablen innerhalb der loop behalten nicht ihre Werte von einer zu den nächsten loop-Durchläufen.
    Wenn auch ISRs drauf zugreifen, würde ich mit globalen Variablen arbeiten,
    wenn sie nur lokal in der loop gebraucht und verändert werden: mit
    volatile static ...

    In allen Fällen:
    bitte vollständigen Code in code tags posten!

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    130
    Zitat Zitat von HaWe Beitrag anzeigen
    volatile static ...
    volatile Variable nutze ich bereits Funktionsübergreifend.

    Im u.s. Versuch steuer ich aus der ISR-Funktion den Summer inkl. Pause.
    Sollte man aber nicht innerhalb einer Interrupt-Routine... oder sollte ich das nicht soooo sklavisch sehen?
    Code:
    void ISR_Aufgabe() {
      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(200);
        SummerTon();
      }
    }
    Im jeweiligen Prog-Abschnitt wird die Var "ISR_Uebergabe" verändert.
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Status: EwigerAnfaenger |

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


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

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

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

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

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

  9. #9
    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 13:05 Uhr)

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

Seite 1 von 3 123 LetzteLetzte

Ähnliche Themen

  1. Teensy 3.2 +++ Interrupttimer via RTC ?
    Von frabe im Forum Arduino -Plattform
    Antworten: 1
    Letzter Beitrag: 22.10.2019, 15:56
  2. Teensy 3.2 +++ I/O-Werte, Analog-In
    Von frabe im Forum Arduino -Plattform
    Antworten: 26
    Letzter Beitrag: 18.10.2019, 09:57
  3. Der Teensy 4.0 ist fertig
    Von Mxt im Forum Arduino -Plattform
    Antworten: 44
    Letzter Beitrag: 12.08.2019, 10: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, 16:09
  5. Tabelle als Übergabeparameter von Subroutine?
    Von screwdriver im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 09.01.2009, 16:45

Stichworte

Berechtigungen

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

LiFePO4 Speicher Test