Ir ao conteúdo

Ajuda com programa (II)


heliosouza

Posts recomendados

Postado

Novamente, venho pedir auxilio aos mais experientesque eu na area de programação.

Meu problema é o seguinte:

No circuito abaixo, os botões 1 , 2 e 3 são entradas.

Quando eu aciono o botão 1, queria que os botões 2 e 3 ficassem inativos sem bloquear o resto do programa.

semttulounu.png

Já tentei alguma coisa por aqui, mas não consegui...

Alguém?

Postado

Olá jovem,

Não sei como você construiu o seu programa, e seria interessante que o postasse, mas tive uma ideia aqui.

Como são 3 botões, crie 3 flags (variáveis do tipo boolean), um para cada botão. Antes da leitura do estado de cada botão, você pergunta se o flag == 1 (bloqueando a leitura) ou == 0 (permitindo a leitura).

Postado

Obrigado pela ideia.

O que consegui até agora foi isto:

#include <16F628A.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=4000000)

#define bt1 pin_a0
#define bt2 pin_a4
#define bt3 pin_b2
#define led1 pin_b6
#define led2 pin_b4


int a=0;
int b=0;
int c=0;



void main()
{

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);


While(true)
{

if(input(bt2))
{
output_high(led1);
b=1;
}
else
{
output_low(led1);
b=0;
}


if(!input(bt3))
{
output_high(led2);
c=1;
}
else
{
output_low(led2);
//c=0;
}

if(input(bt1))
{
a=1;
}
else
a=0;

while((a==1)&(b==1))
{
output_low(led1);
output_low(led2);
}




}
}

Com esse programa, consigo desativar os botões 2 e 3, apertando o botao 1.

O problema é que quando eu solto o botao 1, os outros dois não funcionam mais...

Mais alguma ideia?

Postado

Hum...

Entendi melhor o que você está querendo.

Neste caso,não precisa de uma variável de memória. O ultimo while do seu código também não é necessário.

O código ficaria assim:

#include <16F628A.h>

#FUSES NOWDT //No Watch Dog Timer

#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)

#FUSES NOPUT //No Power Up Timer

#FUSES NOPROTECT //Code not protected from reading

#FUSES NOBROWNOUT //No brownout reset

#FUSES NOMCLR //Master Clear pin used for I/O

#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#FUSES NOCPD //No EE protection

#use delay(clock=4000000)

#define bt1 pin_a0

#define bt2 pin_a4

#define bt3 pin_b2

#define led1 pin_b6

#define led2 pin_b4

void main() {

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

setup_timer_1(T1_DISABLED);

setup_timer_2(T2_DISABLED,0,1);

setup_comparator(NC_NC_NC_NC);

setup_vref(FALSE);

While(1){

if(!input(bt1)){

if(input(bt2)) {

output_high(led1);

}else{

output_low(led1);

}

if(!input(bt3)) {

output_high(led2);

}else {

output_low(led2);

}

}else {

output_low(led1);

output_low(led2);

}

}

}

Se o botão 1 é pressionado, apaga os leds.

Os botões só serão lidos se o botão retornar 0, ou seja, se o botão não estiver pressionado.

Este código não impede o funcionamento do restante do seu programa, bastando observar onde colocar.

Postado

Antes de ver seu post, tinha conseguido fazer funcionar com o código:

#include <16F628A.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=4000000)

#define bt1 pin_b0
#define bt2 pin_a4
#define bt3 pin_b2
#define led1 pin_b6
#define led2 pin_b4
#define led3 pin_b3

#int_EXT
void EXT_isr(void)
{
while (input(bt1))
{
if(input(bt2))
output_low(led1);
if(!input(bt3))
output_low(led2);
}
}

void main()
{

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(int_EXT);
EXT_INT_EDGE(L_TO_H);
enable_interrupts(GLOBAL);

While(true)
{

if(input(bt2))
{
output_high(led1);
}
else
{
output_low(led1);
}


if(!input(bt3))
{
output_high(led2);
}
else
{
output_low(led2);
}
}
}

Também testei o seu código e funcionou bem.

No meu caso, usei interrupção externa ligado ao botão 1 (Rb0).

Como disse, estou aprendendo e gostaria de sua opinião sobre o código.

Postado

Parabéns por ter conseguido achar uma solução!!!

Analisei o código e vi um problema.

A interrupção só é chamada quando o botão vai de 0 a 1. Para ajustar você usou um comando while. O problema é que o seu programa vai ficar preso a este while até que a pessoa deixe de apertar o botão1, impedindo que outras partes do seu programa funcionem. Por conta, o programa que você postou não faz o que você queria desde o começo do tópico.

Se quiser usar interrupção, use a interrupção INT_RB que testa se houve variação em certos pinos da porta B, inclusive o RB0. Dentro da rotina de interrupção você testa se o botão retorna 1 ou zero usando if else, não o while que vai travar o programa. Em vez de mandar apagar os leds, você seta uma variável, por exemplo, um int1 a. Se botão1 for 1 você faz a = 0; e se for 0 você faz a = 1;. No main você só lê os botões 2 e 3 se a = 0;

Deu pra ver que o código fica mais complicado usando interrupção, mas é por aí.

Dá uma olhadinha nestes vídeos:

Postado
Parabéns por ter conseguido achar uma solução!!!
Deu pra ver que o código fica mais complicado usando interrupção, mas é por aí.

É, parece que consegui pelo meio mais difícil... (Coisas de principiante)..

Mas a sua ajuda foi importante com os If´s aninhados. Eu sempre me perco com eles e aprendi a usar baseado no seu código.

Vou ver os vídeos que recomendou e, se puder me ajudar com o comando Delay_ms, agradeço.

voce sabe de algum meio de substitui-lo em códigos, afim de não bloquear o programa?

Postado

Sobre os vídeos, é um canal do youtube com alguns cursos, inclusive o de programação em PIC (Programação em C para PIC). Segue link com os cursos:

http://www.youtube.com/user/MrAppleBR/videos?view=1

Sobre substituir o comando de delay, basta configurar um dos timers para temporizar o tempo desejado. Enquanto o timer não estoura (finaliza temporização), o programa rola e você pergunta se o timer estourou usando if. Outra forma de detectar o estouro do timer é justamente usando interrupção, onde você seta uma variável para avisar ao programa que o timer estourou e reseta esta variável no programa principal no código que dependia da temporização para possibilitar o reuso da variável.

Uma das aulas do link sobre PIC fala detalhadamente sobre isso de forma bem simples.

Postado

Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!