Interrupt und Registerabfrage in C



  • Hallo Experten

    Ich hätte mal eine schnelle Frage.
    Ich habe da in Keil uVision V5 den Interrupt definiert:
    Ich möchte das Bit UIF im SR Register des TIM1 überprüfen und kann auch feststellen, dass das UIF Bit gesetzt ist, aber es springt mir irgendwie nicht in die if rein und führt mir die Befehle aus..
    Weiss jemand vielleicht warum? Ist denn die Registerbitabfrage richtig so?

    void TIM1_UP_TIM16_IRQHandler (void) {                                                 // Interrupt to stop TIM PWM counter
    
      if (TIM1->SR & TIM_SR_UIF) {
        TIM1->SR &= ~TIM_SR_UIF;
        //TIM1->DIER &= ~TIM_DIER_UIE;
    
        SetTIM1Param(0, TRD_CLOCK, 5);
        Enable_Timerx_Counter(TIM1); 
    
        Tim1FirstPulse = false;
    
      }
    }
    


  • Die if Anweisung müsste stimmen. Aber das kannst du am besten selbst in einem kleinen Test-Projekt auf deinem PC ausprobieren.

    Andere Frage. Läuft den überhaupt dein Interrupt? Probiere mal folgendes aus.

    volatile uint32_t gIntCounter = 0;
    
    void TIM1_UP_TIM16_IRQHandler (void) {                                                 // Interrupt to stop TIM PWM counter
       gIntCounter++;
      if (TIM1->SR & TIM_SR_UIF) {
        TIM1->SR &= ~TIM_SR_UIF;
        //TIM1->DIER &= ~TIM_DIER_UIE;
    
        SetTIM1Param(0, TRD_CLOCK, 5);
        Enable_Timerx_Counter(TIM1);
    
        Tim1FirstPulse = false;
    
      }
    }
    

    Nun kannst du in deiner main() Funktion nach dem aktuellen Wert von gIntCounter schauen.



  • Ja ich habe einen Testpunkt gesetzt. Er kommt in den Interrupt, aber führt mir die If nicht aus.
    Auch wenn ich die Bits manipuliere zuvor und diese 0x00000001 & 0x00000001 setze...
    Keine Ahnung warum das so ist. Ich habe echt keinen Schimmer..
    Die Interrupts die hintereinander kommen, haben auch unterschiedliche Prioritäten..

    Wäre um Hilfe dankbar.



  • Was für Werte hat das Register und die Maske? Ich würde die Werte in eine globale Variable speichern und diese in der main anschauen, um möglichst wenig die Interrupt Funktion zu stören.

    Überprüfe auch die Größen des Registers und der Maske. Nicht das du ein 8 Bit Register mit einer 32 Bit Maske vergleichst.

    Schau mal ob du etwas in der Prozessorbeschreibung dazu findest. Ich habe da schon einige Prozessor Eigenarten gesehen.

    Kann auch sein dass du innerhalb des Interrupts alle Interrupts deaktivieren und am Ende der Int-Funktion wieder einschalten musst. Sei aber vorsichtig. Nicht dass dein Interrupt alle 1 ms triggert und andere Interrupt verdrängt. Siehe auch Livelocks.


Anmelden zum Antworten