Ir ao conteúdo

Interrupção no PIC 16F6284


wildoidao

Posts recomendados

Postado

Fala pessoal beleza?

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

Postado

Bem, as interrupções do PIC são controladas por um registro, nele há um bit que habilita todas as interrupções. O que você deve fazer é: na função que atende o botão, ante de mais nada essa rotina deve zerar esse bit, executar a tarefa e depois setar esse bit, para que as interrupções sejam atendidas.

Postado

Se entendi bem, você deseja monitorar a serial e caso o usuário aperte algum botão, uma funçao é executada. Depois dessa funçao ser executada, volta para o monitoramento da serial.

Seria isso?

Falou

Postado
Se entendi bem, você deseja monitorar a serial e caso o usuário aperte algum botão, uma funçao é executada. Depois dessa funçao ser executada, volta para o monitoramento da serial.

Seria isso?

Falou

Isso mesmo quero monitorar a serial, mas se "apertarem" o botão que vai estar no b6 e b7 realize a função e depois volte a monitorar a serial.

Postado

Preciso de uma ajuda! Tenho um projeto que preciso monitorar a serial e dois botões, pensei usar interrupções mas não vai ser possivel aplicar, pois estou usando o Pic 16f628a e o mesmo possui somente uma interrupção.

Alguém tem alguma sugestão de como conseguir realizar esta tarefa?

Para monitorar a serial uso o comando: Código: [selecionar]

while(!kbhit());

Mas como incluir o monitoramento do botões que estão no b6 e b7?

Postado

Podes usar das interrução externa do PORTB (#int_RB) e incluir os dois testes.


#int_RB
void RB_isr(void)
{
....
if(portb6)....
if(portb7)....
....
}

  • 3 semanas depois...
Postado
Podes usar das interrução externa do PORTB (#int_RB) e incluir os dois testes.


#int_RB
void RB_isr(void)
{
....
if(portb6)....
if(portb7)....
....
}

Cara uma duvida surgiu como fazer isso, ligando fisicamentew os botões e usando diodos para evitar que um acione o outro ou colocar um time e entrar na interrupção de tempos em tempo?

O que me sugere?

Postado

Não se entra nessa interrupção de "tempo em tempo". A interrupção será chamada quando for precionado um dos botões, ao entrar é feito um teste para saber qual botão chamou a interrupção.

Contudo tambem me surgiu uma duvida,,, qual é a ideia concreta???? acho que nem precisas de interrupção se evitares esse ciclo "while(!kbhit()); ". Prefira:


while(1){
if(kbhit()){
//FUNÇÃO PARA SERIAL
}

if(input(pin_b6)){
//FUNÇÃO PARA RB6
}


if(input(pin_b7)){
//FUNÇÃO PARA RB7
}
}

Postado


while(1){
if(kbhit()){
//FUNÇÃO PARA SERIAL
}

if(input(pin_b6)){
//FUNÇÃO PARA RB6
}


if(input(pin_b7)){
//FUNÇÃO PARA RB7
}
}

Cara,

Seguindo sua logica esbarrei em um problema, continuo ficando preso dentro da serial, não consegui achar uma solução apropriada para conseguir ler tanto a serial como os botões.

Segue o codigo:


#include <16F628A.h>
//#DEVICE ADC=10
#use delay (clock=4000000)
#fuses HS,NOWDT,PUT,NOLVP,XT,NOPUT,NOPROTECT,NOBROWNOUT
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1,errors,stream=pc)

void Fecha_janela()
{
output_high(pin_a0); //Acende Led indicando direção
output_low(pin_a1); //Apaga Led indicando direção
output_high(pin_b4); //Liga o motor
}

void Abre_janela()
{
output_high(pin_a1); //Acende Led indicando direção
output_low(pin_a0); //Apaga Led indicando direção
output_high(pin_b5); //Liga o motor
}



void main (void)
{
char dir,motor;

while (true)
{

if(!input_state(pin_b0))
{
// FECHA A JANELA - BOTÃO
if ((!input_state(pin_a3))||(input_state(pin_b6)))
output_low(pin_b4);
else
{
Fecha_janela();
fprintf(pc,"F\n");
delay_ms(150);
}

//ABRE A JANELA - BOTÃO
if((!input_state(pin_a4))||(input_state(pin_b7)))
output_low(pin_b5);
else
{
Abre_janela();
fprintf(pc,"A\n");
delay_ms(150);
}

if(kbhit()) //Rotina da Serial
{
dir=getc();

if(dir == 'A'); //Abri a janela pelo PC
{
motor = input_state(pin_b7);

while(motor!= 1)
{
output_high(pin_b5);
motor = input_state(pin_b7);
}
if(motor == 0)
output_low(pin_b5);
}

if(dir == 'F');
{
motor = input_state(pin_b6);

while(motor!=1)
{
output_high(pin_b4);
motor=input_state(pin_b6);
}
if(motor==0)
output_low(pin_b4);

}

} // Fim da Serial
} //Fim do sensor de chuva
else
{
while(!input_state(pin_b6))
{
output_high(pin_b4); //Liga o motor
}
output_low(pin_b4);
}
}
}

E valeu pela ajuda!

Postado

voce ja tentou testar a comunicação a parte??

O teu programa não tem nenhum comando de configuração do PIC. voce deve configurar o RC7 como entrada (Rx da serial). Isso deve resolver o problema

Podes tambem adicionar o TIMEOUT na inicialização do RS232. Isso não resolve nada na comunicaçao, mas se houver uma falha o PIC nao fica parado por muito tempo....

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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!