Sei sulla pagina 1di 134

Dedicatoria y agradecimientos.

Dedicado:

A nuestras familias
consanguínea y por
afinidad, a nuestras novias
y a todos nuestros amigos
por su presencia constante y
su apoyo incondicional.

Agradecimientos:

A todas las personas que de una


forma u otra hicieron que fuera
posible la realización de este trabajo.

i
Hoja de firmas.

Hoja de firmas.
Este trabajo de diploma ha sido revisado y aprobado por las instancias correspondientes y para
que así conste se firma la presente.

Tutor:
Nombre: _______________________________________________
Firma: _________________________________________________
Fecha: _________________________________________________
Organismo: _____________________________________________

Oponente:
Nombre: _______________________________________________
Firma: _________________________________________________
Fecha: _________________________________________________
Organismo: _____________________________________________

J Dpto.:
Nombre: _______________________________________________
Firma: _________________________________________________
Fecha: _________________________________________________
Organismo:_____________________________________________

ii
Declaración jurada.

Declaració n jurada.
Nosotros, Rafael Arango Rodríguez y Adrian Santana Oliveros, declaramos que somos los
únicos autores de este trabajo de diploma y autorizamos al Instituto Superior Politécnico José
Antonio Echeverría para que haga de este el uso que estime pertinente.

Firma: _______________________ Firma: _______________________

iii
Resumen.

Resumen.
En el trabajo se confecciona una documentación detallada acerca del microcontrolador
ATmega32 y sus herramientas de desarrollo. Se analiza el funcionamiento y configuración de
los principales recursos del ATmega32 como son las interrupciones externas, los
temporizadores, el comparador analógico y el conversor análogo/digital. Se destaca el uso de
los programas AVR Studio y Proteus como herramientas para simular el funcionamiento de
códigos de programa. Como resultado principal se presentan un conjunto de ejemplos
introductorios al estudio de la familia AVR así como otros de mayor complejidad que dan
solución al circuito de control de convertidores de potencia. Se utilizó el módulo de desarrollo
EI_STEP que cuenta con un ATmega32, con cargador de arranque incorporado, para
implementar físicamente algunos de los ejemplos desarrollados.

Abstract.
The paper presents detailed documentation regarding ATmega32 microcontroller and its
development tools. It’s analyzed the function and configuration of ATmega32 main resources
like external interrupts, timers, analog comparator and analog/digital converter. It’s highlighted
the use of Proteus and AVR Studio software as tools to simulate how program codes work. As a
main result a wide group of introductory examples of the AVR family are shown as well as others
of greater complexity which give solution to control circuits of power converters. It was used a
development kit called EI_STEP which counts with an ATmega32 microcontroller, with boot-
loader included, for physically implement some of the examples.

iv
Índice.

Indice.
DEDICATORIA: .................................................................................................................................... I

AGRADECIMIENTOS: .......................................................................................................................... I

HOJA DE FIRMAS. .............................................................................................................................. II

DECLARACIÓN JURADA. ................................................................................................................. III

RESUMEN. .......................................................................................................................................... IV

ABSTRACT. ........................................................................................................................................ IV

ÍNDICE...................................................................................................................................................V

INTRODUCCIÓN. ............................................................................................................................... IX

Problema. ...................................................................................................................................................... x

Objetivos. ...................................................................................................................................................... x

Objetivos específicos. ................................................................................................................................. x

Hipótesis. ...................................................................................................................................................... x

CAPÍTULO 1. EL MICROCONTROLADOR ATMEGA32. ............................................................... 1

1.1. Características de la familia de microcontroladores AVR ........................................................... 1

1.2. Características generales del microcontrolador ATmega32 ....................................................... 2

1.3. Arquitectura externa del microcontrolador ATmega32. ............................................................... 3

1.4. Memoria de programa ...................................................................................................................... 8

1.5. Memoria de datos SRAM ................................................................................................................. 9


1.5.1. Registros de propósito general. ...................................................................................................... 9
1.5.2. Registros E/S ...................................................................................................................................... 10
1.5.3. Modos de direccionamiento. .......................................................................................................... 11

1.6. Puertos. ........................................................................................................................................... 11

v
Índice.

1.6.1. Capacidades de tensión y corriente. ............................................................................................ 11


1.6.2. Las Resistencias de Pull-up. .......................................................................................................... 12
1.6.3. Configuración y Manejo de los Puertos....................................................................................... 13

1.7. Interrupciones. ................................................................................................................................ 15


1.7.1. Control de las Interrupciones ......................................................................................................... 17
1.7.2. Configuración de las interrupciones externas........................................................................... 18

1.8. Temporizadores/Contadores. ........................................................................................................ 20


1.8.1. Temporizador/Contador0 y Temporizador/Contador2 ............................................................. 21
1.8.1.1. Reloj ............................................................................................................................................. 22
1.8.1.2. Pre-escalador. ............................................................................................................................ 24
1.8.1.3. Modos de Operación. ............................................................................................................... 26
1.8.1.4. Interrupciones en los temporizadores ................................................................................ 30
1.8.1.5. Registros temporizador0 ........................................................................................................ 30
1.8.1.6. Registros temporizador2 ........................................................................................................ 33
1.8.2. Temporizador/Contador1. ................................................................................................................ 35
1.8.2.1. Accediendo a los registros de 16 bits. ................................................................................ 37
1.8.2.2. Unidad de captura de entrada. .............................................................................................. 38
1.8.2.3. Modos de operación Normal y CTC ..................................................................................... 39
1.8.2.4. Modo de operación PWM. ....................................................................................................... 40
1.8.2.5. Registros del temporizador1.................................................................................................. 45
1.8.3. Registros comunes de los temporizadores en el ATmega32................................................. 50

1.9. Comparador analógico .................................................................................................................. 52


1.9.1. Multiplexor de entradas del comparador análogo .................................................................... 52
1.9.2. Registros .............................................................................................................................................. 53

1.10. Conversor análogo digital. ........................................................................................................ 55


1.10.1. Operación del Módulo ADC. ........................................................................................................... 56
1.10.2. Selección del Canal de Conversión. ............................................................................................. 59
1.10.3. Las tensiones de referencia............................................................................................................ 61
1.10.4. Resultado de la Conversión. ........................................................................................................... 63
1.10.5. Reloj del ADC y Tiempo de Conversión. ..................................................................................... 64
1.10.6. Registros del ADC ............................................................................................................................. 66

CAPÍTULO 2. MÓDULO EI_STEP Y HERRAMIENTAS DE DESARROLLO. ............................ 69

2.1. Módulo EI_STEP ............................................................................................................................. 69

2.2. Instalación del controlador USB ................................................................................................... 71

2.3. Principios básicos del AVR Studio............................................................................................... 73


2.3.1. Crear un nuevo proyecto ................................................................................................................. 73
2.3.2. Código de programa ......................................................................................................................... 75
2.3.3. Compilación del programa .............................................................................................................. 75
2.3.4. Depuración del código de programa (debugging) .................................................................... 76

vi
Índice.

2.3.5. Corrida del programa ........................................................................................................................ 77


2.3.6. Visualización del funcionamiento del programa ....................................................................... 78
2.3.7. Ayuda del AVR Studio ...................................................................................................................... 81

2.4. Programación del módulo EI_STEP (con boot-loader instalado) ............................................. 82

2.5. Programando módulo EI_STEP con ISP (In System Programming) ......................................... 84

2.6. Vinculación del AVR Studio con Proteus .................................................................................... 86

CAPÍTULO 3. APLICACIONES INTRODUCTORIAS. .................................................................. 88

3.1. Ejemplo 1. Control de luces. ......................................................................................................... 88

3.2. Ejemplo 2. Secuencia definida por dos interruptores. ............................................................... 90

3.3. Ejemplo 3. Trabajo con tablas. ...................................................................................................... 92

3.4. Ejemplo 4. ON/OFF por una misma interrupción. ....................................................................... 94

3.5. Ejemplo 5. Control de un proceso industrial............................................................................... 95

3.6. Ejemplo 6. Sistema de seguridad. ................................................................................................ 97

3.7. Ejemplo 7. Control del nivel de combustible en un tanque elevado. ........................................ 99

3.8. Ejemplo 8. Protección térmica de un motor. ............................................................................. 101

3.9. Ejemplo 9. Detector de nivel de tensión. ................................................................................... 103

CAPÍTULO 4. APLICACIONES AVANZADAS. ............................................................................ 106

4.1. Ejemplo 1. Control de un motor de pasos. ................................................................................ 106

4.2. Ejemplo 2. Control de disparo por ángulo de conducción. ..................................................... 110

4.3. Ejemplo 3. Control de disparo por ángulo de conducción con entrada por teclado. ........... 113

4.4. Ejemplo 4. Control de un motor de corriente directa (CD) en los dos sentidos de giro....... 115

4.5. Ejemplo 5. Regulador de tensión monofásico de corriente alterna con control PWM. ........ 118

CONCLUSIONES.............................................................................................................................. 120

RECOMENDACIONES. ................................................................................................................... 121

vii
Índice.

REFERENCIA BIBLIOGRÁFICA. .................................................................................................. 122

BIBLIOGRAFÍA. .............................................................................................................................. 123

ANEXOS. .......................................................................................................................................... 124

viii
Introducción.

Introducció n.
Un microcontrolador es un computador completo (microprocesador + E/S + memoria +
periféricos), aunque de limitadas prestaciones. Se encuentra integrado en una sola pastilla
(chip), de reducido tamaño, que suele estar incorporado al propio dispositivo que gobierna. Este
componente electrónico, ha revolucionado, en los últimos años, las técnicas de diseño, en lo
referente a sistemas de control industrial. Se utiliza en sistemas que realizan una tarea
específica. Sus líneas de entrada/salida soportan el conexionado de los sensores y actuadores
del dispositivo a controlar. Dentro de las aplicaciones más comunes de estos dispositivos se
encuentran: hornos microondas, impresoras, juguetes, sistema de inyección de automóviles,
sistemas de comunicaciones, procesos industriales, etc.

El aprendizaje de los microcontroladores en la carrera de Ingeniería Eléctrica se ha basado en


el conocimiento y estudio de los microcontroladores de la familia MCS-51 el cual se ha visto
limitado por no disponer físicamente de los recursos necesarios. Estos dispositivos son una
herramienta importante para que el estudiante sea capaz de desarrollar tareas de control en
diferentes proyectos.

A partir de marzo del 2008, el Departamento de Ingeniería Eléctrica de la CUJAE comienza a


introducir el PBL o ABP (Aprendizaje Basado en Problemas) en el proceso de enseñanza-
aprendizaje. Después de varios años de aplicación al cuarto año de la carrera de Ingeniería
Eléctrica y con el objetivo de extender, de manera paulatina, esta estrategia al resto de los
años, se analizó la introducción de la misma en tercer año.

Para la aplicación de esta estrategia se decide utilizar un proyecto integrador que vincule las
principales asignaturas del año para solucionar un determinado problema basado en
situaciones reales y que no se conozca su solución de antemano.

Durante el transcurso de la etapa de preparación del experimento se recibe una importante


donación, por parte del proyecto Havanna III con Alemania, de módulos de tarjetas de
monitoreo y supervisión en tiempo real de magnitudes tanto eléctricas como no eléctricas
(EI_STEP). Esto permitió elaborar un proyecto que tuviera como objetivo desarrollar un sistema
de monitoreo en tiempo real y vincular asignaturas como Electrónica Analógica, Electrónica
Digital, Mediciones Eléctricas y Microcontroladores, siendo ésta última la de mayor peso ya que

ix
Introducción.

dichos módulos tienen como elemento fundamental un microcontrolador ATmega32 del


fabricante Atmel.

En la actualidad se cuenta con microcontroladores muy potentes con arquitectura Harvard, de


tipo RISC, especialmente los de la casa Atmel, que ofrecen múltiples opciones de trabajo al
tener incorporados dentro de los mismos diversos periféricos como conversores
análogo/digitales, sistemas de modulación por ancho de pulso, comparadores analógicos, etc.

Para introducir el ATmega32 en la asignatura de Microcontroladores de la carrera es


indispensable disponer de materiales de consulta para el estudio de los recursos de este
microcontrolador y para el aprovechamiento de las herramientas de desarrollo, como son el
módulo EI_STEP, los programas AVR Studio y Proteus. Además es objetivo diseñar una serie
de ejemplos simulados e implementados físicamente para complementar el proceso de
aprendizaje de los estudiantes.

Problema.
No se dispone de materiales de consulta para introducir el estudio del ATmega32 en la
asignatura de Microcontroladores de la carrera de Ingeniería Eléctrica

Objetivos.
Elaboración de materiales de apoyo relacionados con el ATmega32 para su uso en la
asignatura Microcontroladores.

Objetivos específicos.
• Elaborar documentación correspondiente al microcontrolador ATmega32.
• Confeccionar la documentación vinculada a las diferentes herramientas de desarrollo de la
familia AVR.
• Desarrollar un conjunto de aplicaciones utilizando el ATmega32.
• Validación de las aplicaciones desarrolladas

Hipótesis.
Si se dispone de materiales de consulta de aplicaciones del microcontrolador ATmega32, es
posible lograr un aprendizaje más significativo de los estudiantes en la asignatura de
Microcontroladores, permitiendo la implementación del ABP en el 3er año de la carrera.

x
Capítulo 1. El microcontrolador ATmega32.

CAPITULO 1. El microcontrolador
ATmega32.
1.1. Características de la familia de microcontroladores AVR

Los AVR son una familia de microcontroladores RISC (en inglés Reduced Instruction Set
Computer, en español Computador con Conjunto de Instrucciones Reducidas) del fabricante
estadounidense Atmel. La arquitectura de los AVR fue concebida por dos estudiantes en el
Instituto Tecnológico de Noruega, y posteriormente refinada y desarrollada en Atmel Norway,
la empresa subsidiaria de Atmel. Se pueden dividir en los siguientes grupos:

• ATxmega: procesadores muy potentes con 16 a 384 kB de memoria flash programable,


encapsulados de 44, 64 y 100 terminales (A4, A3, A1), eventos, criptografía, etc.
• ATmega: microcontroladores AVR grandes con 4 a 256 kB de memoria flash
programable, encapsulados de 28 a 100 terminales, conjunto de instrucciones extendido
(multiplicación y direccionamiento de programas mayores) y amplio conjunto de
periféricos.
• ATtiny: pequeños microcontroladores AVR con 0,5 a 8 kB de memoria flash
programable, encapsulados de 6 a 20 terminales y un limitado set de periféricos.
• AT90USB: ATmega integrado con controlador USB
• AT90CAN: ATmega con controlador de bus CAN
• Tipos especiales: algunos modelos especiales, por ejemplo, para el control de los
cargadores de baterías, pantallas LCD y los controles de los motores o la iluminación.
• AT90S: tipos obsoletos, los AVR clásicos

El AVR es una CPU de arquitectura Harvard, con un banco de 32 registros de 8 bits. Algunas
instrucciones sólo operan en un subconjunto de estos registros. La concatenación de los
32 registros, los registros de entrada/salida y la memoria de datos conforman un espacio de
direcciones unificado, al cual se accede a través de operaciones de carga/almacenamiento. A
diferencia de los microcontroladores PIC, el “stack” o pila se ubica en este espacio de memoria
unificado, y no está limitado a un tamaño fijo.

1
Capítulo 1. El microcontrolador ATmega32.

El AVR fue diseñado desde un comienzo para la ejecución eficiente de código C compilado.
Como este lenguaje utiliza profusamente punteros para el manejo de variables en memoria, los
tres últimos pares de registros internos son usados como punteros de 16 bits al espacio de
memoria, bajo los nombres X, Y y Z.

El set de instrucciones AVR está implementado físicamente y disponible en el mercado en


diferentes dispositivos, que comparten el mismo núcleo AVR pero tienen distintos periféricos y
cantidades de RAM y ROM. La compatibilidad entre los distintos modelos es preservada en un
grado razonable.

Los microcontroladores AVR tienen una cañería ('pipeline' en inglés) con dos etapas (cargar y
ejecutar), que les permite ejecutar la mayoría de las instrucciones en un ciclo de reloj, lo que los
hace relativamente rápidos entre los microcontroladores de 8 bits.

1.2. Características generales del microcontrolador ATmega32

A continuación se relacionan las principales características del ATmega32 [1]:

• Microcontrolador de 8 bits
• 32 Kbyte de memoria flash programable.
- ISP: Programable en sistema.
- Capacidad read-while-write (lee mientras escribe).
- 10000 ciclos de escritura/borrado.
• 1024 Bytes EEPROM.
- 100000 ciclos de escritura/borrado.
• 2 Kbyte de memoria SRAM interna.
• 32 x 8 registros de trabajo de propósito general.
• 32 líneas de entrada/salida de propósito general.
• Tensión de alimentación (Vcc): 4,5 – 5,5V.
• 3 temporizadores/contadores, uno de 16 bits y 2 de 8 bits.
• 3 fuentes de interrupciones externas.
• Conversor análogo/digital (ADC) de 10 bits y 8 canales.
• Comparador analógico integrado.
• Puerto Serie programable (USART)

2
Capítulo 1. El microcontrolador ATmega32.

• Cuatro canales PWM


• Interfaz JTAG
• 6 modos de ahorro de energía:
- Idle (ocioso)
- Power-down (baja energía
- Power-save (modo economizador)
- Standby (modo de espera
- Extended standby (modo de espera extendida
- ADC Noise reduction (reducción de ruidos causados por el ADC
• Oscilador RC interno calibrado en 1, 2, 4 u 8 MHz. Admite un oscilador externo de hasta
16 MHz

Para el trabajo con el ATmega32 se cuenta con un completo juego de programas y sistemas de
desarrollo incluyendo: compiladores, ensambladores, simuladores, emuladores y “kits” de
evaluación.

1.3. Arquitectura externa del microcontrolador ATmega32.

La figura 1.1 muestra la distribución de terminales del microcontrolador para un encapsulado


PDIP.

Figura 1.1 – Terminales del microcontrolador ATmega32

3
Capítulo 1. El microcontrolador ATmega32.

A continuación se mencionan todos los terminales y se explican las funciones especiales de


mayor interés.

• VCC: Tensión de alimentación


• GND: Tierra
• Puerto A (PA7…PA0): Puerto de 8 bits de entrada/salida (E/S) bidireccional. Además
constituye las entradas analógicas al ADC. Cuando los terminales PA0 al PA7 son
usados como entrada y externamente son puestos a nivel bajo, estos suministrarán
corriente si las resistencias pull-up internas están activadas.
• Puerto B (PB7…PB0): El puerto B es un puerto de 8 bits de E/S bidireccional con
resistores internos pull-up. Cuando los terminales PB0 al PB7 son usados como entrada
y externamente son puestos a nivel bajo, estos suministrarán corriente si las
resistencias pull-up internas están activadas. Cada línea del puerto tiene asociada una
función especial como se muestra en la tabla 1.1.

Terminal Función Especial


PB7 SCK (SPI Bus Serial Clock)
PB6 MISO (SPI Bus Master Input/Slave Output

SS (SPI Slave Select Input)


PB5 MOSI (SPI Bus Master Output/Slave Input
PB4
AIN1 (Analog Comparator Negative Input)
PB3
OC0 (Timer/Counter0 Output Compare Match Output)
AIN0 (Analog Comparator Positive Input)
PB2
INT2 (External Interrupt 2 Input)
PB1 T1 (Timer/Counter1 External Counter Input)
T0 (Timer/Counter0 External Counter Input)
PB0
XCK (USART External Clock Input/Output)

Tabla 1.1 – Funciones especiales del Puerto B

SCK – Puerto B, Bit 7: Terminal de salida del reloj maestro, entrada del reloj esclavo para SPI
(Serial Peripheral Interface). Cuando el modo SPI está activado como esclavo este terminal es
configurado como entrada independientemente de la configuración de DDRB7. Cuando el SPI
es activado como maestro la dirección de los datos de este terminal es controlada por DDRB7.
Cuando el terminal es forzado a ser entrada, el pull-up puede ser controlado por el bit PORTB7.

MISO – Puerto B, Bit 6: Terminal de entrada de datos maestro, salida de datos esclavo para el
SPI. Cuando el SPI es activado como maestro este terminal es configurado como entrada sin
importar la configuración de DDRB6. Cuando es activado como esclavo la dirección de los

4
Capítulo 1. El microcontrolador ATmega32.

datos de este terminal es controlada por DDRB6. Cuando este terminal es forzado por el SPI a
ser entrada el pull-up puede ser controlado por el bit PORTB6.

MOSI – Puerto B, Bit 5: Salida maestra de datos en SPI, entrada esclava de datos para SPI.
Cuando SPI es activado como esclavo este terminal es configurado como entrada
independientemente de la configuración de DDRB5. Cuando el SPI es activado como maestro,
la dirección de los datos en este terminal es controlada por DDRB5. Cuando el terminal es
forzado por SPI a ser entrada el pull-up puede ser controlado por el bit PORTB5.

 – Puerto B, Bit 4: Cuando el SPI es habilitado como esclavo, este terminal es configurado
como entrada independientemente de la configuración de DDRB4. Como esclavo, el SPI es
activado cuando este terminal es puesto a nivel bajo. Cuando el SPI es habilitado como maestro
la dirección de los datos en este terminal es controlada por DDRB4. Cuando el terminal es
forzado por el SPI a ser entrada el pull-up puede ser controlado por el bit PORTB4.

AIN1/OC0 – Puerto B, Bit 3

- AIN1: Entrada negativa del comparador analógico. Se debe configurar este


terminal como entrada con la resistencia interna de pull-up desactivada para
evitar que las funciones digitales del puerto interfieran con la función del
comparador analógico.

- OC0: Este terminal se puede utilizar como salida externa para el comparador
del temporizador/contador0. El terminal PB3 tiene que ser configurado como
salida (DDRB3 puesto a uno) para realizar esta función. OC0 es también la
salida de la función PWM del temporizador.

AIN0/INT2 – Puerto B, Bit2

- AIN0: Entrada positiva del comparador analógico. Se debe configurar este


terminal como entrada con la resistencia interna de pull-up desactivada para
evitar que las funciones digitales del puerto interfieran con la función del
comparador analógico.

- INT2: Fuente de interrupción externa 2.

5
Capítulo 1. El microcontrolador ATmega32.

T1 – Puerto B, Bit1: Entrada de conteo del Temporizador/Contador1.

T0/XCK – Puerto B, Bit0

- T0: Entrada de conteo del Temporizador/Contador0.

- XCK: Reloj externo del USART. El registro de dirección de datos (DDRB)


controla si el reloj es salida o entrada. El terminal XCK solamente es activado
cuando el USART opera en modo sincrónico.

• Puerto C (PC7…PC0): El puerto C es un puerto de 8 bits de E/S bidireccional con


resistencias pull-up internas. Cuando los terminales PC0 a PC7 son usados como
entrada y externamente son puestos a nivel bajo abajo, estos suministrarán corriente si
las resistencias pull-up internas están activadas. Cada línea del puerto tiene asociada
una función especial como se muestra en la tabla 1.2.

Terminal Función Especial


PC7 TOSC2 (Timer Oscillator Pin 2)
PC6 TOSC1 (Timer Oscillator Pin 1)
PC5 TDI (JTAG Test Data In)
PC4 TDO (JTAG Test Data Out)
PC3 TMS (JTAG Test Mode Select)
PC2 TCK (JTAG Test Clock)
PC1 SDA (Two-wire Serial Bus Data Input/Output Line)
PC0 SCL (Two-wire Serial Bus Clock Line)

Tabla 1.2 – Funciones especiales del Puerto C

• Puerto D (PD7…PD0): El puerto D es un puerto de 8 bits de E/S bidireccional con


resistencias pull-up internas. Cuando los terminales PD0 a PD7 son usados como
entrada y externamente son puestos a nivel bajo abajo, estos suministrarán corriente si
las resistencias pull-up internas están activadas. Cada línea del puerto tiene asociada
una función especial como se muestra en la tabla 1.3.

6
Capítulo 1. El microcontrolador ATmega32.

Terminal Función Especial


PD7 OC2 (Timer/Counter2 Output Compare Match Output)
PD6 ICP1 (Timer/Counter1 Input Capture Pin)
PD5 OC1A (Timer/Counter1 Output Compare A Match Output)
PD4 OC1B (Timer/Counter1 Output Compare B Match Output)
PD3 INT1 (External Interrupt 1 Input)
PD2 INT0 (External Interrupt 0 Input)
PD1 TXD (USART Output Pin)
PD0 RXD (USART Input Pin)

Tabla 1.3 – Funciones especiales del Puerto D

OC2 – Puerto D, Bit 7: Este terminal puede ser usado como salida externa para la salida de
comparación del temporizador/contador2. Este terminal tiene que estar configurado como salida
(DDRD7 puesto a uno) para poder brindar esta función. Este terminal es también la salida del
modo PWM del temporizador/contador2.

ICP1 – Puerto D, Bit 6: Este bit se utiliza como entrada para la función de captura del
temporizador/contador1.

OC1A – Puerto D, Bit 5: Este terminal puede ser usado como salida externa para la salida de
comparación A del temporizador/contador1. Este terminal tiene que estar configurado como
salida (DDRD5 puesto a uno) para poder brindar esta función. Este terminal es también la salida
del modo PWM del temporizador/contador1.

OC1B – Puerto D, Bit 4: Este terminal puede ser usado como salida externa para la salida de
comparación B del temporizador/contador1. Este terminal tiene que estar configurado como
salida (DDRD4 puesto a uno) para poder brindar esta función. Este terminal es también la salida
del modo PWM del temporizador/contador1.

INT1 – Puerto D, Bit 3: Fuente de interrupción externa 1.

INT0 – Puerto D, Bit 2: Fuente de interrupción externa 0.

TXD – Puerto D, Bit 1: Terminal de salida para la transmisión de datos del USART. Cuando la
transmisión del USART está habilitada, este terminal es configurado como salida
independientemente del valor de DDRD1.

7
Capítulo 1. El microcontrolador ATmega32.

RXD – Puerto D, Bit 0: Terminal de entrada para la recepción de datos del USART). Cuando la
recepción del USART está habilitada, este terminal es configurado como entrada sin importar el
valor de DDRD0. Cuando el USART fuerza a este terminal a trabajar como entrada la
resistencia de pull-up puede ser controlada por el bit PORTD0.

• RESET: Un nivel bajo puesto en este terminal durante 1,5 µs como mínimo generará un
“reset”, incluso si el reloj no está funcionando.
• XTAL1: Entrada del amplificador del oscilador inversor y entrada al reloj interno del
circuito.
• XTAL2: Salida del amplificador del oscilador inversor.
• AVCC: Terminal para la tensión de alimentación del puerto A y el ADC. Debe estar
conectado externamente a través de un filtro pasa-bajo a VCC, incluso si el ADC no es
usado.
• AREF: Terminal de referencia analógica para el ADC

1.4. Memoria de programa

El ATmega32 cuenta con 32 kbytes de memoria flash programable. Como todas las
instrucciones son de 16 o 32 bits, dicha memoria está organizada en 16 x 16 kbyte. Esta
memoria está dividida en 2 secciones, la sección del cargador de arranque y la sección de
programas de aplicación. El contador de programa (PC) es de 14 bits para direccionar los 16
kbyte de memoria.

Figura 1.2 – Mapa de memoria de programa.

8
Capítulo 1. El microcontrolador ATmega32.

1.5. Memoria de datos SRAM

Figura 1.3 – Mapa de memoria de datos

Las 2144 localizaciones de memoria de datos contienen los 32 registros de propósito


general, los 64 registros E/S y los 2 kbyte de memoria SRAM interna.

1.5.1. Registros de propósito general.

Existen 32 registros en el ATmega32, los cuales se nombran r0 a r31, pero pueden ser
renombrados usando las directivas del ensamblador.

En la figura 1.4 se observan las direcciones que ocupan los 32 registros de propósito general
dentro de la SRAM (0000h a la 001Fh).

9
Capítulo 1. El microcontrolador ATmega32.

Figura 1.4 – Registros de propósito general.

A partir de la dirección 001AH a la 001FH, se declaran los 3 registros de 16 bits (X, Y y Z), los
cuales actúan como apuntadores de direcciones para direccionamiento indirecto (figura 1.5).

Figura 1.5 – Registros X, Y y Z.

1.5.2. Registros E/S

Todos los registros relacionados con las líneas de E/S y los periféricos se ubican en la zona de
memoria de E/S. Estas localizaciones son accesadas con las instrucciones IN y OUT,
transfiriendo un dato desde cualquiera de los 32 registros de propósito general al espacio de
memoria E/S. Los registros dentro del intervalo $00 - $1F son direccionables bit a bit utilizando
las instrucciones SBI y CBI. En esta zona el valor de un bit puede ser encuestado usando las
instrucciones SBIS y SBIC.

10
Capítulo 1. El microcontrolador ATmega32.

En el anexo #1 se encuentra una tabla con la ubicación y el mapa de bits de todos los registros
E/S.

1.5.3. Modos de direccionamiento.

Los cinco diferentes modos de direccionamiento de memoria son: directo, indirecto con
desplazamiento, indirecto, indirecto con pre-decremento e indirecto con post-incremento.

El direccionamiento directo alcanza todo el espacio de datos. El modo indirecto con


desplazamiento alcanza 63 localizaciones de memoria desde una dirección base o de partida
dada por los registros Y o Z. Cuando se usa el modo indirecto con pre-decremento o post-
incremento automático, las direcciones a la que apuntan los registros X, Y y Z son
decrementadas o incrementadas. Los 32 registros de propósito general, los 64 registros E/S y
los 2048 bytes de SRAM interna en el ATmega 32 son todos accesibles mediante estos modos
de direccionamiento.

En el anexo #2 se encuentra una explicación más detallada de cada uno los modos
mencionados anteriormente.

1.6. Puertos.

El ATmega 32 tiene 4 puertos, llamados PORTA, PORTB, PORTC y PORTD. Cuando los
terminales no son interface de algún periférico, como el USART, el ADC, los temporizadores,
etc., es decir, cuando son manual y directamente controlados por sus registros PORTx, PINx y
DDRx se dice que actúan como entradas y salidas de propósito general.

En principio todos los terminales son bidireccionales cuando actúan como líneas de Entrada y
Salida Generales. La dirección es configurable por software. Algunos pierden esa función
cuando su control es asumido por algún módulo relacionado, por ejemplo, una vez configurado
el puerto serie, el USART asumirá el control de los terminales TXD y RXD.

1.6.1. Capacidades de tensión y corriente.

Cuando actúan como salidas, los terminales pueden entregar tensiones de hasta VCC. Cuando
actúan como entradas pueden manejar niveles de hasta 0.5V por encima de VCC. El diseño de
los terminales incluye diodos internos de sujeción que les permiten soportar tensiones mucho
mayores que VCC o inferiores que GND, siempre que la corriente no sobrepase el orden de los
micro Amperes.

11
Capítulo 1. El microcontrolador ATmega32.

Cada terminal de E/S puede soportar picos de corriente de hasta 40 mA, pero en estado estable
cada terminal de puerto puede suministrar o recibir hasta 20 mA de corriente cuando VCC = 5V
y hasta 10 mA cuando VCC = 3V. Sin embargo, esta capacidad no puede estar presente en
todos los terminales al mismo tiempo.

Los límites de corriente total que soportan los puertos en el ATmega 32:

• La suma de las corrientes suministradas por los terminales PB0 - PB7, PCO - PC7,
PD0 - PD7 y XTAL2 no deberá exceder los 100 mA.
• La suma de las corrientes suministradas por los terminales PA0 – PA7 no deberá
exceder los 100 mA.
• La suma de las corrientes suministradas por todos los puertos no deberá exceder los
200 mA.
• La suma de las corrientes recibidas por los terminales PB0 - PB7, PCO - PC7, PD0 -
PD7 y XTAL2 no deberá exceder los 100 mA.
• La suma de las corrientes recibidas por los terminales PA0 – PA7 no deberá exceder
los 100 mA.
• La suma de las corrientes recibidas por todos los puertos no deberá exceder los 200
mA.

1.6.2. Las Resistencias de Pull-up.

Los AVR incorporan en todos sus puertos transistores a manera de fuente de corriente que en
la práctica funcionan como resistencias de pull-up.

Estas resistencias se pueden habilitar independientemente para cada terminal escribiendo un 1


en su registro de salida PORT. Sólo serán efectivas en los terminales que actúan como
entradas; en los configurados como salidas quedan automáticamente deshabilitadas.

El bit PUD (figura 1.6) es común a todos los puertos. Se encuentra en el registro SFIOR y su
función es deshabilitar todas las resistencias pull-up de todos los puertos si su valor es 1. El bit
PUD (Pull-Ups Disable) se inicializa a 0 y un posible interés por ponerlo a uno puede ser
eliminar la pequeña corriente que puede fluir por las resistencias pull-up cuando los terminales
en cuestión se conectan a 0 lógico.

12
Capítulo 1. El microcontrolador ATmega32.

Figura 1.6 – Fracción del esquema general de un puerto de E/S.

1.6.3. Configuración y Manejo de los Puertos

Cuando los terminales trabajan como entradas y salidas generales su control descansa
principalmente en los registros: SFIOR, DDRx, PORTx y PINx, donde x puede ser A, B, C o D.

Registro SFIOR
ADTS2 ADTS1 ADTS0 - ACME PUD PSR2 PSR10

Cada puerto tiene sus correspondientes registros DDRx, PORTx y PINx, así por ejemplo el
puerto A tiene sus registros DDRA, PORTA y PINA. Lo mismo es aplicable a los otros puertos.

Registro PORTA
PORTA7 PORTA6 PORTA5 PORTA4 PORTA3 PORTA2 PORTA1 PORTA0

Registro PINA
PINA7 PINA6 PINA5 PINA4 PINA3 PINA2 PINA1 PINA0

Registro DDRA
DDA7 DDA6 DDA5 DDA4 DDA3 DDA2 DDA1 DDA0

Registro PORTx: Se utiliza para escribir datos en los terminales del puerto que estén
configurados como salida. Además, escribir en los bits de PORTx cuyos terminales estén

13
Capítulo 1. El microcontrolador ATmega32.

configurados como entradas significa activar o desactivar las resistencias pull-up de los mismos.
Leer el registro PORTx solo significa obtener el último valor que se escribió en este registro.

Registro PINx: Se utiliza para leer el estado de los terminales del puerto sin importar si están
configurados como entradas o como salidas. La función alternativa de este registro es para
conmutar el estado de los terminales configurados como salidas cuando se escribe un 1 en su
bit correspondiente de PINx.

Registro DDRx (Data Direction Register): Se utiliza para configurar la dirección del puerto, es
decir, para establecer cuáles terminales serán entradas y cuáles serán salidas. Después de un
“reset” todos los puertos inician con sus terminales configurados como entradas, pero se
pueden reconfigurar en cualquier punto del programa. Si se escribe un 0 en un bit de DDRx,
entonces el terminal correspondiente en el puerto será de entrada y si se escribe un 1, será de
salida. Por ejemplo, si escribimos el valor 11110000 en DDRB, entonces los cuatro terminales
de menor peso del puerto B serán entradas digitales y los cuatro restantes serán de salida.

La tabla 1.4 resume los estados de las líneas de puerto en dependencia de la configuración de
los registros DDRx y PORTx.

Caso No. Bit en Bit en PORTx Bit en PUD Dirección de Pull-up Estado del
DDRx terminal terminal
3er estado (alta
1 0 0 X Entrada No
impedancia
Alto, debido al
2 0 1 0 Entrada Sí
pull-up
3er estado (alta
3 0 1 1 Entrada No
impedancia
4 1 0 X Salida No Bajo (0 lógico)
5 1 1 X Salida No Alto (1 lógico)

Tabla 1.4 – Configuración de puertos.

Caso 1: Si un terminal está configurado como entrada y su bit respectivo en PORTx vale 0,
este no tendrá pull-up y su estado será de alta impedancia.

Caso 2: Si un terminal está configurado como entrada y su bit respectivo en PORTx vale 1,
este tendrá pull-up y su estado se leerá como 1 lógico, siempre que el bit PUD del registro
SFIOR valga 0.

14
Capítulo 1. El microcontrolador ATmega32.

Caso 3: Si PUD = 1 se deshabilitarán las resistencias pull-up de todos los terminales. Por tanto
los terminales de entrada estarán siempre en alta impedancia.

Casos 4 y 5: Si un terminal está configurado como salida, de ningún modo tendrá pull-up y su
estado de salida será 1 o 0 lógico, dependiendo del valor escrito en su respectivo bit de
PORTx.

1.7. Interrupciones.

Una interrupción es una llamada “inesperada”, urgente e inmediata a una función especial
denominada Interrupt Service Routine (ISR) o Rutina de Servicio de Interrupción.

Al dispararse la interrupción la CPU guardará en la pila el valor actual del contador de programa
y lo actualizará con el valor del vector de interrupción respectivo, de modo que la CPU pasará a
ejecutar el código que se encuentre a partir de esa dirección.

Con la llegada de una interrupción la CPU termina de ejecutar la instrucción en curso, guarda
en la pila el valor actual del contador de programa y lo actualizará con el valor del vector de
interrupción respectivo y salta a ejecutar el código de ISR. Al final del código de la interrupción
debe haber una instrucción de retorno (reti) que restaure el contador de programa con el valor
que se había guardado en la pila y continúa el flujo normal del programa.

Las interrupciones pueden ser provocadas por eventos externos o internos. El evento puede ser
algún cambio en cierto terminal de entrada/salida (E/S), el desbordamiento de un temporizador,
la llegada de un dato serial, etc. Se puede deducir por tanto que las fuentes de interrupción
están relacionadas con la cantidad de recursos del microcontrolador.

En el ATmega32 cada interrupción está identificada por un vector de interrupción, que no es


otra cosa que una dirección particular en la memoria flash. Todos los vectores están ubicados
en posiciones consecutivas de la memoria flash y forman la denominada tabla de vectores de
interrupción.

El RESET no es una interrupción pero su dirección 0x0000 también se conoce como vector de
Reset.

15
Capítulo 1. El microcontrolador ATmega32.

Por defecto, la tabla de vectores de interrupción está ubicada en las primeras posiciones de la
memoria, tal como se ve en la tabla 1.5. Es posible desplazar los vectores de interrupción a la
zona del cargador de arranque.

No. vector Dirección Nombre vector interrupción Descripción


1 $000 RESET Cinco fuentes de reset(*)
2 $002 INT 0 Fuente de interrupción externa 0
3 $004 INT1 Fuente de interrupción externa 1
4 $006 INT2 Fuente de interrupción externa 2
5 $008 TIMER2 COMP Comparación timer/contador 2
6 $00A TIMER2 OVF Desbordamiento del timer/contador 2
7 $00C TIMER1 CAPT Evento de captura con timer/contador 1
8 $00E TIMER1 COMPA Comparación A timer/contador 2
9 $010 TIMER1 COMPB Comparación B timer/contador 2
10 $012 TIMER1 OVF Desbordamiento temporizador/contador 1
11 $014 TIMER0 COMP Comparación temporizador/contador 0
12 $016 TIMER0 OVF Desbordamiento temporizador/contador 0
13 $018 SPI, STC Transferencia serie completa
14 $01A USART, RXC USART, recepción completa (Rx)
15 $01C USART, UDRE USART, registro de datos vacío
16 $01E USART, TXC USART, transferencia completa (Rx)
17 $020 ADC ADC, conversión completa
18 $022 EE_RDY Memoria EEPROM preparada
19 $024 ANA_COMP Comparador analógico
20 $026 TWI Interfaz serial two-wire (2 cables)
21 $028 SPM_RDY Almacenamiento de memoria programa
preparado
(*)
Reset al encendido, Reset externo, Reset por Watchdog, Reset por Brown-out y Reset por JTAG AVR.

Tabla 1.5 – Fuentes de interrupción del ATmega 32.

Fuentes de Reset

Existen 5 posibilidades para que se produzca un Reset de las cuáles se explican a continuación
las 3 más frecuentemente utilizadas:

• Reset al encendido: El microcontrolador se resetea cuando la tensión de la fuente de


alimentación está por debajo del nivel requerido para el funcionamiento.
• Reset externo: Cuando un nivel bajo es ingresado en el terminal RESET durante más
de 2 ciclos de XTAL.
• Reset por Watchdog: Si el Watchdog está habilitado y su tiempo de temporización
expira antes de producirse la instrucción WDR el microcontrolador se reseteará.

16
Capítulo 1. El microcontrolador ATmega32.

Una vez producido el “reset” todos los registros del microcontrolador son puestos a sus valores
iniciales y el programa empieza su ejecución en la dirección $0000. En esta dirección debe
colocarse una instrucción de salto para ejecutar la rutina de comienzo de programa.

Si se llegara a producir el evento excepcional en que se disparen dos o más interrupciones al


mismo tiempo, se ejecutarán las interrupciones en orden de prioridad. Tiene mayor prioridad la
interrupción que tenga la dirección más baja del espacio de memoria de programa.

1.7.1. Control de las Interrupciones

Existen dos tipos de bits para controlar cada una de las interrupciones: los bits de habilitación y
los bits de bandera, que indican cuál interrupción se ha producido. Hay un bit de habilitación
individual para cada interrupción y además hay un bit de habilitación general I (ubicado en
el registro SREG) que afecta a todas las interrupciones.

Para habilitar una interrupción hay que poner a uno su bit de habilitación individual así como el
general I. Se pueden habilitar varias interrupciones de este modo. Ninguna habilitación
individual tendrá efecto, es decir, no disparará una interrupción si el bit I está en cero.

Por otro lado, cada interrupción tiene un bit de bandera único, que se pone a uno
automáticamente por hardware cuando ocurre el evento de dicha interrupción. Esto pasará
independientemente de si la interrupción está habilitada o no. Si la interrupción fue previamente
habilitada, se activará.

Los AVR tienen un hardware que limpia automáticamente el bit de bandera apenas se empiece
a ejecutar la función de interrupción. Dado que las banderas se ponen a uno
independientemente de si las interrupciones están habilitadas o no, en ocasiones será
necesario limpiarlos por software. Todas las banderas se limpian escribiendo un uno y
no un cero en su bit respectivo.

Al ejecutarse la ISR también se limpia por hardware el bit de habilitación general I para
evitar que se disparen otras interrupciones cuando se esté ejecutando la interrupción actual.
Este bit se pone a uno automáticamente con la ejecución de la instrucción reti

17
Capítulo 1. El microcontrolador ATmega32.

Sin embargo, la arquitectura del ATmega32 permite anidar interrupciones poniendo a uno el bit I
dentro de la ISR actual. En este punto cualquier interrupción que haya sido habilitada podrá
“interrumpir” la ISR actual.

El bit de habilitación general I se puede escribir como cualquier otro bit de un registro E/S, pero
dada su especial importancia, existen dos instrucciones exclusivas de ensamblador llamadas
sei (poner a uno el bit I) y cli (limpiar I).

1.7.2. Configuración de las interrupciones externas

El ATmega32 cuenta con 3 interrupciones externas: INT_0, INT_1 e INT_2. Los registros
involucrados en su configuración son:

• MCUCR – MCU control register: Contiene los bits que controlan como será activada la
interrupción (nivel bajo, cambio lógico, etc.).

Bit 7 6 5 4 3 2 1 0
SE SM2 SM1 SM0 ISC11 ISC10 ISC01 ISC00
Lectura/escritura (R/W) R/W R/W R/W R/W R/W R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

Bit 3, 2 – ISC11, ISC10: Interrupt Sense Control 1 Bit 1 and Bit 0, se usan para controlar
como será activada la interrupción INT1 (tabla 1.6).

ISC11 1SC10 Descripción


0 0 Nivel bajo de INT1 genera solicitud de interrupción.
0 1 Cualquier cambio lógico en INT1 genera solicitud de interrupción.
1 0 Flanco de bajada en INT1 genera solicitud de interrupción.
1 1 Flanco de subida en INT1 genera solicitud de interrupción.

Tabla 1.6 – Control de activación de interrupción INT_1.

Bit 1, 0 – ISC01, ISC00: Interrupt Sense Control 0 Bit 1 and Bit 0, se usan para controlar
como será activada la interrupción INT_0 (tabla 1.7).

18
Capítulo 1. El microcontrolador ATmega32.

ISC01 1SC00 Descripción


0 0 Nivel bajo en INT0 genera solicitud de interrupción.
0 1 Cualquier cambio lógico en INT0 genera solicitud de interrupción.
1 0 Flanco de bajada en INT0 genera solicitud de interrupción.
1 1 Flanco de subida en INT0 genera solicitud de interrupción.

Tabla 1.7 – Control de activación de interrupción INT0.

• MCUCSR – MCU control and status register.

Bit 6 - ISC2: Interrupt Sense Control 2. Si este bit tiene un cero lógico, un flanco de caída
en INT_2 activará la interrupción, de lo contrario (tiene un uno lógico) se activará por flanco
de subida.

Bit 7 6 5 4 3 2 1 0
JTD ISC2 - JTRF WDRF BORF EXTRF PORF
Lectura/escritura (R/W) R/W R/W R R/W R/W R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0
• GICR – General Interrupt Control Register.

Bit 7 6 5 4 3 2 1 0
INT1 INT0 INT2 - - - IVSEL IVCE
Lectura/escritura (R/W) R/W R/W R/W R R R R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

Bit 7 – INT1: External Interrupt request 1 enable. Cuando este bit y el bit I en SREG están en
uno lógico, la interrupción externa INT_1 está habilitada. Cualquier actividad en el terminal
causará que se solicite una interrupción incluso si este está configurado como salida.

Bit 6 – INT0: External Interrupt request 0 enable. Cuando este bit y el bit I en SREG están en
uno lógico, la interrupción externa INT_0 está habilitada. Cualquier actividad en el terminal
causará que se solicite una interrupción incluso si este está configurado como salida.

Bit 5 – INT2: External Interrupt request 2 enable. Cuando este bit y el bit I en SREG están en
uno lógico, la interrupción externa INT_2 está habilitada. Cualquier actividad en el terminal
causará que se solicite una interrupción incluso si este está configurado como salida.

19
Capítulo 1. El microcontrolador ATmega32.

• GIFR – General Interrupt Flag Register.

Bit 7 6 5 4 3 2 1 0
INTF1 INTF0 INTF2 - - - - -
Lectura/escritura (R/W) R/W R/W R/W R R R R R
Valor inicial 0 0 0 0 0 0 0 0

Bit 7 – INTF1: External Interrupt flag 1. Bandera de interrupción que se pone


automáticamente a 1 lógico cuando se ha producido la Interrupción Externa INT_1.
Posteriormente se pone a 0 lógico por hardware cuando la rutina de interrupción se ejecute.

Bit 6 – INTF0: External Interrupt flag 0. Bandera de interrupción que se pone


automáticamente a 1 lógico cuando se ha producido la Interrupción Externa INT_0.
Posteriormente se pone a 0 lógico por hardware cuando la rutina de interrupción se ejecute.

Bit 5 – INTF2: External Interrupt flag 2. Bandera de interrupción que se pone


automáticamente a 1 lógico cuando se ha producido la Interrupción Externa INT_2.
Posteriormente se pone a 0 lógico por hardware cuando la rutina de interrupción se ejecute.

1.8. Temporizadores/Contadores.

Los temporizadores son módulos que trabajan en paralelo con el procesador, permitiendo que
las operaciones de temporización y conteo se puedan llevar a cabo de manera eficiente,
mientras el procesador se ocupa de otras tareas.

El ATmega32 cuenta con tres temporizadores, Timer0, Timer1 y Timer2. Todos pueden trabajar
en modo de PWM pero esta funcionalidad está mejor implementada en el Temporizador1. El
Timer2 fue diseñado con una característica adicional que le permite trabajar con un cristal de
reloj externo de 32kHz.

La descripción de cada temporizador se abordará según su cantidad de bits. De esta forma


quedarán agrupados los temporizadores0 y 2 de 8 bits y diferenciado el temporizador1 de 16
bits.

Muchas referencias a registros y bits están escritas de forma muy general, dicho esto, un valor
de “n” deberá sustituirse por el número del temporizador/contador que se esté utilizando (0, 1 o
2).

20
Capítulo 1. El microcontrolador ATmega32.

1.8.1. Temporizador/Contador0 y Temporizador/Contador2

Dada la paridad de características entre los temporizadores0 y 2, las mismas no se


mencionarán simultáneamente para evitar confusiones, simplemente se hará referencia al
temporizador0 y se dará por hecho que lo mismo es aplicable para el temporizador2, salvo que
se indique explícitamente lo contario.

En la figura 1.7 se muestra el diagrama de bloques del temporizador/contador0. Los registros


TCNT0 (Timer/Counter) y OCR0 son de 8 bits. Las señales de solicitud de interrupción son
visibles en el Registro de Banderas de los temporizadores (TIFR).

Figura 1.7 – Diagrama de bloques del temporizador/contador0.

El elemento central del temporizador es su contador, que es el propio registro TCNT0. La señal
de su reloj puede ser interna (vía pre-escalador) o externo (a través del terminal T0).

El temporizador se encuentra inactivo cuando no está seleccionada ninguna fuente de reloj. La


salida del bloque lógico de selección de reloj se le conoce como reloj del temporizador (clkT0).

Con sus 8 bits, el temporizador0 puede contar en todo su rango, o sea, entre 0 y 255. Cuando
este opera solo en modo ascendente y llega a su valor máximo de 255, continuará después
contando desde 0 otra vez, cíclicamente. Esta transición de 255 a 0 es lo que se conoce como
desbordamiento y es un concepto clave en los temporizadores. El desbordamiento activa el bit

21
Capítulo 1. El microcontrolador ATmega32.

de bandera TOV0. También es posible hacer que el temporizador0 cuente solo hasta un tope
establecido por el registro OCR0.

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


TCNT0 en todo momento. Cada igualdad detectada entre los registros indicados se conoce
como coincidencia y es otro modo de trabajo de los temporizadores en AVR. El resultado de la
comparación puede ser usado por el generador de forma de onda para generar un tren de
pulsos o una señal de frecuencia variable a la salida del terminal de comparación de salida
(OC0). Cuando ocurra la igualdad de valores la bandera de comparación se activa (OCF0) la
cual puede ser usada para generar una solicitud de interrupción de comparación.

Desde el punto de vista de la programación, se puede controlar el temporizador0 con tres tipos
de bits:

• Bits CS (Clock Select) en el registro TCCR0. Los bits CS02, CS01 y CS00 se encargan
de configurar todo lo relacionado con el reloj y el pre-escalador.

• Bits WGM (Waveform Generator Mode) en el registro TCCR0. Los bits WGM01 y
WGM00 establecen el modo en que operará el Timer0, ya sea modo Normal, CTC o
PWM.

• Bits COM (Compare Output Mode) en el registro TCCR0. Son los bits COM01 y COM00
los que deciden si la onda generada por el comparador sale o no por el terminal OC0.
Cuando se va a trabajar como simple contador o temporizador, los bits COM quedan con
su valor por defecto de 0, con lo cual el terminal OC0 queda desconectado del
temporizador y se puede seguir usando como puerto de E/S.

1.8.1.1. Reloj

El reloj del temporizador0 es la señal digital, periódica o no, cuyos pulsos lo hacen avanzar. La
fuente de reloj del temporizador0 puede ser interna o externa:

• Reloj Interno: El reloj del temporizador0 se deriva del mismo oscilador interno del
sistema. Como se observa en la figura 1.8 la señal pasa previamente por el pre-
escalador, que puede dividir la frecuencia por un valor seleccionado por el usuario. Los
pre-escaladores del temporizador0 y del temporizador2 no son idénticos ya que
disponen de diferentes divisores de frecuencia.

En la figura 1.8 se muestra el diagrama de bloques de la unidad de conteo del temporizador0 y


además las siguientes señales que serán recurrentes durante esta sección:

22
Capítulo 1. El microcontrolador ATmega32.

-Count: Incrementa o decrementa TCNTn en 1.

-Direction: Se selecciona entre incremento y decremento.

-Clear: Limpia TCNTn.

-TOP: Señaliza que TCNTn ha alcanzado su valor tope de conteo. Este valor puede ser 0xFF o
el valor almacenado en el registro OCRn para los temporizadores de 8 bits. Para el
temporizador de 16 bits puede ser 0x00FF, 0x01FF, 0x03FF o el valor almacenado en los
registros ICR1 u OCR1A.

-BOTTOM: Señaliza que TCNTn ha alcanzado su valor mínimo.

Figura 1.8 – Diagrama de bloques de la unidad de conteo del temporizador/contador0.

• Reloj Externo: La forma en que la señal externa se aplica al microcontrolador depende


de cada temporizador, en el 0 la señal externa se conecta al terminal T0 (figura 1.8), y el
programador decide si el temporizador avanzará con cada flanco de subida o de bajada
detectado en dicho terminal. Sin embargo, en el temporizador2 (figura 1.9) la señal
externa pasará por su pre-escalador. En este temporizador su reloj externo puede ser de
dos tipos: una señal aplicada al terminal TOSC1, en cuyo caso el temporizador avanzará
con cada flanco de bajada de ese terminal o es la señal de un oscilador conectado entre
los terminales TOSC1 y TOSC2. En ambos casos, la señal de reloj pasará por el pre-
escalador del temporizador2. Aquí radica la diferencia más marcada entre el
temporizador0 y el 2.

23
Capítulo 1. El microcontrolador ATmega32.

Figura 1.9 – Diagrama de bloques de la unidad de conteo del temporizador/contador2.

El modo donde el temporizador0/2 trabaja con un reloj externo aplicado al terminal T0 (para el
temporizador0) o TOSC1 (para el temporizador2) se conoce como modo Contador porque se
contarán los pulsos detectados en dicho terminal. Sin embargo, el hecho de que el reloj
provenga de una fuente externa no imposibilita sus otras funcionalidades, como por ejemplo,
poder generar ondas PWM, interrupciones, etc., aunque sería conveniente que para tal caso la
señal fuera periódica.

1.8.1.2. Pre-escalador.

El pre-escalador es un circuito contador por el que se puede hacer pasar el reloj del
temporizador para dividir su frecuencia, de este modo avanzará más lento, según las
necesidades del diseñador.

El pre-escalador del temporizador0 es compartido con el 1. De acuerdo con la figura 1.10, es


posible que los dos temporizadores operen simultáneamente con el pre-escalador y utilizando
diferentes factores de división puesto que cada uno tiene sus propios bits CS (Clock Select). Se
debe tener en cuenta que se dispone de un único bit PSR10 en el registro SFIOR para resetear
el pre-escalador.

24
Capítulo 1. El microcontrolador ATmega32.

Figura 1.10 – Pre-escalador de los temporizadores0/1.

El pre-escalador del temporizador2 (figura 1.11) ofrece más factores de división, con lo que las
temporizaciones podrán ser más flexibles. A diferencia del temporizador0/1, si se opta por un
reloj externo aplicado al terminal TOSC1, dicha señal sí podrá pasar por el pre-escalador. Dicho
pre-escalador se puede resetear con el bit PSR2 en el registro SFIOR. El bit AS2 en el registro
ASSR determina si el dispositivo trabajará como contador o temporizador.

Figura 1.11 – Pre-escalador del temporizador2.

25
Capítulo 1. El microcontrolador ATmega32.

1.8.1.3. Modos de Operación.

Existen 4 modos en que pueden trabajar los temporizadores0/2:

• Normal: Es el modo más simple. En este modo la dirección del conteo es siempre
ascendente, y al alcanzar su valor tope de 8 bits (TOP = 0xFF) entonces se reinicia
desde su valor más bajo ($00). En operación normal la bandera de desbordamiento del
temporizador/Contador0 (TOV0) será puesta a uno en el mismo ciclo de reloj en que el
TCNT0 llega a ser cero. Sin embargo, combinado con la interrupción de desbordamiento
del temporizador que automáticamente limpia la bandera TOV0, la resolución del
temporizador puede ser incrementada por software. Un nuevo valor en el contador
puede ser escrito en cualquier instante. Para calcular el tiempo que demora en
desbordarse el temporizador (valor a cargar en TCNTn) se utilizan las ecuaciones 1.1 y
1.2:
tiempo ∙ f
N pre escalador  256 1.1

tiempo ∙ f
TCTNn valor de inicio del registro  256 % N& 1.2

Donde:

- tiempo: Valor de la temporización.


- fCPU: Frecuencia del reloj del sistema.

Los valores de N y TCTNn deberán ser aproximados al valor inmediato superior


correspondiente, por ejemplo, si N=195,31 aproximar a 256 y si TCTNn=60,67 aproximar
a 61.

• CTC (Clear Timer on Compare Match): En este modo del temporizador, el registro
OCR0 se utiliza para manipular la resolución del contador. El valor de TCNT0 se
incrementa hasta que ocurra una igualdad en la comparación entre TCNT0 y OCR0,
entonces el contador TCNT0 se limpia. El OCR0 define el valor tope para el contador,
así como su resolución. Para generar una forma de onda de salida en el modo CTC, la
salida OC0 puede ser forzada a invertir (toogle) su nivel lógico cada vez que exista una
igualdad de comparación, simplemente ajustando los bits de modo de comparación de
salida (COM01:0) al modo “toggle”. El valor de OC0 no será visible en el terminal del

26
Capítulo 1. El microcontrolador ATmega32.

puerto a menos que esté configurado como salida. La frecuencia de la forma de onda
(fOCn) se define por la ecuación 1.3:

f
f'(  1.3
2 ∙ N1 ) OCRn

Donde OCRn es el valor del registro OCR0 (si se estuviera trabajando con el
temporizador0).

• PWM rápido: La modulación rápida PWM o el modo rápido PWM es una opción para
generar una forma de onda PWM de alta frecuencia. Se conoce también como PWM de
pendiente única porque el registro TCNT0 avanza siempre hacia arriba, es decir, el
contador se incrementa desde su menor valor (BOTTOM = 0) al máximo (MAX = 255) y
después de lo cual se resetea y vuelve a empezar desde cero (figura 1.12).

Figura 1.12 – PWM rápido, diagrama de tiempo.

Como se indica en la figura 1.12, la onda PWM rápida es generada por la conmutación del
terminal OC0 cada vez que el registro TCNT0 llega al tope (define la frecuencia) y cada vez que
TCNT0 coincide con el registro OCR0 (define ciclo útil). En la figura las coincidencias se
señalan con pequeñas líneas horizontales. Según la configuración de los bits COM01 y COM00
del registro TCCR0, la onda PWM puede ser invertida o no invertida.

Dado que el temporizador0 siempre cuenta en todo su rango de 0 a 255, se deduce que los
posibles valores del período, y por ende de la frecuencia de la onda PWM quedarán definidos
por el pre-escalador. Esta es la limitación del modo PWM de los temporizadores de 8 bits. Por

27
Capítulo 1. El microcontrolador ATmega32.

otro lado, sí es posible modificar el valor del registro OCR0, lo cual nos permitirá controlar el
ciclo útil de la onda PWM. Lo anterior se cumple también para el modo PWM de fase
correcta

En la figura 1.13 se muestran las ecuaciones para calcular el período y el ciclo útil de una onda
PWM rápida no-invertida.

Figura 1.13 – Período y ciclo útil de una onda PWM rápida.

Se observa que si el registro OCR0 toma su valor máximo de 255, entonces el ciclo útil será del
100%, lo cual significa que el estado del terminal OC0 será de 1 lógico constante. Si el registro
OCR0 vale 0 la salida será de unos pequeños picos que representan un ciclo útil cercano al
0.4%.

• PWM de fase correcta: El modo de fase correcta es una opción para generar una forma
de onda PWM de fase correcta con una alta resolución. Se conoce también como PWM
de doble pendiente porque el registro TCNT0 cuenta de manera ascendente y
descendente, es decir, primero avanza desde 0 hasta un valor tope y después regresa
de 255 hasta 0. Este proceso se repite cíclicamente (figura 1.14).

Como se indica en la figura 1.14, la onda PWM de Fase Correcta es generada por la
conmutación del terminal OC0 cada vez que el registro TCNT0 coincide con el registro OCR0.
En la figura las coincidencias se señalan con pequeñas líneas horizontales. Según la
configuración de los bits COM01 y COM00 del registro TCCR0, la onda PWM puede ser
invertida o no invertida.

28
Capítulo 1. El microcontrolador ATmega32.

Figura 1.14 – PWM de fase correcta, diagrama de tiempo.

En la figura 1.15 se muestran las ecuaciones para calcular el período y el ciclo útil de una onda
PWM de Fase Correcta no-invertida.

Figura 1.15 – Período y ciclo útil de una onda PWM de fase correcta.

A diferencia del modo PWM rápido se observa que el ciclo útil puede abarcar todo el rango
desde 0% (con OCR0 = 0) hasta el 100% (con OCR0 = 255). El 0% significa que la salida se
mantendrá en 0 lógico y un 100%, que la salida se mantendrá en un estado alto. Ésta es la
razón por la que se denomina de fase correcta.

29
Capítulo 1. El microcontrolador ATmega32.

Debido a la característica simétrica de este modo PWM de doble pendiente, el mismo se


prefieren para aplicaciones de control de motores.

Debido a la operación de una sola pendiente, la frecuencia de operación del modo PWM rápido
puede ser el doble que en el modo PWM de fase correcta que usa la operación dual de
pendientes. Esta alta frecuencia hace que el modo PWM rápido sea apropiado en aplicaciones
de regulación de potencia, rectificación, etc.

1.8.1.4. Interrupciones en los temporizadores

En los temporizadores pueden ocurrir dos tipos de interrupciones:

• Interrupción por desbordamiento de su registro TCNTn, o sea, la transición de 255 a 0.


Esto implica la operación incremental del temporizador, sin importar si está contando en
modo Normal, CTC (siempre que el tope de conteo sea MAX = 255) o PWM rápido. El
desbordamiento del temporizador activará la bandera TOV0 y si la interrupción está
habilitada, se activará. Para habilitar la interrupción por desbordamiento del
temporizador se pone a uno el bit TOIE0 y el bit de habilitación general de interrupciones
I del registro SREG. En el caso del modo PWM de fase correcta la bandera TOV0 se
pondrá a uno cuando el contador llegue al valor BOTTOM = 0

• Interrupción por coincidencia de su registro TCNTn con el registro OCRn. En este caso
se activará la bandera OCFn (Output Compare Flag n).

1.8.1.5. Registros temporizador0

• TCCR0 – Timer/Counter Control Register

Bit 7 6 5 4 3 2 1 0
FOC0 WGM0 COM0 COM0 WGM CS02 CS01 CS00
0 1 0 01
Lectura/escrit W R/W R/W R/W R/W R/W R/W R/W
ura (R/W)
Valor inicial 0 0 0 0 0 0 0 0

30
Capítulo 1. El microcontrolador ATmega32.

Bit 7 – FOC0: Force Output Compare, este bit solo se encuentra activo cuando los bits WGM
especifiquen un modo que no sea PWM. Para garantizar la compatibilidad con futuros
dispositivos este bit debe ser puesto a cero cuando TCCR0 es escrito cuando se está operando
en un modo PWM. Al poner este bit a uno, inmediatamente se forzará una coincidencia en la
unidad de generación de forma de onda.

Bit 6, 3 – WGM01:0: Waveform Generation Mode, estos bits controlan el modo de trabajo, es
decir, la secuencia de conteo, el valor máximo del conteo (TOP) y la forma de onda que se
generará (tabla 1.8)

Puesta
Mod WGM01 WGM00 Modo de Actualizació a uno
TOP
o (CTC0) (PWM0) operación n de OCR1x de
TOV1
0 0 0 Normal 0xFF Inmediata MAX
PWM fase BOTT
1 0 1 0xFF TOP
correcta OM
2 1 0 CTC OCR0 Inmediata MAX
3 1 1 PWM rápido 0xFF BOTTOM MAX

Tabla 1.8 – Configuración de los bits WGM

Bit 5:4 – COM01:0: Compare Match Output Mode, estos bits controlan el comportamiento del
terminal OC0. Cuando OC0 está conectado al terminal la función de los bits COM01:0 depende
de la configuración de los bits WGM01:0. La tabla 1.9 muestra la funcionalidad de los bits
COM01:0 cuando los bits WGM01:0 están configurados en modo Normal o CTC.

COM01 COM00 Descripción


0 0 OC0 desconectado. Operación normal del terminal
0 1 OC0 conmuta en coincidencia
1 0 Limpia OC0 en coincidencia
1 1 Pone a uno OC0 en coincidencia

Tabla 1.9 – Configuración de los bits COM (modo normal o CTC)

La tabla 1.10 muestra la funcionalidad de los bits COM01:0 cuando los bits WGM01:0 están
configurados en modo PWM rápido.

Ocurre un caso especial cuando OCR0 es el tope del conteo y el bit COM01 vale uno. En este
caso se ignora la coincidencia, pero la puesta a cero o a uno de OC0 se produce al llegar a
cero.

31
Capítulo 1. El microcontrolador ATmega32.

COM01 COM00 Descripción


0 0 OC0 desconectado. Operación normal del terminal
0 1 Reservado
Limpia OC0 en coincidencia, pone a uno OC0 en BOTTOM
1 0
(modo no inversor)
Pone a uno OC0 en coincidencia, limpia OC0 en BOTTOM
1 1
(modo inversor)

Tabla 1.10 – Configuración de los bits COM (PWM rápido).

La tabla 1.11 muestra la funcionalidad de los bits COM01:0 cuando los bits WGM01:0 están
configurados en modo PWM de fase correcta.

COM01 COM00 Descripción


0 0 OC0 desconectado. Operación normal del terminal
0 1 Reservado
Limpia OC0 en coincidencia, cuando se cuenta
1 0 ascendentemente, pone a uno OC0 en coincidencia,
cuando se cuenta descendentemente
Pone a uno OC0 en coincidencia cuando se cuenta
1 1 ascendentemente, limpia OC0 en coincidencia, cuando se
cuenta descendentemente

Tabla 1.11 – Configuración de los bits COM (PWM de fase correcta).

Bit 2:0 – CS02:0: Clock Select, estos bits seleccionan la fuente que usará el temporizador0.

CS02 CS01 CS00 Descripción


0 0 0 Sin fuente de reloj (temporizador detenido)
0 0 1 fCPU (sin pre-escalador)
0 1 0 fCPU/8
0 1 1 fCPU/64
1 0 0 fCPU/256
1 0 1 fCPU/1024
Fuente de reloj externa en terminal T0
1 1 0
(temporizador avanza en flanco de caída)
Fuente de reloj externa en terminal T0
1 1 1
(temporizador avanza en flanco de subida)

Tabla 1.12 – Configuración de los bits Clock Select

32
Capítulo 1. El microcontrolador ATmega32.

• TCNT0 – Timer/Counter Register

Bit 7 6 5 4 3 2 1 0
TCNT0[7:0]
Lectura/escrit R/W R/W R/W R/W R/W R/W R/W R/W
ura (R/W)
Valor inicial 0 0 0 0 0 0 0 0

Este registro brinda acceso directo al contador de 8 bits del temporizador para las operaciones
de lectura y escritura. La modificación de TCNT0 cuando el contador está corriendo conlleva el
riesgo de perder una coincidencia entre los registros TCNT0 y OCR0.

• OCR0 – Output Compare Register

Bit 7 6 5 4 3 2 1 0
OCR0[7:0]
Lectura/escrit R/W R/W R/W R/W R/W R/W R/W R/W
ura (R/W)
Valor inicial 0 0 0 0 0 0 0 0

1.8.1.6. Registros temporizador2

A continuación se muestran los mapas de bits de los registros del temporizador2 y se


explicarán solo las diferencias en cuanto al funcionamiento del mismo con respecto al
temporizador0.

• TCCR2 – Timer/Counter Control Register

Bit 7 6 5 4 3 2 1 0
FOC02 WGM2 COM2 COM2 WGM CS22 CS21 CS20
0 1 0 21
Lectura/escrit W R/W R/W R/W R/W R/W R/W R/W
ura (R/W)
Valor inicial 0 0 0 0 0 0 0 0

Bit 5:4 – COM01:0: Compare Match Output Mode, la tabla 1.13 muestra la funcionalidad
de los bits COM21:0 cuando los bits WGM21:0 están configurados en modo PWM rápido.

Ocurre un caso especial cuando OCR0 es el tope del conteo y el bit COM21 vale uno. En este
caso se ignora la coincidencia, pero la puesta a cero o a uno de OC2 se produce al llegar a
TOP.

33
Capítulo 1. El microcontrolador ATmega32.

COM21 COM20 Descripción


0 0 OC0 desconectado. Operación normal del terminal
0 1 Reservado
Limpia OC0 en coincidencia, pone a uno OC0 en BOTTOM
1 0
(modo no inversor)
Pone a uno OC0 en coincidencia, limpia OC0 en BOTTOM
1 1
(modo inversor)

Tabla 1.13 – Configuración de los bits COM (PWM rápido)

Bit 2:0 – CS02:0: Clock Select, estos bits seleccionan la fuente que usará el temporizador2.

CS22 CS21 CS20 Descripción


0 0 0 Sin fuente de reloj (temporizador detenido)
0 0 1 clkT2S (sin pre-escalador)
0 1 0 clkT2S /8
0 1 1 clkT2S /32
1 0 0 clkT2S /64
1 0 1 clkT2S /128
1 1 0 clkT2S /256
1 1 1 clkT2S /1024

Tabla 1.14 – Configuración de los bits Clock Select

• TCNT2 – Timer/Counter Register

Bit 7 6 5 4 3 2 1 0
TCNT2[7:0]
Lectura/escrit R/W R/W R/W R/W R/W R/W R/W R/W
ura (R/W)
Valor inicial 0 0 0 0 0 0 0 0

• OCR2 – Output Compare Register

Bit 7 6 5 4 3 2 1 0
OCR2[7:0]
Lectura/escrit R/W R/W R/W R/W R/W R/W R/W R/W
ura (R/W)
Valor inicial 0 0 0 0 0 0 0 0

34
Capítulo 1. El microcontrolador ATmega32.

• ASSR – Asynchronous Status Register

Bit 7 6 5 4 3 2 1 0
- - - - AS2 TCN2UB OCR2UB TCR2UB
Lectura/escrit R R R R R/W R R R
ura (R/W)
Valor inicial 0 0 0 0 0 0 0 0

Bit 3 – AS2: Asynchronous Timer/Counter2, cuando este bit está puesto a cero el reloj del
temporizador2 es el del sistema, pero cuando está puesto a uno el reloj es un cristal externo
conectado en el terminal TOSC1.

Bit 2 – TCN2UB: Timer/Counter2 Update Busy, cuando el temporizador2 trabaja


asincrónicamente y se escribe en TCNT2, este bit se pone a uno. Cuando TCNT2 se actualiza
mediante el registro de almacenamiento temporal este bit se limpia por hardware. Un cero en
este bit indica que TCNT2 está listo para ser actualizado con un nuevo valor.

Bit 1 – OCR2UB: Output Compare Register2 Update Busy, cuando el temporizador2 trabaja
asincrónicamente y se escribe en OCR2, este bit se pone a uno. Cuando OCR2 se actualiza
mediante el registro de almacenamiento temporal este bit se limpia por hardware. Un cero en
este bit indica que OCR2 está listo para ser actualizado con un nuevo valor.

Bit 0 – TCR2UB: Timer/Counter Control Register2 Update Busy, cuando el temporizador2


trabaja asincrónicamente y se escribe en TCCR2, este bit se pone a uno. Cuando TCCR2 se
actualiza mediante el registro de almacenamiento temporal este bit se limpia por hardware. Un
cero en este bit indica que TCCR2 está listo para ser actualizado con un nuevo valor.

1.8.2. Temporizador/Contador1.

Este temporizador es de 16 bits y en principio, opera de la misma forma en que lo hace el


temporizador0, solo que utilizando sus registros de datos de 16 bits (figura 1.16). Dicho esto
solo se explicarán los elementos específicos propios de este temporizador.

Como en el ATmega32 cada registro de E/S es de 8 bits, en realidad los registros de datos del
temporizador1 están compuestos por la unión de dos registros de 8 bits. Por ejemplo, TCNT1 es
la unión de los registros TCNT1H (Parte alta del contador que contiene los 8 bits más altos) y
TCNT1L (parte baja del contador que contiene los 8 bits más bajos). Lo mismo sucede con los

35
Capítulo 1. El microcontrolador ATmega32.

siguientes registros:

• OCR1A: unión de OCR1AH y OCR1AL.


• OCR1B: unión de OCR1BH y OCR1BL.
• ICR1: unión de ICR1H e ICR1L.

Figura 1.16 – Diagrama de bloques del temporizador/contador1.

Este temporizador cuenta con dos salidas de comparación que además pueden ser utilizadas
para generar dos señales PWM. Adicionalmente cuenta con una entrada de captura.

El temporizador/contador1 puede ser sincronizado internamente vía pre-escalador o por una


fuente externa de reloj en el terminal T1. El bloque lógico de selección de reloj controla que
fuente de reloj y que tipo de flanco se utiliza para incrementar o decrementar el valor del
contador. Este temporizador se encuentra inactivo cuando ninguna fuente de reloj está
seleccionada. La salida del bloque lógico de selección del reloj se le conoce como reloj del
contador (clkT1). Los registros de comparación de salida de doble buffer (OCR1A/B) son
comparados con el valor del TCNT1 en todo momento.

36
Capítulo 1. El microcontrolador ATmega32.

El resultado de la comparación puede ser usado por el generador de forma de onda para
generar un tren de pulsos (PWM) o una señal de frecuencia variable en el terminal de salida de
comparación OC1A/B. Un evento de igualdad en la comparación también activará la bandera de
coincidencia OCF1A/B la cual se usa para generar solicitudes de interrupciones.

El registro de captura de entrada puede obtener el valor del TCNT1 en un evento externo, ya
sea por el terminal de captura de entrada (ICP1) o por los terminales del Comparador Analógico.
La unidad de captura de entrada incluye una unidad de filtrado para la reducción de picos de
ruido.

El valor TOP, o valor máximo del TCNT1, puede ser definido en algunos modos de operación
por el registro OCR1A, por el registro ICR1 o por un conjunto de valores fijos.

Cuando se usa OCR1A como valor TOP en el modo PWM, el registro OCR1A no puede ser
utilizado para generar una salida PWM. Sin embargo, en este caso, el valor TOP será de doble
“buffer” permitiendo que este sea cambiado mientras esté funcionando el contador. Si se
requiere un valor fijo de TOP, el registro ICR1 puede usarse como una alternativa, liberando
OCR1A para ser usado como salida PWM.

1.8.2.1. Accediendo a los registros de 16 bits.

Los registros TCNT1, OCR1A/B e ICR1 son registros de 16 bits que pueden ser accedidos por
la CPU a través del bus de datos de 8 bits. Acceder a un registro de 16 bits se le llama
operación atómica. El registro de 16 bits debe ser accedido usando 2 operaciones de lectura o
escritura. Cada temporizador de 16 bits tiene un registro de 8 bits para el almacenamiento
temporal del byte alto. Accediendo al byte bajo activa la operación de 16 bits de lectura o
escritura. Cuando el byte bajo de un registro de 16 bits es escrito por la CPU, este y el byte alto
almacenado en el registro temporal son copiados ambos al registro de 16 bits en el mismo ciclo
de reloj.

Cuando el byte bajo del registro de 16 bits es leído por la CPU, el byte alto del registro de 16 bits
se copia dentro del registro temporal en el mismo ciclo de reloj en que el byte bajo es leído.

No todos los accesos a 16 bits utilizan el registro temporal para el byte alto. Leer los registros de
16 bits OCR1A/B no involucra registros temporales. Para realizar una escritura a 16 bits, el byte

37
Capítulo 1. El microcontrolador ATmega32.

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.

1.8.2.2. Unidad de captura de entrada.

Se trata de un circuito que selecciona la señal de captura (figura 1.17). Se disponen de dos
opciones: el terminal de captura de entrada (ICP) o se puede utilizar la salida del Comparador
Analógico ajustando el bit de Captura de Entrada (ACIC) en el Registro de Estado de Control del
Comparador Analógico (ACSR).

Se debe tener cuidado al cambiar la fuente de disparo, esto puede activar una captura. La
bandera de captura de entrada (ICF1) debe limpiarse después de dicho cambio.

Cuando ocurre un cambio en nivel lógico (un evento) en el terminal de captura y este cambio se
confirma por los ajustes del detector de transición, una captura será activada. Cuando se activa
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 en que el
valor de TCNT1 se copia dentro del registro ICR1. Si el bit TICIE1 en el registro TIMSK está
puesto a uno, ICF1 genera una interrupción de captura de entrada.

Figura 1.17 – Diagrama de bloques de la unidad de captura de entrada del


temporizador/contador1.

38
Capítulo 1. El microcontrolador ATmega32.

El registro ICR1 puede ser escrito solamente cuando se usa un modo de generación de forma
de onda que utilice al registro ICR1 para definir el valor TOP del contador. En estos casos se
debe definir el valor de los bits del modo de generación de forma de onda (WGM13:0) antes de
que el valor TOP sea escrito al registro ICR1.

Dentro de esta unidad de conteo también se encuentra un cancelador de ruido el cual puede
ser habilitado mediante el bit ICNC1 del registro TCCR1B para evitar falsos disparos causados
por los picos del ruido. Este cancelador utiliza el reloj del sistema y por consiguiente no se
afecta por el pre-escalador.

1.8.2.3. Modos de operación Normal y CTC

Con su registro TCNT1 de 16 bits, el temporizador1 puede contar desde 0x0000 hasta 0xFFFF.
En modo Normal y en modo CTC avanza siempre en modo ascendente. En modo Normal llega
hasta 0xFFFF y en modo CTC avanza hasta que coincida con el valor del registro OCR1A o
ICR1 que también son de 16 bits. El conteo es siempre cíclico, o sea que después de llegar a
su valor tope, la cuenta se reinicia desde 0.

Cualquiera que sea su modo de operación, el registro de conteo TCNT1 siempre es comparado
con los registros OCR1A y OCR1B. Las coincidencias detectadas activarán las banderas
OCF1A y OCF1B respectivamente y se pueden usar estos eventos para programar las
interrupciones de coincidencias poniendo a uno los bits OCIE1A para la coincidencia entre
TCNT1 y OCR1A, y OCIE1B para la coincidencia entre TCNT1 y OCR1B.

Para determinar el tiempo que pasará entre la carga del temporizador1 con un valor inicial
TCNT1 hasta su desbordamiento (modo normal) se utilizan las siguientes ecuaciones 1.4 y 1.5:

tiempo ∙ f
N 1.4
65536

tiempo ∙ f
TCNT1  65536 1.5
N

Al igual que en los temporizadores anteriormente explicados los valores obtenidos deben ser
aproximados al valor inmediato superior correspondiente.

39
Capítulo 1. El microcontrolador ATmega32.

1.8.2.4. Modo de operación PWM.

Con el temporizador1 pueden obtenerse señales con resolución de hasta 16 bits y la frecuencia
de la señal PWM es completamente controlable. Este temporizador puede producir hasta dos
canales PWM, por los terminales OC1A y OC1B. Estos terminales deberán estar configurados
como salida para permitir la salida a dichas señales.

Este temporizador de 16 bits genera ondas PWM de forma similar a como lo hacen los de 8
bits, de manera que no hay cambios notables en el trabajo con los registros de control. La única
novedad es la aparición del nuevo registro de 16 bits ICR1, cuya función en modo PWM es
establecer el tope de conteo opcional.

La siguiente explicación está relacionada solo al canal A de este temporizador pero es también
aplicable al canal B del mismo.

El temporizador1 puede generar 3 tipos de ondas PWM según la forma en que avanza el
registro TCNT1. Cada una de estas tiene a su vez otras variantes dependiendo del valor tope
hasta donde puede contar el temporizador. Los modos en que el tope del conteo es el valor del
registro OCR1A suelen entorpecer la comprensión del modo PWM en este temporizador así
que no se mencionarán y se asumirá que el tope del temporizador1 puede ser de 0x00FF,
0x01FF, 0x03FF o el valor del registro ICR1.

• PWM rápido: Este modo se conoce también como PWM de pendiente única porque el
registro TCNT1 avanza siempre hacia arriba, es decir, cuenta desde 0 hasta un valor
tope (0x00FF, 0x01FF, 0x03FF o el valor del registro ICR1), después de lo cual se
resetea y vuelve a empezar desde 0 (figura 1.18).

40
Capítulo 1. El microcontrolador ATmega32.

Figura 1.18 – PWM rápido, diagrama de tiempo.

La figura 1.18 corresponde al modo PWM rápido que tiene al registro ICR1 como tope de
conteo por ser el caso más usual. Según la figura, esta onda es generada por la conmutación
del terminal OC1A cada vez que el registro TCNT1 llega al tope y cada vez que TCNT1 coincide
con el registro OCR1A. En la figura las coincidencias se señalan con pequeñas líneas
horizontales. Según la configuración de los bits COM1A1 y COM1A0 del registro TCCR1A, la
onda PWM puede ser invertida o no invertida.

Puesto que el temporizador1 puede contar hasta varios valores tope, se deduce que el período,
y por ende la frecuencia, de la onda PWM también serán variables. Esta flexibilidad lo distingue
del modo PWM de los temporizadores de 8 bits. También es posible modificar el valor del
registro OCR1A, lo cual nos permitirá controlar el ciclo útil de la onda PWM.

En la figura 1.19 se indican las ecuaciones necesarias para calcular el período y el ciclo útil de
una onda PWM rápida no-invertida. Recuérdese que el temporizador1 comparte el mismo pre-
escalador con el temporizador0, aunque ello no significa que tengan que trabajar con el mismo
factor.

41
Capítulo 1. El microcontrolador ATmega32.

Figura 1.19 – Período y ciclo útil de una onda PWM rápida no invertida.

Se observa que el ciclo útil puede ser del 100% si OCR1A es igual al valor tope de conteo, lo
cual significa que el estado del terminal OC1A será de uno lógico constante. En cambio, no hay
ningún valor para el registro OCR1A que proporcione un ciclo útil del 0%. Si el registro OCR1A
vale cero la salida será unos pequeños picos que representan un ciclo útil cercano al 0.0015%.

• PWM fase correcta: El modo PWM de Fase Correcta (figura 1.20) se conoce también
como PWM de doble pendiente porque el registro TCNT1 cuenta ascendente y
descendentemente, es decir, primero avanza desde 0 hasta el valor tope (0x00FF,
0x01FF, 0x03FF o el valor del registro ICR1), y después regresa desde el valor tope
hasta 0. Como se indica en la figura 1.20, la onda PWM de Fase Correcta es generada
por la conmutación del terminal OC1A cada vez que el registro TCNT1 coincide con el
registro OCR1A. En la gráfica las coincidencias se señalan con pequeñas líneas
horizontales. Según la configuración de los bits COM1A1 y COM1A0 del registro
TCCR1A, la onda PWM puede ser invertida o no invertida.

42
Capítulo 1. El microcontrolador ATmega32.

Figura 1.20 – PWM de fase correcta, diagrama de tiempo.

En la figura 1.21 se indican las ecuaciones necesarias para calcular el período y el ciclo útil de
una onda PWM de fase correcta no-invertida.

Figura 1.21 – Período y ciclo útil de una onda PWM de fase correcta no invertida.

• PWM de fase y frecuencia correctas: Este modo (figura 1.22) es igual al modo PWM
de Fase Correcta en cuanto al mecanismo de generación de la onda PWM y al cálculo
de su frecuencia y ciclo útil (todas las ecuaciones presentadas anteriormente son
también válidas en este modo), su diferencia radica en el momento en que se actualiza
el registro OCR1A.

43
Capítulo 1. El microcontrolador ATmega32.

Figura 1.22 – PWM de fase y frecuencia correcta, diagrama de tiempo.

Para comprender el concepto de actualización del registro OCR1A primero se debe saber que
en cualquiera de los modos PWM este registro trabaja con doble “buffer”, es decir, cuando se
escribe un dato en OCR1A en realidad se está enviando el dato a su “buffer”. Luego el dato
será transferido al verdadero registro OCR1A, justo cuando el registro TCNT1 llegue al valor
0x0000 o al valor tope, según el modo PWM. A dicha transferencia es que se hace referencia
cuando se habla de actualización del registro OCR1A. Recuérdese que este registro se usa
para controlar el ciclo útil de la onda PWM.

En el modo PWM de fase y frecuencia correctas el registro OCR1A se actualiza cuando el


registro TCNT1 llega a 0x0000. Si se observa detenidamente la figura 1.22, se verá que este
hecho permite que los pulsos de la onda PWM sean simétricos en todos sus períodos, sin
importar el momento en que cambia su ciclo útil. Por esta razón se llama de frecuencia correcta.

En todos los otros modos PWM el registro OCR1A se actualiza cuando el registro TCNT1
alcanza el valor tope. Si se observan las gráficas de pendiente de los modos PWM rápido y
PWM de fase correcta, se verá que esto producirá una onda cuyo ciclo útil cambia bruscamente
al modificar el registro OCR1A. Si se desea modificar el ciclo útil de la onda PWM, lo ideal sería
que ese cambio surtiera efecto a partir del siguiente período de la onda como ocurre en este
modo haciendo de ésta la única y muy importante característica que diferencia al modo PWM
de fase y frecuencia correctas del resto de modos PWM.

44
Capítulo 1. El microcontrolador ATmega32.

1.8.2.5. Registros del temporizador1

A continuación un mapa de bits de cada registro del temporizador y su descripción

• TCCR1A – Timer/Counter1 Control Register A

Bit 7 6 5 4 3 2 1 0
COM1A COM1A COM1B COM1B FOC1 FOC1 WGM1 WGM1
1 0 1 0 A B 1 0
Lectura/escritur R/W R/W R/W R/W W W R/W R/W
a (R/W)
Valor inicial 0 0 0 0 0 0 0 0

Bit 7:6 – COM1A1:0: Compare Output Mode for Compare unit A.

Bit 5:4 – COM1B1:0: Compare Output Mode for Compare unit B.

Los bits COM1A1:0 y COM1B1:0 controlan el comportamiento de los terminales Output


Compare (OC1A y OC1B, respectivamente). Cuando OC1A o OC1B está conectado al
terminal, la función de los bits COM1x1:0 depende de la configuración de los bits WGM13:0. La
tabla 1.15 muestra la funcionalidad de los bits COM1x1:0 cuando los bits WGM13:0 están
configurados en modo Normal o CTC.

COM1A1/COM1B1 COM1A0/COM1B0 Descripción


OC1A/OC1B desconectado. Operación
0 0
normal del terminal
0 1 OC1A/OC1B conmuta en Coincidencia
1 0 OC1A/OC1B se limpia en Coincidencia
1 1 OC1A/OC1B se pone a uno en Coincidencia

Tabla 1.15 – Configuración de los bits COM (modo normal o CTC)

La tabla 1.16 muestra la funcionalidad de los bits COM1A1:0 cuando los bits WGM13:0 están
configurados en modo PWM rápido.

45
Capítulo 1. El microcontrolador ATmega32.

COM1A1/COM1B1 COM1A0/COM1B0 Descripción


OC1A/OC1B desconectado. Operación normal del
0 0
terminal
WGM13:0 = 15: OC1A conmuta en coincidencia,
OC1B desconectado (operación normal de
0 1 terminal). Para las demás configuraciones de
WGM13:0, OC1A/OC1B desconectado (operación
normal de terminal).
OC1A/OC1B se limpia en la coincidencia, y se
1 0
pone a uno al llegar a 0x0000 (modo no-invertido)
OC1A/OC1B se pone a uno en la coincidencia, y
1 1
se limpia al llegar a 0x0000 (modo invertido)

Tabla 1.16 – Configuración de los bits COM (modo PWM rápido)

La siguiente tabla muestra la funcionalidad de los bits COM1A1:0 cuando los bits WGM13:0
están configurados en modo PWM de fase correcta o PWM de fase y frecuencia correctas.

COM1A1/COM1B1 COM1A0/COM1B0 Descripción


OC1A/OC1B desconectado. Operación normal del
0 0
terminal
WGM13:0 = 9 u 11: OC1A conmuta en
coincidencia, OC1B desconectado (operación
0 1 normal de terminal). Para las demás
configuraciones de WGM13:0, OC1A/OC1B
desconectado (operación normal de terminal).
OC1A/OC1B se limpia en la coincidencia cuando
1 0 se cuenta ascendentemente y se pone a uno en la
coincidencia cuando se cuenta descendentemente
OC1A/OC1B se pone a uno en la coincidencia
1 1 cuando se cuenta ascendentemente y limpia en la
coincidencia cuando se cuenta descendentemente

Tabla 1.17 – Configuración de los bits COM (PWM de fase correcta o PWM de fase y frecuencia
correcta).

Bit 3 – FOC1A: Force Output Compare for Compare Unit A

Bit 2 – FOC1B: Force Output Compare for Compare Unit B

Estos bits están activados solamente cuando los bits WGM13:0 especifican un modo que no
sea PWM. Para garantizar la compatibilidad con futuros dispositivos estos bits deben ser

46
Capítulo 1. El microcontrolador ATmega32.

puestos a cero cuando TCCR1A es escrito cuando se está operando en un modo PWM. Al
poner cualquiera de estos bits a uno inmediatamente se forzará una coincidencia en la unidad
de generación de forma de onda.

Bit 1:0 – WGM11:0: Waveform Generation Mode, estos bits se combinan con los bits
WGM13:2 del registro TCCR1B. Juntos controlan el modo de trabajo, es decir, la secuencia de
conteo del contador, el valor tope del conteo (TOP) y el tipo de la forma de onda que se
generará (tabla 1.18).

WGM12 WGM11 WGM10 Actualización Puesta a uno


Modo WGM13 Modo de operación TOP
(CTC) (PWM11) (PWM10) de OCR1x de TOV1
0 0 0 0 0 Normal 0xFFFF Inmediata MAX
PWM fase correcta,
1 0 0 0 1 0x00FF TOP BOTTOM
8 bit
PWM fase correcta,
2 0 0 1 0 0x01FF TOP BOTTOM
9 bit
PWM fase correcta,
3 0 0 1 1 0x03FF TOP BOTTOM
10 bit
4 0 1 0 0 CTC OCR1A Inmediata MAX
5 0 1 0 1 PWM rápido, 8 bit 0x00FF BOTTOM TOP
6 0 1 1 0 PWM rápido, 9 bit 0x01FF BOTTOM TOP
7 0 1 1 1 PWM rápido, 10 bit 0x03FF BOTTOM TOP
PWM fase y
8 1 0 0 0 ICR1 BOTTOM BOTTOM
frecuencia correcta
PWM fase y
9 1 0 0 1 OCR1A BOTTOM BOTTOM
frecuencia correcta
10 1 0 1 0 PWM fase correcta ICR1 TOP BOTTOM
11 1 0 1 1 PWM fase correcta OCR1A TOP BOTTOM
12 1 1 0 0 CTC ICR1 Inmediata MAX
13 1 1 0 1 Reservado - - -
14 1 1 1 0 PWM rápido ICR1 BOTTOM TOP
15 1 1 1 1 PWM rápido OCR1A BOTTOM TOP

Tabla 1.18 – Configuración de los bits WGM

• TCCR1B – Timer/Counter1 Control Register B:

Bit 7 6 5 4 3 2 1 0
ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10
Lectura/escritura (R/W) R/W R/W R R/W R/W R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

Bit 7 – ICNC1: Input Capture Noise Canceler, poniendo a uno en este bit activa el circuito
supresor de ruido. Cuando el supresor de ruido está activado, la entrada del terminal Input
Capture (ICP1) será filtrada. La función del filtro requiere de la igualdad de cuatro muestreos del

47
Capítulo 1. El microcontrolador ATmega32.

terminal ICP1 para cambiar su estado. Debido a esto, cuando el supresor de ruido está
habilitado, la unidad de captura se retrasa por cuatro ciclos del oscilador.

Bit 6 – ICES1: Input Capture Edge Select, este bit selecciona el flanco en el terminal Input
Capture (ICP1) que se usará para disparar el evento de captura. Cuando el bit ICES1 vale uno,
el disparo se dará en el flanco de bajada, y si vale cero, el disparo se dará en el flanco de
subida. Cuando se dispara una captura de acuerdo con la configuración del bit ICES1, el valor
del contador se copiará al registro Input Capture Register (ICR1). El evento también pondrá a
uno la bandera Input Capture (ICF1), y se puede usar para generar una Interrupción de captura
de entrada, si esta se encuentra habilitada. Cuando se usa como el tope de conteo el registro
ICR1, ICP1 queda desconectado y por tanto se deshabilita la función de captura.

Bit 5 – Bit Reservado, al escribir en TCCR1B, este bit se debe mantener en cero para asegurar
la compatibilidad con futuros dispositivos.

Bit 4:3 – WGM13:2: Waveform Generation Mode, ver tabla 1.18

Bit 2:0 – CS12:0: Clock Select, estos bits (tabla 1.19) seleccionan la fuente de reloj que usará
el contador. Si se usan los modos de terminal externo, las transiciones en el terminal T1 harán
de reloj en el temporizador incluso si está configurado como salida.

CS12 CS11 CS10 Descripción


0 0 0 Sin fuente de reloj (temporizador detenido)
0 0 1 fCPU (sin pre-escalador)
0 1 0 fCPU/8
0 1 1 fCPU/64
1 0 0 fCPU/256
1 0 1 fCPU/1024
Fuente de reloj externa en terminal T1
1 1 0
(temporizador avanza en flanco de caída)
Fuente de reloj externa en terminal T1
1 1 1
(temporizador avanza en flanco de subida)

Tabla 1.19 – Configuración de los bits CS

48
Capítulo 1. El microcontrolador ATmega32.

• TCNT1H y TCNT1L – Timer/Counter1 Register

Bit 7 6 5 4 3 2 1 0
TCNT1[15:8] TCNT1H

TCNT1[7:0] TCNT1L

Lectura/escritura (R/W) R/W R/W R/W R/W R/W R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

La modificación de TCNT1 cuando el contador está corriendo conlleva el riesgo de perder una
coincidencia entre los registros TCNT1 y OCR1A/OCR1B.

• OCR1AH y OCR1AL – Output Compare Register 1 A

Bit 7 6 5 4 3 2 1 0
OCR1A[15:8] OCR1AH

OCR1A[7:0] OCR1AL

Lectura/escritura (R/W) R/W R/W R/W R/W R/W R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

• OCR1BH y OCR1BL – Output Compare Register 1 B

Bit 7 6 5 4 3 2 1 0
OCR1B[15:8] OCR1BH

OCR1B[7:0] OCR1BL

Lectura/escritura (R/W) R/W R/W R/W R/W R/W R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

• ICR1H e ICR1L – Input Capture Register

Bit 7 6 5 4 3 2 1 0
ICR1[15:8] ICR1H

ICR1[7:0] ICR1L

Lectura/escritura (R/W) R/W R/W R/W R/W R/W R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

49
Capítulo 1. El microcontrolador ATmega32.

1.8.3. Registros comunes de los temporizadores en el ATmega32

• TIMSK – Timer/Counter Interrupt Mask

Bit 7 6 5 4 3 2 1 0
OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0
Lectura/escritura (R/W) R/W R/W R/W R/W R/W R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

Bit 7 – OCIE2: Timer/Counter2 Output Compare Match Interrupt Enable, cuando este bit y el
bit I del registro SREG están puestos a uno, la interrupción de coincidencia del temporizador2
está habilitada.

Bit 6 – TOIE2: Timer/Counter2 Overflow Interrupt Enable, cuando este bit y el bit I del
registro SREG están puestos a uno, la interrupción por desbordamiento del temporizador2 está
habilitada.

Bit 5 – TICIE1: Timer/Counter1 Input Capture Interrupt Enable, cuando este bit y el bit I del
registro SREG están puestos a uno, la interrupción de captura de entrada del temporizador1
está habilitada.

Bit 4 – OCIE1A: Timer/Counter1 Output Compare A Match Interrupt Enable, cuando este bit
y el bit I del registro SREG están puestos a uno, la interrupción de coincidencia A del
temporizador1 está habilitada.

Bit 3 – OCIE1B: Timer/Counter1 Output Compare B Match Interrupt Enable, cuando este bit
y el bit I del registro SREG están puestos a uno, la interrupción de coincidencia B del
temporizador1 está habilitada.

Bit 2 – TOIE1: Timer/Counter1 Overflow Interrupt Enable, cuando este bit y el bit I del
registro SREG están puestos a uno, la interrupción por desbordamiento del temporizador1 está
habilitada.

Bit 1 – OCIE0: Timer/Counter0 Output Compare Match Interrupt Enable, cuando este bit
está puesto a uno, la interrupción por coincidencia del temporizador0 está habilitada. La
interrupción correspondiente se ejecutará si ocurre un evento de coincidencia en el
temporizador0.

50
Capítulo 1. El microcontrolador ATmega32.

Bit 0 – TOIE0: Timer/Counter0 Overflow Interrupt Enable, cuando este bit y el bit I del
registro SREG están puestos a uno, la interrupción por desbordamiento del temporizador0 está
habilitada. La interrupción correspondiente se ejecutará si ocurre un desbordamiento en el
temporizador0.

• TIFR – Timer/Counter Interrupt Flag Register

Bit 7 6 5 4 3 2 1 0
OCF2 TOV2 ICF1 OCF1A OCF1B TOV1 OCF0 TOV0
Lectura/escritura (R/W) R/W R/W R/W R/W R/W R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

Bit 7 – OCF2: Output Compare Flag 2, Bit 6 – TOV2: Timer/Counter2 Overflow Flag, la
bandera se pone a uno cuando ocurre un desbordamiento del temporizador2.

Bit 5 – ICF1: Timer/Counter1 Input Capture Flag, la bandera se pone a uno cuando ocurre un
evento de captura en el terminal ICP1.

Bit 4 – OCF1A: Timer/Counter1 Output Compare A Match Flag, la bandera se pone a uno en
el ciclo de reloj posterior a que el valor de TCNT1 coincide con OCR1A.

Bit 3 – OCF1B: Timer/Counter1 Output Compare B Match Flag, la bandera se pone a uno en
el ciclo de reloj posterior a que el valor de TCNT1 coincide con OCR1B.

Bit 2 – TOV1: Timer/Counter1 Overflow Flag, la bandera se pone a uno en dependencia de


los bits WGM13:0. En modo Normal y CTC la bandera se pone a uno cuando ocurre un
desbordamiento del temporizador1.

Bit 1 – OCF0: Output Compare Flag 0, la bandera se pone a uno cuando ocurre una
coincidencia entre TCNT0 y OCR0.

Bit 0 – TOV0: Timer/Counter0 Overflow Flag, la bandera se pone a uno cuando ocurre un
desbordamiento del temporizador0.

51
Capítulo 1. El microcontrolador ATmega32.

1.9. Comparador analógico

El comparador analógico compara los valores de entrada en el terminal positivo AIN0 y el


terminal negativo AIN1. Cuando la tensión en el terminal positivo es mayor que la tensión en el
negativo, la salida del comparador, ACO, se pone a uno. La salida del comparador puede ser
utilizada para activar la función de captura de entrada del temporizador/contador1. Además el
comparador puede activar una interrupción propia. El usuario puede seleccionar la activación de
la interrupción por flanco de subida, caída o cambio lógico. En la figura 1.23 se muestra un
diagrama de bloque del comparador y su lógica.

Figura 1.23 – Diagrama de bloques del comparador analógico

1.9.1. Multiplexor de entradas del comparador análogo

Es posible seleccionar cualquiera de los terminales ADC7…0 para remplazar la entrada


negativa del comparador. El multiplexor del ADC es utilizado para seleccionar esta entrada; el
ADC debe estar apagado para utilizar esta característica. Si el bit de activación del multiplexor
del comparador (ACME en SFIOR) está puesto a uno y el ADC está apagado (ADEN en
ADCSRA es cero), MUX2…0 seleccionan el terminal de entrada para remplazar la entrada
negativa del comparador como se muestra en la tabla1.20. Si ACME está puesto a cero o
ADEN está puesto a uno, AIN1 es aplicado a la entrada negativa del comparador.

52
Capítulo 1. El microcontrolador ATmega32.

ACME ADEN MUX2…0 Entrada negativa del comparador analógico


0 x xxx AIN1
1 1 xxx AIN1
1 0 000 ADC0
1 0 001 ADC1
1 0 010 ADC2
1 0 011 ADC3
1 0 100 ADC4
1 0 101 ADC5
1 0 110 ADC6
1 0 111 ADC7

Tabla 1.20 – Entrada multiplexada del comparador analógico

1.9.2. Registros

• SFIOR – Special Function I/O Register

Bit 7 6 5 4 3 2 1 0
ADTS2 ADTS1 ADTS0 - ACME PUD PSR2 PSR10
Lectura/escritura (R/W) R/W R/W R/W R R/W R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

Bit 3 – ACME: Analog Comparator Multiplexer Enable, cuando este bit esta en uno lógico y
el ADC está apagado (ADEN en ADCSRA es cero), el multiplexor del ADC selecciona la
entrada negativa del comparador. Cuando este bit tiene un cero lógico AIN1 es aplicado a la
entrada negativa del comparador.

• ACSR – Analog Comparator Control and Status Register

Bit 7 6 5 4 3 2 1 0
ACD ACBG ACO ACI ACIE ACIC ACIS1 ACIS0
Lectura/escritura (R/W) R/W R/W R R/W R/W R/W R/W R/W
Valor inicial 0 0 N/A 0 0 0 0 0

Bit 7 – ACD: Analog Comparator Disable, cuando este bit está en uno lógico la alimentación
del comparador está desconectada. Este bit puede ser puesto a uno en cualquier momento para
desconectar el comparador, esto reduce el consumo de energía en los modos activo y ocioso.
Cuando se cambia el bit ACD la interrupción del comparador debe estar desactivada borrando
el bit ACIE en ACSR, sino puede ocurrir una interrupción cuando el bit sea cambiado.

53
Capítulo 1. El microcontrolador ATmega32.

Bit 6 – ACBG: Analog Comparator Bandgap Select, cuando este bit esta puesto a uno un
voltaje de referencia de “band-gap” fijo reemplaza la entrada positiva del comprador. Cuando
este bit esta en cero AIN0 es aplicado a la entrada positiva del comparador.

Bit 5 – ACO: Analog Comparator Output, la salida del comparador es sincronizada y luego
conectada directamente a ACO. La sincronización introduce un retardo de uno a dos ciclos de
reloj.

Bit 4 – ACI: Analog Comparator Interrupt Flag, este bit es puesto a uno por hardware cuando
a la salida del comparador ocurre un evento definido en ACIS1 y ACIS0 que activa la
interrupción. La rutina de interrupción del comparador es ejecutada si el bit ACIE está en 1 y el
bit I en SREG está en 1.

Bit 3 – ACIE: Analog Comparator Interrupt Enable, cuando este bit tiene un uno lógico y el bit
I en SREG está puesto a uno la interrupción del comparador está activada.

Bit 2 – ACIC: Analog Comparator Input Capture Enable, cuando este bit es puesto a uno
habilita que la función de captura de entrada del temporizador1 se activada por el comparador
analógico. La salida del comparador en este caso estará conectada directamente a la lógica de
la unidad de captura de entrada haciendo que el comparador utilice el supresor de ruido con el
que cuenta la interrupción de captura de entrada. Cuando está puesto a cero no existe conexión
entre el comparador y la función de captura de entrada.

Bits 1, 0 – ACIS1, ACIS0: Analog Comparator Interrupt Mode Select, estos bits determinan
que evento activará la interrupción del comparador. Las diferentes opciones se muestran en la
tabla 1.21.

ACIS1 ACIS0 Descripción


0 0 Interrupción por cambio lógico
0 1 Reservado
1 0 Interrupción por flanco de subida
1 1 Interrupción por flanco de bajada

Tabla 1.21 – Configuración de los bits ACIS1/ ACIS0

Para cambiar los bits ACIS1/ACIS0 la interrupción del comparador debe estar deshabilitada
borrando su bit de activación en el registro ACSR, de otra manera puede ocurrir una
interrupción cuando los bits sean cambiados.

54
Capítulo 1. El microcontrolador ATmega32.

1.10. Conversor análogo digital.

Las principales características del ADC son:

• 10 bits de resolución.
• 13 a 260µs de Tiempo de Conversión.
• Hasta 15,000 Muestras por segundo en su Máxima Resolución.
• 8 Canales de Entrada Multiplexados a una sola salida.
• 7 Canales de entrada diferenciales.
• Rango de tensión de entrada de 0 a VCC.
• Tensión de referencia seleccionable a 2.56V.
• Modo de conversión única o libre.
• Inicio de Conversión del ADC por Auto disparo con fuente de interrupción.
• Interrupción de Conversión Completa del ADC.
• Supresor de Ruido en Modo Sleep.

El Convertidor Analógico/Digital del ATmega32 es por aproximaciones sucesivas con una


resolución de 10 bits. El ADC se conecta a un multiplexor de 8 canales análogos accesibles en
los terminales del puerto A. Soporta 8 tensiones de entrada referidas a tierra o 16
combinaciones de tensiones de entrada diferenciales. Dos de las entradas diferenciales (ADC1,
ADC0 y ADC3, ADC2) están equipadas con una etapa de ganancia programable,
proporcionando pasos de amplificación de 0dB (1x), 20dB (10x), o 46dB (200x) en la tensión de
entrada diferencial antes de la conversión del A/D.

Siete canales de entrada diferenciales análogos comparten un terminal común negativo (ADC1),
mientras que cualquier otra entrada del ADC puede ser seleccionada como el terminal positivo
de entrada. Si se usa una ganancia de 1x o 10x se tendrá una resolución de 8 bits, si se usa
una ganancia de 200x se tendrá una resolución de 7 bits.

El ADC contiene un circuito de Muestreo y Retención (Sample & Hold) el cual asegura que la
tensión de entrada al ADC se mantenga constante durante la conversión. El diagrama de
bloques se muestra en la figura 1.24. El ADC tiene un terminal específico (AVCC) para la
tensión de alimentación. El AVCC no debe diferir más de ±0.3 V de VCC.

55
Capítulo 1. El microcontrolador ATmega32.

Figura 1.24 – Diagrama de bloques del ADC.

1.10.1. Operación del Módulo ADC.

El ADC puede desdoblar su operación en cuatro modos:

1. Conversiones normales de entrada única, donde el ADC convierte el valor de un canal,


cada vez que se ponga a 1 el bit ADSC.
2. Conversiones normales de entradas diferenciales, donde el ADC convierte la diferencia de
dos canales. La conversión se inicia poniendo a uno el bit ADSC.

56
Capítulo 1. El microcontrolador ATmega32.

3. Conversiones auto-disparadas de entrada única, donde el ADC convierte un canal cuando


se produzca alguno de los eventos seleccionados por los bits ADTS2, ADTS1 y ADTS0 en
el registro SFIOR, que puede ser, por ejemplo, el desbordamiento de un temporizador o
simplemente la activación de la bandera de interrupción propia del conversor (ADIF).
Este último caso es peculiar y se conoce como modo de conversiones de corrida libre, ya
que el ADC realiza conversiones sucesivas. La primera conversión se inicia poniendo a uno
el bit ADSC.
4. Conversiones auto-disparadas de entradas diferenciales. Es una combinación de los dos
modos anteriores.

Figura 1.25 – Señales para iniciar conversiones normales y auto-disparadas.

No hay una forma explícita de establecer cada uno de estos cuatro modos de operación del
ADC. Si la conversión será de entrada única o diferencial será resultado de configurar el
multiplexor del ADC con los bits MUX4...MUX0.

Si se desea iniciar una conversión auto-disparada debe colocarse a uno previamente el bit
ADATE del registro ADCSRA (figura 1.25). Las fuente de disparo se selecciona configurando
los bits ADTS2, ADTS1 y ADTS0 del registro SFIOR.

Las diferentes variantes se muestran en la tabla 1.22.

57
Capítulo 1. El microcontrolador ATmega32.

ADTS2 ADTS1 ADTS0 Fuente de disparo


0 0 0 Modo de Corrida Libre
0 0 1 Comparador Analógico
0 1 0 Interrupción Externa INT0
0 1 1 Coincidencia del Temporizador/Contador0
1 0 0 Desbordamiento del Temporizador/Contador0
1 0 1 Coincidencia B del Temporizador/Contador1
1 1 0 Desbordamiento del Temporizador/Contador1
1 1 1 Evento de Captura del Temporizador/Contador1

Tabla 1.22 – Selección de fuente de auto-disparo del ADC.

El ADC de los ATmega32 es bastante fácil de controlar si se le emplea en su modo habitual de


conversiones normales de entrada única. Tras configurar este modo, se escoge un canal a la
vez y se pone a uno el bit ADSC para iniciar la conversión. Después se espera a que este
mismo bit se limpie automáticamente por hardware como señal de que la conversión finalizó, de
lo contrario es posible trabajarlo por interrupciones.

El proceso descrito se puede desglosar en los siguientes pasos:

1. Seleccionar el reloj del conversor ADC, con los bits ADPS2:ADPS0.


2. Seleccionar las tensiones de referencia del conversor, usando los bits REFS1 y REFS0.
3. Establecer la justificación del resultado con el bit ADLAR.
4. Seleccionar el canal o los canales de entrada del ADC, con los bits MUX4:MUX0.
5. Encender el módulo ADC, poniendo a uno el bit ADEN.
6. Iniciar la conversión, poniendo a uno el bit ADSC.
7. Esperar a que termine la conversión. Cuando esto pase la bandera ADIF se pondrá a
uno y si la conversión es normal el bit ADSC se limpiará automáticamente.
8. Leer el resultado de la conversión del par de registros ADCH: ADCL.

Los pasos 2 al 5 (que están relacionados con el registro ADMUX) no necesariamente tienen
que ir en ese orden de hecho se pueden juntar todos en un solo paso. Esto es porque el
registro ADMUX trabaja con un buffer de respaldo el cual es actualizado continuamente para
asegurar un buen trabajo del ADC. Esto es, cuando se escribe en ADMUX en realidad se
escribe en su “buffer”, el cual se copia continuamente al registro ADMUX hasta que se inicia la
conversión. En ese momento el copiado continuo se detiene y se reanudará cuando termine la
conversión. De ese modo se evitan los resultados incorrectos de lo que sería un mal uso del
registro ADMUX.

58
Capítulo 1. El microcontrolador ATmega32.

1.10.2. Selección del Canal de Conversión.

Las 8 entradas analógicas del ADC son los terminales del puerto A. El ADC solo puede tomar
una o dos entradas analógicas por conversión, así que cada vez que se desee obtener un valor
analógico externo se debe seleccionar previamente dicha entrada analógica mediante los bits
MUX4, MUX3, MUX2, MUX1 y MUX0 del registro ADMUX. La tabla 1.23 muestra todas las
opciones posibles que se pueden obtener.

Obsérvese en primer lugar que la tabla 1.23 se puede separar en tres secciones. La primera
parte corresponde al denominado modo de conversión simple o de entrada única, la segunda
parte es del modo de conversión diferencial y en la tercera parte no se elige ningún canal
analógico sino que se convierte el valor de la tensión VBG o GND.

MUX4:MUX0 Entrada Única Entrada Diferencial Positiva Entrada Diferencial Negativa Ganancia
00000 ADC0
00001 ADC1
00010 ADC2
00011 ADC3
N/A
00100 ADC4
00101 ADC5
00110 ADC6
00111 ADC7
01000 ADC0 ADC0 10x
01001 ADC1 ADC0 10x
01010 ADC0 ADC0 200x
01011 ADC1 ADC0 200x
01100 ADC2 ADC2 10x
01101 ADC3 ADC2 10x
01110 ADC2 ADC2 200x
01111 ADC3 ADC2 200x
10000 ADC0 ADC1 1x
10001 ADC1 ADC1 1x
10010 ADC2 ADC1 1x
N/A
10011 ADC3 ADC1 1x
10100 ADC4 ADC1 1x
10101 ADC5 ADC1 1x
10110 ADC6 ADC1 1x
10111 ADC7 ADC1 1x
11000 ADC0 ADC2 1x
11001 ADC1 ADC2 1x
11010 ADC2 ADC2 1x
11011 ADC3 ADC2 1x
11100 ADC4 ADC2 1x
11101 ADC5 ADC2 1x
11110 2.56V (VBG)
N/A
11111 0 V (GND)

Tabla 1.23 – Selección del canal de entrada y la ganancia.

59
Capítulo 1. El microcontrolador ATmega32.

El modo de conversión de entrada única es el que se emplea en la gran mayoría de las


aplicaciones. Aquí los bits del multiplexor MUX4 y MUX3 valen 0 y el ADC solo puede convertir
una de las 8 entradas analógicas a la vez. El diagrama funcional del ADC en este caso se
muestra en la figura 1.26.

Figura 1.26 – Diagrama básico del ADC para conversiones de entrada única.

En el modo de conversión diferencial las entradas analógicas se agrupan de a dos. Cada par
está constituido por una entrada diferencial positiva y una entrada diferencial negativa. Se
puede observar en la figura 1.27 que en este modo interviene además un amplificador de
ganancia que puede multiplicar la diferencia entre las entradas por un factor de 1x, 10x o 200x
antes de ser convertido a su valor analógico. El inconveniente del amplificador es que reduce la
resolución del ADC a 8 bits si se usa la ganancia de 1x o 10x y hasta a 7 bits con la ganancia
de 200x.

Figura 1.27 – Diagrama básico del ADC para conversiones de entradas diferenciales.

60
Capítulo 1. El microcontrolador ATmega32.

Finalmente, hay dos combinaciones de los bits MUX4:MUX0 que hacen que el valor analógico a
convertir sea la señal de tierra GND o una tensión de referencia denominada VBG (figura 1.28).

Figura 1.28 – Conversión de las tensiones de referencia GND y Band-gap.

1.10.3. Las tensiones de referencia

Son los valores analógicos límites entre los que deberá estar comprendida la tensión analógica
a convertir. El nivel superior se representa por Vref+ y el inferior por Vref-.

El valor de Vref- es igual al negativo de Vref+ cuando el ADC realiza conversiones diferenciales
y es igual a 0V en los demás casos.

En cualquier modo de operación Vref+ se puede configurar por los bits REFS1 y REFS0 (tabla
1.24), del registro ADMUX y es posible seleccionar una de estas tres opciones:

• El valor del terminal AVCC


• El valor del terminal AREF
• Una tensión de referencia interna (2.56 V) que provee el ATmega32.

REFS1 REFS0 Selección de la tensión de referencia


0 0 Terminal AREF, VREF apagada.
0 1 Terminal AVCC con capacitor externo en el terminal AREF
1 0 Reservado
Tensión de referencia interna de 2.56V con capacitor externo en el terminal
1 1
AREF

Tabla 1.24 – Selección de tensiones de referencia en el ADC.

61
Capítulo 1. El microcontrolador ATmega32.

Si los bits REFS1:REFS0 eligen como tensión de referencia Vref+ al terminal AVCC, el terminal
AREF queda internamente conectado a AVCC, es recomendable colocarle un capacitor para
filtrar ruido (figura 1.29).

Figura 1.29 – Tensión de referencia por conexión interna por AVCC.

Si los bits REFS1:REFS0 eligen como tensión de referencia Vref+ al terminal AREF, se puede
conectar a ese terminal cualquier fuente de tensión, siempre que no supere el valor de la
alimentación VCC y en caso de que se trabaje con canales diferenciales no debe ser menor de
2 V.

Si se aplica una fuente de tensión en el terminal AREF y los bits REF1 y REF0 seleccionan una
referencia diferente, entonces se producirá un corto-circuito interno entre AREF y la referencia
seleccionada.

Los bits REFS1:REFS0 también pueden elegir como Vref+ a la tensión de referencia interna
que provee el ATmega32. También en este caso la referencia se verá reflejada por el terminal
AREF, de modo que se debe conectar un capacitor de estabilización.

Suponiendo que se trabaja con conversiones de entrada única, esto es, Vref- conectado a
tierra, entonces una entrada analógica igual a 0V o inferior se convertirá en 0x000 y las
tensiones analógicas iguales a Vref+ o superiores se convertirán en el valor digital 0x3FF.
Cualquier otro valor analógico de entrada (Vin) comprendido entre estos límites estará sujeto a
la ecuación 1.6.

1024
Valor digital  ∙ V 1.6
V0123 4(

62
Capítulo 1. El microcontrolador ATmega32.

Por otro lado, si el ADC realiza conversiones diferenciales, entonces la máxima diferencia
positiva o negativa que se podrá convertir correctamente (VinD) queda determinada por la
ecuación 1.7:

V0123
5678  )/  1.7
ganancia

De acuerdo con esto, la máxima diferencia negativa corresponderá al valor digital 0x200 = -512
y la máxima diferencia positiva se convertirá en 0x1FF = +511. Cualquier otra diferencia
analógica interpolada se podrá calcular con la expresión 1.8:

1024
Valor digital  ;V V(1? @ ∙ ganancia 1.8
2 ∙ V0123 <=>

Donde:

• Vpos: Tensión en la entrada diferencial positiva.


• Vneg: Tensión en la entrada diferencial negativa.

La primera conversión después de cambiar las tensiones de referencia es imprecisa y se


recomienda descartarla.

1.10.4. Resultado de la Conversión.

El resultado de la conversión es una cantidad binaria de 10 bits que se deposita entre los
registros ADCH y ADCL y queda justificado de acuerdo con el bit ADLAR (ADC Left Adjust
Result) del registro ADMUX como se muestra en la figura 1.30.

Figura 1.30 – Justificación del resultado entre los registros ADCH y ADCL.

63
Capítulo 1. El microcontrolador ATmega32.

Los registros ADCH y ADCL son de solo lectura. Después de leer el registro ADCL queda
bloqueada la actualización de los otros registros del ADC hasta que se lea el registro ADCH. De
este modo se asegura que los datos presentes en estos registros corresponden a una misma
conversión. De aquí se desprende que al terminar una conversión se debe empezar por leer
ADCL y luego ADCH, o simplemente si el resultado es ajustado a la izquierda y no se requiere
una precisión mayor de 8 bits se puede tomar el valor de ADCH.

1.10.5. Reloj del ADC y Tiempo de Conversión.

Como todo circuito síncrono, el conversor ADC necesita de una señal de reloj para dirigir los
pasos de su algoritmo de aproximaciones sucesivas. Este reloj deriva del oscilador del sistema.
La frecuencia del reloj del ADC dependerá de la resolución del resultado que se desee obtener.
Por ejemplo, si se va a trabajar con los 10 bits de resolución, entonces se requerirá de un reloj
cuya frecuencia esté entre 50 kHz y 200 kHz. Si se requiere de una resolución menor de 10 bits,
el reloj del ADC puede superar los 200 kHz.

El reloj del ADC pasa por un pre-escalador programable que permite disminuir su valor de
frecuencia. Los factores de división se establecen por los bits ADPS2, ADPS1 y ADPS0, del
registro ADCSRA (tabla 1.25).

ADPS2 ADPS1 ADPS0 Factor de División


0 0 0 2
0 0 1 2
0 1 0 4
0 1 1 8
1 0 0 16
1 0 1 32
1 1 0 64
1 1 1 128

Tabla 1.25 – Selección del pre-escalador.

A modo de ejemplo se analizará los valores de ADPS1, ADPS1 y ADPS0 que se podrían usar
suponiendo que se trabaja con un cristal de 14.7456 MHz.

Si ADPS2:ADPS0 = 111b, el reloj del ADC tendrá una frecuencia de 14.7456 MHz/128 = 115.2
kHz, valor suficiente para conseguir resultados fiables de 10 bits. Sin embargo, si se escoge el
factor de 32, con ADPS2:ADPS0 = 101b, el ADC operará a 14.7456 MHz/32 = 460.8 kHz, que
es una frecuencia superior a los 200 kHz que no garantiza una buena conversión, de modo que

64
Capítulo 1. El microcontrolador ATmega32.

debería evitase, a menos tal vez que solo interesen los 8 bits más significativos del resultado.
En este ejemplo, los factores de pre-escalador inferiores a 32 conllevarán a una operación del
ADC deficiente e inaceptable.

La tabla 1.26 muestra los tiempos que requieren cada tipo de conversión.

Muestreo y retención
Tiempo de Conversión
Tipo de Conversión (Ciclos desde el inicio de
(Ciclos)
la conversión)
Primera conversión 13.5 25
Conversiones Normales
1.5 13
(entrada única)
Conversiones Normales
1.5/2.5 13/14
(entrada diferencial)
Conversiones auto-disparadas 2 13.5

Tabla 1.26 – Tiempo de conversión del ADC.

La primera conversión en cualquier modo es la que se ejecuta después de habilitar el ADC,


poniendo a uno el bit ADEN; siempre demora más debido a que se debe inicializar el circuito
analógico del ADC.

Los ciclos de muestreo y retención se cuentan a partir del momento en que se inicia la
conversión, o sea, después de poner a uno el bit ADSC, del registro ADCSRA. Para
comprender esto se debe saber que el ADC no capta la señal a convertir directamente del
terminal, sino que primero espera que dicho nivel de tensión se deposite en el capacitor de
muestreo y retención CS/H, para luego iniciar la conversión desde allí (figura 1.32).

El tiempo que demora este capacitor en cargarse se denomina período de muestreo y retención
o tiempo de adquisición. Éste varía principalmente de acuerdo con la impedancia Re del circuito
externo al canal del ADC. El ADC del AVR está optimizado para acoplarse a impedancias de 10
kΩ o inferiores.

65
Capítulo 1. El microcontrolador ATmega32.

Figura 1.37 – Circuito de entrada del ADC.

Junto con su resolución, el tiempo de conversión es el parámetro más importante de un ADC.


Para fines prácticos éste se calcula como la suma del tiempo de conversión en sí más el tiempo
de adquisición. Por ejemplo, las conversiones normales de entrada única, que son las más
usadas, demoran 13+1.5 = 14.5 ciclos. Si el ADC trabajara a su máxima frecuencia
recomendada de 200 kHz, la conversión tomará 14,5/200 kHz = 72,5µs. En un segundo se
podrán realizar hasta 1/72.5µs = 13793 conversiones aproximadamente 14 kSPS (kilo Samples
Per Second).

1.10.6. Registros del ADC

• ADCSRA – ADC Control and Status Register A: Es el principal registro de control y


estado del ADC.

Bit 7 6 5 4 3 2 1 0
ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0
Lectura/escritura (R/W) R/W R/W R/W R/W R/W R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

Bit 7 – ADEN: ADC Enable, escribiendo uno en este bit habilita el ADC. Si se apaga el ADC
cuando hay una conversión en progreso, se interrumpirá y terminará dicha conversión.

Bit 6 – ADSC :ADC Start Conversion, en modo de conversión normal escribir uno en este bit
iniciará una conversión. En modo de conversiones auto-disparadas, escribir uno en este bit
iniciará la primera conversión. ADSC se leerá como uno mientras la conversión esté en

66
Capítulo 1. El microcontrolador ATmega32.

progreso. Al terminar la conversión este bit retornará a cero. Escribir cero en este bit no tiene
efecto.

Bit 5 – ADATE: ADC Auto Trigger Enable, cuando se escribe uno en este bit se habilitan las
conversiones automáticas. El ADC iniciará una conversión en el flanco positivo de la señal de
disparo seleccionada. La fuente de disparo se selecciona por los bits ADTS en el registro
SFIOR.

Bit 4 – ADIF: ADC Interrupt Flag, este bit se pone a uno cuando termina una conversión y se
actualizan los registros de datos. La interrupción de conversión del ADC completada se ejecuta
cuando sean uno los bits ADIE e I. Obsérvese que ejecutar una instrucción de lectura-
modificación-escritura en ADCSRA puede deshabilitar una interrupción pendiente. Esto también
se aplica cuando se usan las instrucciones sbi y cbi.

Bit 3 – ADIE: ADC Interrupt Enable, cuando se escribe uno en este bit y el bit I vale uno se
activa la interrupción de conversión del ADC completada.

Bits 2:0 – ADPS2:0: ADC Prescaler Select Bits, estos bits determinan el factor de división
entre la frecuencia del cristal y el reloj de entrada del ADC.

• ADCH y ADCL – The ADC Data Register: Son los registros que almacenan el resultado
de la conversión. La forma en que se distribuyen se debe especificar con el bit ADLAR del
registro ADMUX. Para cuestiones de programación estos registros se fusionan para formar
un único registro de 16 bits normalmente llamado ADC o ADCW.

Si ADLAR = 0

Bit 15 14 13 12 11 10 9 8
- - - - - - ADC9 ADC8 ADCH
ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0 ADCL
7 6 5 4 3 2 1 0
Lectura/escritura (R/W) R R R R R R R R
R R R R R R R R
Valor inicial 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

67
Capítulo 1. El microcontrolador ATmega32.

Si ADLAR = 1

Bit 15 14 13 12 11 10 9 8
ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADCH
ADC1 ADC0 - - - - - - ADCL
7 6 5 4 3 2 1 0
Lectura/escritura (R/W) R R R R R R R R
R R R R R R R R
Valor inicial 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

• ADMUX – ADC Multiplexer Selection Register: Es el registro que selecciona el canal de


conversión y establece las tensiones de referencia.

Bit 7 6 5 4 3 2 1 0
REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0
Lectura/escritura (R/W) R/W R/W R/W R/W R/W R/W R/W R/W
Valor inicial 0 0 0 0 0 0 0 0

Bits 7:6 – REFS1:0: Reference Selection Bits, estos bits seleccionan las tensiones de
referencia del ADC. Si estos se cambian durante una conversión, el cambio no tendrá efecto
hasta que termine dicha conversión (hasta que se ponga a uno la bandera ADIF en ADCSRA).
Si se usa una tensión de referencia aplicada al terminal AREF, no se podrán usar las opciones
de tensión de referencia internas.

Si se seleccionan canales diferenciales, solo se podrá usar 2.56V como tensión de referencia
interna.

Bit 5 – ADLAR: ADC Left Adjust Result, afecta la representación del resultado de la
conversión en los registros de datos del ADC. Al escribir uno en ADLAR el resultado
se justificará a la izquierda, de otro modo, el resultado se justifica a la derecha. El cambio del
bit ADLAR afectará inmediatamente los registros de datos del ADC, sin importar si hay
conversiones en curso.

Bits 4:0 – MUX4:0: Analog Channel and Gain Selection Bits, el valor de estos bits selecciona
la combinación de las entradas analógicas que se conectan al ADC. Estos bits también
seleccionan la ganancia de los canales diferenciales. Si se cambian estos bits durante una
conversión, el cambio no tendrá efecto hasta que se complete la conversión en curso (hasta
que el bit ADIF de ADCSRA se ponga a uno).

68
Capítulo 2. Módulo EI_STEP y herramienta de desarrollo.

Capı́tulo 2. Mó dulo EI_STEP y


herramientas de desarrollo.
Para el trabajo práctico de los estudiantes con los microcontroladores de la familia AVR se
dispone de una tarjeta que fue bautizada por sus diseñadores como Módulo EI_STEP que
contiene un ATmega32.

Los microcontroladores de la familia AVR tienen como soporte el software AVR Studio que
permite la programación en lenguaje ensamblador y C del microcontrolador AVR de Atmel. Está
compuesto por un administrador de proyecto, un editor y un depurador (debugger) que puede
ser usado con el simulador integrado, con un adaptador JTAG o con un emulador.

Se hace necesario incluir el paquete WinAVR para la programación tanto en lenguaje C


(compiladores Open Source avr-gcc) como en ensamblador. Este paquete contiene, además de
los compiladores GCC (cross compiler), un editor, bibliotecas estándares, etc.

Una amplia gama de estos dispositivos están disponibles en el software Proteus de Labcenter
Electronics

2.1. Módulo EI_STEP

El módulo EI_STEP cuenta con 2 microcontroladores, un PIC-18F14K50 que se encarga


únicamente de la comunicación USB con el ordenador para transferir la información vía serie a
un ATmega32 con un cristal de 14,7456 MHz (circuito en la figura 2.2) que constituye el
elemento fundamental ya que es el encargado de almacenar y ejecutar el programa.

En la figura 2.1 se muestran diferentes vistas de la disposición de los componentes en el


módulo EI_STEP y en la figura 2.2 su correspondiente circuito electrónico.

69
Capítulo 2. Módulo EI_STEP y herramienta de desarrollo.

Figura 2.1 – Módulo EI_STEP.

Figura 2.2 – Circuito electrónico del módulo EI_STEP.

Siempre que se trabaje el módulo EI_STEP con un microcontrolador que tenga programado el
cargador de programa (boot-loader) es indispensable el uso del AVR Studio para la
transferencia del programa de aplicación.

Para establecer la comunicación entre el AVR Studio y el módulo debe ser instalado el
controlador USB.

70
Capítulo 2. Módulo EI_STEP y herramienta de desarrollo.

2.2. Instalación del controlador USB

Primeramente conecte el módulo EI_STEP a su ordenador. A continuación haga clic en Inicio →


clic derecho en Equipo → Administrar. Hecho esto debe aparecer una ventana como la que se
muestra en la figura 2.3

Haga clic en administración de dispositivos (número 1), a continuación haga doble clic en el
módulo EI_STEP que es reconocido por el ordenador como AT32 USB PROGRAMMER
(número 2) y para finalizar haga clic en el botón Update Driver (número 3).

Figura 2.3 – Ventana de administración de los dispositivos del ordenador.

Al presionar el botón aparecerá el cuadro de diálogo mostrado en la figura 2.4. Seleccione la


opción resaltada que indica que localizará e instalará el controlador necesario de forma manual.

71
Capítulo 2. Módulo EI_STEP y herramienta de desarrollo.

Figura 2.4 – Cuadro de diálogo para actualización del controlador.

Inmediatamente aparecerá la ventana mostrada en la figura 2.5 que le permitirá ubicar la


carpeta en la que se encuentra el controlador del módulo EI_STEP con tan solo presionar el
botón resaltado. Una vez localizada la carpeta haga clic en el botón Next para que comience el
proceso de instalación del controlador

Figura 2.5 – Cuadro de diálogo para actualización del controlador.

72
Capítulo 2. Módulo EI_STEP y herramienta de desarrollo.

2.3. Principios básicos del AVR Studio

A continuación se describirá como escribir, compilar y ejecutar un programa en AVR Studio.


Para una información más detallada puede referirse a la ayuda del propio programa. [2]

2.3.1. Crear un nuevo proyecto

Los pasos para crear un proyecto nuevo y poder escribir el código del programa se detallan a
continuación. Una vez iniciado AVR STUDIO aparece un asistente para creación o apertura de
un nuevo proyecto tal y como se muestra en la figura 2.6.

Figura 2.6 – Ventana de bienvenida.

Seleccione la opción iniciar un nuevo proyecto y aparecerá el cuadro de diálogo mostrado en la


figura 2.7.

73
Capítulo 2. Módulo EI_STEP y herramienta de desarrollo.

Figura 2.7 – Creación de un nuevo proyecto en AVR Studio.

Inicialmente en la parte izquierda de la pantalla (Project type) se debe seleccionar, si se quiere


escribir el código del programa en lenguaje ensamblador, la opción Atmel AVR Assembler y en
caso de que se quiera trabajar en lenguaje C la opción AVR GCC. A continuación escriba el
nombre de su programa, determine donde será guardado su proyecto y presione el botón
siguiente. En la última ventana del asistente (figura 2.8) se seleccionan las opciones AVR
Simulator y el microcontrolador a utilizar.

Figura 2.8 – Selección del microcontrolador y la plataforma de depuración.

74
Capítulo 2. Módulo EI_STEP y herramienta de desarrollo.

2.3.2. Código de programa

A continuación se detalla como utilizar el AVR Studio para compilar y depurar errores. Se
utilizará un ejemplo de un código de programa (figura 2.9) que consiste en cargar 3 números en
3 registros diferentes (instrucción LDI) y sumarlos entre sí (instrucción ADD)1.

Figura 2.9 – Ejemplo de código de programa.

2.3.3. Compilación del programa

El simulador disponible en el AVR Studio permite generar el fichero hexadecimal a grabar en la


memoria del microcontrolador y corregir errores tanto de sintaxis como de concepción en el
diseño del programa. Para esto se puede presionar F7 o, como se muestra en la figura 2.10,
seleccionar la opción Build del menú con el mismo nombre o mediante el icono en la barra de
herramientas.

1
El set de instrucciones del microcontrolador ATmega32 se encuentra en el Anexo #3.

75
Capítulo 2. Módulo EI_STEP y herramienta de desarrollo.

Figura 2.10 – Menú Build.

En la pestaña Build (parte inferior izquierda de la pantalla) se muestra si su programa tiene


algún error de código, la cantidad de memoria que usa, etc.

2.3.4. Depuración del código de programa (debugging)

Seleccione la opción Start Debugging en el menú Debug (figura 2.11), al hacerlo aparecerá
una flecha amarilla a un lado de la primera instrucción del código de programa lo cual indica que
la siguiente instrucción será ejecutada. Otra posibilidad es la opción de compilar-ejecutar

76
Capítulo 2. Módulo EI_STEP y herramienta de desarrollo.

Figura 2.11 – Depuración del programa.

2.3.5. Corrida del programa

Es posible utilizar diferentes opciones para ejecutar y comprobar el correcto funcionamiento del
programa (figura 2.12). Entre ellas están:

• Step Into: Corrida paso a paso de la totalidad del programa.


• Step Over: Ejecuta la siguiente instrucción como Step Into. La única diferencia entre
ellas es que, si la siguiente instrucción es la “llamada” a una función, Step Over ejecuta
la misma completamente y va a la siguiente instrucción.
• Step Out: Si se está dentro de una función, esta opción ejecuta el programa hasta el
final de la misma.
• Auto Step: Corrida libre del programa con un paso predeterminado por el software.

77
Capítulo 2. Módulo EI_STEP y herramienta de desarrollo.

Figura 2.12 – Herramientas de corrida del programa.

2.3.6. Visualización del funcionamiento del programa

En la figura 2.13 se encuentran marcados con números (del 1 al 6) diferentes herramientas que
pueden ser utilizadas para analizar el funcionamiento del programa. A continuación una breve
descripción de cada una de ellas:

78
Capítulo 2. Módulo EI_STEP y herramienta de desarrollo.

Figura 2.13 – AVR Studio.

• Processor (número 1): Muestra el contenido de los registros relacionados con la CPU:
registros de propósito general (R0 al R31), PC, SP, SREG, registros X, Y y Z. Cycle
Counter cuenta la cantidad de ciclos de máquina y Stop Watch muestra el tiempo
transcurrido. Se pueden usar estos parámetros para medir el tiempo de ejecución del
programa. Pueden resetearse dando click derecho en ellos y seleccionando reset.
• I/O view (número 2): En esta ventana se puede observar el valor de los distintos
registros E/S.

• Watch (icono marcado con el


número 3): En esta ventana
(figura 2.14) se puede observar
el valor de diferentes variables.
Haga doble clic en la primera
casilla debajo de Name, escriba
por ejemplo R20 y presione
Enter; se mostrará el valor de
dicho registro y se podrá ir Figura 2.14 – Ventana Watch.
observando los cambios que
ocurran en él.
79
Capítulo 2. Módulo EI_STEP y herramienta de desarrollo.

• Register (icono marcado con el número 4): Se muestra el contenido de todos los
registros de propósito general.
• Memory (icono marcado con el número 5): En esta ventana (figura 2.15) se observa el
contenido de diferentes localizaciones de memoria. Se puede escoger que memoria se
desea mostrar en el menú desplegable localizado en la esquina superior izquierda:
- Data: Memoria SRAM
- EEPROM: EEPROM
- I/O: Registros E/S
- Program: Memoria Flash
- Register: Registros de propósito general

Figura 2.15 – Ventana Memory.

• Disassembler (icono marcado con el número 6): Esta ventana (figura 2.16) muestra el
contenido de la memoria flash.

Figura 2.16 – Ventana Disassembler.

1) El texto en negro es el programa.

80
Capítulo 2. Módulo EI_STEP y herramienta de desarrollo.

2) Debajo de cada instrucción del programa se muestra su equivalente en lenguaje


ensamblador. Como el programa de ejemplo está en este lenguaje, las instrucciones y
sus equivalentes son los mismos.
3) Los números grises en el medio de las líneas representan el código de máquina de
cada instrucción.
4) La última columna describe la función de la instrucción.
5) La primera columna indica en que localización de la memoria flash está situada cada
instrucción.
6) La flecha amarilla apunta a la siguiente instrucción a ejecutar.

2.3.7. Ayuda del AVR Studio

Por su importancia se destacan dos de las opciones accesibles en el menú de Ayuda (figura
2.17).

Figura 2.17 – Menú Ayuda.

1) AVR Studio User Guide: Describe en detalle cómo usar el AVR Studio.
2) Assembler Help: Describe las diferentes instrucciones disponibles en cada dispositivo
AVR así como sus directivas. Una breve descripción de las principales directivas pueden
ser encontradas en el anexo # 3

81
Capítulo 2. Módulo EI_STEP y herramienta de desarrollo.

2.4. Programación del módulo EI_STEP (con boot-loader instalado)

A continuación se detalla el proceso de transferencia del fichero *.hex al microcontrolador:

1. Conecte el módulo EI_STEP al puerto USB del ordenador y ejecute el AVR Studio.
2. Haga clic en el icono Display the ‘Connect’ Dialog en la barra de herramientas (figura
2.18, icono marcado con el número 1), seleccione la plataforma que va a utilizar, en este
caso será STK500 (número 2) y seleccione el puerto en el que ha conectado el módulo
(número 3).
3. Haga clic en el botón Connect (número 4) e inmediatamente presione el botón de
reset del módulo para efectuar la conexión.

Figura 2.18 – Conexión del módulo EI_STEP al ordenador

4. Una vez hecha la conexión aparecerá un cuadro de diálogo (figura 2.19) proponiendo
realizar una actualización del “firmware” del módulo EI_STEP. Haga clic en cancelar.

82
Capítulo 2. Módulo EI_STEP y herramienta de desarrollo.

Figura 2.19 – Solicitud de actualización del firmware

5. Automáticamente se muestra una ventana para iniciar la transferencia del programa al


microcontrolador (figura 2.20). Como primer ajuste se debe seleccionar el modo de
programación a emplear, en este caso el modo PP/HVSP (área resaltada). Esta opción
está disponible en la pestaña Main.

Figura 2.20 – Pestaña Main de la ventana de transferencia del programa.

En la pestaña Program (figura 2.21) haga clic en el botón marcado con el número 1 para
localizar su programa (archivo con extensión *.HEX). Una vez seleccionado haga clic en el
botón Program (número 2) para transferirlo al microcontrolador. Si la transferencia se realiza
correctamente, en la parte inferior de la ventana se muestra un mensaje indicándolo. Para
verificar que el dispositivo fue programado correctamente haga clic en el botón Verify (número
3).

83
Capítulo 2. Módulo EI_STEP y herramienta de desarrollo.

Figura 2.21 – Pestaña Program de la ventana transferencia del programa.

2.5. Programando módulo EI_STEP con ISP (In System Programming)

Las figuras 2.22 y 2.23 muestran respectivamente la vista superior de un conector ISP
destacando cada uno de sus terminales y un esquema del microcontrolador ATmega32
resaltando donde es que deben ser conectados los mismos (terminales del 6 al 11).

Figura 2.22 – Conector ISP.

84
Capítulo 2. Módulo EI_STEP y herramienta de desarrollo.

Figura 2.23 – Terminales para la programación ISP.

La figura 2.24 muestra la conexión del programador AVRISP mkII con un microcontrolador de la
familia AVR.

Figura 2.24 – Programación del Microcontrolador ATmega32 utilizando el programador AVRISP


mkII.

El proceso para programar con ISP es muy similar al descrito en el epígrafe anterior. Las
diferencias radican en:

• La selección de la plataforma (figura 2.18), se deberá seleccionar cualquiera de los


programadores ISP (por ejemplo AVRISP mkII, AVR Dragon, etc.).

85
Capítulo 2. Módulo EI_STEP y herramienta de desarrollo.

• En la pestaña Main de la ventana de transferencia del programa (figura 2.20) seleccionar


modo de programación ISP.
2.6. Vinculación del AVR Studio con Proteus

El AVR Studio cuenta con una opción que permite visualizar un circuito creado utilizando
Proteus. Esta opción puede ser activada en el menú Tools → Plug-in Manager. En el cuadro
de diálogo que se muestra en la figura 2.25 se selecciona la opción Proteus VSM Viewer, se
salvan los cambios y a continuación se debe reiniciar el AVR Studio.

Figura 2.25 – Habilitación de la opción Proteus VSM Viewer.

Para visualizar el circuito creado en Proteus se deberá ir al menú Debug → Select Platform
and Device… y seleccionar como plataforma Proteus VSM Viewer y como dispositivo el
ATmega32 (figura 2.26). En la figura 2.27 se muestra el AVR Studio con la pantalla de Proteus
activada.

Figura 2.26 – Selección de la plataforma de depuración Proteus.

86
Capítulo 2. Módulo EI_STEP y herramienta de desarrollo.

Figura 2.27 – AVR Studio con pantalla de Proteus activada.

87
Capítulo 3. Aplicaciones introductorias.

Capı́tulo 3. Aplicaciones introductorias.


Para apoyar el conocimiento y dominio de estos microcontroladores se presenta a continuación
una serie de ejemplos que ilustran diversos recursos del ATmega32 entre ellos los
temporizadores, el convertidor análogo digital, el comparador analógico y las fuentes de
interrupción externa. La programación se realizó en el software AVR Studio 4 en lenguaje
ensamblador y para la simulación se utilizó el software PROTEUS. Se debe aclarar que como el
objetivo de estas simulaciones es comprobar y validar el correcto funcionamiento del control, en
algunos casos se simplificó el circuito de fuerza omitiendo etapas como la de aislación y
amplificación, para poder hacer la corrida libre y ver el efecto sobre la carga. Algunos de los
ejemplos además de ser simulados se montaron físicamente. En el anexo # se encuentran
todos los códigos de programa de los ejemplos, comentados por paso para una mejor
comprensión de los mismos.

3.1. Ejemplo 1. Control de luces.

Consiste en rotar la posición de un LED encendido cada 1 segundo. Para esto se utilizará un
puerto de entrada/salida configurado como salida en donde se conectarán 8 LEDs. En la figura
3.1 se muestra el diagrama en bloque de la secuencia de ejecución del ejemplo 1. En las figuras
3.2 y 3.3 se muestran los resultados obtenidos durante la simulación y con el circuito físico.

Figura 3.1 – Diagrama en bloques del ejemplo 1.

88
Capítulo 3. Aplicaciones introductorias.

Figura 3.2 – Corrida libre en el software PROTEUS del ejemplo 1.

Figura 3.3 – Montaje físico y corrida real del ejemplo 1.

Lo más significativo de este ejemplo es el uso de una subrutina de demora. Esta subrutina es
muy útil ya que permite introducir tiempos de demora configurables variando el valor del registro
R20. El cálculo del valor de este registro para lograr un tiempo determinado se obtiene de tener
en cuenta la duración en ciclos de reloj de cada instrucción y las veces que se repiten.

Ciclos de reloj
Llamada a subrutina 4
Ldi R20,valor 1
Lazo2 Ldi R21,255 1
Lazo1 Ldi R22,255 1
Lazo0 dec R22 1
brne Lazo0 2/1
dec R21 1
brne Lazo1 2/1
dec R20 1
brne Lazo2 2/1
Ret 4

La subrutina se ejecuta en: 11 ) 195078 ∙ valor 1 ciclos de reloj.

89
Capítulo 3. Aplicaciones introductorias.

4CD=> E1 01D=F
El tiempo de duración será: T 
G_
(3.1)

I∙G_JKK
Sustituyendo y despejando se tiene que: valor  ) 1 (3.2)
KLMNOP

Donde:

T: tiempo de duración de la subrutina en segundos

F_CPU: frecuencia del procesador en Hz

Valor: número a cargar en el registro R20

3.2. Ejemplo 2. Secuencia definida por dos interruptores.

En el ejemplo a continuación se utilizan los puertos A y C como puertos de entrada/salida. El


puerto A se configura como puerto de entrada y se activa el pull-up de las líneas de puerto PA0
y PA1 en los que se conectan dos interruptores. El puerto C se configura como puerto de salida
y se conecta un LED en cada uno de sus terminales. El programa consiste en encuestar cada 5
segundos las líneas de puerto PA0 y PA1 y en dependencia de la combinación que presente se
realizará una de las siguientes operaciones con los LEDs conectados en el puerto C.

Línea de
puerto Operación
PA1 PA0
0 0 Apagar todos los leds.
Encender un led cada vez a intervalos de un segundo hacia la
0 1
derecha.
Encender en grupos de 4 leds alternadamente a intervalos de un
1 0
segundo durante 10 ciclos.
1 1 Encender todos los leds.

Como para la selección de la secuencia a realizar solo se tienen en cuenta 2 de las líneas del
puerto A, en el momento de encuestarlo para definir la secuencia a realizar, se usa una
máscara que consiste en hacer un AND lógico entre el valor en la entrada del puerto y el
numero binario 0000 0011, de esta manera siempre se tendrá una de las 4 variantes posibles
sin importar el estado del resto de las líneas del puerto.

Para medir el tiempo se utilizó una subrutina de demora de 1 segundo y se creó un lazo para
repetirla 5 veces.

90
Capítulo 3. Aplicaciones introductorias.

En la figura 3.4 se muestra el diagrama en bloque de la secuencia de ejecución del ejemplo 2.


En las figuras 3.5 y 3.6 se muestran los resultados obtenidos durante la simulación y con el
circuito físico.

Figura 3.4 – Diagrama en bloques del ejemplo 2.

Figura 3.5 – Corrida libre en el software PROTEUS del ejemplo 2.

91
Capítulo 3. Aplicaciones introductorias.

Figura 3.6 – Montaje físico y corrida real del ejemplo 2.

3.3. Ejemplo 3. Trabajo con tablas.

En el presente ejemplo se utilizan los cuatro puertos del microcontrolador como puertos de
entrada/salida. El puerto C está configurado como puerto de entrada, se activan sus pull-up y se
conecta un interruptor a cada uno de sus terminales para simular diferentes combinaciones
digitales a la entrada del mismo. Los puertos A, B y D se configuran como puertos de salida y
se conecta a cada uno de ellos una lámpara 7 segmentos. El programa consiste en leer la
combinación de unos y ceros (correspondiente a un valor decimal entre cero y 255) en el puerto
de entrada C y mostrar el número decimal correspondiente en las lámparas 7 segmentos. Con
vista a simplificar el hardware, la conversión del número de BCD a la combinación necesaria
para mostrar este en las lámparas 7 segmentos se realiza por software mediante la utilización
de una tabla. En la figura 3.8 se muestra el diagrama en bloque de la secuencia de ejecución
del ejemplo 3.

El objetivo fundamental de este ejemplo es mostrar el trabajo con tablas.

Para acceder a datos guardados en memoria de programa es necesario utilizar el puntero Z ya


que la dirección del byte a leer se especifica por el contenido de este registro. Para lograr una
adecuada lectura de tablas en memoria de programa es necesario multiplicar por 2 en el
momento de guardar su dirección en Z. Esto se debe a que la memoria está organizada en 16
bits (1 word) pero cuando se ejecuta la función para leer desde memoria (lpm) el contador de
programa asume direcciones de 8 bit (1 byte).

En la figura 3.7 se puede apreciar que la tabla inicia en la dirección de memoria 0000002, pero
si las direcciones se asumen de 8 bit (1 byte) al primer valor de la tabla (AA) le correspondería
la dirección 04.

92
Capítulo 3. Aplicaciones introductorias.

Figura 3.7 – Direccionamiento en memoria de programa.

Figura 3.8 – Diagrama en bloques del ejemplo 3.

Se realizaron dos variantes de este ejemplo (Figura 3.9), una con lámparas 7 segmentos de
ánodo común y la otra con lámparas de cátodo común. La única diferencia que existe en cuanto
al software entre las dos variantes, es los valores de la tabla, ya que la combinación que hay
que enviarles para mostrar un mismo número varía según el tipo de lámpara.

93
Capítulo 3. Aplicaciones introductorias.

Figura 3.9 – Corrida libre en el software PROTEUS del ejemplo 3 con lámpara cátodo común.

3.4. Ejemplo 4. ON/OFF por una misma interrupción.

Muestra el uso de las interrupciones externas y consiste en encender y apagar un led al


presionar un botón. Se utiliza una línea del puerto A configurada como salida y en ella se
conecta un LED. El puerto D se configura como entrada y se activa el pull-up de la línea PD2,
que es la entrada correspondiente a la interrupción externa 0 (INT_0). Al presionar un botón
pulsador conectado a tierra, se genera un flanco de caída en esta entrada del microcontrolador.
Es importante resaltar el uso de una bandera para dirigir la secuencia de operación dentro de la
rutina de interrupción para una vez encender y otra vez apagar. La bandera no es más que un
bit de un registro que en este caso si es 0 corresponde encender y si es 1 apagar.

En las figuras 3.10, 3.11 y 3.12 se muestran el diagrama en bloque de la secuencia de


ejecución del ejemplo 4 y los resultados obtenidos durante la simulación y con el circuito físico.

Figura 3.10 – Diagrama en bloques del ejemplo 4.

94
Capítulo 3. Aplicaciones introductorias.

Figura 3.11 – Corrida libre en el software PROTEUS del ejemplo 4.

Figura 3.12 – Montaje físico y corrida real del ejemplo 4.

3.5. Ejemplo 5. Control de un proceso industrial.

Trata sobre el control de un horno que se utiliza en una fábrica de cerámica para el secado de
las piezas. Los requerimientos impuestos al diseño son:

1- Por una entrada de interrupción externa se indica el comienzo del proceso lo que
presupone arrancar una estera que introduce las piezas en el horno.
2- La capacidad del horno es de 800 piezas por lo que se dispone de un circuito que
permite conocer la cantidad de piezas que se introducen con la aparición de un pulso
por cada pieza, al introducir la última pieza se debe indicar parpadeando un LED verde
cada 150 milisegundos durante 4 segundos.
3- Al cabo de este tiempo se cierra la puerta y se enciende un LED rojo indicando horno
energizado. El horno trabaja durante dos minutos por lo que al transcurrir dicho tiempo
debe abrirse la puerta. Con el objetivo de simplificar se asume que la puerta se cierra

95
Capítulo 3. Aplicaciones introductorias.

poniendo un uno lógico en el terminal al que está conectada y se abre al poner un cero
lógico.

La señal de interrupción externa utilizada para iniciar el proceso es INT 0 configurada para que
se active por un flanco de caída. El conteo de la cantidad de piezas que ingresan en el horno se
realiza con el temporizador/contador cero configurado como contador. La señal de los pulsos
generada por la entrada de las piezas al horno se conecta al contador por el terminal
PB0/TC0/XCK. El temporizador/contador uno se utiliza como temporizador para controlar el
tiempo de parpadeo del LED verde. Para el control de la estera, la puerta del horno y las
señales luminosas se utilizan 4 líneas del puerto C configuradas como salidas. Para lograr los 2
minutos de funcionamiento del horno se utiliza la propia subrutina de demora de 4 segundos
dentro de un lazo.

Es necesario aclarar que los temporizadores de esta familia comienzan a trabajar una vez
definida la fuente de conteo, por eso en este ejemplo no es posible habilitar las interrupciones
de los temporizadores al mismo tiempo. En las figuras 3.13 y 3.14 se muestran el diagrama en
bloque de la secuencia de ejecución del programa y los resultados obtenidos durante la
simulación.

Figura 3.13 – Diagrama en bloques del ejemplo 5.

96
Capítulo 3. Aplicaciones introductorias.

Figura 3.14 – Corrida libre en el software PROTEUS del ejemplo 5.

3.6. Ejemplo 6. Sistema de seguridad.

En el ejemplo que se ilustra a continuación se tienen dos señales de interrupciones externas


que indican dos situaciones diferentes y por tanto acciones diferentes:

1- Accionar el motor de cierre de una puerta para lo cual debe funcionar durante 30
segundos lo que se indica encendiendo un led rojo.
2- Activar una bocina durante 30 segundos con un tono de 10 milisegundos en encendido y
10 milisegundos en apagado. Durante este tiempo se enciende un led verde.

La señales de interrupción externa utilizadas son: INT 0 para encender el motor e INT 1 para
activar la bocina. Ambas son configuradas para activarse con un flanco de caída.

El temporizador/contador 1 se utiliza como temporizador en modo de trabajo normal y tiene


como función generar el tono de la bocina. Para lograr los 30 segundos se utiliza una subrutina
de demora. Las cuatro líneas de puerto de entrada/salida se configuran como salidas y en ellas
se conectan la bocina, la puerta y las señales luminosas. Para lograr que se ejecute el tono de
la bocina es necesario habilitar dentro de la rutina INT_1 el bit global de interrupciones. En las

97
Capítulo 3. Aplicaciones introductorias.

figuras 3.15 y 3.16 se muestran el diagrama en bloque de la secuencia de ejecución del


programa y los resultados obtenidos durante la simulación.

Figura 3.13 – Diagrama en bloques del ejemplo 6.

98
Capítulo 3. Aplicaciones introductorias.

Figura 3.14 – Corrida libre en el software PROTEUS del ejemplo 6.

3.7. Ejemplo 7. Control del nivel de combustible en un tanque elevado.

El ejemplo que se presenta a continuación representa el control del arranque y parada de una
bomba que garantiza el nivel de combustible de un tanque. El sistema debe cumplir con las
siguientes especificaciones:

1. Una señal de interrupción externa indica el nivel bajo en el tanque lo que presupone
energizar la bomba a tensión nominal durante 5 minutos. Transcurrido ese tiempo la
bomba debe pasar a un régimen de tensión reducido lo que se indica haciendo
parpadear un LED verde con una periodicidad de 100 milisegundos.
2. La orden de parada de la bomba se recibe mediante otra señal de interrupción externa
por el mismo terminal.
3. El sistema conoce el estado del nivel de combustible del depósito original por un
interruptor de encendido/apagado conectado a una línea de puerto. Un “0” en esta línea
de puerto indica depósito por debajo del 50% de su capacidad por lo que no debe
energizarse la bomba mientras se cumpla esta condición y señalizarse con un led rojo
encendido.

La señal de interrupción externa utilizada para energizar y parar la bomba es INT 0. Dado que el
encendido y apagado de la bomba debe realizarse por el mismo botón se utiliza una bandera

99
Capítulo 3. Aplicaciones introductorias.

que permite saber qué operación debe llevarse a cabo. El temporizador/contador cero se utiliza
como temporizador trabajando en modo normal y se encarga de contar los 5 minutos de trabajo
de la bomba a tensión nominal y los 100 mseg de parpadeo del LED verde durante el trabajo de
la bomba a tensión reducida. Las 2 bobinas que determina la tensión de operación de la bomba
se conectan a través de una ULN2003A. En las figuras 3.16 y 3.17 se muestran el diagrama en
bloque de la secuencia de ejecución del programa y los resultados obtenidos durante la
simulación.

Figura 3.16 – Diagrama en bloques del ejemplo 7.

100
Capítulo 3. Aplicaciones introductorias.

Figura 3.17 – Corrida libre en el software PROTEUS del ejemplo 7.

3.8. Ejemplo 8. Protección térmica de un motor.

En este ejemplo se realiza la protección térmica de un motor. Los elementos fundamentales del
sistema son un sensor de temperatura y el comparador analógico del microcontrolador,
encargado de comparar la señal del sensor con una de referencia. El funcionamiento del
sistema es el siguiente:

1. Una interrupción externa se encarga del encendido y apagado del motor, señalizando el
funcionamiento de este con un LED verde.
2. En caso de que la temperatura del motor se eleve por encima de la fijada por la
referencia, el motor debe detenerse y quedar inhabilitado el arranque. Esto se señaliza
mediante un led rojo.
Para realizar el encendido y apagado del motor se utiliza un botón pulsador conectado en el
terminal PD2/INT 0 y se habilita la señal de interrupción externa INT 0 por flanco de caída. Dado
que el motor se arranca y detiene por el mismo botón se utiliza una bandera que permite saber
en qué estado se encuentra el motor y que operación realizar. Para medir la temperatura de la
máquina se utiliza un sensor de temperatura de silicona KTY81-200 [3] conectado al terminal
positivo del comparador PB2/AIN 0.

La señal de referencia se conecta al terminal negativo del comparador PB3/AIN 1. El


comparador analógico se configura para que solicite interrupción por un cambio lógico a su
salida, de esta manera se realizara la rutina de interrupción tanto cuando la temperatura suba

101
Capítulo 3. Aplicaciones introductorias.

por encima de la referencia como cuando se haga menor que esta. Como la interrupción se
produce por dos sucesos diferentes, dentro de su rutina se utiliza el bit ACO como bandera para
distinguir las dos situaciones.

Son utilizadas tres líneas de puerto configuradas como salida a las cuales se conectan las dos
señales luminosas y la bobina de control del relé que enciende y apaga el motor. La figura 3.18
muestra el diagrama en bloque de la secuencia de ejecución del programa

Figura 3.18 – Diagrama en bloques del ejemplo 8.

En las figuras 3.19 y 3.20 se muestran los resultados obtenidos durante la simulación y con el
circuito físico.

102
Capítulo 3. Aplicaciones introductorias.

Figura 3.19 – Corrida libre en el software PROTEUS del ejemplo 8.

Figura 3.20 – Montaje físico y corrida real del ejemplo 1.

3.9. Ejemplo 9. Detector de nivel de tensión.

Este ejemplo está encaminado a mostrar el funcionamiento del convertidor análogo-digital del
microcontrolador. Consiste en medir un nivel de tensión y en dependencia de su valor se
encenderá un LED:

• Rojo si el valor se encuentra entre 4V y 5V indicando nivel alto.


• Amarillo si se encuentra entre 2V y 3.99V indicando nivel medio.
• Verde si esta entre 0V y 1.99V indicando nivel bajo.

103
Capítulo 3. Aplicaciones introductorias.

La señal se medirá por el canal cero del multiplexor del ADC al cual se accede por el terminal
PA0/ADC0

Se realizaron 3 variantes de este ejemplo que se diferencian en el modo en que se inicia una
nueva conversión del ADC.

• Variante 1: Encuestando el bit de inicio de conversión (ADSC) (Figura 3.21). Poniendo a


uno este bit se inicia una conversión y se mantendrá en nivel alto hasta que se termine,
una vez finalizada la conversión este bit es borrado por hardware y entonces se puede
volver a poner a uno por software para iniciar una nueva conversión.
• Variante 2: Modo corrida libre. Se pone a uno el bit ADATE habilitando las conversiones
automáticas y se selecciona como fuente de disparo el de modo corrida libre. Así se
iniciara una nueva conversión cada vez que se concluya una, sin necesidad de poner a
uno por software el bit ADSC. Es indispensable iniciar una primera conversión a través
del bit ADSC.
• Variante 3: Cada un tiempo determinado. Se pone a uno el bit ADATE habilitando las
conversiones automáticas y se selecciona como fuente de disparo el desbordamiento
del temporizador 1, el que se configura para contar un tiempo deseado.

Figura 3.21 – Diagrama en bloque del ejemplo 9, variante1.

Las figuras 3.22 y 3.23 muestran los resultados obtenidos durante la simulación y con el circuito
físico.

104
Capítulo 3. Aplicaciones introductorias.

Figura 3.22 – Corrida libre en el software PROTEUS del ejemplo 9.

Figura 3.20 – Montaje físico y corrida real del ejemplo 9.

105
Capítulo 4. Aplicaciones avanzadas.

Capı́tulo 4. Aplicaciones avanzadas.


Se presenta a continuación una serie de ejemplos de mayor complejidad debido a que se
utilizará el ATmega32 en aplicaciones típicas de la rama de ingeniería que requieren la
utilización simultánea de diversos recursos del microcontrolador. Entre dichos recursos se
encuentra el PWM, el cual no ha sido utilizado en los ejemplos ilustrados con anterioridad en el
presente trabajo. También, por primera vez, se usará el microcontrolador conectado a un LCD y
un teclado.

De forma similar a los ejemplos del capítulo anterior, la programación se realizó en AVR Studio
4 en lenguaje ensamblador y para la simulación se utilizó el software PROTEUS. Fue necesario
igualmente simplificar las etapas de fuerza para poder realizar la corrida libre. En el anexo # se
encuentran todos los códigos de programa de los ejemplos, comentados por paso para una
mejor comprensión de los mismos.

4.1. Ejemplo 1. Control de un motor de pasos.

Un motor paso a paso (MPAP), como todo motor, es en esencia un conversor electromecánico,
que transforma energía eléctrica en mecánica. Mientras que un motor convencional gira
libremente al aplicarle una tensión, el motor paso a paso gira un determinado ángulo de forma
incremental (transforma impulsos eléctricos en movimientos de giro controlados), lo que le
permite realizar desplazamientos angulares fijos muy precisos (pueden variar desde 1,80º hasta
unos 90º). Al número de grados que gira el rotor, cuando se efectúa un cambio de polaridad en
las bobinas del estator, se le denomina "ángulo de paso". [4]

Este tipo de motores son ideales cuando lo que queremos es posicionamiento con un elevado
grado de exactitud y/o una muy buena regulación de la velocidad. Sus principales aplicaciones
se pueden encontrar en robótica, tecnología aeroespacial, control de discos duros, unidades de
CD-ROM o de DVD e impresoras, en sistemas informáticos, manipulación y posicionamiento de
herramientas y piezas en general.

Según la construcción de las bobinas del estator, existen dos tipos de MPAP:

• Unipolares: La corriente que circula por las diferentes bobinas siempre circula en el
mismo sentido. Las bobinas tienen un enrollado único. Son más fáciles de controlar por

106
Capítulo 4. Aplicaciones avanzadas.

el hardware requerido. En estos motores las bobinas se polarizan en una sola dirección,
por lo que basta un “switch” o transistor por cada bobina para energizarla.
• Bipolares: La corriente que circula por las bobinas cambia de sentido en función de la
tensión que se aplica por lo que una misma bobina puede tener en uno de sus extremos
distinta polaridad (bipolar). Tienen las bobinas compuestas por dos enrollados cada una.
Cada bobina debe ser polarizada en ambas direcciones. Esto es equivalente a hacer
girar un motor DC en ambas direcciones y para esto se requiere un Puente – H.

Aún basado en el mismo fenómeno que los motores de corriente continua, el principio de
funcionamiento de los motores paso a paso es más sencillo que cualquier otro tipo de motor
eléctrico. El mismo consiste en activar las bobinas en una determinada secuencia (de acuerdo
al sentido de giro que se desee y si son bipolares o unipolares) de manera continuada para
conseguir el movimiento continuo del rotor.

Para el control de un motor unipolar, que es el utilizado en este ejemplo, existen tres secuencias
para hacerlo girar:

• Paso Simple: Consiste en activar cada bobina una a una y por separado. Con esta
secuencia no se obtiene mucha fuerza ya que solo es una bobina cada vez la que hace
girar un determinado ángulo el rotor (tabla 4.1).

L1 L2 L3 L4 Hex
1 0 0 0 0x01
0 1 0 0 0x02
0 0 1 0 0x04
0 0 0 1 0x08

Tabla 4.1 – Secuencia de polarización las bobinas de paso simple.

• Paso Completo o Doble: Se activan las bobinas de dos en dos con lo que se crea un
campo magnético más potente que atraerá con más fuerza y retendrá el rotor del motor
en la misma posición. (tabla 4.2).

107
Capítulo 4. Aplicaciones avanzadas.

L1 L2 L3 L4 Hex
1 1 0 0 0x0C
0 1 1 0 0x06
0 0 1 1 0x03
1 0 0 1 0x09

Tabla 4.2 – Secuencia de polarización las bobinas de paso completo o doble.

• Medio Paso: Combinando las dos secuencias anteriores se hace girar al motor en
pasos más pequeños y precisos obteniéndose el doble de pasos de movimiento para el
recorrido total de 360º (tabla 4.3).

L1 L2 L3 L4 Hex
1 0 0 0 0x08
1 1 0 0 0x0C
0 1 0 0 0x04
0 1 1 0 0x06
0 0 1 0 0x02
0 0 1 1 0x03
0 0 0 1 0x01
1 0 0 1 0x09

Tabla 4.3 – Secuencia de polarización las bobinas de medio paso.

El presente ejemplo tiene como objetivo el control del sentido de giro y la secuencia de
energizado de las bobinas de un motor de pasos. Para conectar dicho motor al microcontrolador
(figura 4.1) pueden utilizarse transistores en configuración Darlington o emplear, como en el
ejemplo, el circuito integrado ULN2003 que ya los tiene integrados. La corriente que soporta
este integrado es baja y si se quiere controlar motores más potentes se deberán utilizar
transistores de potencia.

Además se cuenta con dos botones, uno para encender y otro para apagar el motor y dos
interruptores para seleccionar el sentido de giro y la secuencia de polarización de las bobinas

108
Capítulo 4. Aplicaciones avanzadas.

(paso completo y medio paso) respectivamente. La figura 4.2 muestra el diagrama de bloques
de la secuencia de ejecución del programa.

Figura 4.1 – Circuito utilizado para la simulación del control de un motor de pasos.

Figura 4.2 – Diagrama en bloques del programa del ejemplo 1.

109
Capítulo 4. Aplicaciones avanzadas.

4.2. Ejemplo 2. Control de disparo por ángulo de conducción.

La forma más simple de disparo de un Tiristor o un Triac es aplicando una serie de impulsos a
su puerta. Estos impulsos pueden tener un cierto ángulo de retardo del disparo (ángulo α)
respecto al cruce por cero de la tensión alterna que alimenta el convertidor. El ángulo de
disparo puede controlarse dentro de un rango comprendido entre 0º y 180º.

En este ejemplo se utilizara el ATmega32 para generar los pulsos de control de los
semiconductores que conforman un convertidor de potencia, lo que simplificará en gran medida
el hardware, ya que no serán necesarios circuito externos como el de detección de cruce por
cero, el de generación de señal de interrupción cada 180 grados y el sistema de adquisición de
datos para fijar el ángulo de disparo, pues serán sustituidos por el comparador analógico y el
ADC del propio microcontrolador.

El ángulo de disparo se definirá por un potenciómetro (referencia) conectado en el canal cero


del ADC (PA0/ADC). Después de terminar cada conversión se ejecuta la rutina de interrupción
del ADC, en donde se lee de una tabla guardada en memoria de programa, el número que se
le cargará al temporizador 1 para generar el tiempo equivalente al ángulo de disparo
determinado por el valor de la referencia. Como el convertidor tiene una resolución de 10 bits,
se creó una tabla con los valores para lograr 1024 ángulos α diferentes entre 00 y 1800. El
comparador analógico se configura para que solicite interrupciones por un cambio lógico a su
salida, se conecta una muestra de la tensión de alterna que alimenta al convertidor de potencia
en su terminal positivo (AIN0) y en el terminal negativo (AIN1) se conecta la tierra. De esta
manera se generará una interrupción cada vez que la tensión de alimentación cruce por cero.
Además se utiliza la salida del comparador (ACO) para determinar a cual pareja de
semiconductores se le debe enviar el pulso. Esto es posible porque cuando la tensión en el
terminal positivo (AIN0) es mayor que la tensión en el terminal negativo (AIN1), que en este
caso corresponde al semiciclo positivo de la tensión de alimentación, ACO se pone a uno. En el
semiciclo negativo AIN0 es menor que AIN1 y la salida ACO vale cero. Dentro de la interrupción
generada por el comparador se carga en los registros de conteo del temporizador 1 el valor
leído de la tabla correspondiente al ángulo de disparo y se activa su interrupción por
desbordamiento. Una vez transcurrido el tiempo equivalente al ángulo α el temporizador genera
una interrupción dentro de la cual se envía la señal de disparo a los semiconductores
correspondientes. La figura 4.3 muestra el diagrama de bloques de la secuencia de ejecución
del programa.

110
Capítulo 4. Aplicaciones avanzadas.

Figura 4.3 – Diagrama en bloques del programa para generar los pulsos.

A continuación se mostrará la utilización de este control en un regulador de tensión monofásico


de corriente alterna con control de fase y en un puente rectificador monofásico totalmente
controlado, dos aplicaciones reales. Las figuras 4.4 y 4.5 muestran el circuito utilizado y los
resultados obtenidos durante la simulación del puente rectificador monofásico totalmente
controlado.

Figura 4.4 – Circuito utilizado para la corrida libre en PROTEUS del control aplicado al puente
rectificador monofásico totalmente controlado.

111
Capítulo 4. Aplicaciones avanzadas.

Figura 4.5 – Formas de ondas obtenidas para distintos valores del ángulo α. a) α=00 b) α=900
c) α=1800

En el caso particular del control del regulador de tensión monofásico de corriente alterna con
control de fase si se utiliza un triac como semiconductor de potencia solo se necesita una señal
de control, de emplearse dos tiristores en anti-paralelo si serían necesarias las dos señales.

La figura 4.6 y 4.7 muestran el circuito utilizado y los resultados obtenidos durante la simulación
del regulador de tensión monofásico de corriente alterna con control de fase.

Figura 4.6 – Circuito utilizado para la corrida libre en PROTEUS del regulador de tensión
monofásico de corriente alterna con control de fase.

112
Capítulo 4. Aplicaciones avanzadas.

Figura 4.7 – Formas de ondas obtenidas para distintos valores del ángulo α. a) α=450 b) α=900
c) α=1350

4.3. Ejemplo 3. Control de disparo por ángulo de conducción con entrada por teclado.

Se presenta una variante del ejemplo 2 en el que se emplea un teclado de 4x3 para introducir el
valor del ángulo de disparo deseado en lugar del potenciómetro. El significado de cada tecla es
el siguiente:
• Teclas del 0 al 9: Dígitos.
• Tecla #: Introduce el ángulo de disparo.
• Tecla ӿ: Borrar un dígito.
Además se utiliza como parte de la interfaz de comunicación con el usuario un LCD de 20
caracteres visibles y 4 líneas. Para organizar y estructurar el control del teclado y el LCD se
utilizaron diferentes subrutinas que forman parte de la programación del ejemplo. En esta
variante solo se pueden introducir ángulos de disparo entre 00 y 1790 que sean números
enteros, por lo que la tabla tendrá 180 valores, correspondientes a todos los ángulos posibles.
Una vez fijado el ángulo de disparo, el mismo no podrá ser cambiado a menos que sea
reseteado el microcontrolador. Las figuras 4.8 y 4.9 muestran el circuito utilizado y los
resultados obtenidos durante la simulación de esta variante.

113
Capítulo 4. Aplicaciones avanzadas.

Figura 4.8 – Circuito utilizado para la simulación de la variante utilizando LCD y teclado.

Figura 4.9 – Formas de ondas obtenidas para distintos valores del ángulo α.

114
Capítulo 4. Aplicaciones avanzadas.

4.4. Ejemplo 4. Control de un motor de corriente directa (CD) en los dos sentidos de
giro.

Para aplicaciones en que se precise el control de un motor en los dos sentidos de giro es
necesario el empleo de un convertidor de cuatro cuadrantes. En este ejemplo se empleará un
“chopper” de configuración puente en H [5], para el cual existen básicamente dos estrategias de
control de los interruptores, que conducen a dos formas de onda de salida distintas: PWM
unipolar y PWM bipolar.

Por las opciones que nos brinda el microcontrolador se utilizará como estrategia de control
PWM bipolar. Esta consiste en hacer que durante el periodo del convertidor se cierren
alternativamente las dos diagonales (una pareja de semiconductores desde 0 hasta TON,
mientras que la otra pareja lo haría desde TON hasta T). De esta manera, un ciclo de trabajo
del 50 % significaría que el motor estaría parado; ciclos por encima de 0.5 determinan un
sentido de giro, mientras que por debajo corresponden al sentido de giro opuesto.

De los tres temporizadores del ATmega32 el temporizador 1 es el que mayores prestaciones


brinda para configurar salidas PWM. Además de obtener señales con resolución de hasta 16
bits, la frecuencia de la señal PWM es completamente controlable. Este temporizador puede
producir hasta dos canales PWM, por los terminales OC1A y OC1B. Por tales motivos se utiliza
para implementar el control en este ejemplo.

El temporizador se configura para que trabaje sin pre-escalador (N=1), en modo PWM de fase y
frecuencia correcta con tope de conteo el valor del registro ICR1. De esta manera se podrá
controlar la frecuencia según la fórmula 4.1.

F_CPU
Frecuencia  4.1
2 ∙ N ∙ Tope

Donde:

F_CPU: frecuencia del procesador

N: pre-escalador

Tope: Tope de conteo

De la explicación de la estrategia de control se obtiene dos datos importantes, uno es que se


necesitan dos ondas PWM distintas, siendo una la negación de la otra, y el otro es que hay que
tener la posibilidad de variar el ciclo útil de estas ondas. Para lograr lo primero se genera la

115
Capítulo 4. Aplicaciones avanzadas.

misma onda por los dos canales PWM y se configura una onda no invertida por el terminal
OC1A y una onda invertida por el terminal OC1B. El ciclo útil de las ondas se fija con los valores
de los registros OCR1A y OCR1B según la fórmula 4.2.

OCR1A
Ciclo útil%  ∙ 100% 4.2
Tope
En este ejemplo se fija una frecuencia de 1 kHz. El valor del ciclo útil se controlará mediante un
potenciómetro conectado en el canal cero del ADC (PA0/ADC). Al igual que en el ejemplo
anterior después de terminar cada conversión se ejecuta la rutina de interrupción del ADC, en
donde se lee de una tabla guardada en memoria de programa. Dicha tabla es de 1024 valores
y contiene los números que se le cargarán a los registros OCR1A y OCR1B para generar el
ciclo útil de las ondas determinado por el valor de la referencia. La señal de interrupción externa
INT_0 será la encargada de iniciar y detener la generación de las ondas PWM por el
microcontrolador lo que se indicará encendiendo o apagando un LED verde. La figura 4.10
muestra el diagrama de bloques de la secuencia de ejecución del programa.

Figura 4.10 – Diagrama en bloques del programa del ejemplo 4.

La figura 4.11 y 4.12 muestran el circuito y los resultados obtenidos durante la simulación del
control de un motor de CD en los dos sentidos de giro.

116
Capítulo 4. Aplicaciones avanzadas.

Figura 4.10 – Circuito utilizado para la corrida libre en PROTEUS del control de un motor
mediante un puente tipo H con estrategia de control PWM bipolar.

Figura 4.11 – Formas de ondas obtenidas para distintos valores de ciclo útil de la onda no
invertida. a) Ciclo útil=99% b) Ciclo útil=50% c) Ciclo útil=1%

117
Capítulo 4. Aplicaciones avanzadas.

4.5. Ejemplo 5. Regulador de tensión monofásico de corriente alterna con control


PWM.

Este ejemplo es otra variante de un regulador de tensión monofásico de corriente alterna, una
de las aplicaciones presentadas en el ejemplo 2, pero haciendo uso del control PWM. Para
generar la onda PWM se utiliza el temporizador 1 configurado para trabajar sin pre-escalador,
en modo PWM de fase y frecuencia correcta con tope de conteo el valor del registro ICR1. La
frecuencia se fija en 4.8 kHz por lo que se utilizará como semiconductor un mosfet. La onda se
generará por el terminal OCR1A y será de tipo no invertida. Para fijar el ciclo útil se utilizará el
mismo procedimiento del ejemplo anterior. La figura 4.12 muestra el diagrama en bloques de la
secuencia de ejecución del programa.

Figura 4.12 – Diagrama en bloques del programa del ejemplo 5.

Las figuras 4.13 y 4.14 muestran el circuito y los resultados obtenidos durante la simulación.

Figura 4.13 – Circuito utilizado para la corrida libre en PROTEUS del ejemplo 5.

118
Capítulo 4. Aplicaciones avanzadas.

Figura 4.14 – Formas de ondas obtenidas para distintos valores de ciclo útil de la onda PWM
a) Ciclo útil=99% b) Ciclo útil=50% c) Ciclo útil=1%

119
Recomendaciones.

Conclusiones.
Combinando una tecnología RISC de 8 bits con una CPU con memoria flash, el ATmega32
resulta un poderoso microcontrolador que proporciona una alta flexibilidad en los diseños a bajo
costo, aportando una solución muy efectiva para la mayoría de las aplicaciones de control.

Como resultado de este trabajo se dispone para la introducción de este microcontrolador en la


carrera de Ingeniería Eléctrica de una documentación tanto desde el punto de vista teórico del
funcionamiento del dispositivo como de aplicaciones prácticas para dar solución a problemas de
la especialidad, todo lo cual ha posibilitado la aplicación de una nueva estrategia de enseñanza-
aprendizaje en un grupo de tercer año de Ingeniería Eléctrica.

Se pone a disposición de los estudiantes un total de 18 ejemplos donde se utilizan la gran


mayoría de los recursos de los que dispone el microcontrolador ATmega32 incrementando su
complejidad hasta llegar al diseño de circuitos de control de convertidores de potencia.

120
Recomendaciones.

Recomendaciones.
Documentar el depurador-programador AVR Dragon.

Extender el conjunto de aplicaciones utilizando recursos del ATmega32 aún no empleados.

121
Referencia bibliográfica.

Referencia bibliográ fica.


[1] Datasheet 8 bit AVR Microcontroller with 32 kbytes In-System-Programmable Flash
ATmega32, Advance Information, Atmel Corporation,2001
[2] S.Naimi, AVR Studio Software Tutorial.2010
[3] Philips Semiconductors, <<Silicon Temperature Sensors>>. Philip Semiconductors, dec-
2006.
[4] Un motor paso a paso… (Control de motores paso a paso mediante microcontroladores,
2002)
[5] J. D. A. Peña, Electrónica de Potencia

122
Bibliografía.

Bibliografı́a.
• Datasheet 8 bit AVR Microcontroller with 32 kbytes In-System-Programmable Flash
ATmega32, Advance Information, Atmel Corporation,2001
• RASHID. M. H, Electrónica de Potencia: circuitos, dispositivos y aplicaciones. Ed.
Prentice Hall Hispanoamericana, S.A. México 1995.
• T. L. Skvarenina, The Power Electronics Handbook. 2002.
• P. S. Aguayo, Introducción al Microcontrolador. 2004.

• Beginners Introduction to the Assembly Language of ATMEL AVR Microprocessors

• Gerhard Schmidt Web: http://www.avr-asm-tutorial.net.

• AVR Instruction Set http://atmel.com/dyn/resources/prod_documents/doc0856.pdf

• http://www.cursosmicro.com

• http://www.avrbeginners.net

• http://www.atmel.com

• Philips Semiconductors, <<Silicon Temperature Sensors>>. Philip Semiconductors, dec-


2006.

• J. Millman & A. Grabel, Microelectrónica. 1993

• J. D. A. Peña, Electrónica de Potencia .

123
Anexos.

Anexos.
Anexo 1: Tabla resumen de los registros del ATmega32.

Anexo 2: Modos de direccionamiento del ATmega32.

Anexo 3: Set de instrucciones del ATmega32.

Anexo 4: Código de programa de los ejemplos del capítulo 3.

Anexo 5: Código de programa de los ejemplos del capítulo 4.

124

Potrebbero piacerti anche