Ir ao conteúdo
  • Cadastre-se
wBB

Botão com lógica invertida

Recommended Posts

Olá Pessoal.

Mais uma vez estou com uma dúvida que provavelmente é coisa muito boba, com PIC 16F73, mas estou deixando escapar algo.

Eu defini RC4 e RC5 com entradas para botões: ao pressionar um dos dois botões, o pino em questão que estava em nível alto passa a ser aterrado e isso também faz desligar um led no pino RA0; ao soltar o botão o pino volta para nível alto e faz ligar novamente o led do pino RA0.

 

Isso funciona:

#include <16f73.h>
#fuses HS

#use fast_io(A)
#use fast_io(C)
#use delay(clock=8MHz,crystal=8MHz)

void main()
{
    set_tris_a(0x00);
    set_tris_c(0x30);

    while(true){
        if (input(PIN_C4) && input(PIN_C5))  // <<<<====== Isso funciona e o led desliga ao pressionar um dos botões
            output_high(pin_a0);
        else
            output_low(pin_a0);
    }
}

Mas isso não funciona se inverter a lógica. Ao pressionar o botão do pino RC5 (repare no operador "not" em "!input"), aterrando o pino que já estava anteriormente em nível alto, o led deveria ligar.

while(true){
    if (input(PIN_C4) && !input(PIN_C5)) // <<<<====== Isso NÃO FUNCIONA
        output_high(pin_a0);
    else
        output_low(pin_a0);
  }

Qual é o deslize que estou cometendo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

 "!input(PIN_C5)" está certo,problema não é ai.Testa apenas um pino,para reduzir as possiveis causas do problema

 if (!input(PIN_C5)){ //apenas um pino primeiro
        output_high(pin_a0);
 }else{
        output_low(pin_a0);
 }

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

opa!

Deixei habilitado como entrada apenas o pino RC5 e fiz o que você sugeriu. Neste caso, com a condição "!input" como está no código, o led fica ligado direto e, se eu pressionar o botão ele desliga. Perfeito. Porém, se tirar o "not" de "!input", apenas isso, então o led inicia ligado (deveria iniciar apagado) e fica ligado direto mesmo pressionando o botão. Ou seja, a coisa tá estranha....

        set_tris_c(0x20);

        if (!input(PIN_C5))
            output_low(pin_a0);
        else
            output_high(pin_a0);

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, certeza. O código todo ficou conforme indicado abaixo. Com "!" funciona e sem "!" não funciona.

Uma coisa que também notei, não sei se é importante, é que quando não está com "!", apesar de não funcionar como deveria, o led dá um sinalzinho como se fosse de uma leve queda de tensão ao pressionar o botão para aterrar o pino RC5, mas sem apagar totalmente o led.

#include <16f73.h>
#fuses HS

#use fast_io(A)
#use fast_io(C)
#use delay(clock=8MHz,crystal=8MHz)

void main()
{
	set_tris_a(0);
	set_tris_c(0x20);

	while(true){

		//if (input(PIN_C4) && !input(PIN_C5))
		if (input(PIN_C5))
			output_low(pin_a0);
		else
			output_high(pin_a0);
	}
}

 

adicionado 41 minutos depois

@Nao Sei , acabo de resolver, porém não sei porquê estava ocorrendo o problema. Apenas criei um novo projeto, rodei com as quatro combinações possíveis de níveis nos pinos RC4 e RC5, e todas elas funcionaram tal como era de se esperar. Sei lá... imagino que havia algum "lixo" na memória do microcontrolador.

 

Obrigado!

Editado por wBB

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×