Autor Tema: ayuda con interrupcion interna  (Leído 3246 veces)

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

Desconectado SJD2

  • PIC10
  • *
  • Mensajes: 27
ayuda con interrupcion interna
« 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

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: ayuda con interrupcion interna
« Respuesta #1 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.
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado SJD2

  • PIC10
  • *
  • Mensajes: 27
RE: ayuda con interrupcion interna
« Respuesta #2 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; }
   }
}


Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: ayuda con interrupcion interna
« Respuesta #3 en: 03 de Marzo de 2006, 17:45:00 »
Me alegro que hayas solucionado tu problema.

Saludos Giño
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)