Duda TMR0

Hola, que tal?
Me surgió una duda respecto del tmr0 del 16f628a.
Estoy intentando hacer un frecuencímetro con este uC, de forma que se le inyecta una señal por RA4 y el PIC cuenta el número de ciclos que entran durante 1 seg.
Código:
#include <16F628A.h>
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B0,rcv=PIN_B1,bits=8)

float overflow;
int counter=5;
int timer;
float frequency;

#int_TIMER0
void TIMER0_isr(void)
{
overflow=overflow+1;
}
#int_TIMER1
void TIMER1_isr(void)
{
set_timer1(0);
counter--;
if (counter==0)
   {
   timer=get_timer0();
   set_timer0(0);
   frequency=((float)overflow*256)+(float)timer;
   printf("Frecuencia:%g\r",frequency);
   overflow=0;
   counter=5;
   }
}
void main()
{
setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
set_timer0(0);
set_timer1(40536);
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
while(true);
}

El TMR1 realiza un conteo de 1 segundo con el reloj interno del PIC, mientras que el TMR0 cuenta el número de ciclos que entran en RA4. Cuando el TMR1 se desborda 5 veces (Cada desbordamiento ocupa 200ms) se realiza un cálculo mediante el TMR0.
Mi duda es la siguiente. Se supone que el TMR0 puede realizar conteos hasta que la variable "float overflow" se llene, cosa ardua. Por lo tanto, se podrían realizar conteos de forma que este frecuencímetro llegara a los 6MHz?
Simulé el programa con proteus, sin embargo, éste me da una lectura de 1604902'08Hz. Quiero saber si con este código se podría llegar a los 6MHz, con lo cual la simulación no sería fiable, o si por el contrario es imposible llegar así a los 6MHz.
Gracias, y un saludo.
 

Adjuntos

  • Frecuencimetro.JPG
    Frecuencimetro.JPG
    177.3 KB · Visitas: 6
  • Frecuencimetro.rar
    18.7 KB · Visitas: 6
Veo casi imposible detectar hasta 6MHz, en términos matemáticos, una señal de 6MHz nos da un periodo de 1/6MHz=166.6 ns, es decir en un segundo el TMR0 se desbordaría muchísimas veces, en mi opinión es mejor que utilices el TMR0 como base de tiempo y la entrada de frecuencia sea conectada al TMR1, con esto se tiene una mayor resolución en el conteo de frecuencia.

Aún así, me parece exagerado el tiempo de muestra (1seg) para esa frecuencia. Podrías intentar disminuyendo el tiempo de muestra a unos cuantos ms y así poder "detectar" frecuencias mayores. Saludos
 
Hola, Daniel, y gracias por tu respuesta.
He pensado seriamente intercambiar las funciones de los TMR, pero aun asi, sigo teniendo la duda de porqué no funcionaría con este programa, ya que, para ser exactos, el TMR0 se desbordaría 6000000 veces en un segundo, y la variable que almacena el número de desbordamientos es tipo "float", de 32 bits, por lo que puede almacenar valores de hasta 2^32, asi que no veo cual sería el problema. Estoy casi seguro que no puede llegar a esa frecuencia, pero no creo que sea problema del número de desbordamientos del TMR, sino que tiene que ser otra cosa. Aun así, probaré a realizarlo como dijiste.
Espero que alguien pueda ayudarme a entender el porqué no se puede realizar así el frecuencímetro, ya que quiero saberlo por curiosidad, porque en programación estoy un poquito pegadete :LOL:
Gracias.
 
No puedes llegar a 6MHz en un PIC a 4MHz...

http://ww1.microchip.com/downloads/en/devicedoc/40044f.pdf

6.2.1
EXTERNAL CLOCK
SYNCHRONIZATION
When no prescaler is used, the external clock input is the same as the prescaler output. The synchronization of T0CKI with the internal phase clocks is accomplished by sampling the prescaler output on the Q2 and Q4 cycles of the internal phase clocks (Figure 6-1). Therefore, it is necessary for T0CKI to be high for at least 2TOSC (and a small RC delay of 20 ns) and low for at least 2TOSC (and a small RC delay of 20 ns). Refer to the electrical specification of the desired device.

En tu caso como el Timer deberia poder contar solo a una frecuencia de 500kHz para poder cumplir con la especificacion (2 ciclos de reloj en alto y 2 ciclos de reloj en bajo)
 
Última edición:
Atrás
Arriba