Fork me on GitHub

29/03/13

PIC: Configurando o Oscilador Interno

PIC: Configurando o Oscilador Interno




Os microcontroladores possuem uma fonte de clock interna. Mas nem todos os microcontroladores possuem, como é o caso do PIC16F877A.


O oscilador interno pode ser constituído por 1 ou 2 osciladores. O oscilador interno de alta-frequência HFINTOSC, está ligado á um divisor de frequência, e funciona a 8MHz.


O HFINTOSC é ligado escolhendo umas das sete frequências(8Mhz - 125Khz) e ativando o bit SCS (system Clock Select) do registro OSCCON.

O LFINTOSC funciona a 31Khz e não vem calibrado de fábrica.

OSCCON - esse registro configura a frequência do oscilador.

IRCF2:IRCF0 - Seleção da frequência do oscilador interno.
111 - 8Mhz
110 - 4Mhz
101 - 2Mhz
100 - 1Mhz
011 - 500Khz
010 - 250Khz
001 - 125Khz
000 - 31Khz

OSTS - Status de uso do oscilador. ( É somente leitura )
1- Oscilador externo em uso.
0 - Um dos osciladores interno está em uso.

IOFS - Status da estabilidade do oscilador interno.
1 - Estável
0 - Instável

SC1:SC0 - Seleção da fonte de clock.

OSCTUNE - quaisquer alteração no registro, afeta somente o HFINTOSC. Esse registro faz a sintonização da frequência, fazendo com que a frequência também varia.
INTSRC - No caso do PIC18F4550 a frequência de 31Khz pode ter duas origens
1 - 31.25Khz derivado do próprio HFINTOSC.
0 - 31Khz vem do INTRC.

TUN4:TUN0 - Sintonização
01111 - Máxima frequência
.
.
00000 - Frequência central
.
.
11111 - Mínima frequência


Quando você programar o microcontrolador para utilizar o oscilador interno, no caso do PIC18F4550 ele inicia com frequência de 1Mhz. No código de programação você pode escolher uma outra frequência.

EXEMPLO:
MikroC PRO PIC
void interrupt(){
 portd.f2 = ~portd.f2;//inverte o estado da saida
 intcon.tmr0if = 0;//limpa a flag de overflow do TMR0
}

void main(){
 TRISD.F2 = 0;//pino de saida
 //Configura o oscilador interno para 8MHz
 OSCCON.IRCF2 = 1;
 OSCCON.IRCF1 = 1;
 OSCCON.IRCF0 = 1;
 //
 tmr0l = 0;
 t0con = 0b11010111;//timer0 configurado como temporizador
 intcon.tmr0ie = 1;//ativa interrupção timer0
 intcon.tmr0if = 0;
 intcon.gie = 1;//ativa interrupção global
 intcon.peie = 1;//ativa interrupção perifericos
}

3 comentários:

  1. Tenho um display 16×2, modelo JHD 162A, quando ligo ele ao pic 18F4550, com a rotina normal, o display exibe em sua primeira linha apresenta blocos preenchidos, e sua segunda linha fica em branco , gostaria de uma ajuda para que conseguisse imprimir algo no display, no proteus o programa funciona corretamente, mas quando coloco no protoboard acontece isto.

    ResponderExcluir
    Respostas
    1. Isso acontece devido ao contraste, ajuste o contraste via potenciômetro. Deve corrigir.

      Excluir
  2. Tiago, sabes se existe alguma forma de calibrar o oscilador interno do PIC, não estou falando do osctune e sim a frequência calibrada de fábrica, tenho alguns pic aqui que se programo para utilizar o oscilador interno de 4mhz e deixo o ra4 em clockout meço 1,377mhz neste pino que deveria estar próximo doa 1mhz, se configuro o osctune para que o oscilador trabalhe na menor frequência ele fica em 1,277mhz.

    ResponderExcluir

Postagens Relacionadas!!