Hola, estoy realizando un trabajo que consiste en medir la frecuencia de una señal cuadrada.Para ello utilizo la interrupcion RTCC para ir contando el tiempo y la interrupcion RB4 de cambio de estado para detectar cuando se produce un flanco positivo.Los segundos los controlo bien,pero la interrupcion RB4 me esta dando problemas,ya que cada vez cuanta una cosa.Es mas sin conectar absolutamente nada al pin RB4 el programa me cuenta pulsos,como si se estuviesen produciendo cambios de estado en dicho pin.
¿Qué puede estar pasando?
Aquí os dejo el codigo que implemento
#fuses NOPROTECT //El código no está protegido contra lectura
#fuses NOCPD //La EEPROM no está protegida
#fuses NOLVP //No hay programado Bajo Voltaje
#fuses NOWDT //No activado el Watch Dog
#fuses XT //Frecuencia de oscilación del cristal 4MHz
#use fast_io(A) //Así no se reprogramará el pin antes de ser utilizado
#use fast_io(B) //Así no se reprograma el pin antes de ser utilizado
#use fast_io(C)
#use delay(clock=4000000) //Fijamos la frecuencia de reloj en 4MHz
#include "C:\CHAPUZA\lcdfor.c" //Se incluyen las funciones para el LCD
#define inter_p_segundo 15 // (4000000/(4*256*256))
#define N 3
int inter_cont; //Cuenta las interrupciones que faltan para que transcurra un segundo
long int segundos=0; //Cuenta los segundos que van transcurriendo
long int conta_pul=0; //Cuenta los pulsos que van entrando
int medidas=0; //Indica las frecuencias que se llevan almacenadas
long int frec_almac[N]; //Vector en el que se almacenan dichas frecuencias
long int frec_cardiaca; //Variable que guarda la frecuencia cardiaca media
int i=0,j=0;
int estado_portb_anterior=0; //variables auxiliares donde guardo el estado del pin RB4
int estado_portb_actual=0;
int hay_flanco_de_subida=0;
#separate
void inicializa(); //Función que inicializa el LCD y escribe un mensaje de inicio en él
#separate
void media(int v[N]); //Función que calcula la media de las frecuencias calculadas y la muestra en el LCD
#int_RTCC //Esta función se llama todo el tiempo
void RTCC_isr()
{ // el RTCC (timer0) desborda al pasar de (255->0) En este caso será aprox. 15 veces por segundo
if(--inter_cont==0)
{
++segundos;
inter_cont=inter_p_segundo;
}
}
#int_RB //Función que tiene lugar cuando salta debido a la interrupción de RB4
void RB_isr()
{
if(segundos<60)
{
//set_tris_b(0b00010000); //RB7-RB4 entradas, RB3-RB0 salidas
estado_portb_actual=input_b(); //Almaceno el valor actual del pin RB4
if ((!bit_test(estado_portb_anterior,4))&&(bit_test(estado_portb_actual,4)))
{
hay_flanco_de_subida=1;
}
if(hay_flanco_de_subida==1)
{
conta_pul++;
}
clear_interrupt(int_rb); //Repone el flag de interrupción RB
hay_flanco_de_subida=0;
}
}
void main()
{
delay_ms(333);
inter_cont=inter_p_segundo;
setup_counters( RTCC_INTERNAL, RTCC_DIV_256 | RTCC_8_BIT);
set_timer0(0);
//setup_adc_ports(NO_ANALOGS);
//setup_adc(ADC_OFF);
//setup_spi(FALSE);
//setup_timer_1(T1_DISABLED);
//setup_timer_2(T2_DISABLED,0,1);
port_b_pullups(false); //Desactiva cargas pull-up
//delay_ms(333);
enable_interrupts(INT_RTCC);
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
inicializa();
//set_tris_b(0x10); //Fijamos el bit 4 del puerto B (RB4) como entrada,el resto quedan como salidas
delay_us(10);
set_tris_b(0b00010000);//RB0-RB3,RB5-RB7 salidas, RB4 entrada
output_b(0x00);
clear_interrupt(int_rb); //Repone flag de interrupción RB
//temporal=input_b(); //Repone el estado de la puerta
// enable_interrupts(INT_RTCC);
//enable_interrupts(INT_RB);
//enable_interrupts(GLOBAL);
for(i=0;i<3;i++) //Inicializo a 0 las componentes del vector
{
frec_almac[i]=0;
}
while(medidas<3)
{
if(segundos==60)
{
frec_almac[medidas]=conta_pul;
medidas++;
segundos=0;
conta_pul=0;
inter_cont=inter_p_segundo;
}
}
media(frec_almac);
}
#separate
void inicializa()
{
lcd_init(); //Se inicializa la pantalla LCD
//setup_adc(ADC_CLOCK_INTERNAL); //Ajuste de la frecuencia de trabajo
Lcd_gotoxy(4,1); //Se coloca el cursor en la primera fila del LCD
printf(lcd_putc,"MEDIDOR DE");
Lcd_gotoxy(1,0); //Se coloca el cursor en la segunda fila del LCD
printf(lcd_putc,"FREC. CARDIACA");
delay_ms(4000); //Se muestra el mensaje durante 4 segundos
lcd_init(); //Se reinicia el LCD para borrar el mensaje
delay_ms(250);
}
#separate
void media(int v[N])
{
frec_cardiaca=(v[j]+v[j+1]+v[j+2])/3;
lcd_init(); //Se reinicia la pantalla LCD
Lcd_gotoxy(1,1); //Se coloca el cursor en la primera fila del LCD
printf(lcd_putc,"Frec. cardiaca:");
Lcd_gotoxy(4,0); //Se coloca el cursor en la segunda fila del LCD
printf(lcd_putc,"%ld pul/min",frec_cardiaca);
delay_ms(5000);
lcd_init(); //Se reinicia el lcd para borrar la pantalla
delay_ms(250);
}
Cuento las pulsaciones que se producen en un minuto y utilizo el puerto C para el lcd.
Gracias.Saludos