__________________________________________________________________________ITSP
Timer1 del AVR 7.1 INTRODUCCIÓN Timer/Contador 1 de 16 bits.
Registros El registro del Timer/Contador 1 (TNCT1), y los Registros de Comparación de Salida (OCR1A/B) y de Captura de Entrada (ICR1) todos son de 16 bits. Se usan procedimientos especiales cuando se accesan los registros de 16 bits. Los registros de Control del Timer/Contador 1 (TCCR1A/B) son registros de 8 bits y no existen restricciones de acceso. Las señales de petición de interrupciones (Interruption Request) son visibles en el Registro de Banderas de Interrupciones (TIMSK). Los registros TIFR y TIMSK no se muestran en las figuras ya que estos registros son compartidos por otras unidades. Documento traducido de la hoja de datos del ATmega32
1
__________________________________________________________________________ITSP
El Timer/Contador 1 puede ser sincronizado internamente vía el preescalador o por una fuente externa de reloj en el pin T1. El bloque lógico de selección de reloj controla cual fuente de reloj, y si se incrementa (o decrementa) su valor. El Timer/Contador 1 esta inactivo cuando ninguna fuente se selecciona. La salida de la selección lógica del reloj se refiere al reloj del timer (clkT1). Los registros de comparación de salida de doble buffer (OCR1A/B) son comparados con el valor del Timer/Contador 1 en todo momento. El resultado de la comparación se puede usar por el generador de forma de onda y generar PWM o variables de frecuencia de salida en el pin de salida de comparación (OC1A/B). Un evento de igualdad en la comparación también activará la bandera de comparación igualada (OCF1A/B) la cual se usa para generar solicitudes de interrupciones en la comparación de salida. El registro de captura de entrada puede capturar el valor del Timer/Contador 1 en un evento externo dado (disparo de transición) o ya sea por el pin de Captura de entrada (ICP1) o por los pines del Comparador Analógico. La unidad de captura de entrada incluye una unidad de filtrado (cancelador de ruido) para la reducción de picos de ruido. El valor TOP, o valor máximo del Timer/Contador 1, en algunos modos de operación pueden ser definidos por el registro OCR1A, el registro ICR1 o por un conjunto de valores fijos. Cuando se usa OCR1A como valor TOP en el modo PWM, el registro OCR1 no puede ser utilizado para generar una salida PWM. Sin embargo, el valor TOP será de doble buffer permitiendo al valor TOP sea cambiado mientras este corriendo el contador. Si un valor fijo TOP se requiere, el registro ICR1 puede usarse como una alternativa, liberando OCR1A/B a ser usado como salida PWM. Definiciones BOTTOM. El contador alcanza el BOTTOM cuando llegar a ser 0x0000. MAX. El contador alcanza su máximo valor cuando llega a ser 0xFFFF (65535). TOP. El contador alcanza su TOP cuando llega a ser igual al valor más alto en la secuencia de conteo. El valor TOP puede ser asignado a uno de los valores fijos: 0x00FF, 0x1FF, 0x03FF o a los valores almacenados en los registros OCR1A o ICR1. La asignación depende del modo de operación. Accesando a los Registros de 16 bits 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.
Documento traducido de la hoja de datos del ATmega32
2
__________________________________________________________________________ITSP 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 código ensamblador del ejemplo retorna el valor de TCNT1 en el par de registros r17:r16. Es importante notar que el acceso a registros de 16 bits son operaciones atómicas. Si una interrupción ocurre entre las dos instrucciones de acceso a los registros de 16 bits, y el código de interrupción actualiza el registro temporal accesando al mismo o a otros registros de timers a 16 bits, entonces el resultado del acceso a estos registros será corrompido. Por consiguiente, cuando el código principal y el código de interrupción actualicen los registros temporales, el código principal deberá deshabilitar las interrupciones durante el acceso a 16 bits. 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.
Documento traducido de la hoja de datos del ATmega32
3
__________________________________________________________________________ITSP
El código ejemplo ensamblador retorna el valor de TCNT1 en el par de registros r17:r16. 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.
Documento traducido de la hoja de datos del ATmega32
4
__________________________________________________________________________ITSP
Fuentes de reloj del Timer/Contador 1 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. La parte principal para el Timer/Contador 1 de 16 bits es la programación de la unidad de conteo bidireccional.
Documento traducido de la hoja de datos del ATmega32
5
__________________________________________________________________________ITSP
Descripción de señales (señales internas): Count Se incrementa o decrementa TCNT1 en 1. Direction Se selecciona entre incremento o decremento. Clear Limpia el TCNT1. clkT1 Reloj del Timer/Contador 1. TOP Señaliza que TCNT1 ha alcanzado el valor máximo. BOTTOM Señaliza que TCNT1 ha alcanzado su valor mínimo. El contador a 16 bits se mapea dentro de las localidades de memoria de 8 bits de I/O: Parta alta del contador (TCNT1H) que contiene los 8 bits más altos del contador, y la parte baja del contador (TCNT1L) que contiene los 8 bits más bajos del contador. El registro TCNT1H puede solamente accesar indirectamente por el CPU. Cuando el CPU realiza un acceso a la localidad TCNT1H I/O, el CPU accesa a la parte alta del registro temporal (TEMP). El registro temporal se actualiza con el valor de TCNT1H cuando el TCNT1L se lee, TCNT1H se actualiza con el valor del registro temporal cuando TCNT1L se escribe. Esto permite al CPU leer o escribir al valor entero del contador de 16 bits dentro de un ciclo de reloj vía el bus de datos de 8 bits. Es importante notar que existen casos especiales cuando se escribe al registro TCNT1 mientras esta contando que darán resultados impredecibles. Los casos especiales se describen en las secciones donde son de importancia. Dependiendo del modo de operación usado, el contador se limpia, se incrementa o decrementa en cada ciclo de reloj (clkT1). El clkT1 puede ser generado de una fuente de reloj externo o interno, seleccionando los bits de Selección de Reloj (CS12:0). Cuando ninguna fuente de reloj se selecciona (CS12:0 = 0) el timer se detiene. Sin embargo, el valor de TCNT1 puede ser accesado por el CPU, independientemente de si clkT1 esta presente o no. Una escritura del CPU tiene prioridad sobre todos las operaciones del contador o de limpieza del contador. La secuencia de conteo se determina por los bits de configuración del Modo de Generación de Forma de Onda (WGM13:0) localizados en los Registros de Control del Timer/Contador 1 A y B (TCCR1A y TCCR1B) existen conexiones entre como el contador cuenta y como se generan las formas de onda en la salida de la Comparación de salida OC1x. La Bandera de Sobreflujo del Timer/Contador 1 (TOV1) es colocada de acuerdo al modo de operación seleccionado por los bits WGM13:0. TOV1 puede ser usado para generar la interrupción del CPU. Documento traducido de la hoja de datos del ATmega32
6
__________________________________________________________________________ITSP
Unidad de Captura de Entrada El Timer/Contador 1 incorpora una Unidad de Entrada de Captura que puede capturar eventos externos y darles una indicación de ocurrencia en el tiempo estampado. La señal externa indican que un evento o múltiples eventos pueden ser aplicados vía el pin ICP1 o alternadamente, vía la unidad del Comparador Analógico. El tiempo estampado puede ser usado para calcular la frecuencia, la razón del ciclo, y otras características de la señal aplicada. Alternativamente el tiempo estampado puede ser usado para crear un registro de los eventos. A continuación se ilustra el diagrama a bloques de la unidad de captura de entrada.
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.
Documento traducido de la hoja de datos del ATmega32
7
__________________________________________________________________________ITSP Leyendo el valor de 16 bits en el Registro de Captura de Entrada (ICR1) se realiza primeramente leyendo el byte bajo (ICR1L) y entonces el byte alto (ICR1H). Cuando el byte bajo es leído el byte alto se copia dentro del registro temporal del byte alto (TEMP). Cuando el CPU lee la localidad ICR1H I/O accesará al registro TEMP. 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. Fuente de Captura de Entrada del Pin La principal fuente de disparo para la unidad de captura de entrada es el pin de captura de entrada (ICP1). El Timer/Contador 1 puede alternarse usando la salida del comparador análogo como fuente de disparo ajustando el bit de Captura de Entrada del Comparador Análogo (ACIC) en el Registro de Estado de Control del Comparador Análogo (ACSR). Ten cuidado que cambiando la fuente de disparo puede activar una captura. La bandera de captura de entrada debe limpiarse después del cambio. 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 El cancelador de ruido mejora la inmunidad de ruido usando un esquema de filtrado digital simple. La entrada del cancelador de ruido se monitorea sobre cuatro muestras, y las cuatro deben ser iguales para cambiar la salida que esta en turno por el detector de flanco. El cancelador de ruido se habilita ajustando el bit de cancelador de ruido de entrada (ICNC1) en el registro B de control del Timer/Contador 1 (TCCR1B). Cuando se habilita el cancelador de ruido se introducen cuatro ciclos de reloj más de retardo para un cambio aplicado a la entrada, hasta la actualización del registro ICR1. El cancelador de ruido utiliza el sistema de reloj y por consiguiente no se afecta por el preescalador. Usando la Unidad de Captura de Entrada El principal desafío cuando se usa la unidad de captura de entrada es asignar bastante capacidad en el procesador para el manejo de eventos de entrada. El tiempo entre dos Documento traducido de la hoja de datos del ATmega32
8
__________________________________________________________________________ITSP eventos es crítico. Si el procesador no ha leído el valor de captura en el registro ICR1 antes que el próximo evento ocurra, el ICR1 será sobrescrito con un nuevo valor. En este caso el resultado de la captura será incorrecto. 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. Usando la unidad de captura de entrada en cualquier modo de operación cuando el valor TOP (resolución) es cambiado durante la operación activa, no es recomendable. La medida de un ciclo de una señal externa requiere que el flanco de disparo sea cambiado después de cada captura. Cambiando el flanco de sensado debe ser hecho tan pronto como sea posible después del registro ICR1 sea leído. Después de un cambio en el flanco, la bandera de captura de entrada (ICF1) debe ser limpiada por software (escribiendo un uno lógico al bit de la localidad de I/O). Para medir solamente la frecuencia, limpiando la bandera ICF1 no es requerida (si se usa un manejador de interrupción). Unidades de Comparación de Salida El comparador a 16 bits continuamente compara a TCNT1 con el registro de Comparación de Salida (OCR1x). Si TCNT iguala a OCR1x el comparador señalizara una igualdad. Una igualdad pondrá a uno la bandera de comparación de salida (OCF1) en el próximo ciclo del timer. La bandera OCF1x automáticamente se limpia cuando la interrupción se ejecuta. Alternadamente la bandera OCF1x puede ser limpiada por software escribiendo un uno lógico a su localidad de I/O. El generador de forma de onda usa esta señal de igualdad para generar una salida acorde al modo de operación seleccionado por los bits (WGM13:0) y los bits del modo de comparación de salida (COM1x1:0). Las señales de TOP y BOTTOM son usadas por el generador de forma de onda para el manejo de casos especiales de valores extremos en algunos modos de operación. Una característica especial de la unidad de comparación de salida A es que permite definir el valor TOP del Timer/Contador 1 (por ejemplo, la resolución del contador). En resumen la resolución de contador, el valor TOP define el periodo de tiempo para generar las formas de ondas por el generador. La figura siguiente muestra un diagrama a bloques de la unidad de comparación de salida. La letra “n” indica el número del timer 1, y “x” indica la unidad de comparación de salida (A/B).
Documento traducido de la hoja de datos del ATmega32
9
__________________________________________________________________________ITSP
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. Comparación de Salida Forzada En los modos de generación de forma de onda no PWM, la salida igualada del comparador puede ser forzada escribiendo a uno el bit de Comparación de Salida Documento traducido de la hoja de datos del ATmega32
10
__________________________________________________________________________ITSP Forzada (FOC1x). Forzando una comparación igualada no será puesta a uno la bandera OCF1x o recarga/limpia del timer, pero el pin OC1x será actualizado como si una comparación igualada real haya ocurrido (el ajuste de los bits COM1x1:0 definen si el pin OC1x es puesto a uno, limpiado o invertido). Bloqueo de una Comparación Igualada por una escritura en TCNT1 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. Usando la Unidad de Comparación de Salida Ya que al escribir al TCNT1 en cualquier modo de operación bloqueara todas las igualdades de comparación por un ciclo de reloj del timer, existe un riesgo involucrado cuando cambiamos a TCNT1 al usar cualquier unidad de comparación de salida, independientemente si el Timer/Contador 1 esta corriendo o no. Si el valor escrito a TCNT1 iguala al valor OCR1x, la comparación igualada se perderá, resultando una incorrecta generación de forma de onda. No escriba el TCNT1 igual a TOP en los modos PWM con valores TOP variables. La comparación igualada para el TOP será ignorada y el contador continuara hasta 0xFFFF. Similarmente, no escriba a TCNT1 a BOTTOM cuando el contador este decrementándose. 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. Unidad de Comparación Igualada de Salida 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”.
Documento traducido de la hoja de datos del ATmega32
11
__________________________________________________________________________ITSP
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. Modo de Salida de Comparación y Forma de Onda 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 El modo de operación, por ejemplo, la conducta del Timer/Contador 1 y la salida de los pines de la comparación de salida se definen por la combinación de los bits del modo de Generación de la Forma de Onda (WGM13:0) y los bits del Modo de Comparación de Salida (COM1x1:0). Los bits del modo de Comparación de Salida no afectan la secuencia de conteo, mientras que los bits del modo de generación de forma de onda Documento traducido de la hoja de datos del ATmega32
12
__________________________________________________________________________ITSP 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. La Unidad de Captura de Entrada es fácil de usar en el modo normal. Sin embargo, observe que el máximo intervalo entre los eventos externos no debe exceder la resolución del contador. Si el intervalo entre los eventos es muy largo, la interrupción del sobreflujo del timer o el preescalador deben ser utilizados para extender la resolución de la unidad de captura. La unidad de comparación de salida puede ser usada para generar interrupciones en algún tiempo dado. Usando la comparación de salida para generar formas de onda en el modo normal no es recomendado, ya que esto ocuparía demasiado tiempo de consumo del CPU. Modo de Limpieza del Timer por Comparación Igualada (CTC) 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. El diagrama de tiempos para el modo CTC se muestra a continuación. El valor del contador (TCNT1) se incrementa hasta que ocurre una igualdad en la comparación con ya sea OCR1A o ICR1, y entonces el contador (TCNT1) se reinicia.
Documento traducido de la hoja de datos del ATmega32
13
__________________________________________________________________________ITSP
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. Modo PWM Rápido 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 Documento traducido de la hoja de datos del ATmega32
14
__________________________________________________________________________ITSP desde BOTTOM (0x0000) hasta TOP y entonces de reinicia a BOTTOM. En el modo de comparación de salida no invertida, la salida de comparación (OC1x) se limpia cuando se iguala la comparación entre TCNT1 y OCR1x y se pone en BOTTOM. En el modo de comparación de salida invertida la salida se pone a uno cuando existe una comparación igualada y se limpia en BOTTOM. Debido a la operación de una sola pendiente, la frecuencia de operación en el modo PWM rápido puede ser dos veces tan alto como los modos PWM de fase correcta y fase y frecuencia correcta que usan la operación de doble pendiente, máxima más baja comparada con la operación de una sola pendiente. Esta alta frecuencia hace que el modo PWM rápido se ocupe en aplicaciones de regulación de potencia, rectificación y aplicaciones para DACs. La alta frecuencia permite que componentes externos de tamaño pequeño (inductancias, capacitores) reduzcan el costo del sistema total. 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.
Documento traducido de la hoja de datos del ATmega32
15
__________________________________________________________________________ITSP
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. El procedimiento para actualizar ICR1 difiere de la actualización de OCR1A cuando se usa para definir el valor TOP. El registro ICR1 no es de doble buffer. Esto significa que si ICR1 se cambia a una valor más pequeño cuando el contador esta corriendo con ninguno o algún valor bajo de preescalación, existe un riesgo que el nuevo valor de ICR1 escrito es más bajo que el valor actual de TCNT1. El resultado entonces resultara que el contador pierda la igualdad en la comparación del valor TOP. El contador tendrá que contra hasta MAX (0xFFFF) y comenzar en 0x0000 antes que la comparación igualada pueda ocurrir. El registro OCR1A sin embargo, es de doble buffer. Esta característica permite escribir en la localidad de OCR1A I/O sea escrita en cualquier tiempo. Cuando se escribe en la localidad OCR1A I/O el valor escrito será puesto dentro del registro del buffer OCR1A. el registro de comparación OCR1A será actualizado con el valor del registro de buffer en el próximo ciclo de reloj cuanto TCNT1 iguale a TOP. La actualización se hace en el mismo ciclo de reloj del timer como el TCNT1 es limpiado y la bandera TOV1 es puesta a uno.
Documento traducido de la hoja de datos del ATmega32
16
__________________________________________________________________________ITSP 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. En el modo PWM rápido, la unidad de comparación permite la generación de PWM en los pines OC1x. Ajustando los bits COM1x1:0 a 2 producirán un PWM no invertido y una salida PWM invertida puede generarse ajustando los bits COM1x1:0 a 3. El valor actual de OC1x solamente será visible en el pin del puerto si la dirección de datos de ese pin se ajusta como salida (DDR_OC1x). La forma de onda PWM se genera poniendo a uno (o limpiando) el registro OCR1x cuando se iguala la comparación entre OCR1x y TCNT1, y se limpia (o se pone a uno) el registro OC1x en el mismo ciclo de reloj del timer, el contador se reinicia (cambia de TOP a BOTTOM). 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. Modo PWM de Fase Correcta La Modulación de Ancho de Pulso de Fase Correcta (WGM13:0 1, 2, 3, 10 u 11) provee una alta resolución en la opción de generación de forma de onda PWM de fase correcta. El modo PWM de fase correcta se parece al modo PWM de fase y frecuencia correcta basado en la operación de la doble pendiente. El contador cuenta repetidamente desde BOTTOM (0x0000) hasta TOP y desde TOP hasta BOTTOM. En el modo de comparación de salida no invertida, la salida de comparación (OC1x) se limpia cuando se iguala la comparación entre TCNT1 y OCR1x mientras sigue su conteo ascendente, y se pone a uno cuando se iguala la comparación mientras sigue su conteo descendente. En el modo de comparación de salida invertido, esta operación se Documento traducido de la hoja de datos del ATmega32
17
__________________________________________________________________________ITSP invierte. La operación de doble pendiente ofrece una frecuencia de operación máxima más baja comparada con la operación de una sola pendiente. Sin embargo, debido a la característica simétrica del modo PWM de doble pendiente, estos modos se prefieren para aplicaciones de control de motores. 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.
Documento traducido de la hoja de datos del ATmega32
18
__________________________________________________________________________ITSP 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. En el modo PWM de fase correcta, la unidad de comparación permite la generación de PWM en los pines OC1x. Ajustando los bits COM1x1:0 a 2 producirán un PWM no invertido y una salida PWM invertida puede generarse ajustando los bits COM1x1:0 a 3. El valor actual de OC1x solamente será visible en el pin del puerto si la dirección de datos de ese pin se ajusta como salida (DDR_OC1x). La forma de onda PWM se genera poniendo a uno (o limpiando) el registro OCR1x cuando se iguala la comparación entre OCR1x y TCNT1 cuando el contador se incrementa, y se limpia (o se pone a uno) el registro OC1x cuando se iguala la comparación entre OCR1x y TCNT1 cuando el contador se decrementa. La frecuencia PWM para la salida cuando se usa PWM de fase correcta 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 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
Documento traducido de la hoja de datos del ATmega32
19
__________________________________________________________________________ITSP valor TOP (WGM13:0 = 11) y COM1A1:0 =1, la salida OCR1A será invertida con una razón de ciclo al 50%. Modo PWM de Fase y Frecuencia Correcta La Modulación por Amplitud de Pulso de Fase y Frecuencia Correcta, (WGM13:0 = 8 o 9) provee una alta resolución en la generación de forma de onda PWM de fase y frecuencia correcta. El modo PWM de fase y frecuencia correcta es parecido al modo PWM de fase correcta basado en la operación de doble pendiente. El contador cuenta repetidamente desde BOTTOM (0x0000) hasta TOP y desde TOP hasta BOTTOM. En el modo de comparación de salida no invertida, la salida de comparación (OC1x) se limpia cuando se iguala la comparación entre TCNT1 y OCR1x mientras sigue su conteo ascendente, y se pone a uno cuando se iguala la comparación mientras sigue su conteo descendente. En el modo de comparación de salida invertido, esta operación se invierte. La operación de doble pendiente ofrece una frecuencia de operación máxima más baja comparada con la operación de una sola pendiente. sin embargo, debido a la característica simétrica del modo PWM de doble pendiente, estos modos se prefieren para aplicaciones de control de motores. La principal diferencia entre la fase correcta y el modo de fase y frecuencia correcta PWM es el tiempo de actualización del registro OCR1x por el registro del buffer OCR1x. 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:
En el modo PWM de fase y frecuencia correcta el contador se incrementa hasta que el valor del contador iguala ya sea al valor en ICR1 (WGM13:0 = 8) o al valor de OCR1A (WGM13:0 = 9). 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 y frecuencia 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.
Documento traducido de la hoja de datos del ATmega32
20
__________________________________________________________________________ITSP
La bandera de sobreflujo del Timer/Contador 1 (TOV1) se coloca a uno en el mismo ciclo de reloj del timer como los registros OCR1x son actualizados con el valor de doble buffer (en BOTTOM). Cuando ya sea OCR1A o ICR1 se utilizan para determinar el valor TOP, la bandera se pone a uno OC1A o ICF1 cuando TCNT1 ha alcanzado el 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 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. En el modo PWM de fase y frecuencia correcta, la unidad de comparación permite la generación de PWM en los pines OC1x. Ajustando los bits COM1x1:0 a 2 producirán un PWM no invertido y una salida PWM invertida puede generarse ajustando los bits COM1x1:0 a 3. El valor actual de OC1x solamente será visible en el pin del puerto si la dirección de datos de ese pin se ajusta como salida (DDR_OC1x). La forma de onda PWM se genera poniendo a uno (o limpiando) el registro OCR1x cuando se iguala la comparación entre OCR1x y TCNT1 cuando el contador se incrementa, y se limpia (o se pone a uno) el registro OC1x cuando se iguala la comparación entre OCR1x y Documento traducido de la hoja de datos del ATmega32
21
__________________________________________________________________________ITSP TCNT1 cuando el contador se decrementa. La frecuencia PWM para la salida cuando se usa PWM de fase y frecuencia correcta 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 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%.
Documento traducido de la hoja de datos del ATmega32
22