quarta-feira, setembro 11, 2019

Timer1 do ATmega328 - Parte 1

A origem desta série é o meu post sobre maneiras de piscar um LED no Arduino. Os timers do ATmega, principalmente o Timer1, são muito poderosos. E, com grandes poderes, vem grandes complicações... O diagrama abaixo (extraído do manual do ATmega328) mostra os grandes blocos do Timer1 (clique para ampliar).





Visão Geral

 O coração do Timer1 é o registrador TCNT1, que é um contador incrementado (ou decrementado) por um clock (selecionável entre várias opções). Ele está ligado a comparadores para detectar, conforme a programação, quando:
  • Chega a Zero.
  • Atinge os valores em OCR1A, OCR1B ou ICR1.
  • Atinge os valores  fixos 0x00F, 0x01FF, 0x03FF. ou 0xFFFF
O que ocorre quando o contador atinge um destes valores também depende da programação. Desta forma é possível, por exemplo, gerar interrupções periódicas ou um sinal PWM.

Uma outra função que o Timer1 pode fazer é a "captura", onde o valor de TCNT1 é copiado para ICR1 quando  é ocorrer um evento no pino de entrada ICP1 ou no comparador analógico.

Meu plano para esta série de posts é o seguinte:
  1. Visão geral e seleção de clock
  2. Operação nos modos Normal e CTC  (Clear Timer on Compare)
  3. Captura
  4. PWM

Seleção do Clock

Como todo periférico do ATmega, o comportamento é definido por bits em registradores. A seleção do clock é feita através dos três bits menos significativos do registrador TCCR1B:


As seleções disponíveis são sem clock (contador parado), certas divisões do clock de I/O (geradas pelo prescaler) e um clock externo:

CS12 CS11 CS10
  0    0    0    sem clock (parado)
  0    0    1    clkIO
  0    1    0    clkIO/8
  0    1    1    clkIO/64
  1    0    0    clkIO/256
  1    0    1    clkIO/1024
  1    1    0    clock externo, borda de descida
  1    1    1    clock externo, borda de subida
 
O clock de I/O tem a mesma frequência que o clock do processador, porém pode ser desligado para economia de energia.

Reparar que no caso de clock externo pode-se selecionar se a contagem é feita quando o sinal passa do nível alto para baixo (borda de descida) ou do nível baixo para o alto (borda de subida). Isto permite sincronizar a contagem com um circuito externo.

A seleção do clock deve ser feita considerando-se a precisão e o valor máximo desejado. Por exemplo, considerando um clock de 16MHz (como no Arduino), a seleção do clkIO dá uma precisão de  62,5 nanosegundo e um tempo máximo de 4 milisegundos. Já a seleção de clkIO/1024 fornece um tempo máximo de 4 segundos, mas precisão de 64 milisegundos.

Nenhum comentário: