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
Tags:
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!
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por