Frecuencímetro hasta 20MHz

En este proyecto podemos ver un circuito frecuencímetro el cual esta basado completamente en el microcontrolador PIC16F883.
El circuito es realmente sencillo, el cual claramente puede mejorarce ya que no tiene ningun tipo de acondicionamiento de señal, es decir la entrada de interrupcion del microcontrolador como sabemos funciona entre 0 y 5V por lo que una buena mejora seria un transistor de RF para adaptar estos niveles de tensión, de todas formas el circuito funciona muy bien, en el video se puede ver como conectando el pin de entrada de medición a la salida del oscilador del micro podemos leer los 20MHz del cristal, el circuito lo he probado con un oscilador a cristal en base a dos compuertas NAND en el cual he probado varios cristales y funciona bien en todos estos.



Porque solo dice MHz en el LCD y no tiene un auto escala? sencillo la finalidad de este proyecto es la medición de frecuencia de oscilador de un equipo VHF transceptor en la banda de 2m, por lo que solo me interesaba que mida desde los 100MHz a los 500MHz, aquí aparece la otra duda, como lograr esas frecuencias mas elevadas. Bueno en mi caso he comprado un prescaler MC12080 el cual admite una frecuencia máxima de 1,1GHz aunque en el datasheet lo han probado con 1,4GHz, el mismo es divisor entre 10, 20, 40, y 80. Esto quiere decir que si ingreso una frecuencia de 144MHz a la salida del prescaler tendré 1,8MHz (si divido por 80). Por esta razón notaran que en la linea de printf del programa hay una comentada en donde toma el valor leído por el microcontrolador y lo multiplica por 80, de esta forma compensamos la división entre 80 del prescaler.
El programa es muy sencillo y es el siguiente:

#include <16F883.h>
#fuses HS,NOWDT,NOPROTECT,PUT,NOLVP,NOMCLR
#use delay(clock=20000000)
#bit FlagDesbordaTimer1 = 0x0C.0
#include <LCD.C>
void main(){
   lcd_init();
   int Ciclo1byte, Ciclos;
   float Frecuencia;
   long ParteAlta,
ParteBaja;
   while(true){
      Ciclo1byte = 0;
      Ciclos = 0;
      P
arteAlta = 0;
     
FlagDesbordaTimer1 = 0;
      set_timer1(0);
      setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
      while(Ciclos!=0xFF) {
         Ciclo1byte = 0;
         while(Ciclo1byte!=0xFF) {
            if(
FlagDesbordaTimer1){
              
FlagDesbordaTimer1 = 0; 
               ParteAlta++;
            }
            else{
               delay_cycles(5);
            }
            delay_cycles(62);
            Ciclo1byte++;
         }
      delay_cycles(216);
      Ciclos++;
      }
      delay_cycles(211);
      setup_timer_1(T1_DISABLED);
      if(
FlagDesbordaTimer1){
        
ParteAlta++;
      }  
     
ParteBaja  = get_timer1();
      Frecuencia = make32(
ParteAlta,ParteBaja);
      printf(lcd_putc,"Frecuencimetro  \n");
   // printf(lcd_putc,"fo= %03.4f MHz\n",(Frecuencia*80)/1000000);   
      printf(lcd_putc,"fo= %03.4f MHz\n",Frecuencia/1000000);
   }
}



video

72 comentarios:

  1. me gustaría hacerlo con un pic16f628a para contar hasta 50mhz
    no se en como hacerlo en +c

    ResponderEliminar
    Respuestas
    1. Mira, en realidad soporta hasta 50MHz, el tema es que en la practica experimenta una minima inestabilidad, por eso lo asegure en 20MHz, pero en teoria funciona hasta 50MHz. Esto esta realizado en C, con el compilador CCS. No hay mucha diferencia con otros compiladores de C, cambian las instrucciones dedicadas del microcontrolador pero la estructura es la misma. Que C usas?
      Saludos.

      Eliminar
  2. hola me gustaria saber como es el procedimiento exacto del frecuencimetro, pues quiero hacer un organigrama del circuito.

    ResponderEliminar
    Respuestas
    1. Como funciona un frecuencimetro, o como funciona el codigo?.
      El codigo:
      Cuenta los cruces por cero durante 1 segundo, a partir de ahi cuenta la frecuencia, se generan lazos de 5MHz dentro del microcontolador el cual solo se puede puede generar con exactitud contando el tiempo que demoran las instrucciones de C y añadiendo las demoras del tipo delay_cycles, de esa forma se logra los 5MHz, partiendo de ahi mediante el salto indeterminado se logra reiniciar el timer para saber en que momento estaba y mostrar la frecuencia. El mismo trabaja con 32Bit por el largo de la palabra, y el uso es la multiplicacion de armonicos, ya que el microcontrolador no puede correr a una velocidad menor a la que esta tomando de entrada en el cruze por cero, de esa forma se toma la division de frecuencia armonica y despues se compensa en el programa. Es medio complicado de entender tal vez pero funciona bien, si tenes en claro que lo que hace es tomar la cantidad de cruces por cero durante 1s ya esta. despues el muestro es armonico. por eso se pueden medir frecuencias mayores a la de operacion del clock.
      Saludos

      Eliminar
    2. mi duda es con el circuito

      Eliminar
    3. Y cual seria exactamente la duda, osea eléctricamente hablando es la polarización de cualquier micro con su oscilador, una entrada acoplada con un capacitor y la salida de lectura de datos por un LCD standar

      Eliminar
    4. Y cual seria exactamente la duda, osea eléctricamente hablando es la polarización de cualquier micro con su oscilador, una entrada acoplada con un capacitor y la salida de lectura de datos por un LCD standar

      Eliminar
  3. hola me gustaria saber si tienes el codigo en hex

    ResponderEliminar
    Respuestas
    1. Hola, si queres te lo compilo, pero necesitaria que me envies una direccion de correo o algo para que te lo pueda enviar.

      Saludos.

      Eliminar
    2. muchas gracias. mi correo es armasallison022@gmail.com

      Eliminar
    3. y si puedes envíame el circuito que no logro verlo bien, sino es molestia.

      Eliminar
  4. Buenas noches amigo, esta leyendo tu proyecto y esta muy interesante, me gustaria preguntarte si con este frecuenciometro se podrian checar controles de alarmas y las frecuencias en las que trabaja, te agradezco mucho la atencion que puedas darme, saludos.

    ResponderEliminar
    Respuestas
    1. Hola como estas?, si con los controles de alarma haces referencia a los mandos a distancia por RF, no... la mayoria de esos mandos funcionan en UHF, entre 350MHz y 800MHz (dependiendo de la marca y modelo) lo mas comun es que se encuentren en 433MHz. Este frecuencimetro solo llega a 20MHz (con estabilidad aceptable), la unica forma de que puedas medir esas frecuencias es con un preescaler como lo menciono en la nota por ejemplo anteponiendo a la entrada de este frecuencimetro, en mi caso lo he probado con el MC12080 el cual admite una frecuencia de entrada por el orden del GHz lo cual no tendrias problemas para testear esos mandos a distancia, solo tene en cuenta como lo vas a medir. Supone que tenes el frecuencimetro con el preescaler, la medicion seria con una antena?, es decir apretas un boton del mando a distancia y queres que cuente la frecuencia que hay en el aire?, para eso aparte de este dispositivo (frec+press) necesitas una antena activa, osea la antena con un transistor como amplificador de RF (podes usar algun BF).
      De todas formas podes probar sin esta antena activa y tal vez si acercas el mando al prescaler, este reciba la señal y la cuente.
      Cualquier cosa avisa.
      Saludos

      Eliminar
  5. Muy buen aporte!
    Con un compañero estamos intentando hacer un frecuencimetro que mida hasta 50MHz, utilizamos un pic 16f887 con un oscilador de 20 MHz, pero se nos complica en la programacion en PICC!
    Si podrias facilitarnos el programa y el esquema del circuito estariamos agradecido, a ver si encontramos la falla! Muchas gracias.
    mati_mz_17@hotmail.com

    ResponderEliminar
    Respuestas
    1. Hola, en realidad este frecuencimetro llega hasta los 50MHz, pero pierde un poco de exactitud, por lo que aconsejaria que lo prubes, ya que usa la multiplicacion de frecuencia como un PLL por software para contar frecuencia tan alta, digo asi porque es bastante mayor a la velocidad del bus del microcontrolador. La realidad es que si uno quiere un instrumento mas preciso deberias usar un Prescaler.
      Este codigo esta en CCS, podes abrirlo con el PICC y compilarlo en tu 887, vas a poder leer hasta 50MHz, probalo.

      Saludos.

      Eliminar
  6. Felicitaciones Sebastian.

    Gracias por estar atento a las preguntas.

    Quería preguntarte si es posible implementar alguna programación para leer el tiempo del ciclo duty y poder mostrar en el lcd el % del trabajo del ciclo duty.

    Saludos

    ResponderEliminar
    Respuestas
    1. Hola, Tendria que analizarlo, porque no es un codigo muy convencional este, ya que se sale de la frecuencia de operacion del mcu y opera en 32bit.., no es imposible, pero no es un cambio sencillo, dejame que lo vea ahora cuando me haga un espacio de la universidad y te aviso.
      Saludos.

      Eliminar
    2. Gracias por responder amigo.

      También Programo en ccs y nunca e visto ni un ejemplo de lo que quiero hacer.

      También tuve que modificar algunas cosas en tu programa original ya que el ccs compiler no me quiso compilar y me daba algunos errores.

      Espero que estudies el caso del % del ciclo duty y se pueda implementar en el programa.

      Saludos

      Eliminar
    3. Si?, que le modificaste? asi lo arrelgo, aca.
      Si probas esta version tambien te anda mal?

      https://sites.google.com/site/electgpl/storage/Frecuencimetro%2020MHz.7z?attredirects=0&d=1

      Saludos.

      Eliminar
  7. Buenas estamos haciendo un frecuencimetro y copiamos el programa y armamos el circuito en proteus y no nos funciono. tenes el archivo .hex o xq puede ser que no nos funcione. El circuito es exactamente el mismo al publicado, o le falta algunos componente o conexionado.
    Te dejo mi mail por si tenes info asi me la envias.

    martindaniel_chi@hotmail.com

    Saludos.

    ResponderEliminar
    Respuestas
    1. Hola aca tenes el proyecto completo.

      https://sites.google.com/site/electgpl/storage/Frecuencimetro%2020MHz.7z?attredirects=0&d=1

      Saludos.!

      Eliminar
    2. Buenas, arme el circuito en proteus y cuando pongo frecuencias bajas con decimales en el lcd solamente me marca la parte entera, es decir, entro con 15.265 Hz y el lcd me marca 15.000 Hz. pero en frecuencias altas me lo marca bien.. con los decimales..
      Espero que me puedas ayudar... muchas gracias

      Eliminar
    3. Hola, es posible ya que el metodo de funcionamiento es midiendo la fase de ambos timers, y eso sirve solo para valores altos de frecuencia. Te recomiendo reaizar un frecuencimetro por captura de flanco y desbordamiento de timer ya que es una frecuencia baja los 15kHz.
      Saludos.

      Eliminar
  8. Buenas:
    Nosotros estamos pensando en hacer un frecuencímetro pero con una amplitud mayor, necesitaríamos que como mínimo leyese 20MHz hasta 900MHz, hemos buscado y en varios blogs se habla de posibilidades pero necesitaríamos empezar por algún sitio, y éste es el más sencillo que hemos encontrado. ¿Se podría adaptar? Hablas del Prescaler, pero ¿Lo tienes diseñado?
    Gracias de antemano.

    ResponderEliminar
    Respuestas
    1. Hola, actualmente tengo este frecuencimetro funcionando hasta 1GHz (comprobado) con el Prescaler MC12080, este lo traje de afuera, no sabria decirte si se consigue aqui.

      El circuito es el de la pagina 2 de su datasheet: http://www.onsemi.com/pub/Collateral/MC12080-D.PDF

      Fijate que en el post tengo multiplico por 80 el valor medido, de esa forma compenso la division por 80 que realiza el prescaler.

      Saludos.

      Eliminar
    2. Gracias, pero; El circuito es exactamente el que está en el post? cómo conectas el prescaler? y qué es el C3(1)? ¿otro condensador? Es que no reconocemos el símbolo... o_O

      Eliminar
    3. Ahi al lado del circuito estan los componentes:

      External Components
      C1 = 1000 pF = 1nF
      C2 = 1000 pF = 1nF
      C3 = 0.1 uF = 100nF
      CL = 8.0 pF
      RL = 820 Ohms

      El circuito se contecta de la siguiente forma:

      Entrada de señal ---> Prescaler ---> frecuencimetro con PIC

      Tu entrada de frecuencimetro es donde dice "Sine Wave Generator" en el MC12080, la salida donde esta CL y RL es donde se conectara a la entrada mediante el capacitor C3 de 1uF al PIC.


      Eliminar
  9. Desde ya muchisimas gracias por responder todas las preguntar en tiempo y de forma clara...
    Estoy haciendo el frecuencimetro, hasta ahora solo lo simule en proteus y anda bastante bien!
    Mi problema esta en la programacion, no entiendo bien que hacen todas las instrucciones. Te dejo aqui el programa que hiciste vos con algunas modificaciones y comentarios al lado de cada instruccion, lo que te queria pedir es si poder indicarme que hace cada instruccion que no tiene comentario al lado, eso me facilitaria notablemente el entendimiento del programa, ya que la circuiteria la entendi bien (a diferencia de tu circuito yo elimine el condensador de entrada ya que a bajas frecuencias me hacia un circuito abierto, y limite la tension de entrada con un zener de 4.7v)
    Te dejo aqui el programa, desde ya muchas gracias por tu tiempo y por brindar tu conocimiento:
    #include <16F877.h> //Incluye librerias del PIC//
    #device adc=10 //Define cantidad de bit que utiliza el conversor A/D//
    #FUSES NOWDT //No utiliza "el perro guardian"//
    #FUSES HS //Utiliza alta frecuencia de Oscilacion//
    #FUSES NOPUT //No utiliza Power On Timer//
    #FUSES NOPROTECT
    #FUSES NOCPD
    #FUSES NOBROWNOUT
    #FUSES NOLVP
    #FUSES NODEBUG
    #FUSES NOWRT
    #use delay(clock=20000000) //Utiliza un Cristal externo de 20MHz//
    #include //Tomo librerias del LCD//
    #bit t1_overflow=0x0C.0 //
    #bit FlagDesbordaTimer1 = 0x0C.0
    void main() //Funcion Principal//
    {
    lcd_init(); //Inicio el LCD//
    int Ciclo1byte, Ciclos; //Defino 2 enteros: Ciclo1byte y Ciclos//
    float Frecuencia; //Defino una variable "Frecuencia" como flotante//
    long ParteAlta, ParteBaja; //Define variable de 16 bit//
    while(true)
    {
    Ciclo1byte = 0;
    Ciclos = 0;
    ParteAlta = 0;
    FlagDesbordaTimer1 = 0;
    set_timer1(0);
    setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
    while(Ciclos!=0xFF)
    {
    Ciclo1byte = 0;
    while(Ciclo1byte!=0xFF)
    {
    if(FlagDesbordaTimer1)
    {
    FlagDesbordaTimer1 = 0;
    ParteAlta++;
    }
    else
    {
    delay_cycles(5);
    }
    delay_cycles(62);
    Ciclo1byte++;
    }
    delay_cycles(216);
    Ciclos++;
    }
    delay_cycles(211);
    setup_timer_1(T1_DISABLED);
    if(FlagDesbordaTimer1)
    {
    ParteAlta++;
    }
    ParteBaja = get_timer1();
    Frecuencia = make32(ParteAlta,ParteBaja);
    //Imprimo "Frecuencimetro" en la 1º linea del LCD//
    printf(lcd_putc," Frecuencimetro \n");

    //Imprimo el valor de la frecuencia en la 2º linea del LDC//
    if(Frecuencia<=100000)
    printf(lcd_putc," f= %03.3g Hz \n",Frecuencia);
    if((Frecuencia>100000)&&(Frecuencia<=10000000))
    printf(lcd_putc," f= %03.3g KHz \n",Frecuencia/1000);
    if (Frecuencia>10000000)
    printf(lcd_putc," f= %03.3g MHz \n",Frecuencia/1000000);
    }
    }

    ResponderEliminar
  10. Hola: tengo un problema y es que el programa no me compila en absoluto, me da un montón de errores, supongo que será por estar utilizando el compilador de MikroC, ya que tiene librerías própias... podrías echarme una mano???

    ResponderEliminar
    Respuestas
    1. Hola, este programa esta realizado para el compilador CCS, no te va a compilar en MikroC, si queres te lo compilo yo aca y te paso el archivo .hex para que grabes en el PIC.
      Saludos.

      Eliminar
    2. Perfecto, pero lo necesito para frecuencias altas, es decir sin la línea:
      // printf(lcd_putc,"fo= %03.4f MHz\n",(Frecuencia*80)/1000000);
      sin comentar.
      Gracias.

      Eliminar
    3. Muy bien, tene encuenta que le tenes que poner un prescaler /80 a la entrada para que la lectura sea correcta.

      Eliminar
    4. Me lo envías por aquí o te mando mi email? Y muchísimas gracias de nuevo!!!

      Eliminar
    5. Hola aca te dejo el link de descarga.

      https://sites.google.com/site/electgpl/storage/Frecuencimetro%2020MHz.7z?attredirects=0&d=1

      Saludos.

      Eliminar
  11. Necesitaria si podes indicarme como funciona el programa y que hace cada instruccion, ya que algunas de ellas no las entiendo!
    Gracias.

    ResponderEliminar
    Respuestas
    1. Hola, que instrucciones son las que no conoces? De todas formas las instrucciones podes encontrarlas en el manual de CCS que se descarga de forma gratuita en este link http://www.sandorobotics.com/attachments/CCSSPANISH.pdf
      Con respecto al funcionamiento, podriamos decir que aprovecha los dos timers para hacer una comparacion de fase y tomar desde ahi el valor del periodo que despues convierte en frecuencia. Por eso tiene que manejar parte alta y baja, que en realdiad son los dos timers que convierte en 32bit con la funcion make.
      Saludos.

      Eliminar
  12. hola Sebastian Caccavallo tengo el pic16f628a lo puedo hacer con ese pic ??? gracias

    ResponderEliminar
    Respuestas
    1. Hola, tendrías que probar si la compilación entra, ya que el 628 tiene la mitad de memoria que el 883, y esto maneja números de 32Bits, no lo he probado con el 628.
      Saludos.

      Eliminar
  13. hola sebastian , yo tengo instalado CCS pero meda 3 errores quiero usar pic16f877
    ya que cuento con ese pic, el codigo es el mismo que esta mas arriba con el f877
    gracias un saludo...

    ResponderEliminar
    Respuestas
    1. Hola, que errores son los que te da? podes pegarlos aca?
      Saludos!

      Eliminar
  14. hola sebastian una consulta tengo un pic 16f88 me sirve??? si me llegara a ser útil el 16f88 me darías el .hex ? ya que para variar no se programar en C. te dejo mi correo
    lm386a@gmail.com mil gracias.... estaré atento buen blog........

    ResponderEliminar
    Respuestas
    1. Hola no funcionara, ya que es necesario utilizar un cristal de 20MHz, y el 16F88 no permite ese cristal en la compilacion. Necesitas un microcontrolador de mayores caracteristicas.
      Saludos.

      Eliminar
  15. Hola Sebastian, me gustaría saber que parte del código habría que modificar para reducir el "tiempo de ventana" en el que el PIC cuenta los pulsos, ya que lo quiero para medir mandos RF con modulación ASK, y como hay tramos en donde no manda ninguna onda, "engañan" al frecuencímetro y no obtengo la frecuencia correcta (la de la portadora). Con un osciloscopio he podido comprobar que el tiempo más corto de "pulso continuo" es de 10uS, ¿sería posible medir la frecuencia con una ventana tan corta?


    Salu2 y muchas gracias.

    PD. Como el MC12080 no me funcionaba bien, he usado otro preescaler que divide la frecuencia en 256 en vez de en 80, pero ni aún así he logrado medir correctamente la frecuencia (Obviamente tras modificar la multiplicación en el código).

    ResponderEliminar
    Respuestas
    1. Hola, comprendo lo que mencionas, pero el código esta trabajando muy optimizado ya, porque no es un comportamiento normal la medición de 20MHz a un MCU que no llega a esa velocidad de instrucción. Lo que habría hacer tal vez, por el tema de utilizar un preescaler, es un amplificador de RF a la entrada, ya que al estar fuera del ancho de banda normal, seria bueno ampliar la ganancia de entrada. Podrías implementar un transistor de uso general por ejemplo 2N3904 o BC548 en EC, para amplificar esta señal.
      Saludos.

      Eliminar
    2. Buenas, la señal ya la tengo amplificada a nivel TTL y con el preescaler, al dividir por 256Mhz, la máxima frecuencia que voy a tener que medir es 3.4Mhz y la mínima será del orden de 1Mhz (de echo por eso utilicé un preescaler tan grande), ¿en ese caso sería posible ajustarlo?


      Salu2 y muchas gracias.

      Eliminar
    3. Hola, tendría que probarlo, para modificar el programa ya que es algo volátil, el tema de modificar el periodo, si bien son solo 100kHz (10us), por la función que posee el programa de utilización de armónico y cruce por cero, tendría que probarlo.
      Saludos.

      Eliminar
    4. Buenas, muchas gracias por la respuesta, y revisando los datos me he dado cuenta de que el pulso mínimo son entre 20-50uS (igual es mayor, ya que lo estoy muestreando con un analizador lógico y las mediciones tan pequeñas no son exactas), y en caso de no funcionar, se podría subir hasta los 140uS de ventana, por lo que en ese caso imagino que ya habría tiempo de sobra no?


      Salu2 y muchas gracias por la ayuda :)

      Eliminar
    5. Si, lo que se me ocurre es utilizar un frecuencimetro diferente, ya que no tenes la necesidad de mucha frecuencia (gracias al presscaler) donde el proceso de medicion sea mas sencillo y directo, para variar la ventana., cuando hablamos de 140us, estamos hablando de 7kHz aproximadamente, lo que yo aria es usar por ejemplo algo asi: http://electgpl.blogspot.com.ar/2014/03/frecuencimetro-hasta-30khz.html, pero elevarle un poco la frecuencia, tal vez con un micro-controlador mas veloz y ahí podes customizar lo que quieras.

      Eliminar
    6. Buenas, con los 140uS me refería al tiempo de ventana (cuando tengo la onda sin cortes), pero dicha onda será de 3.4Mhz (como máximo), por eso estaba usando éste esquema e intentando adaptarlo, ya que el de 30Khz se me quedaba corto.


      Salu2 y muchas gracias

      Eliminar
    7. Si, el de 30kHz en realidad soporta un poco mas de frecuencia, pero esta andando muy holgadamente, ya que se podría implementar otro microcontrolador corriendo a 20Mhz en lugar de 4, y se podría configurar el PLL para llevarlo a 48MHz, lo cual ya nos da una frecuencia importante (12MHz) y mucho mas controlable en cuanto ventana.

      Eliminar
    8. Oki, pues le echaré un ojo, y la verdad es que con 48Mhz si tendría tiempo de sobra para ajustar la ventana y medir correctamente la frecuencia, le echaré un ojo :)

      Salu2 y muchas gracias por todo ;)

      Eliminar
    9. Yo creo que sera la mejor solución, ya que te va a permitir manipular el código mas sencillamente. Podes ver los PIC16F1454/5/9, http://www.microchip.com/wwwproducts/Devices.aspx?product=PIC16F1455
      Los tres poseen 12MIPS, por lo que no tendrás problemas para sensar la frecuencia que necesitas.
      Saludos.

      Eliminar
  16. La verdad te felicito me encanta aprender a programar y tu página es excelente me estoy volviendo adicto y la velocidad de respuesta es muy buena saludos

    ResponderEliminar
  17. La verdad te felicito me encanta aprender a programar y tu página es excelente me estoy volviendo adicto y la velocidad de respuesta es muy buena saludos

    ResponderEliminar
    Respuestas
    1. Bueno Gracias!, trato de responder cuanto antes porque es lo que esta bueno cuando ingresas a una pagina o foro. Tengo algunos proyectos frenados por tiempo, por eso no estoy subiendo tan seguido últimamente, pero ya volveré al régimen anterior.
      Saludos!

      Eliminar
  18. Muy buena tarde estoy haciendo un frecuenciometo e implementado usar para el envio de datos a la PC, pero estoy utilizando el pic18f4550 y el compilador xc8, quisiera entender como funcionan los timer para poder realizar un frecuenciometro de bajo rango 0-1MHz de antemano gracias.

    ResponderEliminar
    Respuestas
    1. Hola como estas, tenes un método mas sencillo para realizar el frecuencimetro si queres medir hasta 1MHz, es utilizando el timer interno, como estas usando un 18F vas a tener frecuencia de sobra para ello. Fíjate este otro link que es mas sencilla la estructura del frecuencimetro y podes aumentarle la frecuencia, yo lo he realizado a baja frecuencia porque era un ejemplo de concepto pero en el 18F podes aumentar la frecuencia sin problema.
      http://electgpl.blogspot.com.ar/2014/03/frecuencimetro-hasta-30khz.html
      Saludos!

      Eliminar
  19. Hola te consulto estoy re enquilombado para medir una señal cuadrada por ccp quiero medir la cantidad de pulsos en un segundo y el duty de la señal y mostrarlo en un lcd estoy mirando tu ejemplo y no se como adaptarlo para la medir los pulsos y el duty en porcentaje, tendrás algún ejemplo?

    ResponderEliminar
  20. Hola te consulto estoy re enquilombado para medir una señal cuadrada por ccp quiero medir la cantidad de pulsos en un segundo y el duty de la señal y mostrarlo en un lcd estoy mirando tu ejemplo y no se como adaptarlo para la medir los pulsos y el duty en porcentaje, tendrás algún ejemplo?

    ResponderEliminar
    Respuestas
    1. Hola, como estas? te recomendaría que empieces por este post http://electgpl.blogspot.com.ar/2014/03/frecuencimetro-hasta-30khz.html
      Que es mas sencillo para comprender bien el uso de la interrupción. Si bien dice 30kHz, soporta mas frecuencia. Podes implementarlo en casi cualquier micro ya que es super básico el código.
      Saludos!

      Eliminar
  21. Consulta tengo el período calculado en microsegundos como calculo el duty y lo muestro en porcentaje en lcd con una pista de como hago el cálculo no me doy idea gracias

    ResponderEliminar
    Respuestas
    1. Hola tenes que saber el tON o tOFF, no solo el periodo, ya que si sabes el tON y el periodo podes saber el tOFF, en este caso tON seria tu ciclo de trabajo.
      Para eso te conviene usar un detector de flanco ascendente y otro descendente, donde podes diferenciar el tiempo de encendido o apagado y restarlo al periodo para saber el ciclo de trabajo y mostrarlo en forma porcentual en el LCD.
      Saludos!

      Eliminar
  22. Consulta tengo el período calculado en microsegundos como calculo el duty y lo muestro en porcentaje en lcd con una pista de como hago el cálculo no me doy idea gracias

    ResponderEliminar
  23. hola, exelente proyecto, sera que pueda ocuparlo con un PIC16f788a?

    ResponderEliminar
    Respuestas
    1. Hola como estas, podes cambiar el micro sin problemas.
      Saludos.

      Eliminar
  24. Hola, podré utilizarla pantalla lcd jhd162a y cambiar el micro por el 16f877A?
    Saludos.

    ResponderEliminar
    Respuestas
    1. Hola, habría que probar, si tiene el mismo pinout seguramente sea compatible.
      Saludos

      Eliminar
  25. Excelente proyecto maestro porfavor podrias enviame el archivo hex ya compilado..si gracias...tony_21_09_90@hotmail.com

    ResponderEliminar
    Respuestas
    1. Gracias! aqui tenes el enlace del proyecto: https://sites.google.com/site/electgpl/storage/Frecuencimetro%2020MHz.7z?attredirects=0&d=1
      Saludos!

      Eliminar
  26. Hola, creo que en la versión publicada en esta pagina existe un error con los Fuses "#fuses HS,NOWDT,NOPROTECT,PUT,NOLVP,NOMCLR,INTRC", creo que en el fuse "INTRC", me da un error de oscilador interno.

    ResponderEliminar
    Respuestas
    1. Hola, es correcto si usamos el oscilador HS, no tendría sentido tener el INTRC, debe haberme quedado de otro fuente, y no note el problema porque los fuses se los suelo poner con el coconfigurator del programmer. Lo eliminare de los fuses, gracias por avisar.
      Saludos.

      Eliminar