Estoy programando una pic18f24k50 usando Timer0 para activar una interrupción cada 5 ms. También estoy manejando las interrupciones de USB
Aquí está el código donde inicio el temporizador:
void TMR0_Initialize(void) {
// Set TMR0 to the options selected in the User Interface
TRISCbits.RC6 = 0;
// TMR0ON enabled; T0SE Increment_hi_lo; PSA not_assigned; T0CS FOSC/4; T08BIT 8-bit; T0PS 1:2;
T0CON = 0xD8;
// T08BIT = 0;
// TMR0H 0;
TMR0H = 0x00;
// TMR0L 156;
TMR0L = 0x9C;
// Load TMR0 value to the 8-bit reload variable
timer0ReloadVal8bit = 156;
// Clear Interrupt flag before enabling the interrupt
INTCONbits.TMR0IF = 0;
// Enabling TMR0 interrupt.
INTCONbits.TMR0IE = 1;
// Start TMR0
TMR0_StartTimer();
}
Estoy manejando la interrupción aquí:
#if defined(__XC8)
void interrupt SYS_InterruptHigh(void)
{
if (INTCONbits.TMR0IE == 1 && INTCONbits.TMR0IF == 1) {
T0CONbits.TMR0ON = 0; //Stop timer0
// clear the TMR0 interrupt flag
INTCONbits.TMR0IF = 0;
// PORTCbits.RC6 = 1;
LATCbits.LATC6 = 1;
LED_VerticalSyncIter();
LATCbits.LATC6 = 0;
// PORTCbits.RC6 = 0;
TMR0H = 0x00;
// TMR0L 156;
TMR0L = 0x9C;
T0CONbits.TMR0ON = 1; //Start timer0
//TMR0_ISR();
}
#if defined(USB_INTERRUPT)
USBDeviceTasks();
#endif
}
#endif
Estoy usando el pin RC6 para hacer un pulso cada vez que se dispara la interrupción y estoy viendo la señal con un analizador lógico. Voy a publicar dos imágenes, la primera de ellas tengo el usb conectado:
Lainterrupciónsedisparadosvecescada5ms.DebeseralgorelacionadoconlasinterrupcionesdelUSB,yaquesidesconectoelcableUSB,noreciboestosparesdepulsos.Peronoséquéestápasandoporqueestoyrevisandoelindicadordeinterrupcióndeltemporizadoryrestableciéndolo.Porlotanto,nodeberíatomarelpulsosilainterrupciónnoprovienedeltemporizador0
AquíestálaimagendeloqueobtengosidesconectoelcableUSB:
La interrupción se dispara, pero a veces la brecha entre los pulsos es de 5 ms, a veces de 10 ms, etc ...
Me gustaría recibir los pulsos periódicamente cada X ms. ¿Qué estoy haciendo mal?
Gracias.