Escolar Documentos
Profissional Documentos
Cultura Documentos
FAVORITAR
8 anos atrás
Fábio Souza
10 Comentários
ÍNDICE DE CONTEÚDO
Introdução
Timers do ATmega328
https://embarcados.com.br/timers-do-atmega328-no-arduino/ 1/19
2/2/23, 11:03 Saiba como usar Timers do ATmega328 no Arduino - Embarcados
TIMER 1
Registradores
Utilizando o TIMER1 no Arduino
Modo Normal com interrupção por overflow
MODO CTC interrupção por comparação
Saiba Mais sobre Arduino
Saiba mais sobre Timers
Introdução
Temporização é fundamental quando se trabalha com circuitos
microcontrolados, seja para um simples delay ou para geração de sinais ou
eventos periódicos. Desde o mais simples microcontrolador sempre está
disponível pelo menos um periférico temporizador/contator. Esse periférico
possui hardware dedicado para contagem de tempo e o seu correto uso,
auxilia em uma programação eficiente para realização de diversos projetos.
Timers do ATmega328
O Atmega328, utilizado na placa Arduino UNO, possui 3 timers, sendo dois de
8 bits (TIMER0 e TIMER2) e um de 16 bits (TIMER1). Esses temporizadores
são importantes para diversas funcionalidades, tais como:
Temporização;
Interrupções periódicas;
TIMER 1
O TIMER1 é um temporizador de 16 bits que permite a contagem de eventos,
geração de sinal PWM, medida de pulsos, etc. Seu diagrama de blocos,
conforme apresentado no datasheet do ATmega328 é apresentado na
figura 1:
https://embarcados.com.br/timers-do-atmega328-no-arduino/ 3/19
2/2/23, 11:03 Saiba como usar Timers do ATmega328 no Arduino - Embarcados
Registradores
https://embarcados.com.br/timers-do-atmega328-no-arduino/ 4/19
2/2/23, 11:03 Saiba como usar Timers do ATmega328 no Arduino - Embarcados
https://embarcados.com.br/timers-do-atmega328-no-arduino/ 5/19
2/2/23, 11:03 Saiba como usar Timers do ATmega328 no Arduino - Embarcados
https://embarcados.com.br/timers-do-atmega328-no-arduino/ 6/19
2/2/23, 11:03 Saiba como usar Timers do ATmega328 no Arduino - Embarcados
Seleciona qual borda no pino de entrada (ICP1) será usada para disparar
evento de captura.
Bit 5 – Reserved
https://embarcados.com.br/timers-do-atmega328-no-arduino/ 7/19
2/2/23, 11:03 Saiba como usar Timers do ATmega328 no Arduino - Embarcados
O exemplo a seguir exibe como piscar o LED no pino 13, da placa Arduino
UNO, em intervalos de 1 segundo e utilizando interrupção por estouro timer:
Nesse exemplo o timer foi configurado para modo normal, com pinos OC1A e
OC1B desconectados (TCCR1A = 0). Foi selecionado o prescaler para 1024
através do registrador TCCR1B. Para que o timer estoure a cada segundo é
necessário iniciar seu valor com a diferença entre o seu valor máximo (65536)
e o período desejado. O período é calculado levando em consideração a
frequência do oscilador e o prescaler selecionado, além da frequência de
interrupção desejada. Por fim foi habilitada a interrupção de estouro do
TIMER1 através do bit T0IE1 do registrador TIMSK1. A inversão do LED é feita
na rotina de interrupção, note que é necessário recarregar o timer para a
correta contagem.
1 #define ledPin 13
2
https://embarcados.com.br/timers-do-atmega328-no-arduino/ 9/19
2/2/23, 11:03 Saiba como usar Timers do ATmega328 no Arduino - Embarcados
3 void setup()
4 {
5 pinMode(ledPin, OUTPUT);
6
7 // Configuração do TIMER1
8 TCCR1A = 0; //confira timer para operação normal
9 TCCR1B = 0; //limpa registrador
10 TCNT1 = 0; //zera temporizado
11
12 OCR1A = 0x3D09; // carrega registrador de comparação: 16MHz/1024/1Hz =
13 TCCR1B |= (1 << WGM12)|(1<<CS10)|(1 << CS12); // modo CTC, prescaler de 1024: C
14 TIMSK1 |= (1 << OCIE1A); // habilita interrupção por igualdade de comparação
15 }
16
17
18 void loop()
19 {
20 //loop principal. a manipulação do led é feita na ISR
21 }
22
23 ISR(TIMER1_COMPA_vect) // interrupção por igualdade de comparação no TIMER
24 {
25 digitalWrite(ledPin, digitalRead(ledPin) ^ 1); //inverte estado do LED
26 }
Arduino UNO
https://embarcados.com.br/timers-do-atmega328-no-arduino/ 10/19
2/2/23, 11:03 Saiba como usar Timers do ATmega328 no Arduino - Embarcados
FAZER PARTE
Fábio Souza
365 posts
https://github.com/FBSeletronica
Fabio Souza, engenheiro com experiência no
desenvolvimento de projetos eletrônicos. Hoje é diretor
do portal Embarcados, onde trabalha para promover a
área de desenvolvimento de projetos eletrônicos,
sistemas embarcados e IoT no Brasil. Atua no ensino
eletrônica e programação, como professor de
graduação e pós-graduação e também em cursos livre
e exclusivos para empresas. É entusiasta do
movimento maker, da cultura DIY e do
compartilhamento de conhecimento, publica diversos
artigos, projetos open hardware e é autor de livros da
área. Com iniciativas como o projeto Franzininho e
projetos na área de educação, leva a cultura maker
para o Brasil capacitando e incentivando professores e
alunos a usarem tecnologia em suas vidas.
https://embarcados.com.br/timers-do-atmega328-no-arduino/ 11/19
2/2/23, 11:03 Saiba como usar Timers do ATmega328 no Arduino - Embarcados
Esta obra está licenciada com uma Licença Creative Commons Atribuição-
CompartilhaIgual 4.0 Internacional .
COMENTÁRIOS:
Notificações
Entre na discussão
{} [+]
10 COMENTÁRIOS recentes
Angelica
20/05/2022 16:15
https://embarcados.com.br/timers-do-atmega328-no-arduino/ 12/19
2/2/23, 11:03 Saiba como usar Timers do ATmega328 no Arduino - Embarcados
2 Responder
Obrigado Angélica.
0 Responder
bah me foi muito util. Consegui alterar a rotação do motor de passo para um
valor superior á: digitalWrite(PUL, HIGH); //motor de avanço – pino3 delay(1);
digitalWrite(PUL, LOW); //motor de avanço – pino3 delay(1); Sem que sem o
delay de “1” o motor não gira. A maior rotação que consegui foi com os dados
abaixo: TCCR1B |= (0<<CS10)|(1 << CS11)|(0 << CS12); TCNT1 = 0xFCA8;
enviando sinal para um driver WD2400 na posição de 200 pulse/rev. Agora me
perdi em uma conta. Como eu encontro quantos pulsos/segundo está sendo
enviado ? Como posso saber o limite de pulso/segundo que o driver
aceita… Leia mais »
0 Responder
Geraldo
12/01/2021 23:27
0 Responder
0 Responder
Geraldo
Reply to Fábio Souza 13/01/2021 14:49
Muito obrigado professor,eu não sabia desta modalidade,e vou procurar fazer
esta modificação.Agradeço muito pela atenção.Um forte abraço.Gratidão.
0 Responder
Deivid
13/02/2018 16:52
0 Responder
Abraços,
0 Responder
HenriqueMartins
20/01/2018 23:15
Boa Noite! tenho algumas dúvidas: 1 – no seu código não precisou habilitar as
interrupções globais com “sei()”? por que? 2 – no arduino, o fuse BOOTRST
está habilitado. Então os vetores das interrupções seriam deslocados para o
início da sessão de bootloader na memória de programa. Isso implica que o
bit IVSEL no MCUCR deveria estar setado para que as interrupções ocorram
https://embarcados.com.br/timers-do-atmega328-no-arduino/ 14/19
2/2/23, 11:03 Saiba como usar Timers do ATmega328 no Arduino - Embarcados
nos endereços corretos. Por que no seu código não precisou? OBS.: Estou
tendo muitos problemas ao utilizar interrupções do timer no arduino. Já tentei
com e sem as opções citadas por mim acima. Se me forem sanadas… Leia
mais »
0 Responder
Olá Henrique,
segue respostas:
Qual timer vocês quer usar? Verifique se não está tendo conflito de
configuração nas funções.
Abraços,
0 Responder
https://embarcados.com.br/timers-do-atmega328-no-arduino/ 15/19
2/2/23, 11:03 Saiba como usar Timers do ATmega328 no Arduino - Embarcados
https://embarcados.com.br/timers-do-atmega328-no-arduino/ 16/19
2/2/23, 11:03 Saiba como usar Timers do ATmega328 no Arduino - Embarcados
SÉRIES
Controlador VGA
Boas práticas para o desenvolvimento de software
https://embarcados.com.br/timers-do-atmega328-no-arduino/ 17/19
2/2/23, 11:03 Saiba como usar Timers do ATmega328 no Arduino - Embarcados
NEWSLETTER
Seu e-mail
CADASTRAR E-MAIL
INSTITUCIONAL
O Embarcados
Seja Colaborador
Contato
NAS REDES
https://embarcados.com.br/timers-do-atmega328-no-arduino/ 18/19
2/2/23, 11:03 Saiba como usar Timers do ATmega328 no Arduino - Embarcados
COMUNIDADE
Oportunidades
Sites e Blogs
LEGAL
Legal
Politica de Privacidade
Politica de Governança
Política de Cookies
Termos de Uso
Desenvolvido por
https://embarcados.com.br/timers-do-atmega328-no-arduino/ 19/19