Hola a todos. Escribía porque me ha surgido un problema con estas interrupciones (INT1 E INT2). Paso a contarles:
Tengo 4 botones en RB1 RB2 RB4 yRB4. Uso estos botones para controlar al pic y su LCD, los botones son básicamente:
ATRÁS MENU ENTER ADELANTE
y sirven para manejar un menú. Todo venia bien, las 4 interrupciones funcionaban, hasta que le coloque el LCD(128x64). La INT0 la uso como RX de una futura uart virtual, ya que este micro tiene 2 uart y necesito 3. Lo que sucede es que cuando presiono el botón ATRAS (INT1) la interrupción INT1 se ejecuta satisfactoriamente, pero inmediatamente entra a la interrupción INT2 (aclaro que bajo la bandera al salir de cada interrupción). Si presiono cualquier otro boton todo funciona bien, el conflicto seria la INT2 (RB2) . Si retiro el LCD esto deja de suceder y funciona bien. La verdad que debo estar pasando algo por alto, pero no me doy cuenta. A continuación les dejo el programa:
#include <18f46k80.h> //PIC A UTILIZAR
#fuses HSH,NOWDT, NOPUT,NOPLLEN //CRISTAL
#use delay(clock=10000000) //A 20MHZ
#include <glcd.c> //INCLUIMOS GLCD.C DE PICC
#include<stdlib.h>
#include<stdio.h>
#use rs232(baud=9600,xmit=PIN_D5,rcv=PIN_B0,stream=Serie3)
#use rs232(baud=9600,xmit=PIN_D6,rcv=PIN_D7,stream=Serie2)
#USE FAST_IO (A)
#USE FAST_IO (D)
#USE FAST_IO (c)
#USE FAST_IO (b)
//----------------------------DEFINICION DE CONSTANTES-----------------
//---------------------------------DECLARACION DE VARIABLES-------------------------
int Estado=E0;
char Accion=0;
char c=0;
char texto1[20];
char cambio_estado=1;
main()
{
//-----------------------------------CONFIGURACION DE INTERRUPCIONES------------------------
DISABLE_INTERRUPTS(global);
ENABLE_INTERRUPTS(INT_EXT);
CLEAR_INTERRUPT(int_ext);
EXT_INT_EDGE(0,H_TO_L);
ENABLE_INTERRUPTS(INT_EXT1);
EXT_INT_EDGE(1,L_TO_H);
CLEAR_INTERRUPT(int_ext1);
ENABLE_INTERRUPTS(INT_EXT2);
EXT_INT_EDGE(2,L_TO_H);
CLEAR_INTERRUPT(int_ext2);
ENABLE_INTERRUPTS(INT_RB5);
ENABLE_INTERRUPTS(INT_RB4);
CLEAR_INTERRUPT(int_rb);
//-----------------------------------CONFIGURACION DE ENTREDAS/SALIDAS DIGITALES--------------------------
SET_TRIS_A( 0x00 ); //0b
SET_TRIS_D( 0x80 ); //0b10000000
SET_TRIS_C( 0x00 ); //0b
SET_TRIS_B( 0x37 ); //0b00110111
glcd_init(ON); // iniciamos la lcd
glcd_fillScreen(OFF); //LIMPIAMOS LA PANTALLA
output_high(PIN_B3);
ENABLE_INTERRUPTS(global);
sprintf(texto1 "COMENZANDO...");
glcd_text57(0,10,texto1,2, ON);
delay_ms(3000);
while(1)
{
delay_ms(500);
fprintf(Serie3,"%i ",Estado);
}
}
}
#INT_EXT
void rx3()
{
c=getch();
fprintf(Serie3,"");
CLEAR_INTERRUPT(int_ext);
}
#INT_EXT1
Bot_Atras()
{
Accion=ATRAS;
// cambio_estado=1;
Maquina_Estados();
CLEAR_INTERRUPT(int_ext1);
}
#INT_EXT2
Bot_Menu()
{
Accion=MENU;
// cambio_estado=1;
Maquina_Estados();
CLEAR_INTERRUPT(int_ext2);
}
#INT_RB
Bot_Ent_Adelante()
{
if(input(PIN_B4))
{
Accion=ENTER;
// cambio_estado=1;
Maquina_Estados();
CLEAR_INTERRUPT(int_rb);
}
if(input(PIN_B5))
{
Accion=ADELANTE;
// cambio_estado=1;
Maquina_Estados();
CLEAR_INTERRUPT(int_rb);
}
CLEAR_INTERRUPT(int_rb);
}
Tambien es importante mencionar, debuggueando, puedo ver el puerto PORTB en el momento que entra en las interrupciones, y RB2 no se modifica, sigue en 0 siempre.
La dispocicion de patas del LCD es la siguiente
CS1----PIN_A0
CS2----PIN_A3
DI-----PIN_C5
RW----PIN_C4
E------PIN_D3
RST---PIN_A2
D0---PIN_D2
D1---PIN_D1
D2---PIN_D0
D3---PIN_C3
D4---PIN_C2
D5---PIN_C1
D6---PIN_C0
D7---PIN_A5
En la pata RB3 esta conectada un resistencia de 1K a la base de un transistor para manejar el BackLight.
Espero que puedan ayudarme, para mi es raro lo que sucede pero tal ves hay algo que no estoy teniendo en cuenta....POR FAVOR AYUDAAAA!!
MUCHAS GRACIAS DE ANTEMANO
SALUDOS!