Autor Tema: necesito ayuda, con un frecuencimetro ocn el pic 16f874a  (Leído 9345 veces)

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

Desconectado aprendiz_de_Pic

  • PIC10
  • *
  • Mensajes: 23
necesito ayuda, con un frecuencimetro ocn el pic 16f874a
« 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.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
« Respuesta #1 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

Desconectado aprendiz_de_Pic

  • PIC10
  • *
  • Mensajes: 23
RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
« Respuesta #2 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.

Desconectado kruskal

  • PIC16
  • ***
  • Mensajes: 108
RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
« Respuesta #3 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


Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
« Respuesta #4 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).

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1685
    • winpic800
RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
« Respuesta #5 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

   }
}


Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
« Respuesta #6 en: 25 de Septiembre de 2004, 10:19:00 »
Ya no me acordaba de él. Efectivamente, funciona perfectamente sin apenas error.




Desconectado aprendiz_de_Pic

  • PIC10
  • *
  • Mensajes: 23
RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
« Respuesta #7 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?

Desconectado odukec

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 174
RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
« Respuesta #8 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

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
« Respuesta #9 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

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
« Respuesta #10 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
Si juegas contra el mejor, pierdes como los demás.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
« Respuesta #11 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

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
« Respuesta #12 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
Si juegas contra el mejor, pierdes como los demás.

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
« Respuesta #13 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
Si juegas contra el mejor, pierdes como los demás.

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: necesito ayuda, con un frecuencimetro ocn el pic 16f874a
« Respuesta #14 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?
Si juegas contra el mejor, pierdes como los demás.