Você está na página 1de 27

Engenharia Eltrica:

Microcontroladores
Timers do ATmega328P

(Arduino UNO)

Prof. Rodrigo Ribeiro


1

TIMERS
Timer o perifrico interno do microcontrolador utilizado
para 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 um


tempo pr-definido, ento rotinas que necessitem de
temporizao podem ser implementados.
2

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()

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.

O registrador TCNT0 armazena o valor da contagem do


timer 0. Faixa de contagem: 0 a 255 (8 bits)

Pode ser lido e/ou escrito (R/W)


5

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.

WGM01 e WGM00 registrador TCCR0A.


Modos mais utilizados:
modo 0 (Normal) - o timer gera um evento quando ocorre
overflow, ou estouro (passagem do valor 255 para zero).
modo 2 (CTC) - o timer gera um evento quando a contagem se
iguala ao valor armazenado em outro registrador (OCR0A). Nesse
caso, o valor de contagem reiniciado em zero (Clear Timer on
Compare).

TIMERS
Registradores de configurao do modo do timer 0:

TIMERS
Registradores de comparao de sada do timer 0:

O OCR0A (Output Compare Register A) contm um valor


de 8 bits que continuamente comparado com o valor do
contador (TCNT0).
Pode ser usado para gerar uma sada de interrupo de
comparao ou para gerar uma forma de onda de sada no
pino OC0A.
9

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:

O prescaler um valor selecionvel para reduzir a frequncia


original do clock do sistema, de forma a ampliar a faixa de
temporizao do timer.

10

TIMERS
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
11

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
}

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 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

O clock do sistema deve ser dividido pelo prescaler, ento:


ftimer = fclock /prescaler
O timer gerar uma interrupo quando o valor do
registrador TCNT0 atingir o valor do registrado OCR0A .
15

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:

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

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 << Nome_bit)
19

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:

No anexo do email da aula de Timers.

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.

Varredura significa que cada display funcionar por um tempo


especfico 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 dois
displays 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 na
frequncia de 100 Hz. Utilize o cdigo do ltimo exemplo como
base.

27

Você também pode gostar