Interrupción de coincidencia del período Timer2 en dsPIC33F no funciona

0

Estoy intentando que la interrupción de coincidencia del período Timer2 en mi dsPIC33FJ128GP802 funcione. Quiero que se interrumpa después de ~ 480 ciclos. Estoy usando MPLAB C30.

Tengo, para inicializar el temporizador e interrumpir:

// Initialize Timer2, which is used for output timing.
T2CONbits.TON = 1;
T2CONbits.TSIDL = 0;
T2CONbits.TCKPS = 0;
T2CONbits.TCS = 0;
T2CONbits.T32 = 0;
// Initialize Timer2 interrupt with a slightly
// higher priority.
IPC1bits.T2IP = 5;
IFS0bits.T2IF = 0;
IEC0bits.T2IE = 0;

(la interrupción del temporizador está inicialmente desactivada)

Ya tengo interrupciones de cambio de pin que funcionan con una prioridad de 4. Quiero que la interrupción Timer2 tenga una prioridad más alta.

Y para configurar la interrupción tengo esto:

T2CONbits.TON = 1;
TMR2 = 0;
timer2_osd = 480 + vid_hoffset;
PR2 = timer2_osd;
IEC0bits.T2IE = 1;

También tengo un ISR,

void _MY_ISR _T2Interrupt()
{
    IFS0bits.T2IF = 0;
    return;
}

Sin embargo, encuentro que el procesador solo se reinicia y no se ejecutará con esto habilitado. Funcionará con un bucle ocupado comprobando el temporizador, pero eso desperdicia ciclos.

¿Alguien puede ver dónde me he equivocado?

    
pregunta Thomas O

2 respuestas

3

Acabo de ver el código que escribí hace un tiempo para configurar el temporizador 2 para una interrupción periódica de 1 ms para un PIC24F (esencialmente el mismo hardware de temporizador que dsPIC33F), y parece que sí:

#define CPU_CLK_RATE 32000000L
#define PERIPH_CLOCK_RATE (CPU_CLK_RATE/2L)

#define TIMER_2_RATE 1000L
#define TIMER_2_PRE  64L        // clock rate is (32000000/2)/64 = 250 KHz
#define TIMER_2_MATCH (PERIPH_CLOCK_RATE/(TIMER_2_RATE * TIMER_2_PRE))  

    T2CON = 0; // set control register to defaults

    T2CONbits.TSIDL = 1;  // discontinue when idle
    T2CONbits.TCKPS1 = 1; // prescaler of 64
    T2CONbits.TCKPS0 = 0; // prescaler of 64
    T2CONbits.T32 = 0;    // 16 bit timer
    T2CONbits.TCS = 0;    // FOSC/2 (32Mhz/2)
    TMR2 = 0-TIMER_2_MATCH*19;  // 20 millisecond delay before starting
    PR2 = TIMER_2_MATCH; 

    SetPriorityIntT2(TIMER2_INTERRUPT_PRIORITY); // set to very high priority
    EnableIntT2; // enable interrupts

    T2CONbits.TON = 1

Muy similar al tuyo, excepto que yo preinicialicé TMR2 por lo que habría un retraso antes de la primera interrupción. No sé si eso ayudaría en tu caso o no, pero puedes intentarlo.

    
respondido por el tcrosley
0

La hoja de datos parece sugerir que debe borrar TON, inicializar el temporizador y luego configurar TON. Muchas secuencias de ejemplo terminan con el ajuste de TON, no comienzan con él.

Muchos dispositivos retienen los valores de trabajo de sus registros de configuración cuando están habilitados ... por lo que siempre debe deshabilitar, configurar y luego habilitar. Tenga mucho cuidado al cambiar los registros en un periférico en funcionamiento.

Tampoco tengo claro cómo se vincula el código de interrupción al evento de interrupción timer2. ¿Qué es _MY_ISR?

    
respondido por el darron

Lea otras preguntas en las etiquetas