Ir ao conteúdo
  • Cadastre-se

PIC Interrupção em microcrontroladores pic 18f


Posts recomendados

Oi gente , então , sou nova em programação e estou tendo dificuldades em criar um interrupção no microcrontrolador pic 18f . Eu quero que o programa , quando apertar o botão , um led acenda e quando aperta de novo, o mesmo botão  o outro led acende , isso infinitamente . 

Fiz isso porém não esta acendendo os led nos Proteus .

me ajudem pf 

 

bit control=0;
  
 void interrupt(){
  {
    if (RB1_bit == 0 )
    {
    control = control + 1;
     delay_ms(200);

    if (control == 4)
    control = 1;
    }

   if( control == 1)
    {
     LATB2_bit = 1;
     LATB3_bit = 0;
     LATB4_bit = 0;
     delay_ms(100);
    }
     if(control == 2)
     {
     LATB2_bit = 0;
     LATB3_bit = 1;
     LATB4_bit = 0;
       delay_ms(100);
    }
     if(control == 3)
     {
     LATB2_bit = 0;
     LATB3_bit = 0;
     LATB4_bit = 1;
      delay_ms(100);
       INT0IF_bit=0;

   }
 }
 void main(){
   TRISA = 0x00;
   PORTA = 0x00;
   TRISB = 0xFF;
   PORTB = 0x00;
   
   GIE_bit = 0x01;      //Habilita a interrupção global
   PEIE_bit = 0x00;     //Desabilita a interrupção por periféricos
   INT0IE_bit = 0x01;     //Habilita a interrupção externa
   INTEDG0_bit = 0x00;   //Configura a interrupção por borda de descida
   INF0IF_bit = 0;
   RBIE_bit = 1;
   
   while(1){

   
   }}

Link para o comentário
Compartilhar em outros sites

@aphawk

18 minutos atrás, aphawk disse:

 

Ah okk, olha eu fiz desse jeito ! Eu mudei também a programação porque acho que aquela realmente nao estava certa , dei uma estudada e cheguei nessa , mas novamente não deu certo no proteus.

 programação que estou usando agora:

 

bit control;

void interrupt()
{
   if(INT0IF_bit)               //Houve a interrupção externa?
   {                            //Sim..
       control = ~control  ;    //Inverte o estado da variável de controle

      if(control == 1) RA1_bit = 0x01; //Se control igual a 1, acende o led vermelho
      if(control==2) RA0_bit = 0x01 ;
      INT0IF_bit = 0x00;

    }

}
void main()
{
   GIE_bit = 0x01;        //Habilita a interrupção global
   PEIE_bit = 0x00;       //Desabilita a interrupção por periféricos
   INT0IE_bit = 0x01;     //Habilita a interrupção externa
   INTEDG0_bit = 0x00;    //Configura a interrupção por borda de descida

   TRISA = 0x00;          // RA0 e RA1 serão saída digital
   TRISB = 0x01;
   TRISE= 0x00;           // Todo PORTB será entrada digital
   PORTA = 0;             // RA0 e RA1 iniciam em low
   PORTB = 0;             // Iniciando em high

   control = 0x00;       // Variável de controle inicia em zero

   while(1)
   { 


   }

}

 

image.thumb.png.3e0e7ea07572667143fa8e95dc72ae78.png

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Míga... precisa mesmo ser por interrupt? Se não olha isso...

PORTA=0b10;
for(;;)
{
while(RB0); //espera apertar
while(!RB0); //e soltar o botão
PORTA^=0b11; //inverte apenas RA1 e RA0
}

um minimalismo extremo pra esta entrada:

"programa , quando apertar o botão , um led acenda e quando aperta de novo, o mesmo botão  o outro led acende , isso infinitamente"
 

Se insistir na sua interrupt, observe o que obervei do seu fonte:

 

 control = ~control  ;    //Inverte o estado da variável de controle

      if(control == 1) RA1_bit = 0x01; //Se control igual a 1, acende o led vermelho
      if(control==2) RA0_bit = 0x01 ;
      INT0IF_bit = 0x00;

 

control é binário.. vai ser 0 e 1 e não 1 e 2.

RA0 e RA1 uma vez acionados, ficam em 1 pra sempre. Ah sim, só pra constar, sou phd em pisca leds 😁

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Isadora Ferraz Então estava tentando fazer em interrupção porque meio que foi uma "lição de casa " para eu tentar fazer de minha faculdade , mas estou tendo muito dificuldade , sou nova nisso e to levando uma porrada kkk . E pelo o que você me mandou , acho que do seu jeito não ocupa muito espaço né?! Eu usarei esse mesmo comando junto com outros varios para esse mesmo microcontrolador ( mudarei as telas de um oled , ai esse "exercicio " seria a base para a mudanca de telas , ai para eu começar a aprender , essa era a lição)  , ai , eu pensei que a interrupção seria a melhor opção.

E desse jeito que você fez , ficaria assim , certo :

 

void main()
{


   TRISA = 0x00;          // RA0 e RA1 serão saída digital
   TRISB = 0x01;
   TRISE= 0x00;           // Todo PORTB será entrada digital
   PORTB = 0;             // Iniciando em high

  PORTA=0b10;
for(;;)
{
while(RB0); //espera apertar
while(!RB0); //e soltar o botão
PORTA^=0b11; //inverte apenas RA1 e RA0
}
}

 

 

Fiz assim , copilei , mas o led RA1 ja começa acesso , e quando aperto o botão não acontece nada .

Realmente , não da para fazer esse tipo de programa usando a interrupção ?! 

Obrigada 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Achei que você queria apenas piscar os leds. Sim com interrupcao fica mais profissional e elegante. E acho que você tem que habilitar isso... PEIE_bit = 0x01;       //Habilita a interrupção por periféricos

tanto como fazer as correcoes que lhe propuz

 

Mas primeiro você deve fazer piscar os leds de qualquer maneira... mesmo que seja a minha...😁

Tenta: PORTB=1;// inicia em 1

e talvez o PORTA seja compartilhado com comparador (ou outro periferico). Tenta no inicio CMCON=0xff;

Tambem estes pinos podem ser apenas entrada ou open colector (ou open drain) que nao permite saida em 1. Tenha o datasheet do lado. The book is on the table? Eh.. tem que saber inglês. Ou escolha outros pinos ou coloque pullup. Google it.

 

e presttencao...

TRISE= 0x00;           // Todo PORTB será SAIDA digital

Ainda nao deu? Apele com algo como

for(;;)
{
while(RB0); //espera apertar
while(!RB0); //e soltar o botão
PORTA=0b01; //

while(RB0); //espera apertar
while(!RB0); //e soltar o botão
PORTA=0b10; //
}

 

Se consegue fazer um led piscar, consegue dominar o mundo!

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Isadora Ferraz

é então kkk , agora é apenas os leds mudando , dps é o oled kkk, mas ta complicado de rodar isso aqui . 

fiz desse jeito , sem a interrupção la em cima, no meu microc so ta assim:

obs: tentei colocar o CMCON , eu ja tentei outras vezes usa-lo ,mas não foi . ja vi usando esse na familia 16f , acho que na 18f não da, não colocando ele copila certo. 

ah e aquele TRISE eu so tinha colocado ele porque tinha visto em um video ,e como meu programa não tava funiconando , achei que ele ajudaria, mesmo não achando ele necessário.

void main()

{
   TRISA = 0x00;
   TRISB = 0x01;
   PORTB = 1;
   ANSEL1_bit =0;
   ANSEL10_bit=1;
  PORTA=0b10;
  for(;;)
{
while(RB0); //espera apertar
while(!RB0); //e soltar o botão
PORTA=0b01; //

while(RB0); //espera apertar
while(!RB0); //e soltar o botão
PORTA=0b10; //
}

}

 

 Novamente o led RA1 comeca acesso é o botão não faz nada . 

eu ja fiz uma vez um programa( usando os mesmo pinos)  sem a interrupção , os leds piscaram certinho , quando abertava um botão , um acendia , abertava  de novo , um apaga e outro acende , e assim varias vezes .Ai li que usando as interrupções seria melhor , vi varias aulas e cheguei nisso. 

 

Com a interrupção coloquei assim , esse eu realmente não sei se esta correto , mas creio que seria assim . 

Copilou certo , mas nenhum led acende ainda.

 

 
 void interrupt(){

{  PORTA=0b10;
  for(;;)
while(RB0); //espera apertar
while(!RB0); //e soltar o botão
PORTA=0b01; //

while(RB0); //espera apertar
while(!RB0); //e soltar o botão
PORTA=0b10; //
}

   }

 void main()
 {

 GIE_bit = 1; // habilita  a interrupção global
 PEIE_bit = 1; // habilita a interrupção dos perifericos
 INT0IE_bit = 1; // habitilia a interrupção extrena
 TNTEDG0_bit = 0; // alterar o hardware ( configurar a borda de decida )
 
 void main()

{
   TRISA = 0x00;
   TRISB = 0x01;
   PORTB = 1;
   ANSEL1_bit =0;
   ANSEL10_bit=1;

 
 while (1)
 {
  }
  }

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Infelizmente seu programa conceitual da interrupção está equivocado. Não consigo te explicar agora. A dica que dou é verifique o circuito pra funcionar com aquilo que te passei. P.ex.: verifique reset, alimentação, cristal e a configuração dos fuses no programa.

Ah sim... a qualquer momento tento simular e te mostro ok?

 

Também te encorajo a dar uma olhadela na plataforma arduína: a ideal pra sua ... idade... crítica construtiva inofensiva ok?

Link para o comentário
Compartilhar em outros sites

@Isadora Ferraz Okk , vou tentar de novo, conferir tudo. 

                            Obrigada , dps volto aqui , com certeza haha  

Ah eu uso Arduíno também , mas para esse projeto em especifico , preciso usar esse microcontrolador, mesmo assim obrigado de novo . 

Link para o comentário
Compartilhar em outros sites

@Isadora Ferraz juro que tentei fazer o seu varias vezes , olhando datasheet do componente, não consegui ! Fiz de outro jeito que ja tinha vista usando o control, foi por isso que tentei usar o control na interrupção, antes , porque achei que daria certo.

obs: por que você usa o while daquele  jeito no seu exemplo ? 

 

#define S1     RB1_bit
 #define led1 LATB2_bit
 #define led2 LATB3_bit
 #define led3 LATB4_bit

int control = 0;

 void main()

 {

    ANSEL8_BIT=0;
    ANSEL9_BIT=0;
    TRISB1_bit=1;
    TRISB2_BIT=0;
    TRISB3_BIT=0;
    TRISB4_BIT=0;
    PORTB=0;
    LATB=0;

 while(1)
    {
    if (RB1_bit == 0 )
    {
    control = control + 1;
     delay_ms(200);
     
    if (control == 4)
    control = 1;
    }
    
   if( control == 1)
    {
     LATB2_bit = 1;
     LATB3_bit = 0;
     LATB4_bit = 0;
     delay_ms(100);
    }
     if(control == 2)
     {
     LATB2_bit = 0;
     LATB3_bit = 1;
     LATB4_bit = 0;
       delay_ms(100);
    }
     if(control == 3)
     {
     LATB2_bit = 0;
     LATB3_bit = 0;
     LATB4_bit = 1;
      delay_ms(100);
  }

   }}

  

e minha interrupção esta assim:

bit control;

void interrupt()
{
   if(INT0IF_bit)
   {
       control = ~control  ;

      if(control == 1) RB1_bit = 0x01;

      if(control==1) RB0_bit = 0x01 ;

      INT0IF_bit = 0x00;

    }

}
void main()
{
   GIE_bit = 0x01;        
   PEIE_bit = 0x01;       
   INT0IE_bit = 0x01;     
   INTEDG0_bit = 0x00;    
   INTEDG1_bit = 0x00;
   TRISA = 0x01;          
   TRISB = 0x00;

   PORTA = 1;
   PORTB = 0;
   control = 0x00;

   while(1)
   {


   }

}

 

eu realmente não sei onde estou errando ( varias vezes por sinal, no que você me mandou e no que estou fazendo ) 

e queria entender isso. Pesquisei bastante e parece que não estou saindo do lugar . você por acaso sabe algum curso ou sei la aulas que podem me ajudar no estudo de microcontroladores pic?!

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Que surra surreal de um led mixuruco hein?.. kk

 

Pra ver o led piscar (e me liberar) faça algo como...

unsigned int _temp=10000; //altere pra ver
for (;;)
{
PORTA^=0xff;
PORTB^=0xff;//alguém
PORTC^=0xff;//tem 
PORTD^=0xff;//que
PORTE^=0xff;//piscar
PORTF^=0xff;//pow!
while (_temp--);
_temp=10000;//altere pra ver...
}

Se setou o hw certinho, não tem como não dar certo. Se não deu, hás de analisar seu circuito mesmo que virtual. Dica: coloque o led como "digital" em sua "propriedade" e conecte direto no pino... só pra simular, claro.

 

E me lembrei vagamente.. no mplab antigo tinha um tal analisador lógico ou do gênero... algo como logic analiser (the book is on the table?) ou algo assim. Nele dava pra ver os sinais dos pinos e +1 mondcoiz

 

😁

Sobre interrupt, setup do hw, fuses e etc, hás de ler o d.s. do seu mc.

 

  • Curtir 1
  • Haha 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!