Fala pessoal blz?

Estou com a cabeça quente já de tentar entender como funciona as interrupções no pic. Estou com a seguinte questão preciso monitorar a serial, mas se o usuário apertar algum botão (no caso 2), parar de monitorar a serial e realizar a função.


E não estou conseguindo alguém pode ajudar?

Acredito que o código está correto mas não consegui ainda entender como definir as portas B7 e B6 como interrupção.

Segue o código:

#include <16f628a.h>
#use delay (clock=4000000)
#fuses HS,NOWDT,PUT,NOLVP,XT,NOPUT,NOPROTECT,NOBROWNOUT
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,errors,stream=pc)


#int_ext
void direita ()
{
   /*Abre para a direita */
   if(!input_state(pin_b7))
      output_high(pin_a2);
}


#int_ext1
void esquerda ()
{
      
   /*Abre para a Esquerda */
   if(!input_state(pin_b6))
      output_high(pin_a3);   

}


void main (void)
{
   
   enable_interrupts(direita); //só um pino causará interrupção B7
   enable_interrupts(esquerda); //só um pino causará interrupção B6
   enable_interrupts(GLOBAL); //habilitando todas as interrupções

   
   char dir; //variaveis de controle das lampadas
   int opc; //variaveis de controle dos motores e switch-case
   
   opc=0;

  while(true){
      
      while(!kbhit()); //aguarda até que seja recebido um dado na porta serial
      dir=getc();   //armazena em c o caracter recebido na porta serial
      
       //Direita
      if (dir == 'd') //Abre janela
      opc=1;
      else if (dir == 'e') // fecha janela
      opc=2;
      
      
      switch(opc)
      {  
         case 1:     //Liga SALA
         output_high(pin_a2);
         delay_ms(100);
         break;
         
         case 2:     //Desliga SALA
         output_low(pin_b3);
         delay_ms(100);
         break;
      }
   
   } // Fim do While True

}//Fim do Void

Exibições: 1691

Responder esta

Respostas a este tópico

Qual compilador você esta usando?

CCS

Tem que avisar a ele que você está usando a interrupção externa

enable_interrupts (INT_EXT);// precisa colocar o nome da interrupção aqui e não da função

enable_interrupts (INT_EXT1);/ precisa colocar o nome da interrupção aqui e não da função

ext_int_edge(L_TO_H ou H_TO_L); Define se é por borda de descida ou subida a interrupção

 

Experimente lá se der certo é isso.

 

Certo,

Vou testar hoje a tarde e dou um retorno, mas a duvida é:

como defino os botões para interupção, tipo no exemplo estou usando o b6 e b7

Cara,

testei este fim de semana e com os botões que está sendo usando no circuito nem com reza está indo. E não achei nada de como definir o botão que desejo que acione a interrupção

Então estava olhando o datasheet do PIC16F e ele tem uma única interrupção.

Quando vc define a interrupção ele vai usar o pino pré-definido para isso que no caso do seu chip é o RB0.

Talvez por isso não esteja funcionando.

Qualquer coisa vamos conversando.

André,


Já tinha visto isso também, achei que seria possivel adicionar mais de uma interrupção, e sem ser no pino b0.

Ai já não seria interrupção você teria que estar olhando o estado do pino via sw no programa principal rodando verificação e assim que ocorre a transição você chama o bloco de função que você deseja.

Do modo acima é rapido como você esta olhando o programa principal fazendo só comparação.

o pin b0 e especial porque o timer fica rodando de fundo e você não se preocupa com ele.

Desculpe a ignorancia mas o que é:

SW?

que é isso!!!

é abreviação de software!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço