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 }
Muito bom os artigos e ensinamentos claro e objetivos do blog muito obrigado por nos ensinar.
ResponderExcluir