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:  
welton_udi

PIC ligar e desligar led por botao , 5 conjuntos de led

Recommended Posts

ola boa noite, sou novato no site , e estou comecando a aprender sobre programacao pic. e estou precisando de fazer um circuito que um botao ao pressionar acenda o led, e ao pressionar novamente apague o mesmo, ate ai consegui, so que no projeto contem 5 botões e 5 leds um para cada. e nao consegui fazer funcionar, se alguem puder me ajudar agradeco muito.

pic 16f628a. 4mhz

 

 

char variavel = 0; //DECLARA UMA VARIÁVEL DE VALOR 0

void main()
{
  TRISB.B0 = 1;//DEFINE O PINO RB0 COMO ENTRADA
  TRISB.B1 = 0;//DEFINE O PINO RB1 COMO SAÍDA
  PORTB.B1 = 0;//DEFINIMOS UM VALOR INICIAL PARA A SAÍDA RB1 0


        while(1)// LOOP INFINITO OU LAÇO INFINITO
  {
        if (PORTB.B0 == 1)// SE O BOTÃO FOI PRECIONADO
    {
    variavel = 1; //INDICA QUE O BOTÃO FOI PRECIONADO
    }
        if( PORTB.B0 == 0 && variavel == 1)//SOLTEI O BOTÃO
     {
        PORTB.B1 =~ PORTB.B1;//INVERTE O ESTADO DA SAÍDA
        variavel = 0;//VARIAVEL RETORNA AO VALOR 0
    }

   }
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

tenta algo como...
 

#define botões (PORTA&0b00011111) //5 botões RA4...0
#define leds PORTB //em RB4...0
//...setup do hw PORTB=saída, PORTA=entrada
while(1)
{
leds^=botões;//só inverte o que estiver em 1
while(~botões);//aperte botão
while(botões);//tira o dedinho do botão (!) ... ou solte o botão (!!)
}

Botões pro vcc com pulldowm 1K ou (-) pro gnd. Claro dá pra inverter se quiser. Tente no proteus. Na prática hás de ser apresentado ao bouncing - repique do botão. Um delay no loop resolve.

 

Digitei sem pensar muito...se é que penso...

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • ola, muito obrigado , infelizmente nao consegui nem com esse codigo ai. obrigado.....

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Que pena. Espero que não tenha feito simplesmente ctrl-c ctrl-v (claro que nao né). A qualquer momento eu faço um teste no proteus. Publique seu esquema com todos os leds e botões.

     

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Olá @welton_udi fiz um micro ajuste e  funcionou sim:
     

    #include <pic.h>
    __CONFIG( CP_OFF  &  FOSC_INTOSCIO & PWRTE_ON &  WDTE_OFF   & BOREN_ON & MCLRE_OFF & LVP_OFF);
    
    #define botões (PORTA&0b00011111)
    #define leds PORTB
    
    void main (void)
    {
    TRISA=0b11111111;//botões
    TRISB=0x00;//leds
    CMCON=0xff;//entradas digitais
    
    for(;;)
    {
    leds^=botões;//só inverte o que estiver em 1
    while(botões);//aperte botão
    while(!botões);//tira o dedinho do botão (!) ... ou solte o botão (!!)
    }
    
    }

    Anexo projeto completo com simulação e etc. Adapte pro teu compilador.

    abç

     

    Pisca5leds.zip

    pisca5leds.png

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • muitiiisssimo obrigado,tava estudando um pouco mas e muito complicado rsrsr. o tem muito comando dificeis de interpretar, obrigado..

    obrigado.

     

    adicionado 1 minuto depois

    @Isadora Ferraz  deixa ti fazer mais uma pergunta, o arquivo .hex tem alguma forma de eu ler ele? tipo abrir no proteus pra ver os comandos. eoutra coisa,.se conhecer algum grupo de programacao que aceitem novato . se puder me indicar ti agradeco. 34 99903-6885.

     

    obrigado....

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    10 horas atrás, welton_udi disse:

    o arquivo .hex tem alguma forma de eu ler ele

    Sim você pode carregar no proteus mas sugiro carregar o .cof (também no anexo) pois com ele você vê o código fonte e roda passo a passo através dele.

     

    10 horas atrás, welton_udi disse:

    pra ver os comandos

    os comandos estão todos no .c mas se quiser ir + fundo e ver em assembly você pode recompilar e... peraí.. vou ver se tenho.... ...  depois eu vejo

     

    Sorry não conheço tal grupo

    abç

    Editado por Isadora Ferraz
    erros

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 13 horas atrás, Isadora Ferraz disse:

    ola. obrigado pela ajuda, perguntei porque tenho um strobo na oficina e o controlador e por pic, ele tem 6 tipos de strobo, acionado por 1 so botao, a cada click ele muda . muito obrigado pela ajuda.

    @Isadora Ferraz @Isadora Ferraz

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • ola boa noite, to fazendo um strobo com 8 leds, e 1 botao, ao apertar o botao ele pisca sequencial da direita pra esquerda, ao apertar de novo pisca da esquerda pra direita, apertando de novo, pisca 2 em 2 por ai. sao 6 tipos diferentes na 7 ele desliga. nao consegui fazer com que o botao mude pro proximo sequencia. tem como me ajudar  , obrigado.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Claro... vejamos...

    Use tabela. Algo como
     

    unsigned char const tabela_efeito[]=
    {
    0b10000000, //efeito 1
    0b01000000,
    0b00100000,
    0b00010000,
    0b00001000,
    0b00000100,
    0b00000010,
    0b00000001, //a cada 8, próximo efeito:
    //esq p dir
    0b00000001, 
    0b00000010, 
    //...
    0b10000000,
    //...efeito 2
    0b11000000,//de 2 em 2
    0b00110000, 
    
    //e por aí vai
    0b10101010, //efeito x
    //...
    0b01010101
    }

    E coloque os dados no port
     

    #define numero_de_efeitos 6
    unsigned char i=0,n=0;
    for(;;)
    {
    i=0;
    while(i++>7)
    {
    PORTB=tabela_efeito[i+n];//localiza o efeito
    delay (1000);//intervalo
    if (botao) n+=8;//próximo efeito
    if (n>=numero_de_efeitos*8) n=0;//volta no 1º efeito
    }
    }

    Entendeu? Então me explica...

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • ola, agora que confundi tudo mesmo, :tw_astonished:. mas vou tentar entender esse codigo ai, vou tenta joga no mikroc e volto pra ve se consegui entender e por pra funcionar, obrigado.mtos codigos ai num vi nem na apostila que to estudando ainda .

    3 horas atrás, Isadora Ferraz disse:

    Claro... vejamos...

    Use tabela. Algo como
     

    
    unsigned char const tabela_efeito[]=
    {
    0b10000000, //efeito 1
    0b01000000,
    0b00100000,
    0b00010000,
    0b00001000,
    0b00000100,
    0b00000010,
    0b00000001, //a cada 8, próximo efeito:
    //esq p dir
    0b00000001, 
    0b00000010, 
    //...
    0b10000000,
    //...efeito 2
    0b11000000,//de 2 em 2
    0b00110000, 
    
    //e por aí vai
    0b10101010, //efeito x
    //...
    0b01010101
    }

    E coloque os dados no port
     

    
    #define numero_de_efeitos 6
    unsigned char i=0,n=0;
    for(;;)
    {
    i=0;
    while(i++>7)
    {
    PORTB=tabela_efeito[i+n];//localiza o efeito
    delay (1000);//intervalo
    if (botao) n+=8;//próximo efeito
    if (n>=numero_de_efeitos*8) n=0;//volta no 1º efeito
    }
    }

    Entendeu? Então me explica...

     

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Vai na fé amigo.

     

    Apesar de você estar...

    4 horas atrás, welton_udi disse:

    estudando ainda

    ... suponho que já tem alguma maturidade pra saber que não é só dar ctrl-c ctrl-v, né?...NÉ?!

     

    Tamozaí...

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • opa, com certeza nao vai ser so ctrl, vou tentar entender esse codigo ai, e posto aqui o resultado. positivo ou negativo rsrs. obrigado

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • ol boa noite, infelizmente nao consegui entender totalmente o codigo, as tabelas eu entendi mas por pra funcionar, nao deu. eu fiz um de uma outra forma mas nao rodou bem nao,  olha ai

     

    #define bot ra0_bit
    #define led1 rb0_bit
    #define led2 rb1_bit
    #define led3 rb2_bit
    #define led4 rb3_bit
    #define led5 rb4_bit
    #define led6 rb5_bit

    int x;


    void main() {

         trisa = 0b11111111;
         trisb = 0b00000000;
         portb = 0;


    while(1)
     {

       
       if(bot==1)
       {
       x=x+1;
       delay_ms(200);

       if(x==1){led6=1;delay_ms(100);
                led5=1;delay_ms(100);
                led4=1;delay_ms(100);
                led3=1;delay_ms(100);
                led2=1;delay_ms(100);
                led1=1;delay_ms(100);
                led6=0;led5=0;led4=0;
                led3=0;led2=0;led1=0;
                delay_ms(200);
                }
       if(x==2){led1=1;delay_ms(100);
                led2=1;delay_ms(100);
                led3=1;delay_ms(100);
                led4=1;delay_ms(100);
                led5=1;delay_ms(100);
                led6=1;delay_ms(100);
                led6=0;led5=0;led4=0;
                led3=0;led2=0;led1=0;
                delay_ms(200);
                }
       if(x==3){led3=1;led4=1;delay_ms(100);
                led2=1;led5=1;delay_ms(100);
                led1=1;led6=1;delay_ms(100);
                led6=0;led5=0;led4=0;led3=0;
                led2=0;led1=0; delay_ms(200);
                }
       if(x==4){led6=1;led4=1;led2=1;delay_ms(200);
                led6=0;led4=0;led2=0;
                led1=1;led3=1;led5=1;delay_ms(200);
                led1=0;led3=0;led5=0;

                }
       if(x==5){led6=1;delay_ms(50);
                led6=0;led5=1;delay_ms(100);
                led5=0;led4=1;delay_ms(100);
                led4=0;led3=1;delay_ms(100);
                led3=0;led2=1;delay_ms(100);
                led2=0;led1=1;delay_ms(100);
                
                led1=0;led2=1;delay_ms(100);
                led2=0;led3=1;delay_ms(100);
                led3=0;led4=1;delay_ms(100);
                led4=0;led5=1;delay_ms(100);
                led5=0;led6=1;delay_ms(100);
                led6=0;
                }
       if(x==6){led1=0;led2=0;led3=0;led4=0;
                led5=0;led6=0;
                 x=0;
                }


       }

    nao funcionou bem nao , tem hr que aperta nao muda o tipo de piscada.

     

    obrigado

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @welton_udi ,

     

    Vou dar um chute ....

     

    Se passar de 6 apertadas no

    botao, nao vai mais acontecer mais nada .... tem de verificar quando for igual a 7 fazer de novo x=1  e recomeçar as comparações ok ?

     

    Assim fica sempre dentro do loop.

     

    Paulo

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Paulão @aphawk está correto mas vi que você já colocou

    12 horas atrás, welton_udi disse:

    if(x==6){led1=0;led2=0;led3=0;led4=0;
                led5=0;led6=0;
                 x=0;

    Mas vai que x cria vida própria e vai a 7 então vai demorar a voltar a ser 6. Por isso eu (eu) gosto de colocar p.ex. if (x>5).

     

    você pode ter esquecido de pullup no botão. Publique o circuito... Capacitor no botão cai bem.

     

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    3 horas atrás, welton_udi disse:

    se você apertar o botao sem ter terminado o delay da sequencial ele nao muda, dai tem que segurar um pouco o botao pra ele mudar

    Aí sim amigo. Realmente se estiver dentro do delay ele não lê o botão. Pra contornar isso, uma (01) maneira é :

    você deve criar uma interrupção por mudança de estado de pino e dentro dela fazer o x=x+1; e também aguardar a soltura do botão. Assim sendo cada vez que apertar, vai esperar acabar o efeito e partir pro próximo.

     

    Vai ter que dar uma estudadela no recurso de interrupt do seu mc ok?

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • e, ta difícil, nao consigo entender o funcionamento e como montalo dentro do mikroc. ja li reli e nao saiu nada ainda, rsrs.

    • Triste 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    pense como o mc. Faz de conta que você é ele. Algo como
     

    -preparo o chip
    -zero a saída dos leds
    
    ->-começo:
    ^
    | espero apertar e soltar o botão
    | coloco o próximo padrão de leds na saída
    ^
    |-volto ao começo

    Espero não ter que desenhar pois é muito simples. E olha que até fiz pra você

    Não desista...

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @welton_udi ,

     

    Bom, algo mais simples do que você usar interrupção seria criar a sua própria rotina de delay um pouco diferente...

     

    Por exemplo, em vez de ficar chamando a função Delay() , crie uma função sua, por exemplo delaycomteste(), e dentro dela você fica chamando a função delay() original a cada 5 milissegundos , e faz um teste do botão logo após os 5 milissegundos. Caso o botão tenha sido acionado, você incrementa o X e volta ao seu loop ....

    Caso o botão não tenha sido acionado, você repete o delay de 5 milissegundos, e vai fazendo isto até o tempo total ultrapassar o período chamado na função ! Simples....

     

    Algo assim :

     

    Se você chamar a função desta maneira : delaycomteste(100) ,  vai ocorrer 20 vezes o delay de 5 milissegundos e o teste do botão, e se nada acontecer a função simplesmente termina e retorna sem fazer nada ....

     

    Não consigo te ajudar nessa linguagem C, então quem sabe a @Isadora Ferraz dá um esqueleto de código prá você fazer ....

     

    Paulo

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    delaycomteste(unsigned char i)
    {
    while (i--)
    	{
    	delay(20);
    	if (bot==1) return; //se apertar o botão, termina
    	}
    }

    @aphawk me arruma pra cabeça ... literalmente

    • Haha 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    1 hora atrás, Isadora Ferraz disse:
    
    delaycomteste(unsigned char i)
    {
    while (i--)
    	{
    	delay(20);
    	if (bot==1) return; //se apertar o botão, termina
    	}
    }

    @aphawk me arruma pra cabeça ... literalmente

     

    Isso que eu chamo de um código simples e elegante !

     

    Mas ainda não vai resolver o problema, o ideal é que esse Return voltasse para o loop do While(1) .... aí sim fica perfeito !

    Tem jeito, @Isadora Ferraz ?

     

    Ah, e claro, faltou o meu obrigado pela ajuda !

     

    Paulo

     

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @aphawk confessa vai.. você tem uma quedinha pelo c (linguagem de programação!)

     

    47 minutos atrás, aphawk disse:

    que esse Return voltasse para o loop do While(1)

    de fato ele volta sim. delaycomteste(unsigned char i) é uma função que deve ser colocada dentro do loop de onde não consegue sair. Ou seja o return sai da função e volta pro loop. É como se fosse sua 'interrupção virtual'.....-  inventei isso agora

    Perdão se é óbvio d+ mas me deu vontade comentar
     

    while(1)
    {
    delaycomteste(200);//200*5mS = 1segundo
    outras_funcoes();
    e_etc();
    }

    em basic me lembro vagamente que era o tal gosub . Sim ja tive queda pelo basic a ponto de ficar a noite no serviço pra concluir trabalhos. O tempo voava. Hormônios à flor da pele.Era um apple alguma coisa. Em casa não tinha computador... .. saudade...

    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

    ×