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.
Entre para seguir isso  
geekionizado

[Resolvido] Verificar botão com PIC e mikro C

Recommended Posts

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!

Editado por geekionizado
erro de digitação

Compartilhar este post


Link para o post
Compartilhar em outros sites

se alguém conseguir solucionar só com isso de dados de entrada, este alguém é o chuck norris. informações insuficientes. poste todo o cód.

de nada.

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • 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)

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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!

    Editado por Bcpetronzio
    Unir Post seguidos em menos de 24 horas, use a opção editar

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Eu ainda nao li o seu codigo.. mas teria como você postar o circuito?

    Abs

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Novamente, antes de olhar o codigo. Como estão os seus fuses? voce desativou o MCLR? Se voce não o desativou você precisa colocar um resistor (pode ser de 10k) ligado ao VCC nele.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Desativei o MCLR sim, o código tá rodando normal, menos o botão que não tá funcionando (adicionei no código uma função para apagar o LED quando apertar, só pra testar)

    Compartilhar este post


    Link para o post
    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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Visitante
    Este tópico está impedido de receber novos posts.
    Entre para seguir isso  





    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

    ×