7.1 INTRODUCCIÓN
Timer/Contador 1 de 16 bits.
Registros
Definiciones
Los registros TCNT1, OCR1A/B e ICR1 son registros de 16 bits que pueden ser
accesados por el CPU del AVR vía el bus de datos de 8 bits. El registro de 16 bits debe
ser accesado usando 2 operaciones de lectura o escritura. Cada timer de 16 bits tiene
un solo registro temporal de 8 bits para almacenamiento temporal del byte alto de 16
bits. El mismo registro temporal se comparte entre los registros de 16 bits dentro de
cada timer de 16 bits. Accesando al byte bajo del registro de 16 bits ya sea escribiendo
o leyendo en él se dispara esta operación. Cuado el byte bajo del registro de 16 bits se
escribe por el CPU, el byte alto se almacena en el registro temporal, y escrito ambos,
estos son copiados al registro de 16 bits en el mismo ciclo de reloj. Cuando el byte bajo
del registro de 16 bits es leído por el CPU, el byte alto del registro de 16 bits se copia
dentro del registro temporal en el mismo ciclo de reloj tal como el byte bajo es leído.
No todos los accesos a 16 bits utilizan el registro temporal para el byte alto. Leyendo los
registros de 16 bits OCR1A/B no involucran registros temporales.
Para realizar una escritura a 16 bits, el byte alto debe ser escrito antes que el byte bajo.
Para una lectura a 16 bits, el byte bajo debe ser leído antes del byte alto.
El siguiente cogido ejemplo muestra como accesar a los registros del Timer de 16 bits
asumiendo que ninguna interrupción se actualiza el registro temporal.
El siguiente código ejemplo muestra como hacer una lectura atómica al contenido del
registro TCNT1. Leyendo cualquier cualquiera de los registros OCR1A/B o ICP1 puede
ser hecho usando el mismo principio.
El siguiente código ejemplo muestra como hacer una escritura atómica al contenido de
los registros TCNT1. Escribiendo a cualquiera de los registros OCR1A/B o ICP1 puede
ser hecho usando el mismo principio.
El Timer/Contador 1 puede ser sincronizado por una fuente de reloj interna o externa, la
fuente de reloj se selecciona por la unidad lógica de selección de reloj la cual se
controla por los bits de selección (CS12:0) localizados en el registro de control B del
Timer/Contador 1 (TCCR1B).
Unidad de conteo.
Cuando ocurre un cambio en nivel lógico (un evento) en el pin de Captura de Entrada
(ICP1), o alternativamente en la Salida del Comparador Analógico (ACO) y este cambio
se confirma por los ajustes del detector de transición, una captura será disparada.
Cuando se dispara una captura, el valor de 16 bits del contador (TCNT1) se escribe en
el Registro de Captura de Entrada (ICR1). La bandera de Captura de Entrada (ICF1) se
pone a uno en el mismo ciclo de reloj así como el valor de TCNT1 se copia dentro del
registro ICR1. Si esta habilitado (TICIE1 = 1), la bandera de captura de entrada genera
una interrupción de captura de entrada. La bandera ICF1 es automáticamente limpiada
cuando la interrupción se ejecuta. Alternadamente la bandera ICF1 puede ser limpiada
por software escribiendo un uno lógico en la localidad del bit de I/O.
El registro ICR1 puede ser escrito solamente cuando se usa el modo de generación de
forma de onda que utiliza al registro ICR1 para definir el valor TOP del contador. En
estos casos los bits del modo de generación de forma de onda (WGM13:0) deben ser
puestos a su valor TOP antes de escribirse al registro ICR1. Cuando se escribe al
registro ICR1 el byte alto debe ser escrito en la localidad ICR1H I/O antes que el byte
bajo es escrito en ICR1L.
Ambas entradas el pin de captura de entrada (ICP1) y la salida del comparador análogo
(ACO) son muestreadas usando algunas técnicas para el pin T1. El detector de flanco
es también idéntico. Sin embargo, cuando el cancelador de ruido de activa, lógica
adicional se inserta antes que el detector de flanco, el cual incrementa el retardo por 4
ciclos de reloj. Note que la entrada del cancelador de ruido y el detector de flanco esta
siempre habilitado a menos que el Timer/Contador 1 es puesto en modo generación de
forma de onda que utiliza ICR1 para definir el TOP.
Una captura de entrada puede ser disparada por software controlando el puerto del pin
ICP1.
Cancelador de Ruido
Cuando se usa la interrupción de captura de entrada, el registro ICR1 deberá ser leído
tan pronto como el manejador de rutina de interrupción sea posible. Aún cuando la
interrupción de captura de entrada tenga relativamente una alta prioridad, el tiempo de
respuesta de interrupción máxima es dependiente en el número máximo de ciclos de
reloj manejando cualquiera de las solicitudes de interrupción.
El registro OCR1x es de doble buffer cuando se usa para cualquiera de los 12 modos
de PWM. Para los modos de operación normal y limpieza del timer por comparación
(CTC), el doble buffer se deshabilita. El doble buffer sincroniza la actualización del
registro de comparación OCR1x ya sea en TOP o en BOTTOM de la secuencia de
conteo. La sincronización previene la ocurrencia de longitudes impares, pulsos no
simétricos PWM, y la creación de la salida libre de fallas. El acceso al registro OCR1x
puede ser complicado, pero este no es el caso. Cuando el doble buffer se habilita el
CPU tienen acceso al registro del buffer OCR1x, y si el doble buffer se deshabilita, el
CPU accesará al OCR1x directamente. El contenido de OCR1x (Buffer de comparación)
solamente se cambia por una operación de escritura (el Timer/Contador 1 no actualiza
este registro automáticamente como el TCNT1 y el registro ICR1). Por consiguiente
OCR1x no es leído vía el registro temporal alto (TEMP). Sin embargo, es una buena
práctica leer primero el byte bajo cuando se accesa a registros de 16 bits. Escribiendo a
los registros OCR1x debe ser hecho vía el registro TEMP ya que la comparación de
todos os 16 bits se hacen automáticamente. El byte alto (OCR1xH) tiene que estar
escrito primero. Cuando el byte alto de la localidad de I/O es escrito por el CPU, el
registro TEMP será actualizado por el valor escrito. Entonces cuando el byte bajo
(OCR1xL) se escriben a los ochos bits bajos, el byte alto será copiado dentro de los 8
bits altos del buffer OCR1x o el registro de comparación OCR1x en el mismo ciclo del
sistema de reloj.
Todas las escrituras del CPU al registro TCNT1 bloquearan cualquier comparación
igualada que ocurra en el próximo ciclo de reloj del timer, aún cuando el timer sea
detenido. Esta característica permite a OCR1x sea inicializado al mismo valor como
TCNT1 sin disparar una interrupción cuando el Timer/Contador 1 del reloj sea
habilitado.
El ajuste de OC1x deberá realizarse antes del establecimiento del registro de dirección
de datos para el pin del puerto como salida. La manera más fácil de ajustar el valor de
OC1x es usar los bits en la comparación de salida forzada (FOC1x) en el modo normal.
El registro OC1x mantiene su valor aún cuando cambie entre los modos de generación
de forma de onda.
Tenga cuidado de que los bits COM1x1:0 no son de doble buffer junto con el valor de
comparación. Cambiando los bits COM1x1:0 tomara efecto inmediatamente.
Los bits del modo de comparación de salida (COM1x1:0) tienen dos funciones. El
generador de forma de onda usa los bits COM1x1:0 para definir el estado de la
comparación de salida (OC1x) en la próxima comparación igualada. En segundo lugar
los bits COM1x1:0 controlan la fuente de salida del pin OC1x. La figura siguiente
muestra un diagrama esquemático del ajuste de los bits COM1x1:0. Los registros de
I/O, los bits de I/O, y los pines de I/O en la figura se muestran en negritas. Solamente
las partes de los registros de control del puerto de I/O (DDR y PORT) que son afectadas
por los bits COM1x1 se muestran. Cuando nos referimos al estado OC1, la referencia
es para el registro interno OC1x, no el pin OC1. Si un reset en el sistema ocurre, el
registro OC1x se refiere como un “0”.
La función general del puerto de I/O es sobre escrita por el comparador de salida
(OC1x) del generador de forma de onda si los bits del COM1x1:0 son puestos. Sin
embargo, la dirección del pin OC1x (entrada o salida) es aún controlada por el registro
de dirección de datos (DDR) para el pin del puerto. El bit del registro de dirección de
datos para el pin OC1x (DDR_OC1x) debe de estar colocada como salida antes que el
valor de OC1x sea visible en el pin. La función de sobre escritura del puerto es
generalmente independiente del modo de generación de la forma de onda, pero existen
algunas excepciones. El diseño del pin lógico de la comparación de salida permite la
inicialización del estado de OC1x antes que la salida sea habilitada. Note que ciertos
bits de COM1x1:0 se reservan para ciertos modos de operación. Los bits COM1x1:0 no
tienen efecto en la unidad de captura de entrada.
El generador de forma de onda usa los bits COM1x1:0 para el modo normal, CTC, y
PWM. Para todos los modos, el ajuste de COM1x1:0 le dice al generador de forma de
onda que ninguna acción en el registro OC1x sea ejecutada en la próxima comparación
igualada. Verifique las siguientes tablas para el ajuste de los bits en los modos en
particular.
Modos de Operación
si. Los bits COM1x1:0 controlan si la salida del PWM deberá ser invertida o no (PWM
invertido o no invertido). Para modo no PWM los bits COM1x1:0 controlan si la salida
deberá ser puesta a uno, limpiada o invertida cuando se iguala la comparación.
Modo Normal
Es el modo más simple de operar (WGM13:0 = 0). En este modo la dirección del conteo
es siempre ascendente y no se ejecuta ninguna limpieza al contador. El contador
simplemente sigue contando cuando pasa de su máximo valor de 16 bits (MAX =
0xFFFF) y entonces se reinita a su valor BOTTOM (0x0000). En operación normal la
bandera de Sobreflujo del Timer/Contador 1 (TOV1) será puesta en uno en el mismo
ciclo de reloj como TCNT1 llega ser cero. La bandera TOV1 en este caso llega a ser
como el 17vo bit, excepto que solamente puesto a uno, no limpiado. Sin embargo,
combinado con la interrupción del sobreflujo del timer que automáticamente limpia la
bandera TOV1, la resolución del timer puede ser incrementada por software. No existen
casos especiales para considerar en el modo normal, un valor nuevo de contador
puede ser escrito en cualquier tiempo.
En el modo de limpieza del timer por comparación o CTC (WGM13:0 = 4 o 12), los
Registros OCR1A o ICR1 son usados para manipular la resolución del contador. En el
modo CTC el contador se limpia a cero cuando el valor del contador (TCNT1) se iguala
ya sea a OCR1A (WGM13:0 = 4) o a ICR1 (WGM13:0 = 12). El OCR1A o ICR1 definen
el valor TOP del contador, y también su resolución. Esto modo permite mayor control de
la frecuencia de comparación de salida igualada. También se simplifica la operación de
conteo de eventos externos.
Una interrupción puede ser generada cada vez que el contador alcanza el valor TOP ya
sea por la bandera OCF1A o ICF1 acorde al registro usado para definir el valor TOP. Si
la interrupción es habilitada, el manejador de rutina de interrupción puede ser usado
para actualizar el valor TOP. Sin embargo, cambiando el TOP a un valor cercano a
BOTTOM cuando el contador esta corriendo con ningún o un preescalador muy bajo
debe tenerse cuidado, ya que el modo CTC no posee la característica de doble buffer.
Si el nuevo valor escrito a OCR1A o a ICR1 es más bajo que el valor actual del TCNT1,
el contador perderá la igualdad en la comparación. El contador tendrá que contar a su
máximo valor (0xFFFF) y empezar en el inicio 0x0000 antes que la comparación
igualada pueda ocurrir. En muchos casos esta característica no es deseable. Una
alternativa será usar el modo PWM rápido usando OCR1A para definir el TOP
(WGM13:0 = 15) ya que el OCR1A será de doble buffer. Para generar una forma de
onda de salida en el modo CTC, la salida OC1A puede ser invertida en su nivel lógico
en cada igualdad de comparación ajustando los bits del modo de comparación de salida
en modo toggle (COM1A1:0 = 1). El valor OC1A no será visible en el pin del puerto a
menos que la dirección de datos para el pin este colocado como salida (DDR_OCR1A =
1). La forma de onda generada tendrá su máxima frecuencia de fOC1A = fclk_I/O /2 cuando
OCR1A sea colocado a cero (0x0000). La frecuencia de forma de onda se define por la
siguiente ecuación:
La variable N representa el valor del preescalador divisor (1, 8, 64, 256, o 1024).
Para el modo normal de operación, la bandera TOV1 se pone a uno en el mismo ciclo
de reloj cuando el contador pasa de MAX a 0x0000.
La Modulación por Ancho de Pulso Rápida (WGM13:0 = 5, 6, 7, 14 o15) provee una alta
frecuencia de PWM en la opción de generación. El modo PWM rápido difiere de las
otras opciones de PWM por la operación de una sola pendiente. El contador cuenta
La resolución PWM para el modo PWM rápido puede fijarse a 8, 9 o 10 bits, o definirse
ya sea por ICR1 u OCR1A. La mínima resolución permitida es de 2 bits (ICR1 o ICR1A
se colocan a 0x0003) y la máxima resolución es a 16 bits (ICR1 o ICR1A se colocan a
MAX). La resolución PWM en bits puede ser calculada usando la siguiente ecuación:
En el modo PWM rápido el contador se incrementa hasta que el valor del contador
iguala ya sea uno de los valores fijos 0x00FF, 0x01FF, o 0x03FF (WGM13:0 = 5, 6 o 7),
o al valor en ICR1 (WGM13:0 = 14) o al valor de OCR1A (WGM13:0 = 15). El contador
entonces se limpia en el siguiente ciclo de reloj. El diagrama de tiempos para este modo
de muestra en la siguiente figura. La figura muestra el modo PWM rápido cuando
OCR1A o ICR1 se usan para definir el TOP. El valor TCNT1 se muestra en el diagrama
de tiempos como un histograma para ilustrar la operación de una sola pendiente. El
diagrama incluye las salidas para los modos PWM invertida y no invertida. La marca
horizontal en la pendiente de TCNT1 representa el momento cuando se iguala a OCR1x
y TCNT1. La bandera de interrupción OC1x será colocada a uno cuando una
comparación igualada ocurra.
La bandera de sobreflujo del Timer/Contador 1 (TOV1) se coloca a uno cada vez que el
timer alcanza el valor TOP. En resumen las banderas OC1A o ICF1 se ponen a uno en
el mismo ciclo de reloj del timer como TOV1 es puesto a uno cuando ya sea OCR1A o
ICR1 se utilizan para definir el valor TOP. Si una de las interrupciones esta habilitada, el
manejador de rutinas de interrupción puede ser utilizado para actualizar los valores de
comparación de TOP.
Cuando se cambia el valor TOP en el programa, debe asegurase que el nuevo valor
TOP sea mayor o igual al valor de todos los registros de comparación. Si el valor TOP
esta más abajo que en cualquiera de los registros de comparación, una igualdad en la
comparación nunca ocurrirá entre TCNT1 y el OCR1x. Note que cuando se usan
valores fijos TOP, los bits sin usarse son enmascarados a cero cuando cualquiera de
los registros OCR1x sea escrito.
Usando el registro ICR1 para definir a TOP trabaja bien cuando se usan valores fijos de
TOP. Usando el ICR1, el registro OCR1A esta libre para usarse para generar la salida
PWM en OC1A. Sin embargo, si la frecuencia base PWM se activa cambiando el valor
TOP, se usa el OCR1A como TOP, es mejor elección debido a la característica de
doble buffer.
La frecuencia PWM para la salida puede ser calculada por la siguiente ecuación:
La variable N representa el valor del preescalador divisor (1, 8, 64, 256, o 1024).
Los valores extremos para el registro OCR1x representan casos especiales cuando se
genera una forma de onda de salida en el modo PWM rápido. Si el OCR1x es puesto
igual a BOTTOM (0x0000), la salida será un pequeño pico por cada ciclo de reloj del
timer TOP+1. Ajustando el OCR1x igual a TOP resultara en una salida constante alta o
baja (dependiendo de la polaridad de la salida ajustando los bits COM1x1:0).
Una forma de onda de frecuencia (al 50% de la razón del ciclo) de salida en el modo
PWM rápido puede ser alcanzada ajustando OC1A a toggle su nivel lógico en cada
comparación igualada (COM1A1:0 = 1). Esto aplica solamente si OCR1A se usa para
definir el valor TOP (WGM13:0 = 15). La forma de onda generada tendrá una frecuencia
máxima de fOC1A = fclk_I/O /2 cuando OCR1A es colocado a cero (0x0000). Esta
característica es similar al toggle de OC1A en el modo CTC, excepto por la
característica de doble buffer en la unidad de comparación de salida se habilita en el
modo PWM rápido.
La resolución PWM para el modo PWM de fase correcta puede fijarse a 8, 9 o 10 bits, o
definirse ya sea por ICR1 u OCR1A. La mínima resolución permitida es de 2 bits (ICR1
o ICR1A se colocan a 0x0003) y la máxima resolución es a 16 bits (ICR1 o ICR1A se
colocan a MAX). La resolución PWM en bits puede ser calculada usando la siguiente
ecuación:
En el modo PWM de fase correcta el contador se incrementa hasta que el valor del
contador iguala ya sea uno de los valores fijos 0x00FF, 0x01FF, o 0x03FF (WGM13:0 =
1, 2, o 3), o al valor en ICR1 (WGM13:0 = 10) o al valor de OCR1A (WGM13:0 = 11). El
contador entonces tiene que alcanzar el valor TOP y cambiar la dirección de la cuenta.
El valor TCNT1 será igual a TOP por un solo ciclo de reloj. El diagrama de tiempos para
este modo de muestra en la siguiente figura. La figura muestra el modo PWM de fase
correcta cuando OCR1A o ICR1 se usan para definir el TOP. El valor TCNT1 se
muestra en el diagrama de tiempos como un histograma para ilustrar la operación de
doble pendiente. El diagrama incluye las salidas para los modos PWM invertida y no
invertida. La marca horizontal en la pendiente de TCNT1 representa el momento
cuando se iguala a OCR1x y TCNT1. La bandera de interrupción OC1x será colocada a
uno cuando una comparación igualada ocurra.
La bandera de sobreflujo del Timer/Contador 1 (TOV1) se coloca a uno cada vez que el
timer alcanza el valor BOTTOM. Cuando ya sea OCR1A o ICR1 se utilizan para definir
el valor TOP, la bandera OC1A o ICF1 se ponen a uno de acuerdo en el mismo ciclo de
reloj como posregistros OCR1x son actualizados con el valor de doble buffer (en TOP).
Las banderas de interrupción pueden se usadas para generar interrupciones cada vez
que el contador alcanza el valor TOP o BOTTOM.
Cuando se cambia el valor TOP en el programa, debe asegurase que el nuevo valor
TOP sea mayor o igual al valor de todos los registros de comparación. Si el valor TOP
esta más pequeño que en cualquiera de los registros de comparación, una igualdad en
la comparación nunca ocurrirá entre TCNT1 y el OCR1x. Note que cuando se usan
valores fijos TOP, los bits sin usarse son enmascarados a cero cuando cualquiera de
los registros OCR1x se escriben. Como se muestra en la figura siguiente el tercer
periodo, se cambia el valor TOP activo mientras el Timer/Contador 1 esta corriendo en
el modo de fase correcta puede resultar en una salida no simétrica. La razón de esto
puede ser por el tiempo de actualización del registro OCR1x. Ya que la actualización de
OCR1x ocurre en TOP, el periodo PWM inicia al final del TOP, mientras que la longitud
de la pendiente de subida se determina por el nuevo valor TOP. Cuando estos dos
valores difieren, las dos pendientes del periodo diferirán en longitud. La diferencia en
longitud nos da un resultado de salida asimétrico.
Es recomendable usar el modo de fase y frecuencia correcta en lugar del modo de fase
correcta cuando se cambia el valor TOP mientras el Timer/Contador 1 esta corriendo.
Cuando se usa un valor TOP estático no existe diferencia entre los dos modos de
operación.
La variable N representa el valor del preescalador divisor (1, 8, 64, 256, o 1024).
Los valores extremos para el registro OCR1x representan casos especiales cuando se
genera una forma de onda de salida en el modo PWM de fase correcta. Si el OCR1x es
puesto igual a BOTTOM, la salida será continuamente baja y si es puesta al valor TOP
la salida será continuamente alta para el modo PWM no invertido. Para el PWM
invertido la salida tendrá valores lógicos opuestos. Si se usa OCR1A para definir el
valor TOP (WGM13:0 = 11) y COM1A1:0 =1, la salida OCR1A será invertida con una
razón de ciclo al 50%.
La resolución PWM para el modo PWM de fase y frecuencia correcta puede ser definido
por ICR1 o ICR1A. La mínima resolución permitida es de 2 bits (ICR1 o ICR1A se
colocan a 0x0003) y la máxima resolución es a 16 bits (ICR1 o ICR1A se colocan a
MAX). La resolución PWM en bits puede ser calculada usando la siguiente ecuación:
Cuando se cambia el valor TOP en el programa, debe asegurase que el nuevo valor
TOP sea mayor o igual al valor de todos los registro de comparación. Si el valor TOP
esta más abajo de cualquier registro de comparación, una igualdad en la comparación
nunca ocurrirá entre TCNT1 y el OCR1x. Como se muestra en la figura siguiente. Ya
que los registros OCR1x son actualizados a BOTTOM, la longitud de las pendientes de
subida y bajada siempre serán iguales. Esto resulta en pulsos simétricos de salida y por
consiguiente la frecuencia correcta.
Usando el registro ICR1 para definir que TOP trabaja bien cuando se usan valores fijos
de TOP. Usando ICR1A, el registro OCR1A queda libre para usarse en la generación de
salida PWM en OC1A. Sin embargo, si la frecuencia base PWM se activa cambiando el
valor TOP, se usa el OCR1A como valor TOP, es una mejor decisión debido a su
característica de doble pendiente.
La variable N representa el valor del preescalador divisor (1, 8, 64, 256, o 1024).
Los valores extremos para el registro OCR1x representan casos especiales cuando se
genera una forma de onda de salida PWM en el modo de fase y frecuencia correcta. Si
el OCR1x es puesto igual a BOTTOM, la salida será continuamente baja y si es puesta
al valor TOP la salida será puesta en alta para el modo PWM no invertido. Para el PWM
invertido la salida tendrá valores lógicos opuestos. Si se usa OCR1A para definir el
valor TOP (WGM13:0 = 9) y COM1A1:0 =1, la salida OCR1A será invertida con una
razón de ciclo al 50%.