Ir ao conteúdo
  • Cadastre-se
Israel Teixeira

Ajuda interrupção externa pic18f4550

Recommended Posts

O programa funciona da seguinte forma: Fica piscando um led (RA0), e ao apertar o botao (RB5) é executado a função de interrupção, que acende um led (RA1) por 300ms e limpa a flag de interrupção externa, fazendo com que o programa saia da interrupção, mas nao é isso que esta aconcende. Ao apertar o Botao, o led (RA0) deixa de piscar e o led (RA1) acende, mas nao apaga mais, ou seja, o programa nao esta saindo da interrupção.

 

 

 

 

 

void interrupt (){
     PORTA.RA1 = 1;
     delay_ms(300);
     PORTA.RA1 = 0;
     INT0IF_bit = 0;  // Limpa flag de interrupção externa;
}


void main() {

     TRISA = 0x00;
     PORTA = 0x00;

     TRISB = 0xFF;
     PORTB = 0x00;
     
     GIE_bit = 1; //habilita interrupção global
     RBIE_bit = 1; //habilita interrupção na porta RB
     INTEDG0_bit = 1; //interrupção externa INT0 na borda de subida
     PEIE_bit = 0; //desabilita interrupção por periferico
     INT0IF_bit = 0;

     TRISB = 0xFF;
     PORTB = 0x00;

     while(1){
              PORTA.RA0 = 1;
              Delay_ms(200);
              PORTA.RA0 = 0;
              Delay_ms(200);
     }

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

você está usando o mesmo delayms() no loop e na interrupt? compilador não deu um warning qualquer? Bom se ele não deu considere-se dado. Talvez ele fique perdido entre um delay e outro. Ou são funções diferentes Delayms() e delayms()...? credo... confuso. tenta criar outro delay...

 

off topic.. você pode  resumir 1 pouco

 

while(1){
              PORTA.RA0 ^= 1;
              Delay_ms(200);

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim, é o mesmo delay_ms, nao percebi que um estava com letra Maiuscula. Sou novo em programação, e pelo que vi até agora nao faz mal usar delay_ms em varios locais do programa, ainda mais com uma aplicação simples dessa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Claro.. sem problema ao usar em vários locais mas em momentos diferentes. Imagine o seguinte.. o sistema está dentro do delay do loop. O delay usa algumas posições de memória pra seu uso.  De repente é interrompido e chama o delay de novo. Este vai realimentar as mesmas posiçoes de memória com outros valores. Quando voltar da interrupt.. 'cadê meus dados anteriores?' Imagine o nó na cabeça que deve dar no coitado. Mas se seu compilador consegue explicar pro mc como tratar esta recursividade sem xiar, então tudo bem. Problema deles.

 

Ah e desculpe.. de nada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×