Autor Tema: Tacometro tiempos largos con Interrupcion en B0 y Timer 1 (desbordamiento)  (Leído 1707 veces)

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

Desconectado estudiante_mecatron_ica

  • PIC10
  • *
  • Mensajes: 1
Buenas tardes, vengo a consultar un proyecto de mi escuela por que apenas estoy dando mis primeros pasos en PIC, estoy diseñado un tacometro usando CCS PIC Compiler, Proteus y el PIC16f877A, donde debo obtener el tiempo entre cada pulso de mi sensor exterior que estoy simulando como un tren de pulsos en Proteus.

Mi duda es sobre el desbordamiento del Timer 1, uso el Timer 1 para tomar el numero de Ticks entre los pulsos y ese funciona muy bien, hasta una frecuencia de 11-12HZ, por teoria se que el Clock que uso de 20Mhz tiene sus limitantes, entonces para medir Ticks que rebasen los 66535 Ticks (es el máximo para Timer1 si no estoy tan mal), uso la interrupción del Timer 1 para formar mi tiempo de la siguiente manera:

Tiempo= Ticks de RBO + # de desbordamientos

Sin embargo cuando los tiempos entre pulsos son mayores a los Ticks máximos, el LCD muestra datos que no son correctos, y el correspondiente a desbordes se incrementa sin control.

Adjunto mis archivos como mi código en un bloc de notas para su visualización y mi simulación en Proteus como una imagen que estoy usando para simular así como mi código, si me pudieran orientar donde podría tener el error.
¡Gracias!

(Anotación: ya también intente por CCP y ese me mide a partir de 15 HZ, pero según las características del sistema son desde menos de 1 Hz.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Tacometro tiempos largos con Interrupcion en B0 y Timer 1 (desbordamiento)
« Respuesta #1 en: 15 de Marzo de 2022, 22:56:53 »
Buenas tardes, vengo a consultar un proyecto de mi escuela por que apenas estoy dando mis primeros pasos en PIC, estoy diseñado un tacometro usando CCS PIC Compiler, Proteus y el PIC16f877A, donde debo obtener el tiempo entre cada pulso de mi sensor exterior que estoy simulando como un tren de pulsos en Proteus.

Mi duda es sobre el desbordamiento del Timer 1, uso el Timer 1 para tomar el numero de Ticks entre los pulsos y ese funciona muy bien, hasta una frecuencia de 11-12HZ, por teoria se que el Clock que uso de 20Mhz tiene sus limitantes, entonces para medir Ticks que rebasen los 66535 Ticks (es el máximo para Timer1 si no estoy tan mal), uso la interrupción del Timer 1 para formar mi tiempo de la siguiente manera:

Tiempo= Ticks de RBO + # de desbordamientos

Sin embargo cuando los tiempos entre pulsos son mayores a los Ticks máximos, el LCD muestra datos que no son correctos, y el correspondiente a desbordes se incrementa sin control.

Adjunto mis archivos como mi código en un bloc de notas para su visualización y mi simulación en Proteus como una imagen que estoy usando para simular así como mi código, si me pudieran orientar donde podría tener el error.
¡Gracias!

(Anotación: ya también intente por CCP y ese me mide a partir de 15 HZ, pero según las características del sistema son desde menos de 1 Hz.

Hola.

Entiendo la idea de tu proyecto.

Tu utilizas al Temporizador 1 funcionando de modo libre. Es decir siempre funcionando.

Para medir el tiempo entre pulsos haces esto, lo comprendo muy bien.

Código: C
  1. #INT_EXT
  2. void RB0() // Lee lo de la entrada en RB0
  3. {
  4.   Ta= get_timer1(); // Guardo el tiempo de Timer1 en una variable Ta
  5.   Tick= Ta-Tb; // Obtiene el tiempo entre Ta y un Tb anterior a Ta
  6.   Tb=Ta; // Tb es igual a Ta por que es el anterior al Ta
  7. }

El problema que tienes es que el temporizador es de 16 bits, es decir que puede contar un valor absoluto de 65535 como máximo.

La parte que intentas compensar cuando sucede el desborde, no entiendo que intentas hacer. (La de la interrupción del temporizador 1)

Yo creo que lo haría de la siguiente manera.

Tienes un temporizador de 16 bits, y podría "emular" un temporizador de 32 bits.

La parte baja del temporizador de 32 bits se obtiene con get_timer1(); mientras que la parte alta de este temporizador utilizaría otra variable de 16 bits y esta parte alta se  incrementará así:

Código: C
  1. int16 ParteAlta;
  2.  
  3. #INT_TIMER1  // Interrupcion del timer 1
  4. void TIMER1_isr() //Incrementa 1 cuando se desborda el Timer1
  5. {
  6.    ParteAlta++;
  7. }

Para obtener el valor de mi temporizador de 32 bits haría lo siguiente:

Código: C
  1. int32 Ta
  2. int32 Tb;
  3. int32 Tick
  4.  
  5.  
  6. #INT_EXT
  7. void RB0() // Lee lo de la entrada en RB0
  8. {
  9.   Ta = get_timer1() + 0x10000*ParteAlta;
  10.   Tick= Ta-Tb; // Obtiene el tiempo entre Ta y un Tb anterior a Ta
  11.   Tb=Ta; // Tb es igual a Ta por que es el anterior al Ta
  12. }

Tal vez te funcione.



Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32