Estoy calculando el periodo del timer1 de esta forma:
#define f_sample 55000 // Frequência de amostragem
#define T1PS 0b00 // Prescaler do Timer1
#define PRESCALER1 1
unsigned int PER = (65535-((_XTAL_FREQ/4)/(f_sample*PRESCALER1))); // Periodo do Timer1
Lo configuro de esta otra:
T1CONbits.T1CKPS = T1PS; // Prescaler
T1CONbits.TMR1CS = 0b00; // Clock interno
PIE1bits.TMR1IE = 1; // Habilita interrupção
PIR1bits.TMR1IF = 0; // Limpa flag da interrupção
TMR1L = PER; // Período do Timer1
TMR1H = PER >> 8; // Período do Timer1
T1CONbits.TMR1ON = 1; // Liga Timer1
Y luego en la interrupción cambio el estado de un pin cada vez para comprobar el tiempo temporizado, puesto que el timer1 lo calculo para un periodo de 1/55KHz, la frecuencia sería la mitad 27,5KHz, pero lo que obtengo es 25KHz
void interrupt Interrupt() {
if (PIR1bits.TMR1IF) {
TMR1L = PER; // Período do Timer1
TMR1H = PER >> 8; // Período do Timer1
PIR1bits.TMR1IF = 0;
if(parpa){OSC_OUT = 0; parpa = 0;}else{OSC_OUT = 1; parpa = 1;}
}
}
Supongo que entre la entrada en la interrupción y la actualización del timer1 corren unas instrucciones que provocan ese pequeño error ¿Sera eso?
Lo que necesito son 25KHz, ajustando por prueba y error "f_sample" llegué al valor de 55KHz para obtener los 25 deseados.
Gracias, un saludo!!!