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”.
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 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”!!!
Imagens meramente ilustrativas.