Engenharia Eltrica:
Microcontroladores
Timers do ATmega328P
(Arduino UNO)
Prof. Rodrigo Ribeiro
1
TIMERS
Timer o perifrico interno do microcontrolador utilizadopara temporizao ou contagens diversas.
Como temporizador, o timer armazena um valor que incrementado periodicamente, dependendo do clock do
sistema e de um valor mltiplo configurvel (prescaler).
Ex.:
No arduino UNO o clock de 16 MHz, logo o incremento do
timer ocorre a cada 62,5 ns, considerando o mltiplo 1.
Como cada incremento do timer est associado a umtempo pr-definido, ento rotinas que necessitem de
temporizao podem ser implementados.
2
TIMERS
Como contador, o timer utilizado para contagemdiversas, como, por exemplo, nmero ocorrido de eventos
externo ao microcontrolador.
Alm disso, a interrupo do timer fornece subsdios paraimplementao 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
3
TIMERS
Para manipular os timers no ambiente de programaodo 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()
Timer 1 controle de servos
Timer 3 funo tone()
4
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.
5
O registrador TCNT0 armazena o valor da contagem dotimer 0. Faixa de contagem: 0 a 255 (8 bits)
Pode ser lido e/ou escrito (R/W)
TIMERS
O timer 0 pode ser colocado em um dentre vrios modos defuncionamento.
6
TIMERS
A escolha do modo faz-se atribuindo o valor adequado aos bits:
WGM02 registrador TCCR0B.
WGM01 e WGM00 registrador TCCR0A.
Modos mais utilizados:
modo 0 (Normal) - o timer gera um evento quando ocorreoverflow, ou estouro (passagem do valor 255 para zero).
modo 2 (CTC) - o timer gera um evento quando a contagem seiguala ao valor armazenado em outro registrador (OCR0A). Nesse
caso, o valor de contagem reiniciado em zero (Clear Timer on
Compare).
7
TIMERS
8
Registradores de configurao do modo do timer 0:
TIMERS
9
Registradores de comparao de sada do timer 0:
O OCR0A (Output Compare Register A) contm um valorde 8 bits que continuamente comparado com o valor do
contador (TCNT0).
Pode ser usado para gerar uma sada de interrupo decomparao ou para gerar uma forma de onda de sada no
pino OC0A.
TIMERS
10
A fonte de clock do timer (interna = temporizador ouexterna = contador) bem como o valor do prescaler (mltiplo da
temporizao) so definidos pelo seguinte conjunto de bits
CS02/CS01/CS00 do registrador TCCR0B:
O prescaler um valor selecionvel para reduzir a frequnciaoriginal do clock do sistema, de forma a ampliar a faixa de
temporizao do timer.
TIMERS
11
Fontes de clock do Timer 0:
Ex.: Clock do sistema = 16 MHz ; clock do timer = sistema/prescaler
prescaler = 8 clock timer = 2 MHz tempo de ciclo = 0,5 s
prescaler = 1024 clock timer = 15,625 kHz tempo de ciclo = 64 s
INTERRUPES
As interrupes permitem ao microcontrolador atendereventos assncronos.
Eventos atendidos no momento da ocorrncia.
A rotina principal do programa interrompida paraexecutar a rotina de interrupo.
Aps executar esta rotina, o programa principal volta aser executado.
Interrupo do timer:
Na ocorrncia de overflow, o programa principalinterrompe 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, permitindoassim 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
}
OBS 1: Esta funo deve FICAR FORA do void loop().
OBS 2: Assim que a funo for finalizada, o programa retorna ao
ponto onde parou no programa principal.
14
CONFIGURAO
Frmula geral para determinar o valor do registrador decomparao 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
O clock do sistema deve ser dividido pelo prescaler, ento:
ftimer = fclock /prescaler
O timer gerar uma interrupo quando o valor doregistrador TCNT0 atingir o valor do registrado OCR0A .
15
CONFIGURAO
Dessa forma, o tempo da interrupo, considerandoTCNT0 inicie em zero, ser
Tint = (OCR0A + 1)* ftimer = (OCR0A + 1)*(fclock /prescaler)
A partir da frmula acima pode-se configurar qualquer umdos 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:
O clock do sistema deve ser divido por 16, devido ao fator
determinado pelo prescaler, ento o clock do timer de
250 kHz.
Cada incremento do timer ocorrer em 4 s (1/1M).
A interrupo ser gerada quando o registrador de contagem
TCNT0 atingir o valor do registrador de comparao OCR0A.
Assim, Tint = (124+1)*4 s = 0,5 ms e 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
Presecaler = (fclock)/((OCR2A + 1)*fint)
Presecaler = (16M)/((249 + 1)*8k)
Presecaler = 8
OBS.:
Para alterar o valor do bit de algum registrador usa-se o
comando:
NOME_Registrador |= (Valor_bit
EXEMPLO
Ex.: Utilize a interrupo do timer 1 para obter uma
frequncia de 1 Hz no pino 13 do arduino UNO.
20
EXEMPLO
21
Cdigo do exemplo:
Parte 1/3:
EXEMPLO
22
Parte 2/3:
EXEMPLO
23
Parte 3/3:
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
25
Cdigo do exemplo:
No anexo do email da aula de Timers.
EXERCCIO
Utilize a interrupo do timer 1 para montar um contador demdulo 100, incrementado a cada 1s, com interface via display
de 7 segmentos, conforme o hardware apresentado.
Como os displays esto compartilhando os mesmos pinos doarduino, deve-se ento implementar no cdigo do
microcontrolador a varredura funcional dos display.
Varredura significa que cada display funcionar por um tempoespecfico e de modo sequencial, ou seja, ativa-se somente o
primeiro, depois desliga-o e ativa-se o segundo display.
Dessa forma, o sistema parecer que est com os doisdisplays ligados simultaneamente, devido ao efeito conhecido
como Persistncia da Retina, que provoca a iluso de
continuidade dos valores apresentados.
26
EXERCCIO
Para fazer a varredura utilize a interrupo do timer 2 nafrequncia de 100 Hz. Utilize o cdigo do ltimo exemplo como
base.
27
Top Related