Autor Tema: interrupcion Timer1 y precision  (Leído 3432 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3216
interrupcion Timer1 y precision
« 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!!!
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:interrupcion Timer1 y precision
« Respuesta #1 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

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3216
Re:interrupcion Timer1 y precision
« Respuesta #2 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
« Última modificación: 01 de Febrero de 2017, 21:08:12 por micro_pepe »
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re:interrupcion Timer1 y precision
« Respuesta #3 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?

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3216
Re:interrupcion Timer1 y precision
« Respuesta #4 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!!!
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re:interrupcion Timer1 y precision
« Respuesta #5 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.

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3216
Re:interrupcion Timer1 y precision
« Respuesta #6 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!!!
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡