Buscar

5 Timers

Prévia do material em texto

Timers
Timers
• Os microcontroladores de família PIC18 apresentam 4 timers
internos, sendo 3 de 16 bits e 1 de 8 bits.
Introdução
• Um timer é utilizado para contar tempos ou contar pulsos externos, 
dependendo do timer utilizado. Desta forma, um timer pode 
funcionar como contador ou temporizador.
• Quando o timer funciona em modo contador, ele funciona em modo 
assíncrono e, quando está configurado como temporizador, funciona 
no modo síncrono, pois em tempos exatos ele estabelecerá um 
evento.
Introdução
• Internamente, o PIC18F452 possui 4 timers denominados Timer0, 
Timer1, Timer2 e Timer3.
• Os timers 0, 1 e 3 são de 16 bits, enquanto o timer2 é de 8 bits.
• Um timer de 16 bits consegue contar até 65536, pois 216 é igual a este 
valor.
• O de 8 bits conta até 256, pois 28 é igual a 256. 
• O timer0 pode funcionar nos modos de 8 bits ou 16 bits.
Timer0
• O timer0 é um contador ou timer de 8 ou 16 bits. Ele é incrementado 
de acordo com o ciclo de máquina do microcontrolador ou pode 
contar pulsos externos através do pino T0CKI (RA4).
• O timer0 é composto de 1 registrador de controle, chamado T0CON, e 
dois de contagem, sendo um chamado de TMR0L e o outro de 
TMR0H. O registrador TMR0L armazena a parte baixa da contagem, 
enquanto o TMR0H a parte alta. 
Os bits que compõem o registrador de controle do timer0 são:
Outras Opções do TIMER:Outras Opções do TIMER:Outras Opções do TIMER:Outras Opções do TIMER:
• O TIMER pode ser configurado para fazer a contagem NÃO pelo ciclo de 
processador interno, mas por uma fonte externa de clock (bit de subida e 
descida), a ser ligado em um pino especifico da PIC. Esta maneira de 
funcionamento pode ser utilizada em um contador de peças por exemplo, 
ou qualquer outro circuito que gere um clock digital externo.
• O que difere o TIMER0 dos demais Timers (TIMER1, 2) são detalhes 
complementares, tais como, forma de contagem, numero de bits, geração 
de interrupções, tipo de incrementarão. Sendo que o TIMER0 seria o mais 
simples. 
• Por exemplo o TIMER1 em geral possui 2 bits de contagem, elevando o 
nível de precisão da mesma. Enquanto o Timer0 vai até 256 (2 elevado a 8), 
o Timer1 conta ate 2 elevado a 16.
PrescalerPrescalerPrescalerPrescaler::::
• A função de prescaler pode ser ligada, desligada, e configurada para o 
TIMER0, sendo que ela nada mais é que um divisor, que dividirá um 
ciclo do processador por um valor fixo, que pode ser 
1,2,4,8,16,32,64,128 ou 512). 
• Sendo assim, por exemplo, se o Prescaler for configurado para 4, ao 
invés do TIMER0 incrementar 1 a cada ciclo de máquina, ele irá 
incrementar 1 a cada 4 ciclos de máquina. 
• Com isso podemos aumentar o tempo de estouro, aumentar a 
contagem é bastante útil devido ao baixo valor de tempo que um 
ciclo de processador tem. (mais abaixo exemplos do calculo).
Lógica de Cálculo para estimativa de tempo de contagemLógica de Cálculo para estimativa de tempo de contagemLógica de Cálculo para estimativa de tempo de contagemLógica de Cálculo para estimativa de tempo de contagem
sendo: sendo: sendo: sendo: XTAL de 20 XTAL de 20 XTAL de 20 XTAL de 20 MegahertzMegahertzMegahertzMegahertz
• Ciclo basico do processador t = 1/(frequência do XTAL /4) = 1 / (20.000.000/4) = 
0,0000002 ou 0,2 µ s.
Obs: O ciclo interno do processador corresponde ao valor da frequencia do XTAL 
dividido por 4.
• Tempo de estouro sem prescaler T = t * 256 = 51,2 µ s.
• Tempo de estouro com prescaler de 4 (por exemplo)
T4 = t * 256 * 4 = 204,8 µ s.
O prescaler multiplica o ciclo interno por um valor fixo, aumentando o tempo de 
contagem para cada ciclo.
Exemplo
• Dado um microcontrolador com XTAL= 4MHz. Sendo a rotina delay de 
200μs. Calcule o tempo do ciclo do processador e o tempo de ciclo de 
máquina.
�����(�) =
1
��
�
4
=
1
1. 10�
= 1μ�
T = � ∗ 200μ� = 200μ�
Tempo de estouro com prescaler:
T4 = t * 200 * 4 = 800 µ s
1) Faça um programa onde haja uma rotina delay de 200μs utilizando o 
timer0. O ciclo de máquina deverá ser de 1 μs. Com um led em RB0.
;timerEx1.asm
#INClUDE <P18F452.INC>;
__CONFIG _CONFIG1H, _HS_OSC_1H ;
__CONFIG _CONFIG2H, _WDT_OFF_2H
__CONFIG _CONFIG2L, _BOR_ON_2L & _BORV_42_2L ;
__CONFIG _CONFIG4L, _LVP_OFF_4L
#DEFINE LED1 PORTB,0;
ORG 0X00
MOVLW B'00000111'; 
MOVWF ADCON1; 
MOVLW b'00000000';
MOVWF TRISB; 
MOVLW B'11001000'; timer0 ->ON modo->8bits prescaler->off
MOVWF T0CON; 
LOOP 
BSF LED1 ;
BCF INTCON, T0IF ;apaga o flag de interrupção do timer 0
CALL DELAY_200US ;
CLRF LED1 ;
BCF INTCON, T0IF ;
CALL DELAY_200US;
GOTO LOOP
DELAY_200US
MOVLW (.256-.200); carrega valor max contagem e o 
;valor que se espera contar
MOVWF TMR0L;
DELAY_200U_A
BTFSS INTCON, TMR0IF ; timer0 estourou?
GOTO DELAY_200U_A ; não fica em loop
RETURN ; 
END;
2) Faça um programa onde haja uma rotina delay de 400μs utilizando o 
timer0. O ciclo de máquina deverá ser de 1 μs. Com um led em RB0.
;timerEx2.asm
#INClUDE <P18F452.INC>;
__CONFIG _CONFIG1H, _HS_OSC_1H ;
__CONFIG _CONFIG2H, _WDT_OFF_2H ;
__CONFIG _CONFIG2L, _BOR_ON_2L & _BORV_42_2L ;
__CONFIG _CONFIG4L, _LVP_OFF_4L ;
#DEFINE LED1 PORTB,0 ;
ORG 0X00
MOVLW B'00000111‘ ; 
MOVWF ADCON1 ; 
MOVLW b'00000000';
MOVWF TRISB ; 
MOVLW B'11000000'; timer0 ->ON modo->8bits prescaler->1:2
MOVWF T0CON ;
LOOP 
BSF LED1 ;
BCF INTCON, T0IF ;apaga o flag de interrupção do timer 0
CALL DELAY_400US ;
CLRF LED1 ;
BCF INTCON, T0IF ;
CALL DELAY_400US ;
GOTO LOOP ;
DELAY_400US
MOVLW (.256-.200) ;
MOVWF TMR0L ;
DELAY_400U_A
BTFSS INTCON, TMR0IF ; timer0 estourou?
GOTO DELAY_400U_A ; não fica em loop
RETURN ;
END;
3) Faça um programa onde haja uma rotina delay de 1000μs utilizando 
o timer0. O ciclo de máquina deverá ser de 1 μs. Porém utilize o modo 
de 16bits do timer0. Com um led em RB0.
LOOP 
BSF LED1 ;
BCF INTCON, T0IF ;
CALL DELAY_US ;
CLRF LED1 ;
BCF INTCON, T0IF ;
CALL DELAY_US;
GOTO LOOP
DELAY_US
MOVLW HIGH(.65536-.1000);
MOVWF TMR0H;
MOVLW LOW(.65536-.1000);
MOVWF TMR0L;
DELAY_A
BTFSS INTCON, TMR0IF ; timer0 estourou?
GOTO DELAY_A ; não fica em loop
RETURN ;
END;
;timerEx3.asm
#INClUDE <P18F452.INC>;
__CONFIG _CONFIG1H, _HS_OSC_1H ;
__CONFIG _CONFIG2H, _WDT_OFF_2H ;
__CONFIG _CONFIG2L, _BOR_ON_2L & _BORV_42_2L ;
__CONFIG _CONFIG4L, _LVP_OFF_4L
#DEFINE LED1 PORTB,0;
ORG 0X00
MOVLW B'00000111'; 
MOVWF ADCON1; 
MOVLW b'00000000';
MOVWF TRISB; 
MOVLW B'10001000'; timer0 ->ON modo->16bits prescaler->1:1
MOVWF T0CON;
Semáforo – entrega dia 01 junho
• Dispondo de 5 leds ( 2 vermelhos, 2 verdes e 1 amarelo ), 
implementar dois semáforos, um para automóveis e outro para 
pedestres, ligados respectivamente em RB1, RB2, RB3 e RB4,RB5.
• Desenvolvimento de um programa em assembly para controlar 
semáforos, de acordo com a tabela estados, que efeue a contagem de 
tempo na transição dos estados, com auxílio do timer 0.
Automóvel Pedestre Tempo
vermelho amarelo verde vermelho verde 4s
ON ON 1s
ON ON 1s
ON ON 0,5s
ON INTERMITENTE 0,5s
ON ON 0,5s
Descrição do estado dos leds

Continue navegando

Outros materiais