Ir ao conteúdo
  • Cadastre-se

Botão com lógica invertida


wBB

Posts recomendados

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?

Link para o comentário
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);

 

Link para o comentário
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!

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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...