Interrupt wird nie ausgelöst

Ich bin neu bei Embedded und habe seit Tagen damit zu kämpfen. Ich verstehe einfach nicht, warum das nicht funktioniert.

Ich verwende einen ATxMega128A1. Ich möchte einen Timer-Überlauf-Interrupt verwenden, um ein Bit an einem Port zum nächsten Pin zu verschieben. Die Zeitschaltuhr funktioniert. Ich kann sehen, dass es im Simulator durch CNT klickt, und das Überlauf-Flag wird gesetzt, aber die ISR wird nie ausgeführt (und daher wird das Überlauf-Flag auch nie zurückgesetzt). Hat jemand eine Ahnung, wo ich falsch liege? Ich habe mehr oder weniger den Timer-/Interrupt-Code aus Atmels Trainingscode kopiert/eingefügt.

ISR(TCC0_OVF_vect)
{
    LEDPORT = (LEDPORT << 1);
}

int main(void)
{
    initLights();

    // Set up Timer/Counter 0.
    TCC0.PER = 0x10; // 
    TCC0.CTRLA = ( TCC0.CTRLA & ~TC0_CLKSEL_gm ) | TC_CLKSEL_DIV1_gc; //start timer with system clock
    TCC0.INTCTRLA = ( TCC0.INTCTRLA & ~TC0_OVFINTLVL_gm ) | TC_OVFINTLVL_LO_gc; // Enable overflow interrupt.

    // enable global interrupts:
    sei();

    while(true)
    {   
        //do nothing, the timer interrupt will handle it
    }
}

Antworten (1)

Wie Sie wahrscheinlich wissen, hat der XMEGA einen mehrstufigen Interrupt-Controller. Sie müssen nicht nur den globalen Interrupt aktivieren, sondern auch den gewünschten Level-Interrupt (Low-Level, da Sie Ihre Timer-Priorität auf "Low" konfiguriert haben) im Steuerregister.

CTRL – Steuerregister

Bit 0 – LOLVLEN: Low-Level Interrupt Enable(1)

Wenn dieses Bit gesetzt ist, werden alle Low-Level-Interrupts aktiviert. Wenn dieses Bit gelöscht ist, werden Low-Level-Interrupt-Anforderungen ignoriert.

Der Code zum Aktivieren des spezifischen Interrupt-Levels ist unten.

//enable low level interrupts
PMIC.CTRL |= PMIC_LOLVLEN_bm; //0b00000001