Fork me on GitHub

Microcontrolandos

O Blog está passando por uma fase de mudanças. Todos os posts estão sendo atualizados, códigos, links e imagens estão sendo arrumados. Conteúdos novos ainda estão por vir.

Utilizando o TIMER2 do PIC

Share:

Utilizando TIMER2 do PIC




TIMER2 é um temporizador de 8 bits com um divisor( prescaler ) e um postscaler. Ele pode ser usado como a base de tempo de PWM para o modo de PWM do módulo CCP. O registo TMR2 é legível e gravável, e é eliminada em qualquer redefinição do dispositivo.

O relógio de entrada (FOSC / 4) tem uma opção de pré-escala de 1:1, 1:4, ou 1:16, selecionados por bits de controle T2CKPS1: T2CKPS0 (T2CON.01 : 00).

O módulo Timer2 tem um registo de 8 bits: PR2. TMR2 incrementos de 00h até que seu valor seja igua a PR2, depois reinicia a 00h. PR2 é um registo de leitura e escrita.


A cada n comparações, será gerada uma interrução. n é definido pelo Potscaler(1:1 - 1:16). Quer dizer que se Potscaler for igual a 1:4, depois de 4 comparações (TMR2=PR2) será gerada uma interrupção.









TOUTPS3:TOUTPS0: Seleção do Potscaler
0000 = 1:1 Postscale
0001 = 1:2 Postscale
0010 = 1:3 Postscale
1111 = 1:16 Postscale

TMR2ON: Ligar TIMER2
1 = Liga
0 = Desliga

T2CKPS1:T2CKPS0: Seleção do Prescaler
00 = 1:1
01 =  1:4
1x = 1:16



FÓRMULA:
t = ciclo de máquina * prescaler * potscaler * PR2

ciclo de máquina = 4 / Fosc

EXEMPLO:
Usando um clock de 12Mhz, prescaler 1:16 e potscaler 1:16.

t = ( 4 / 12) * 16 * 16 * 255 = 21760us = 21,7ms

void interrupt(){
     PORTB.F1 = ~PORTB.F1; // inverte o estado do pino RB1
     PIR1.TMR2IF=0; //limpa a flag de interrpção
}

void main() {
INTCON.GIE=1; //habilita interrupção global
INTCON.PEIE=1;//habilita interrupção dos periféricos
PIE1.TMR2IE=1; //habilita interrupção do TIMER2
T2CON=0b01111111; //Postcaler 1:16, TIMER2 ligado e prescaler 1:16;
TRISB.F1=0; //define pino RB1 como saída
PORTB.F1=0; / define pino RB1 como estado inicial em nível baixo
PR2=255; //define o valor para PR2
}

Um comentário: