RELÓGIO
BINÁRIO COM PIC
A
grande maioria daqueles que estudaram lógica digital
conhecem a
notação binária. Trata-se de um item obrigatório em
qualquer
currículo para eletrônica digital ou
microcontroladores. Este
artigo demonstrará a você como montar um relógio
microcontrolado
com um mostrador bastante diferente do usual. Ao
invés de “displays”
ou “ponteiros”, o mostrador desse relógio é composto
por
LEDs que mostram hora, minutos e segundos no formato
binário (BCD).
Desta forma, além de ter em sua mesa um relógio
bastante
diferente e curioso, você também poderá praticar
diariamente a
interpretação binária BCD. Clique aqui para ver a
atualização desse projeto! NUMERAÇÃO OU NOTAÇÃO BINÁRIA Para aqueles que ainda não se depararam com a notação binária, um pouco de teoria poderá ajudar na compreensão do funcionamento do relógio proposto neste artigo. Para aqueles que já a conhecem a teoria poderá ajudar a “relembrar”. Atualmente utilizamos o sistema de numeração decimal. Neste sistema temos 10 algarismos (0 a 9) que nos permitem “construir” e “interpretar” qualquer valor desejado. Esta “interpretação” utiliza o método dos “pesos”, de acordo com a posição do algarismo no valor. Para valores até nove não existe qualquer peso, pois estamos na “primeira posição” (unidade). Para valores acima de nove são adotados “pesos”. A dezena assume peso “1”, a centena peso “2”, a milhar peso “3” e assim por diante. Veja o exemplo abaixo: Valor 349 na base decimal: Você deve ter percebido que estes pesos são na verdade “expoentes” que elevam a “base” da notação (ou numeração). Como estamos falando da notação decimal, esta base é o valor 10. Já pensou como seria um “sistema digital” baseado na numeração decimal? Para que um sistema digital pudesse interpretar os 10 algarismos citados, o mesmo teria de ser capaz de interpretar 10 níveis de tensão diferentes. Para que tal sistema pudesse ser confiável estes níveis teriam de ter uma boa margem de segurança (distância entre níveis segura). Neste caso os níveis de tensão teriam de ser meio altos, para que as “janelas” (ou zonas de transição) pudessem ser inseridas adequadamente entre os mesmos. Veja abaixo.
Um sistema digital trabalha de acordo com uma determinada lógica. Os níveis de tensão internos são sempre interpretados de acordo com uma situação lógica. Se, por exemplo, fossemos utilizar a “lógica do sim ou não” para o sistema mostrado acima (lógica digital com 10 níveis diferentes), como a mesma poderia ser traduzida por tal sistema? Como exemplo poderia-se determinar que o valor “0” seria interpretado como um “não absoluto”, o valor “1” seria um “quase não”, o valor 2 poderia ser traduzido como um “pode ser que não”, o valor 3 como ”um talvez não”, o valor 4 como um “quase talvez”, o 5 como um “talvez”, até chegar no valor 10 onde teríamos um “sim com certeza”? Cada desenvolvedor poderia dar a interpretação que melhor lhe conviesse ao seu sistema e a “inter-conexão” entre estes sistemas hipotéticos seria quase impossível. E mais um problema: o nível de complexidade do circuito eletrônico capaz de gerar 10 níveis de tensão diferentes seria enorme. Atualmente existem no mercado CIs (circuitos integrados) digitais com milhares de transistores e processadores com milhões deles. Você já pensou nos “números” relacionados a este novo CI com a tal “lógica digital decimal”??? Um tanto inviável não acha? Todos estes problemas foram resolvidos com a adoção de apenas dois níveis de tensão para os sistemas digitais. Ao se trabalhar com dois níveis de tensão a interpretação destes fica mais fácil para o sistema (e consequentemente para o desenvolvedor) e a sua construção também é mais simples já que os níveis de tensão adotados geralmente são sempre “VCC” e “GND”. Você pode perceber também que a simplicidade do sistema binário permite que este seja menos susceptível ao erro. Porém como interpretar um número qualquer escrito no sistema binário? Temos agora apenas dois algarismos para gerar nossos valores (0 e 1)? Simples! Utilizaremos a mesma idéia dos “pesos” adotados no sistema decimal também para o sistema de numeração ou notação binária, apenas mudando a base. Como na notação binária só temos dois algarismos, nossa base agora é o “2”. Abaixo você pode ver como isso é feito.
A partir do que foi explicado, fica bem fácil compreender como será feita a conversão de um valor decimal para binário e vice-versa. Para converter um valor decimal para binário basta realizar divisões sucessivas por “2” até que o resto seja menor que “2”. O resultado da conversão é então obtido considerando o ultimo quociente e lendo os restos da última até chegar à primeira divisão realizada. Veja abaixo um exemplo do que foi dito.
A conversão inversa de binário para decimal é também bem simples. O valor binário deve ter seus “pesos” anotados e convertidos. Em seguida multiplica-se o valor do dígito binário (0 ou 1) pelo valor do peso convertido e então soma-se tudo. Veja abaixo.
Você deve agora estar se perguntando sobre a interpretação dos valores binários menores que 1. Até o presente momento, tudo o que foi demonstrado foi feito levando-se em conta apenas valores inteiros. Porém os sistemas digitais também são capazes de trabalhar com valores fracionados. Se não fosse assim, nossas calculadoras e computadores seriam inúteis. Para a interpretação de valores menores que “1” na base binária utilizamos a mesma idéia dos pesos, porém estes são agora negativos (-1,-2, -3, -4, e assim sucessivamente).
O CIRCUITO Na figura acima temos o circuito para a montagem proposta. O “coração” (ou cérebro, como alguns preferem chamar) do circuito é o microcontrolador PIC16F628-04/P da Microchip (CI1). Este “pequeno”, mas notável microcontrolador, já foi utilizado em outros projetos meus (publicados nas revistas, por puro hobby e também profissionais). Suas principais características são:
Para aqueles que desejam maiores informações sobre este microcontrolador, aconselho o download do seu datasheet no site do fabricante, http://www.microchip.com. Como o circuito não é critico, eu optei pelo uso do clock interno do microcontrolador (4 MHz). O pino de reset foi utilizado como pino de I/O, aumentando ainda mais o numero destes disponíveis no circuito. Parte dos pinos de I/O das portas “A” e “B” foram utilizados no controle da matriz de LEDs que forma o mostrador do relógio. Todo
relógio precisa de uma base de tempo para a
contagem do mesmo. A
mais comum delas é a freqüência presente na rede
elétrica (no
caso do Brasil, 60Hz). Esta freqüência é bastante
precisa e fácil
de ser retirada da rede elétrica e lida por um
microcontrolador.
Como o circuito conta com uma fonte de alimentação
com
transformador redutor de tensão ficou bem simples
a retirada deste
sinal. Ela foi feita através do CI3, um
opto-acoplador 4N25. Este CI
possui internamente um diodo emissor de raios
infravermelhos (IR –
Infra Red) e um foto-transistor. Este sinal é então inserido no microcontrolador através do pino de I/O RB0. Este pino de I/O pode ser configurado para gerar uma interrupção no microcontrolador sempre que o mesmo “sentir” a transição da borda de um sinal. Sabemos que toda porta lógica tem tempos de transição bem definidos. Quando um sinal aplicado à entrada de uma porta lógica tem tempos de transição menores aos valores mínimos permitidos (cada família lógica tem seus próprios valores), verifica-se em sua saída algumas oscilações à medida que o sinal de entrada passa pelo intervalo de “indeterminação”. Você deve estar atento para o fato de que estamos recolhendo um sinal analógico do tipo senoidal para a nossa base de tempo. Assim, uma porta lógica comum sofreria oscilações indesejáveis devido a natureza do sinal. Porém, sempre que o pino de I/O RB0 do PIC é configurado para “ler” um sinal externo e gerar uma interrupção, ele assume características Schmitt Trigger. Uma
porta lógica do tipo Schmitt
Trigger
é projetada para aceitar
sinais cuja transição são lentas e fornecer uma
saída livre de
qualquer tipo de oscilação. Esta saída geralmente
é muito rápida,
com tempos de transição em torno de 10 ns, e é
independente das
características do sinal de entrada. Desta forma
podemos usar o
sinal da freqüência da rede elétrica (60 Hz) para
realizar a
contagem do tempo necessário, de forma muito
precisa. R13 é o resistor limitador de corrente para o LED interno ao opto-acoplador. D3 serve para conduzir a parte “negativa” do sinal de entrada, evitando que o LED interno ao opto-acoplador se danifique por excesso de corrente reversa sobre o mesmo. R14 mantém o nível de tensão sobre o pino RB0 (habilitado para trabalhar com interrupção externa) sempre “alto” (5VDC), quando o valor do sinal de entrada for máximo. LED1 a LED20 formam o mostrador do relógio. A forma de controle destes LEDs segue o mesmo método de controle para matrizes de LEDs (linha x coluna). Assim para ligar ou desligar cada LED é preciso inserir um valor de tensão correto na linha e coluna onde este LED se encontra. Chamarei a partir deste momento de “linha” os pontos onde estão ligados os “catodos” dos LEds e de “coluna” os pontos onde estão ligados os “anodos” dos mesmos. Para facilitar ainda mais a compreensão do que será dito daqui para frente, chamarei de coluna “1” a conexão dos anodos entre os LEDs 1 e 2, de coluna “2” a conexão entre os anodos dos LEDs 3, 4, 5 e 6 até a coluna “6” onde temos a conexão dos anodos dos LEDs 17, 18, 19 e 20. Temos então a contagem das colunas da esquerda para direita. Já para as linhas, chamarei de linha “1” a conexão entre os catodos dos LEDs 2, 6, 9, 13, 16 e 20, de linha “2” a conexão entre os catodos dos LEDs 1, 5, 8, 12, 15 e 19 até a linha “4” onde temos a conexão entre os catodos dos LEDs 3, 10 e 17. A numeração das linhas será feita então de baixo para cima.
As colunas são controladas pelos transistores Q1 a Q6 (BC327- PNP) e as linhas pelo CI ULN2003, um circuito integrado com sete “drives” tipo “darlington”. Este CI permite o controle através de suas saídas de motores DC, motores de passo, LEDs e outros dispositivos que trabalhem com tensão de até 50VDC e dreno de corrente de até 500 mA máximos. Sua entrada tem níveis de tensão e corrente dentro do padrão TTL. O relógio possui uma fonte de alimentação própria formada pelo transformador T1 (ligado a CN1), os diodos retificadores D1 e D2, os capacitores de filtro C1, C2, C3 e C4 além de CI4, um regulador de tensão para 5VDC. O jumper JP1 permite a seleção para o modo do mostrador: aberto - “12:00” e fechado - “24:00”. A chave S1 permite ajustar o relógio (horas e minutos) e a chave S2 permite trocar o ajuste entre horas e minutos.
MONTAGEM ELETRÔNICA Na figura acima você tem minha sugestão do layout para confecção do circuito impresso. Trata-se de uma placa dupla face. Este modo foi o escolhido visando a redução do tamanho final da placa e conseqüentemente do relógio, já que o mesmo foi pensado como um relógio de mesa ou cabeceira. Se
você não se
sentir à vontade com placas dupla face poderá
redesenhar o layout
com
apenas uma face, bastando para isso seguir o
circuito elétrico. Uma alternativa é a montagem do
circuito em
placa do tipo padrão, já que o mesmo não é critico.
E uma outra
alternativa é fazer apenas o lado de baixo da placa
(botton layer
- face simples) e
fazer as conexões do lado superior utilizando fios
(não é muito
elegante, mas bastante funcional). Se você ainda não experimentou confeccionar uma placa dupla face deva fazê-lo. Para aquele aplica os conhecimentos adquiridos profissionalmente isso é muito importante, pois nos dias de hoje raras são as empresas que não utilizam este tipo de placa (dupla face). O técnico ou engenheiro que pretende conquistar ou manter seu emprego deve ter os conhecimentos necessários sobre desenho, confecção e funcionamento de um circuito com “lay-out” de dupla-face e em alguns casos “multi-layer” (várias camadas). Para o “hobista” (agora chamado de Maker!) este conhecimento também é recomendável. A confecção de uma placa dupla face não é difícil e segue a mesma “filosofia” de uma placa com face simples com apenas a diferença de agora ser necessário um novo desenho sobre a face superior com o correto “casamento” entre as furações inferior e superior. Caso
você esteja
disposto a montar este relógio, sugiro ler também
o artigo Como
confeccionar
placas de circuito impresso com acabamento
semi-profissional (método transferência térmica).
Ele vaí ajudá-lo
a compreender melhor como proceder na confeccção
de uma placa dupla
face. Após a confecção da placa, comece por montar na mesma os suportes para os CIs (exceto CI4). Não recomendo a solda dos CIs diretamente na placa, principalmente do microcontrolador. Ao soldar os resistores tenha cuidado para não trocá-los entre si. Utilize o código de cores fornecido na lista de materiais para se orientar e montá-los corretamente na placa. Os LEDs, capacitores eletrolíticos, diodos e os CIs são polarizados. A montagem destes componentes de maneira invertida poderá comprometer o funcionamento do circuito e quiçá a integridade dos mesmos (você poderá danificá-los irremediavelmente). Tome cuidado ao montá-los! Siga atentamente a “mascara” fornecida na figura do layout para o correto posicionamento dos componentes. É altamente recomendável o uso de um dissipador de calor para CI4, pois o uso do circuito é continuo. O transformador T1 será conectado ao circuito através de CN1. A ligação de um fusível de proteção, uma chave liga/desliga e do rabicho pode ser visto no esquema fornecido na figura abaixo. O jumper JP1 pode ser construído a partir de uma barra de pinos com dois segmentos ou então substituído por uma chave “on/off” (chave “H-H”). As chaves S1 e S2 devem ser do tipo NA (normalmente aberta) e podem ser do tipo para montagem na placa PCI ou ainda do tipo aérea para montagem em gabinetes.
O PROGRAMA Logo
abaixo em Downloads
disponibilizo o programa
que desenvolvi usando a Linguagem C
chamado relogio_nerd.c.
Utilizei para a montagem e compilação deste programa
o compilador
PICC CCS.
O
programa foi ricamente comentado, para ajudar na sua
compreensão. Porém a seguir falarei um pouco sobre o
seu
funcionamento, descrevendo as operações mais
importantes do
programa.
O programa começa configurando o microcontrolador, definindo o modo de uso dos pinos (entrada ou saída), o tempo para o Watch Dog Timer (relógio cão de guarda que evita que o programa se perca e assim que o microcontrolador trave por algum motivo) e a configuração da INT EXT (interrupção externa responsável pela recepção do sinal para a base de tempo do relógio – 60 Hz). Após a configuração do microcontrolador, o programa verifica qual o modo escolhido para a demonstração do horário: se 12 ou 24 horas. Após está verificação o programa confere se algum ajuste no relógio já foi feito. Geralmente quando o circuito é ligado nenhum ajuste foi feito e o relógio fica aguardando o modo ajuste e isso é informado no mostrador através da função “pisca_ajuste()” que faz as colunas piscarem informando a situação. Na função “main()”o estado das chaves S1 e S2 é lido, o WDT é zerado e a matriz de LEDs é atualizada. O sinal para base de tempo é colhido via interrupção. A função “atualiza_matriz()” atualiza as “linhas” e “colunas” do mostrador através do método da varredura. Isso quer dizer que nunca teremos todos os LEDs acessos de uma só vez. Cada linha é acertada com o valor desejado e a coluna referente é então ligada e desligada a cada 0,03 segundos. Como essa velocidade é grande e considerando o efeito da “Persistência Retiniana” temos a “ilusão” de que todos os LEDs estão acessos ao mesmo tempo e você poderá então “ver” as horas no mostrador. A função “EXT_isr()” tem papel fundamental para o relógio. Ela é chamada 60 vezes por segundo (freqüência da rede elétrica = 60 Hz). A cada chamada ela atualiza a contagem para segundos, minutos e horas. Assim, a cada 60 contagens temos 1 segundo, a cada 60 segundos contados temos um minuto e a cada 60 minutos contados uma hora. Esta função é então a responsável pela contagem do tempo. As outras funções presentes são auxiliares do programa e permitem o ajuste do relógio e sua operação. Um outro detalhe também muito importante é que o compilador CCS insere no código final, a ser gravado no microcontrolador, comandos que permitem ligar e desligar as interrupções. Isso evita que ao atender uma determinada interrupção, o microcontrolador sofra uma segunda interrupção e assim consecutivamente. Ou seja, ao entrar em uma função de tratamento de interrupção, todas as outras (e a própria) são desabilitadas. Enquanto as operações dentro da função de tratamento da interrupção atual não se finalizarem, nenhuma outra será chamada. Agora você pode entender a importância do Watch Dog Timer. Caso algo na lógica do programa saia errado, o WDT fará o reset do microcontrolador, iniciando as operações. Observando o que foi dito anteriormente, você também pode entender o porque de, neste programa, ter sido utilizado uma única interrupção. O controle de tempo para atualização da matriz poderia ter sido feito via interrupção de um dos Timers do microcontrolador, por exemplo, mas isso seria um erro. Se neste caso, enquanto o microcontrolador estivesse atualizando a matriz durante uma interrupção do Timer, uma interrupção causada pelo sinal de 60 Hz tivesse que ser atendida esta não seria atendida e conseqüentemente uma ou mais contagens poderiam ser perdidas. Atualizando a matriz e realizando todas as outras operações necessárias no relógio de forma “manual”, temos a certeza que a interrupção externa será atendida sempre que solicitada.
INTERPRETAÇÃO DO MOSTRADOR O relógio proposto neste artigo tem seu mostrador desenvolvido para mostrar horas, minutos e segundos na forma binária “BCD”. As colunas demonstrarão o horário conforme a tabela abaixo. Tabela – interpretação do mostrador do relógio
Você deve estar curioso a respeito do mostrador e a forma selecionada para o mesmo. É importante salientar que utilizei uma particularidade da notação binária neste mostrador. Os valores não são demonstrados no formato binário puro, mas sim no formato BCD (Binary Coded Decimal - Decimal Codificado em Binário). No formato BCD cada dígito de um valor decimal qualquer é codificado (ou representado) separadamente. Como um digito decimal pode assumir valores entre 0 a 9, são necessários quatro bits para a codificação em BCD de cada dígito decimal. Considere o valor 47 decimal. Sua codificação BCD ficaria então:
Se a conversão do valor 47 fosse feita para o binário puro o resultado seria b00101111. Você deve ter notado que os bits foram dispostos de maneira completamente diferente para ambos os casos. No caso binário puro a conversão é feita de forma direta, mas no caso BCD, cada “digito decimal” (4 e 7) foi convertido separadamente. Se o mostrador do relógio fosse desenvolvido para mostrar valores binários puros, este teria para segundos, minutos e horas um número de LEDs de acordo com o máximo valor para cada, ou seja, para segundos e minutos seriam necessários seis LEDs (para cada) e para as horas cinco LEDs no total. Um total de 17 LEDs apenas seriam necessários para nosso mostrador (três a menos que a configuração escolhida). A figura abaixo demonstra este tipo de mostrador. Fica fácil concluir que neste tipo de codificação fica bastante difícil identificar com precisão e velocidade o horário correto. Pense mais no assunto e como exemplo escreva em binário, utilizando a figura, o seguinte horário: 22:18:49 (HH:MM:SS). Claro que a operação não foi das mais fáceis. Agora imagine a situação contrária: ao invés de escrever um determinado horário, você terá de ler outros tantos. Com a notação BCD tudo fica mais fácil. Cada coluna de LEDs guardará apenas os seguintes algarismos em binário:
Assim fica mais fácil a leitura. Veja o mesmo exemplo dado anteriormente para o horáio 22:18:49 na figura abaixo, agora no formato BCD adotado em nosso mostrador. TESTE E USO Após a montagem, seja qual for o método escolhido, aconselho uma verificação minuciosa na mesma. Reveja todas as ligações, as soldas, posições dos componentes, etc. Gaste alguns minutos nesta verificação. Não tenha pressa em ligar o circuito. Alguns minutos gastos em uma boa verificação poderm representar a diferença entre o sucesso e o fracasso nesta montagem. Faça o download do "pacote programa" e grave o arquivo HEX fornecido no microcontrolador.
Configure o jumper “JP1” de acordo com o formato desejado para as horas (12h ou 24h). Ligue o circuito à rede elétrica. Imediatamente você deverá ver as colunas dos LEDs se acenderem seqüencialmente, da direita para esquerda. Isso indica que nenhum horário está acertado no relógio. Pressione “S1” ou “S2” quando a seqüência estiver se iniciando (quando a primeira coluna a direita estiver para acender). Se o modo ajuste foi aceito a coluna da “unidade” dos minutos piscará indicando que o ajuste será feito para os minutos. Pressione S1 (AJUSTE) até obter o tempo desejado para os minutos (1 até 60 em BCD). Para ajustar agora as horas pressione momentaneamente S2 (TROCA). A coluna para “unidade” das horas piscará indicando que o ajuste agora será feito para as horas. De acordo com “JP1” o ajuste pode ir até 12 ou então até 24 (em notação BCD). Com o ajuste pronto, pressione mais uma vez S2. O relógio piscará novamente seqüencialmente todas as colunas (apenas uma vez) indicando que o ajuste foi finalizado e o tempo começara a ser contado (basta observar a contagem dos segundos – inicio em 0). O circuito é funcional e não apresentou qualquer problema durante os testes no meu laboratório. E o mesmo está em uso em minha mesa desde a sua idealização (janeiro/2006) sem nenhuma alteração em relação ao circuito aqui divulgado. Caso
o seu relógio não funcione adequadamente, você
deverá verificar
sua montagem novamente. Reveja todas as etapas.
Verifique se não
existem erros na confecção da placa, se não há
soldas frias ou
pequenos curtos provocados por pontos muito
próximos, a ligação
dos LEDs, etc. Verifique a gravação do seu
microcontrolador também. Toda verificação deve ser feita com muita calma, e preferencialmente com a ajuda de um amigo ou professor. Geralmente um “terceiro” tem mais chance de encontrar um erro que nos passou despercebido.
CONCLUSÃO Sei que a maioria dos circuitos dos relógios montados nos cursos de eletrônica digital são feitos com lógica digital discreta, sem o uso de microcontroladores. Mas para a maioria dos estudantes a montagem de um relógio digital microcontrolado é também bastante interessante, pois complementará o seu aprendizado. E o projeto aqui apresentado também tem grandes chances de fazer sucesso em uma feira de eletrônica, impressionando professores com o domínio dos microcontroladores e visitantes com o desafio na leitura do mostrador binário. Boa montagem e até a próxima!
DOWNLOADS - Circuito eletrônico - Desenho da placa "botton layer" não invertido - para método transferência térmica - Desenho da placa "top layer" invertido - para método transferência térmica - Desenho da placa "Top Silk layer" invertido - para método transferência térmica - Lista de materiais - Pacote Programa - incluso arquivo HEX para gravação do PIC Este projeto foi publicado, com minha autorização, na revista Eletrônica Total nr 115 de Maio/Junho de 2006. Especificações: - Microcontrolador : PIC16F628
|
Copyright deste conteúdo reservado para Márcio José Soares e protegido pela Lei de Direitos Autorais LEI N° 9.610, de 19 de Fevereiro de 1998. É estritamente proibida a reprodução total ou parcial do conteúdo desta página em outros pontos da internet, livros ou outros tipos de publicações comerciais ou não, sem a prévia autorização por escrito do autor. |