Autor Tema: duda con frecuencimetro 16f84a  (Leído 2911 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado korpaztk

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 202
duda con frecuencimetro 16f84a
« en: 22 de Agosto de 2010, 16:28:09 »
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.....


Código: [Seleccionar]
//************************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;
}
//*****************************************************************************************************


Korpaz.
Técnico Electronico.

El Papel Es Mi Mejor Psicologo

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: duda con frecuencimetro 16f84a
« Respuesta #1 en: 22 de Agosto de 2010, 18:47:34 »
Hola korpaztk, bienvenido al foro.  Viendo tu programa, creo que podrías intentar cambiando un par de cosas.  esta línea:
setup_counters(RTCC_EXT_L_TO_H,RTCC_DIV_1);  //TMR0 como contador externo de eventos
Creo que no debería estar dentro del bucle while, sino al comienzo en la configuración.
No me queda muy claro lo que hace esta instrucción en el sitio que la tienes: set_timer0(0);  //Puesta a 0 del TMR0.  Esta instrucción tiene ese valor por defecto, por lo que si no tiene una función específica en el sitio donde la tienes, estaría sobrando y tal vez causando problemas.  Una posible configuración inicial sería:

Código: [Seleccionar]
setup_counters(RTCC_EXT_L_TO_H,RTCC_DIV_1);  //TMR0 como contador externo de eventos
enable_interrupts(int_rtcc);                 //Habilita la interrupcion por desbordamiento del rtcc
enable_interrupts(global);                   //Habilita las interrupciones Globales

Por otro lado tienes esta instrucción: set_tris_b(0x00);  //Puerta B salida;  creo que esta instrucción sobra pues la librería lcdb.c se encarga totalmente del manejo de los pines que necesita del puerto.

Es lo que veo por el momento; mucha suerte con tu proyecto.

Saludos!
« Última modificación: 22 de Agosto de 2010, 18:59:07 por bmb »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: duda con frecuencimetro 16f84a
« Respuesta #2 en: 22 de Agosto de 2010, 19:05:46 »
Yo lo haría de la siguiente manera:

Código: [Seleccionar]
void main(void){  

setup_counters(RTCC_EXT_L_TO_H,RTCC_DIV_1); //TMR0 como contador externo de eventos
set_tris_b(0x00); //Puerta B salida
enable_interrupts(global); //Habilita las interrupciones Globales

lcd_init();                  // Inicia LCD
// ...

while(true) {
lcd_gotoxy(1,1); //Acomoda el cursor antes de escribir
lcd_putc("FRECUENCIA (HZ)\n"); //Saca texto


Overflows=0; // Cantidad de veces que desbordo Timer0
set_timer0(0); //Puesta a 0 del TMR0
enable_interrupts(int_rtcc);
delay_ms(1000); //Retardo para contar pulsos en TOCK1
disable_interrupts(int_rtcc);
TMR0_Valor=get_rtcc(); //asigno el valor del contador
Frecuencia=((long)Overflow*256 + TMR0_Valor);

lcd_gotoxy(3,2); //Acomodo el cursor para mostrar la variable
printf(lcd_putc,"%05Lu",Frecuencia); //Saco la variable f abajo en el display

}
}

#int_rtcc
void tmr0_int(){
Overflow++
}

delay_ms(1000) no va a ser exacto por causa de las sucesivas interrupciones que suceden, entonces el error va a ser más notorio a más frecuencia. También podes probar agregando un preescaler al timer, o sea contar 1 cada 4 pulsos, pero esto da problemas a baja frecuencia  :?


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: duda con frecuencimetro 16f84a
« Respuesta #3 en: 22 de Agosto de 2010, 22:34:53 »
También se podría usar código en ASM dentro del bucle principal y sin interrupciones. Con el código en ASM podemos contar pulsos durante un período de tiempo bien preciso.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado korpaztk

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 202
Re: duda con frecuencimetro 16f84a
« Respuesta #4 en: 23 de Agosto de 2010, 00:29:03 »
y hay alguna forma de poder por ejemplo con los pulsadores cambiar el preescaler y mostrar asi en el display las frecuencias mas altas?
ami tambien me habian recomendado el assembler para obtener precision pero bue... yo no lo se manejar, opte directamente por el
Korpaz.
Técnico Electronico.

El Papel Es Mi Mejor Psicologo

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: duda con frecuencimetro 16f84a
« Respuesta #5 en: 23 de Agosto de 2010, 10:32:56 »
y hay alguna forma de poder por ejemplo con los pulsadores cambiar el preescaler y mostrar asi en el display las frecuencias mas altas?
ami tambien me habian recomendado el assembler para obtener precision pero bue... yo no lo se manejar, opte directamente por el

Sí, se puede hacer sin ningún problema.
Pero leyendo un poquitin de ASM se podría implementar un AutoRango.
Básicamente sería medir pulsos en un tiempo pequeño y si hay overflow es porque la frecuencia es mayor y entonces cambiamos el prescaler.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado korpaztk

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 202
Re: duda con frecuencimetro 16f84a
« Respuesta #6 en: 23 de Agosto de 2010, 12:40:05 »
ahora se me presenta un nuevo problema, el programa lo deje asi como esta en el codigo anterior, ahora lo cargue a mi pic y consegui un display lcd asi muy parecido al del proteus pero cuando lo conecto se me prenden todos los caracteres de la linea de arriba (osea se ve todo negro), que puede ser?, lo estoy montando en un protoboard y las patitas del lcd estan puestas en el mismo agujerito que la patita del micro para evitar falsos contactos y problemas con ruidos por altas frecuencias.   :?
Korpaz.
Técnico Electronico.

El Papel Es Mi Mejor Psicologo

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: duda con frecuencimetro 16f84a
« Respuesta #7 en: 23 de Agosto de 2010, 12:46:47 »
ahora se me presenta un nuevo problema, el programa lo deje asi como esta en el codigo anterior, ahora lo cargue a mi pic y consegui un display lcd asi muy parecido al del proteus pero cuando lo conecto se me prenden todos los caracteres de la linea de arriba (osea se ve todo negro), que puede ser?, lo estoy montando en un protoboard y las patitas del lcd estan puestas en el mismo agujerito que la patita del micro para evitar falsos contactos y problemas con ruidos por altas frecuencias.   :?

El LCD no se inicia. Busca en el foro, hay muchos temas que tratan ese problema


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado korpaztk

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 202
Re: duda con frecuencimetro 16f84a
« Respuesta #8 en: 24 de Agosto de 2010, 10:25:25 »
solucionado problema del lcd, lcd con fallas  :?
bueno ahora hice una pequeña modificacion del programa, para hacer q los tiempo de muestra cambie, pero el asunto que me quedo chico el display y ahora no puedo visualizar todo lo que quiero jejej, pero bueno ya le voy a encontrar la vuelta, como dije al principio aqui cargo de vuelta el codigo y acepto mejoras y consultas =)
Código: [Seleccionar]
while ((input(subo)==1)&& flag_uno==0)
{
delay_ms(25);
x*=10;
flag_uno=1;
}

while ((input(subo)==0)&& flag_uno==1)
{
delay_ms(25);
flag_uno=0;
lcd_putc("\f");
}

while((input(bajo)==1)&& flag_dos==0)
{
delay_ms(25);
x=x/10;
flag_dos=1;
}

while((input(bajo)==0)&& flag_dos==1)
{
delay_ms(25);
flag_dos=0;
lcd_putc("\f");
}

Korpaz.
Técnico Electronico.

El Papel Es Mi Mejor Psicologo

Desconectado korpaztk

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 202
Re: duda con frecuencimetro 16f84a
« Respuesta #9 en: 10 de Septiembre de 2010, 10:14:15 »
tema solucionado.  :)
les agradezco su colaboracion gracias.-
=)
Korpaz.
Técnico Electronico.

El Papel Es Mi Mejor Psicologo