Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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

hehehe... Sim, eu tinha colocado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha,se funcionar com "!",sem ele também funcionaria(ao contrario).Tem certeza que modificou apenas isto?

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






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

×