Ir ao conteúdo
  • Cadastre-se

Verificar botão com PIC e mikro C


geekionizado

Posts recomendados

Pessoal, estou usando um PIC 12F629 e meu projeto está quase no final, porém não estou conseguindo verificar se um botão foi pressionado.

Eu configurei a porta 0 como entrada e as outras como saída, através do código:

TRISIO = 0x09;

Só não estou conseguindo verificar quando um botão é pressionado!

Se alguém puder me ajudar, ficarei grato. Procurei e achei até uns tópicos daqui mesmo, só que li e não consegui fazer, é diferente do que preciso.

Obrigado!

Link para o comentário
Compartilhar em outros sites

Aqui está:

//Definições

#define botao GPIO.F0

#define led GPIO.F2

#define rele GPIO.F5

#define CHECABIT(endereco_porta,bit) (endereco_porta & (1<<bit))

//Variaveis

int abc = 5; //variáveis sempre devem ser inicializadas

int endereco=0;

int str;

int a;

long b;

//Funções

void desligar() {

rele = 0;

}

void ligar () {

rele = 1;

}

int ler (void) {

int leitura_valor;

leitura_valor = EEPROM_Read(0);

return leitura_valor;

}

int checar(void) {

if(CHECABIT(GPIO,0)) { // <<< bit 0

return(1);

}

else {

return(0);

}

}

void verificar () {

for (b=0; b<10000; b++) {

if (checar()==1) {

led = 0;

Status = 1;

}

delay_ms(1);

}

if (Status==1) {

EEPROM_Write (endereco,1);

ligar();

}

else {

EEPROM_Write (endereco,0);

desligar();

}

}

//Interrupções

void interrupt(){

//o mikroC exige que se teste qual interrupção ocorreu

}

//Startup

void main(){

//Configurações inicias de portas e sem loop

TRISIO = 0x09;

led = 1;

if (ler()==0) {

for (a=0; a<5000; a++ ) {

if (checar()==1) {

led = 0;

ligar();

EEPROM_Write (endereco,1);

str=1;

}

}

} else {

ligar();

}

if (str==0) {

desligar();

} else {

verificar();

}

//Loop

while(1){

led = 0;

ligar();

delay_ms(300);

led = 1;

desligar();

delay_ms(300);

if (checar()==1) {

b = 45000;

vdelay_ms(B);

desligar();

EEPROM_Write (endereco,0);

}

}

}

Obrigado! (esse código atual do botão na função 'checar' não está funcionando)

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

amiguinho, voce não precisa de if (checar()==1). a macro checabit pode ser meio confusa para iniciantes.Tente simplificar para if (botao) se o botão estiver pro vcc ou if (!botao) se ele estiver pro gnd o recomendado. neste caso precisa de um pullup interno ou externo o recomendado. caso não saiba o que é... é um resistor de 10k pro vcc.

sucessos de novo

Link para o comentário
Compartilhar em outros sites

Olá, o resistor eu já estou usando sim.

Então, se eu não me engano, tentei só if (botao) e não deu, mas tentarei pra ver de novo se não é isso mesmo.

Obrigado!

É, tentei e não deu certo mesmo :(

O problema parece ser no software mesmo, já que testei na protoboard e também não funcionou :(

Obrigado!

Link para o comentário
Compartilhar em outros sites

Caro Colega,

Não verifiquei seu código nem seu programa, mas no compilador MikroC há uma função especial para uso de botões, a função Button. Procure no help como aplicá-la, mas acho que é assim: Button(&PORTA,1,2,0) -> Você indica o PORT, depois o número do pino do PORT, depois um fator de tempo que ele vai verificar como pressionado e o ultimo é o estado (valor logico) que estará o pino quando o botão estiver pressionado.

Essa função não elimina o fato de você ter que fazer um debounce em hardware, com um circuito RC, e em software, com uma variável que é incrementada enquanto o botão estiver pressionado e zerada quando o botão é solto. Se esta variável atinge um determinado valor, que você irá verificar, significa que o botão foi apertado.

Espero que tenha ajudado.

Sds

Link para o comentário
Compartilhar em outros sites

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