TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: aprendiz_de_Pic en 23 de Septiembre de 2004, 15:37:00

Título: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: aprendiz_de_Pic en 23 de Septiembre de 2004, 15:37:00
Hola:
  Tengo que hacer un frecuencimetro con el pic 16f874a,  tengo conocimientos basicos de pic´s, he realizado varios proramas en ensamblador para el 16f84a. pero el proyecto lo tengo que realizar en C y la verdad ando un poco mal en este lenguaje, ya he comenzado a estudiar un poco de hecho ya heche a jalar el display, pero la verdad no tengo mucha idea de como hacerlo en C.
les agradeceria su ayuda indicandome donde puedo encontrar informacion que me pudiera servir tanto para, aprender mas sobre programacion de Pic en C,  como informacion para llevar a cabo mi proyecto.

cualquier ayuda sera agradecida.
Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: pocher en 24 de Septiembre de 2004, 00:22:00
Si quieres yo te ayudo con este proyecto.

- Usa el TMR1 para contar los pulsos que le entran.

- Se trata de contar cuantos pulsos recibe el TMR1 en 1s. La frecuencia mínima será cuando reciba 1 pulso (TMR1=0001): 1Hz
La frecuencia máxima será cuando reciba 65535 pulsos (TMR1=FFFF): 65,535KHz

- Si en lugar de contar los pulsos que recibe en 1s, los cuentas para otro tiempo, por ejemplo para 50ms el intervalo de frecuencias que se pueden medir se agranda ... pero todo tiene un límite (el tiempo que se gasta en las instrucciones).

- Yo usaría el TMR1 para contar los pulsos que le entran y el TMR0 para la temporización de 50ms por ejemplo. Cada 50ms haría que se produjese la interrupción del TMR0 y entonces al entrar en la interrupción contaría los pulsos que hasta ese momento le han entrado al TMR1.

- Posteriormente haría la operación matemática para pasar pulsos a frecuencia y representaría esta en la LCD.

... y eso es todo amigos.

Un saludo
Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: aprendiz_de_Pic en 24 de Septiembre de 2004, 20:25:00
Gracias Pocher:


Agradezco mucho tú ayuda y  recomendacion,  el lunes que vuelvo al laboratorio comenzare a implementar esto,  solo investigo un poco sobre las instrucciones en C para aplicarlo.
En cuanto tenga ya algo de avance te  mando el codigo para ver que opinas.

Saludos desde México


Saludos a todos los del foro y se aceptan mas sugerencias.
Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: kruskal en 25 de Septiembre de 2004, 00:30:00
una vez hice algo parecido, contaba las vueltas de un servomotor que giraba muy rapido, este modesto codigo puede servirte:

utiliza el timer1 tambien pero de una manera un poco diferente, TMR1 se  setea contando pulsos internos y con un divisor de fecuencia de 2

setup_timer_1(T1_INTERNAL | T1_DIV_BY_2)

el TMR1 es de 16 bit osea cuenta 65536 antes de volver a cero si cuentas hasta llegar a 25000, con un cristal de 4 MHz, tendrias un tiempo de 4/4000000*2*25000= 50 milisegundos.

se puede implementar como funcion y cada vez que quieras medir la frecuencia la llamas se debe considerar que te ocupara el tiempo fijado lo que sera un poco lento si tienes el micro encargado de controlar otras tareas,  pero a mi me funcionaba bien.

int16 cuenta_pulsos(void)
{
int16 cuenta=0;
int16 temp=0;
int16 act=0;
int16 tiempo=0;

set_time(0);

while(tiempo<25000)
{
      act=input(PIN_C7);    // se lee pin por el que se recibe la señal
          if(act!=temp)         // se ve si ha cambiado con el estado
           {                            //anterior
            cuenta += 1;       // se incrementa la cuenta de los
                                       // pulsos recibidos    si cambio de estado
                                      // la señal
             temp=act;              // se conserva el estado anterior
             }

    tiempo=get_timer1();   // se lee el estado del TMR1

}

return (cuenta);    // "cuenta" es el doble de la cantidad de asi
                             // que  hay que dividirla en algun momento
}


como ves es muy modesto pero funciona y puedes agregarle  muchas mejoras.


Salud2

Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: pocher en 25 de Septiembre de 2004, 02:57:00
El problema que le veo kruskal, son todas las instrucciones que van delante del get_timer1(). Imagina que cuando estuviese procesando la 1ª instrucción de la función, se desbordara el TMR1, hasta que leyese el TMR1 con el get_timer1() habrá pasado demasiado tiempo, demasiado error.

Lo ideal es que se lea el TMR1 a los 50ms exactos, contados con la interrupción del TMR0, y aún así se pierde un poco de tiempo al entrar en la interrupión (habran desvíos de la frecuencia exacta para frecuencias elevadas).
Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: Sispic en 25 de Septiembre de 2004, 03:21:00
El PIC C Compiler trae un archivo como  ejemplo , es muy exacto  hasta 5Mhz .

Codigo:

/////////////////////////////////////////////////////////////////////////
////                             EX_FREQC.C                          ////
////  Counts the "zero" crossings of an input signal for 1 second,   ////
////  therefore counting the frequency of the signal.  The input     ////
////  signal"s frequency is then displayed over the serial port.     ////
////                               ////
////  The 1s delay is created by generating a perfect 5,000,000      ////
////  cycles (it takes 0.2us for one cycle at 20Mhz).  The trick is  ////
////  that conditional statements have different values of cycles    ////
////  depending on a TRUE or FALSE jump.                             ////
////                                                                 ////
////  The input signal is to be supplied to PIN C0                   ////
////                                                                 ////
////  This example will work with thePCM compiler.  The              ////
////  following conditional compilation lines are used to include a  ////
////  valid device for each compiler.  Change the device and clock   ////
////  for your hardware if needed.                                   ////
/////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2003 Custom Computer Services         ////
//// This source code may only be used by licensed users of the CCS  ////
//// C compiler.  This source code may only be distributed to other  ////
//// licensed users of the CCS C compiler.  No other use,            ////
//// reproduction or distribution is permitted without written       ////
//// permission.  Derivative programs created using this software    ////
//// in object code form are not restricted in any way.              ////
/////////////////////////////////////////////////////////////////////////

#include <16F877.h>
#fuses HS,NOWDT,NOLVP
#use delay(clock=20000000)    //one instruction=0.2us
#use rs232(baud=9600, xmit=PIN_c6, rcv=PIN_c7)
#bit t1_overflow=0x0C.0

// #bit t1_overflow=0xF9E.0  (PIC18, Reminder)

void main() {
   int cycles8, cycles;
   int32 freq;
   long freqc_high;
   long freqc_low;

   while (TRUE) {
      cycles8=0;
      cycles=0;
      freqc_high=0;
      t1_overflow=0;
      set_timer1(0);
      setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
/* ___ wait one second ___  */
      while (cycles!=0xFF) { //true=3, false=4
       cycles8=0; //1 cycle
       //start inner loop
       while (cycles8!=0xFF) { //true=3, false=4
         if (t1_overflow)//true=2,false=3             //----|
            {t1_overflow=0;freqc_high++;}//6 cycles   //    |
         else                                         //    |-- 8 cycles
            {delay_cycles(5);}                        //----|
         delay_cycles(62); //x
         cycles8++; //1
 ///2 cycles to jump to top
 //math: end inner loop
 //math: total inner loop=((3+8+x+1+2)*255 + 4)*255
 //math: if x=62.87781 then inner loops takes 5mil instructions
 //math: if x=62 then inner loop takes 4942920, have to fill 57080 cycles
  }
 delay_cycles(216);      //y
 cycles++;          ///1 cycle
 ///2 cylces to jump to top
 //math: outer=(3+1+y+1+2)*255+4=57080
 //math: y=(57080-4)/255)-(3+1+0+0+1+2)
 //math: if y=216.827450980392156862745098039216 then outer loop cylces is 57080
 //math: if y=216 then outer loop cycles is off by 211 cycles.  z=211
}
      delay_cycles(211);   //z
/* ___ end waiting 1 second ___ */
      setup_timer_1(T1_DISABLED);   //turn of counter to prevent corruption while grabbing value
      if (t1_overflow)            //check one last time for overflow
          freqc_high++;
      freqc_low=get_timer1();      //get timer1 value as the least sign. 16bits of freq counter
      freq=make32(freqc_high,freqc_low);   //use new make32 function to join lsb and msb
      printf("%LU Hz
",freq);      //and print frequency

   }
}

Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: pocher en 25 de Septiembre de 2004, 10:19:00
Ya no me acordaba de él. Efectivamente, funciona perfectamente sin apenas error.



Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: aprendiz_de_Pic en 25 de Septiembre de 2004, 13:12:00
Amigos:

Estoy trabajando con el codigo que mando "sispic" sobre el frecuencimetro. Pero tengo problemas con las instrucciones:

#fuses HS,NOWDT,NOLVP
#use delay(clock=20000000) //one instruction=0.2us
#use rs232(baud=9600, xmit=PIN_c6, rcv=PIN_c7)
#bit t1_overflow=0x0C.0

me marca error de: ilegal command

Estoy usando el HTLPIC para programar, no sé, si será el compilador correcto ó solo sea problemas de libreria

Que opinan?
Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: odukec en 25 de Septiembre de 2004, 15:10:00
Hola..

Este codigo es para PCW, el compilador de CCS..

No te servira para el que dices..

Saludos
Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: pocher en 25 de Septiembre de 2004, 23:34:00
Así es.

Otra cosa. Si este código es para tu uso personal adelante, pero si es para presentárselo a algún profesor como tuyo propio, no creo que cuele ... es un código dificil de sacar.

Un saludo
Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: RaDoN en 05 de Septiembre de 2005, 09:56:00
Ya se que este tema anda un poco en el pasado, ahora es cuando estoy yo interesado en dicho cacharrito, estado leyendo atentamente todos los hilos sobre este tema.

Hay algunos enlaces en los que se ven frecuencimetros estupendos, pero luego quieren venderte el pic programado ... Enfurruñado (seguro que los conoceis ya), y otros tales como:

http://www.lw3ewz.com.ar/modules.php?name=News&file=article&sid=370
http://usuarios.lycos.es/jomasi/multifun.htm
Y el "típico" de la pagina de pablin ... http://www.pablin.com.ar/electron/circuito/instlab/picfreq/index.htm

(Este ultimo no dice las características de este y tal).

¿Alguien lo montó? Hasta que frecuencia permite medir con precisión, yo realmente con 20 mhz me apaño Fumador
Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: pocher en 05 de Septiembre de 2005, 10:41:00
Si tienes un rato, programa un PIC con el programa de CCS, EX_FREQC.C, hace tiempo lo probe en el simulador y medía hasta los 80 MHz, pero claro es un simulador, quizá los resultados reales no sean así, además Sispic dice que llega hasta 5 MHz, tal vez él sí lo haya probado físicamente.

Un saludo
Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: RaDoN en 05 de Septiembre de 2005, 10:48:00
Aja, ok, lo simulare, uso CCS para programar. De todas formas me quedo con la duda de para que es toda la parafernalia que hay en la entrada en el frecuencimetro de pablin Fumador
Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: RaDoN en 05 de Septiembre de 2005, 11:15:00
No consigo que valla el simulador, he compilado incluyendole la libreria para el LCD, y haciendo el printf sobre esta, por el timer meto una señal de reloj pero nada loco

No tienes por ahi el ficherito de tu simulación, aunque de todas formas este frecuencimetro se queda algo corto de lo que quiero ... invasor
Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: RaDoN en 05 de Septiembre de 2005, 16:51:00
Weno, por lo que entendido, el frecuencimetro se basa básicamente de leer los pulsos que entran por el tock1, es decir, la entrada externa del time1 configurada com contador,  y leerla sobre un cierto tiempo.

En el datasheet no dice nada de la frecuencia máxima que soporta para los pulsos de este timer, y me extraña como algunos frecuencimetros llegan a 50 mhz usando un 84a loco

¿Alguien me puede aclarar este cacao?
Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: J1M en 05 de Septiembre de 2005, 17:28:00
mMmMmMM pero pero... será como máximo tan rápido (y siempre algo inferior...) como la frecuencia de reloj del sistema no??? por lo q 50Mhz... loco me reliao xDDDD
Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: RaDoN en 06 de Septiembre de 2005, 03:54:00
Eso es lo que yo no entiendo J1M, la forma que se me ocurre para que valla mas rápido contando es usando el timer como contador externo, porque de otra manera, por ejemplo contando el periodo con el módulo CCP en captura o peor aún, por soft, sería lentisimo, mucho menos de 1/4 de Fosc.

Lo lógico es que como máximo, los pulsos del timer1, puedan ser reconocidos (o quizás algo más), de la frecuencia que soporta este micro corriendo.

Pero por poner un ejemplo (un enlace de los de arriba):

http://www.lw3ewz.com.ar/modules.php?name=News&file=article&sid=370

Y algunas más que hay por la red ... loco
Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: pocher en 06 de Septiembre de 2005, 05:32:00
He estado mirando el tema y seguro que es capaz de medir la frecuencia que tú deseas (20Mhz) ... y más.

Efectivamente si mirais el programa usa el TMR1 como contador de pulsos externos y una variable para la frecuencia de 32 bits usando una técnica a base de delay_cycles muy precisa. Es muy bueno.

Lo he estado probando en el simulador para la frecuencia que tú deseas de 20 Mhz y tarda 1s en sacar el resultado por la LCD y mandarlo vía RS232.

Sí que me interesaría si lo montas físicamente que me dijeras si es tan bueno como yo creo.

Te mando los archivos al privado.

Un saludo

Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: RaDoN en 06 de Septiembre de 2005, 06:32:00
Muchas gracias por mandarmelo, voi corriendo a probarlo, luego edito el post y te cuento.

(ahh tb gracias por avisar porque si no no me cosco de los MP Muchas risas, para proximos the_radon@hotmail.com Flash)

Edito: Esta bien la simulacion, creo que mirame la forma para adaptar mas tipos de señales que no sean ttl para el frecuencimetros (todas las digitales que pueda).

Y estoy contigo, se supone que deberia soportar hasta los 20 mhz

Edito2: las señales de muy baja frecuencia como 1 hz, falla bastante, como que dice 0 hz jeje, quizas se pueda depurar un poco. En 20 hz aveces, da 20 y otras 19, creo que el fallo viene cuando empiza a contar donde esta la onda, se le podria indicar que contara al empezar un flanco ...
Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: pocher en 07 de Septiembre de 2005, 01:15:00
Con este programa debes de usar a la fuerza un cristal de 20Mhz, ten en cuenta que está diseñado para contar con el TMR1 el número de pulsos que le entran por RC0 en 1s: 5.000.000 ciclos · 0,2us = 1s

Lo realmente salvaje del programa es que consigue los 5 millones de ciclos con gran exactitud.

Avisa cuando le hayas metido frecuencias más altas.

Un saludo
Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: RaDoN en 07 de Septiembre de 2005, 03:06:00
Quizás no me explique bien, el cristal que cambio es el de un 84A que genera los pulsos. Aver como apaño algo para conseguir frecuencias más altas, pues me gustaría probarlas.

Me ha sorprendido lo preciso que es, cuando lo monte le pondre un circuito oscilador mejor que un cristal para ganar mas exactitud aún Sonrisa Gigante
Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: nordestenica en 07 de Septiembre de 2005, 03:42:00
una pergunta donde se puede bajar esse terminal tan chulo
Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: Creisen en 23 de Septiembre de 2005, 15:18:00
Hola gente, necesito hacer un frecuencimetro basico, que mida de 10 hz a 200 hz y muestre la lectura en 3 display de 7 segmentos comunes.
Alguna idea, algo basico barato.
Gracias.
Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: RaDoN en 24 de Septiembre de 2005, 04:36:00
Es mas facil pienso yo en una LCD, pero aparte, el problema esta más en la etapa de entrada, no acabo de ver una solución para esta Llorando
Título: RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: RaDoN en 25 de Septiembre de 2005, 06:51:00
Bueno sigo liado sonda en mano con la etapa de entrada para el frecuencimetro, he probado de la siguiente forma, un condensador que elimina el offset (la componente continua de la onda) y la centra, luego una etapa de diodos que reduce la señal a +/-0.6v y de ahi a un operacional en modo comparación, donde por la entrada no inversora le llega la señal y por la inversora masa (así da una señal alta cada vez que  la señal esta en el semiciclo positivo).

Conclusiones, el operacional sea cual sea (esto creo porque probe con un THS3202 de Texas Instruments -2Ghz, "baja distorsión"Giño, en modo comparacion con frecuencias "medio-altas" ... ya empieza a saturar y hacer cosas que no tienen nada que ver.

Por lo que intente con un transistor, y encontra de lo que pensaba da mejor resultado, aun con un 2N2222 pobre (que para estas aplicaciones no vale). Va bien, hasta una cierta frecuencia, donde ya el hfe empieza a caer en picado y no da los pulsos altos y bajos como debiera. Para cerciorarme que la solución del transistor era mejor, duplique la etapa de diodos (en serie) así hay una señal de +/-1.2V y se portó mucho mejor, así no necesita una gran hfe en frecuencias altillas, pero aun ... insuficiente.

Cuando caiga en mis manos el lunes un transistor de aplicaciones RF, creo que tendré la solución ... Siento la parrafada, pero espero que mis "experimentillos" les ayude a alguien AngelitoGiño
Título: Re: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
Publicado por: pabloavilad en 30 de Enero de 2007, 00:47:38
Yo me encuentro en la dificultad de medir frecuencias muy bajas. aprox 10 Hz. Mi intencion en configurar los timers de cmodo que uno se encargue de "avisarme 1 vez por segundo" que mida los pulsos que han entrado en alguna patilla del micro. Pero realmente no entiendo como configurarlos. Haciendo cuentas y con el wizzard del PCW no encuentro la forma de que timer 0 interrumpa cada segundo. Saludos