TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: micro_pepe en 31 de Enero de 2017, 15:43:13

Título: interrupcion Timer1 y precision
Publicado por: micro_pepe en 31 de Enero de 2017, 15:43:13
Estoy calculando el periodo del timer1 de esta forma:

Código: C
  1. #define f_sample    55000 // Frequência de amostragem
  2. #define T1PS        0b00 // Prescaler do Timer1
  3. #define PRESCALER1  1
  4. unsigned int  PER = (65535-((_XTAL_FREQ/4)/(f_sample*PRESCALER1))); // Periodo do Timer1

Lo configuro de esta otra:

Código: C
  1. T1CONbits.T1CKPS = T1PS; // Prescaler
  2.     T1CONbits.TMR1CS = 0b00; // Clock interno
  3.     PIE1bits.TMR1IE = 1; // Habilita interrupção
  4.     PIR1bits.TMR1IF = 0; // Limpa flag da interrupção
  5.     TMR1L = PER; // Período do Timer1
  6.     TMR1H = PER >> 8; // Período do Timer1
  7.     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

Código: C
  1. void interrupt Interrupt() {
  2.     if (PIR1bits.TMR1IF) {
  3.         TMR1L = PER; // Período do Timer1
  4.         TMR1H = PER >> 8; // Período do Timer1
  5.         PIR1bits.TMR1IF = 0;
  6.  
  7.         if(parpa){OSC_OUT = 0; parpa = 0;}else{OSC_OUT = 1; parpa = 1;}
  8.     }
  9. }

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!!!
Título: Re:interrupcion Timer1 y precision
Publicado por: KILLERJC en 31 de Enero de 2017, 18:19:05
No sé si tú PIC posee CPP, pero deberías utilizarlo si querés más exactitud
Título: Re:interrupcion Timer1 y precision
Publicado por: micro_pepe en 01 de Febrero de 2017, 20:33:27
No sé si tú PIC posee CPP, pero deberías utilizarlo si querés más exactitud

Sí tiene, pero la idea es generar una senoidal, entonces con el timer1 lo que hago es marcar el periodo en el cual actualizo el pwm, son 50 muestras, entonces para generar 1KHz el periodo resulta: 1ms/50 = 20us. Para ajustar dicho periodo, hice lo del post anterior, 20us a nivel alto y 20us a nivel bajo en un pin, lo que debe dar 25KHz; con ese periodo obtengo menos de 25KHz, y ajustando llegué a un periodo de 18.18us, con el cual obtengo la senoidal de 1KHz clavado, o los 25KHz en el pin de prueba.

Despues de ese "ladrillo" espero haberme explicado un poco mejor.

Un saludo!!!

PD: Me estoy basando en esto:

http://www.todopic.com.ar/foros/index.php?topic=23818.0
Título: Re:interrupcion Timer1 y precision
Publicado por: AKENAFAB en 02 de Febrero de 2017, 14:18:09
YA revisaste el código generado ?
Lo mas seguro tengas que compensar.

¿Habilitaste algún nivel de optimizan?
Título: Re:interrupcion Timer1 y precision
Publicado por: micro_pepe en 02 de Febrero de 2017, 17:29:25
YA revisaste el código generado ?
Lo mas seguro tengas que compensar.

¿Habilitaste algún nivel de optimizan?

He probado a compilar en la versió PRO, y es algo más rápido.

Con lo otro ¿a que te refieres? a ver el asm que genera supongo, y retocar la rutina de interrupción, nunca hice eso, solo alguna vez meter código asm entre el código en c.

Gracias, un saludo!!!
Título: Re:interrupcion Timer1 y precision
Publicado por: AKENAFAB en 02 de Febrero de 2017, 19:28:28
Ver el asm solo para comprobar que no estuviera metiendo basura pero como usas modo PRO eso no sucede.

Puedes usar el stop watch y ver cuando esta consumiendo dentro de las rutinas.
Título: Re:interrupcion Timer1 y precision
Publicado por: micro_pepe en 06 de Febrero de 2017, 11:42:49
Ver el asm solo para comprobar que no estuviera metiendo basura pero como usas modo PRO eso no sucede.

Puedes usar el stop watch y ver cuando esta consumiendo dentro de las rutinas.

No conocia esa herramienta, he buscado un poco de información y es muy util  :)

Desde que entra en la interrupción hasta que actualiza el Timer, transcurren 1.5us, o lo que es lo mismo 12 instrucciones a 32MHz de reloj; mas o menos salen las cuentas con el retardo que noto:

1/50KHz - 1/55KHz = 1.8us

Gracias, un saludo!!!