MICROCONTROLADORES PIC – PRÁTICA - PARTE 4
CONTROLE DE DISPLAYS DE SETE SEGMENTOS



OS DISPLAYS DE SETE SEGMENTOS

Os displays de sete segmentos são compostos, basicamente, de sete led’s internos dispostos de maneira a formar um “dígito”. De acordo com que são “acesos” ou “apagados” é possível demonstrar os números de “0 a 9” e até mesmo algumas letras. Na figura abaixo você tem alguns tamanhos encontrados no mercado.

Na figura abaixo é possível observar a posição de cada segmento, sua nomenclatura, assim como sua ligação através dos pinos pinos. Existem muitos outros modelos, com pinagens diferentes e até mesmo com mais segmentos. E antes de usa-los é recomendável uma consulta ao datasheet do fabricante.



Além dos tipos, tamanhos, cores e “pinagens” diferentes temos também que observar a ligação do pino “comum”. Ele pode ser do tipo “Anodo comum” com ligação no VCC ou “Catodo Comum” com ligação no GND. A escolha de um ou outro depende do tipo do projeto, mas um não substitui o outro. A figura abaix demonstra os dois tipos de ligação.

Como podemos notar, precisamos de sete (ou oito se considerarmos o ponto) pinos de I/O de nosso microcontrolador para ligar um display. Mas e se precisarmos controlar mais que um?! Como fazer se o PIC16F84 só tem 13 pinos de I/O?? Simples usamos o recurso da “varredura”.


A varredura não serve apenas para entradas, mas também saídas. Na figura abaixo, temos a demonstração de como isso pode ser implementado. Ligamos todas as linhas dos segmentos juntas. Assim quando enviamos um valor para um display, estamos enviando para todos.

O que determinará qual display mostrará o valor é o controle do anodo/catodo. Ao inserir um valor na linha, estando todos os anodos (ou catodos) desligados, nenhum display acende e não temos nenhum valor em nenhuma posição. Porém se ligamos um dos displays através de seu anodo (ou catodo) o valor será apresentado por este display e na posição desejada.

Para mostrar um outro valor, em um outro ponto, basta trocar o valor da linha e ligar apenas o display desejado. Podemos assim fazer uma varredura, usando mais de um display e apenas uma linha de dados para sete segmentos. O ponto mais importante é a velocidade com que isso é feito, pois devido à “persistência retiniana” não perceberemos que os valores estão sendo trocados e muito menos que a posição dos mesmos variou. Vemos assim um valor com um número de dígitos, todos mostrados ao mesmo tempo. Em média podemos usar tempos de 5 ms (0,005s) a 30 ms (0,03s), tempos mais que suficientes para enganar nossa visão.


DUAS TAREFAS AO MESMO TEMPO

O que proponho neste exercçio é simples. Construiremos um pequeno timer, que contará de 0 a 60 segundos. Parece uma aplicação tola, mas não é. Esta é a base para a construção de um relógio, de um temporizador preciso ou qualquer aparato que necessite do controle de tempo. Esse tempo será demonstrado através de dois dysplays de sete segmentos. Para isso teremos que controlar os dois displays para formar os números de “00” à “60” usando o método da varredura, utilizando um segundo temporizador (5 a 30 ms) para trocar os valores nos displays. Isso, conforme detalhado não será difícil.

Agora, como contar o tempo de a a 60 segundos de forma precisa?! Nossa rede elétrica (110V/220V) tem uma freqüência de 60Hz. Ou seja, ela troca sua polaridade sessenta vezes em um segundo. Portanto, se conseguirmos detectar e contar sessenta trocas teremos ao final um valor que representará “1” segundo.


O PIC16F84A possui uma entrada para interrupção externa no pino RB0/INT, ou seja, ela pode detectar a troca de um nível nesta entrada. Podemos então detectar a transição de um sinal qualquer de “0” para “1” ou de “1” para “0” de maneira rápida e com a garantida de não perder nenhum pulso. Dessa maneira será possível fazer a varredura dos displays mostrando os valores desejados e “contar” de 0 a 60 segundo ao mesmo tempo (através da interrupção). Veja a figura abaixo para entender melhor como isso será feito.




O CIRCUITO

Na figura abaixo você tem o circuito elétrico para o exercício proposto. Temos o PIC16F84A com seu resistor de “reset”, o conjunto cristal mais capacitores para o clock e os displays e com seus resistores limitadores de corrente (não podemos ultrapassar a corrente máxima de dreno dos pinos de I/O do PIC, lembra-se?!).

Desta vez a alimentação será feita, necessariamente, através de uma fonte. A alimentação por pilhas não será usada, pois já que o circuito precisa do sinal de 60Hz e este será retirado diretamente do transformador redutor, nada mais simples que fazer uma fonte aproveitanto esse mesmo transformador.

Obs.: Não tente retirar os 60Hz diretamente da rede elétrica 110V/220V. Além do risco de choque elétrico, você poderá causar um curto circuito na sua rede e também danificará, irremediavelmente, o circuito com o PIC. Siga a montagem conforme descrito aqui e utilize um transformador redutor.

O sinal de 60Hz é retirado em um dos pontos do transformador onde a tensão já foi reduzida. Este ponto não deverá ser o ponto de terra (tomada central do secundário no transformador). Em nosso projeto usamos um transformador com “Center TAP” (tomada central) e o sinal pode ser retirado em qualquer um dos pontos de tensão (12V).


Os displays utilizados são do tipo “Catodo comum” e pequenos (veja lista de materiais). Para usar um tipo maior, será necessário a construção de um drive com transistores para as linhas, evitando um dreno excessivo de corrente nos pinos de I/O do PIC. A figura abaixo mostra como preparar este drive para displays de “Catodo comum”. O transistor de controle do anodo também deverá ser modificado, por um que suporte uma corrente de coletor/emissor superior a corrente total consumida pelo display. 
O “beep” (buzzer) é do tipo piezo elétrico, com faixa de alimentação de 12 a 30V.


O PROGRAMA

O código fonte, devidamente comentado, pode ser obtido no final desta página. Veja em downloads. 

A figura abaixo apresenta o fluxograma do programa. Darei a seguir uma breve descrição de seu funcionamento.


O microcontrolador começa iniciando o ambiente, as variáveis e em seguida libera o uso de interrupções. Como você pode notar, ele fica preso num loop (laço) eterno de atualização e varredura para os displays.

Quando ocorre a transição de sinal no pino PB0, uma interrupção é gerada e o PIC desvia o processamento para o endereço 0004H, em “PICINT”, onde ele executa o desvio para o tratamento da interrupção. Este tratamento nada mais é que a contagem do número de chamadas. Quando atingem sessenta chamadas os valores nos displays são alterados, de acordo com o contador de segundos (variável).

Quando o valor mostrado no display for igual a “60”, o PIC desabilita as interrupções parando a contagem e ativa o alarme através do buzzer. Para iniciar novamente uma contagem, basta pressionar o reset e uma nova contagem terá inicio do “00”.

Um ponto interessante a ser notado neste programa é que a “temporização” feita para a varredura dos displays é feita por software. Poderíamos aqui, neste caso, usar o TIMER interno do PIC para isso. Ele realizaria a contagem e através de algumas linhas de código, determinaríamos o tempo passado. Uma outra interrupção seria feita avisando sobre o ocorrido e então procederíamos à atualização do display. Porém isso não alteraria de forma significativa o propósito da aplicação. Mesmo sem muita precisão na temporização por software não temos problema, pois tal temporização é usada apenas na varredura. Aqui a precisão não é ponto chave. Portanto, é importante determinar qual operação requer maior precisão e não pode esperar, mesmo que alguns ciclos de máquina, antes de determinar qual função de nosso projeto “herdará” a interrupção.

Vale comentar também que durante o “atendimento” de qualquer interrupção, devemos salvar os registradores de controle do PIC mais importantes (W, STATUS, etc). Assim quando terminamos os procedimentos da interrupção podemos restaura-los como estavam, antes da chamada. Alguns compiladores possuem recursos para salvar e restaurar automaticamente estes registradores durante uma chamada de interrupção, mas o compilador Assembly Microchip não possui este recurso. Nunca se esqueça de salvar/restaurar tais registros (veja no programa como isso é feito).


CONCLUSÃO

O uso de um microcontrolador muitos projetos que antes pareciam complexos podem ficar bem simples. Mais uma vez alerto sobre a importância de se compreender o conceito. Com ele, independente da linguagem de programação, o desenvolvedor poderá controlar o dispositivo que desejar, poisa saberá aplicar um "conceito". Sem ele, esse tal "desenvolvedor" vai continuar apenas no "Control Chupe"!!!




DOWNLOADS:

- Código fonte

Lista de material

Semicondutores

CI1 – PIC16F84A-4/P – microcontrolador Microchip
CI2 – LM7805 – regulador de voltagem para 5V/1A
D1, D2 – 1N4001 – diodo retificador
Q1, Q2, Q3 – BC337 – transistor NPN
DISP1, DISP2 – MCD548K (display de sete segmentos catodo comum)


Resistores

R1 – 330R (laranja, laranja, marrom)
R2 a R8 – 560R (verde, azul, marrom)
R9 – 15K (marrom, verde, laranja)
R10, R11, R12 – 1K (marrom, preto, vermelho)
R13 – 4k7 (amarelo, violeta, vermelho)


Capacitores

C1, C2 – 33pF cerâmicos
C3 – 100nF cerâmico
C4 – 2200uF x 35V eletrolítico
C5 – 100uF x 16V eletrolítico
C6 – 0,1uF poliéster


Diversos

T1 – transformador 9V+9V ou 12V+12V com corrente igual ou superior a 300mA
BZ1 – Buzzer (beep) sem oscilador interno com tensão de trabalho de 12V a 30V
Pront-o-board (matriz de contatos) ou placa para montagem, fios para ligação, etc




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