DESABILITANDO INTERRUPÇÃO EM EXECUÇÃO

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

DESABILITANDO INTERRUPÇÃO EM EXECUÇÃO

Mensagempor LEONARDO » 13 Dez 2013 13:33

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:
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();
         }
   }      
}
LEONARDO
Bit
 
Mensagens: 7
Registrado em: 21 Out 2007 11:45
Localização: BRASIL

Re: DESABILITANDO INTERRUPÇÃO EM EXECUÇÃO

Mensagempor ze2 » 13 Dez 2013 14:15

este negócio de alta e baixa prioridade me lembro que demorei a entender no passado. precisava comunicar via serial com o sistema multiplexando displays, leds, relés ,teclas, matriz de leds. mó confusão. mas deu certo. este recurso foi uma mão na roda. mas é o kiko? bom, talvez voce não precise dele por enquanto. e se voce deixar apenas uma interrupção "normal" e avaliar qual pino mudou de nível ou melhor qual int (1 ou2) foi acionada e desviar pra rotina correspondente? sei lá. precisando tomar uma amélia (cachaça mais acólica do que absinto). contagem regressiva! uma super sexta 13 pro 6.
ah sim, a falta de alcool não me permitiu analisar seu código com profundidade. sorry.
ze2
Byte
 
Mensagens: 193
Registrado em: 09 Fev 2009 13:37

Re: DESABILITANDO INTERRUPÇÃO EM EXECUÇÃO

Mensagempor vtrx » 13 Dez 2013 15:22

Use a interrupção para ver o estado do botão,e deixa as rotinas relacionadas ao LCD dentro do Looping(While).
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Re: DESABILITANDO INTERRUPÇÃO EM EXECUÇÃO

Mensagempor andre_luis » 13 Dez 2013 16:36

Voce colocou atrazos de 1s dentro de um loop, e também dentro do tratamento dessa interrupção...

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x