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:
#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.