TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: SJD2 en 01 de Marzo de 2006, 11:35:00

Título: ayuda con interrupcion interna
Publicado por: SJD2 en 01 de Marzo de 2006, 11:35:00
hola, soy nuevo en esto del pic. estoy haciendo un programa usando la interrupcion interna en RB4, con el 16f877. no se que pasa en el programa, seguramente habre puesto alguna burrada. el programa consiste en dar a rb4 y que suene un buz piezoeléctrico y al volver a darle se apague, asi indefinidamente.
haber si alguien puede ayudarme:
gracias

//
//   Dispositivo: PIC 16F877         Compilador:    CCS vs3.236
//   Entorno IDE: MPLAB IDE v7.3      Simulador:    Proteus 6.7sp3
//


#include <16f877.h>               //pic a utilizar          
#fuses XT                     //ordenes para el programador
#use delay (clock=4000000)         //Fosc=4Mhz
#use standard_io(c)
#use fast_io(b)
#byte port_b=0x06               //declaracion del puerto b

int last_b;   
byte changes;

///DECLARACION DE FUNCIONES GLOBALES

void buzzer(void);               //funcion que hace sonar el buz del portc dada la interrupcion


///PROGRAMA
void main(void)
{
   set_tris_b (0b111110111);      //portb entrada menos pin B0 es salida
   set_tris_c (0b00000100);
   enable_interrupts(int_rb);      //activar interrupcion rb4:7
   enable_interrupts(GLOBAL);      //activar interrupciones
                               //variable que almacena que pin a realizado la interrupcion
   last_b=port_b;

do{
      
      changes = last_b ^ port_b;      //changes<-pin que genera la interrupcion

      last_b = port_b;            //last_b=como estaba el portb antes de interrupcion

      if (bit_test(changes,4 ))      //¿PIN_B4 genera interrupcion?
      buzzer();               //SI -> ejecuta va a la interrupción
    else
      output_low(pin_c2);         //No,
      
      }while(TRUE);            //bucle infinito
}

///FUNCION QUE EJECUTA LA SECUENCIA DE ZUMBIDO DEBIDO A INTERRUPCION POR EL PORTB4:7

#INT_RB
void buzzer(void)
{
   do{
   output_high(PIN_C2);
   delay_ms(1);
   output_low(PIN_C2);
   if (bit_test(changes,4 ))      //¿PIN_B4 genera interrupcion?
      break;      

   }while(true);   
}




massiah desde cantabria Flash
Título: RE: ayuda con interrupcion interna
Publicado por: maunix en 01 de Marzo de 2006, 12:46:00
El Seteo del Tris del puerto B, está mal, has puesto 9 dígitos y debieras poner solo 8.
ME podrias explicar que es lo que hace esta funcion?

changes = last_b ^ port_b;

Otra cuestión, aparentemente usas esta instrucción enable_interrupts(int_rb); para habilitar la interrupción
Si esto es asi, tu rutina irá al vector de interrupciones y en tu código no lo veo en nigun lado.  
Además te digo, dada la simplicidad de lo que quieres hacer, no te hace falta habilitar ninguna interrupción.
Título: RE: ayuda con interrupcion interna
Publicado por: SJD2 en 03 de Marzo de 2006, 09:04:00
gracias, ya lo he solucionado el codido de las_b sobra. lo estba haciendo bastante mal porque me sobraban bastantes cosas elk código era el siguiente:

//
//   Dispositivo: PIC 16F877         Compilador:    CCS vs3.236
//   Entorno IDE: MPLAB IDE v7.22      Simulador:    Proteus 6.7sp3
//


#include <16f877.h>               //pic a utilizar          
#fuses XT                     //ordenes para el programador
#use delay (clock=4000000)         //Fosc=4Mhz
#use standard_io(c)
#use fast_io(b)
#byte port_b=0x06               //declaracion del puerto b

int  a = 0;   

///DECLARACION DE FUNCIONES GLOBALES

void buzzer(void);               //funcion que hace sonar el buz del portc dada la interrupcion


///PROGRAMA
void main(void)
{
   set_tris_b (0b11110111);      //portb entrada menos pin B0 es salida
   set_tris_c (0b00000100);
   enable_interrupts(int_rb);      //activar interrupcion rb4:7
   enable_interrupts(GLOBAL);      //activar interrupciones
                               //variable que almacena que pin a realizado la interrupcion

do{
      if (a)
   { output_high (PIN_C2);
     delay_ms (1);
     output_low (PIN_C2);
}
      
      }while(TRUE);            //bucle infinito
}

///FUNCION QUE EJECUTA LA SECUENCIA DE ZUMBIDO DEBIDO A INTERRUPCION POR EL PORTB4:7

#INT_RB
void buzzer(void)
{
   if (bit_test(port_b,4 ))      //¿PIN_B4 genera interrupcion?
{      if (!a)
       {   
         a = 1; }
       else
       {   
         a = 0; }
   }
}

Título: RE: ayuda con interrupcion interna
Publicado por: maunix en 03 de Marzo de 2006, 17:45:00
Me alegro que hayas solucionado tu problema.

Saludos Giño