Você gostaria de conferir se seu PIC está com seu oscilador interno calibrado corretamente? Veja mais…
Na familia 12F temos um recurso para calibrarmos corretamente a frequência do oscilador interno. Ao ser fabricado e testado, descobre-se qual é o valor correto a ser colocado no registrador ‘OSCCAL’ para que chip oscile exatamente a 4mhz com tolerância de 1%. Este valor é gravado na última posição da flash, ou seja , no enderêço 0x3FF. Pode acontecer de acidentalmente gravarmos sobre este valor de calibração. O resultado é que perdemos a precisão da frequência, ficando díficil trabalhar com certas rotinas, em que o tempo preciso é fundamental. Um exemplo típico é o uso da comunicação serial. A solução está em recalibrar. Mas como fazer isto?
A MicroChip fornece em uma das suas Note Application (AN250) uma maneira de fazer isto. Mas a proposta aqui será um pouco diferente, não necessitando de um preciso gerador de 5khz, mas de um simples frequêncimetro (destes que já vem embutidos na maioria dos multitesters, desde que esteja ‘calibrado’). A proposta é colocar o chip para trabalhar com a ‘PALAVRA DE CONFIGURAÇÃO’ ajustada para ‘oscilador com saída externa de clock’ e monitorar a frequência de saída (pino 3), enquanto aumentamos/reduzimos o valor do registrador ‘OSCCAL’.
Veja o circuito abaixo:
O circuito é bem simples, fazendo uso de 3 chaves dactilares ou botões, 1 transistor PNP de uso geral, 1 diodo e, alguns resistores. O botão no pino 2 (UP) é usado para aumentar a frequência do oscilador interno do PIC. O que está no pino 7 (DOWN) é usado para reduzir a frequência e o último botão, no pino 6, é para visualizarmos o resultado da calibração na tela de um PC, rodando um programa terminal (HyperTerminal, por exemplo), via serial RS232(IEA232). Mas se desejar simplicar, esta parte pode ser suprimida (tudo o que estiver ligado no pino 5 não precisará ser montado).
Sem esta parte, como veremos o resultado? Por ler a EEPROM usando um programador de PIC.
Nos endereços iniciais da EEPROM, na posição ‘0’ ficará o valor atual que está no PIC. Já a posição ‘1’ nos mostrará qual é o melhor valor alcançado pela calibração. Este é o que será usado. Note que as vezes, a calibração poderá apresentar o mesmo valor do atual. Neste caso, o chip está calibrado e não deverá fazer nenhuma alteração.
Abaixo, veja como é apresentado os valores na EEPROM:
COMO USAR ESTA IDÉIA?
Siga os passos seguintes:
1) Compile o arquivo ASM para a opção que desejar, escolhendo se será para PIC12F675 ou PIC12F629, por comentar/descomentar opção de usuário para modelo de microcontrolador.
2) Carregue o arquivo HEX no chip.
3) Coloque em um protoboard e ligue os componentes conforme esquema acima (ou faça uma placa, com soquete ZIF, se pretende calibrar muitos chips)
4) Conecte uma ponta do FREQUENCIMETRO no pino 3, e a outra no GND.
5) Ligue a alimentação de 5 volts, bem regulada.
6) Leia a frequência e se estiver abaixo de 1 mhz, aperte o botão ‘UP’ até chegar neste valor. Se passar, aperte o botão ‘DOWN’. Procure o valor que dê o menor erro percentual da frequência (1%).
7) Leia com o programador de PIC, a EEPROM. e veja no endereço ‘0’ o valor atual, e no ‘1’ o valor achado na calibração.
8) Se estiver usando a serial, rodando o HyperTerminal, a 38400 bauds, 8 bits, sem paridade, no hadshake (none), então aperte o botão ‘VER’ e observe a tela do seu PC.
Deverá aparecer algo assim:
COMO USAR O VALOR ENCONTRADO NESTA CALIBRAÇÃO?
Seria interessante conferir seu estoque de PIC’s de um determinado modelo, antes de carregar o software para o outro modêlo.
Algo prático seria obter o byte de calibração adequado e anotarmos embaixo do chip com caneta para marcar ‘CD’. Faça isto com cada chip que conferir.
Depois, quando for usar, veja o valor que você anotou embaixo do chip. Na ocasião que for compilar um arquivo ASM de algum projeto seu, inclua o seguinte na última linha antes do ‘END’:
ORG 0X3FF
RETLW 0XYY ; sendo ‘YY’ o valor que você anotou embaixo do chip, obtido na calibração.
end
Assim, ao carregar o seu novo HEX, irá junto o valor correto para o byte de calibração.
Curiosidade: Por que não funciona um programa, em especial, se gerado por compiladores C, quando o pic está sem o byte de calibração?
No compilador ‘C’, de forma automática, no início do programa, irá buscar o byte de calibração usando uma chamada de rotina (call) para o endereço 0x3ff. Para retornar da rotina, precisa encontrar o ‘retlw’ + valor de calibração (por ex. 3480; onde 34= retlw e 80= 0x80 para a calibração). Se estiver ‘apagado’ encontrará um 0x3fff. Não ocorrerá o retorno da subrotina e o programa se perde e reseta (vai para org0x00) e recomeça…reseta…. em loop eterno.
Em programas feitos em Assembly, somente dará problema citado se o programador usou a instrução ‘CALL 0x3ff’ no início do programa. Caso não tenha usado, a frequência do oscilador será dado pelo valor padrão 0x80 (médio). Apenas que não temos tempos confiáveis nas rotinas de delay, variando de pic para pic (descalibrado).
Como descobrir se perdi o byte de calibração de meu PIC?
Basta ler a Flash (a memória de programa) e procurar no endereço 0x3ff (último) se tem um número começando com 34xx. Se encontrar, então existe o byte. Se ver apenas 0x3ff nesta posição, ele foi apagado.
Obs. Esta montagem é apenas didática, sujeita a bugs não identificados até o momento e sendo testada apenas em placa de protoboard. Está sendo fornecido o arquivo ASM, o qual poderá ser modificado conforme as necessidades do hobista.
Segue o arquivo ASM:
Segue o arquivo HEX( para 12f675):
Poderá baixar pasta zipada abaixo com os arquivos desta montagem:
Manuais:
datasheet 12F675/629
Note Application AN250
Curiosidades:
A ilha que apareceu e desapareceu
Maravilhas e mistérios das profundezas
Todos os caminhos levavam a Roma?
Estamos ficando sem água?
Florestas tropicais – como explorar sem destruir?
Busca de um céus mais seguros
O que aprendemos dos projetos da natureza?
Nostalgicos moinhos de vento!
A história da ‘cortiça’
Carros – no presente e no passado
O sistema de ‘spray’ do besouro
Ouvindo sons do espaço
Porque as estrelas são cintilantes?
Uma voz silenciosa que pode se ouvida
Outros assuntos:
Como criar filhos responsáveis
Como administrar o seu dinheiro
Ensine valores morais a seus filhos
Ensine seus filhos bons principios com atividades de colorir
Como posso ter ânimo para exercitar
Como posso controlar meu peso?
Entrevista com um bioquímico
Adolescentes- O que fazer se estou sofrendo bullying?
Como evitar ferir com palavras?
Como tratar seu cônjuge com respeito?
Até o próximo artigo!!!
Boa noite Cláudio. Muito bom esse artigo; simples e funcional. Já aconteceu de eu apagar e gravar “valor chutado”. Pela Microchip é muito complicado. Obrigado.
Olá J.Martins!
Muito obrigado por sua demonstração de apreço em seu comentário. Fico muitíssimo feliz que o artigo esteja sendo útil a alguém.
Sucesso em seus projetos!
Cláudio
olar craudio como baixar o hex desse arquivo
Olá José Carlos!
Poderá pegar na pasta zipada junto ao artigo ou clicar aqui.
Cláudio
🙁 Ok Claudio, de ATmega16 sei nadinha, ja em pic me arrisco dar umas mexidas logico com alguns exemplos como os que vc posta no seu blog,,,,,
💡 Olá Claudio, com este exemplo que vc fez veio uma pergunta, teria uma ideia como fazer um gerador de funções com pic exemplo com o pic628 ou similar para ter as funções basicas de ondas e frequencias, valeu ai por mais este exemplo, so nao to consiguindo acompanhar a sua velocidade em desenvolver para com o tempo meu para os desenhos dos pcbs por aqui kkk, abraço.
Olá Agnaldo! Sim. É possível fazer geradores de função com microcontrolador. Só não sei qual seria o limite de frequência gerada, caso fosse usado o PIC16f628. Alguns tem usado o ATmega16 e mais rápidos para isto. Quanto a acompanhar os projetos com placas, não se preocupe. A maioria dos hobistas já usam algum tipo de software geradores de desenho para placa (lógico, se estiver pronto é mais fácil para eles).
Cláudio