La interrupción nunca se dispara

4

Soy nuevo en Embedded 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 desplazar a la izquierda un poco en un puerto al siguiente pin. El temporizador funciona. Puedo verlo hacer clic a través de CNT en el simulador, y la marca de desbordamiento se establece, pero el ISR nunca se ejecuta (y, por lo tanto, la bandera de desbordamiento nunca se restablece). ¿Alguien tiene alguna idea de dónde voy mal? Más o menos copié / pegué el temporizador / código de 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
    }
}
    
pregunta RubberDuck

1 respuesta

5

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

  

CTRL - Registro de control

     

Bit 0 - LOLVLEN: Activació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 está debajo.

//enable low level interrupts
PMIC.CTRL |= PMIC_LOLVLEN_bm; //0b00000001
    
respondido por el Rev1.0

Lea otras preguntas en las etiquetas