hola, mi nombre es daniel (alias korpaz),soy nuevo en este foro, y bueno estoy diseñando un pequeño frecuencimetro con 16f84a, estoy en el ultimo año de la escuela secundaria tecnica, en una materia tengo que armar un medidor de frecuencia ( de 1 hz hasta 10 0 100 khz) el problema que tengo es que al superar mas o menos los 1,5 o 2 khz empiezan a aparecer errores en la medicion, y lo que queria hacer yo es utilizar dos pulsadores para cambiar la base de la frecuencia de refresco (osea cuando pulso uno me divide o multiplica por 10 la base de tiempo)
como van a ver es un programa muy basico como lo hice, los pulsos entran por la pata del contador rtcc
adjunto el programa con la simulacion en proteus
por ahora hice el circuito en proteus bien basico ya que es solo para probarlo, luego cuando tenga que hacer el acondicionamiento de la señal para poder ingresar la frecuencia con tensiones bajas o altas (alrededor de los 220ca).
acepto sugerencias y mejoras ya que soy novato para estas cosas todavia.....
//************************D E C L A R A C I O N E S P R I N C I P A L E S***************************
#include <16f84A.h>
#fuses NOPROTECT,NOWDT,XT
#byte porta = 5
#byte portb = 6
#use delay(clock=4000000)
//****************************************************************************************************
//********************************L I B R E R I A D E L L C D*************************************
#include<lcdb.c> //Incluye funciones de control del LCD
//****************************************************************************************************
//************************************V A R I A B L E S***********************************************
int valor=0;
long l;
unsigned long f;
unsigned long k;
//****************************************************************************************************
//**********************************C U E R P O P R I N C I P A L***********************************
void main(void)
{
set_tris_b(0x00); //Puerta B salida
enable_interrupts(global); //Habilita las interrupciones Globales
enable_interrupts(int_rtcc); //Habilita la interrupcion por desbordamiento del rtcc
//****************************************************************************************************
//***********************************D I S P L A Y*******************************************************
lcd_init(); // Inicia LCD
lcd_putc(" FRECUENCIMETRO\n"); // Saca texto
lcd_putc(" DIGITAL"); // Saca texto
delay_ms(100); // Retardo
lcd_putc("\f"); // Limpia pantalla
//****************************************************************************************************
//**********************************P R O G R A M A*******************************************************
while(true)
{
lcd_gotoxy(1,1); //Acomoda el cursor antes de escribir
lcd_putc("FRECUENCIA (HZ)\n"); //Saca texto
set_timer0(0); //Puesta a 0 del TMR0
setup_counters(RTCC_EXT_L_TO_H,RTCC_DIV_1); //TMR0 como contador externo de eventos
delay_ms(1000); //Retardo para contar pulsos en TOCK1
k=valor*256; //A valor lo multiplico por 256 y lo asigno a k
lcd_gotoxy(3,2); //Acomodo el cursor para mostrar la variable
f=0; //f lo pongo a 0
l=get_rtcc(); //A l le asigno el valor del contador
f=l; //f le asigno el valor de l
f+=k; //f le sumo la variable k
f-=7; //le resto 7 por no se q pasaba jeje
printf(lcd_putc,"%05Lu",f); //Saco la variable f abajo en el display
valor=0; //A valor lo pongo a 0
l=0; //A l lo pongo a 0
}
//*****************************************************************************************************
}
//*****************I N T E R R U P C I O N D E L C O N T A D O R*************************************
#int_rtcc
void tmr0_int()
{
valor+=1;
}
//*****************************************************************************************************