Autor Tema: Problemas con la interrupcion RB4  (Leído 1460 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado chuletiya

  • PIC10
  • *
  • Mensajes: 6
Problemas con la interrupcion RB4
« en: 12 de Mayo de 2009, 08:38:57 »
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
Código: [Seleccionar]
#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

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problemas con la interrupcion RB4
« Respuesta #1 en: 12 de Mayo de 2009, 10:07:26 »
No se que versión de CCS estas utilizando, pero algunas tienen un bug. No realizan la lectura/escritura que necesita el puerto B para la interrupción. Mira aquí
No contesto mensajes privados, las consultas en el foro

Desconectado chuletiya

  • PIC10
  • *
  • Mensajes: 6
Re: Problemas con la interrupcion RB4
« Respuesta #2 en: 12 de Mayo de 2009, 11:35:13 »
Utilizo la version 4.084 de CCS.

Gracias.


 

anything