Skype: mariano.andre

Taquara, RS, Brasil

CONTADOR DIGITAL UP/DOWN COM PIC - 5 DÍGITOS



Caros amigos,

Hoje venho compartilhar mais um projeto, um contador digital up/down de cinco dígitos.



Em 1998 resolvi montar uma máquina para enrrolar transformadores.  Na época os contadores digitais tinham um preço significativo se comparado aos preços da atualidade e como meus recursos financeiros eram limitados, decidi usar um contador mecânico. Os testes começaram com odômetros de carro e logo surgiram as dificuldades, como por exemplo, sincronizar uma volta no eixo da máquina e uma volta registrada no odômetro. Depois de tanto quebrar a cabeça resolvi montar um contador digital baseado nos integrados CMOS, 4510 e 4511. Durante 6 anos usei meu contador CMOS sem maiores problemas. No entanto meus conhecimentos de programação acerca dos microcontroladores foram evoluindo e surgiu a ideia de usar um PIC para esta aplicação. Depois de trocar ideias com amigos mais experientes em programação e microcontroladores, em 2006 montei o circuito abaixo.


Este circuito foi montado em uma caixa padrão  DIN 98x48x135. O resultado ficou muito bom. Prometo postar uma foto do contador em breve.

O firmware utilizado na época foi o seguinte, compilado no CCS:

/*---------------------------------------------------------------Projeto:    Contador Digital up/downAutor:      Mariano André AndersonFirmware:   CD001 - 17/10/2006---------------------------------------------------------------*/
#include <16F628.h>
#use     delay(clock=4000000)
#fuses   XT, NOWDT, PUT, NOBROWNOUT, PROTECT, NOLVP
#define  en373    pin_a0
#define  clock    pin_a4
#define  upd      pin_a3
#define  bt1      pin_a1
#define  bt2      pin_a2

//- Variáveis Globais -------------------------------------------
int   unidade, dezena, centena, milhar, umilhar, i;

//- Função para converter o valor da variável para 7 segmentos --
// 0 = ligado  1 = desligado
//                        BAFGPCDE                     A
byte const converte[]={ 0b00011000,    //0         * * * * *
                        0b01111011,    //1         *       *
                        0b00101100,    //2       F *       * B
                        0b00101001,    //3         *   G   *
                        0b01001011,    //4         * * * * *
                        0b10001001,    //5         *       *
                        0b10001000,    //6       E *       * C
                        0b00111011,    //7         *       *
                        0b00001000,    //8         * * * * *
                        0b00001001};   //9             D     * P

//- Função para atualizar o display -----------------------------
void atualiza_display()
{
   output_b (converte[unidade]);
   output_high(en373);
   delay_us(1);
   output_low(en373);
   output_b(0b11101111);
   delay_ms(1);
   output_b (converte[dezena]);
   output_high(en373);
   delay_us(1);
   output_low(en373);
   output_b(0b11110111);
   delay_ms(1);
   output_b (converte[centena]);
   output_high(en373);
   delay_us(1);
   output_low(en373);
   output_b(0b11111011);
   delay_ms(1);
   output_b (converte[milhar]);
   output_high(en373);
   delay_us(1);
   output_low(en373);
   output_b(0b11111101);
   delay_ms(1);
   output_b (converte[umilhar]);
   output_high(en373);
   delay_us(1);
   output_low(en373);
   output_b(0b11111110);
   delay_ms(1);
}

//- Função para somar -------------------------------------------
void mais_um()
{
   unidade++;
   if (unidade > 9)
   {
      unidade = 0;
      dezena++;
   }
   if (dezena > 9)
   {
      dezena = 0;
      centena++;
   }
   if (centena > 9)
   {
      centena = 0;
      milhar++;
   }
   if (milhar > 9)
   {
      milhar = 0;
      umilhar++;
   }
   if (umilhar > 9)
   {
      umilhar = 0;
   }
   i=0;
}

//- Função para subtrair um -------------------------------------
void menos_um()
{
   unidade--;
   if (unidade > 9)
   {
      unidade = 9;
      dezena--;
   }
   if (dezena > 9)
   {
      dezena = 9;
      centena--;
   }
   if (centena > 9)
   {
      centena = 9;
      milhar--;
   }
   if (milhar > 9)
   {
      milhar = 9;
      umilhar--;
   }
   if (umilhar > 9)
   {
      umilhar = 9;
   }
   i=0;
}
//- Início da rotina principal ----------------------------------
void main()
{
   set_tris_b (0b00000000);     
   set_tris_a (0b00011110);             
   unidade = 0;                         
   dezena  = 0;
   centena = 0;
   milhar  = 0;
   umilhar = 0;
   while (true)
    {
      atualiza_display();
        {
        if (i==1)
          {
            if ((!input(clock)) && ( input(upd))) mais_um();
            if ((!input(clock)) && (!input(upd))) menos_um();
          }
        if (input(clock))
          {
           delay_us(200);
           if ( input(clock)) i=1;
          }
        }
    }
}
//- Fim ---------------------------------------------------------

Sinta-se a vontade para montar este circuito e fazer melhorias no firmware. E se depois você quiser compartilhar os resultados (sem interesse comercial) o blog estará a disponível para divulgação. Neste caso favor enviar os arquivos por e-mail que será dado os devidos créditos.

Abraço.

44 comentários:
Faça seus Comentários
  1. Olá amigo não sou bom em programação tem como eu usar no meu carro como odometro usando o sensor de velocidade
    Obs siena 98 fiat
    Obrigado

    ResponderExcluir
    Respostas
    1. Olá! Este é um contador simples, alimentado por 12V, que soma ou subtrai uma unidade a cada pulso de entrada (depende da entrada up/down) e pode ser programado/reprogramado conforme a necessidade. Sem pensar muito eu diria que é possível mas acredito que há outros detalhes a serem verificados no carro. Talvez com poucos ajustes no programa do contador já será possível utiliza-lo como odômetro. Sugiro que você converse com um mecânico/eletricista de carros para esclarecer sobre o funcionamento dos odômetros digitais, para evitar danos indesejados no seu carro.

      Atte.
      Mariano

      Excluir
  2. Olá amigo.
    Estou tentando montar um dimmer para lampada com incremento e decremento
    vc pode me ajudar nesta função.
    EX:Uma chave com 4 leds
    Quatro toques liga leds diferentes

    ResponderExcluir
    Respostas
    1. Olá Fabio!
      Tenho alguns exemplos mas não exatamente para dimmer, mas vou fazer o possível para lhe ajudar. Assim que possível vou postar aqui no blog e te aviso nestes comentários, ok.
      Um grande abraço.
      Mariano

      Excluir
  3. Boa tarde Mariano, teria como vc postar o esquema em pdf, a imagem esta um pouco distorcida

    ResponderExcluir
    Respostas
    1. Olá Marcelo! Posso lhe enviar os arquivos sim, sem problemas, mas você pode baixá-los acessando, no topo do Blog, o link "Arquivos para Baixar" - https://skydrive.live.com/?cid=5e8e07978949298a#cid=5E8E07978949298A&id=5E8E07978949298A%21122.
      Grande abraço.

      Excluir
  4. Outra pergunta, qual a função dos botoes S2 e S3, e o que vai ligado nos bornes 1 e 2 ?
    Como é feita a mudança da contagem up para down?
    Gostaria de montar um contador desses para minha bobinadeira, agradeço a sua atenção.

    ResponderExcluir
    Respostas
    1. Olá Marcelo! Bem, os botões S2 e S3 podem ser utilizados para várias funções, vai depender de como foi programado. No firmware acima, não há funções para estes botões.
      A mudança de up para down é feita mudando o nível da entrada do borne 2, de nível 1 para 0. O nível 1 é UP e o nível 0 é DOWN.
      O pulso para contagem, no borne 1 (clock) é igual, sempre que tiver um nível 0 na entrada é feito um incremento na contagem, conforme o nível do borne up/down.

      Qualquer dúvida é só escrever.
      Abraço.

      Excluir
    2. Mariano,primeiro obrigado pela sua atenção, é que preciso deste contador, eu simulei no proteus, por se tratar de um contador multiplexado, parece que a simulação "pesa" e os displays acendem de modo aleatório. Deu para perceber que os botões funcionam correto, mas os pulsos funcionam com o botão s3 e não com aterramento do clock no borne 1 como vc disse, não sei se o circuito real funciona da maneira como disse, estamos apenas trocando informação, de qualquer maneira obrigado pela atenção.

      Excluir
    3. Olá Marcelo!
      Fique a vontade em escrever e esclarecer suas dúvidas. O objetivo do Blog é justamente compartilhar informações, na forma de projetos que desenvolvo nas minhas horas de folga.

      Quanto a simulação no Proteus eu não saberei lhe responder quanto ao funcionamento deste projeto. Entendo que aplicativos de simulação possam ser úteis para muitos casos mas já tive problemas em simulações de projetos que utilizavam microcontroladores e a partir daí não utilizei mais simuladores, passei a fazer uma placa, em casa mesmo, para testar o firmware.

      Este contador foi montado justamente para minha bobinadeira de transformadores. Você pode observar as fotos da montagem final neste link:

      http://marianoandre.blogspot.com.br/2012/05/contador-digital-com-pic-montado.html

      Eu ainda tenho uma placa, que fiz a mais, quando montei meu contador. Como foram feitas em casa mesmo, a qualidade não é das melhores mas talvez ainda possa lhe ser útil. Se você me informar seu e-mail, eu tiro uma foto da placa e lhe envio. Caso seja do seu interesse, posso lhe enviar para que você possa montar e testar o projeto.

      Vou ver se consigo fazer um vídeo do contador funcionando e posto no Blog.

      Qualquer dúvida, estamos ai.

      Grande abraço.
      Mariano

      Excluir
    4. Bom dia Mariano, a sua placa por ser feito em casa está otima, claro que nada melhor que um teste em protoboard ou montagem final, simulei porque nao tenho protoboard, mas é indispensável, estou fazendo uma placa e os pulsos vao sair de um sensor otico, espero que funcione, quanto as fotos da placa me ajudaram bastante, obrigado pela atenção
      Outro detalhe, na foto não vi o oscilador de cristal nem os capacitores de 33pf, vc retirou por algum problema?

      Meu email fortini46@gmail.com

      Excluir
    5. Olá Marcelo!
      QSL (tudo entendido) quanto a simulação e testes. Nas fotos do contador montado não consta o cristal nem os capacitores de 33pF porque experimentei o modo de oscilador interno. Mas não muda nada no funcionamento, pode usar o cristal que também funciona.
      Abraço.
      Mariano

      Excluir
    6. Não sendo eu muito "folgado", teria como vc mandar uma foto do layout da placa ou mesmo um arquivo em pdf, no meu email, sua placa ficou muito boa, vai me ajudar muito, bom domingo!

      Excluir
    7. não sou muito bom em programa de pic mas e esse que esta logo abaixo do esquema fico muito crato se puder mi ajudar pic 16f628

      Excluir
    8. Olá! Você precisa de ajudar para montagem ou no firmware?

      Excluir
  5. Olá Mariano. Obrigado por ter me ajudado com seu projeto. Venho procurando por um bom tempo um circuito como esse para colocar no meu tape deck de rolo e a unica coisa que adicionei foi um rotary encoder e ficou muito bom. Valeu!!

    ResponderExcluir
    Respostas
    1. Olá André!
      Legal, fico feliz que o projeto lhe foi útil.
      Grande abraço.

      Excluir
  6. Mto bacana amigo, obrigado pela iniciativa em postar todo o material, .hex e pcb para montagem. Já montei um gravador de Pic que grava pics de 8 até 4 terminais.
    Meu tio trabalha enrolando transformadores e utiliza esse contadores retirados de toca fitas rs, vou montar este circuito para ele. Grande abraço

    ResponderExcluir
  7. olá Mariano adorei o seu projecto, era mesmo isso que procurava, mas tenho algumas dificuldade em programa-lo... seria possivel usar um pic 16f877 neste projecto?

    ResponderExcluir
    Respostas
    1. Olá Alcides! Fico feliz que tenha gostado do projeto, procurei fazer algo bastante simples e fácil de montar. Não há impedimento para usar um PIC16F877, porém será necessário desenhar um novo layout para o circuito impresso, além de pequenas alterações no firmware.
      Abraço.

      Excluir
  8. olá Mariano, Adorei o seu projecto, era mesmo isso que eu procurava, a meses que tenho um projecto identico a esse para fazer mais ñ sabia por onde começar... será k é póssivel substituir este PIC por um PIC 16F877 ?, gostaria tbm acrescentar um sensor para contar o numero de volta de um motor, como ficaria a programação que para mim é a parte mais dificil...

    ResponderExcluir
    Respostas
    1. Olá Alcides! Fico feliz que tenha gostado do projeto. Para usar um PIC16F877 no lugar voê vai precisar alterar um pouco o layout mas também poderá eliminar o outro circuito integrado (74HC373) já que o 877 tem mais pinos que podem ser utilizados.

      Na programação será necessário mudar o modelo do microcontrolador. Se o sensor que você utilizar para verificar a rotação do motor for compatível com a programação existente, neste caso não precisará mudar nada no que refere-se a leitura do sensor.

      Qual é o tipo ou modelo do sensor que você pretende utilizar no seu projeto?

      Excluir
  9. Oi. É possível usar um PIC16F877 basta alterar o desenho do circuito impresso e o firmware. Como o 16F877 é mais robusto, é possível implementar várias outras funções aumentando a complexidade do projeto. Peço que descreva exatamente o que você precisa, incluindo as funções que deseja acrescentar, porque talvez seja mais interessante fazer um novo projeto, utilizando por exemplo um LCD no lugar de display de 7 segmentos.
    Abraço.

    ResponderExcluir
  10. bom dia, ja construi esse projeto mas nao sei como passar essa firmware para os componentes, tem como me ajudar se preferir pode me passar para meu email carlosseja@hotmail.com

    ResponderExcluir
  11. bom dia, eu construi esse projeto mas nao sei como passar a firmware para os componentes, preciso fazer 30 contador desses ja estudei muito a respeito mas nao consegui um passo a passo, teria como me ajudar, meu email carlosseja@hotmail.com

    ResponderExcluir
    Respostas
    1. https://www.youtube.com/watch?v=Ocdtx2E-Ihc

      ESPERO QUE ISTO TE AJUDE.

      Excluir
    2. Existem varios tipos de gravadores de pic melhores do que deste video.

      Excluir
  12. Olá Carlos!
    Faço minhas as palavras do Marcelo. Qual seria sua dúvida mais especificamente?
    Abraço.

    ResponderExcluir
  13. em qual aplicativo foi feito a programação do código?

    ResponderExcluir
  14. em qual aplicativo foi feito a programação do código?

    ResponderExcluir
  15. Boa noite Mariano, obrigado pela resposta, para esse contador ficar completo, deveria ter a função de programar um determinado numero de voltas e quando atingir esse numero, uma saida fosse ativada para acionar um relé e nesse momento desligar o sistema, seria possivel incluir mais essa função?

    ResponderExcluir
    Respostas
    1. Olá Juarez, tudo bem? Sim, concordo que seria legal ter esta funcionalidade no contador. Na ocasião em que montei este projeto acabei não implementando. Não é difícil de implementar esta função, no entanto, seria preciso fazer umas "alterações" no circuito para que fosse possível. Minha sugestão seria aproveitar a ideia inicial e fazer um projeto novo utilizando um PIC16F872, por exemplo, que possui um número maior de IO.

      Dá uma olhada no projeto da uPAC. Link:http://marianoandre.blogspot.com.br/2012/04/upac-placa-para-automacao-e-controle.html

      Com este projeto você poderia fazer um contador mas atualizado, com várias funções e até mesmo controlar via RS-232, o que você acha?

      Havendo interesse e disponibilidade, posso lhe conseguir esta placa montada ou apenas a PCI para você montar.

      Qualquer coisa estou à disposição.

      Abraço.

      Excluir
    2. Bom dia Mariano, o projeto é muito interessante, mas, no momento o que eu preciso mesmo é de um contador para uma bobinadeira, projeto apresentado nesse artigo seria ideal e nem precisava ter 5 digitos, 4 já seria suficiente, eu encontrei um outro artigo que tem esse recurso, porem a saida apenas pisca, ou seja, sai do modo desativado, ativa e depois volta ao modo desativado, o ideal é que fique ativado, eu não manjo nada de programação, muito mau consigo fazer um led piscar, isso olhando o código dos outros, rsrs, minha área é eletronica, voce conseguiria incluir essa função no seu projeto, outro corrigir esse que eu tenho? e qual seria o custo?

      Excluir
    3. Bom dia Juarez, saudações!

      Se você quiser compartilhar o circuito do outro projeto que você comentou, pode enviar para o e-mail (mariano.andre@gmail.com) que então vou analisar para ver o que pode ser feito. Peço que descreva exatamente o que você precisa no contador, funções e recursos de hardware. Assim já vou modelando um novo projeto, que posso lhe atender. Também é importante que você informe urgência, pois apesar de não dispor de tempo para assumir novos projetos, gostaria de lhe ajudar.

      Sobre custos, entendo sua preocupação mas fique tranquilo, havendo necessidade de envolver valores lhe informo antecipadamente.

      Vamos conversado, o importante é você conseguir resolver o problema da sua bobinadeira.

      Abraço.

      Excluir
    4. boa noite Mariano, obrigado pela atenção, eu já tinha separado dois projetos para vc analisar, mas acabei encontrei outro que tem as funções que eu preciso, caso voce queira dar uma olhada eu te mando os tres. um abraço

      Excluir
    5. Olá Juarez! Fico feliz que tenha encontrado solução para seu problema. Se quiser compartilhar os projetos, pode enviar para mariano.andre@gmail.com e quando tiveres terminado a sua montagem, manda umas fotos. Abraço

      Excluir
  16. Boa noite Mariano, vou manda os projetos que encontrei e esse ultimo que já montei no protoboard e funcionou muito bem, e ficaria melhor se incluir um botão start, estou trabalhando no layout da placa e depois que montar, enviarei as fotos

    ResponderExcluir
  17. ola Mariano, parabens pelo projeto.vc teria o arquivo hex deste contador?

    ResponderExcluir
  18. Olá Mariano André Anderson,
    O código abaixo em CCS, com "int 16" conta até 65535, com int 8 conta até 255. O que preciso é que ele conte até 39.999 e pule para 0. Você pode ajudar me ajudar com a variável que faça isso? Meu e-mail: euclidesmz@gmail.com

    int16 adjust (int16 var) {
    int16 delay=0;
    unsigned int i=0,j=0;
    int_to_seg(var,0);
    while(!input(p2)) {
    delay=250 ; i=1 ; j=0 ;
    while(input(up)||input(down)) {
    if (input(up))
    var+=i;
    else
    var-=i;
    int_to_seg(var,0);
    j++;
    if(j>1) i=1;
    delay_ms(delay);
    if(delay>=100)
    delay-=20;
    } }
    return var;
    }

    ResponderExcluir
  19. Boa Noite!

    Quero montar o seu contador digital para contar peças.
    Aonde ligo uma chave na saída ou tenho que montar um gerador de clock e ligar nele ?

    E por favor pode me mandar o arquivo hex para o e-mail cleberspindler@yahoo.com ?

    ResponderExcluir