Vous êtes sur la page 1sur 7

Universidade Federal de Santa Catarina

Depto. de Automação e Sistemas


DAS 5332 - Arq. e Prog. de Sistemas Microcontrolados
Notas de aula — prof. Werner Kraus Jr.

Contadores/temporizadores do ATmega 328p

1 Noções básicas de contadores digitais

Contadores digitais são circuitos que avançam com pulsos externos aplicados à entrada de
“relógio”(clock input em inglês). O avanço ocorre ao longo de uma sequência pré-definida;
tipicamente, a sequência vai de zero até 2n −1 em contadores de n bits. Porém, existem conta-
dores programáveis para realizar contagens regressivas, ou com avanços em “BCD”(Binary-
Coded Decimal ), ou ainda com avanços com passo maior que 1; estes casos estão além do
interesse deste curso.

1.1 Implementação de contadores com flip-flops

A Figura 1 mostra a implementação de um contador digital tı́pico para n = 4. Os flip-flops


T (toggle) têm suas saı́das complementadas quando T = 1 e ocorre uma transição positiva
de pulso na entrada de clock. Quando T = 0, as saı́das permanecem inalteradas com os
pulsos de clock.

Verificando-se o avanço do circuito com os pulsos de clock, pode-se deduzir as formas


de onda mostradas na Fig. 2, pois:

1. o flip-flop mais à esquerda tem entradas T = 1, portanto sua saı́da QA é complementada


a cada transição positiva do pulso de clock ;
2. o flip-flop seguinte tem sua saı́da QB quando a saı́da anterior QA é 1 e o pulso de clock
tem transição positiva;

Figura 1: Contador sı́ncrono de 4 bits; os flip-flops T têm saı́das complementadas quando T = 1


e ocorre uma transição positivo do pulso na entrada de clock (CLK) do flip-flop. (Adaptado de:
Electronics-tutorials em www.electronics-tutorials.ws/counter/count 3.html).

1
Figura 2: Evolução das saı́das do contador de 4 bits, indicando que um bit de saı́da Qi é comple-
mentado sempre que todos os bits anteriores valem 1 e ocorre uma transição positiva do pulso de
clock. (Fonte: Electronics-tutorials em www.electronics-tutorials.ws/counter/count 3.html).

3. no caso do flip-flop com saı́da QC , a porta lógica “E” (&) implica em mudança na
saı́da quando QA e QB forem 1; e assim por diante.

Observa-se que a evolução do circuito resulta em contagem binária, conforme indica a


linha “Count” da Fig. 2. Pode-se ver que a saı́da QA da Fig. 1 foi tomada como sendo o bit
menos significativo (representando o bit b0 20 ), e assim por diante até QD , que representa o
bit b3 23 .

O módulo da contagem é dado por 2n e, portanto, o valor máximo de contagem é 2n −1.

1.2 Interpretação de contador como divisor de frequência

Um efeito muito importante que decorre da operação dos circuitos contadores consiste na
divisão por 2 da frequência de uma saı́da Qi em relação à saı́da anterior Qi−1 . Para ilustrar
o efeito, a Fig. 3 mostra um contador de 2 bits e as respectivas formas de onda de saı́da em
relação a um sinal de clock. No exemplo da figura, há 16 perı́odos do clock em 1 s de tempo,
ou seja, a frequência é de 16 Hz. A contagem de perı́odos de onda em 1 s para QA e QB
resulta em 8 Hz e 4 Hz, respectivamente, mostrando a divisão por 2 a cada saı́da sucessiva
do contador.

Portanto, um contador binário de n bits realiza divisões da frequência de clock desde


2 (bit 0) até 2n (bit n − 1). Assim, um contador realiza máxima divisão de frequência igual
ao módulo da contagem, 2n .

No contexto desta disciplina, contadores aplicados exclusivamente à divisão de


frequência são denominados “prescalers” (ou pré-escalonadores), sendo usados em vários pe-
riféricos on chip tais como em temporizadores, no conversor AD e no transmissor/receptor de
comunicação serial. Em geral, prescalers apresentam menos opções de divisão de frequência
do que o número de bits de contagem n.

2
Figura 3: Evolução das saı́das em contador de 2 bits em um intevalo de 1 s. Note que na saı́da QA
tem frequência dividida por 2 em relação à frequência dos pulsos de clock, e QB tem frequência
fP /4.

Figura 4: Diagrama do esquema básico dos três contadores do ATmega 3280, com a letra n nos
sı́mbolos podendo ser lida como 0, 1 ou 2; o registrador TCNTn representa os contadores em si
e mantém o valor da contagem; “Count” provoca o avanço da contagem, “Clear” zera o valor
de contagem, e “Direction” comanda contagem progressiva ou regressiva. “TOVn” sinaliza que a
contagem atingiu o valor máximo (Timer Overflow ) e “clkTn ” é o sinal de clock.

2 Temporizadores/contadores do ATmega 328p

O microcontrolador ATmega 328p dipõe de três contadores/temporizadores (timers/counters


em inglês):

TCNT0: contagem em 8 bits (módulo 28 = 256), geração de onda quadrada e PWM;


TCNT1: contagem em 16 bits (módulo 216 = 65.536), geração de onda quadrada e PWM,
módulo de captura de eventos;
TCNT2: contagem em 8 bits, geração de onda quadrada e PWM, entrada de sinal de clock
assı́ncrono externo.

O diagrama da Fig. 4 mostra o esquema básico dos contadores deste microcontrolador,


com n sendo substituı́vel por 0, 1 ou 2 de acordo com o contador em análise. O registrador
T CN T n representa os contadores em si, cujo avanço se dá pelo sinal “Count”. Os sinais
“Clear” e “Direction” comandam, respectivamente, a atribuição de zero ao contador e a

3
direção de contagem, se progressiva ou regressiva. “TOVn” sinaliza que a contagem atingiu
o valor máximo (Timer OVerflow ) e “clkTn ” é o sinal de clock. A figura indica, ainda, que
o sinal “TOVn” está associado a um evento de interrupção (Int. Req.), a serem abordados
mais adiante.

Os três contadores / temporizadores têm comportamentos semelhantes, distinguindo-


se por funcionalidades especı́ficas e pelo módulo de contagem. Neste documento, opta-se
por analisar em detalhes o contador TCNT1, por ser de 16 bits (permitindo temporizações
relativamente longas, compatı́veis com acionamentos e amostragens próximos da escala de 1
s) e por conter mais funcionalidades do que os demais.

3 Temporizador/contador de 16 bits TCNT1

Apresenta-se na Fig. 5 o diagrama com os componentes do temporizador/contador TCNT1,


denominado daqui para diante como timer 1 (na figura, leia-se “1” no lugar de “n” nos
nomes de registradores e de bits). Como se observa na figura, há várias extensões em relação
ao hardware geral apresentado na Fig. 4. Algumas dessas extensões aparecem, também,
em TCNT0 e TCNT2, especialmente os registradores de comparação OCRnA e OCRnB.
Outras, como o registrador ICR1, são especı́ficas deste timer. Essas extensões implementam
funcionalidades úteis ao programador, conforme apresentado a seguir.

3.1 Caracterı́sticas

O timer 1 disponibiliza vários recursos ao programador, dos quais interessam neste capı́tulo
aquelas relacionadas às temporizações periódicas. Ainda assim, apresentam-se abaixo todas
as funcionalidades do periférico, algumas das quais serão abordadas em capı́tulos posteriores.
São elas:

• Contagem em módulo 216 , isto é, o “vai-um” da contagem ocorre na passagem de 216 −1
(65535) para 0. Este evento é sinalizado pelo bit TOV1 (ver canto superior direito da
Fig. 5).
• Bloco Clock Select, o qual define se o avanço da contagem se dá por pulso externo
no pino “T1” (modo de contagem de pulsos) ou de acordo com “clock” interno pré-
escalonado (From Prescaler ).
• Pré-escalonador (“prescaler”), que permite efetuar divisão de frequência do sinal de
clock do processador. No caso do Arduino Uno, o clock é de 16 MHz; se for usado sem
nenhuma divisão, serão geradas ocorrências de “vai-um” de TCNT1 após cada intervalo
de

1 1
Tov1 = = 216 ≈ 4.1ms, (1)
fCLK IO 16 MHz
na qual fCLK IO é a frequência de clock do kit Arduino Uno. Os valores admissı́veis de
divisão de frequência serão abordados na seção 3.2.

4
Figura 5: Diagrama temporizador/contador 1, de 16 bits; registradores e funcionalidades associadas
são descritos na Seção 3.

• Dois registradores para comparação de igualdade, “OCR1A” e “OCR1B”, cada qual


gerando sinalização pelos bits OC1A e OC1B, respectivamente. Estas podem gerar
tanto eventos de interrupção como mudanças de nı́vel nos pinos OC1A e OC1B (pinos
15 e 16 do ATmega 328p, pinos 9 e 10 do Arduino) para, neste caso, geração de formas
de onda quadrada e PWM a serem abordadas em capı́tulo posterior.
• Registrador de captura de eventos, o qual grava o valor atual de TCNT1 quando da
ocorrência de mudança de nı́vel no pino ICP1 ou de igualdade entre sinais analógicos,
a serem abordados em capı́tulo posterior.
• Registradores de configuração “TCCR1A”, “TCCR1B” e “TCCR1C” (não mostrado
na Fig. 5), que permitem controlar o funcionamento do timer 1 de acordo com as
funcionalidades desejadas pelo programador.

3.2 Uso como temporizador

Como o nome do periférico indica, as duas funções básicas que desempenha são a contagem
de pulsos e a temporização. No primeiro caso, os pulsos são assı́ncronos (em relação ao

5
Tabela 1: Valores de divisão de frequência do ATmega 328p, indicando os valores respectivos dos
bits de configuração (localizados no registrador TCCR1B); notar que CS12 = CS11 = CS10 = 0
implica em temporizador desligado.

relógio do sistema, CLKIO ) e não-periódicos, sendo gerados por eventos externos tais como
os giros de uma catraca de controle de acesso, a passagem de pacotes por sensor de presença
em linha de manufatura, etc.

No caso da função de temporização, a contagem avança de acordo com pulsos internos,


sı́ncronos e periódicos. Assim, a cronometragem do tempo é dada por:
1
Tc = Nc , (2)
fp
com fp sendo a frequência dos pulsos de avanço do contador. Se não for usada divisão de
frequência, então
fp = fCLK IO ,
que, no caso do kit Arduino Uno, é de 16 MHz.

Na prática, é comum desejar-se temporizar sinalizações em escala da ordem de 1 s.


Para isso, a frequência do clock do sistema fCLK IO pode ser muito alta. Por exemplo, no
caso do kit Arduino Uno, a expressão (2) fornece:
1 1
Tc = Nc = 65536 ≈ 4.1ms,
fp 16 MHz
número já apresentado em (1).

Com o uso de prescalers, a expressão (2) pode ser reescrita como:


PRSC
Tc = Nc , (3)
fCLK IO
com PRSC ∈ {1, 8, 64, 256, 1024}. Para fins de cálculos de temporização, buca-se determi-
nar o número de contagens Nmboxc que resultam no tempo desejado Tc . Ou seja, pode-se
reescrever (3) como:
fCLK IO
Nc = Tc . (4)
PRSC

Exemplo: encontre o número de contagens necessárias para temporização de 100 ms em


um Arduino Uno, considerando o uso do timer 1.

A Tab. 2 mostra os valores possı́veis para diferentes valores de PRSC.

6
PRSC Nc
1 1.600.000
8 200.000
64 25.000
256 6.250
1024 1.562,5

Tabela 2: Valores de contagens do timer 1 para fCLK IO = 16 MHz, Tc = 100 ms.

Vous aimerez peut-être aussi