Estoy usando el TIMER1 del PIC18F452 con esta configuración:
//Configuración TIMER1.
//RD16 = 1;//Enables register Read/Write of Timer1 in one 16-bit operation
RD16 = 0;//Enables register Read/Write of Timer1 in two 8-bit operations
T1CKPS0 = 1;//Rango division timer1 = 8;
T1CKPS1 = 1;
T1OSCEN = 0;//Deshabilita el oscilador externo del timer1.
TMR1CS = 0;//Habilita reloj interno del timer1.
TMR1ON = 1;//Enable del timer1.
TMR1IP = 0;
TMR1L = PERIODO_REFRESCO_L;
TMR1H = PERIODO_REFRESCO_H;
TMR1IF = 0;//Borro flag interrupcion timer1.
TMR1IE = 1;//Habilito interrupcion timer1.
PEIE = 1;//Habilito interrupcion perifericos.
Con eso consigo hacer temporizaciones correctas por interrupción. Pero, al usar el PWM, con la siguiente configuración, las temporizaciones del TIMER1 van 4 veces más rápidas. Leyendo el dataseet del PIC18F452, pone que el TIMER1 se puede resetear con un reset interno provocado por el CCP "RESET from CCP module special event trigger", pero no veo forma de desactivarlo con algún registro.
//Configuracion y uso del PWM.
void ActualizarPWM_1(unsigned short duty){
CCPR1L = duty>>2;
DC1B0 = duty & 0b00000001;
DC1B1 = (duty>>1) & 0b00000001;
}
//------------------------------------------------------
void IniciarPWM_1(void){
PR2 = 255;//PWM period = [(PR2) + 1] • 4 • TOSC • (TMR2 prescale value)
//PWM de 10KHz.
TRISC2 = 0;//CCP1 pin an output
T1CKPS0 = 1; //Timer2 Clock Prescale Select bits = 4
T1CKPS1 = 0;
TOUTPS0 = 0;//Post escala
TOUTPS1 = 0;
TOUTPS2 = 0;
TOUTPS3 = 0;
TMR2ON = 1;//Timer2 is on
TMR2 = 0x00;
CCP1M0 = 0;//PWM mode
CCP1M1 = 0;
CCP1M2 = 1;
CCP1M3 = 1;
}
//------------------------------------------------------
//------------------------------------------------------
void ActualizarPWM_2(unsigned short duty){
DC2B0 = duty & 0b00000001;
DC2B1 = (duty>>1) & 0b00000001;
CCPR2L = duty>>2;
}
//------------------------------------------------------
void IniciarPWM_2(void){
PR2 = 255;//PWM period = [(PR2) + 1] • 4 • TOSC • (TMR2 prescale value)
//PWM de 10KHz.
TRISC1 = 0;//CCP2 pin an output
T2CKPS0 = 1; //Timer2 Clock Prescale Select bits = 4
T2CKPS1 = 0;
TOUTPS0 = 0;//Post escala
TOUTPS1 = 0;
TOUTPS2 = 0;
TOUTPS3 = 0;
TMR2ON = 1;//Timer2 is on
TMR2 = 0x00;
CCP2M0 = 0;//PWM mode
CCP2M1 = 0;
CCP2M2 = 1;
CCP2M3 = 1;
}