Autor Tema: Medir frecuencia señal cuadrada mediante INT_RB  (Leído 20001 veces)

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

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #15 en: 14 de Marzo de 2009, 15:29:55 »
como haces funcionar el ejemplo? a mi no me acaba de funcionar muy bien,,,,
el 16f877 tiene el contador t1cki, es un contador de 32bits?
yo uso el 16f628 y con este he llegado a 79khz con la interrupcion INT_EXT
deja algun tipo de flang esta interrupcion en algun registro¿
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado ElVale

  • PIC10
  • *
  • Mensajes: 31
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #16 en: 15 de Marzo de 2009, 02:29:31 »
Ese ejemplo EX_FREQC.C lo veo bien raro, no se ni por donde entra a señal.

Si yo quisiera hacer un frecuencímetro haría lo siguiente:

1. Habilito interrupción externa para que detecte la señal cuadrada entrante.
2. Al llegar la interrupción externa pondría el timer1 en 0 y lo pondría a correr, además habilito la interrupción de overflow del timer1
3. Al llegar un overflow del timer1 lo sumaría a un contador (overflows++)
4. Al llegar una nueva interrupción externa (un nuevo período de la señal cuadrada entrante) multiplico el numero de overflows que se llevan hasta ahora por 65536 (timer1 es de 16bits) y a eso le sumaría lo que lleva timer1 hasta ahora (get_timer1()).
5. A este resultado que sería aproximadamente el número de ciclos que se lleva un periodo de la señal cuadrada entrante lo multiplicaría por el periodo de un ciclo de reloj, es decir por 4/Fosc. Hasta aqui tengo el período de la señal cuadrada. Para hallar la frecuencia no es sino sacar el inverso de esto y listo. Es decir
FrecuenciaSeñalCuadrada = inverso(ciclos*4/Fosc)=Fosc/(4*ciclos).

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #17 en: 15 de Marzo de 2009, 11:51:08 »

2. Al llegar la interrupción externa pondría el timer1 en 0 y lo pondría a correr, además habilito la interrupción de overflow del timer1
3. Al llegar un overflow del timer1 lo sumaría a un contador (overflows++)
4. Al llegar una nueva interrupción externa (un nuevo período de la señal cuadrada entrante) multiplico el numero de overflows que se llevan hasta ahora por 65536 (timer1 es de 16bits) y a eso le sumaría lo que lleva timer1 hasta ahora (get_timer1()).


yo hace poco que estoy con el c....
me podrias explicar mejor eso del overflows? que es?

es un tipo de interrupcion como anteriormente dices, pero....? yo tengo un manual del ccs y no pone nada del overflow tansolo lo referente a PSP_OVERFLOW()
podrias explicarme eso de que va?
« Última modificación: 15 de Marzo de 2009, 11:55:19 por ppyote »
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #18 en: 16 de Marzo de 2009, 00:05:57 »
Hola.

La señal entra por el pin RC0.
El papel lo aguanta todo

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #19 en: 16 de Marzo de 2009, 00:52:42 »
Citar
me podrias explicar mejor eso del overflows? que es?

Overflow: Cuando el contador del timer1 pasa de 0xFFFF (65535) a 0x0000. Ocurre un desbordamiento y el contador de reinicia. Al momento del reinicio se activa la bandera TMR1IF (PIR1<0>) poniéndose en 1. Esta activación puede usarse de dos maneras:
•   Para solicitar una interrupción
•   Para ser consultada por poleo
No contesto mensajes privados, las consultas en el foro

Desconectado ElVale

  • PIC10
  • *
  • Mensajes: 31
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #20 en: 16 de Marzo de 2009, 01:35:16 »
La señal entra por el pin RC0.

Si pero en que parte del programa se hace lectura de ese pin?

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #21 en: 16 de Marzo de 2009, 01:38:51 »
Está configurado para detectar pulsos externos, ósea timer1 en modo contador:
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
No contesto mensajes privados, las consultas en el foro

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #22 en: 16 de Marzo de 2009, 04:37:29 »
Citar
me podrias explicar mejor eso del overflows? que es?

Overflow: Cuando el contador del timer1 pasa de 0xFFFF (65535) a 0x0000. Ocurre un desbordamiento y el contador de reinicia. Al momento del reinicio se activa la bandera TMR1IF (PIR1<0>) poniéndose en 1. Esta activación puede usarse de dos maneras:
•   Para solicitar una interrupción
•   Para ser consultada por poleo


Muchas gracias Suky por aclararmelo.... ahora me ha quedado claro....
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #23 en: 16 de Marzo de 2009, 09:39:16 »
El programa esta muy bien comentado en lo que hace .... es solo cuestion de leer  :?
El papel lo aguanta todo

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #24 en: 17 de Marzo de 2009, 19:43:59 »
cierto en los comentarios lo explica bien.... pero yo no comprendo la lectura es erronea.... lo probe con el proteus y me daba valores nada correctos....
no se...
yo al final con el 16f628a he conseguido llegar a 290khz
aqui va mi programa....

Citar
#include <16F628a.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20000000)    //one instruction=0.2us
#use fast_io (a)
#include <lcd_portb.c>
#byte porta = 0x06
#byte cmcon = 0x1f

unsigned int ajuste = 0;
unsigned int j,jj,jjj,jjjj,jjjjj = 0;
unsigned long pulsos,pulsos2 = 0;
unsigned long tiempo = 0;

#int_timer0
void time()
{
   ++tiempo;
   if(tiempo>76){                                                //la condicion se cumple cada 0.9998 segundos
         j = pulsos2;                                          //
         jj = pulsos/1000 %10;                                    //prepara valores de las variables
         jjj = pulsos/100 %10;                                    //para mostarlos en el lcd
         jjjj = pulsos/10 %10;                                    //
         jjjjj = pulsos %10;                                       //
         lcd_gotoxy(1,1);
         if(pulsos2<=0){
            printf(lcd_putc, "Freq= %lu Hz  "pulsos);
            ajuste = 181;                                       //ajustes de la interrupcion del timer0 para frequencias inferiores a 10Khz
         }
         else
         {
            if(pulsos2<=4){
               printf(lcd_putc, "Freq= %u%u,%u Khz  "j,jj,jjj);
               ajuste = 168;                                    //ajustes de la interrupcion del timer0 para frequencias inferiores a 40Hkz
            }
            else
            {
                  if(pulsos2<=26){
                  printf(lcd_putc, "Freq= %u%u,%u Khz  "j,jj,jjj);
                  ajuste = 154;                                 //ajustes de la interrupcion del timer0 para frequencias inferiores a 250Hkz
               }
               else
               {
                  printf(lcd_putc, "Freq= %u%u,%u Khz  "j,jj,jjj);
                  ajuste = 127;                                 //ajustes de la interrupcion del timer0 para frequencias superiores a 250Hkz
               }
            }
                                       
         }
         set_rtcc(ajuste);                                       //asigna el valor "ajuste" para ajustar el valor de frecuencias a diferentes valores
         pulsos = tiempo = pulsos2 = 0;                              //setea valores
   }
}   


void main()
{
   cmcon = 0x07;                                                //comparadores en off
   set_tris_a (0x01);                                             //solo esta el PIN_A0 como entrada, el resto salidas
   enable_interrupts(int_timer0);                                    //habilito interrupciones timer0
   setup_timer_0(rtcc_internal | rtcc_div_256);                        //configuro interrupciones timer0
   enable_interrupts(global);                                       //activo las interrupciones habilitadas
   
      lcd_init();                                                //inicio el LCD
      while(true){                                             //bucle infinito
         do{
            while(input(PIN_A0)){
               ++pulsos;
               while(input(PIN_A0)){}
            }
         }while(pulsos != 10000);                                 //hasta que pulsos no sea 10000, repetira el bucle
         pulsos = 0;                                             //setea pulsos
         ++pulsos2;                                             //suma 1 a pulsos2, con este valor obtendremos las decenas de millar,centenasde millar y unidades de millon
         
      }


}
« Última modificación: 17 de Marzo de 2009, 19:46:02 por ppyote »
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #25 en: 18 de Marzo de 2009, 00:12:56 »
Hola.

Monta el circuito, no te preocupes, funciona muy bien. En el proteus no simula muy bien que digamos -a mi no me corrio bien- pero en fisico si que funciona.
El papel lo aguanta todo

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #26 en: 18 de Marzo de 2009, 05:41:58 »
en proteus si no tienes un buen ordenador...
al tener que contar uno a uno los inpulsos se demora de mucho tiempo, ademas hasta que se estabiliza pasan un par de segundos cosa que en una proboard no pasa... MLO__ tu crees que demora mas ciclos utiles estas lineas....

Citar
      while(true){                                             //bucle infinito
         do{
            while(input(PIN_A0)){
               ++pulsos;
               while(input(PIN_A0)){}
            }
         }while(pulsos != 10000);                                 //hasta que pulsos no sea 10000, repetira el bucle
         pulsos = 0;                                             //setea pulsos
         ++pulsos2;                                             //suma 1 a pulsos2, con este valor obtendremos las decenas de millar,centenasde millar y unidades de millon
         
      }

o estas?

Citar
      while(true){                                             //bucle infinito
         do{
            while(input(PIN_A0)){
               ++pulsos;
                if(pulsos==10000){
                     pulsos = 0;
                     ++pulsos2;
               while(input(PIN_A0)){}         
      }
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #27 en: 19 de Marzo de 2009, 03:08:05 »
Hola.

en proteus si no tienes un buen ordenador...

La simulacion solo ocupa el 15% del procesador .... es mas bien problemas del proteus -el tiene sus fallas-  :mrgreen:

Para verificar lo que quieres, revisa el archivo LIST generado por el compilador y compara cual es el mas eficiente.

Saludos
El papel lo aguanta todo

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #28 en: 19 de Marzo de 2009, 06:37:06 »
anda.... como decia mi abuela.... nunca te iras a la cama sin saber algo nuevo....
no sabia ese pequeño ""truquillo""
gracias MLO__ todo buenos consejos si señor....
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #29 en: 21 de Marzo de 2009, 18:03:41 »
 :) hola gente estube probando el programa en proteus y hasta los 10 Mhz andubo perfecto con un 16f877a (simulado en proteus), modificaron el cristal correctamente?.
Ahora tengo una consulta, segun parece a la funcion la podemos aplicarlo a cualquier otro pic como un 18f4550 no?. bueno cuando hago eso, osea cambio el header y modifico el clock y descomento una linea en el programa ya no me funciona el frecuencimetro  :( . Alguien ha utilizado esta rutina en uno de la flia 18f. No pongo el codigo porque es el mismo que el ejemplo.
 Saludos.
LAS MALVINAS SON ARGENTINAS!


 

anything