Está en la página 1de 13

__________________________________________________________________________ITSP

Timer 0 del AVR

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.

En la figura 1 se muestra el diagrama a bloques del Timer/Contador 0 de 8 bits.

Los registros del Timer/Contador 0 (TCNT0) y el de Comparación de Salida (OCR0) son


de 8 bits. Las señales de petición de Interrupción (Interrupt Request) son visibles en el
Registro de Banderas de la Interrupción del Timer (TIFR).

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).

El Registro de Comparación de Salida (OCR0) es doble buffer y su valor se compara


con el Timer/Contador 0 en todo momento. El resultado de la comparación puede ser
usado por el generador de la forma de onda de PWM o una frecuencia variable a la
salida del Pin de Comparación de Salida (OC0). Cuando ocurra la igualdad de valores
la bandera de Comparación se activa (OCF0) la cual se usa para generar una solicitud
de interrupción de comparación de salida.

Documento traducido de la hoja de datos del ATmega32 1


__________________________________________________________________________ITSP

Definiciones

Un valor de “n” deberá sustituirse por el número del Timer/Contador que se este
utilizando, en este caso es el “0”.

BOTTOM el contador alcanza el nivel más bajo cuando llega a 0x00.


MAX el contador alcanza el valor más alto cuando llega a ser 0xFF (255 en decimal).
TOP el contador alcanza el valor tope cuando se iguala al valor más alto de la
secuencia de conteo. El valor tope puede ser asignado por un valor fijo máximo de 0xFF
o el valor almacenado en el registro OCR0.

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).

La parte principal del Timer/Contador de 8 bits es la unidad programable bidireccional


de conteo, que se muestra en la figura 2.

Dependiendo del modo de operación utilizado, el contador es limpiado, se incrementa o


decrementa por cada ciclo de reloj del timer (clkT0). clkT0 puede ser generado de una
fuente de reloj externo o interno, seleccionando los bits de selección de reloj (CS02:0).
Cuando ninguna fuente de reloj se selecciona (CS02:0=0) el timer se detiene. Sin
embargo, el valor de TCNT0 puede ser accesado por el CPU, sin considerar si el clkT0
esta presente o no. Una escritura del CPU sobrescribe (tiene prioridad sobre) todas las
operaciones de conteo o limpieza.

La secuencia de conteo se determina por el establecimiento de los bits WGM01 y


WGM00 localizados en el Registro de Control del Timer/Contador 0 (TCCR0). Existe
una relación entre como es el conteo de un contador y en la forma de onda que genera
la unida de salida de comparación (OC0).

La bandera de sobreflujo del Timer/Contador (TOV0) es puesta de acuerdo al modo de


operación seleccionado por los bits WGM01:0. TOV0 puede ser usada para generar las
interrupciones dentro del CPU.

Documento traducido de la hoja de datos del ATmega32 2


__________________________________________________________________________ITSP

6.2 UNIDAD DE COMPARACIÓN DE SALIDA

El comparador de 8 bits continuamente compara el registro TCNT0 con el Registro de


Comparación de Salida (OCR0). Cuando TCTN0 iguala a OCR0, las señales del
comparador se igualan. Una igualdad pondrá un uno en la bandera de Comparación de
Salida (OCF0) en el próximo ciclo de reloj del timer, si es habilitada OCIE0 = 1 y la
Bandera de Interrupciones Globales SREG = 1, la Bandera de Salida de Comparación
generara una interrupción de comparación a la salida. La bandera OCF0 es
automáticamente limpiada cuando la interrupción se ejecuta. Alternativamente, la
bandera OCF0 puede ser limpiada por software escribiendo un “uno” lógico en su bit
específico de I/O. El generador de forma de onda usará la señal igualada para generar
una salida acorde al modo de operación colocado por los bits WGM01:0 y los bits del
Modo de Comparación de Salida COM01:0. Las señales de max y bottom son usadas
por el generador de forma de onda para el manejo especial en los valores extremos en
algunos modos de operación. La figura 3 muestra la Unidad de Comparación de Salida.

El registro OCR0 es de doble buffer cuando se usa cualquier modo de Modulación de


Ancho de Pulso (PWM). Para los modos de operación normal y Limpieza del Timer por
Comparación (CTC), el doble buffer se deshabilita. El doble buffer se sincroniza para
actualizar el registro de comparación OCR0 ya sea a la secuencia de conteo TOP o
BOTTOM. La sincronización previene la ocurrencia de longitudes impares, pulsos no
simétricos PWM, salidas libre de fallas.

Documento traducido de la hoja de datos del ATmega32 3


__________________________________________________________________________ITSP

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.

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 a escribir un uno en el bit de Comparación de Salida
Forzada (FOC0). Forzando la comparación igualada no se pondrá en uno la bandera
OCF0 o recarga/limpia el timer, pero el pin OC0 será actualizado como si una igualdad
real en la comparación haya ocurrido (los bits COM01:0 definen si el pin OC0 es puesto
a uno, limpiado o invertido “toggled”)

Bloqueo de la Comparación de Igualdad al escribir en TCNT0.

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.

Usando la Unidad de Comparación de Salida.

Ya que al escribir en TCNT0 en cualquier modo de operación bloqueara todas las


comparaciones de igualdad por un solo ciclo de reloj del timer, existen riesgos
involucrados cuando se cambia TCNT0 al usar la unidad de comparación de salida,
independientemente si el Timer/Contador esta corriendo o no. Si el valor escrito en
TCNT0 iguala al valor de OCR0, la comparación de igualdad se perderá, resultando una
generación de forma de onda perdida. De manera similar, no escriba un valor en
TCNT0 igual a BOTTOM cuando el contador este en decremento.

El ajuste de OC0 deberá ser realizado antes de establecer el Registro de Dirección de


Datos para el pin del puerto de salida. La manera más fácil de establecer el valor de
OC0 es usar los bits de Comparación de Salida Forzada (FOC0) en modo Normal. El
registro OC0 mantiene su valor aún cuando cambie entre los modos de generación de
forma de onda.

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.

Unidad de Comparación de Igualdad de Salida

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.

Documento traducido de la hoja de datos del ATmega32 4


__________________________________________________________________________ITSP

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.

Modo de Comparación de Salida y Generación de Forma de Onda.

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.

Un cambio en el estado de los bits COM01:0 tendrán efectos en la primera comparación


de igualdad después de que los bits de escriben.

6.3 MODOS DE OPERACIÓN

El modo de operación, por ejemplo, la conducta del Timer/Contador y los pines de


Comparación de Salida son definidos por la combinación de los bits en el modo de
Generación de Forma de Onda (WGM01:0) y los bits del modo de Comparación de
Salida (COM01:0). Los bits del modo de Comparación de Salida no afectan la

Documento traducido de la hoja de datos del ATmega32 5


__________________________________________________________________________ITSP

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.

La unidad de comparación de salida puede ser usada para generar interrupciones en


algún momento dado. Usando la comparación de salida para generar formas de onda
en el modo normal no es recomendado, ya que esto ocupara demasiado tiempo para el
CPU.

Modo de Comparación de Limpieza del Timer (CTC)

En el modo de comparación limpieza del timer (WGM01:0=2), el registro OCR0 se


utiliza para manipular la resolución del contador. En el modo CTC el contador se limpia
a cero cuando el valor del contador (TCNT0) iguala a OCR0. El OCR0 define el valor
tope para el contador, aunque también su resolución. Este modo permite mayor control
de la frecuencia de salida de comparación igualada. También simplifica la operación de
conteo de eventos externos.

El diagrama de tiempos para el modo CTC se muestra en la figura 5. El valor del


contador (TCNT0) se incrementa hasta que una igualdad en la comparación entre
TCNT0 y OCR0, y entonces el contador TCNT0 se limpia.

Documento traducido de la hoja de datos del ATmega32 6


__________________________________________________________________________ITSP

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 variable N representa el factor pre-escalar (1, 8, 64, 256 o 1024).


En el modo normal de operación, la bandera TOV0 se coloca a uno en el mismo ciclo
de reloj cuando contador pasa de MAX a 0x00.

Modo Rápido PWM

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.

Documento traducido de la hoja de datos del ATmega32 7


__________________________________________________________________________ITSP

La bandera de sobreflujo Timer/Contador (TOV0) se coloca a uno cada vez que el


contador alcanza MAX. Si la interrupción esta habilitada, la rutina que maneja la
interrupción puede ser usada para actualizar el valor a comparar.

En el modo PWM rápido, la unidad de comparación permite la generación de formas de


onda de PWM en el pin OC0. Ajustando los bits COM01:0=2 producirá un PWM no
invertido y un PWM invertido se logra ajustando los bits CMO01:0=3 se genera un PWM
invertido. El valor de OC0 actual será solamente visible en el pin del puerto si la
dirección de los datos para el pin de puerto se coloca como salida. La forma de onda de
PWM se genera poniendo a uno (o a cero) el registro OC0 en la comparación de
igualdad entre OCR0 y TCNT0, y poniendo a cero (o a uno) el registro OC0 en el ciclo
del timer de reloj del contador es limpiado (cambiando de MAX a BOTTOM).

La frecuencia PWM para la salida puede ser calculada por la siguiente ecuación:

La variable N representa el factor preescalar (1, 8, 64, 256 o 1024).

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

Documento traducido de la hoja de datos del ATmega32 8


__________________________________________________________________________ITSP

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.

Modo PWM de Fase Correcta

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.

Documento traducido de la hoja de datos del ATmega32 9


__________________________________________________________________________ITSP

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.

En el modo de fase correcta PWM, la unidad de comparación permite la generación de


formas de onda PWM en el pin OC0. Ajustando los bits COM01:0=2 producirá una
salida PWM no invertida. Una salida PWM invertida se genera colocando los bits
COM01:0=3. El valor actual OC0 solamente será visible en el pin del puerto si la
dirección de datos para el pin es puesto como salida. La forma de onda PWM es
generada limpiando (o poniendo a 1) el registro OC0 en la comparación igualada entre
OCR0 y TCNT0 cuando el contador se incrementa, y poniendo a uno (o limpiando) el
registro OC0 en la comparación igualada entre OCR0 y TCNT0 cuando el contador se
decrementa. La frecuencia del PWM para la salida cuando se usa el modo de fase
correcta PWM puede ser calculado por la siguiente ecuación:

La variable N representa el factor pre-escalar (1, 8, 64, 256 o 1024).

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.

6.4 PREESCALADOR DEL TIMER/CONTADOR0


El timer/contador 0 y el timer/contador 1 comparten el mismo módulo de preescalación,
pero estos posee diferentes ajustes de preescalación.

Fuente de reloj interno.

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.

Reinicio del Preescalador

El preescalador corre libremente, por ejemplo, opera independientemente de la


selección lógica del reloj del timer/contador, y es compartida por el timer/contador 0 y el
timer/contador 1. Ya que el preescalador no se ve afectado por la selección del reloj del
timer/contador, el estado del preescalador tendrá implicaciones en situaciones donde un
reloj preescalado sea usado. Un ejemplo de preescalamiento ocurre cuando el time esta
habilitado y sincronizado por el preescalador (6 > CSn2:0 > 1). El número d los ciclos de
reloj del sistema desde cuando el timer es habilitado en la primera cuenta ocurre puede

Documento traducido de la hoja de datos del ATmega32 10


__________________________________________________________________________ITSP

ser de 1 a N+1 ciclos de reloj del sistema, donde N iguala al divisor del pre-escalador
(8, 64, 256 o 1024).

Es posible usar un reset preescalador para sincronizar el timer/contador a la ejecución


del programa. Sin embargo, tenga cuidado si otro timer/contador que comparta el
mismo preescalador también use el preescalamiento. Un reset en el preescalador
afectara el periodo de preescalamiento para todos los timer/contadores que estén
conectados a el.

Fuente de reloj externo.

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.

El detector de pendiente genera un pulso clkT1/clkT0 por cada pendiente positiva


(CSn2:0=7) o pendiente negativa (CSn2:0=6) detectada.

La fuente de reloj externa deberá estar a una razón de ciclo de 50/50%. Ya que el
detector de flancos utiliza muestreo.

Una fuente de reloj externa no puede ser preescalada. La figura 9 muestra el


preescalador del timer/contador 0 y timer/contador 1.

Documento traducido de la hoja de datos del ATmega32 11


__________________________________________________________________________ITSP

6.5 CONFIGURACIÓN DEL TIMER 0

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.

Note: El compilador de C maneja esto automáticamente, mientras que en lenguaje


ensamblador esto se tiene que realizar con las instrucciones push y pop.

Timer 0 de 8 bits.

El timer0 de 8 bits es un timer síncrono. Esto significa que es sincronizado por el


sistema de reloj, el sistema de reloj preescalador o el reloj externo el cual esta
sincronizado con el sistema de reloj. Se utilizan pocos ajustes para hacerlo funcionar.

Documento traducido de la hoja de datos del ATmega32 12


__________________________________________________________________________ITSP

Ejemplo de Interrupción de Sobreflujo del Timer0.

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:

Un sistema que consiste de un timer de 8 bits (MaxVal = 256) y un sistema de reloj de 8


MHz el cual se divide por un preescalador de PVal = 1024, causaran que los LEDs
parpadeen a una frecuencia (fLED) de aproximadamente de 15.25 Hz. La siguiente rutina
de inicialización muestra como configurar tal sistema:
init_Ex1:
ldi r16,(1<<CS02)|(1<<CS00)
out TCCR0,r16 ; Reloj del Timer = sistema de reloj / 1024
ldi r16,1<<TOV0
out TIFR,r16 ; Limpia las interrupciones pendientes TOV0
ldi r16,1<<TOIE0
out TIMSK,r16 ; Habilita el Sobreflujo de Interrupción del
Timer/Counter0
ser r16
out DDRB,r16 ; Coloca al Puerto B como salida
ret

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
}

En el próximo paso, el servicio de interrupción de rutina ha sido implementado. Esta


rutina será ejecutada cada vez que en el timer exista un sobreflujo. Su propósito en este
ejemplo es invertir los bits del Puerto B (LEDs).
ISR_TOV0:
push r16
in r16,SREG
push r16
in r16,PORTB ; Lee el Puerto B
com r16 ; Invierte bits del registro r16
out PORTB,r16 ; Se escribe en el Puerto B
pop r16
out SREG,r16
pop r16
reti

El C correspondiente:
void interrupt[TIMER0_OVF0_vect]ISR_TOV0 (void)
{
PORTB = ~PORTB; // Invierte bits del registro r16
}

Documento traducido de la hoja de datos del ATmega32 13

También podría gustarte