FREQ_METER_TINY – FREQUENCIMETRO COM LCD USANDO PIC 12F629

Atualizado em 18/10/2012
Já pensou em montar um frequencimetro com Lcd usando um PIC12F629? Algumas pessoas já pensaram, eu sei (algumas pessoas já perguntaram sobre isto em blogs!!!).
Mas exigiria ligar um cristal externo, tomando 2 IO’s (ou seja, perdendo 2 pinos). O PIC12F629 dispõe somente de 5 IO’S + 1 entrada (se não usar o ‘reset externo’). E para ligar o LCD? Mais 6 pinos com função plena de IO (entrada/saida). Mas …. sobrou somente ‘míseros’ 3 pinos!!! A metade do que nós precisamos, sem contar que também precisamos de uma das IO para ler a frequencia.
“Há !!! Já sei…” dirá alguém , “vou usar um outro chip para expandir IO’s”. Seria uma boa solução, mas …NADA DE OUTRO CHIP,CERTO!!! Aí a porca torce o rabo. Que ótimo desafio, não concorda? Mas … já foi vencido. Quero apresentar o FREQ_METER_TINY !!!

Este projeto visa mostrar o que se pode fazer quando se utiliza varios recursos da eletronica para obtenção de um objetivo.
Qual o “objetivo” em questão? O desafio de conseguir montar um circuito que originalmente utiliza um microcontrolador com muitos pinos, usando um processador com poucos pinos e obter resultados similares. Assim, esta materia pretende focalizar na tecnica de “multiplexação para LCD”. O que é isto?
No artigo “Hcs_Prog_Tiny – programador de Hcs 200…301…” iniciei o uso do método ‘Lários’ que usa RC + Delay para definir o nivel de tensão no pino ‘RS’ do LCD. Então, pensei comigo, e se fizessemos o mesmo com os pinos DB7…DB4? Seria em teoria, necessário somente 3 pinos para transmitir dados/comandos para o Lcd.
Em principio, funciona da seguinte maneira, usando basicamente 6 fases para o envio de cada nibble (4 bits) para Lcd em modo 4 bits:

1) Colocar na linha ‘DB7’ o valor de ‘DB5’ e colocar na linha ‘DB6’ o valor de ‘DB4’. Se for um dado , setar (1) a linha ‘E’ e se for comando resetar (0) a linha ‘E’.
2) Dar um Delay (em torno de 800 a 1000 uSeg) para carregar os capacitores ligados nos pinos ‘DB4′,’DB5′,’E’. Se a linha era ‘0’, não haverá carga, logicamente.
3) Colocar na linha ‘DB7’ o valor de ‘DB7’ e colocar na linha ‘DB6’ o valor de ‘DB6’ .
4) Imediatamente, pulsar a linha ‘E’ para enviar para o Lcd estes 4 bits (sendo 2 atuais e 2 carregados nos capacitores).
5) resetar(0) ou zerar ‘DB7’, ‘DB6’ e ‘E’.
6) Dar um tempo de Delay de aproximadamente 1 mSeg para descarregar os capacitores carregados.

Agora é só repetir o mesmo para o proximo nibble , colocando na linha ‘DB7’ o valor de ‘DB1’ e na linha ‘DB6’ o valor de ‘DB0’ (Passo 1). Depois Delay, depois no Passo 3 colocar na linha ‘DB7’ o valor de ‘DB4’, na linha ‘DB6’ o valor de ‘DB3’. O resto é igual. Tá dificil de entender? No inicio também achei. Mas funciona. Conforme o valor dos capacitores e as tolerancias dos resistores, talvez precise aumentar um pouco o Delay. Tudo feito na base da tentativa e erro. Mas tem uma grande tolerancia e com os valores mencionados, não deverá haver problemas.
Vamos agora a parte da leitura da frequencia. Estou usando o timer 0 como contador de pulsos por um periodo de 1 Seg. Temos que usar o prescaller, senão não conseguimos ler frequencias maiores que 800 khz. Para extrair o valor do prescaller, usei o artificio de alternar entre oscilador interno e pulso externo (aterrado) e a cada pulso, verificar se o timer 0 incrementou. Estes são os pulsos que faltaram para chegar a 0. Portanto, basta subtrair de 0 e obter o seu valor.
Note que o pino 5 (gpio,2) trabalha como a entrada externa de contagem e após obter a frequencia, como saida para envio de bit para o LCD.
Todo o programa ocupa apenas uns 500 bytes de flash da memória de programa. Testei ele com um oscilador em 24.560.067 hz e ele mostrou de forma adequada esta frequencia. Não entrarei no mérito da precisão, que não é o objetivo deste projeto. Mas para os aficcionados, poderão colocar um trimmer junto ao cristal de 4 MHZ para ‘sintonizar’ a contento. Também, como sugestão, pode ser instalado um prescaller na entrada para aumentar a faixa de leitura em altas frequencias.

Segue o esquema

Segue o código asm

FREQ_METER_TINY_ASM

Segue o código Hex

FREQ2_METER_TINY_HEX

Desenho da placa (pdf), click aqui.

Desenho da placa com com componentes, click aqui. Atenção!!! visto pelo lado de baixo.

O arquivo gerador para placa (abrir com ExpressPCB), click aqui. (Se desejar, poderá mudar o layout da placa, você mesmo).

Lista de materiais, click aqui.

Nota de errata: Desenho da placa anterior faltava ligações do pino 7 do PIC e um resistor de 220 ohms, de proteção no pino Db7 do LCD, cuja função é evitar conflito de I/O entre microcontrolador e LCD, em certas situações, o que poderia levar a queima de um dos componentes. Foi anexado o arquivo gerador (abrir com o programa ExpressPCB) e se houver mais algum erro, ou desejar mudar o layout da placa, sinta-se a vontade. Também o transistor Q1 tem suas pinagens corretas para BC548 e não para o BF254. Altere a montagem dos pinos ao montar (se a placa já foi feita) ou acerte no arquivo gerador antes de fazer a placa.

Até o próximo artigo!!!

Curiosidades:
Solucionado mistério do diamante!!!
O gigante do céu – Zepelim
Concorde – entrou para história da aviação

Outros assuntos:
Como lidar com doença crônica
Como controlar meu peso

63 comments on “FREQ_METER_TINY – FREQUENCIMETRO COM LCD USANDO PIC 12F629

  1. Caro Claudio, boa noite.
    Exatamente isto. Caso o frequêncímetro LCD apresentar a frequência subtraída em 7 dígitos, por ex.: 7.020.00 Mhz ou 14.020.00 Mhz, resolveria o problema (6 dígitos já ajuda bastante). Coloquei “7” e “14” pelo fato de quando for “7” a casa da esquerda ficaria apagada, entendeu.
    Aquele asm para counter LED que voce corrigiu está muito bom. Pena que é para display LED e tem apenas 5 dígitos (7.0200 e 14.020). Ficou um pouco deficiente porque na primeira situação não tem um “.” antes da última casa decimal e na segunda situação porque não tem o “.0” depois da última casa decimal. Fora esses detalhes etá tudo certinho.
    Por gentileza, me abra uma janela para te enviar o arquivo.
    Forte abraço e muito obrigado.
    Att,
    João.

  2. Caro Claudio, boa noite.
    Já montei e não funcionou. Usei o LCD 2 x 16 e um cristal de 4Mhz.
    No site OM3CPH tem uma versão de PY2RLM com PIC 16F628. Naõ sei se aceita FI. São dois arquivos. Um .asm e um .inc – Tentei compilar deu um erro.
    Voce poderia analisar esse arquivo e corrigir o erro. Aí vou montar e ver o que vai acontecer.
    Caso voce não encontre no site eu te mando via e-mail.
    Desculpe estar de incomodando com meus problemas.
    Att,
    João.

    1. Olá João! Poderia mandar por email, por favor? Fica mais fácil saber qual deles você quer. Me responde uma coisa: Você precisa de um frequencímetro que tenha uma única frequência de fi subtraindo? Se for uma só e feita na compilação, não é muito difícil de fazer.
      Cláudio

  3. Caro Claudio, boa noite.
    Já verifiquei. Pesquisando na web encontrei no site de OM3CPH um counter_LCD interessande e aparentemente simples. o pacote é composto de 01 .asm; 03 .inc e 01 .exe. Este executável serve para fazer o cálculo. Ao executá-lo abre uma tela onde se faz a configuração e insere a FI; ele calcula e gera mais três arquivos .inc.
    Para que a compilação funcione o .asm e os 06 arquivos .inc deverão ficar no mesmo diretório. Fiz a compilação e deu “zero” erro.
    Pelo que consegui entender a FI ficou gravada no .hex.
    Quanto ao circuito, em tese, ao ligá-lo, teremos então duas opções: “add” e “sub”. Alimentando-se RA2 (pino 1 do PIC16F84) ativa “add” e sem alimentação ativa “sub”.
    Voce poderia dar uma analisada técnica nos arquivos? Se for como estou pensando acredito que dará certo.
    Att,
    João

    1. Olá João! Eu não consegui abrir os executáveis por não ser compatível com o Windows usado na minha máquina. Mas parece ser isto mesmo. Experimente monta-lo em protoboard. Se for o que deseja, poderá monta-lo em placa de circuito impresso definitiva.
      Cláudio

  4. Caro Claudio, bom dia.
    Entendi. Nesta versão com o PIC12F629 existe a possibilidade de incluir uma rotina para subtrair frequência. A minha intensão é usá-lo em rádio com FI.
    Em tempo:
    Aquele asm para PIC16F628A que te enviei, sobre o freq_counter, que voce corrigiu é para display de led. É possível aproveitá-lo, procedendo algumas alterações, objetivando funcionar com display LCD?
    Att,
    João.

    1. Olá João! A versão com 12f629 já esta com o limite de instruções quase no máximo, sobrando misera 32 linhas, as quais seriam insuficientes para acrescentar a mudança desejada. Quanto a alterar o tipo de mostrador, geralmente é possível, se ainda sobrar espaço no programa e não atrapalhar, de alguma maneira, os tempos de amostragem do sinal, que tem que ser precisos. Verificou se o autor já não tem uma versão com LCD?
      Cláudio

  5. Caro Claudio, bom dia.
    Com relação ao seu frequêncímetro tem como voce substituir o PIC12f629 pelo 16F628A e incluir o recurso de subtrair frequências?
    Att,
    João.

    1. Olá João! Esta versão é especifica para este pic. Somente com um novo código completo para pic 16f628a.
      Claudio

Comments are closed.

Back To Top