Documentos de Académico
Documentos de Profesional
Documentos de Cultura
6.1 INTRODUCCIÓN
En la siguiente sección veremos como configurar y utilizar los registros del
Timer/Contador 0, así como sus modos de operación.
El reloj del Timer/Contador 0 (clkT0) es interno vía el pre-escalador o con reloj externo a
través del pin T0. El bloque lógico de Selección de Reloj selecciona la fuente del reloj y
la pendiente que el Timer/Contador 0 usa para incrementarse (o decrementarse). El
Timer/Contador 0 esta inactivo cuando no esta seleccionada ninguna fuente de reloj. Se
refiere a la salida del reloj seleccionada como reloj del timer (clkT0).
Definiciones
Un valor de “n” deberá sustituirse por el número del Timer/Contador que se este
utilizando, en este caso es el “0”.
La fuente del reloj se selecciona a través de los bits de selección de reloj (CS02:0) que
están localizados en el Registro de Control del Timer/Contador (TCCR0).
El acceso al registro OCR0 puede ser complejo, pero este no es el caso. Cuando el
doble buffer es habilitado, el CPU tiene acceso al registro buffer OCR0, y si el de doble
buffer esta deshabilitado el CPU accesará al OCR0 directamente.
Todas las operaciones del CPU de escribir en el Registro TCNT0 bloquearan cualquier
comparación de igualdad que ocurra en el próximo ciclo de reloj del timer, aún cuando
el timer este detenido. Esta característica permite a OCR0 sea inicializado al mismo
valor que TCNT0 sin disparar ninguna interrupción cuando el reloj del Timer/Contador
este habilitado.
Este consciente que los bits COM01:0 no son de doble buffer ni el del valor de
comparación. Cambiando los bits COM01:0 tendrá efectos inmediatamente.
Los bits del modo de Comparación de Salida (COM01:0) tienen dos funciones. El
generador de forma de onda usa los bits COM01:0 para definir el estado en
Comparación de Salida (OC0) en la próxima comparación igualada. También, los bits
COM01:0 controlan la fuente del pin de salida OC0. Al referirse al estado de OC0, nos
referimos al Registro interno OC0, no al pin OC0. Al ocurrir un reset del sistema, el
registro OC0 se pone en “0”. La figura 4 muestra la Unidad de Comparación de Igualdad
de Salida.
La función del puerto general de I/O se sobrescribe por el comparador de salida (OC0)
del generador de forma de onda si los bits COM01:0 están en uno. Sin embargo, la
dirección del pin OC0 (entrada o salida) aún es 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 OC0 (DDR_OC0) debe ser puesto a uno como salida antes de que el valor de OC0
sea visible en el pin. La función del puerto de sobre-escritura es independiente del
modo de Generación de forma de onda.
El diseño de la salida del pin comparación permite la inicialización del estado OC0 antes
que la salida esté habilitada. Note que algunas configuraciones de COM01:0 están
reservadas para ciertos modos de operación.
El Generador de Forma de Onda usa los bits COM01:0 de manera diferente que en los
modos normal, CTC y PWM. Para todos los modos, colocar COM01:0 = 0 le dice al
generador de forma de onda que no realice en el Registro OC0 ninguna acción para la
próxima comparación de igualdad.
secuencia de conteo, mientras que los bits del modo de Generación de la Forma de
Onda si. Los bits COM01:0 controlan si la salida generada PWM deberá ser invertida o
no (invertida o no invertida PWM). Para el modo de PWM no invertida los bits COM01:0
controlan si la salida deberá ser puesta a uno, limpiada o invertida en una comparación
igualada.
Modo Normal
El modo más simple es el modo normal (WGM01:0 = 0). En este modo la dirección del
conteo es siempre ascendente y no se limpia el contador. El contador simplemente se
sobrescribe cuando pasa de su máximo valor de 8 bits (TOP = 0xFF) y entonces se
reinicia desde su valor más bajo (0x00). En operación normal la Bandera de Sobreflujo
del Timer/Contador 0 (TOV0) será puesta a uno en el mismo ciclo de reloj del timer
como el TCNT0 llega a ser cero. La bandera TOV0 en este caso se comporta como el
noveno bit, excepto si esta puesto en uno, y no es limpiado. Sin embargo, combinado
con la interrupción de sobreflujo del timer que automáticamente limpia la bandera
TOV0, la resolución del timer puede ser incrementada por software. No existen casos
especiales que considerar en el modo normal, un nuevo valor en el contador puede ser
escrito en cualquier instante.
Una interrupción puede generarse cada vez que el valor del contador alcanza el valor
TOP usando la bandera OCF0. Si la interrupción esta habilitada, la rutina de manejo de
la interrupción puede ser usada para actualizar el valor TOP. Sin embargo, cambiando
TOP a un valor cercano a BOTTOM cuando el contador esta corriendo sin ningún valor
bajo de preescalador, debe realizarse con cuidado ya que en el modo CTC no se tiene
la característica de doble buffer. Si el valor nuevo escrito a OCR0 es tan más pequeño
que el valor actual de TCNT0, el contador perderá la igualdad de comparación. El
contador entonces contara a su máximo valor (0xFF) y volverá a contar desde 0x00
antes de que la igualdad de comparación ocurra.
Para generar una forma de onda de salida en el modo CTC, la salida OC0 puede ser
invertida “toogle” de su nivel lógico cada vez que exista una igualdad de comparación,
simplemente ajustando los bits de modo de comparación de salida a un modo “toggle”
(COM01:0=1). El valor de OC0 no será visible en el pin del puerto a menos que la
dirección de datos para el pin sea colocado como salida. La forma de onda generada
tendrá una frecuencia máxima de fOC0=fclk_I/O/2 cuando OCR0 sea puesto en cero
(0x00). La frecuencia de la forma de onda se define por la siguiente ecuación:
La modulación rápida PWM o el modo rápido PWM (WGM01:0=3) provee una alta
generación en frecuencia de forma de onda PWM. El PWM rápido difiere de la opción
anterior de PWM por su operación de una sola pendiente. El contador se incrementa de
BOTTOM a MAX, entonces se reinicia desde BOTOM. En el modo no invertido de
comparación de salida, el bit de comparación de salida (OC0) se limpia cuando se
iguala la comparación entre TCNT0 y OCR0, y se ajusta a BOTTOM. En el modo
invertido de comparación de salida, la salida es puesta a uno cuando se iguala la
comparación y se limpia a BOTTOM. Debido a la operación de una sola pendiente, la
frecuencia de operación del modo PWM rápido puede ser doblada tan alta como el
modo de fase correcto de PWM que usa la operación dual de pendientes. Esta
frecuencia alta hace que el modo rápido PWM se ajuste en aplicaciones de regulación
de potencia, rectificación y DAC.
En el modo rápido PWM, el contador se incrementa hasta el valor del contador iguala el
valor MAX. El contador es entonces limpiado en el siguiente ciclo de reloj. El diagrama
de tiempo para el modo PWM rápido se muestra en la figura 6. El valor de TCNT0 esta
en el diagrama de tiempo mostrado como un histograma para ilustrar la operación de
una sola pendiente. El diagrama incluye salidas de PWM no invertida e invertida. La
línea pequeña horizontal marca en donde la pendiente llega a TCNT0 y se iguala a
OCR0.
La frecuencia PWM para la salida puede ser calculada por la siguiente ecuación:
Los valores extremos para el registro OCR0 representan casos especiales cuando se
genera una forma de onda PWM de salida en el modo rápido PWM. Si el OCR0 es igual
BOTTOM, la salida será un pequeño salto por cada ciclo de reloj MAX+1. Ajustando de
OCR0 igual a MAX resultara en una salida constante alta o baja (dependiendo de la
polaridad del ajuste de salida por los bits COM01:0).
Una forma de onda con frecuencia de salida de un 50% a razón de ciclo en el modo
rápido PWM puede ser alcanzado ajustando OC0 a su nivel lógico invertido en cada
igualdad de comparación (COM01:0=1). La forma de onda generada tendrá una
frecuencia máxima de fOC0 = fclk_I/O/2 cuando OCR0 este en cero. Esta característica es
similar al modo CTC de OC0 invertido, excepto por la característica del doble buffer en
la unidad de comparación de salida este habilitada en el modo rápido PWM.
El modo de fase correcta PWM (WGM01:0=1) provee una alta resolución de fase
correcta de forma de onda en la generación de PWM. El modo de fase correcta de
PWM se basa en la operación de doble pendiente. El contador se incrementa
repetidamente desde BOTTOM a MAX y se decrementa desde MAX a BOTTOM. En el
modo de comparación de salida no invertido, la comparación de salida (OC0) se limpia
cuando se igualan los registros entre TCNT0 y OCR0 mientras se cuenta
ascendentemente y se pone a uno en la comparación igualada mientras se cuenta
descendentemente. En el modo de comparación de salida invertida, la operación se
invierte. La operación de pendiente doble tiene una frecuencia de operación máxima
más baja que la operación de una sola pendiente. Sin embargo, debido a la
característica simétrica de los modos de doble pendiente PWM, estos modos se
prefieren para aplicaciones de control de motores.
La resolución PWM para el modo de fase correcta PWM es fija a 8 bits. En el modo de
fase correcta PWM el contador se incrementa hasta que el valor del contador iguala a
MAX. Cuando el contador alcanza el MAX, cambia la dirección de la cuenta. El valor de
TCNT0 será igual a MAX en un ciclo de reloj del timer. El diagrama de tiempos para el
modo de fase correcta PWM se muestra en la figura 7. El valor de TCNT0 se muestra
como un histograma para ilustrar la operación de doble pendiente. El diagrama incluye
salidas de PWM invertidas y no invertidas. La línea horizontal en la pendiente TCNT0
representa la comparación igualada entre OCR0 y TCNT0.
La bandera de sobreflujo del Timer/Contador 0 (TOV0) se pone a uno cada vez que el
contador alcanza el BOTTOM. La bandera de interrupción se usa para generar una
interrupción cada vez el contador alcanza el valor de BOTTOM.
Los valores extremos para el registro OCR0 representan casos especiales cuando se
genera una forma de onda de salida PWM en el modo de fase correcta PWM. El
registro OCR0 es puesto igual a BOTTOM, la salida será continuamente en bajo y
cuando se pone igual a MAX la salida será continuamente alta para el modo PWM no
invertido. Para el PWM invertido la salida tendrá valores lógicos opuestos.
El timer/contador puede ser sincronizado directamente del reloj del sistema (colocando
a CSn2:0=1). Eso provee la operación más rápida, con una frecuencia de reloj máxima
del timer/contador igual a la frecuencia de reloj del sistema (fCLK_I/O). Alternativamente,
uno de los cuatro pasos del preescalador puede usarse como fuente de reloj. El reloj
preescalado tiene una frecuencia de fCLK_I/O/8, fCLK_I/O/64, fCLK_I/O/256, fCLK_I/O/1024.
ser de 1 a N+1 ciclos de reloj del sistema, donde N iguala al divisor del pre-escalador
(8, 64, 256 o 1024).
Una fuente de reloj externo aplicada al pin T1/T0 puede ser usado como reloj del
timer/contador (clkT1/clkT0). El pin T1/T0 es muestreado una vez por cada ciclo de reloj
del sistema por el pin lógico de sincronización. La señal sincronizada (muestreada)
entonces se pasa a través del detector de flancos. La figura 8 muestra un diagrama a
bloques equivalente a la sincronización de T1/T0 y un detector de flanco lógico. Los
registros están sincronizados al flanco positivo del sistema de reloj interno (clkI/O). El
match es transparente al periodo alto del reloj interno del sistema.
La fuente de reloj externa deberá estar a una razón de ciclo de 50/50%. Ya que el
detector de flancos utiliza muestreo.
Existen dos cosas que se toman en cuenta cuando se configura el timer. El timer tiene
que ser inicializado seleccionando la fuente de reloj, y las interrupciones deberán estar
habilitadas.
Registros compartidos
Si los mismos registros se usan tanto en el Servicio de Interrupción de Rutina (ISR)
como en el código principal, estos registros tienen que ser salvados al inicio de la ISR y
restablecerlos al final de la ISR. Si no todos los 32 registros no son necesarios en la
aplicación, las operaciones de salvado y restablecimiento pueden ser evitadas usando
registros diferentes en el código principal y en el ISR.
También es importante recordar que hay que almacenar el Registro de Estado (SREG),
y este registro no se salva automáticamente.
Timer 0 de 8 bits.
Con cada interrupción los pines del Puerto B serán invertidos. Los LEDs parpadearan a
una frecuencia (fLED) que se determina por la siguiente fórmula:
El C correspondiente:
void init_Ex1(void)
{
TCCR0 = (1<<CS02)|(1<<CS00); // del Timer = sistema de reloj / 1024
TIFR = 1<<TOV0; // Limpia las interrupciones pendientes TOV0
TIMSK = 1<<TOIE0; // Habilita el Sobreflujo de Interrupción del
Timer/Counter0
DDRB = 0xFF; // Coloca al Puerto B como salida
}
El C correspondiente:
void interrupt[TIMER0_OVF0_vect]ISR_TOV0 (void)
{
PORTB = ~PORTB; // Invierte bits del registro r16
}