DESABILITANDO INTERRUPÇÃO EM EXECUÇÃO

Boa Tarde a todos !
Eu escrevi um código para o PIC18F4550 que imprime uma string no LCD 2x16 e que se movimenta da direita para esquerda e da esquerda para direita de acordo com os botões pressionado S1 e S2. Eu habilitei as interrupçõe externas INT1 e INT2.
Quando eu pressiono o botão S1 o programa desvia a execução para rotina de tratamento de interrupção (ISR) conforme esperado. No entanto quando eu pressiono o botão S2, ele não sai rapidamente da rotina em execução como esperado, ele leva algum tempo e depois sai.
Segue abaixo o código:
Eu escrevi um código para o PIC18F4550 que imprime uma string no LCD 2x16 e que se movimenta da direita para esquerda e da esquerda para direita de acordo com os botões pressionado S1 e S2. Eu habilitei as interrupçõe externas INT1 e INT2.
Quando eu pressiono o botão S1 o programa desvia a execução para rotina de tratamento de interrupção (ISR) conforme esperado. No entanto quando eu pressiono o botão S2, ele não sai rapidamente da rotina em execução como esperado, ele leva algum tempo e depois sai.
Segue abaixo o código:
- Código: Selecionar todos
void ISR_sentido_ESQ(void); //Protótipo da função
#pragma code int_baixa=0x08 // Vetor de interrupção de alta de prioridade, ou padrão
void int_baixa(void)
{
_asm GOTO ISR_sentido_ESQ _endasm; // Desvia o programa para a função ISR_alta_prioridade
}
#pragma code
#pragma interrupt ISR_sentido_ESQ
void ISR_sentido_ESQ(void)
{
cont=16;
for (cont=16; cont>0; cont--)
{
lcd_posicao(1,cont);//Desloca o cursor para a primeira coluna da primeira linha.
imprime_string_lcd("ENGENHARIA");//Imprime uma string no display.
Delay10KTCYx(1000);// Gera atraso de 1 segun(250*25000*0,16us = 1 segundo)do
lcd_limpa_tela();
}
for (cont=16; cont>0; cont--)
{
lcd_posicao(2,cont);//Desloca o cursor para a primeira coluna da segunda linha.
imprime_string_lcd("ENGENHARIA");//Imprime uma string no display.
Delay10KTCYx(1000);// Gera atraso de 1 segundo
lcd_limpa_tela();
}
INTCON3bits.INT1IF=0;
INTCON3bits.INT2IF=0;
}
void gera_atraso_segundos(unsigned char atraso){
do{
Delay10KTCYx(20*Fosc/4); //Gera um delay de 0,2 segundos;
Delay10KTCYx(20*Fosc/4); //Gera um delay de 0,2 segundos;
Delay10KTCYx(20*Fosc/4); //Gera um delay de 0,2 segundos;
Delay10KTCYx(20*Fosc/4); //Gera um delay de 0,2 segundos;
Delay10KTCYx(20*Fosc/4); //Gera um delay de 0,2 segundos;
atraso--;
}while(atraso>0);
}
void main (void)
{
TRISA=0b00011111; //RA0 a RA4 – entrada e RA5 a RA6 - saída
TRISB=0b11111111; //TODOS OS PINOS DA PORTA B COMO ENTRADA
TRISC=0b10111111; //RC0 a RC5 e RC7 – entrada e RC 6 - saída
TRISD=0b00000000; //RD0 e RD7 - saída
TRISE=0b00000000; //RE0 e RE2 – saída
PORTB=0x00;// Coloca a porta B em 0v.
PORTD=0X00; //Coloca a porta D em 0v.
PORTE=0X00; //Coloca a porta E em 0v.
lcd_inicia(0x28,0x0e,0x06); //Inicializa o display LCD alfanuméricos com 4 linhas de dados.
// //******************* INTERRUPTÇÃO EXTERNA 1 ************************//
INTCON2bits.INTEDG1=1; // Interrupção externa INT1 na borda de subida
INTCON3bits.INT1IF=0; // Limpa o flag bit da interrupção externa INT2
INTCON3bits.INT1IP=0; // Baixa prioridade
INTCON3bits.INT1IE=1; // Habilita a interrupção externa INT1(RB1)
//
// //******************* INTERRUPTÇÃO EXTERNA 2 ************************//
INTCON2bits.INTEDG2=1; // Interrupção externa INT2 na borda de subida
INTCON3bits.INT2IF=0; // Limpa o flag bit da interrupção externa INT2
INTCON3bits.INT2IP=0; // Baixa prioridade
INTCON3bits.INT2IE=1; // Ativa a interrupção externa INT2(RB2)
// INTCONbits.RBIF=1; //Ativa interrupção por mudança de estado lógico.
RCONbits.IPEN=0; //Desabilita interrupção com nível de prioridade. Endereço 0x08 - alto e 0x18 - baixo
INTCONbits.GIE=1; // Habilita todas as interrupções de alta prioridade
INTCONbits.PEIE=1; // Habilita todas as interrupções de baixa de prioridade.
/// *************************** Loop principal **************************************
while(1)
{
cont=1;
for (cont=1; cont<16; cont++)
{
lcd_posicao(1,cont);//Desloca o cursor para a primeira coluna da primeira linha.
imprime_string_lcd("ENGENHARIA");//Imprime uma string no display.
Delay10KTCYx(1000);// Gera atraso de 1 segundo (250*25000*0,16us= 1 segundo)
lcd_limpa_tela();
}
for (cont=1; cont<16; cont++)
{
lcd_posicao(2,cont);//Desloca o cursor para a primeira coluna da segunda linha.
imprime_string_lcd("ENGENHARIA");//Imprime uma string no display.
Delay10KTCYx(1000);// Gera atraso de 1 segundo
lcd_limpa_tela();
}
}
}