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

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

Desconectado hekor

  • PIC10
  • *
  • Mensajes: 6
Medir frecuencia señal cuadrada mediante INT_RB
« en: 05 de Marzo de 2009, 16:20:31 »
Hola a todos! Les cuento mi problema, tengo un PIC 16f877 con un cristal de 20Mhz; lo que quiero es medir la frecuencia de una señal cuadrada que le entra al pic por el PIN_B4 ,para ello utilizo una interrupcion INT_RB que me cuenta los flancos de subida; a su vez con el timer0 muestro en la pantalla el numero de flancos de subida que han habido en 1 segundo (frecuencia). Bueno hasta aqui todo bien, para frecuencias entre 0Hz y aproximadamente 17Khz me las mide "correctamente" (con errores pero que no me importan mucho), a partir de los 17khz ya se vuelve loco.

Les adjunto el codigo:
Código: [Seleccionar]
#include <16f877.h>



#use delay(clock=20000000)

#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT





#include "lcd.c"





int flancos[6];

int frec[6];

int aux=0;

int x=0;

int estado=0;

int estado_temp=0;





void mostrar(int dato[]){

int aux1=5;

int num_izq=0;

lcd_putc("Frec: ");

while (aux1!=-1) {

if ( (dato[aux1]!=0) || (num_izq==1) ){

      printf(lcd_putc,"%d",dato[aux1]);

num_izq=1;

}

else lcd_putc(" ");

aux1--;

}

lcd_putc(" Hz");

}





#int_rb

void rutina_rb(){

int aux2=0;

estado=input(PIN_B4);

if (estado!=estado_temp) {

if (estado_temp==0 && estado==1) {

flancos[0]++;

for (aux2=0;aux2<=5;aux2++) {

if (flancos[aux2]==10) {

flancos[aux2+1]++;

flancos[aux2]=0;

}

}

}

}

estado_temp=estado;

}





#int_TIMER0



void rutina_timer0() {

int aux3=0;

   x++;

   if (x==76) { //x==76 1seg

x=0;

for (aux3=0;aux3<=5;aux3++) {

frec[aux3]=flancos[aux3];

}

for (aux3=0;aux3<=5;aux3++) {

flancos[aux3]=0;

}

}

   SET_TIMER0(0);

}





void main() {

for (aux=0;aux<=5;aux++) flancos[aux]=0;

lcd_init();

set_tris_b(0b00010000);

SETUP_counters( RTCC_INTERNAL, RTCC_DIV_256);

ENABLE_INTERRUPTS(INT_RTCC);

SET_TIMER0(0);



enable_interrupts(int_rb);

enable_interrupts(GLOBAL);

do{

lcd_gotoxy(1,1);

lcd_putc("Calculando...");

lcd_gotoxy(1,2);

mostrar(frec);

}while(1);

}

¿seria posible medir hasta el orden de megaherzios mediante este sistema?  ¿o tendria que realizarlo mediente otros metodos?

Gracias.

Desconectado vtasco

  • PIC12
  • **
  • Mensajes: 72
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #1 en: 05 de Marzo de 2009, 18:06:13 »
probablemente estés llegando al límite del pic a esa frecuencia.
Podrías intentar dividiendo la frecuencia de entrada (con flip flops),tendrás que ver si el error de medición sigue siendo aceptable.

En este link algo de información : http://www.play-hookey.com/digital/frequency_dividers.html

saludos!

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #2 en: 05 de Marzo de 2009, 19:24:37 »
El problema se puede deber a los retardos que impone la librería del lcd, pues cuando entra a la interrupción y si justo está en algún retardo del lcd puede que haga cualquier cosa. Prueba contando por un segundo sin actualizar el lcd, luego cuando la cuenta termina deshabilita la interrupción, presentas los datos en el lcd y cuando terminas de presentar los datos, comenzás nuevamente a contar habilitando la interrupción. Luego de esto si quieres medir frecuencias mayores debes usar divisores de frecuencia como te lo indicó vtasco

Desconectado hekor

  • PIC10
  • *
  • Mensajes: 6
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #3 en: 05 de Marzo de 2009, 19:41:31 »
Ok muchas gracias por vuestras respuestas, intentare hacer lo que me ha dicho pablomanieri, aislaré todo lo que pueda el conteo de los demas procesos como pueden ser mostrar por el lcd, etc. Si no funcionase recurriria a la solucion de vtasco. ;-)

Ahora me surge otra duda, dentro de la rutina de interrupcion_rb tengo un bucle for que me sirve para ir contando los flancos de subida, ej: cuando llega a 10 flancos aumenta en 1 lo que serian las decenas y asi sucesivamente. La pregunta es ¿este bucle for podria estar causando algun retraso que me afecte a la medicion a altas frecuencias? Mi idea seria quitar este bucle y hacer que la variable que cuenta los flancos pudiese llegar hasta los megas, es decir, una especie de entero de 32bits ¿seria posible hacer eso?

Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #4 en: 05 de Marzo de 2009, 19:56:49 »
mas que la rutina for, me da la sensacion que son muchos condicionales y estan retrasando el proceso  :? ....
LAS MALVINAS SON ARGENTINAS!

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #5 en: 05 de Marzo de 2009, 20:52:36 »
mira esta web...

a lo mejor esto te viene de lujo...
aqui
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...


Desconectado hekor

  • PIC10
  • *
  • Mensajes: 6
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #7 en: 06 de Marzo de 2009, 11:21:32 »
He utilizado la tecnica de medir el tiempo en alto mediante int_ext y a partir de 30Khz no mide bien ... :S nose si alguien habra conseguido medir frecuencias mayores mediante ese metodo.

El profesor me ha dicho que el consiguio medir frecuencias de hasta 100Khz programando el mismo pic (16f877) con BASIC y una instruccion llamada PULSIN. Pero el problema es que yo lo quiero en CCS...

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #8 en: 06 de Marzo de 2009, 12:05:15 »
Hola.

Pues los amigos del CCS tienen un frecuencimetro que va muy bien, revisa el EX_FREQC.c que esta en la carpeta de ejemplos.

Saludos
El papel lo aguanta todo


Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #10 en: 06 de Marzo de 2009, 21:36:25 »
He utilizado la tecnica de medir el tiempo en alto mediante int_ext y a partir de 30Khz no mide bien ... :S nose si alguien habra conseguido medir frecuencias mayores mediante ese metodo.

El profesor me ha dicho que el consiguio medir frecuencias de hasta 100Khz programando el mismo pic (16f877) con BASIC y una instruccion llamada PULSIN. Pero el problema es que yo lo quiero en CCS...

yo lo hice.... solo que no llegaba a 82khz.....
use la interrupcion de la patilla rb0 , y la interrupcion timer0
el primero(int_ext) lo unico que hacia era sumar los pulsos
y el segundo(int_rtcc) hice unas lineas de programa que me generaban un tiempo de aproximadamente un segundo, pasado este segundo guardaba el valor en una variable
y reseteaba el contador de pulsos

#int_ext
void entrada()
{
   ++pulso;
}

#int_rtcc
void time()
{
   ++tiempo;
   if(tiempo>19250){
      tiempo = 0;
      seg = pulso/2;
      pulsos= pulso*30;
      j=pulsos/10000 %10;
      jj=pulsos/1000 %10;
      jjj=pulsos/100 %10;
      jjjj=pulsos/10 %10;
      jjjjj=pulsos   %10;
      pulso = 0;
   }
}

mas o menos asi....
decir que utilice un pic 16f628a... el 16f877 aun no lo he utilizado pero imagino que sera lo mismo
mismo perro con diferente collar

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

Desconectado hekor

  • PIC10
  • *
  • Mensajes: 6
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #11 en: 09 de Marzo de 2009, 08:40:57 »
Con el ejemplo de EX_FREQ.C consegui llegar a 60Khz :S

Me gustaria saber si alguien ha llegado a medir 100Khz y mediante que metodo, no tiene porque ser mediante el puerto rb :S

Desconectado MLO__

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

Yo medi con el ejemplo de los de CCS hasta mas de 3.5MHz sin problema (no necesitaba subir mas la frecuencia)
El papel lo aguanta todo

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Medir frecuencia señal cuadrada mediante INT_RB
« Respuesta #13 en: 10 de Marzo de 2009, 20:01:26 »
que ejemplo era?
si puedes indicarnoslo.... mejor que mejor, asi tod@s aprenderemos algo nuevo..... nunca es tarde si la dicha es buena jejejee

que era de la web oficial del ccs?
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 #14 en: 11 de Marzo de 2009, 00:32:31 »
Pues los amigos del CCS tienen un frecuencimetro que va muy bien, revisa el EX_FREQC.c que esta en la carpeta de ejemplos.
El papel lo aguanta todo