Escolar Documentos
Profissional Documentos
Cultura Documentos
Microcontroladores
Timers do ATmega328P
(Arduino UNO)
TIMERS
Timer o perifrico interno do microcontrolador utilizado
para temporizao ou contagens diversas.
TIMERS
Como contador, o timer utilizado para contagem
diversas, como, por exemplo, nmero ocorrido de eventos
externo ao microcontrolador.
Alm disso, a interrupo do timer fornece subsdios para
implementao de rotinas autnomas e paralelas
execuo do programa principal.
O ATmega328P possui 3 timers:
timer 0 e timer 2, ambos de 8 bits mximo de 255
timer 1 de 16 bits mximo de 65535
TIMERS
Para manipular os timers no ambiente de programao
do arduino faz-se necessrio conhecer os registradores de
configurao deste perifrico.
OBS 1: Pode-se obter algumas bibliotecas, que no fazem
parte do ambiente padro, para configurar timers
especficos. Para isso, deve-se inser-las na pasta libraries.
OBS 2: Ao configurar os timers manualmente algumas
funes do ambiente de programao podero ser
comprometidas, devendo-se ento ser evitadas.
Timer 0 delay(), millis() e micros()
TIMERS
Registradores de configurao/estado dos timers:
OBS : Ser vista a anlise dos registradores do timer 0, sendo que os
outros tem funcionalidades semelhantes e que podem ser consultadas
no datasheet do microcontrolador.
TIMERS
O timer 0 pode ser colocado em um dentre vrios modos de
funcionamento.
TIMERS
A escolha do modo faz-se atribuindo o valor adequado aos bits:
WGM02 registrador TCCR0B.
TIMERS
Registradores de configurao do modo do timer 0:
TIMERS
Registradores de comparao de sada do timer 0:
TIMERS
A fonte de clock do timer (interna = temporizador ou
externa = contador) bem como o valor do prescaler (mltiplo da
temporizao) so definidos pelo seguinte conjunto de bits
CS02/CS01/CS00 do registrador TCCR0B:
10
TIMERS
Fontes de clock do Timer 0:
INTERRUPES
As interrupes permitem ao microcontrolador atender
eventos assncronos.
Eventos atendidos no momento da ocorrncia.
A rotina principal do programa interrompida para
executar a rotina de interrupo.
Aps executar esta rotina, o programa principal volta a
ser executado.
Interrupo do timer:
Na ocorrncia de overflow, o programa principal
interrompe o funcionamento e uma funo especial
atendida, denominada de Rotina de Servio de
Interrupo (ISR).
12
INTERRUPES
Para ativar a interrupo do timer 0:
Ativar as interrupes gerais com a funo: sei()
Ativar o bit TOIE0 do registrador TIMK0, permitindo
assim que a interrupo ocorra para o evento de
overflow do timer 0 em particular.
13
INTERRUPES
Na funo de interrupo do timer 0 o cabealho
padronizado e deve seguir sempre essa estrutura:
// Rotina de tratamento de interrupo do timer 0
ISR(TIMER0_OVF_vect) {
//comandos
}
CONFIGURAO
Frmula geral para determinar o valor do registrador de
comparao dos timers. Considere:
fclock a frequncia de clock do sistema, 16 MHz no Arduino UNO.
fclock a frequncia de interrupo desejada.
OCRXA o registrador do timer X, sendo X = 0, 1 ou 2
Tempo entre cada interrrupo (Tint) = 1/ fint
CONFIGURAO
Dessa forma, o tempo da interrupo, considerando
TCNT0 inicie em zero, ser
Tint = (OCR0A + 1)* ftimer = (OCR0A + 1)*(fclock /prescaler)
A partir da frmula acima pode-se configurar qualquer um
dos timers do ATmega328, para isso faz-se necessrio
determinar o valor de OCR0A e o prescaler para obter o
tempo de interrupo desejado.
Manipulando a equao, tem-se:
OCRXA = (Tint *fclock) / (presecaler) 1
16
CONFIGURAO
Ex.: Considerando OCR0A = 124, prescaler = 64,
fclock = 16 MHz, qual o perodo e a frequncia de interrupo
do timer 0.
Soluo:
fint = 2 kHz.
17
CONFIGURAO
Ex.: Qual o valor de OCR1A para obter uma frequencia de
interrupo de 1s. Adote prescaler = 1024 e fclock = 16 MHz.
Soluo:
O clock do sistema deve ser divido por 1024, ento o clock
do timer ser de 15,625 kHz. Assim, cada incremento do
timer ocorrer em 64 s.
Como, Tint = (OCR1A +1)*64 s = 1s
Logo:
OCR1A = 1/(64) 1 OCR1A = 15624
OCR1A = 15624
18
CONFIGURAO
Ex.: Determine o prescaler para configurao do timer 2 de
forma a obter uma frequncia de interrupo de 8kHz,
considerando OCR2A igual a 249.
OCR2A = (Tint *fclock) / (presecaler) 1
EXEMPLO
Ex.: Utilize a interrupo do timer 1 para obter uma
frequncia de 1 Hz no pino 13 do arduino UNO.
20
EXEMPLO
Cdigo do exemplo:
Parte 1/3:
21
EXEMPLO
Parte 2/3:
22
EXEMPLO
Parte 3/3:
23
EXEMPLO
Ex.: Utilize a interrupo do
timer 1 para montar um
contador decimal, incrementado
a cada 1s, com interface via
display de 7 segmentos.
24
EXEMPLO
Cdigo do exemplo:
25
EXERCCIO
Utilize a interrupo do timer 1 para montar um contador de
mdulo 100, incrementado a cada 1s, com interface via display
de 7 segmentos, conforme o hardware apresentado.
Como os displays esto compartilhando os mesmos pinos do
arduino, deve-se ento implementar no cdigo do
microcontrolador a varredura funcional dos display.
EXERCCIO
Para fazer a varredura utilize a interrupo do timer 2 na
frequncia de 100 Hz. Utilize o cdigo do ltimo exemplo como
base.
27