Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Implementación de los
temporizadores/contadores:
ATMegaClassic
7.1. Introducción
93
Capítulo 7 Implementación de los temporizadores/contadores: ATMegaClassic
7.2.1. Timer0
Este elemento es un módulo temporizador/contador de 8 bits de propósito
general con dos unidades de comparación independientes y soporte para la
modulación de ancho de pulso. Permite la ejecución de programas con precisión
(gestión por eventos) y generación de pulsos.
Su funcionamiento está determinado por una serie de registros que controlan
todos sus parámetros: modo de operación, cuenta actual, interrupciones, etc. Entre
ellos cabe destacar:
TCNT0 : Registro de 8 bits que se utiliza para llevar la cuenta del Timer0.
El valor mínimo desde donde comienza es 0x00 y el máximo donde se resetea
es 0xFF.
OCR0A y OCR0B: Son dos registros de 8 bits cuyo contenido se compara
continuamente con el valor del contador (TCNT0 ). Una coincidencia entre
TCNT0 y OC0A o OC0B se puede usar para provocar una interrupción y
generar asimismo una forma de onda en el pin de salida correspondiente (OC0A
o OC0B).
TIMSK0 : Registro de máscara de interrupción. Gracias a él se pueden
activar/desactivar las interrupciones asociadas al Timer0. Son tres las posibles
interrupciones que se pueden generar y que están asociadas al Timer0:
TOIE0 (Interrupción de desbordamiento de cuenta del Timer0), OCIE0A
(Interrupción de unidad de comparación A) y OCIE0B (Interrupción de unidad
de comparación B).
TIFR0 : Registro de banderas de interrupción. Cualquier interrupción que se
produzca relacionada con el temporizador se refleja en él. Las tres posibles
banderas son: TOV0 (Bandera de desbordamiento de cuenta del Timer0),
OCF0A (Bandera de unidad de comparación A) y OCF0B (Bandera de unidad
de comparación B).
TCCR0A y TCCR0B: Registro de control del Timer0. Controla diferentes
parámetros de configuración tales como el modo de operación, el valor máximo
de cuenta y la forma de onda generada en el pin de salida OC0A.
El Timer0 está formado por una serie de bloques funcionales básicos que lo
dotan de distintas capacidades. Dos de ellos son los más relevantes y se pasa a
describirlos brevemente a continuación:
94
7.2 Descripción de los temporizadores/contadores del ATMega1281
o reinicia con cada pulso de la señal de reloj que lo controla. Esta señal
de reloj puede ser externa o interna y se elige a través de tres bits (CS2:0 )
del registro TCCR0B (registro de control B del Timer0). Si no se selecciona
ninguna fuente de reloj, el temporizador se desactiva. La secuencia de conteo se
determina mediante los bits WGM00, WGM01 y WGM02 que se encuentran
en los registros TCCR0A y TCCR0B, bits que seleccionan entre los distintos
modos de operación del contador. Las formas de onda generadas se presentan
en los pines OC0A y OC0B. Cuando el temporizador se desborda, se genera la
interrupción TOV0. Su configuración varía con el modo de operación escogido
y puede ser utilizada como interrupción de la CPU.
95
Capítulo 7 Implementación de los temporizadores/contadores: ATMegaClassic
fclkI/O
fOC0A = 2·N ·(1+OCR10A)
con N = 1, 8, 64, 256, 1024
Modo PWM1 Es una potente técnica usada para manejar circuitos analógicos
con las salidas digitales de un microcontrolador. Se presentan dos variantes:
fclkI/O
fOC0AP CP W M = N ·510
con N = 1, 8, 64, 256, 1024
1
Pulse Width Modulation (PWM): Modulación del ancho del pulso
96
7.2 Descripción de los temporizadores/contadores del ATMega1281
7.2.2. Timer2
Los registros asociados al Timer2 son análogos al del Timer0 con el cambio de
nomenclatura en el que el "0" (indicando Timer0), se reemplaza por el "2" (indica
Timer2):
Los modos de operación son los mismos que para el Timer0, con la inclusión del
citado nuevo modo Asíncrono.
97
Chapter 7 Implementación de los temporizadores/contadores: ATMegaClassic
OCR1A, OCR1B y OCR1C : Registros usados por cada una de las tres
unidades de comparación. Sus valores se comparan continuamente con la
cuenta del temporizador/contador. Si se produce coincidencia, se genera la
interrupción correspondiente y se actualiza el valor del pin de salida de dichas
unidades.
2
Hoja de características del ATMega1281, pag. 176
98
7.3 Modificaciones sobre ATMegaClassic.java
99
Capítulo 7 Implementación de los temporizadores/contadores: ATMegaClassic
100
7.4 Implementación de los temporizadores/contadores
Una vez definida la estructura interna, se deben especificar los posibles modos
de funcionamiento en los que es posible trabajar. Como se introdujo en la sección 7.2,
son cuatro estos posibles modos: Normal, Modo comparación, PWM rápido y PWM
de fase correcta. Todos ellos se encuentran ya desarrollados en «ATMegaTimer».
Para finalizar, la clase presenta una serie de métodos útiles para ciertas
operaciones usuales, por ejemplo, obtener la cuenta actual del contador, el máximo
de la cuenta, resetear el modo de funcionamiento, etc.
101
Chapter 7 Implementación de los temporizadores/contadores: ATMegaClassic
donde:
n: Identificador numérico.
m: Objeto de tipo «AtmelMicrocontroller» representando a la MCU.
periods: Factor de preescalado de la frecuencia principal de funcionamiento
(frecuencia del sistema).
ovfName: Interrupción asociada al desbordamiento del contador.
acfName1: Interrupción asociada a la unidad de comparación 1.
acfName2: Interrupción asociada a la unidad de comparación 2.
Aquí aparece la primera diferencia con el caso anterior. Como existen dos
unidades de comparación, al constructor se le debe proporcionar el nombre de
la interrupción asociada a cada una de ellas para que lo asigne a la unidad
correspondiente.
Las siguientes líneas de código se centran en crear las propias unidades y todo
los elementos asociados. En primer lugar se define el pin de salida de cada unidad:
102
7.4 Implementación de los temporizadores/contadores
Una vez hecho esto, ya es posible crear ambas unidades. Para ello, es necesario
indicarle varios parámetros: temporizador/contador del que formará parte, un objeto
de tipo microcontrolador que incluirá a éste, el nombre de la unidad y el pin de salida
y su interrupción asociada:
103
Capítulo 7 Implementación de los temporizadores/contadores: ATMegaClassic
104
7.4 Implementación de los temporizadores/contadores
105
Capítulo 7 Implementación de los temporizadores/contadores: ATMegaClassic
7.4.4. Timer0
El Timer0 es uno de los dos contadores de 8 bits que incluye el ATMega1281.
Su implementación consiste en la creación de la clase «NewTimer0», que hereda
directamente de «NewTimer8Bit». Como ya se ha dicho, esta última define la
estructura base sobre la que se construyen los dispositivos temporizadores de 8
bits del microcontrolador. Sólo es necesario añadir convenientemente los detalles
particulares de cada uno de estos elementos para completar su codificación. Como
se expuso en la subsección 1.4.2, el nuevo temporizador Timer0 difiere del ya
incluido en este fichero en que no soporta el modo asíncrono como su predecesor
en el ATMega128. Por lo tanto, toda esta parte del código, en este caso, no es
necesaria. La clase desarrollada «NewTimer0» es muy simple. Su constructor
llama al constructor de la clase padre con una serie de parámetros:
106
7.4 Implementación de los temporizadores/contadores
7.4.5. Timer2
Éste es el otro módulo temporizador/contador de 8 bits del ATMega1281. Es
exactamente igual al anterior con la excepción de que incluye el modo asíncrono.
La clase que implementa este dispositivo se llama «NewTimer2» y hereda de
«NewTimer8Bit». Su constructor llama al de la clase padre «NewTimer8Bit»
de la siguiente manera:
con
107
Capítulo 7 Implementación de los temporizadores/contadores: ATMegaClassic
7.4.6. Timer1
Es uno de los dos temporizadores/contadores de 16 bits del ATMega1281.
La clase creada para representarlo es «Timer1» y hereda directamente de
«Timer16Bit». En su constructor se realiza la llamada al constructor de la clase
padre siguiente:
7.4.7. Timer3
Es el dispositivo temporizador/contador de 16 bits restante. Se representa por
la clase «Timer3», que, al igual que antes, hereda de «Timer16Bit». Es idéntico
al Timer1. La llamada al constructor de «Timer16Bit» es:
donde
108