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. bom dia cladio
    intaum amigo xego o display e eu consegui termina o seu projeto.. tipo tenho algumas duvidas sobre o funcionamento.
    tipo ele e bem sensivel qualker coisa ele jah tah medindo e ate eu ficando perto ele muda a frequencia
    tah certo isso??
    eu ate colokei ele em um box de plastico pra naum pegar interferencia ..
    tipo assim esclarece pra min essa duvida e tipo me diz o modo de usar cetinho..
    mais uma veiz obrigado
    abraco

    1. Olá Fabinhos! Quando as pontas do frequencimêtro estão desligadas, você verá indicação de frequências parasitas induzidas no fio, e isto é normal. Os frequêncimetros comerciais já vêm com circuitos que acertam níveis de tensão de forma automática. Este projeto não tem isto, e você deverá , usando de bom senso, escolher o divisor de tensão resistivo apropriado na entrada. Isto visa ter tensão apropriada de trabalho, na entrada do aparelho, para não danificar. Este divisor pode ser, por exemplo, um simples potenciomêtro (10k a 220k, dependendo da tensão de entrada). Um extremo você liga ao gnd, o meio deverá ligar a entrada do frequencimêtro e o outro extremo na fonte de sinal a medir. Regula-se o potenciometro para se ter uma medida estável de frequência ( regule do minimo para o máximo gradativamente, procurando manter tensões abaixo de 3 volts na entrada do frequencimetro).
      Claudio

  2. claudio boa noite
    c tah certo e bem complicado mesmo jah tinha ideia disso tipo axei ki era uma forma de eu aprender tb .. entende tipo na verdade o ki eu kiria fazer e trazer o resultado mais para eskerda pra ver um poco mais pq so aparece os dois primeros digitos eo primeiro ponto .
    e em kestaum dos pontos naum precisa eu conto as casa heheh mas blz.. claudio obrigado pq eu gosto muito de aprender e vc ensina bem
    mas tem ki sabber qunafo naum compensa neh
    agradecido
    abraco

    1. Olá Fabinhos! Assim que tiver um tempo, vou passar no papel um rascunho desta rotina, para você ‘aprender’ a ‘idéia’ da coisa na prática.
      Claudio

  3. bom dia
    intaum claudio fiz exatamente isso abreviei do jeito ki vc falo `frequ:` na primeira linha mas naumsei como mexer nah segunda linha doh diz onde eu mudo pra trazer os caracteres mais pra eskerda ..tipo jah comprei o display de 16×2 dessa veiz comprei 3 pra naum perder o embalo mas e ki demora um poco pra xega
    moro no interior heheheh
    amigo obrigado

    1. Olá Fabinhos! Tem certeza disso? A segunda linha fica mais complicado pelo seguinte: se você estiver medindo 40mhz por exemplo, teria que mostrar assim:
      40.000.000 hz, ou seja 13 digitos e voce verá no seu assim: 40.000.0 , matando o restante. Uma possibilidade seria testar o byte mais significativo do resultado e se for zero, passar para o próximo, sendo que a cada zero encontrado você incrementaria um contador de escala (poderia usar uma posição da ram e nomea-la, por exemplo de ‘escala’). Quando encontrasse um byte diferente de zero, passaria a mostrar no lcd, com no máximo , 4 digitos (incluindo o ponto). Depois, deve analizar o contador ‘escala’ e fazer uma rotina de decisão, se usará ‘MHZ’,’KHZ’ ou ‘HZ’ no final. É uma rotina meio chata de se fazer, pois precisa também acertar o ponto, entre casa certas.

      Ex. lendo resultados como : 00000080 , cada ‘0’ incrementa, então ‘escala’ seria =6 sendo: de 0 a 2 = ‘MHZ’ , de 3 a 5 = ‘KHZ’ , de 6 a 8 = ‘HZ’

      Você veria no lcd: 80 HZ

      Deu para ter uma idéia (nem que remota) da dificuldade?
      Claudio

  4. claudio bom dia
    mais uma veiz to aki c eu tive sendo pode fala!!!
    intaum agora sim funcionou com a troca do bf pelo bc brigado
    mas e seguinte como keimei o display de 16×2 to esperando xega mas consegui um de 8×2 ki fungou blz.. ate consegui abreviar a inializacao pra caber no display 8×2 … como faco para trazer a linha de baixo a ki mede a frequencia no codigo asm tipo e ki soh tah o comeco pq e soh oito digitos axo ki vc entendeu tipo onde eu mudo no asm pro caracters vim para esquerda
    dinovo um muito obrigado
    pela paciencia

    1. Olá Fabinhos! Vai complicar muito. Toda a rotina de apresentação de nome ‘Show_lcd’ terá que ser reescrita, a palavra ‘frequencia’ não poderá ser usada, nem o final ‘hz’, exceto se reduzir para ‘Frequ:’ na primeira linha e os números na segunda: ‘99999999 sem ponto, ou talvez , fazer por escala de frequencia, com 3 ou 4 digitos no máximo, por ex. leituras como estas : 101,3Khz , 34,23MHZ, 1200hz . Sugiro que voce consiga um Lcd 16X2 que não é dificil de ser encontrado (R$20,00). Deixe este para futuros projetos que voce queira fazer.
      Claudio

  5. boa tarde
    vou retomar na kinta feira pq de tanto mexe keimei o display zerado
    dae soh xega um novo nah kinta tah c faltou eu le td bem mas ki tv na imagem e na lista de componentes dae erra mesmo tipo passa pra os pinos certos ki tenho ki ligar e a onde ligar tipo(1,2,3) brigado claudio

Comments are closed.

Back To Top