La interrupción nunca dispara

Soy nuevo en incrustado y he estado luchando con esto durante días. Simplemente no entiendo por qué esto no funciona.

Estoy usando un ATxMega128A1. Quiero usar una interrupción de desbordamiento del temporizador para cambiar un poco a la izquierda en un puerto al siguiente pin. El temporizador funciona. Puedo verlo hacer clic a través de CNT en el simulador, y el indicador de desbordamiento se establece, pero el ISR nunca se ejecuta (y, por lo tanto, el indicador de desbordamiento tampoco se reinicia). ¿Alguien tiene alguna idea de dónde me estoy equivocando? Más o menos copié/pegué el código del temporizador/interrupción del código de entrenamiento de Atmel.

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
    }
}

Respuestas (1)

Como probablemente sepa, el XMEGA tiene un controlador de interrupción multinivel. No solo debe habilitar la interrupción global, sino también la Interrupción de nivel deseada (Nivel bajo ya que configuró la prioridad de su temporizador en "baja") en el registro de control.

CTRL – Registro de control

Bit 0 – LOLVLEN: Habilitación de interrupción de bajo nivel (1)

Cuando se establece este bit, se habilitan todas las interrupciones de bajo nivel. Si se borra este bit, se ignorarán las solicitudes de interrupción de bajo nivel.

El código para habilitar el nivel de interrupción específico se encuentra a continuación.

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