Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Kit de Desarrollo Avr Butterfly, Desarrollo de Guía de Prácticas de Laboratorio y Tutoriales

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 415

ESCUELA POLITÉCNICA DEL EJÉRCITO

DEPARTAMENTO DE ELÉCTRICA Y ELECTRÓNICA

CARRERA DE INGENIERÍA EN ELECTRÓNICA Y


TELECOMUNICACIONES

PROYECTO DE GRADO PARA LA OBTENCIÓN DEL TÍTULO DE


INGENIERÍA

KIT DE DESARROLLO AVR BUTTERFLY, DESARROLLO DE


GUÍA DE PRÁCTICAS DE LABORATORIO Y TUTORIALES

RICHARD LEONEL GUERRERO JUMBO

Sangolquí – Ecuador

2006
CERTIFICACIÓN

Por medio de la presente certificamos que el Proyecto de Grado titulado “KIT DE


DESARROLLO AVR BUTTERFLY, DESARROLLO DE GUÍA DE PRÁCTICAS DE
LABORATORIO Y TUTORIALES”, fue realizado en su totalidad por el señor Richard
Leonel Guerrero Jumbo, como requisito previo a la obtención del título de Ingeniero
Electrónico con Especialidad en Telecomunicaciones, bajo nuestra dirección.

________________________ ______________________
Ing. Evelio Granizo Ing. Víctor Proaño
DIRECTOR CODIRECTOR
RESUMEN

En este proyecto fue desarrollada una Guía de Prácticas de Laboratorio para el Kit de
Desarrollo AVR Butterfly. El AVR Butterfly es un Kit de desarrollo, entrenamiento y
aprendizaje de microcontroladores Atmel, que contiene el siguiente hardware: un
microcontrolador ATmega169V, LCD, Joystick, altavoz, cristal de 32 KHz, DataFlash de 4
Mbit, convertidor de nivel RS-232, interfaz USART, interfaz USI, sensor de temperatura,
sensor de luz, ADC, conectores para acceso a periféricos, y Batería de 3 V. Este proyecto
incluye información técnica del ATmega169, AVR Butterfly y AVR Studio 4; además,
incluye un tutorial para facilitar el manejo del AVR Butterfly, del IDE AVR Studio 4
(Simulador, Depurador y Programador) y del Compilador C WinAVR.

La Guía de Prácticas de Laboratorio, desarrollada en este proyecto, incluye los


siguientes temas: Lectura y Escritura en Puertos de E/S, El Joystick y las Interrupciones
Externas, El Controlador LCD, El Sensor de Temperatura y el ADC, Calibración del
Oscilador Interno y el Timer/Counter1 de 16 bits, y Comunicación con la PC mediante la
Interfaz USART.

Las Prácticas de Laboratorio desarrolladas cubren en su totalidad el contenido de la


Cátedra de Microcontroladores.
DEDICATORIA

A mis amados padres Manuel y Ángela Isabel,


a mis queridos hermanos Juan y Fabián,
y a mi preciosa novia Melania.
AGRADECIMIENTO

A DIOS por permitirme alcanzar esta meta y por darme una familia grandiosa con la
que puedo contar siempre.

Al Ing. Byron Navas que confió en mi persona para desarrollar este proyecto, al Ing.
Víctor Proaño que con su optimismo impulsó el desarrollo del proyecto, y al Ing. Evelio
Granizo por asumir responsablemente la dirección de este proyecto.

Mi gratitud con un amigo incomparable, el Crnl. Roque Moreira, por su confianza y


apoyo sincero.

El agradecimiento especial es para las personas que siempre han estado a mi lado sin
importar la distancia, mi familia y mi novia, ellos son el pilar vital de mi existencia.

¡GRACIAS DIOS!
PRÓLOGO

El presente proyecto surgió por la necesidad de un Sistema de Aprendizaje de


Microcontroladores que permita desarrollar una gran variedad de prácticas de laboratorio y
que sea económicamente asequible por el estudiante. La opción propuesta en este proyecto
es una Guía de Prácticas de Laboratorio basada en el Kit de Desarrollo AVR Butterfly.

El AVR Butterfy es un Kit de desarrollo para el microcontrolador AVR ATmega169,


por tal razón se dedica el Capítulo 2 para presentar ampliamente las características de aquel
microcontrolador.

Las características del Kit AVR Butterfly, el hardware disponible en este, el


Firmware pre-programado, la descripción detallada de sus componentes y diagramas
esquemáticos, se detallan en el Capítulo 3.

Para desarrollar las prácticas de laboratorio se emplean dos nuevas herramientas


gratuitas de desarrollo AVR, estas son el IDE AVR Studio 4 y el Compilador C de
WinAVR. En el Capítulo 4 se documenta el AVR Studio 4, y en el Capítulo 5 un tutorial
que explica el uso de estas dos herramientas.

La Guía de Prácticas de Laboratorio, en el Capítulo 6, abarca los siguientes temas:


Lectura y Escritura de Puertos de E/S, El Joystick y las Interrupciones Externas, El
Controlador LCD, El Sensor de Temperatura y el ADC, Calibración del Oscilador Interno
y el Timer/Counter1 de 16 bits, y Comunicación con la PC mediante la Interfaz USART.
ÍNDICE

ÍNDICE DE CONTENIDO

Contenido Pág.

CAPÍTULO 1: INTRODUCCIÓN A LOS MICROCONTROLADORES AVR


1.1. INTRODUCCIÓN 1
1.2. ATMEL 2
1.3. LOS MICROCONTROLADORES AVR RISC DE 8 BITS 4
1.3.1. Visión General 4
1.3.2. Ventajas 5
1.3.3. Familias AVR 7

CAPÍTULO 2: EL MICROCONTROLADOR ATMEGA169


2.1. CARACTERÍSTICAS DEL MICROCONTROLADOR ATMEGA169 18
2.2. DIAGRAMA DE BLOQUES 21
2.3. CONFIGURACIÓN DE PINES 23
2.4. NÚCLEO DE LA CPU (CPU CORE) 26
2.4.1. ALU 28
2.4.2. Registro de Estado 28
2.4.3. Fichero del Registro de Propósito General 30
2.4.4. Puntero de la Pila 32
2.4.5. Manipulación del Reset y de la Interrupción 33
2.5. MEMORIAS DEL ATMEGA169 35
2.5.1. Memoria Flash para Almacenamiento del Programa 36
2.5.2. Memoria SRAM para Datos 37
2.5.3. Memoria EEPROM para Datos 38
2.5.4. Memoria de I/O 42
2.6. RELOJ DEL SISTEMA Y OPCIONES DE RELOJ 44
2.6.1. Sistemas de Reloj y su Distribución 44
ÍNDICE

2.6.2. Fuentes de Reloj 46


2.6.3. Fuente de Reloj Predefinida 47
2.6.4. Oscilador de Cristal 47
2.6.5. Oscilador de Cristal de Baja Frecuencia 49
2.6.6. Oscilador Interno RC Calibrado 49
2.6.7. Reloj Externo 51
2.6.8. Buffer de Salida del Reloj 52
2.6.9. Oscilador del Timer/Counter 52
2.6.10. Preajustador del Reloj del Sistema 52
2.7. ADMINISTRACIÓN DE ENERGÍA Y MODOS DE SLEEP 55
2.7.1. Registro de Control del Modo Sleep - SMCR 55
2.7.2. Modo Idle 56
2.7.3. Modo ADC Noise Reduction 57
2.7.4. Modo Power-Down 57
2.7.5. Modo Power-save 58
2.7.6. Modo Standby 59
2.7.7. Registro para Reducción de Potencia 59
2.7.8. Reducción del Consumo de Energía 61
2.8. RESET 63
2.8.1. Fuentes de Reset 64
2.8.2. Reset Power-On 65
2.8.3. Reset Externo 65
2.8.4. Reset Watchdog 66
2.8.5. Reset Brown-Out 66
2.8.6. Registro de Estado de la MCU 68
2.9. INTERRUPCIONES 69
2.9.1. Vectores de Interrupción 69
2.9.2. Interrupciones Externas 70
2.10. PUERTOS DE I/O 75
2.10.1. Puertos de I/O Digital General 77
2.10.2. Funciones Alternas de los puertos 80
2.10.3. Descripción de los Registros de los Puertos de I/O 90
2.11. TIMER/COUNTER0 DE 8 BITS, CON PWM 91
2.11.1. Las fuentes de reloj para el TimerCounter0 93
ÍNDICE

2.11.2. Unidad de Conteo – Counter Unit 93


2.11.3. Unidad Comparadora 94
2.11.4. Preajustador del reloj del Timer/Counter0 y Timer/Counter1 95
2.11.5. Descripción de los Registros del Timer/Counter0 97
2.12. TIMER/COUNTER1 DE 16 BITS 100
2.12.1. Fuentes de reloj para el Timer/Counter 102
2.12.2. Unidad de Conteo 103
2.12.3. Descripción de los Registros del Timer/Counter1 104
2.13. TIMER/COUNTER2 DE 8 BITS, CON PWM 111
2.13.1. Descripción de los Registros del Timer/Counter2 112
2.13.2. Funcionamiento Asincrónico del Timer/Counter2 115
2.13.3. Preajustador del reloj del Timer/Counter2 117
2.14 INTERFAZ USART 118
2.14.1. Generación de reloj 120
2.14.2. Formatos de la Trama 124
2.14.3. Inicialización de la Interfaz USART 125
2.14.4. Transmisión de Datos – El Transmisor 126
2.14.5. Recepción de Datos – El Receptor 128
2.14.6. Recepción Asincrónica de Datos 131
2.14.7. Descripción de Registros de USART 135
2.14.8. Configuración de la Baud Rate 141
2.15. CONVERTIDOR ANALÓGICO DIGITAL – ADC 142
2.15.1. Características del ADC 142
2.15.2. Funcionamiento del ADC 144
2.15.3. Iniciar una Conversión ADC 145
2.15.4. Preajustador y Temporización de la Conversión 146
2.15.5. Canales de Entrada del ADC 149
2.15.6. Anulador de Ruido en el ADC 150
2.15.7. Resultado de la Conversión ADC 153
2.15.8. Descripción de Registros del ADC 154
2.16. CONTROLADOR DE LCD 159
2.16.1. Características del Controlador LCD 159
2.16.2. Visión General 160
2.16.3. Modos de Funcionamiento 163
ÍNDICE

2.16.4. Uso del LCD 166


2.16.5. Descripción de Registros del Controlador de LCD 168
2.16.6. Distribución de Memoria del Controlador LCD 174
2.17. PROGRAMACIÓN DE LA MEMORIA 175
2.17.1. Lock Bits para la Memoria de Programa y Datos 175
2.17.2. Fuse Bits 176
2.17.3. Bytes de Signatura 178
2.17.4. Byte para Calibración del Oscilador Interno 179
2.17.5. Distribución de Pines para Programación Serial 179
2.17.6. Descarga Serial 179
2.18. RESUMEN DE INSTRUCCIONES 183

CAPÍTULO 3: KIT AVR BUTTERFLY


3.1. DESCRIPCIÓN 185
3.2. HARDWARE DISPONIBLE 186
3.3. FIRMWARE INCLUIDO 187
3.3.1. Joystick 189
3.3.2. Menú 189
3.3.3. Actualización 191
3.3.4. Ejemplo del Uso de Aplicaciones Incluidas 194
3.3.5. Fuses y Lock Bits 196
3.4. CONECTORES 196
3.5. PROGRAMACIÓN MEDIANTE CONEXIÓN SERIAL CON LA PC 197
3.5.1. Distribución de Pines para Comunicación Serial 197
3.5.2. Programación del AVR Butterfly 198
3.6. LCD 200
3.6.1. Conexiones entre el LCD y el microcontrolador ATmega169 201
3.7. JOYSTICK 203
3.8. SENSORES 203
3.8.1. Sensor de Temperatura 203
3.8.2. Sensor de Luz 205
3.9. LECTOR DE VOLTAJE 205
3.10. DATAFLASH 206
ÍNDICE

3.11. ELEMENTO PIEZOELÉCTRICO (BUZZER) 207


3.12. BATERÍA 207
3.13. DIAGRAMAS ESQUEMÁTICOS 208

CAPÍTULO 4: AVR STUDIO 4


4.1. INTRODUCCIÓN 214
4.2. DESCRIPCIÓN GENERAL DEL IDE 215
4.3. VENTANAS PRINCIPALES DEL IDE 216
4.3.1. Ventana Editor 216
4.3.2. Ventana Output 217
4.3.3. Ventana Workspace 218
4.3.4. Ventana Watch 221
4.3.5. Ventana Memory 222
4.3.6. Barra de Estado 222
4.4. GENERACIÓN DE PROYECTOS 222
4.5. DEPURACIÓN DE PROYECTOS 226
4.5.1. Formato del Archivo Objeto 227
4.5.2. Controles para la Depuración 228
4.5.3. Control de los Breakpoints 230
4.5.4. Trace 232
4.5.5. Depuración de Proyectos Generados con otro Compilador 232
4.6. SIMULADOR 232
4.6.1. Opciones del Simulador 233
4.6.2. Módulos del Simulador 235
4.7. RESUMEN DE MENÚS Y BARRAS DE HERRAMIENTAS 236
4.7.1. Resumen de Menús 236
4.7.2. Barras de Herramientas 239

CAPÍTULO 5: TUTORIALES
5.1. UTILIZACIÓN DEL FIRMWARE PRE-INSTALADO 241
5.2. WINAVR 243
5.2.1. Instalación de WIN AVR 243
5.2.2. Archivo Makefile 244
ÍNDICE

5.2.3. Programmers Notepad 248


5.2.4. Creación de Proyectos con WinAVR 248
5.3. SIMULACIÓN DE PROYECTOS EN AVR STUDIO 4 254
5.4. PROGRAMACIÓN DEL AVR BUTTERFLY USANDO UNA PC 263
5.5. CONEXIONES EXTERNAS EN EL KIT AVR BUTTERFLY 267
5.5.1. PORTB y PORTD 267
5.5.2. USART 269
5.5.3. ADC 270
5.5.4. Fuente de Alimentación Externa 271

CAPÍTULO 6: PRÁCTICAS DE LABORATORIO


6.1. PRÁCTICA 1 272
6.1.1. Tema: 272
6.1.2. Objetivo 272
6.1.3. Materiales 272
6.1.4. Marco Teórico 273
6.1.5. Desarrollo 274
6.1.6. Código Fuente 279
6.1.7. Simulación 279
6.1.8. Programación 284
6.1.9. Esquema de Conexiones 286
6.2. PRÁCTICA 2 287
6.2.1. Tema 287
6.2.2. Objetivo 287
6.2.3. Materiales 287
6.2.4. Marco Teórico 287
6.2.5. Desarrollo 289
6.2.6. Código Fuente 301
6.2.7. Esquema de Conexiones 306
PRÁCTICA 3 307
6.3.1. Tema 307
6.3.2. Objetivo 307
6.3.3. Materiales 307
ÍNDICE

6.3.4. Marco Teórico 307


6.3.5. Desarrollo 310
6.3.6. Código Fuente 322
6.3.7. Esquema de Conexiones 329
6.3.8. Simulación 330
6.4. PRÁCTICA 4 331
6.4.1. Tema 331
6.4.2. Objetivo 331
6.4.3. Materiales 331
6.4.4. Marco Teórico 331
6.4.5. Desarrollo 332
6.4.6. Código Fuente 343
6.4.7. Esquema de Conexiones 346
6.5. PRÁCTICA 5 347
6.5.1. Tema 347
6.5.2. Objetivo 347
6.5.3. Materiales 347
6.5.4. Marco Teórico 347
6.5.5. Desarrollo 349
6.5.6. Código Fuente 361
6.5.7. Esquema de Conexiones 365
6.6. PRÁCTICA 6 366
6.6.1. Tema 366
6.6.2. Objetivo 366
6.6.3. Materiales 366
6.6.4. Marco Teórico 366
6.6.5. Desarrollo 368
6.6.6. Código Fuente 378
6.6.7. Esquema de Conexiones 382

CAPÍTULO 7: CONCLUSIONES Y RECOMENDACIONES


7.1. CONCLUSIONES 383
7.2. RECOMENDACIONES 385
ÍNDICE DE TABLAS

ÍNDICE DE TABLAS

TABLAS Pág.
Tabla 1.1. Familia de Microcontroladores Automotive AVR 8
Tabla 1.2. Familia de Microcontroladores CAN AVR 9
Tabla 1.3. Familia de Microcontroladores LCD AVR 9
Tabla 1.4. Familia de Microcontroladores Lighting AVR10 10
Tabla 1.5. Familia de Microcontroladores Mega AVR 11
Tabla 1.6. Familia de Microcontroladores SmartBattery AVR 15
Tabla 1.7. Familia de Microcontroladores Tiny AVR 15
Tabla 2.1. Tiempo de Programación de la EEPROM 42
Tabla 2.2. Selección de las Opciones de Reloj del Dispositivo 46
Tabla 2.3. Número de Ciclos del Oscilador del Watchdog 47
Tabla 2.4. Modos de Operación del Oscilador de Cristal 48
Tabla 2.5. Tiempo de Inicio para la Selección de Reloj de Oscilador de Cristal 48
Tabla 2.6. Tiempo de Inicio para la Selección de Reloj de Oscilador de Cristal
de Baja frecuencia 49
Tabla 2.7. Tiempos de Inicio para la Selección de Reloj de Oscilador de Cristal
de Baja frecuencia 49
Tabla 2.8. Modos de Operación con Oscilador RC Calibrado Internamente 50
Tabla 2.9. Tiempos de Inicio para la Selección de reloj de Oscilador RC
calibrado internamente 50
Tabla 2.10. Rango de Frecuencia del Oscilador RC Interno 51
Tabla 2.11. Frecuencia del Reloj de Oscilador de Cristal 51
Tabla 2.12. Tiempos de Inicio para la Selección de Reloj Externo 52
Tabla 2.13. Selección del Preajustador de Reloj 54
Tabla 2.14. Selección del Modo de Sleep 56
Tabla 2.15. Modos de Sleep 59
Tabla 2.16. Características del Reset 65
Tabla 2.17. Codificación de los BODLEVEL Fuses 67
ÍNDICE DE TABLAS

Tabla 2.18. Características del Brown-out 67


Tabla 2.19. Vectores de Interrupción y Reset 69
Tabla 2.20. Ubicación del Reset y de los Vectores de Interrupción 70
Tabla 2.21. Control del Sensado de la Interrupción 0 72
Tabla 2.22. Configuraciones de los Pines del Puerto 78
Tabla 2.23. Funciones Alternas de los Pines del Puerto A 80
Tabla 2.24. Funciones Alternas de los Pines del Puerto B 81
Tabla 2.25. Funciones Alternas de los Pines del Puerto C 84
Tabla 2.26. Funciones Alternas de los Pines del Puerto D 84
Tabla 2.27. Funciones Alternas de los Pines del Puerto E 85
Tabla 2.28. Funciones Alternas de los Pines del Puerto F 87
Tabla 2.29. Funciones Alternas de los Pines del Puerto G 89
Tabla 2.30. Descripción de los bits para el Modo de Generación de Onda 97
Tabla 2.31. Modo de Comparación, sin Modo PWM 98
Tabla 2.32. Modo de Comparación, Modo PWM Rápido 98
Tabla 2.33. Modo de Comparación, Modo PWM de Fase Correcta 98
Tabla 2.34. Descripción de los Bits Selectores de Reloj 99
Tabla 2.35. Modo de Salida de Comparación, sin PWM 105
Tabla 2.36. Modo de Comparación, PWM Rápido 105
Tabla 2.37. Modo de Comparación, PWM de Fase Correcta y de Fase y
Frecuencia Correcta 105
Tabla 2.38. Descripción de Bits para el Modo de Generación de Onda 106
Tabla 2.39. Descripción del Selector de Reloj 107
Tabla 2.40. Descripción de los bits para el Modo de Generación de Onda 113
Tabla 2.41. Modo de Comparación, sin Modo PWM 113
Tabla 2.42. Modo de Comparación, Modo PWM Rápido 114
Tabla 2.43. Modo de Comparación, Modo PWM de Fase Correcta 114
Tabla 2.44. Descripción de los Bits Selectores de Reloj 114
Tabla 2.45. Ecuaciones para Calcular la Configuración del Registro de
la Baud Rate 122
Tabla 2.46. Error Máximo Recomendado para la Baud Rate del Receptor,
velocidad Normal 134
Tabla 2.47. Error Máximo Recomendado para la Baud Rate del Receptor,
velocidad Doble 134
ÍNDICE DE TABLAS

Tabla 2.48. Configuración del bit UMSEL 139


Tabla 2.49. Configuración de los bits UPM 140
Tabla 2.50. Configuración del bit USBS 140
Tabla 2.51. Configuración de los bits UCSZ 140
Tabla 2.52. Configuración del bit UCPOL 141
Tabla 2.53. UBRR para Frecuencias del Oscilador comúnmente usadas 142
Tabla 2.54. Tiempo de Conversión del ADC 149
Tabla 2.55. Selecciones del Voltaje de Referencia para el ADC 154
Tabla 2.56. Selección de los Canales de Entrada 155
Tabla 2.57. Selección del Preajustador del LCD 157
Tabla 2.58. Selecciones de la Fuente Auto Activadora del ADC 158
Tabla 2.59. Términos usados en la descripción del Controlador LCD 160
Tabla 2.60. Selección del Duty para el LCD 170
Tabla 2.61. Máscara del Puerto LCD 171
Tabla 2.62. Selección del Preajustador para el LCD 171
Tabla 2.63. Preajuste del Reloj del LCD 172
Tabla 2.64. Cálculo de la velocidad de transferencia de la trama 173
Tabla 2.65. Configuración de la Pantalla LCD 173
Tabla 2.66. Control del Contraste del LCD 174
Tabla 2.67. Distribución de Memoria LCD 175
Tabla 2.68. Byte de Lock bits 175
Tabla 2.69. Modos de Protección con Lock Bits 176
Tabla 2.70. Fuse byte Extendido 177
Tabla 2.71. Byte Alto del Fuse 177
Tabla 2.72. Byte Bajo del Fuse 178
Tabla 2.73. Distribución de Pines para la Programación Serial 179
Tabla 2.74. Retrazo Mínimo de Espera previo a la Escritura en la siguiente
Localidad Flash o EEPROM 183
Tabla 2.75. Resumen de Instrucciones 183
Tabla 3.1. Distribución de pines, AVR Butterfly Vs. PC 197
Tabla 4.1. Formatos del Archivo Objeto 227
Tabla 4.2. Menú File 237
Tabla 4.3. Menú Project 237
Tabla 4.4. Menú Edit 237
ÍNDICE DE TABLAS

Tabla 4.5. Menú Debug 238


Tabla 4.6. Menú Window 238
Tabla 4.7. Menú Help 238
Tabla 4.8. Menú View 238
Tabla 4.9. Menú Tools 239
Tabla 6.1. Lista de Materiales para la Práctica 1 272
Tabla 6.2. Lista de Materiales para la Práctica 2 287
Tabla 6.3. Lista de Materiales para la Práctica 3 307
Tabla 6.4. Definición de Términos usados en la descripción del Controlador LCD 308
Tabla 6.5. Niveles de Voltaje del controlador de LCD 308
Tabla 6.6. Asignación de Memoria LCD 309
Tabla 6.7. Lista de Materiales para la Práctica 4 331
Tabla 6.8. Frecuencias del Oscilador más usadas 335
Tabla 6.9. Lista de Materiales para la Práctica 5 347
Tabla 6.10. Timer/Counter 1 – 2, número de cuentas en un tiempo t = 0.0061 seg 352
Tabla 6.11. Lista de Materiales para la Práctica 6 366
ÍNDICE DE FIGURAS

ÍNDICE DE FIGURAS

FIGURA Pág.
Figura 1.1. Socios/Clientes Estratégicos de Atmel 3
Figura 2.1. Diagrama de Bloques del microcontrolador ATmega169 21
Figura 2.2. Distribución de Pines del ATmega169 23
Figura 2.3. Diagrama de Bloques de la Arquitectura AVR 26
Figura 2.4. Registros de Trabajo de Propósito General de la CPU AVR 31
Figura 2.5. Los Registros X, Y, y Z 32
Figura 2.6. Mapa de la Memoria de Programa 36
Figura 2.7. Mapa de Memoria de Datos 38
Figura 2.8. Acceso a la SRAM de datos interna 38
Figura 2.9. Distribución del Reloj 45
Figura 2.10. Conexión del Oscilador de Cristal 47
Figura 2.11. Configuración de la Unidad de Reloj Externo 51
Figura 2.12. Lógica del Reset 64
Figura 2.13. Arranque de la MCU, RESET conectado a Vcc 65
Figura 2.14. Arranque de la MCU, RESET Extendido Externamente 65
Figura 2.15. Reset Externo Durante la Operación 66
Figura 2.16. Reset por el Watchdog Durante la Operación 66
Figura 2.17. Reset por Brown-Out Durante la Operación 68
Figura 2.18. Interrupción por Cambio en Pin 71
Figura 2.19. Esquema equivalente del pin de I/O 76
Figura 2.20. I/O Digital General 77
Figura 2.21. Sincronización al Leer un valor de Pin Aplicado Externamente 79
Figura 2.22. Diagrama de bloques del Timer/Counter de 8 bits 92
Figura 2.23. Diagrama de Bloques de la Unidad Contadora 93
Figura 2.24. Diagrama de Bloque de la Unidad de Comparadora 95
Figura 2.25. Preajustador para el Timer/Counter0 y Timer/Counter1 96
Figura 2.26. Diagrama de Bloques del Timer/Counter1 de 16 bits 101
Figura 2.27. Diagrama de Bloques de la Unidad Contadora 103
ÍNDICE DE FIGURAS

Figura 2.28. Diagrama de Bloques del Timer/Counter de 8 bits 112


Figura 2.29. Diagrama de Bloque de la USART 119
Figura 2.30. Diagrama de Bloque de la Lógica de Generación de Reloj 121
Figura 2.31. Tiempos del Modo Sincrónico XCK 124
Figura 2.32. Formatos de Trama 125
Figura 2.33. Muestreo del Bit de Inicio 132
Figura 2.34. Muestreo de los Datos y Bit de Paridad 133
Figura 2.35. Muestreo del Bit de Inicio y del Siguiente Bit de Inicio 133
Figura 2.36. Bloque Esquemático del Convertidor de Analógico a Digital 144
Figura 2.37. Lógica del Auto Activador del ADC 146
Figura 2.38. Preajustador del ADC 147
Figura 2.39. Diagrama de Tiempo del ADC, Primera conversión Simple 147
Figura 2.40. Diagrama de Tiempo del ADC, Conversión Simple 148
Figura 2.41. Diagrama de Tiempo del ADC, Conversión Auto Activada 148
Figura 2.42. Diagrama de Tiempo del ADC, Conversión en Funcionamiento Libre 149
Figura 2.43. Circuitería de la Entrada Analógica 152
Figura 2.44. Conexiones para Energizar al ADC 153
Figura 2.45. Diagrama de Bloques del Módulo LCD 161
Figura 2.46. Conexión del LCDCAP 163
Figura 2.47. Manejando una LCD con Una Terminal Común 163
Figura 2.48. Manejando un LCD con Dos Terminales Comunes 164
Figura 2.49. Manejando una LCD con Tres Terminales Comunes 164
Figura 2.50. Manejando una LCD con Cuatro Terminales Comunes 165
Figura 2.51. Formas de Onda Predeterminada y de Baja Potencia. 165
Figura 2.52. Ejemplo de uso del LCD 167
Figura 2.53. Programación y Verificación Serial 180
Figura 2.54. Formas de onda de la Programación Serial 181
Figura 3.1. AVR Butterfly 185
Figura 3.2. Hardware Disponible en el AVR Butterfly (Parte Frontal) 187
Figura 3.3. Hardware Disponible en el AVR Butterfly (Parte Posterior) 187
Figura 3.4. Entrada tipo Joystick 189
Figura 3.5. Menú del Firmware Incluido en el AVR Butterfly (en español) 191
Figura 3.6. AVR Prog en AVR Studio4 192
Figura 3.7. Conector J403 para ISP 193
ÍNDICE DE FIGURAS

Figura 3.8. AVR Prog 193


Figura 3.9. Conectores del AVR Butterfly para acceso a periféricos 197
Figura 3.10. Conexiones para interfaz USART del AVR Butterfly 198
Figura 3.11. AVR Studio, selección del archivo COFF para depuración 198
Figura 3.12. Selección del AVR Simulator y Dispositivo ATmega169 199
Figura 3.13. Vidrio LCD 201
Figura 3.14. Símbolos alfanuméricos y símbolos fijos en el LCD 201
Figura 3.15. LCD puenteado (izquierda) y LCD sin puentear (derecha) 202
Figura 3.16. Segmentos y Letras de Referencia de los Dígitos LCD 202
Figura 3.17. Joystick 203
Figura 3.18. Resistor de Coeficiente Negativo de Temperatura 204
Figura 3.19. Sensor de Luz 205
Figura 3.20. Pines para lectura de voltaje 206
Figura 3.21. DataFlash de 4 Mbits 206
Figura 3.22. Esquema de la conexión de la DataFlash 207
Figura 3.23. Elemento Piezoeléctrico 207
Figura 3.24. Diagrama Esquemático. MCU 208
Figura 3.25. D. Esquemático. Microcontrolador AVR ATmega169V 209
Figura 3.26. D. Esquemático. Pantalla de Cristal Líquido, LCD 209
Figura 3.27. D. Esquemático. DataFlash de 4 Mb AT45DB041B 210
Figura 3.28. D. Esquemático. Sensores: (a) NTC y (c) LDR, (b) acceso al ADC 210
Figura 3.29. D. Esquemático. Joystick 210
Figura 3.30. D. Esquemático. Elemento Piezoeléctrico, Buzzer 210
Figura 3.31. D. Esquemático. Cristal Externo de 32 768 Hz 211
Figura 3.32. D. Esquemático. Circuito conversor de nivel para interfaz RS-232 211
Figura 3.33. D. Esquemático. Batería de 3V y acceso a VCC externo 211
Figura 3.34. D. Esquemático. Conectores externos para: ISP y JTAG 212
Figura 3.35. D. Esquemático. Conectores externos: PORTB y PORTD 212
Figura 3.36. D. Esquemático. Conectores externos para: USI, USART y ADC1 213
Figura 4.1. Entorno de Desarrollo Integrado AVR Studio4 216
Figura 4.2. Ventana del Editor 217
Figura 4.3. Ventana Output 217
Figura 4.4. Ventana Project 218
Figura 4.5. Ventana I/O 219
ÍNDICE DE FIGURAS

Figura 4.6. Ventana Info 220


Figura 4.7. Vista Watch 221
Figura 4.8. Vista Memory 222
Figura 4.9. Barra de Estado 222
Figura 4.10. Ubicación de AVR Studio en la Barra de Inicio 223
Figura 4.11. Creación de nuevo proyecto 223
Figura 4.12. Configuración del proyecto 224
Figura 4.13. Plataforma para Depuración y Dispositivo para Simulación 225
Figura 4.14. Control de Breakpoints 230
Figura 4.15. Configuración de los Breakpoints 231
Figura 4.16. Opciones del Simulador 233
Figura 4.17. Selección del Dispositivo, Frecuencia y Bootloader 234
Figura 5.1. Archivo Makefile, tipo predeterminado de MCU 245
Figura 5.2. Archivo Makefile, tipo de MCU para la aplicación actual 245
Figura 5.3. Archivo Makefile, nombre predeterminado del proyecto 245
Figura 5.4. Archivo Makefile, nombre del proyecto actual 246
Figura 5.5. Archivo Makefile, sin archivos adicionales de código fuente 246
Figura 5.6. Archivo Makefile, especificación de un archivo adicional 246
Figura 5.7. Archivo Makefile, archivos generados en la compilación 247
Figura 5.8. Archivo Makefile, especificación para que se genere el archivo COFF 247
Figura 5.9. Programmers Notepad, creación de archivo C 249
Figura 5.10. Programmers Notepad de WinAVR, escritura de código 251
Figura 5.11. Programmers Notepad de WinAVR, compilación del código fuente 252
Figura 5.12. WinAVR, resultado de la compilación de código fuente con errores 252
Figura 5.13. Programmers Notepad, resultados de la compilación exitosa 253
Figura 5.14. Archivos generados luego de la compilación con WinAVR 254
Figura 5.15. AVR Studio, a) directorio del proyecto y b) archivo COFF 255
Figura 5.16. AVR Studio, selección de la Plataforma para Depuración 255
Figura 5.17. AVR Studio, selección del Dispositivo a Simular 256
Figura 5.18. AVR Studio, interfaz del usuario en AVR Simulator 256
Figura 5.19. AVR Studio, Menú Debug 257
Figura 5.20. AVR Studio, Opciones del Simulador 257
Figura 5.21. AVR Studio, visualización de recursos dentro de la ventana Workspace 258
Figura 5.22.AVR Studio, añadir variable a la ventana Watch 259
ÍNDICE DE FIGURAS

Figura 5.23. AVR Studio, activación de Breakpoints 260


Figura 5.24. AVR Studio, Puerto B configurado como salida de datos 261
Figura 5.25. AVR Studio, Pin 2 del Puerto B en nivel alto 261
Figura 5.26. AVR Studio, Contador de Ciclos luego de la función _delay_2 262
Figura 5.27. AVR Studio, análisis de variables en la ventana Watch 262
Figura 5.28. AVR Studio, análisis de variables en la ventana Watch 263
Figura 5.29. Conexión Serial entre la PC y el AVR Butterfly 264
Figura 5.30. AVR Studio, AVR Prog 265
Figura 5.31. AVR Studio, AVRprog, carga de archivo HEX 265
Figura 5.32. AVR Studio, AVRprog, archivo HEX cargado 266
Figura 5.33. AVR Studio, AVRprog, opciones avanzadas (Lock bits) 266
Figura 5.34. AVR Studio, AVRprog, proceso de grabación del microcontrolador 267
Figura 5.35. AVR Butterfly, PORTB (a) y PORTD (b) 268
Figura 5.36. Espadín 268
Figura 5.37. AVR Butterfly, instalación de Headers 268
Figura 5.38. Buses de datos de 10 hilos acoplados a Headers de 10 entradas 269
Figura 5.39. Cable para interfaz serial RS-232 270
Figura 5.40. PC y AVR Butterfly, conectados a través de la interfaz serial 270
Figura 5.41. AVR Butterfly, conexión externa para el ADC 271
Figura 5.42. Baterías AA de 1.5 V y porta-baterías 271
Figura 6.1. Diagrama de Bloques de los recursos utilizados en la Práctica 1 274
Figura 6.2. Archivo Makefile, sin cambios 277
Figura 6.3. Archivo Makefile, luego de los cambios necesarios 277
Figura 6.4. WinAVR, generación de los archivos (a)*.hex y (b)*.cof 278
Figura 6.5. AVR Studio 4, carga del archivo *.cof para simular 280
Figura 6.6. AVR Studio 4, selección del AVR Simulator y del ATmega169 280
Figura 6.7. AVR Simulator 281
Figura 6.8. AVR Simulator, simulación de la configuración de los puertos de I/O 281
Figura 6.9. AVR Simulator, simulación de escritura en PINB0 282
Figura 6.10. AVR Simulator, simulación de lectura y escritura 282
Figura 6.11. AVR Simulator, simulación de escritura en PINB5 283
Figura 6.12. AVR Simulator, simulación de lectura y escritura 283
Figura 6.13. AVR Prog, localización del archivo *.hex 284
Figura 6.14. AVR Prog, programación del ATmega169 284
ÍNDICE DE FIGURAS

Figura 6.15. Práctica 1, Esquema de Conexiones 286


Figura 6.16. Diagrama de conexión del joystick 289
Figura 6.17. Diagrama de Bloques de los recursos utilizados en la Práctica 2 290
Figura 6.18. Práctica 2, Esquema de Conexiones 306
Figura 6.19. Diagrama de Bloques de los recursos utilizados en la Práctica 3 310
Figura 6.20. Control de Segmentos LCD mediante la memoria LCD 315
Figura 6.21. Distribución de Nibbles, como ejemplo el caracter ‘B’ en la posición 0 317
Figura 6.22. Práctica 3, Esquema de Conexiones 329
Figura 6.23. AVR Simulator, Simulación del programa 330
Figura 6.24. Diagrama de Bloques de los recursos utilizados en la Práctica 4 332
Figura 6.25. Inicio de sesión de HyperTerminal 333
Figura 6.26. HyperTerminal, Selección de Puerto Serial 333
Figura 6.27. HyperTerminal, Configuración de parámetros 334
Figura 6.28. HyperTerminal, comunicación establecida 342
Figura 6.29. HyperTerminal, envío del mensaje hacia el Butterfly 342
Figura 6.30. Visualización del mensaje enviado desde la PC 342
Figura 6.31. Práctica 4, Esquema de Conexiones 346
Figura 6.32. Diagrama de Bloques de los Recursos utilizados en la práctica 5 349
Figura 6.33. Práctica 5, Esquema de Conexiones 365
Figura 6.34. Diagrama de Bloques de los Recursos utilizados en la práctica 5 369
Figura 6.35. Cálculo de la temperatura 370
Figura 6.36. Conversión ADC para 0 ºC 370
Figura 6.37. Conversión ADC para la temperatura ambiente 370
Figura 6.38. Índice, lectura ADC, Temperatura Calculada 371
Figura 6.39. Práctica 6, Esquema de Conexiones 382
GLOSARIO

GLOSARIO

Término Significado

Arquitectura Arquitectura de microcontroladores caracterizada por tener


Harvard memorias y buses separados para datos y para programa.

Assembly Lenguaje de programación de bajo nivel.

AVR Advanced Virtual RISC, RISC Virtual Avanzado. También


significa Alf Vergard RISC, en honor a sus creadores Alf Egil
Bogen y Vergad Wollan.

COFF Common Objet File Format. Formato del Archivo utilizado en el


proceso de Depuración de software para microcontroladores.

EEPROM Electrically Erasable Programmable Read Only Memory. Tipo


de memoria de lectura solamente borrable y programable
léctricamente.

HEX Tipo de archivo hexadecimal que contiene únicamente datos


para la memoria de programa de los microcontroladores.

IDE Integrated Development Environment, Ambiente Integrado de


Desarrollo. Software usado para el Desarrollo de Proyectos con
Microcontroladores.

ISP In System Programming. Característica que permite grabar o leer


un dispositivo sin tener que extraerlo de su aplicación/sistema.
GLOSARIO

JTAG Joint Test Action Group. Estándar IEEE 1149-1190 (Standard


Test Access Port and Boundary-Scan Architecture). Se define
como la electrónica que puede incorporar un circuito integrado
para asistir en el test, mantenimiento y soporte de placas de
circuito impreso. Esta circuitería incluye una interfaz estándar a
través de la cual se transfieren datos y comandos con los que el
componente puede responder a un conjunto mínimo de
instrucciones.

LCD Liquid Crystal Display, Pantalla de Cristal Líquido. Están


formadas por dos filtros polarizantes con filas de cristales
líquidos alineados perpendicularmente; aplicando una corriente
eléctrica a los filtros se consigue que la luz pase o no
dependiendo de que lo permita o no el segundo filtro. Si se
intercalan tres filtros adicionales de color, uno por cada color
primario, se obtienen pantallas que reproducen imágenes en
color.

LDR Light Dependent Resistor, Resistencia Dependiente de la Luz.


Se caracteriza por el hecho de que cuando la intensidad de la luz
disminuye, la resistencia en el LDR tiende a incrementarse.

LED Light Emitting Diode, Diodo Emisor de Luz. Una tensión


aplicada al semiconductor da como resultado la emisión de
energía luminosa. Los LED se utilizan en paneles numéricos
como los de los relojes digitales electrónicos y calculadoras de
bolsillo

Makefile Archivo que contiene información que dice al compilador los


comandos que tiene que ejecutar, que archivos compilar y
enlazar, la clase de salidas a crear, y también puede hacer otras
cosas como programar el chip.
GLOSARIO

MCU Microcontroller Central Unit. Es la unidad de procesamiento o


núcleo de los microcontroladores.

Memoria FLASH Chip de memoria no volátil (su contenido permanece aunque se


desconecte de la fuente) que se puede reescribir. En cierto
sentido se considera una variante de la EEPROM; la diferencia
está en que mientras esta última se borra y programa al nivel de
byte, la memoria flash se puede borrar y reprogramar en
unidades de memoria llamadas bloques, cuyo tamaño puede ir
desde los 512 bytes hasta los 256 KB. Esto hace que la memoria
flash sea muy útil para actualizar la BIOS de un ordenador o
computadora, o para almacenar cantidades de información
importantes, como una colección de imágenes o de documentos
de texto, que se renuevan en una sola operación. Sus
posibilidades de lectura y escritura son limitadas.

Microcontrolador Computador de limitadas prestaciones que está contenido en el


chip de un circuito integrado programable y que se destina a
gobernar una sola tarea con el programa que reside en su
memoria. Sus líneas de entrada/salida soportan el conexionado
de los sensores y actuadores del sistema a controlar.

MIPS Million Instructions Per Second. Medición de velocidad y el


poder de un procesador tomando como referencia el número de
instrucciones máquina que puede ejecutar en un segundo.

MLF Micro Lead Frame. Tipo de Encapsulado de Chips.

NTC Thermistor Negative Temperatura Coeficient Thermistor, Resistencia con


Coeficiente Negativo de Temperatura. Se caracteriza por el
hecho de que su resistencia desminuye cuando aumenta la
temperatura.
GLOSARIO

Pipelining El nivel de pipelining indica el número de instrucciones que el


procesador pre-extrae de la memoria de programa mientras está
ejecutando la instrucción actual.

RISC Reduced Instruction Set Compiler. Procesadores que contienen


una Colección Reducida de Instrucciones.

SCC Segment Control Code, Código Controlador de Segmento del


LCD.
Setear Escribir o configurar un bit con el valor de uno lógico.

SPI Serial Peripheral Interface. Interfaz Serial que permite


transferencia sincrónica de datos entre el microcontrolador y
dispositivos periféricos o entre varios dispositivos AVR.

SRAM Static Random Access Memory. Memoria Estática de solo


Lectura que conserva la información mientras esté conectada a la
tensión de alimentación.
TAP Test Access Port. Tipo de puerto que permite acceder y cambiar
el estado de cada uno de los pines del componente, para la
ejecución de pruebas con la interfaz JTAG.

Time Stamp Característica que permite imprimir el tiempo en el que se


ejecuta una tarea relacionada.

TQFP Thin Quad Flat Pack. Tipo de Encapsulado de Chips.


CAPÍTULO 1: INTRODUCCIÓN A LOS MICROCONTROLADORES AVR -1-

CAPÍTULO 1

INTRODUCCIÓN A LOS MICROCONTROLADORES AVR

1.1. INTRODUCCIÓN
Al abordar el diseño de un sistema electrónico surge la necesidad de implementar
partes utilizando hardware dedicado con varias de las opciones existentes. Una opción
innovadora es el MICROCONTROLADOR, que es un computador de limitadas
prestaciones contenido en el chip de un circuito integrado programable y que se destina a
gobernar una sola tarea con el programa que reside en su memoria. De este, se puede elegir
diferentes tipos de configuraciones, tanto en tamaño y tipo de memoria (ROM, OTP
EPROM, EEPROM…) como en el tipo de puertos de entrada/salida y módulos internos
(ADC, DAC, Timers/Counters,…).

Esto hace que los microcontroladores, por su versatilidad, se hayan convertido en los
dispositivos más utilizados en nuestro país para el diseño de sistemas electrónicos, ya que
nos permiten manejar pantallas de cristal líquido (LCD), teclado matricial, memorias,
sensores y adicionalmente ofrecen interfaces para comunicación (Serial, USB, RF…) con
otros dispositivos, entre otras aplicaciones.

Los fabricantes de Microcontroladores más renombrados en la actualidad son: ST


Microelectronics, Texas Instruments, Motorola Semiconductors, Infineon Technologies,
Intel Corp, Microchip, Atmel Corp, Hitachi Corp, National Semiconductors. En el ámbito
nacional los Microcontroladores más populares, en el área del diseño e implementación de
hardware, son los fabricados por Microchip; los Microcontroladores ATMEL, por
desconocimiento de sus características sobresalientes, no son aprovechados tanto en el
ámbito académico como en el industrial.
CAPÍTULO 1: INTRODUCCIÓN A LOS MICROCONTROLADORES AVR -2-

A continuación, en el presente capítulo, se explicará brevemente lo que significa la


marca ATMEL y sus Microcontroladores AVR, debido a que el Kit de Desarrollo en el que
se basa éste proyecto es fabricado por la Corporación ATMEL y el Microcontrolador con
el que está equipado es un Microcontrolador AVR.

1.2. ATMEL
La corporación ATMEL, fundada en 1984, es líder mundial en el diseño, fabricación
y comercialización de semiconductores avanzados, con enfoque en microcontroladores;
que incluyen lógica avanzada, memoria no volátil, circuitos integrados mezcladores de
señal, componentes para radio frecuencia y sensores. Estas funciones se comercializan
como productos estándar, productos estándar de aplicación específica (ASSP) o productos
para clientes específicos (ASIC), proporcionando una respuesta rápida y flexible a las
necesidades de los clientes de Atmel.

Los chips Atmel se fabrican utilizando los más avanzados procesos de integración,
que incluyen tecnologías BiCMOS, CMOS y Germanio de Silicio (SiGe).

Como se observa en la Figura 1.1, los Socios/Clientes Estratégicos de Atmel son


mundialmente los más importantes fabricantes de dispositivos de telecomunicaciones,
computación, aplicaciones militares (Sistemas de Radar, Guerra Electrónica, Sistemas de
Control de Vuelo, etc.), sistemas de seguridad, etc.
CAPÍTULO 1: INTRODUCCIÓN A LOS MICROCONTROLADORES AVR -3-

Figura. 1.1 Socios/Clientes Estratégicos de Atmel.


CAPÍTULO 1: INTRODUCCIÓN A LOS MICROCONTROLADORES AVR -4-

1.3. LOS MICROCONTROLADORES AVR RISC DE 8 BITS

1.3.1. Visión General


Cuando los microcontroladores evolucionaron, los dispositivos aumentaron en
complejidad con nuevo hardware e instrucciones para lograr nuevas tareas. Estos
microcontroladores se conocieron como CISC o Computadoras de Conjunto de
Instrucciones Complejas.

Entonces alguien imaginó que si diseñaran un microcontrolador con procesador de


núcleo muy simple que haga algunas cosas, pero que las haga muy rápida y eficazmente,
podrían fabricar una computadora más barata y más fácil de programar. Así nacieron las
computadoras RISC o Computadoras de Conjunto de Instrucciones Reducidas. La
desventaja estaba en que se tenía que escribir lenguaje ensamblador adicional para hacer
todas las cosas que la CISC había construido. Por ejemplo, en lugar de llamar a la
instrucción ‘dividir’ en un dispositivo CISC, en RISC se debería hacer una serie de
substracciones para lograr una división. Esta desventaja se compensó con precio y
velocidad, además de que es completamente irrelevante cuando se programa en C puesto
que el compilador genera el código en ensamblador.

Las personas que diseñaron el Microcontrolador AVR y su conjunto de instrucciones


con arquitectura RISC lo hicieron manteniendo presente el lenguaje de programación C, de
hecho trabajaron con los diseñadores del compilador C de IAR para ayudarlos con el
diseño del hardware y la optimización del mismo para programarlo con lenguaje C.
CAPÍTULO 1: INTRODUCCIÓN A LOS MICROCONTROLADORES AVR -5-

1.3.2. Ventajas

RISC AVR de 8 Bits de Alto Rendimiento


Verdadera Arquitectura RISC.
Verdadera ejecución de Ciclo Único.
Un MIPS por cada MHz.
32 Registros de Propósito General.
Arquitectura Harvard.

Con pipeline de un estado, los Microcontroladores AVR ejecutan rápidamente cada


instrucción de la tabla en un ciclo de reloj, tal como se esperaría de cualquier máquina con
arquitectura RISC.

Los microcontroladores AVR pueden funcionar con tasas de reloj superiores a los 20
MHz, logrando cerca de 20 MIPS. Con 32 registros de propósito general, el AVR entrega
rendimiento y flexibilidad incomparable, especialmente cuando se programa con lenguajes
de alto nivel como C y Basic.

RISC AVR de 8 Bits de Bajo Consumo de Energía


Funcionamiento desde 1.5 hasta 5.5 V.
Gran variedad de modos de Sleep.
Frecuencia controlada por software.
Ciclo único y código de alta densidad.

Los Microcontroladores AVR tienen un rango grande de operación, cuando se trata


de fuentes de alimentación, asegurando gran flexibilidad. En aplicaciones que utilizan
batería, el AVR puede empezar con un conjunto de baterías fresco y funcionar hasta
cuando casi se haya agotado la energía de las mismas.

Los microcontroladores AVR tienen más de seis diferentes modos de sleep. Esto
asegura que buena parte del AVR no consuma energía entre eventos, asegurándose de que
CAPÍTULO 1: INTRODUCCIÓN A LOS MICROCONTROLADORES AVR -6-

el tiempo de abandono del modo sleep (wake-up) sea lo más rápido posible incluso al usar
un cristal externo.

La frecuencia de funcionamiento del microcontrolador puede ser controlada por


software, esto hace posible usar la velocidad máxima cuando es necesario y ahorrar
energía en el resto del tiempo.

La densidad alta del código hace que se necesite un mínimo de instrucciones y ciclos
de reloj para ejecutar una tarea, de este modo se reduce el consumo de energía
significativamente.

RISC AVR de 8 Bits Escalable


Amplia gama de dispositivos.
Variedad de pines
Compatibilidad total de código.
Familias compatibles en característica de pines.
Conjunto de herramientas de desarrollo.

Cuando se empieza el diseño de una aplicación, se inicia con un determinado


microcontrolador y a menudo surge la necesidad de más ó menos espacio para código, esto
precisa reemplazar el microcontrolador por otro de la misma familia.

Los microcontroladores Flash AVR, son una familia grande de microcontroladores


que comparten la misma arquitectura de núcleo. Esto facilita el rehúso del código en
próximos proyectos (compatibilidad de código), con dispositivos que manejan desde 1
Kbyte hasta 256 Kbytes de código y con encapsulados de 8 hasta 100 pines.

Todos los microcontroladores AVR utilizan las mismas herramientas de desarrollo.


El AVR Studio, los Kits de Iniciación, los Emuladores In-Circuit y los Kits de Evaluación
son creados para dar más funcionalidad en el aprendizaje y en el desarrollo con
microcontroladores Flash AVR.
CAPÍTULO 1: INTRODUCCIÓN A LOS MICROCONTROLADORES AVR -7-

1.3.3. Familias AVR


Los Microcontroladores RISC AVR de 8 bits se segmentan en distintas familias de
acuerdo a las aplicaciones para las que fueron diseñados. Las familias RISC AVR de 8 bits
son las siguientes:

• Familia Automotive AVR (Automotriz).


• Familia CAN AVR (Controller Area Network).
• Familia LCD AVR (Liquid Crystal Display).
• Familia Lighting AVR (Iluminación).
• Familia megaAVR (Gran Capacidad).
• Familia Smart BatteryAVR (Batería Inteligente).
• Familia tinyAVR (Diminuto).

A continuación se hace una breve descripción de cada una de las familias AVR RISC
de 8 bits y de las principales características de los microcontroladores que las integran.
CAPÍTULO 1: INTRODUCCIÓN A LOS MICROCONTROLADORES AVR -8-

Familia Automotive AVR. Para aplicación en el área Automotriz. La Tabla 1.1 muestra la
familia de Microcontroladores Automotive AVR.

Tabla. 1.1 Familia de Microcontroladores Automotive AVR


Dispositivo Descripción

Memoria Flash programable de 4K byte, SRAM de 512 byte, EEPROM de 256 Byte,
Conversor A/D (TQFP/MLF) de 8 Canales de 10-bit. Sistema de depuración
debugWIRE On-chip. Rendimiento de hasta 16 MIPS a 16 MHz.
ATmega48 Automotive Version de 8Kbyte: ATmega88 Automotive
Version de 16Kbyte: ATmega168 Automotive
Versión Industrial: ATmega48 ATmega88 ATmega168

Memoria Flash programable de 8K byte, SRAM de 512 byte, EEPROM de 256 Byte,
Conversor A/D (TQFP/MLF) de 8 Canales de 10-bit. Sistema de depuración
debugWIRE On-chip. Rendimiento de hasta 16 MIPS a 16 MHz.
ATmega88 Automotive Version de 4Kbyte: ATmega48 Automotive
Version de 16Kbyte: ATmega168 Automotive
Versión Industrial: ATmega48 ATmega88 ATmega168

Memoria Flash programable de 16K byte, SRAM de 512 byte, EEPROM de 256 Byte,
Conversor A/D (TQFP/MLF) de 8 Canales de 10-bit. Sistema de depuración
debugWIRE On-chip. Rendimiento de hasta 16 MIPS a 16 MHz.
ATmega168 Automotive
Version de 4Kbyte: ATmega48 Automotive
Version de 8Kbyte: ATmega88 Automotive
Versión Industrial: ATmega48 ATmega88 ATmega168

Microcontrolador AVR de 8-bit, Memoria Flash de 128K Bytes con ISP y Controlador
CAN. Conforme el standard V2.0A y V2.0B, Perfectamente preparado para
AT90CAN128 Automotive
aplicaciones Industriales y Automotrices. El microcontrolador soporta la
implementación de CANopen, DeviceNet™ y OSEK™.
Versión Industrial: AT90CAN128
CAPÍTULO 1: INTRODUCCIÓN A LOS MICROCONTROLADORES AVR -9-

Familia CAN AVR (Controller Area Network). Para aplicación en redes de conexionado
multiplexado, generalmente en cableado de dispositivos en automóviles. La Tabla 1.2
muestra la familia de Microcontroladores CAN AVR.

Tabla. 1.2. Familia de Microcontroladores CAN AVR


Dispositivo Descripción

Microcontrolador AVR de 8-bit, Memoria Flash de 128K Bytes con ISP y Controlador
CAN. Conforme el standard V2.0A y V2.0B. Perfectamente preparado para
AT90CAN128 aplicaciones Industriales y Automotrices, el microcontrolador soporta la
implementación de CANopen, DeviceNet™ y OSEK™.
Versión Industrial: AT90CAN128 Automotive

Microcontrolador AVR de 8-bit Flash de 32K Bytes con ISP y Controlador CAN.
Conforme el standard V2.0A y V2.0B. Perfectamente preparado para aplicaciones
AT90CAN32
Industriales y Automotrices, el microcontrolador soporta la implementación de
CANopen, DeviceNet™ y OSEK™.

Microcontrolador AVR de 8-bit, Memoria Flash de 64K Bytes con ISP y Controlador
CAN. Conforme el standard V2.0A y V2.0B. Perfectamente preparado para
AT90CAN64
aplicaciones Industriales y Automotrices, el microcontrolador soporta la
implementación de CANopen, DeviceNet™ y OSEK™.

Familia LCD AVR. Para aplicaciones que necesitan desplegar información en Pantalla de
Cristal Líquido (LCD). La Tabla 1.3 muestra la familia de Microcontroladores LCD AVR.

Tabla. 1.3. Familia de Microcontroladores LCD AVR


Dispositivo Descripción

Memoria Flash programable de 16K byte, SRAM de 1 Kbyte, EEPROM de 512 Byte,
Conversor A/D de 8 Canales de 10-bit. Interface JTAG para depuración.
ATmega169 Controlador de LCD de 4 X 25 Segmentos. Rendimiento de hasta 16 MIPS a 16
MHz. Funcionamiento desde 1.8 hasta 5.5 voltios.

Memoria Flash programable de 32K byte, SRAM de 2 Kbyte, EEPROM de 1 Kbyte,


Conversor A/D de 8 Canales de 10-bit. Interface JTAG para depuración.
Controlador de LCD de 4 X 25 Segmentos. Rendimiento de hasta 16 MIPS a 16
ATmega329 MHz. Funcionamiento desde 1.8 hasta 5.5 voltios.
Versión de 100-pin: ATmega3290
Versión 64KB/64-pin: ATmega649
Versión 64KB/100-pin: ATmega6490
CAPÍTULO 1: INTRODUCCIÓN A LOS MICROCONTROLADORES AVR - 10 -

Tabla. 1.3. Familia de Microcontroladores LCD AVR (continuación)


Dispositivo Descripción

Memoria Flash programable de 32K byte, SRAM de 2 Kbyte, EEPROM de 1 Kbyte,


Conversor A/D de 8 Canales de 10-bit. Interface JTAG para depuración.
Controlador de LCD de 4 X 40 Segmentos. Rendimiento de hasta 16 MIPS a 16
ATmega3290
MHz. Funcionamiento desde 1.8 hasta 5.5 voltios.
Versión de 64KB/64-pin: ATmega649
Versión de 64KB/100-pin: ATmega6490

Memoria Flash programable de 64K byte, SRAM de 4 Kbyte, EEPROM de 2 Kbyte,


Conversor A/D de 8 Canales de 10-bit. Interface JTAG para depuración.
Controlador de LCD de 4 X 25 Segmentos. Rendimiento de hasta 16 MIPS a 16
ATmega649
MHz. Funcionamiento desde 1.8 hasta 5.5 voltios.
Versión de 100-pin: ATmega6490
Versión de 32KB/64-pin: ATmega329
Versión de 32KB/100-pin: ATmega3290

Memoria Flash programable de 64K byte, SRAM de 4 Kbyte, EEPROM de 2 Kbyte,


Conversor A/D de 8 Canales de 10-bit. Interface JTAG para depuración.
Controlador de LCD de 4 X 40 Segmentos. Rendimiento de hasta 16 MIPS a 16
ATmega6490
MHz. Funcionamiento desde 1.8 hasta 5.5 voltios.
Versión de 64-pin: ATmega649
Versión de 32KB/64-pin: ATmega329
Versión de 32KB/100-pin: ATmega3290

Familia Lighting AVR. Para aplicaciones con dispositivos y sistemas de Iluminación. La


Tabla 1.4 muestra la familia de Microcontroladores Lighting AVR.

Tabla. 1.4. Familia de Microcontroladores Lighting AVR


Dispositivo Descripción

Diseñado especialmente para aplicaciones de arranque de lámpara y Control de


Motor. El microcontrolador AVR AT90PWM2 ofrece memoria flash de 8 KBytes, 7-
AT90PWM2 modernos canales de PWM, ADC de 8-canales de 8-bit, dos o tres PSC (Power
Stage Controllers) de 12-bit de alta velocidad con Resolución Mejorada de 4-bit,
soporta protocolo DALI.

Diseñado especialmente para aplicaciones de arranque de lámpara y Control de


Motor. El microcontrolador AVR AT90PWM3 ofrece memoria flash de 8 KBytes, 10
AT90PWM3 modernos canales de PWM, ADC de 11-canales de 8-bit, un DAC de 10 bit, dos o
tres PSC (Power Stage Controllers) de 12-bit de alta velocidad con Resolución
Mejorada de 4-bit, soporta protocolo DALI.
CAPÍTULO 1: INTRODUCCIÓN A LOS MICROCONTROLADORES AVR - 11 -

Familia megaAVR. Gran capacidad para aplicaciones de alto desempeño. La Tabla 1.5
muestra la familia de Microcontroladores megaAVR.

Tabla. 1.5. Familia de Microcontroladores Mega AVR


Dispositivo Descripción

Memoria Flash programable de 4K byte, SRAM de 512 byte, EEPROM de 256 byte,
Conversor (TQFP/MLF) A/D de 8 Canales de 10-bit. Sistema de depuración
debugWIRE On-chip. Rendimiento de hasta 20 MIPS a 20 MHz.
ATmega48
Versión de 8Kbyte: ATmega88
Versión de 16Kbyte: ATmega168
Versión Automotriz: ATmega48 Auto, ATmega88 Auto, ATmega168 Auto

Memoria Flash programable de 8K byte, SRAM de 1K byte, EEPROM de 512 byte,


ATmega8
Conversor (TQFP/MLF) A/D de 8 Canales de 10-bit. Rendimiento de hasta 16 MIPS
a 16 MHz. Funcionamiento desde 2.7 hasta 5.5 Voltios.

Memoria Flash programable de 8K byte, SRAM de 1K byte, EEPROM de 512 byte,


Conversor (TQFP/MLF) A/D de 8 Canales de 10-bit. Sistema de depuración
ATmega88 debugWIRE On-chip. Rendimiento de hasta 20 MIPS a 20 MHz.
Versión de 4Kbyte: ATmega48
Versión de 16Kbyte: ATmega168
Versión Automotriz: ATmega48 Auto, ATmega88 Auto, ATmega168 Auto

Memoria Flash programable de 8K byte, SRAM interna de 544 byte + SRAM


ATmega8515 externa de hasta 64K byte, EEPROM de 512 byte, Rendimiento de hasta 16 MIPS a
16 MHz. Funcionamiento desde 2.7 hasta 5.5 Voltios.

Memoria Flash programable de 8K byte, SRAM de 544 byte, EEPROM de 512 byte,
ATmega8535 Conversor A/D de 8 Canales de 10-bit. Rendimiento de hasta 16 MIPS a 16 MHz.
Funcionamiento desde 2.7 hasta 5.5 Voltios.

Memoria Flash programable de 16K byte, SRAM de 1K byte, EEPROM de 512 byte,
ATmega16 Conversor A/D de 8 Canales de 10-bit. Interface JTAG para depuración.
Rendimiento de hasta 16 MIPS a 16 MHz. Funcionamiento desde 2.7 hasta 5.5
Voltios.

Memoria Flash programable de 16K byte, SRAM de 1K byte, EEPROM de 512 byte,
ATmega162 Interface JTAG para depuración. Rendimiento de hasta 16 MIPS a 16 MHz.
Funcionamiento desde 1.8 hasta 5.5 Voltios.

Memoria Flash programable de 16K byte, SRAM de 1K byte, EEPROM de 512 byte,
Conversor A/D de 8 Canales de 10-bit. Interface JTAG para depuración.
ATmega164 Rendimiento de hasta 20 MIPS a 20 MHz. Funcionamiento desde 1.8 hasta 5.5
Voltios.
Versión de 64KB: ATmega644
Versión de 32KB: ATmega324
CAPÍTULO 1: INTRODUCCIÓN A LOS MICROCONTROLADORES AVR - 12 -

Tabla. 1.5. Familia de Microcontroladores Mega AVR (continuación)


Dispositivo Descripción

Memoria Flash programable de 16K byte, SRAM de 1K byte, EEPROM de 512 byte,
Conversor A/D de 8 Canales de 10-bit. Interface JTAG para depuración.
ATmega165 Rendimiento de hasta 16 MIPS a 16 MHz. Funcionamiento desde 1.8 hasta 5.5
Voltios.

Memoria Flash programable de 16K byte, SRAM de 1K byte, EEPROM de 512 byte,
Conversor (TQFP/MLF) A/D de 8 Canales de 10-bit. Sistema de depuración
debugWIRE On-chip. Rendimiento de hasta 20 MIPS a 20 MHz.
ATmega168 Versión de 4Kbyte: ATmega48
Versión de 8Kbyte: ATmega88
Versión Automotriz: ATmega48 Auto, ATmega88 Auto, ATmega168 Auto

Memoria Flash programable de 32K byte, SRAM de 2K byte, EEPROM de 1K byte,


Conversor A/D de 8 Canales de 10-bit. Interface JTAG para depuración.
ATmega32
Rendimiento de hasta 16 MIPS a 16 MHz. Funcionamiento desde 2.7 hasta 5.5
Voltios.

Memoria Flash programable de 32K byte, SRAM de 2K byte, EEPROM de 1K byte,


Conversor A/D de 8 Canales de 10-bit. Interface JTAG para depuración.
ATmega324 Rendimiento de hasta 20 MIPS a 20 MHz. Funcionamiento desde 1.8 hasta 5.5
Voltios.
Versión de 64KB: ATmega644
Versión de 16KB: ATmega164

Memoria Flash programable de 32K byte, SRAM de 2K byte, EEPROM de 1K byte,


Conversor A/D de 8 Canales de 10-bit. Interface JTAG para depuración.
Rendimiento de hasta 16 MIPS a 16 MHz. Funcionamiento desde 1.8 hasta 5.5
ATmega325
Voltios.
Versión de 100-pin: ATmega3250
Versión de 64KB/64-pin: ATmega645
Versión de 64KB/100-pin: ATmega6450

Memoria Flash programable de 32K byte, SRAM de 2K byte, EEPROM de 1K byte,


Conversor A/D de 8 Canales de 10-bit. Interface JTAG para depuración.
Rendimiento de hasta 16 MIPS a 16 MHz. Funcionamiento desde 1.8 hasta 5.5
ATmega3250
Voltios.
Versión de 64-pin: ATmega325
Versión de 64KB/64-pin: ATmega645
Versión de 64KB/100-pin: ATmega6450
CAPÍTULO 1: INTRODUCCIÓN A LOS MICROCONTROLADORES AVR - 13 -

Tabla. 1.5. Familia de Microcontroladores Mega AVR (continuación)


Dispositivo Descripción

Memoria Flash programable de 64K byte, SRAM de 4K byte, EEPROM de 2K byte,


Conversor A/D de 8 Canales de 10-bit. Interface JTAG para depuración.
Rendimiento de hasta 20 MIPS a 20 MHz. Funcionamiento desde 1.8 hasta 5.5
ATmega644
Voltios.
Versión de 32KB: ATmega324
Versión de 16KB: ATmega164

Memoria Flash programable de 64K byte, SRAM de 4K byte, EEPROM de 2K byte,


ATmega64 Conversor A/D de 8 Canales de 10-bit. Interface JTAG para depuración.
Rendimiento de hasta 16 MIPS a 16 MHz. Funcionamiento desde 2.7 hasta 5.5
Voltios.

Memoria Flash programable de 64K byte, SRAM de 4K byte, EEPROM de 2K byte,


Conversor A/D de 8 Canales de 10-bit. Interface JTAG para depuración.
Rendimiento de hasta 16 MIPS a 16 MHz. Funcionamiento desde 1.8 hasta 5.5
ATmega645
Voltios.
Versión de 100-pin: ATmega6450
Versión de 32KB/64-pin: ATmega325
Versión de 32KB/100-pin: ATmega3250

Memoria Flash programable de 64K byte, SRAM de 4K byte, EEPROM de 2K byte,


Conversor A/D de 8 Canales de 10-bit. Interface JTAG para depuración.
Rendimiento de hasta 16 MIPS a 16 MHz. Funcionamiento desde 1.8 hasta 5.5
ATmega6450
Voltios.
Versión de 64-pin: ATmega645
Versión de 32KB/64-pin: ATmega325
Versión de 32KB/100-pin: ATmega3250

Memoria Flash programable de 64K byte, SRAM de 8K byte, EEPROM de 4K byte,


Conversor A/D de 16 Canales de 10-bit. Interface JTAG para depuración.
Rendimiento de hasta 16 MIPS a 16 MHz. Funcionamiento desde 1.8 hasta 5.5
ATmega640 Voltios.
Versión de 128KB/64-pin: ATmega1281
Versión de 128KB/100-pin: ATmega1280
Versión de 256KB/64-pin: ATmega2561
Versión de 256KB/100-pin: ATmega2560

Memoria Flash programable de 128K byte, SRAM de 4K byte, EEPROM de 4K byte,


Conversor A/D de 8 Canales de 10-bit. Interface JTAG para depuración.
ATmega128
Rendimiento de hasta 16 MIPS a 16 MHz. Funcionamiento desde 2.7 hasta 5.5
Voltios.
CAPÍTULO 1: INTRODUCCIÓN A LOS MICROCONTROLADORES AVR - 14 -

Tabla. 1.5. Familia de Microcontroladores Mega AVR (continuación)


Dispositivo Descripción

Memoria Flash programable de 128K byte, SRAM de 8K byte, EEPROM de 4K byte,


Conversor A/D de 8 Canales de 10-bit. Interface JTAG para depuración.
Rendimiento de hasta 16 MIPS a 16 MHz. Funcionamiento desde 1.8 hasta 5.5
Voltios.
ATmega1281
Versión de 64KB/100-pin: ATmega640
Versión de 128KB/100-pin: ATmega1280
Versión de 256KB/64-pin: ATmega2561
Versión de 256KB/100-pin: ATmega2560

Memoria Flash programable de 128K byte, SRAM de 8K byte, EEPROM de 4K byte,


Conversor A/D de 16 Canales de 10-bit. Interface JTAG para depuración.
Rendimiento de hasta 16 MIPS a 16 MHz. Funcionamiento desde 1.8 hasta 5.5
ATmega1280 Voltios.
Versión de 64KB/100-pin: ATmega640
Versión de 128KB/64-pin: ATmega1281
Versión de 256KB/64-pin: ATmega2561
Versión de 256KB/100-pin: ATmega2560

Memoria Flash programable de 256K byte, SRAM de 8K byte, EEPROM de 4K byte,


Conversor A/D de 8 Canales de 10-bit. Interface JTAG para depuración.
Rendimiento de hasta 16 MIPS a 16 MHz. Funcionamiento desde 1.8 hasta 5.5
ATmega2561 Voltios.
Versión de 64KB/100-pin: ATmega640
Versión de 128KB/64-pin: ATmega1281
Versión de 128KB/100-pin: ATmega1280
Versión de 256KB/100-pin: ATmega2560

Memoria Flash programable de 256K byte, SRAM de 8K byte, EEPROM de 4K byte,


Conversor A/D de 16 Canales de 10-bit. Interface JTAG para depuración.
Rendimiento de hasta 16 MIPS a 16 MHz. Funcionamiento desde 1.8 hasta 5.5
ATmega2560 Voltios.
Versión de 64KB/100-pin: ATmega640
Versión de 128KB/64-pin: ATmega1281
Versión de 128KB/100-pin: ATmega1280
Versión de 256KB/64-pin: ATmega2561
CAPÍTULO 1: INTRODUCCIÓN A LOS MICROCONTROLADORES AVR - 15 -

Familia SmartBattery AVR. Para aplicaciones que necesitan administración de batería de


forma Inteligente. La Tabla 1.6 muestra la familia de Microcontroladores SmartBattery
AVR.

Tabla. 1.6. Familia de Microcontroladores SmartBattery AVR


Dispositivo Descripción

Memoria Flash programable de 40K byte, SRAM de 2K byte, EEPROM de 512 byte,
hasta 4 Celdas de Batería en serie, equilibrio de celda, protección contra bajo
voltaje, protección contra sobre corriente y corto circuito, ADC de 12 bit para
ATmega406
voltaje, medición de corriente tipo Contador de Coulomb, interface SM-bus,
interface JTAG para depuración, Rendimiento de hasta 1 MIPS a 1 MHz.
Funcionamiento desde 4 hasta 25 Voltios.

Familia TinyAVR: Diminuto, para aplicaciones que necesitan optimizar espacio. La Tabla
1.7 muestra la familia de Microcontroladores TinyAVR.

Tabla. 1.7. Familia de Microcontroladores Tiny AVR


Dispositivo Descripción

Memoria de Programa Flash programable en el sistema 1K byte, SRAM de 32 byte.


ATtiny11
Rendimiento de hasta 6 MIPS a 6 MHz

Memoria de Programa Flash programable de 1K byte, SRAM de 32 byte, EEPROM


ATtiny12
de 64 byte. Rendimiento de hasta 8 MIPS a 8 MHz.

Memoria de Programa Flash programable de 1K byte, SRAM de 64 byte, EEPROM


ATtiny13 de 64 byte, Archivo de Registro de 32 byte, A/D de 4 canales de 10 bit.
Rendimiento de hasta 20 MIPS a 20 MHz.

Memoria de Programa Flash programable de 1K byte, EEPROM de 64 byte, Archivo


ATtiny15L de Registro de 32 byte, A/D de 4 canales de 10 bit. Rendimiento de hasta 1.6 MIPS
a 1.6 MHz.

Memoria Flash programable de 2K byte, SRAM de 128 byte, EEPROM programable


ATtiny2313 de 128 byte, Interface Serial Universal USI, UART Full Duplex, debugWIRE para
depuración. Rendimiento de hasta 20 MIPS a 20 MHz.
CAPÍTULO 1: INTRODUCCIÓN A LOS MICROCONTROLADORES AVR - 16 -

Tabla. 1.7. Familia de Microcontroladores Tiny AVR (continuación)


Dispositivo Descripción

Memoria Flash programable en el sistema de 2K byte, SRAM de 128 byte, EEPROM


programable de 128 byte, temporizadores/contadores de 8 bit y 16 bit con PWM,
ADC de 10-bit. Interface Serial Universal USI, Sensor de Temperatura, debugWIRE
ATtiny24 para depuración. Rendimiento de hasta 20 MIPS a 20 MHz, funcionamiento en 1.8
hasta 5.5 V.
Version de 8KB: ATtiny84
Version de 4KB: ATtiny44

Memoria Flash programable en el sistema de 2K byte, SRAM de 128 byte, EEPROM


programable de 128 byte, dos temporizadores/contadores de 8 bit con PWM y
prescaler, ADC de 10-bit. Interface Serial Universal USI, debugWIRE para
ATtiny25
depuración. Rendimiento de hasta 20 MIPS a 20 MHz, funcionamiento en 1.8 hasta
5.5 V.
Versión de 8KB: ATtiny85
Versión de 4KB: ATtiny45

Memoria Flash de 2K bytes, SRAM de 128 Bytes, EEPROM de 128-Byte, 11 canales


ATtiny26 ADC de 10-bit. Interface Serial Universal. PWM de alta frecuencia. Rendimiento de
hasta 16 MIPS a 16 MHz.

Memoria Flash de 2K bytes, archivo de registros de 32 bytes, Interrupción para


ATtiny28L teclado, accionador de LED de alta corriente, Comparador Análogo. Rendimiento de
hasta 4 MIPS a 4 MHz.

Memoria Flash programable en el sistema de 4K byte, SRAM de 256 byte, EEPROM


programable de 256 byte, temporizador/contadores de 8 bit y 16 bits con PWM,
ADC de 10-bit. Interface Serial Universal USI, Sensor de Temperatura, debugWIRE
ATtiny44
para depuración. Rendimiento de hasta 20 MIPS a 20 MHz, funcionamiento en 1.8
hasta 5.5 V.
Versión de 8KB: ATtiny84
Versión de 2KB: ATtiny24

Memoria Flash programable en el sistema de 4K byte, SRAM de 256 byte, EEPROM


programable de 256 byte, Dos temporizadores/contadores de 8 bit con PWM y
prescaler, ADC de 10-bit. Interface Serial Universal USI, debugWIRE para
ATtiny45
depuración. Rendimiento de hasta 20 MIPS a 20 MHz, funcionamiento en 1.8 hasta
5.5 V.
Versión de 8KB: ATtiny85
Versión de 2KB: ATtiny25
CAPÍTULO 1: INTRODUCCIÓN A LOS MICROCONTROLADORES AVR - 17 -

Tabla. 1.7. Familia de Microcontroladores Tiny AVR (continuación)


Dispositivo Descripción

Memoria Flash programable en el sistema de 8K byte, SRAM de 512 byte, EEPROM


programable de 512 byte, temporizador/contadores de 8 bit y 16 bits con PWM,
ADC de 10-bit. Interface Serial Universal USI, Sensor de Temperatura, debugWIRE
ATtiny84 para depuración. Rendimiento de hasta 20 MIPS a 20 MHz, funcionamiento en 1.8
hasta 5.5 V.
Versión de 4KB: ATtiny44
Versión de 2KB: ATtiny24

Memoria Flash programable en el sistema de 8K byte, SRAM de 512 byte, EEPROM


programable de 512 byte, Dos temporizadores/contadores de 8 bit con PWM y
prescaler, ADC de 10-bit. Interface Serial Universal USI, debugWIRE para
ATtiny85
depuración. Rendimiento de hasta 20 MIPS a 20 MHz, funcionamiento en 1.8 hasta
5.5 V.
Versión de 4KB: ATtiny45
Versión de 2KB: ATtiny25
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 18 -

CAPÍTULO 2

EL MICROCONTROLADOR AVR ATMEGA169

2.1. CARACTERÍSTICAS DEL MICROCONTROLADOR ATMEGA169


El ATmega169 es un Microcontrolador de 8 bits con arquitectura AVR RISC, este
posee las siguientes características:

• Arquitectura RISC avanzada.


− Conjunto de 130 instrucciones ejecutables en un solo ciclo de reloj.
− 32 x 8 registros de trabajo de propósito general.
− Rendimiento de hasta 16 MIPS a 16 MHz.

• Memoria no volátil para Programa y Datos.


- Flash de 16 K bytes, auto-programable en el sistema.
Resistencia: 10 000 ciclos de Escritura/Borrado.
- Sección Opcional para Código de Arranque con Lock Bits Independientes.
Programación en el Sistema a través del Programa de Arranque residente
en el chip.
Operación Real de Lectura Durante la Escritura.
- EEPROM de 512 bytes.
Resistencia: 100 000 ciclos de Escritura/Borrado.
- SRAM Interna de 1 Kbyte.
- Bloqueo de Programación para Seguridad del Software.

• Interfaz JTAG (conforme el Standard IEEE 1149.1)


− Capacidad de Boundary-Scan Acorde al Standard JTAG.
− Soporta Depuración On-chip.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 19 -

− Programación de la FLASH, EEPROM, Fusibles y Lock Bits a través de la


Interfaz JTAG.

• Características de los Periféricos.


− 6 puertos de I/O de 8-bits y 1 de 5-bits.
− Controlador de LCD de 4 x 25 segmentos.
− Dos Temporizadores/Contadores de 8 bits con Preajustador (Prescaler)
Separado y Modo de Comparación.
− Un Temporizador/Contador de 16 bits con Preajustador (Prescaler) Separado,
Modo de Comparación y Modo de Captura.
− Contador de Tiempo Real con Oscilador Separado.
− Cuatro canales PWM.
− Ocho canales ADC de 8 bits cada uno.
− Interfaz Serial USART Programable.
− Interfaz Serial SPI Maestro/Esclavo.
− Interfaz Serial Universal con Detector de Condición de Inicio.
− WatchDog Timer Programable con Oscilador Separado incluido en el chip.
− Comparador Analógico.
− Interrupción y Salida del Modo de Sleep por Cambio en Pin.

• Características especiales del microcontrolador.


− Reset al Encendido y Detección Brown-Out Programable.
− Oscilador Interno Calibrable.
− Fuentes de Interrupción Internas y Externas.
− Cinco Modos de Sleep: Idle, ADC Noise Reduction, Power Save, Power-Down
y Standby.

• Entradas/Salidas y Tipo de Encapsulado


− 53 Líneas de I/O Programables.
− 64 patillas en el encapsulado TQFP y 64 pads (para montaje superficial) en el
encapsulado QFN/MLF.

• Rangos de Velocidad
− ATmega169V: 0 – 4 MHz a 1.8 – 5.5 V, 0 – 8 MHz a 2.7 – 5.5 V.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 20 -

− ATmega169: 0 – 8 MHz a 2.7 – 5.5 V, 0 – 16 MHz a 4.5 – 5.5 V.

• Rango de Temperatura
− Desde -40 º C a 85 ºC.

• Consumo de Energía
− En el Modo Activo:
1 MHz, 1.8 V: 350 uA.
32 KHz, 1.8 V: 20 uA (incluyendo Oscilador).
32 KHz, 1.8 V: 40 uA (incluyendo Oscilador y LCD).
− En el Modo Power-Down:
0.1 uA a 1.8 V.

El AVR ATmega169 es compatible con un completo conjunto de programas y


Herramientas de Desarrollo que incluye: Compiladores C, Ensambladores de Macro,
Depurador/Simuladores de Programa, Emuladores de Circuito, Kits de Iniciación y Kits
Evaluación.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 21 -

2.2. DIAGRAMA DE BLOQUES DEL MICROCONTROLADOR AVR


ATMEGA169
En la Figura 2.1 se observa el Diagrama de Bloques del Microcontrolador
ATmega169.

Figura. 2.1. Diagrama de Bloques.

EL núcleo AVR combina un rico conjunto de instrucciones con 32 Registros de


Trabajo de Propósito General (General Purpose Working Registers). Todos los 32 registros
están conectados directamente a la Unidad de Lógica Aritmética (ALU), permitiendo que
se acceda a dos registros independientes en una sola instrucción ejecutada en un ciclo de
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 22 -

reloj. La arquitectura da como resultado código más eficiente mientras que el rendimiento
alcanzado es diez veces más rápido que los convencionales microcontroladores CISC.

Este dispositivo se fabrica empleando tecnología Atmel de memoria no volátil de alta


densidad. La Flash ISP en el Chip permite que la memoria de programa se reprograme en
el sistema a través de una interfaz serial SPI, por un programador convencional de
memoria no volátil ó por un programa de Arranque (Boot Program) residente en el Chip
ejecutándose en el núcleo del AVR. El programa de Arranque puede usar cualquier interfaz
(SPI, USART, UART) para descargar el programa de la aplicación en la memoria Flash de
Aplicación. El Software en la sección Flash de Arranque continuará ejecutándose mientras
la sección Flash de Aplicación esté actualizándose, proporcionando la operación real de
Lectura durante la Escritura.

Al combinar una CPU RISC de 8 bits con una Flash Auto programable en el Sistema
sobre un chip monolítico, el ATmega169 de Atmel se convierte en un microcontrolador
poderoso que provee una solución altamente flexible y de efectividad de costo para muchas
aplicaciones de control integrado.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 23 -

2.3. CONFIGURACIÓN DE PINES DEL MICROCONTROLADOR AVR


ATMEGA169
En la Figura 2.2 se ilustra la distribución de pines del microcontrolador
ATmega169V, en éste se aprecia el encapsulado MLF de 64 pines.

Figura. 2.2. Distribución de Pines del ATmega169

VCC. Voltaje de suministro digital.

GND. Tierra.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 24 -

Puerto A (PA7…PA0). El Puerto A es un puerto bi-direccional de I/O de 8-bits con


resistencias pull-up internas (seleccionables para cada bit). Los buffers de salida del Puerto
A tienen características de controlador simétricas, con capacidad alta tanto de fuente
(source) como de sumidero (drain). Como entradas, si las resistencias pull-up están
activadas los pines del Puerto A que estén externamente enganchados a un nivel bajo serán
fuentes de corriente. Los pines del Puerto A están en alta impedancia cuando una
condición de reset se activa, incluso si el reloj no está corriendo.

Puerto B (PB7…PB0). El Puerto B es un puerto bi-direccional de I/O de 8-bits con


resistencias pull-up internas (seleccionables para cada bit). Los buffers de salida del Puerto
B tienen características de controlador simétricas, con capacidad alta tanto de fuente
(source) como de sumidero (drain). Como entradas, si las resistencias pull-up están
activadas los pines del Puerto B que estén externamente enganchados a un nivel bajo serán
fuentes de corriente. Los pines del Puerto B están en alta impedancia cuando una condición
de reset se activa, incluso si el reloj no está corriendo.

Puerto C (PC7…PC0). El Puerto C es un puerto bi-direccional de I/O de 8-bits con


resistencias pull-up internas (seleccionables para cada bit). Las características de este
puerto son las mismas que las descritas anteriormente para el puerto A.

Puerto D (PD7…PD0). El Puerto D es un puerto bi-direccional de I/O de 8-bits con


resistencias pull-up internas (seleccionables para cada bit). Las características de este
puerto son las mismas que las descritas anteriormente para el puerto A.

Puerto E (PE7…PE0). El Puerto E es un puerto bi-direccional de I/O de 8-bits con


resistencias pull-up internas (seleccionables para cada bit). Las características de este
puerto son las mismas que las descritas anteriormente para el puerto A.

Puerto F (PF7…PF0). El Puerto F sirve como entradas analógicas para el conversor A/D
(Analógico a Digital).
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 25 -

El Puerto F también sirve como un puerto bi-direccional de Entrada/Salida de 8 bits,


si el conversor A/D no se está utilizando. Los buffers de salida del Puerto F tienen
características de controlador simétricas, con capacidad alta tanto de fuente (source) como
de sumidero (drain). Como entradas, si las resistencias pull-up están activadas los pines del
Puerto F que estén externamente enganchados a un nivel bajo serán fuentes de corriente.
Los pines del Puerto F están en alta impedancia cuando una condición de reset se activa,
incluso si el reloj no está corriendo. Si la interfaz JTAG es habilitada, las resistencias pull-
up de los pines PF7 (TDI), PF5 (TMS) y PF4 (TCK) se activarán aún si ocurre un reset.

Puerto G (PG0…PG0). El Puerto G es un puerto bi-direccional de I/O de 5-bits con


resistencias pull-up internas (seleccionables para cada bit). Las características de este
puerto son las mismas que las descritas anteriormente para el puerto A.

RESET . Entrada de reset.

XTAL1. Entrada al amplificador del oscilador y entrada al circuito de funcionamiento del


reloj interno.

XTAL2. Salida del amplificador del oscilador.

AVCC. El Pin AVCC sirve de fuente de voltaje para el Puerto F y para el conversor A/D.
Este debe ser conectado externamente a VCC, aún si el ADC no se está usando. Si se está
usando el ADC, el AVCC debe conectarse a VCC a través de un filtro pasa bajo.

AREF. Éste es el Pin de Referencia Analógica para el conversor A/D.

LCDCAP. Un condensador externo (típicamente mayor a 470nF) debe conectarse al Pin


LCDCAP. Este condensador actúa como un reservorio de energía para el LCD (VLCD). Una
capacitancia grande reduce el rizo (ondulaciones) en el VLCD pero incrementa el tiempo
hasta el cual el VLCD alcanza su valor deseado.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 26 -

Todos los pines de los puertos de I/O tienen funciones multiplexadas, esto se
explicará con detalle más adelante en la sección “Puertos de I/O”.

2.4. EL NÚCLEO DE LA CPU (CPU CORE)


La función principal del núcleo de la CPU es asegurar la correcta ejecución del
programa. La CPU por lo tanto puede acceder a las memorias, realizar cálculos, controlar
periféricos y manejar interrupciones.

Para aumentar al máximo el desempeño y el paralelismo, AVR usa una arquitectura


Harvard con memorias y buses separados para programa y datos. Las instrucciones en la
memoria de programa son ejecutadas con pipelining de un nivel. Mientras una instrucción
está ejecutándose, la siguiente instrucción se pre-extrae de la memoria de programa. Esta
idea permite ejecutar las instrucciones con cada ciclo de reloj. La memoria para programa
es del tipo Flash Re-Programable en el Sistema (In-System Reprogrammable).

Figura. 2.3. Diagrama de Bloques de la Arquitectura AVR.


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 27 -

Como se observa en la Figura 2.3, el Fichero de Registro (Register File) de acceso


rápido contiene 32 Registros de Trabajo de Propósito General (General Purpose Registers)
de 8-bits con tiempo de acceso de un ciclo de reloj. Esto permite el funcionamiento de
ciclo único de la Unidad de Lógica Aritmética (ALU). En un típico funcionamiento de la
ALU, dos operandos salen del Fichero de Registro (Register File), la operación se ejecuta y
el resultado se realmacena en el Fichero de Registro en un solo ciclo de reloj.

Seis de los 32 registros pueden ser usados como tres Punteros (X, Y y Z) para el
Direccionamiento Indirecto de 16-bits del Espacio de Datos, permitiendo el cálculo
eficiente de las direcciones. Uno de estos punteros se usa además como puntero de
direcciones para la función de búsqueda en tablas en la memoria Flash de programa.

La ALU soporta operaciones aritméticas y lógicas entre registros ó entre una


constante y un registro. Después de una operación aritmética, el Registro de Estado se
actualiza para mostrar información acerca del resultado de la operación.

El flujo del programa es proporcionado por saltos condicionales e incondicionales y


por instrucciones de llamada, pudiendo direccionar directamente el espacio total de
direcciones. La mayoría de las instrucciones AVR tiene un simple formato de palabra de
16 bits. Cada dirección de memoria de programa contiene una instrucción de 16 ó 32 bits.

El espacio para programa en la memoria Flash se divide en dos secciones, la sección


para el Programa de Arranque (Boot Program) y la sección para el Programa de la
Aplicación (Application Program). Ambas secciones tienen Lock bits especializados para
protección de escritura y de lectura/escritura.

Durante las llamadas a interrupciones y subrutinas, la dirección de retorno del


Contador de Programa (PC – Program Counter) se almacena en la Pila (Stack). La Pila se
encuentra eficazmente situada en la SRAM de datos general, y consecuentemente el
tamaño de la Pila está únicamente limitado por el tamaño total de la SRAM y por uso de la
SRAM. Todos los programas del usuario deben inicializar el SP en la rutina de Reset
(antes de ejecutar subrutinas o interrupciones). El Puntero de la Pila (SP) es accesible en
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 28 -

lectura/escritura en el espacio de I/O. Los datos de la SRAM pueden ser fácilmente


accedidos a través de cinco modos diferentes de direccionamiento que soporta la
arquitectura AVR.

Todos los espacios de memoria en la arquitectura AVR son mapas lineales y


regulares de memoria.

Un módulo de interrupción flexible tiene sus registros de control en el espacio de


I/O, con un bit adicional para Habilitación Global de Interrupción (Global Interrupt Enable
bit) en el Registro de Estados (Status Register). Todas las Interrupciones tienen un Vector
de Interrupción separado en la Tabla de Vectores de Interrupción. Las interrupciones
tienen prioridad en concordancia con la posición de su Vector de Interrupción en la Tabla.

El espacio de memoria de I/O contiene 64 direcciones para funciones periféricas de


la CPU tales como Registros de Control, SPI y otras funciones de I/O. La Memoria de I/O
puede accederse directamente, o como localidades del Espacio de Datos siguientes al
Fichero de Registro (Register File), 0x20 – 0x5F. Adicionalmente, el ATmega169 tiene
espacio extendido de I/O desde 0x60 – 0xFF en la SRAM en donde solo pueden usarse las
instrucciones ST/STS/STD y LD/LDS/LDD.

2.4.1. ALU – Unidad de Lógica Aritmética (Arithmetic Logic Unit)


El alto rendimiento de la AVR ALU opera en conexión directa con todos los 32
registros activos de propósito general. Dentro de un ciclo de reloj, son ejecutadas las
operaciones entre registros de propósito general ó entre un registro y una constante. Las
operaciones de la ALU se dividen dentro de tres categorías principales: aritmética, lógica,
y operaciones con bits. Algunas implementaciones de la arquitectura también proveen un
poderoso multiplicador que soporta ambas multiplicaciones signed/unsigned y formato
fraccional.

2.4.2. El Registro de Estado (Status Register)


El Registro de Estado (Status Register) contiene información del resultado de la
mayoría de instrucciones aritméticas recientemente ejecutadas. Nótese que el Registro de
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 29 -

Estado se actualiza luego de todas las operaciones de la ALU. Esto determina en muchos
casos eliminar la necesidad de usar las instrucciones especializadas de comparación, dando
como resultado código más compacto y rápido.

El Registro de Estado (Status Register) no se almacena automáticamente al entrar en


una rutina de interrupción y no se restaura al volver de una interrupción. Este debe ser
manipulado por software.

El Registro de Estado, SREG, está definido de la siguiente forma:

Bit 7 – I: Habilitador Global de Interrupciones (Global Interrupt Enable). El bit


Habilitador Global de Interrupciones debe ser escrito con uno lógico “1” (fijado en 1) para
habilitar las interrupciones. Si el bit de Habilitador Global de Interrupciones está fijado en
“0”, ninguna de las interrupciones se habilita. El bit I puede fijarse en “1” (uno - set) ó en
“0” (cero - cleared) con las instrucciones SEI y CLI, respectivamente.

Bit 6 – T: Almacenamiento de la Copia del Bit (Bit Copy Storage). Las instrucciones
para Copiar Bits (Bit Copy), BLD (Bit LoaD) y BST (Bit STore), usan al bit T como
origen o destino del bit operado.

Bit 5 – H: Indicador de Acarreo Medio (Half Carry). El Acarreo Medio es útil en


aritmética BCD.

Bit 4 – S: Bit de Signo, S=N ⊕ V. El bit S es el resultado de una operación OR exclusiva


(XOR) entre el Indicador N de Resultado Negativo y el Indicador V de Desbordamiento
del Complemento a Dos.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 30 -

Bit 3 – V: Indicador de Desbordamiento del Complemento a Dos. El Indicador V


soporta aritmética de complemento a dos.

Bit 2 – N: Indicador de Resultado Negativo. El bit N indica un resultado negativo en una


operación aritmética o lógica.

Bit 1 – Z: Indicador de Resultado Cero. El bit Z indica un resultado cero “0” en una
operación aritmética o lógica.

Bit 0 – C: Indicador de Acarreo. El bit C indica existencia de acarreo en una operación


aritmética o lógica.

2.4.3. El Fichero del Registro de Propósito General (General Purpose Register File)
El Fichero de Registro (Register File) está optimizado para el conjunto mejorado de
instrucciones RISC AVR. Para alcanzar el desempeño y la flexibilidad requerida, los
siguientes esquemas de entrada/salida (input/output) son soportados por el Fichero de
Registro (Register File):

• Un operando de salida de 8 bits y una entrada de resultado de 8 bits.


• Dos operandos de salida de 8 bits y una entrada de resultado de 8 bits.
• Dos operandos de salida de 8 bits y una entrada de resultado de 16 bits.
• Dos operandos de salida de 16 bits y una entrada de resultado de 16 bits.

En la Figura 2.4 se muestra la estructura de los 32 Registros de Trabajo de Propósito


General en la CPU.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 31 -

Figura. 2.4. Registros de Trabajo de Propósito General de la CPU AVR.

La mayoría de las instrucciones que operan sobre el Fichero de Registro (Register


File) tienen acceso directo a todos los registros y la mayoría de estas son instrucciones de
un ciclo.

Como se muestra en la Figura 2.4, a cada registro también se le asigna una dirección
de memoria de datos, directamente dentro de las primeras 32 localidades del Espacio de
Datos (Data Space) del usuario. Aunque no se implemente físicamente como localidades
de SRAM, esta organización de memoria provee gran flexibilidad en el acceso a los
registros, puesto que los registros punteros X, Y y Z pueden setearse para indexar cualquier
registro en el fichero.

Los Registros X, Y, y Z. Los registros R26...R31 tienen algunas funciones adicionadas a


su uso de propósito general. Estos registros son punteros de dirección de 16 bits para
direccionamiento indirecto del espacio de datos. Estos tres registros de dirección indirecta
X, Y, y Z se definen como se muestra en la Figura 2.5.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 32 -

Figura. 2.5. Los Registros X, Y, y Z.

En los diferentes modos de direccionamiento estos registros tienen funciones tales


como desplazamiento fijo, incremento automático y decremento automático.

2.4.4. El Puntero de la Pila – SP (Stack Pointer)


La Pila (Stack) se usa principalmente para almacenamiento temporal de datos, para
almacenar variables locales y para almacenar direcciones de retorno luego de
interrupciones y llamadas a subrutinas. El Registro del Puntero de la Pila (Stack Pointer
Register) siempre apunta hacia el tope superior de la Pila. Hay que notar que la Pila se
implementa creciendo desde las localidades superiores de memoria hacia las localidades
inferiores de memoria. Esto implica que un comando PUSH de la Stack decrementa al
Stack Pointer.

El Puntero de la Pila (Stack Pointer) apunta hacia el área de la Pila de datos de la


SRAM donde se sitúan las Pilas de Subrutina e Interrupción. El espacio de la Pila en la
SRAM de datos debe definirse en el programa antes de que ejecutar cualquier llamada de
subrutina o antes de que se habiliten las interrupciones. El Stack Pointer debe ser seteado
para apuntar por encima de 0xFF. El Puntero de la Pila se decrementa por uno cuando el
dato es colocado (pushed) dentro de la Pila con la instrucción PUSH; y se decrementa por
dos cuando se coloca (pushed) la dirección de retorno dentro la Pila al producirse una
llamada a subrutina o la interrupción. El Puntero de la Pila se incrementa por uno cuando
se saca (popped) al dato de la Pila con la instrucción POP; y se incrementa por dos cuando
se saca (popped) al dato de la Pila con el retorno desde la Subrutina RET o con el retorno
desde la interrupción RETI.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 33 -

El Puntero de la Pila AVR está implementado como dos registros de 8 bits en el


espacio de I/O. El número de bits actualmente usado depende de la implementación. Hay
que notar que el espacio de datos en algunas implementaciones de la arquitectura AVR es
tan pequeño que solo se necesita el SPL (byte bajo del SP). En este caso, no estará presente
el Registro SPH (byte alto del SP). A continuación se observa el Stack Pointer Register:

2.4.5. Manipulación del reset y de la Interrupción


El AVR provee varias fuentes de interrupción. Estas interrupciones y el Vector de
Reset (Reset Vector) separado, tienen cada uno un vector de programa separado en el
espacio de memoria de programa. A todas las interrupciones se les asigna bits de
habilitación (enable bits), estos bits deben ser escritos con un uno lógico, conjuntamente
con el bit de Habilitación Global de Interrupciones (Global Interrupt Enable bit) del
Registro de Estado (Status Register), para habilitar las interrupciones necesarias en la
aplicación. Dependiendo del valor del Contador del Programa (Counter Program), las
interrupciones pueden deshabilitarse automáticamente cuando los Boot Lock bits BLB03 o
BLB12 están programados. Esta característica mejora la seguridad del software.

Las direcciones más bajas en el espacio de memoria de programa están predefinidas


como los Vectores de Reset y de Interrupción. RESET tiene la prioridad más alta y luego
está INT0, la Petición de la Interrupción Externa 0 (External Interrupt Request 0). Los
Vectores de Interrupción pueden ser movidos hacia el inicio de la sección Flash de
Arranque (Boot Flash), configurando el bit IVSEL en el Registro de Control de la MCU
(MCUCR). El Vector de Reset también puede ser movido hacia el inicio de la sección
Flash de Arranque (Boot Flash), programando el BOOTRST Fuse.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 34 -

Cuando una interrupción ocurre, el bit I de Habilitación Global de Interrupciones se


borra y todas las interrupciones se deshabilitan. El software del usuario puede escribir un 1
lógico en el bit I para habilitar las interrupciones. Entonces todas las interrupciones
habilitadas pueden interrumpir la rutina de interrupción actual. El bit I se pone
automáticamente en 1 lógico cuando se ejecuta un Retorno desde la instrucción de
Interrupción, RETI.

Estos son básicamente dos tipos de interrupciones:

El primer tipo se activa por un evento que pone en 1 lógico al Indicador de


Interrupción. Para estas interrupciones, el Contador del Programa se vectoriza en el actual
Vector de Interrupción para ejecutar la rutina que maneja la interrupción y el hardware
limpia al correspondiente Indicador de Interrupción. Si ocurre una condición de
interrupción mientras se limpia al bit de habilitación correspondiente a la interrupción, el
Indicador de Interrupción se pondrá en “1” y permanecerá fijo hasta que se habilite a la
interrupción ó hasta que el indicador sea borrado por software. Similarmente, si una o más
condiciones de interrupción ocurren mientras el bit de Habilitación Global de Interrupción
es borrado, el Indicador(es) de Interrupción Correspondiente se pondrá en “1” y
permanecerá fijo hasta que el bit de Habilitación Global de Interrupciones sea ponga a “1”,
entonces las interrupciones se ejecutarán por orden de prioridad.

El segundo tipo de interrupciones se activará con tal de que estén presentes las
condiciones de interrupción. Estas interrupciones no necesariamente poseen el Indicador
de Interrupción. Si la condición de interrupción desaparece antes de que la interrupción sea
habilitada, la interrupción no se activará.

Cuando el AVR sale de una interrupción, siempre retorna al programa principal y


ejecuta una instrucción más, antes de que se atienda a cualquier interrupción pendiente.

Se debe notar que el Registro de Estado (Status Register) no se almacena


automáticamente cuando entra en una rutina de interrupción, ni se restaura cuando retorna
desde una rutina de interrupción. Esto debe ser manipulado por software.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 35 -

Al usar la instrucción CLI para deshabilitar interrupciones, éstas se deshabilitarán


inmediatamente. No se ejecutarán interrupciones luego de la instrucción CLI, incluso si
éstas ocurren simultáneamente con la instrucción CLI.

Cuando use la instrucción SEI para habilitar las interrupciones, se ejecutará la


siguiente instrucción antes de cualquier interrupción pendiente.

Tiempo de Respuesta de la Interrupción. La respuesta a la ejecución de la interrupción,


para todas las interrupciones AVR habilitadas, es de mínimo cuatro ciclos de reloj. Durante
este período de cuatro ciclos de reloj, el Contador del Programa es puesto dentro de la Pila.
El vector es normalmente un salto hacia la rutina de interrupción, este salto toma tres ciclos
de reloj. Si una interrupción ocurre durante la ejecución de una instrucción multiciclo, se
completa esta instrucción antes de atender a la interrupción. Si una interrupción ocurre
cuando la MCU está en modo de Sleep, el tiempo de de respuesta para la ejecución de la
interrupción se incrementa por cuatro ciclos de reloj. Este incremento viene a sumarse al
tiempo de iniciación (start-up time) desde el modo de Sleep seleccionado.

Un retorno desde una rutina que maneja la interrupción toma cuatro ciclos. Durante
estos cuatro ciclos de reloj, el Contador del Programa (de dos bytes) es devuelto (popped)
desde la Pila (Stack), el Puntero de la Pila se incrementa por dos y el bit I del SREG es
puesto a “1”.

2.5. MEMORIAS DEL AVR ATmega169


En esta sección se describe las diferentes memorias del Microcontrolador
ATmega169. La arquitectura AVR tiene dos espacios principales de memoria, el espacio
para Memoria de Datos y el espacio para Memoria de Programa. Adicionalmente, el
ATmega169 ofrece una memoria EEPROM para almacenamiento de datos. Los tres
espacios de memoria son lineales y regulares.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 36 -

2.5.1. Memoria Flash para almacenamiento del Programa, Reprogramable en el


Sistema
El Microcontrolador ATmega169 contiene memoria Flash Reprogramable de 16K
bytes para almacenamiento del programa. Puesto que todas las instrucciones AVR son de
16 o 32 bits de amplitud, la Flash está organizada como 8K x 16. Para seguridad del
software, el espacio de la memoria Flash para Programa está divida en dos secciones,
sección para el Programa de Arranque (Boot Program) y sección para el Programa de la
Aplicación. Ver la Figura 2.6.

La memoria Flash tiene una duración de por lo menos 10000 ciclos de


escritura/borrado. El Contador del Programa (PC) del ATmega169 es de 13 bits,
direccionando así las 8000 localidades (8K) de memoria para programa.

Las tablas constantes pueden ser colocadas dentro del espacio entero de direcciones
de memoria para programa.

Figura. 2.6. Mapa de la Memoria de Programa


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 37 -

2.5.2. Memoria SRAM para Datos


El ATmega169 es un microcontrolador complejo con más unidades periféricas que
puede soportarse dentro de las 64 direcciones reservadas en el Opcode para las
instrucciones IN y OUT. Para el espacio extendido de I/O desde 0x60 hasta 0xFF en la
SRAM, únicamente pueden usarse las instrucciones ST/STS/STD y LD/LDS/LDD.

Como se observa en la Figura 2.7, las 1280 direcciones más bajas de las localidades
de memoria de datos son ocupadas por: el Fichero de Registro, la memoria de I/O,
memoria de I/O Extendida y la SRAM de datos interna. En las primeras 32 localidades está
el Fichero de Registro, las siguientes 64 localidades son de la memoria de I/O estándar,
después están las 160 localidades de memoria de I/O extendida y en las 1024 localidades
restantes está la SRAM interna de datos.

Los cinco modos diferentes de direccionamiento para memoria datos son: Directo,
Indirecto con Desplazamiento, Indirecto, Indirecto con Pre-decremento e Indirecto con
Post-incremento. En el Fichero de Registro (Register File), los registros desde el R26 hasta
el R31 caracterizan a los registros del puntero para direccionamiento indirecto.

El direccionamiento directo alcanza el espacio completo de datos.

El modo Indirecto con Desplazamiento alcanza 63 direcciones de memoria, desde la


dirección base dada por el registro Y ó por el registro Z.

Al usar el modo de direccionamiento indirecto de registro, con pre-decremento y


post-incremento automático, los registros X, Y, y Z son decrementados o incrementados.

Los 32 Registros de Trabajo de propósito general, los 64 Registros de I/O, los 160
Registros de I/O Extendida y los 1024 bytes de SRAM interna de datos en el ATmega169,
son todos accesibles a través de todos estos modos de direccionamiento.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 38 -

Figura. 2.7. Mapa de Memoria de Datos

Tiempo de Acceso a la Memoria de Datos. Esta sección describe el concepto general del
tiempo de acceso a la memoria interna. El acceso a la SRAM de datos interna se realiza en
dos ciclos de clkCPU, tal como se describe en la Figura 2.8.

Figura. 2.8. Acceso a la SRAM de datos interna

2.5.3. Memoria EEPROM para Datos


El Microcontrolador ATmega169 contiene 512 bytes de memoria EEPROM para
datos. Esta memoria está organizada como un espacio separado para datos, en el cual se
puede leer y escribir únicamente bytes. La EEPROM tiene una duración de por lo menos
100 000 ciclos de escritura/borrado. El acceso entre la EEPROM y la CPU se describe a
continuación, especificando los Registros de Dirección de EEPROM, los Registros de
Datos de EEPROM y los Registros de Control de EEPROM.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 39 -

Acceso para Lectura/Escritura en la EEPROM. Los Registros para Acceso a la


EEPROM son accesibles en el espacio de I/O.

El tiempo de acceso para escritura en la EEPROM está dado en la Tabla 2.1. Una
función auto-temporizada, sin embargo, permite al software del usuario detectar cuando se
puede escribir el próximo byte. Si el código del usuario contiene instrucciones que escriben
en la EEPROM, algunas precauciones se deben tomar. En fuentes de energía muy filtradas,
VCC probablemente se eleva o reduce lentamente en el encendido/apagado. Esto causa que
el dispositivo funcione por algún periodo de tiempo a un voltaje más bajo que el
especificado como mínimo para la frecuencia de reloj utilizada.

Para prevenir escrituras no intencionadas en la EEPROM, debe seguirse un


procedimiento específico de escritura.

Cuando se lee la EEPROM, la CPU se detiene por cuatro ciclos de reloj antes de que
se ejecute la siguiente instrucción. Cuando se escribe en la EEPROM, la CPU se detiene
por dos ciclos de reloj antes de que se ejecute la siguiente instrucción.

Registro de Dirección de EEPROM – EEARH y EEARL

Bits 15...9 – Res: Bits Reservados. Estos bits están reservados en el ATmega169 y
siempre se leerán como cero.

Bits 8...0 – EEAR8...0: Direcciones de la EEPROM. Los Registros de Dirección de la


EEPROM, EEARH y EEARL, especifican las direcciones de la EEPROM en el espacio de
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 40 -

512 bytes de EEPROM. Los bytes de datos de la EEPROM son direccionados linealmente
entre 0 y 511. El valor inicial de EEAR es indefinido. Debe escribirse un valor apropiado
antes de que se pueda acceder a la EEPROM.

Registro de Datos de la EEPROM- EEDR

Bits 7…0 – EEDR7...0: Datos de la EEPROM. Para la operación de escritura en la


EEPROM, el Registro EEDR contiene el dato que será escrito en la EEPROM en la
dirección dada por el Registro EEAR. En la operación de lectura de la EEPROM, el EEDR
contiene el dato leído de la EEPROM en la dirección dada por EEAR.

Registro de Control de la EEPROM – EECR

Bits 7...4 – Res: Bits Reservados. Estos bits son bits reservados en el ATmega169 y
siempre se leerán como cero.

Bit 3 – EERIE: Habilitador de la Interrupción por EEPROM Utilizable. Escribir el


EERIE a uno habilita la Interrupción por EEPROM Utilizable, si el I bit en SREG está
configurado con uno lógico. Escribir EERIE a cero deshabilita esta Interrupción. La
Interrupción por EEPROM Utilizable genera una interrupción constante si EEWE está en
cero.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 41 -

Bit 2 – EEMWE: Habilitador Maestro de Escritura de la EEPROM. El bit EEMWE


determina que la EEPROM sea escrita cuando el bit EEWE es puesto a uno. Cuando
EEMWE está puesto a uno, poner el EEWE a uno hará que se escriba el dato en la
EEPROM en la dirección seleccionada, dentro de cuatro ciclos de reloj. Si EEMWE está
configurado como cero, poner el EEWE a uno no causará ningún efecto. Cuando el bit
EEMWE es puesto a uno por software, el hardware limpia este bit y lo pone a cero luego
de cuatro ciclos de reloj.

Bit 1 – EEWE: Habilitador de Escritura en la EEPROM. Cuando la dirección y el dato


están inicializados correctamente, debe escribirse el bit EEWE a uno para escribir el valor
dentro de la EEPROM. El bit EEMWE debe escribirse a uno antes de escribir un uno
lógico en el bit EEWE, de lo contrario no se acepta la escritura en la EEPROM. El
siguiente procedimiento deberá seguirse cuando se escriba en la EEPROM (el orden del
paso 3 y 4 no es esencial):

1. Esperar hasta que EEWE se ponga en cero.


2. Esperar hasta SPMEN en SPMCSR se ponga en cero.
3. Escribir la nueva dirección de la EEPROM en EEAR (opcional).
4. Escribir el nuevo dato para la EEPROM en EEDR (opcional).
5. Escribir un uno lógico en el bit EEMWE mientras escribe un cero en EEWE, en
EECR.
6. Escribir un uno lógico en EEWE, dentro de cuatro ciclos de reloj luego de poner el
EEMWE a uno.

La EEPROM no puede ser programada durante una escritura de la CPU en la


memoria Flash. El software debe revisar que se haya completado la programación de la
Flash antes de empezar una nueva escritura en la EEPROM. El paso 2 es importante
únicamente si el software contiene un Procedimiento de Carga de Arranque (Boot Loader)
para permitir a la CPU programar la Flash. Si la Flash nunca fue actualizada por la CPU,
puede omitirse el paso 2.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 42 -

Cuando el tiempo de acceso de escritura ha finalizado, el bit EEWE es limpiado y


puesto “en cero” mediante hardware. El software del usuario puede interrogar este bit y
esperar por un cero lógico antes de escribir el siguiente byte. Cuando EEWE se pone en
uno, la CPU se detiene por dos ciclos de reloj antes de ejecutar la siguiente instrucción.

Bit 0 – EERE: Habilitador de Escritura en la EEPROM. Cuando se establece la


dirección correcta en el Registro EEAR, el bit EERE debe ser escrito con uno lógico para
activar la lectura de la EEPROM. El acceso de lectura a la EEPROM toma una instrucción
y el dato requerido está disponible inmediatamente. Cuando se lee la EEPROM, la CPU se
detiene por cuatro ciclos de reloj antes de que la siguiente instrucción se ejecute.

El usuario debe interrogar el bit EEWE antes de empezar la operación de lectura. Si


una operación de escritura está en marcha, no es posible leer la EEPROM, ni alterar el
Registro EEAR.

El Oscilador calibrado se usa para el acceso a la EEPROM. La Tabla 2.1 lista el


tiempo de programación típico para el acceso a la EEPROM desde la CPU.

Tabla. 2.1. Tiempo de Programación de la EEPROM

2.5.4. Memoria de I/O


Todas las I/O del ATmega169 y periféricos están ubicados en el espacio de I/O.
Todas las direcciones de I/O pueden accederse con las instrucciones LD/LDS/LDD y
ST/STS/STD, transfiriendo datos entre los 32 registros de trabajo de propósito general y el
espacio de I/O. Los Registros de I/O que están dentro del rango de direcciones 0x00 –
0x1F son accesibles directamente, bit a bit, usando las instrucciones SBI y CBI. En estos
registros el valor de los bits puede chequearse usando las instrucciones SBIS e SBIC. Al
utilizar los comandos específicos de I/O, IN y OUT, deben usarse las direcciones de I/O
desde la 0x00 hasta la 0x3F.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 43 -

Al direccionar los Registros de I/O como espacio para datos, usando las instrucciones
LD y ST, debe añadirse 0x20 a estas direcciones. El ATmega169 es un microcontrolador
complejo, con más unidades periféricas que puede soportar dentro de las 64 direcciones
reservadas en el Opcode para las instrucciones IN y OUT. Para el espacio Extendido de I/O
desde 0x60 – 0xFF en la SRAM, únicamente pueden utilizarse las instrucciones
ST/STS/STD y LD/LDS/LDD.

Por compatibilidad con dispositivos futuros, los bits reservados deben ser escritos
con cero. Jamás debe escribirse en las direcciones Reservadas de memoria de I/O.

Nótese que, al contrario de algunos otros AVR, las instrucciones CBI y SBI operaran
únicamente en el bit especificado y por lo tanto pueden ser usados sobre registros que
contienen Indicadores de Estado. Las instrucciones CBI y SBI trabajan únicamente con los
registros desde el 0x00 hasta el 0x1F.

Registros de I/O de Propósito General


El ATmega169 contiene tres Registros de I/O de Propósito General. Estos registros
pueden usarse para almacenar cualquier información y son particularmente útiles para
almacenar variables globales e Indicadores de Estado. Los Registros de I/O de Propósito
General dentro del rango de direcciones 0x00 hasta 0x1F son directamente accesibles, bit a
bit, usando las instrucciones SBI, CBI y SBIC.

Registro de I/O de Propósito General 2 – GPIOR2


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 44 -

Registro de I/O de Propósito General 1 – GPIOR1

Registro de I/O de Propósito General 0 – GPIOR0

2.6. EL RELOJ DEL SISTEMA Y LAS OPCIONES DE RELOJ

2.6.1. Los Sistemas del Reloj y su Distribución


La Figura 2.9 muestra los sistemas principales de reloj en el AVR y su distribución.
No es necesario que todos los módulos de reloj estén activos en un momento dado. Para
reducir el consumo de energía, los módulos de reloj que no se usan pueden ser detenidos
utilizando los diferentes modos de Sleep.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 45 -

Figura. 2.9. Distribución del Reloj

El Reloj de la CPU – clkCPU. El reloj de la CPU está conectado con las partes del sistema
comprometidas con la operación del núcleo del AVR. Ejemplos de cada módulo son el
Fichero de Registro de Propósito General, el Registro de Estado y la memoria de datos que
retiene el Puntero de la Pila (Stack Pointer). Deteniendo el reloj de la CPU se inhibe al
núcleo de realizar las operaciones generales y los cálculos.

El Reloj para I/O – clkI/O. El reloj para I/O es usado por la mayoría de los módulos de
I/O, como Timers/Counters, SPI y USART. EL reloj de I/O es usado también por el
módulo para Interrupción por fuente Externa, pero algunas interrupciones externas son
detectadas por lógica asincrónica, permitiendo a detectar a tales interrupciones incluso si el
reloj de I/O está detenido. También hay que notar que la detección de condición de inicio
en el módulo USI se lleva a cabo asincrónicamente cuando clkI/O está detenido,
permitiendo la detección de la condición de inicio en todos los modos de Sleep.

EL Reloj de la Flash – clkFLASH. El reloj de la Flash controla el funcionamiento de la


interfaz de la memoria Flash. Normalmente, el reloj de la Flash está activo
simultáneamente con el reloj de la CPU.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 46 -

El Reloj del Timer Asíncrono - clkASY. El reloj del Timer Asincrónico permite al
Timer/Counter Asincrónico y al controlador del LCD ser provistos de señal de reloj
directamente por un reloj externo o por un reloj de cristal de 32 kHz externo. El dominio
del reloj especializado permite usar este Timer/Counter como un Contador de Tiempo
Real, incluso cuando el dispositivo está en modo Sleep. Esto también permite que la salida
del controlador del LCD continúe funcionando mientras el resto del dispositivo está en el
modo Sleep.

El Reloj del ADC – clkADC. El ADC está aprovisionado con un dominio de reloj
especializado. Esto permite detener la CPU y los relojes de I/O para reducir el ruido
generado por la circuitería digital. Esto da resultados de conversión ADC más precisos.

2.6.2. Las Fuentes de Reloj


Este dispositivo tiene varias opciones de fuente de reloj, todas elegibles por medio de
los bits Flash Fuse, como se muestra en la Tabla 2.2.

Tabla. 2.2. Selección de las Opciones de Reloj del Dispositivo

Cuando la CPU sale de los modos de Bajo Consumo (Power-Down) y Ahorro de


Energía (Power-Save), la fuente de reloj seleccionada se usa para el momento del arranque,
asegurando el funcionamiento estable del Oscilador antes de que empiece la ejecución de
la instrucción. Cuando la CPU inicia desde el reset, hay un retraso adicional para permitir
alcanzar un nivel estable de energía antes de comenzar una operación normal. El número
de ciclos del Oscilador WDT usado para cada tiempo máximo (time-out) se muestra en la
Tabla 2.3. La frecuencia del Oscilador del Watchdog depende del voltaje.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 47 -

Tabla. 2.3. Número de Ciclos del Oscilador del Watchdog

2.6.3. La Fuente de Reloj Predefinida


Este dispositivo está programado con CKSEL = “0010”, SUT = “10” y CKDIV8. La
configuración predefinida de fuente de reloj es el Oscilador RC Interno con tiempo
prolongado de arranque y con preajuste (prescaling) de reloj del sistema de 8. Esta
configuración predefinida asegura que todos los usuarios puedan hacer su configuración
deseada de fuente de reloj usando un programador In-System o uno Paralelo.

2.6.4. El Oscilador de Cristal


XTAL1 y XTAL2 son entrada y salida, respectivamente, de un amplificador inversor
que puede ser configurado para usarse como Oscilador On-Chip, como lo muestra la
Figura 2.10. Puede usarse un cristal de cuarzo o un resonador cerámico.

C1 y C2 siempre deben ser iguales tanto para cristales como para resonadores. El
valor opcional de los condensadores depende del cristal o resonador que se esté utilizando,
del valor de la capacitancia perdida y del ruido electromagnético del entorno. En la Tabla
2.4 están dadas algunas directrices para escoger los condensadores para el uso con
cristales. Para resonadores cerámicos, debe usarse los valores de condensadores dados por
el fabricante.

Figura. 2.10. Conexión del Oscilador de Cristal


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 48 -

El Oscilador puede funcionar en tres modos distintos, cada uno optimizado para un
rango de frecuencia específica. El modo de funcionamiento se selecciona por los fusibles
CKSEK3…1 como se indica en la Tabla 2.4.

Tabla. 2.4. Modos de Operación del Oscilador de Cristal

Nota: 1. Esta opcioón debe ser usada con cristales, únicamente con resonadores cerámicos.

El Fusible CKSEL0 junto con el Fusible SUT1...0 seleccionan los tiempos de inicio
(Start Time) como se muestra en la Tabla 2.5.

Tabla. 2.5. Tiempos de Inicio para la Selección de Reloj de Oscilador de Cristal


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 49 -

2.6.5. El Oscilador de Cristal de Baja frecuencia


Para usar un cristal de reloj de 32.768 kHz como fuente de reloj para el dispositivo,
el Oscilador de cristal de baja frecuencia debe seleccionarse configurando el Fusible
CKSEL en “0110” o “0111”. El cristal debe ser conectado como se muestra en la Figura
2.10. Cuando se selecciona este Oscilador, el tiempo de arranque es determinado por los
Fusibles SUT y CKSEL1...0, como muestra la Tabla 2.6 y la Tabla 2.7 respectivamente.

Tabla. 2.6. Tiempos de Inicio para la Selección de Reloj de Oscilador de Cristal de Baja frecuencia

Tabla. 2.7. Tiempos de Inicio para la Selección de Reloj de Oscilador de Cristal de Baja frecuencia

Nota: Esta opción debe usarse únicamente si la estabilidad al arranque no es importante


para la aplicación.

2.6.6. Oscilador Interno RC Calibrado.


Este Oscilador interno calibrado provee un reloj fijo de 8.0 MHz. La frecuencia está
en el valor nominal, para un voltaje de alimentación de 3V y una temperatura de operación
de 25ºC. Si la frecuencia de 8MHz excede la especificación del dispositivo (dependiendo
de VCC), el Fusible CKDIV8 debe ser programado para dividir por 8 la frecuencia interna
durante el arranque. El dispositivo se entrega con el Fusible CKDIV8 programado. Este
reloj debe seleccionarse como reloj del sistema programando el Fusible CKSEL como se
indica en la Tabla 2.8. Si se selecciona, éste funcionará sin componentes externos.

Durante el reset, el hardware carga el byte de calibración dentro del Registro OSCAL
y de este modo calibra automáticamente al Oscilador RC. A 3V y 25ºC, esta calibración da
una frecuencia dentro del ±10% de la frecuencia nominal. Usando métodos de calibración
como se describe en las notas de aplicación disponibles en www.atmel.com/avr es posible
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 50 -

alcanzar ±2% de precisión con cualquier VCC y Temperatura. Cuando se usa este Oscilador
como reloj del Chip, el Oscilador Watchdog aun será usado por el Watchdog Timer y para
el Tiempo Máximo del Reset.

Tabla. 2.8. Modos de Operación con Oscilador RC Calibrado Internamente (1)

Nota: 1. El dispositivo se entrega con esta opción por defecto.

Cuando este Oscilador es seleccionado, los Fusibles SUT determinan los tiempos de
arranque como se muestra en la Tabla 2.9. Seleccionar el Oscilador RC interno permite que
los pines XTAL1/TOSC1 y XTAL2/TOSC2 sean usados como pines del oscilador del
timer.

Tabla. 2.9. Tiempos de Inicio para la Selección de reloj de Oscilador RC calibrado internamente

Nota: 1. El dispositivo se entrega con esta opción por defecto.

EL Registro de Calibración del Oscilador – OSCCAL

Bits 6…0 – CAL6…0: Valor de Calibración del Oscilador. Escribiendo el byte de


calibración en esta dirección acondicionará al Oscilador interno para remover variaciones
de la frecuencia del Oscilador. Esto se hace automáticamente durante la Reinicialización
del Chip. Cuando OSCCAL es cero, se selecciona la frecuencia más baja disponible.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 51 -

Escribiendo valores distintos de cero en este registro incrementará la frecuencia del


Oscilador interno. Escribiendo 0x7F en el registro da la frecuencia más alta disponible.

El Oscilador calibrado se usa para reloj de EEPROM y acceso a la Flash. Si se


escribe en la EEPROM o en la Flash, no se debe calibrar a más de 10% por encima de la
frecuencia nominal. De lo contrario, puede fallar la escritura en la EEPROM o en la Flash.
Nótese que el Oscilador está diseñado para la calibración en 8.0 MHz. La calibración para
otros valores no se garantiza, tal como se muestra en la Tabla 2.10.

Tabla. 2.10. Rango de Frecuencia del Oscilador RC Interno

2.6.7. Reloj Externo


Para controlar el dispositivo desde una fuente externa de reloj, XTAL1 debe
manejarse como se muestra en la Figura 2.11. Para hacer funcionar el dispositivo sobre un
reloj externo, el Fusible CKSEL debe ser programado en “0000”, tal como indica la Tabla
2.11.

Figura. 2.11. Configuración de la Unidad de Reloj Externo

Tabla. 2.11. Frecuencia del Reloj de Oscilador de Cristal


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 52 -

Cuando se selecciona esta fuente de reloj, los Fusibles SUT determinan los tiempos
de arranque como se indica en la Tabla 2.12.

Tabla. 2.12. Tiempos de Inicio para la Selección de Reloj Externo

2.6.8. El Buffer de Salida del Reloj


Cuando el Fusible CKOUT esté programado, el Reloj del sistema será la señal de
salida en el pin CLKO. Este modo es conveniente cuando el reloj del chip se usa para
controlar otros circuitos en el sistema. Cualquier fuente de reloj, incluyendo el Oscilador
RC interno, puede ser seleccionada cuando CLKO sirve como salida de reloj.

2.6.9. El Oscilador del Timer/Counter


El microcontrolador ATmega169 comparte los Pines del Oscilador del
Timer/Counter (TOSC1 y TOSC2) con XTAL1 y XTAL2. Esto hace que el Oscilador del
Timer/Counter pueda usarse únicamente cuando se seleccione al Oscilador Interno
Ajustado RC como fuente de reloj del sistema. El Oscilador está optimizado para usarse
con un cristal de reloj de 32.768 kHz.

Una fuente externa de reloj puede aplicarse a TOSC1 si EXTCLK, en el Registro


ASSR, está escrito con un uno lógico.

2.6.10. El Preajustador del Reloj del Sistema


El reloj del sistema del ATmega169 puede ser dividido configurando el Registro del
Preajustador de Reloj, CLKPR. Esta característica puede usarse para decrementar la
frecuencia del reloj del sistema y el consumo de energía cuando el requerimiento de
energía del proceso es bajo. Este puede usarse con todas las opciones de fuentes de reloj y
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 53 -

afectará a la frecuencia del reloj de la CPU y a todos los periféricos sincrónicos. clkI/O,
clkADC, clkCPU y clkFLASH son divididos por un factor como se muestra en la Tabla 2.13.

Para evitar cambios no intencionados de la frecuencia del reloj, se deberá seguir un


procedimiento especial de escritura para cambiar los bits del CLKPS. El procedimiento es
el siguiente:

1. Escribir a uno el bit CLKPCE (Habilitador de Cambio del Preajustador de Reloj) y a


cero todos los otros bits del CLKPR.

2. Dentro de los siguientes cuatro ciclos de reloj, escribir el valor deseado en el


CLKPS mientras escribe un cero en el CLKPCE.

Las interrupciones deben ser deshabilitadas cuando se hace cambios en la


configuración del preajustador, para asegurarse de que no se interrumpa el proceso de
escritura.

Registro del Preajustador de Reloj – CLKPR

Bit 7 – CLKPCE: Habilitar Cambio del Preajustador del Reloj. El bit CLKPCE debe
escribirse a uno lógico para habilitar cambio de los bits CLKPS. El bit CLKPCE se
actualiza únicamente cuando los otros bits en CLKPR son escritos simultáneamente a cero.
CLKPCE es borrado por hardware después de cuatro ciclos de haberse escrito ó cuando los
bits CLKPS son escritos. Reescribiendo en el bit CLKPCE dentro de este periodo de
tiempo máximo (time-out period) ni se extiende el periodo de tiempo máximo, ni se borra
el bit CLKPCE.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 54 -

Bits 3…0 – CLKPS3…0: Bits 3 – 0 para Selección del Preajustador del Reloj. Estos
bits definen el factor de división entre la fuente de reloj seleccionada y el reloj interno del
sistema. Para variar la frecuencia del reloj, estos bits pueden ser escritos en tiempo de
ejecución para satisfacer los requerimientos de la aplicación. Como el divisor divide la
entrada master del reloj de la MCU, la velocidad de todos los periféricos sincrónicos se
reduce cuando se usa un factor de división. Los factores de división están dados en la
Tabla 2.13.

El Fusible CKDIV8 determina el valor inicial de los bits CLKPS. Si CKDIV8 está
sin programar, los bits CLKPS serán reiniciados a “0000”. Si CKDIV8 está programado,
los bits CLKPS son reiniciados a “0011”, dando un factor de división de 8 al arranque.
Esta característica debe ser usada si la fuente de reloj seleccionada tiene una frecuencia
superior a la frecuencia máxima del dispositivo en las condiciones actuales de
funcionamiento.

Nótese que puede escribirse cualquier valor en los bits CLKPS, independientemente
de la configuración del Fusible CKDIV8. El software de la Aplicación debe asegurar que
un factor de división suficiente sea seleccionado, si la fuente de reloj seleccionada tiene
una frecuencia superior que la frecuencia máxima del dispositivo en las condiciones
actuales de funcionamiento. El dispositivo se entrega con el Fusible CKDIV8 programado.

Tabla. 2.13. Selección del Preajustador de Reloj


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 55 -

2.7. ADMINISTRACIÓN DE ENERGÍA Y MODOS DE SLEEP


Los modos de Sleep (Sleep modes) permiten a la aplicación detener el
funcionamiento de los módulos que no usa la MCU y de este modo ahorrar energía. El
AVR provee varios modos de Sleep, permitiendo al usuario ajustar el consumo de energía
a los requerimientos de la aplicación.

Para entrar a cualquiera de los cinco modos de Sleep, el bit SE en el SMCR debe
escribirse con uno lógico y una instrucción SLEEP debe ejecutarse. Los bits SM2, SM1 y
SM0 del Registro SMCR seleccionan el modo de Sleep (Idle, ADC Noise Reduction,
Power-Down, Power-Save ó Standby) que será activado por la instrucción SLEEP. Ver
Tabla 2.14.

Si una interrupción habilitada ocurre mientras la MCU está en modo de Sleep, la


MCU abandona el modo de Sleep. Entonces la MCU se detiene por cuatro ciclos de reloj
adicionados al tiempo de arranque, ejecuta la rutina de interrupción y reanuda la ejecución
de la siguiente instrucción SLEEP. Si ocurre una reinicialización durante el modo Sleep, la
MCU sale del modo de Sleep y procesa desde el Vector de Reset (Reset Vector).

2.7.1. El Registro de Control del Modo de Sleep – SMCR


El Registro de Control del Modo Sleep contiene los bits de control para
administración de la energía.

Los Bits 3, 2, 1 – SM2…0: Bits 2, 1 y 0 para Seleccionar el Modo de Sleep. Estos bits
seleccionan el modo de Sleep de entre los cinco modos validados, como se muestra la
Tabla 2.14.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 56 -

Tabla. 2.14. Selección del Modo de Sleep

Nota:
1. El modo de Standby es recomendado solamente para uso con cristales o
resonadores externos.

Bit 1 – SE: Habilitar Sleep. El bit SE debe escribirse con uno lógico para hacer que la
MCU entre en el modo Sleep cuando la instrucción SLEEP se ejecute. Para evitar que la
MCU entre en el modo Sleep, a excepto que sea el propósito del programador, se
recomienda escribir a uno el bit SE, justo antes de la ejecución de la instrucción SLEEP y
borrarlo inmediatamente luego de salir del modo Sleep.

A continuación se describe los cinco modos de Sleep del AVR ATmega169.

2.7.2. Modo Idle


Cuando los bits SM2…0 se escriben a 000, la instrucción SLEEP hace que la MCU
entre en el modo Inactivo (Idle), deteniendo la CPU pero permitiendo seguir en
funcionamiento al controlador de LCD, la SPI, USART, Comparador Analógico, ADC,
USI, Timer/Counters, Watchdog y el sistema de interrupciones. El modo Sleep
básicamente detiene el clkCPU y clkFLASH, permitiendo a los otros relojes seguir
funcionando.

El modo Inactivo (Idle) habilita a la MCU para que pueda salir del modo Sleep
mediante interrupciones externas activadas ó mediante interrupciones internas por
Desbordamiento del Timer y por Transmisión USART Finalizada. Si sale del modo Sleep
por el Comparador Analógico no es necesaria la interrupción, el Comparador Analógico
puede ser desenergizado configurando el bit ACD en el Registro de Control y Estado del
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 57 -

Comparador Analógico, ACSR. Este reducirá el consumo de energía en el modo Inactivo.


Si el ADC está habilitado, una conversión se activa automáticamente cuando se entra en
este modo.

2.7.3. El Modo ADC Noise Reduction


Cuando los bits SM2…0 se escriben a 001, la instrucción SLEEP hace que la MCU
entre en el modo de Reducción de Ruido del ADC, deteniendo la CPU pero permitiendo
continuar funcionando al ADC (si está habilitado), a las interrupciones externas, a la
detección de condición de inicio de la USI, al Timer/Counter2, al Controlador de LCD y al
Watchdog. Este modo de Sleep básicamente detiene al clkI/O, clkCPU y clkFLASH, mientras
los otros relojes siguen funcionando.

Este mejora el entorno de ruido para el ADC, permitiendo mediciones de alta


resolución. Si el ADC está habilitado, una conversión empieza automáticamente cuando se
entra en este modo. Aparte de la interrupción correspondiente al evento de Conversión del
ADC Finalizada, únicamente un Reset Externo, una Reset por Watchdog, una Reset por
Brown-out, una interrupción por el controlador del LCD, una interrupción por condición
inicial de la USI, una interrupción por el Timer/Counter2, una interrupción por
SPM/EEPROM lista, una interrupción externa por nivel en el INT0 ó una interrupción por
cambio en pin puede sacar a la MCU del modo de Reducción de Ruido del ADC (ADC
Noise Reduction).

2.7.4. El Modo Power-Down


Cuando los bits SM2…0 se escriben a 010, la instrucción SLEEP hace que la MCU
entre en el modo Power-down. En este modo, el Oscilador externo es detenido, mientras
las interrupciones externas, la detección de condición de inicio de la USI y el Watchdog
continúan funcionando (si están habilitados). Únicamente un Reset Externo, un Reset del
Watchdog, un Reset por el Brown-out, una interrupción por condición de inicio de la USI,
una interrupción externa por nivel en INT0, o una interrupción por cambio en pin puede
sacar desde este modo de Sleep a la MCU. Este modo de Sleep básicamente detiene todos
los relojes generados, permitiendo únicamente el funcionamiento de los módulos
asincrónicos.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 58 -

Nótese que si se usa una interrupción activada por nivel para abandonar el modo
Power-down, el nivel que varia debe ser retenido por algún tiempo para poder despertar a
la MCU.

Al abandonar el modo Sleep desde un modo Power-down hay un retrazo, desde que
ocurre la condición de abandono del modo Sleep (wake-up) hasta que se efectiviza la
salida desde este modo. Esto permite que el reloj se reinicie y se estabilice luego de
haberse detenido. El período del wake-up (salir de modo Sleep) está definido por los
Fusibles CKSEL que define el período de Tiempo Máximo para Reset.

2.7.5. El Modo Power-save


Cuando los bits SM2…0 se escriben a 011, la instrucción SLEEP hace que la MCU
entre en el modo Power-save. Éste modo es idéntico al Power-down, con una excepción:

Si el Timer/Counter2 y/o el controlador del LCD están habilitados, ellos se


mantendrán funcionando durante el Sleep. El dispositivo puede salir del modo Sleep por el
Desbordamiento del Timer o por el evento Output Compare del Timer/Counter2, si los
correspondientes bits de validación de la interrupción del Timer/Counter2 están
configurados en el TIMSK2 y si el bit Habilitador Global de Interrupción en el SREG está
configurado. Este también puede abandonar el modo Sleep mediante una interrupción
proveniente del controlador del LCD.

Si el Timer/Counter2 y el controlador de LCD no están en funcionamiento, se


recomienda el modo Power-down en lugar del modo Power-save.

El controlador del LCD y el Timer/Counter2 pueden ambos ser provistos de señal de


reloj sincrónicamente y asincrónicamente en el modo Power-save. La fuente del reloj para
los dos módulos puede seleccionarse independientemente uno del otro. Si ni el controlador
del LCD ni el Timer/Counter2 están usando el reloj asíncrono, se detiene al Oscilador del
Timer/Counter2 durante el Sleep. Si ni el controlador del LCD ni el Timer/Counter2 están
usando el reloj síncrono, la fuente de reloj es detenida durante el Sleep. Nótese incluso que
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 59 -

si el reloj síncrono está ejecutándose en Power-save, este reloj está únicamente disponible
para el controlador del LCD y para el Timer/Counter2.

2.7.6. El Modo de Standby


Cuando los bits SM2…0 son 110 y se seleccionó una opción de reloj externo de
cristal/resonador, la instrucción SLEEP hace que la MCU entre en el modo Standby. Éste
modo es idéntico al Power-down, con la excepción de que el Oscilador se mantiene
ejecutando. Desde el modo Standby, el dispositivo sale del modo Sleep en seis ciclos de
reloj.

En la Tabla 2.15 se detalla los módulos de reloj que permanecen activos en los
distintos modos de Sleep, así como también las fuentes de Interrupción que permiten salir
de estos modos.

Tabla. 2.15. Modos de Sleep

Notas:
1. Recomendado únicamente con cristal externo o resonador como fuente de reloj seleccionado.
2. Si el controlador del LCD o el Timer/Counter2 está ejecutándose en modo asincrónico.
3. Para INT0, únicamente interrupción por nivel

2.7.7. El Registro para Reducción de Potencia


El Registro para Reducción de Potencia, PRR, proporciona un método que bloquea el
reloj a periféricos individuales para reducir el consumo de energía. Se congela el estado
actual de los periféricos y no pueden leerse ni escribirse en los registros de las I/O. Los
periféricos, en la mayoría de los casos, deben ser desactivados antes de detener el reloj.
Para sacar a un módulo del reposo se debe borrar el bit correspondiente a ese módulo en el
PRR, poniendo al módulo en el mismo estado en el que estaba antes de la detención.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 60 -

Este método puede usarse en el modo Idle y en el modo Activo para reducir
significativamente consumo global de energía. En todos los otros modos de Sleep, el reloj
ya está detenido.

El Registro para Reducción de Potencia – PRR

Bit 7…5 – Res: bits Reservados. Estos bits están reservados en el ATmega169 y siempre
se leerán como cero.

Bit 4 – PRLCD: Reducción de Potencia del LCD. Escribir uno lógico en éste bit apaga
al controlador del LCD. El controlador del LCD debe ser deshabilitado y la pantalla
descargada antes de apagarla.

Bit 3 –PRTIM1: Reducción de Potencia del Timer/Counter1. Escribir un uno lógico en


este bit apaga al módulo del Timer/Counter1. Al activar al Timer/Counter1, éste continuará
funcionando tal como lo hacía antes de apagarlo.

Bit 2 – PRSPI: Reducción de Potencia a la Interfaz Serial Periférica. Escribir un uno


lógico en este bit apaga la Interfaz Serial Periférica deteniendo el reloj para éste módulo.
Cuando la SPI nuevamente salga del reposo, ésta debe ser re inicializada para garantizar el
funcionamiento correcto.

Bit 1 – PRUSART0: Reducción de Potencia la USART0. Escribir un uno lógico en este


bit apaga el USART deteniendo el reloj para éste módulo. Cuando USART nuevamente
sale del reposo, ésta debe ser re-inicializada para garantizar el funcionamiento correcto.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 61 -

Bit 0 – PRADC: Reducción de Potencia al ADC. Escribir un uno lógico en este bit apaga
el ADC. El ADC debe ser deshabilitado antes de apagarlo. El comparador analógico usa el
MUX de entrada del ADC cuando el ADC está apagado.

Nota: Al Comparador Analógico se lo deshabilita usando el bit ACD en el “Registro


de Estado y de Control del Comparador Analógico – ACSR”.

2.7.8. Reducción del Consumo de Energía


Estos son algunos problemas a considerar cuando se quiere minimizar el consumo de
energía en un sistema AVR controlado. En general, el modo de Sleep debe ser usado tanto
como sea posible y debe seleccionarse de modo que estén ejecutándose tan pocas
funciones del dispositivo como sea posible. Todas las funciones no necesarias deben ser
desactivadas. En particular, los siguientes módulos pueden necesitar especial consideración
cuando se intente lograr el más bajo consumo de energía posible.

El Convertidor Analógico Digital. Si está habilitado, el ADC permanecerá habilitado en


todos los modos de Sleep. Para ahorrar energía, el ADC debe estar deshabilitado antes de
entrar a un modo de Sleep. Cuando el ADC es apagado y nuevamente encendido, la
siguiente conversión será una conversión prolongada.

El Comparador Analógico. Al entrar al modo Idle, el Comparador Analógico debe ser


deshabilitado si no está en uso. Al entrar al modo ADC Noise Reduction (Reducción de
Ruido del ADC), el Comparador Analógico debe ser deshabilitado. En los otros modos de
Sleep, el Comparador Analógico es deshabilitado automáticamente. Sin embargo, si el
Comparador Analógico está configurado para usar la Referencia de Voltaje Interna como
entrada, el Comparador Analógico debe ser deshabilitado en todos los modos de Sleep. Por
otra parte, la Referencia de Voltaje Interna estará habilitada, independiente del modo de
Sleep.

El Detector Brown-out. Si el Detector Brown-out no es necesario para la aplicación,


entonces dicho módulo debe ser apagado. Si el Detector Brown-out está habilitado por los
Fusibles BODLEVEL, éste estará habilitado en todos los modos de Sleep, y así, siempre
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 62 -

consumirá energía. En los modos más profundos de Sleep, este contribuirá


significativamente al consumo total de corriente.

La Referencia de Voltaje Interna. La Referencia de Voltaje Interna estará habilitada


cuando sea necesaria para la Detección Brown-out, para el Comparador Analógico ó para
el ADC. Si estos módulos están deshabilitados, la referencia de voltaje interna estará
deshabilitada y no consumirá energía. Al habilitarla nuevamente, el usuario debe permitir
que la referencia inicie antes de que se use la salida. Si la referencia se mantiene en el
modo de Sleep, la salida puede usarse inmediatamente.

El Timer del Watchdog. Si el Timer del Watchdog no es necesario en la aplicación, este


módulo debe ser apagado. Si el Timer del Watchdog está habilitado, este permanecerá
habilitado en todos los modos de Sleep, y así, siempre consumirá energía. En los modos
profundos de Sleep, éste contribuirá significativamente al consumo total de corriente.

Los Pines del Puerto. Al entrar en un modo de Sleep, todos los pines del puerto deben ser
configurados para usar energía mínima. Entonces lo más importante es asegurar que los
pines no manejen cargas resistivas. Los buffers de entrada del dispositivo serán
deshabilitados en los modos de Sleep donde el reloj de las I/O (clkI/O) y el reloj del ADC
(clkADC) están detenidos. Esto garantiza que la energía no se consuma por la lógica de la
entrada cuando no es necesario. En algunos casos, la lógica de la entrada es necesaria para
detectar las condiciones para salir del modo Sleep, por lo que se habilitarán dichos buffers.
Si el buffer de entrada está habilitado y la señal de entrada está flotando o tiene un nivel de
señal analógico al rededor de VCC/2, el buffer de entrada usará energía excesiva.

Para los pines de entrada analógica, el buffer de entrada digital debe estar
deshabilitado en todo momento. Un nivel de señal analógico cercano a VCC/2 en un pin de
entrada puede causar corriente significante, incluso en el modo activo. Los buffers de
entrada digital pueden ser deshabilitados escribiendo en los Registros Deshabilitadores de
Entradas Digitales (DIDR1 y DIDR0).
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 63 -

La Interfaz JTAG y Sistema de Depuración On-Chip. Si el sistema de depuración On-


chip está habilitado por el Fusible OCDEN y entra al modo Power-down o Power-save, la
fuente de reloj principal permanecerá habilitada. En estos modos de Sleep, ésta contribuirá
significativamente al consumo total de corriente. Estos son tres modos alternativos para
evitarlo:

• Deshabilitar el Fusible OCDEN.


• Deshabilitar el Fusible JTAGEN.
• Escribir uno en el bit JDT en el MCUCSR.

El pin TDO está flotando cuando la interfaz JTAG está habilitada y el controlador
TAP de JTAG no está desplazando datos. Si el hardware conectado al pin TDO no hace
pull up al nivel lógico, el consumo de energía se incrementará. Escribiendo uno lógico en
el bit JDT del registro MCUCSR ó dejando el fusible JTAG desprogramado deshabilita la
interfaz JTAG.

2.8. EL RESET
Durante el Reset, todos los Registros de I/O son fijados a sus valores iniciales, y el
programa empieza la ejecución desde el Vector de Reset. La instrucción ubicada en el
Vector de Reset debe ser una instrucción de Salto Absoluto, JMP, hacia la rutina de
manipulación del reset. Si el programa nunca habilita una fuente de interrupción los
Vectores de Interrupción no son usados y el código del programa puede ubicarse en estas
direcciones. Este también es el caso si el Vector del Reset está en la sección de la
Aplicación mientras los Vectores de Interrupción están en la Sección para el Arranque; ó
viceversa. El diagrama del circuito en la Figura 2.12 muestra la lógica del reset. La Tabla
2.16 define los parámetros eléctricos de la circuitería del reset.

Los puertos de I/O del AVR son inmediatamente reiniciados a su estado inicial
cuando una fuente de reset se activa. Esto no necesita ninguna fuente de reloj ejecutándose.

Luego de que todas las fuentes de reset hayan estado inactivas, un contador de
retrazo es invocado, extendiendo al reset interno. Esto permite que la alimentación de
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 64 -

energía alcance un nivel estable antes de empezar el funcionamiento con normalidad. El


periodo de tiempo-máximo del contador de retrazo es definido por el usuario a través de
los Fusible SUT y CKSEL.

2.8.1. Fuentes de Reset


El microcontrolador ATmega169 tiene cinco fuentes de reset:

• Reset Power-On.
• Reset Externo.
• Reset Watchdog.
• Reset Brown-Out.
• Reset JTAG AVR.

Figura. 2.12. Lógica del Reset


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 65 -

Tabla. 2.16. Características del Reset

Nota: 1. El Power-on Reset no trabaja a menos que la fuente de voltaje esté por
debajo de VPOT (decreciente).

2.8.2. Reset Power-on


La MCU se reinicia cuando el voltaje de la fuente está por debajo del umbral Power-
on (VPOT), tal como se aprecia en las Figuras 2.13 y 2.14.

Figura. 2.13. Arranque de la MCU, RESET conectado a Vcc

Figura. 2.14. Arranque de la MCU, RESET Extendido Externamente

2.8.3. Reset Externo


La MCU se reinicia cuando un nivel bajo está presente en el pin . Tal como
se indica en la Figura 2.15, cuando la señal aplicada alcanza el Voltaje Umbral de Reset,
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 66 -

VRST, en su flanco positivo, el contador de retraso inicia a la MCU luego de que el periodo
de Tiempo máximo, tOUT, haya expirado.

Figura. 2.15. Reset Externo Durante la Operación.

2.8.4. Reset Watchdog


La MCU se reinicia cuando el Watchdog está habilitado y expira el periodo del
Watchdog Timer, esto se aprecia en la Figura 2.16.

Figura. 2.16. Reset por el Watchdog Durante la Operación

2.8.5. Reset Brown-out


La MCU se reinicia cuando el voltaje de la fuente VCC está por debajo del umbral del
Reset Brown-out, VBOT, y el Detector de Brown-out está habilitado. El ATmega169 tiene
un circuito Detector de Brown-out, BOD, para monitorear el nivel de VCC comparándolo
con un nivel fijo de activación durante el funcionamiento.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 67 -

El nivel de activación para el BOD puede seleccionarse por los Fuses BODLEVEL.
Ver Tabla 2.17. El nivel de activación tiene una histéresis para asegurar la Detección
Brown-out libre de picos. La histéresis en el nivel de detección debe interpretarse como
VBOT+=VBOT + VHYST/2 y VBOT – =VBOT – VHYST/2. Ver Tabla 2.18.

Tabla. 2.17. Codificación de los BODLEVEL Fuses (1)

Nota:
1. VBOT puede estar por debajo del voltaje mínimo nominal de
funcionamiento para algunos dispositivos. Para los dispositivos
donde éste es el caso, el dispositivo se prueba a VCC=VBOT durante
la prueba de producción. Esto garantiza que ocurra un Reset debido
a Brown-out antes que VCC baje a un voltaje donde el
funcionamiento correcto del microcontrolador ya no se garantiza. La
prueba se realiza usando BODLEVEL = 110 para el Atmega169V.

Tabla. 2.18. Características del Brown-out

Cuando está habilitado el BOD y VCC se disminuye a un valor por debajo del nivel
de activación, el Reset por BOD se activa inmediatamente. Cuando VCC sube por encima
del nivel de activación, el contador de retrazo inicia la MCU luego de que haya expirado el
Tiempo-máximo, tOUT. Esto se ilustra en la Figura 2.17.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 68 -

Figura. 2.17. Reset por Brown-Out Durante la Operación

Reset AVR JTAG. La MCU se reinicia con tal de que haya uno lógico en el Registro del
Reset.

2.8.6. El Registro de Estado de la MCU – MCUSR


El Registro de Estado de la MCU provee información acerca de cual fuente de reset
causó un reset a la MCU.

Bit 4 – JTRF. Indicador de Reset por la JTAG.

Bit 3 – WDRF. Indicador de Reset por Watchdog.

Bit 2 – BORF. Indicador de Reset por Brown-out.

Bit 1 – EXTRF. Indicador de Reset Externo.

Bit 0 – PORF. Indicador de Reset Power-On.


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 69 -

2.9. LAS INTERRUPCIONES

2.9.1. Los Vectores de Interrupción del Microcontrolador Atmega169


En la Tabla 2.19 se listan los Vectores de Interrupción y Reset del ATmega169.

Tabla. 2.19. Vectores de Interrupción y Reset

Notas:
1. Cuando el BOOTRST Fuse es programado, el dispositivo saltará hacia la dirección
del Cargador de Inicialización (Boot Loader) al reset.
2. Cuando el bit IVSEL en el MCUCR está seteado, los Vectores de Interrupción
serán movidos hacia el inicio de la Sección Flash de Iniciaización (Boot Flash
Section). La Dirección de cada Vector de Interrupción será entonces la dirección
en esta tabla adicionada a la dirección de inicio de la Sección Flash de
Inicialización.

La Tabla 2.20 muestra la ubicación del reset y Vectores de Interrupción para varias
combinaciones de configuración del BOOTRST e IVSEL. Si el programa nunca habilita
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 70 -

una fuente de interrupción, los Vectores de Interrupción no se usan, y el código del


programa puede ubicarse en estas direcciones. Este es el caso si el Vector de Reset está en
la sección de la Aplicación mientras los Vectores de Interrupción están en la Sección de
Arranque (Boot Section) ó viceversa.

Tabla. 2.20. Ubicación del Reset y de los Vectores de Interrupción (1)

Nota: 1. Para el BOOTRST Fuse “1” significa desprogramado mientras que “0” significa
programado.

2.9.2. Las Interrupciones Externas


Las Interrupciones Externas se activan por el pin INT0 o cualquiera de los pines
PCINT15…0. Nótese que, en caso de que estén habilitadas, las interrupciones se activarán
incluso si el pin INT0 ó los pines PCINT15…0 están configurados como salidas. Esta
característica proporciona un modo para generar una interrupción por software. La
interrupción por cambio en el pin PCI1 se activará si conmuta cualquier pin PCINT15…8
habilitado. La interrupción por cambio en pin PCI0 se activará si conmuta cualquier pin
PCINT7…0 habilitado. Los Registros PCMSK1 y PCMSK0 controlan cuales de los pines
contribuirán con interrupciones por cambio en el pin. Las interrupciones por cambio en pin
PCINT15…0 son detectadas asincrónicamente. Esto implica que estas interrupciones
también pueden emplearse para sacar al microcontrolador del modo de Sleep.

Las interrupciones INT0 pueden activarse por un flanco descendente, ascendente o


por un nivel bajo. Estas se configuran como indica la especificación del Registro A para
Control de Interrupción Externa, EICRA. Cuando la interrupción INT0 está habilitada y
configurada como activada por nivel, la interrupción se activará con tal de que el pin se
mantenga en bajo. Nótese que el reconocimiento de interrupciones por flanco descendente
o ascendente en INT0 requiere la presencia de un reloj de I/O, lo que implica que la
interrupción por flanco puede emplearse para sacar al microcontrolador del modo Sleep
únicamente en el modo Idle. La interrupción por nivel bajo en INT0 se detecta
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 71 -

asincrónicamente, esto implica que esta interrupción también puede emplearse para sacar
al microcontrolador de los modos de Sleep. El reloj de I/O está detenido en todos los
modos de Sleep excepto el modo Idle.

Nótese que si una Interrupción Activada por nivel es usada para salir del modo
Power-down, el nivel requerido debe mantenerse por mucho tiempo para que la MCU
salga completamente del modo Sleep para activar la interrupción por nivel. Si el nivel
desaparece antes del final del Tiempo de Inicialización, la MCU todavía saldrá del modo
Sleep, pero la interrupción no se generará. El tiempo de inicialización está definido por los
fusibles SUT y CKSEL.

Sincronización de la Interrupción por Cambio en el Pin. En la Figura 2.18 se muestra


un ejemplo de la sincronización de la interrupción por cambio en pin.

Figura. 2.18. Interrupción por Cambio en Pin


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 72 -

El Registro para Control de la Interrupción Externa – EICRA


El Registro A para Control de la Interrupción Externa contiene los bits para el
control del sensado de la interrupción.

Los Bits 1, 0 – ISC01, ISC00: Bit 1 y Bit 0 para Control del Sensado de la
Interrupción 0. La Interrupción Externa 0 es activada por el pin externo INT0 si el
indicador I del SREG y la máscara de la interrupción correspondiente están seteados. El
nivel y el flanco en el pin externo INT0 que activan la interrupción están definidos en la
Tabla 2.21. El valor en el pin INT0 es muestreado antes de que se detecte los flancos. Si la
interrupción por flanco o por conmutación se selecciona, los pulsos que duren más tiempo
que un período del reloj generarán una interrupción. Los pulsos más cortos no garantizan
generar una interrupción. Si se selecciona una interrupción por nivel bajo, para generar una
interrupción debe mantenerse el nivel bajo hasta el cumplimiento de la instrucción
actualmente ejecutándose.

Tabla. 2.21. Control del Sensado de la Interrupción 0

El Registro Máscara para la Interrupción Externa – EIMSK


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 73 -

El Bit 7 – PCIE1: Habilitador de la Interrupción 1 por Cambio en Pin. Cuando el bit


PCIE1 es seteado (uno) y el bit I en el Registro de Estado (SREG) es seteado (uno), la
interrupción 1 por cambio en el pin se habilita. Cualquier cambio en cualquier pin
PCINT15…8 habilitado causará una interrupción. La interrupción correspondiente a la
Petición de Interrupción por Cambio en el Pin se ejecuta desde el Vector de Interrupción
PCI1. Los pines PCINT15…8 son habilitados individualmente por el Registro PCMSK1.

El Bit 6 – PCIE0: Habilitador de la Interrupción 0 por Cambio en Pin. Cuando el bit


PCIE0 es seteado (uno) y el bit I en el Registro de Estado (SREG) es seteado (uno), la
interrupción 0 por cambio en el pin se habilita. Cualquier cambio en cualquier pin
PCINT7…0 habilitado causará una interrupción. La interrupción correspondiente a la
Petición de Interrupción por Cambio en el Pin se ejecuta desde el Vector de Interrupción
PCI0. Los pines PCINT7…0 son habilitados individualmente por el Registro PCMSK0.

El Bit 0 – INT0: Habilitador de Pedido 0 de Interrupción Externa. Cuando el bit INT0


es seteado (uno) y el bit I en el Registro de Estado (SREG) es seteado (uno), se habilita la
interrupción externa en el pin. Los bits 1/0 para Control del Sensado de Interrupción (SC01
e ISC00) en el EICRA (External Interrupt Control Register A) definen si la interrupción
externa se activa por flanco ascendente y/o descendente en el pin INT0 o por sensado de
nivel. La actividad en el pin causará una petición de interrupción aún cuando INT0 está
configurado como salida.

El Registro Indicador de Interrupción Externa – EIFR

Bit 7 – PCIF1: Indicador 1 de la Interrupción por Cambio en Bit. Cuando un cambio


lógico en cualquier pin PCINT15…8 activa una petición de interrupción, PCIF1 se setea
(uno). SI el bit I en SREG y el bit PCIE1 en EIMSK están seteados (uno), la MCU saltará
hacia el correspondiente Vector de Interrupción. El indicador se borra cuando la rutina de
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 74 -

interrupción se ejecuta. Alternadamente, el indicador puede borrarse escribiendo un uno


lógico en éste. Este indicador siempre se borra cuando INT0 está configurado como una
interrupción por nivel.

Bit 6 –PCIF0: Indicador 0 de la Interrupción por Cambio en Bit. Cuando un cambio


lógico en cualquier pin PCINT7…0 activa una petición de interrupción, PCIF0 se setea
(uno). Si el bit I en SREG y el bit PCIE0 en EIMSK están seteados (uno), la MCU saltará
hacia el correspondiente Vector de Interrupción. El indicador se borra cuando la rutina de
interrupción se ejecuta. Alternadamente, el indicador puede borrarse escribiendo un uno
lógico en éste. Este indicador siempre se borra cuando INT0 está configurado como una
interrupción por nivel.

Bit 0 – INTF0: Indicador 0 de la Interrupción Externa. Cuando un flanco o cambio


lógico en el pin INT0 activa una petición de interrupción, INTF0 se vuelve a setear (uno).
Si el bit I en SREG y el bit INT0 en EIMSK están seteados (uno), la MCU saltará hacia el
Vector de Interrupción correspondiente. El indicador se borra cuando la rutina de
interrupción se ejecuta. Alternadamente, el indicador puede borrarse escribiendo un uno
lógico en éste. Este indicador siempre se borra cuando INT0 está configurado como una
interrupción por nivel.

El Registro Máscara 1 para Cambio en Pin – PCMSK1

Bit 7…0 – PCINT15…8: Máscara para Habilitar Cambio en Pin 15…8. Cada bit
PCINT15…8 selecciona si se habilita o no la interrupción por cambio en pin en el
correspondiente pin de I/O. Si PCINT15…8 está seteado y el bit PCIE1 en EIMSK está
seteado, la interrupción por cambio en bit se habilita en el correspondiente pin de I/O. Si
PCINT15…8 está borrado, la interrupción por cambio en bit en el correspondiente pin de
I/O se deshabilita.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 75 -

El Registro Máscara 0 para Cambio en Pin: PCMSK0

Bit 7…0 – PCINT7…0: Máscara para Habilitar Cambio en Pin7…0. Cada bit
PCINT7…0 selecciona si se habilita o no la interrupción por cambio en pin en el
correspondiente pin de I/O. Si PCINT7…0 está seteado y el bit PCIE0 en EIMSK está
seteado, la interrupción por cambio en bit se habilita en el correspondiente pin de I/O. Si
PCINT7…0 es borrado, la interrupción por cambio en bit en el correspondiente pin de I/O
se deshabilita.

2.10. PUERTOS DE I/O


Todos los puertos AVR tienen la funcionalidad de Leer-Modificar-Escribir cuando se
usan como puertos generales de I/O digitales. Esto permite cambiar la dirección de los
datos en un pin del puerto, con las instrucciones SBI y CBI, sin cambiar involuntariamente
la dirección de los datos de cualquier otro pin. Lo mismo se aplica al cambiar el valor del
controlador (si está configurado como salida) o al habilitar/deshabilitar resistores pull-up
(si está configurado como entrada).

Cada buffer de salida tiene características simétricas de controlador, con alta


capacidad de sumidero y de fuente. El controlador de pin es bastante poderoso para
manejar directamente las pantallas de LED. Todos los pines del puerto tienen resistores
pull-up de selección individual con resistencia invariante con la fuente de voltaje. Todos
los pines de I/O tienen diodos de protección para VCC y Tierra como indica la Figura 2.19.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 76 -

Figura. 2.19. Esquema equivalente del pin de I/O

Todos los registros y referencias del bit en esta sección son escritos en forma general.
Una “x” minúscula representa la letra de enumeración para el puerto y una “n” minúscula
representa al número de bit. Por ejemplo, PORTB3 para el bit no. 3 en el Puerto B,
documentado generalmente como PORTxn.

A cada puerto se le asignan tres localidades de dirección de memoria de I/O, una a


cada uno de los siguientes registros: Registros de Datos – PORTx, el Registro de Dirección
de Datos – DDRx, y el Registro de los Pines de Entrada del Puerto – PINx. El Registro de
los Pines de Entrada del Puerto es únicamente de lectura, mientras que el Registro de Datos
y el Registro de Dirección de Datos son de lectura/escritura. Sin embargo, escribiendo un
uno lógico en un bit en el Registro PINx, resultará en una conmutación en el bit
correspondiente en el Registro de Datos. Además, el bit PUD (Deshabilitar Pull-up) del
MCUCR deshabilita la función de pull-up de todos los pines en todos los puertos cuando
está seteado.

La mayoría de los pines del puerto son multiplexados con funciones alternas para las
características de los periféricos en el dispositivo.

Nótese que habilitar las funciones alternas de algunos de los pines de los puertos no
afectará al uso de los otros pines como I/O’s digitales en el puerto.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 77 -

2.10.1. Los Puertos como I/O Digital General


Todos los puertos del microcontrolador ATmega169 son puertos de I/O bi-
direccionales con pull-ups internas opcionales. La Figura 2.20 muestra una descripción
funcional de uno de los pines del puerto de I/O, generalmente llamado Pxn.

Nota: WRx, WPx, WDx, RRx, RPx y RDx son comunes para todos los pines dentro del
mismo puerto. clkI/O, SLEEP y PDU son comunes para todos los puertos.
Figura. 2.20. I/O Digital General

Configurar el pin. Cada pin del puerto consiste de tres bits de tres registros: DDxn,
PORTxn y PINxn.

El bit DDxn en el Registro DDRx selecciona la dirección de los datos de este pin. Si
DDxn es escrito con uno lógico, Pxn se configura como un pin de salida. Si DDxn es
escrito con cero lógico, Pxn se configura como un pin de entrada. Ver Tabla 2.22.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 78 -

Tabla. 2.22. Configuraciones de los Pines del Puerto

Si PORTxn es escrito con uno lógico cuando el pin está configurado como una
entrada, se activa la resistencia pull-up correspondiente. Para desactivar la resistencia pull-
up, PORTxn tiene que ser escrito con cero lógico o el pin tiene que ser configurado como
pin de salida. Los pines del puerto están en alta impedancia cuando la condición de reset se
activa, incluso si ningún reloj está funcionando.

Si PORTxn es escrito con uno lógico cuando el pin está configurado como un pin de
salida, el pin del puerto es conducido a alto (uno). Si PORTxn se escribe con cero lógico
cuando el pin está configurado como un pin de salida, el pin del puerto es conducido a bajo
(cero).

Alternar el Pin. Escribir un uno lógico en el PINxn alterna el valor del PORTxn,
independientemente del valor de DDRxn.

Conmutar entre Entrada y Salida. Al conmutar entre el estado de alta impedancia


({DDxn, PORTxn}=0b00) y salida en alto ({DDxn, PORTxn}=0b11), un estado
intermedio con cualquier pull-up habilitada ({DDxn, PORTxn}=0b01) o salida en bajo
({DDxn, PORTxn}=0b10) debe ocurrir. Normalmente, el estado de pull-up habilitada es
completamente aceptable, puesto que un entorno de alta impedancia no notará la diferencia
entre un controlador de nivel alto pronunciado y una pull-up. Si este no es el caso, el bit
PUD en el Registro MCUCR puede setearse para deshabilitar todas las pull-ups en todos
los puertos.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 79 -

Conmutar entre entrada con pull-up y salida en bajo generará el mismo problema. El
usuario debe usar o el estado de alta impedancia ({DDxn, PORTxn}=0b00) ó el estado de
salidas en alto ({DDxn, PORTxn}=0b11), como un paso intermedio.

Leer el Valor del Pin. Independientemente de la configuración del bit de Dirección de


Datos DDxn, el pin del puerto puede leerse a través del bit de Registro PINxn. Como se
muestra en la Figura 2.20, el bit de Registro PINxn y el latch anterior constituyen un
sincronizador. La Figura 2.21 muestra un diagrama de tiempo de la sincronización al leer
un valor externo aplicado al pin. Los retraso de propagación máximo y mínimo se denotan
como tpd,max y tpd,min respectivamente.

Figura. 2.21. Sincronización al Leer un valor de Pin Aplicado Externamente.

Los Pines No Conectados. El método más simple para garantizar un nivel definido en un
pin no usado es habilitar la pull-up interna. En este caso, la pull-up se deshabilitará durante
el reset. Si el bajo consumo de energía es importante durante el reset, es recomendable usar
una pull-up o una pull-down externa. Conectar los pines no usados directamente a VCC o a
GND no es recomendable, puesto que esto puede causar corrientes excesivas si el pin es
configurado accidentalmente como una salida.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 80 -

El Registro de Control de la MCU – MCUCR

El Bit 4 – PUD: Deshabilitador de las Pull-up. Cuando este bit está escrito a uno, las
pull-ups en los puertos de I/O están deshabilitadas incluso si los Registros DDxn y
PORTxn están configurados para habilitar las pull-ups ({DDxn, PORTxn}=0b01).

2.10.2. Funciones Alternas de los Puertos


Además de tener I/O’s digitales generales la mayoría de los pines tienen funciones
alternas. Nótese que habilitar las funciones alternas de algunos de los pines de los puertos
no afectará al uso de los otros pines como I/O’s digitales en el puerto.

Las Funciones Alternas del Puerto A


El Puerto A tiene una función alterna como COM0:3 y SEG0:3 para el Controlador
del LCD. Ver Tabla 2.23.

Tabla. 2.23. Funciones Alternas de los Pines del Puerto A

Las Funciones Alternas del Puerto B


Las funciones alternas de los Pines del Puerto B se muestran en la Tabla 2.24.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 81 -

Tabla. 2.24. Funciones Alternas de los Pines del Puerto B

La configuración alterna de los Pines del Puerto B es como a continuación.

OC2A/PCINT15, Bit 7. El OC2A, salida de la Output Compare Match A: El pin PB7


puede ser usado como una salida externa para el Resultado de la Comparación entre el
OCR2A y el TCNT2 del Timer/Counter2. Este pin tiene que ser configurado como una
salida (DDB7 = 1) para utilizar esta función. El pin OC2A es también el pin de salida para
la función de timer en el modo PWM.

PCINT15, fuente 15 para Interrupción por Cambio en un Pin: EL pin PB7 puede
servir como una fuente externa de interrupción.

OC1B/PCINT14, Bit 6. El OC1B, salida de la Output Compare Match B: El pin PB6


puede ser usado como una salida externa para el Resultado de la Comparación entre el
OCR1B y el TCNT1 del Timer/Counter1. Este pin tiene que configurarse como una salida
(DDB6 = 1) para utilizar esta función. El pin OC1B es también el pin de salida para la
función de timer en el modo PWM.

PCINT14, fuente 14 para Interrupción por Cambio en un Pin: EL pin PB6 puede
servir como una fuente externa de interrupción.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 82 -

OC1A/PCINT13, Bit 5. El OC1A, salida de la Output Compare Match A: El pin PB5


puede ser usado como una salida externa para el Resultado de la Comparación entre el
OCR1A y el TCNT1 del Timer/Counter1. Este pin tiene que configurarse como una salida
(DDB5 = 1) para utilizar esta función. El pin OC1A es también el pin de salida para la
función de timer en el modo PWM.

PCINT13, fuente 13 para Interrupción por Cambio en un Pin: EL pin PB5 puede
servir como una fuente externa de interrupción.

OC0A/PCINT12, Bit 4. El OC0A, salida de la Output Compare Match A: El pin PB4


puede ser usado como una salida externa para el Resultado de la Comparación entre el
OCR0A y el TCNT0 del Timer/Counter0. El pin tiene que configurarse como una salida
(DDB4 = 1) para que sirva esta función. El pin OC0A es también el pin de salida para la
función de timer en el modo PWM.

PCINT12, fuente 12 para Interrupción por Cambio en un Pin: EL pin PB4 puede
servir como una fuente externa de interrupción.

MISO/PCINT11 – Puerto B, Bit 3. MISO: pin Maestro en modo de entrada de Datos,


Esclavo en modo de salida de Datos para la SPI. Cuando la SPI está habilitada como
Master, este pin está configurado como una entrada sin tener en cuenta la configuración de
DDB3. Cuando la SPI está habilitada como Esclavo, la dirección de los datos de este pin es
controlada por DDB3. Cuando este pin es forzado a ser una entrada, la pull-up puede aún
controlarse por el bit PORTB3.

PCINT11, fuente 11 para Interrupción por Cambio en un Pin: EL pin PB3 puede
servir como una fuente externa de interrupción.

MOSI/PCINT10 – Puerto B, Bit 2. MOSI: pin Maestro en modo de salida de Datos,


Esclavo en modo de entrada de Datos para la SPI. Cuando la SPI está habilitada como
Esclavo, este pin está configurado como una entrada sin tener en cuenta la configuración
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 83 -

de DDB2. Cuando la SPI está habilitada como Master, la dirección de los datos de este pin
es controlada por DDB2. Cuando este pin es forzado a ser una entrada, la pull-up puede
aún controlarse por el bit PORTB2.

PCINT10, fuente 10 para Interrupción por Cambio en un Pin: EL pin PB2 puede
servir como una fuente externa de interrupción.

SCK/PCINT9 – Puerto B, Bit 1. SCK: pin Maestro en modo de salida de Reloj, Esclavo
en modo de entrada de Reloj para la SPI. Cuando la SPI está habilitada como Esclavo, este
pin está configurado como una entrada sin tener en cuenta la configuración de DDB1.
Cuando la SPI está habilitada como Master, la dirección de los datos de este pin es
controlada por DDB1. Cuando este pin es forzado a ser una entrada, la pull-up puede aún
controlarse por el bit PORTB1.

PCINT9, fuente 9 para Interrupción por Cambio en un Pin: EL pin PB1 puede servir
como una fuente externa de interrupción.

/PCINT8 – Puerto B, Bit 0. : entrada para Seleccionar el Puerto en el Modo


Esclavo. Cuando la SPI está habilitada como Esclavo, este pin está configurado como una
entrada sin tener en cuenta la configuración de DDB0. Tal como un Esclavo, la SPI se
activa cuando este pin está en bajo. Cuando la SPI está habilitada como Master, la
dirección de los datos de este pin es controlada por DDB0. Cuando el pin es forzado a ser
una entrada, la pull-up puede aún controlarse por el bit PORTB0.

PCINT8, fuente 8 para Interrupción por Cambio en un Pin: EL pin PB0 puede servir
como una fuente externa de interrupción.

Las Funciones Alternas del Puerto C


El Puerto C tiene una función alterna como SEG5:12 para el Controlador del LCD.
Ver Tabla 2.25.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 84 -

Tabla. 2.25. Funciones Alternas de los Pines del Puerto C

Las Funciones Alternas del Puerto D


Los Pines del Puerto D con sus funciones alternas se muestran en la Tabla 2.26.

Tabla. 2.26. Funciones Alternas de los Pines del Puerto D

La configuración alterna de los Pines del Puerto D es como a continuación:

SEG15 – SEG20 – Puerto D, Bit 7:12. SEG15 - SEG20, planos frontales del LCD, desde
el plano 15 hasta el 20.

INT0/SEG21 – Puerto D, Bit 1. INT0, Fuente 0 de Interrupción Externa. El pin PD1


puede servir como fuente de interrupción externa para la MCU.

SEG21, plano frontal 21 del LCD.


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 85 -

ICP1/SEG22 – Puerto D, Bit 0. ICP1 – Pin 1 para Captura de Datos: La PD0 puede
actuar como un pin de Captura de Datos para el Timer/Counter1.

SEG22, plano frontal 22 del LCD.

Las Funciones Alternas del Puerto E


Los pines del Puerto E y sus funciones alternas se muestran en la Tabla 2.27.

Tabla. 2.27. Funciones Alternas de los Pines del Puerto E

PCINT7 – Puerto E, Bit 7. PCINT7, Fuente de Interrupción por Cambio en el Pin 7. El


pin PE7 puede servir como una fuente de interrupción externa.

CLKO, Reloj Dividido del Sistema: El reloj dividido del sistema puede ser la salida
en el pin PE7. El reloj dividido del sistema será una salida si el Fusible CKOUT está
programado, sin tener en cuenta la configuración de PORTE7 y DDE7. Este también será
la salida durante el reset.

DO/PCINT6 – Puerto E, Bit 6. DO, Salida de Datos para la Interfaz Serial Universal.

PCINT6, Fuente de Interrupción por Cambio en el Pin 6: El pin PE6 puede servir
como una fuente de interrupción externa.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 86 -

DI/SDA/PCINT5 –Puerto E, Bit 5. DI, entrada de Datos para la Interfaz Serial Universal.

SDA, Datos de la Interfaz Serial de dos cables.

PCINT5, Fuente de Interrupción por Cambio en el Pin 5: El pin PE5 puede servir
como una fuente de interrupción externa.

USCK/SCL/PCINT4 – Puerto E, Bit 4. USCK, Reloj para la Interfaz Serial Universal.

SCL, Reloj para la Interfaz Serial de dos cables.

PCINT4, Fuente de Interrupción por Cambio en el Pin 4: El pin PE4 puede servir
como una fuente de interrupción externa.

AIN1/PCINT3 – Puerto E, Bit 3. AIN1 – Entrada Negativa al Comparador Análogo. Este


pin está conectado directamente a la entrada negativa del Comparador Análogo.

PCINT3, Fuente de Interrupción por Cambio en el Pin 3: El pin PE3 puede servir
como una fuente de interrupción externa.

XCK/AIN0/PCINT2 – Puerto E, Bit 2. XCK, Reloj Externo para USART. El Registro


(DDE2) de Dirección de Datos controla si el reloj es salida (DDE2=1) o entrada
(DDE2=0). El pin XCK está activo únicamente cuando el USART opera en modo
sincrónico.

AIN0, Entrada Positiva al Comparador Análogo. Este pin está conectado


directamente a la entrada positiva del Comparador Análogo.

PCINT2, Fuente de Interrupción por Cambio en el Pin 2: El pin PE2 puede servir
como una fuente de interrupción externa.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 87 -

TXD/PCINT1 – Puerto E, Bit 1. TXD0, pin para Transmisión USART.

PCINT1, Fuente de Interrupción por Cambio en el Pin 1: El pin PE1 puede servir
como una fuente de interrupción externa.

RXD/PCINT0 – Puerto E, Bit 0. RXD, Pin para Recepción en USART. Entrada de Datos
para el módulo USART. Cuando el receptor de USART está habilitado éste pin está
configurado como una entrada sin tener en cuenta el valor de DDE0. Cuando USART
obliga a este pin a ser una entrada, un uno lógico en PORTE0 encenderá la pull-up interna.

PCINT0, Fuente de Interrupción por Cambio en el Pin 0: El pin PE0 puede servir
como una fuente de interrupción externa.

Las Funciones Alternas del Puerto F


El Puerto F tiene una función alterna como entrada analógica para el ADC tal como
se muestra en la Tabla 2.28. Si algunos de los Pines del Puerto F están configurados como
salidas, es esencial que estos no cambien cuando una conversión esté en marcha. Esto
podría alterar el resultado de la conversión. Si la interfaz JTAG está habilitada, las
resistencias de los pines PF7 (TDI), PF5 (TMS) y PF4 (TCK) se activarán aún si ocurre un
Reset.

Tabla. 2.28. Funciones Alternas de los Pines del Puerto F


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 88 -

La configuración alterna de los pines del Puerto F es como a continuación:

TDI, ADC7 – Puerto F, Bit 7. ADC7, Canal 7 del Convertidor Analógico Digital.

TDI, Entrada para los Datos de Prueba de JTAG (JTAG Test Data Input): Datos de
Entrada Serial para desplazarse hacia el Registro de Instrucciones o al Registro de Datos.
Cuando la interfaz JTAG está habilitada, este pin no debe ser usado como un pin de I/O.

TDO, ADC6 – Puerto F, Bit 6. ADC6, Canal 6 del Convertidor Analógico Digital.

TDO, Salida para los Datos de Prueba de JTAG (JTAG Test Data Out): Datos de
salida serial desde el Registro de Instrucciones o desde el Registro de Datos. Cuando la
interfaz JTAG está habilitada, este pin no debe ser usado como un pin de I/O.

TMS, ADC5 – Puerto F, Bit 5. ADC5, Canal 5 del Convertidor Analógico Digital.

TMS, Selector en el modo de Prueba de JTAG (JTAG Test mode Select): Este pin es
usado para navegar a través de la máquina de estados del controlador TAP (Test Access
Port). Cuando la interfaz JTAG está habilitada, este pin no debe ser usado como un pin de
I/O.

TCK, ADC4 – Puerto F, Bit 4. ADC4, Canal 4 del Convertidor Analógico Digital.

TCK, Reloj para el Test JTAG (JTAG Test Clock): La operación JTAG es sincrónica
para TCK. Cuando la interfaz JTAG está habilitada, este pin no debe ser usado como un
pin de I/O.

ADC3 - ADC0 – Puerto F, Bit 3:0. Canales 3:0 del Convertidor Analógico Digital.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 89 -

Las Funciones Alternas del Puerto G


Los Pines del Puerto G junto con sus funciones alternas se muestran en la Tabla 2.29.

Tabla. 2.29. Funciones Alternas de los Pines del Puerto G

La configuración alterna de los pines del Puerto G es como a continuación:

T0/SEG23 – Puerto G, Bit 4. T0, Fuente para el Contador del Timer/Counter0.

SEG23, plano frontal 23 del LCD.

T1/SEG24 – Puerto G, Bit 3. T1, Fuente para el Contador del el Timer/Counter1.

SEG24, plano frontal 24 del LCD.

SEG4 – Puerto G, Bit 2. SEG4, plano frontal 4 del LCD.

SEG13 – Puerto G, Bit 1. SEG13, plano frontal 13 del LCD.

SEG14 – Puerto G, Bit 0. SEG14, plano frontal 14 del LCD.


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 90 -

2.10.3. Descripción de los Registros de los Puertos de I/O

Registro de Datos del Puerto A – PORTA

Registro de Dirección de Datos del Puerto A – DDRA

Dirección de Pines de Entrada del Puerto A – PINA

La descripción de los registros de los puertos de I/O es la misma para los puertos: A,
B, C, D, E y F, ya que estos son puertos de 8 bits; para el puerto G es diferente ya que es
un puerto de 5 bits, la descripción de sus registros es como se indica a continuación:

Registro de Datos del Puerto G – PORTG


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 91 -

Registro de Dirección de Datos del Puerto G – DDRG

Dirección de Pines de Entrada del Puerto G – PING

2.11. EL TIMER/COUNTER0 DE 8 BITS CON PWM


El Timer/Counter0 es un módulo Timer/Counter de 8 bits de propósito general con
una Unidad de Comparación. Sus principales características se listan a continuación.

• Contador con sólo una unidad para comparación.


• Timer Encerado al Coincidir la Comparación (Auto Recarga).
• Modulador de Ancho de Pulso (PWM) de Fase Correcta, libre de fallo.
• Generador de Frecuencia.
• Contador de Evento Externo.
• Preajustador de Reloj de 10 bit.
• Fuentes de Interrupción por Desbordamiento y al Coincidir Comparación (TOV0 y
OCF0A).

En la Figura 2.22 se muestra el diagrama de bloques simplificado del Timer/Counter


de 8 bit.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 92 -

Figura. 2.22. Diagrama de bloques del Timer/Counter de 8 bits

Los Registros. El Timer/Counter (TCNT0) y el Registro para Comparación de Salida


(OCR0A) son registros de 8 bit. Las señales de petición de Interrupción son todas visibles
en el Registro Indicador de Interrupción del Timer (TIFR0). Todas las interrupciones son
enmascaradas individualmente con el Registro Máscara de Interrupción del Timer
(TIMSK0). TIFR0 y TIMSK0 no se muestran en la Figura 2.22.

El Timer/Counter puede ser provisto de señal de reloj internamente, vía preajustador


(prescaler) ó por una fuente externa de reloj en el pin T0. El bloque lógico Clock Select
controla cual fuente de reloj y flanco usa el Timer/Counter para incrementar (o
decrementar) su valor. El Timer/Counter está inactivo cuando ninguna fuente de reloj está
seleccionada. La salida de la lógica del Clock Select es llamada reloj del timer (clkT0).

El Registro Output Compare A, OCR0A, es comparado en todo momento con el


valor del Timer/Counter0, TCNT0. El resultado de la comparación puede ser usado por el
Generador de forma de Onda para generar un PWM o una salida de frecuencia variable en
el pin Output Compare, OC0A. El evento de Coincidencia en la Comparación también
seteará al Indicador de la Comparación, OCF0A, el que podrá ser usado para generar una
petición de interrupción por Output Compare
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 93 -

2.11.1. Las Fuentes de Reloj para el Timer/Counter0


El Timer/Counter puede ser provisto de señal de reloj por una fuente de reloj interna
o externa. La fuente de reloj se selecciona por la lógica del Clock Select la cual es
controlada por los bits Clock Select (CS02:0) localizados en el Registro de Control del
Timer/Counter (TCCR0A).

2.11.2. La Unidad de Conteo – Counter Unit


La parte principal del Timer/Counter de 8 bit es la unidad contadora bi-direccional
programable. La Figura 2.23 muestra un diagrama de bloque del contador y su circundante.

Figura. 2.23. Diagrama de Bloques de la Unidad Contadora

Descripción de las señales (señales internas):

count Incrementar o decrementar por uno al TCNT0.


direction Seleccionar entre incremento y decremento.
clear Borrar contenido del TCNT0 (poner todos los bits en cero).
clkTn Reloj del Timer/Counter, llamado como clkT0.
top Significa que TCNT0 ha alcanzado el valor máximo.
bottom Significa que TCNT0 ha alcanzado el valor mínimo (cero).

Dependiendo del modo de operación usado, el contador es borrado, incrementado o


decrementado con cada reloj del timer (clkT0). clkT0 puede ser generado desde una fuente
de reloj externa o interna, esta se selecciona a través de los bits Clock Select (CS02:0).
Cuando no se haya seleccionado fuente de reloj (CS02:0=0) el timer permanecerá
detenido. Sin embargo, el valor del TCNT0 puede ser accedido por la CPU,
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 94 -

indiferentemente de si está o no presente clkT0. Una CPU escribe pasando por encima
(tiene prioridad superior) de todas las operaciones de borrado del contador u operaciones
de conteo.

La secuencia de conteo está determinada por la configuración de los bits WGM01 y


WGM00 localizados en el Registro para Control del Timer/Counter (TCCR0A). Hay
conexiones cerradas entre el comportamiento del contador y en como se generan las
formas de onda en la salida OC0A del Output Compare.

El Indicador de Desborde del Timer/Counter (TOV0) es seteado de acuerdo al modo


de operación seleccionado por los bits WGM01:0. TOV0 puede usarse para generar una
interrupción de CPU.

2.11.3. La Unidad Comparadora (Output Compare Unit)


El comparador continuamente compara TCNT0 con el Registro para Comparación
(Output Compare Register), OCR0A. Siempre que TCNT0 equivale a OCR0A, el
comparador indica una coincidencia. Una coincidencia seteará el Indicador de
Comparación (Output Compare Flag, OCF0A) en el siguiente ciclo de reloj del timer. Si
está habilitado (OCIE0A=1 y el Indicador Global de Interrupción en SREG está seteado),
el Indicador de Comparación de Salida genera una interrupción por la Comparación de la
Salida.

El OCF0A se borra automáticamente cuando la interrupción se ejecuta.


Alternadamente, el Indicador OCF0A puede borrarse por software escribiendo un uno
lógico a su localidad de bit de I/O. El Generador de Forma de Onda usa la señal de
coincidencia para generar una salida según el modo de operación fijado por los bits
WGM01:0 y por los bits Compare Output mode (COM0A1:0). Las señales max y bottom
(superior e inferior) son usadas por el Generador de Forma de Onda para manejar los casos
especiales de los valores extremos en algunos modos de operación.

La Figura 2.24 muestra un diagrama de bloque de la unidad Comparadora, Output


Compare.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 95 -

Figura. 2.24. Diagrama de Bloque de la Unidad de Comparadora

2.11.4. El Preajustador del Timer/Counter0 y del Timer/Counter1


Como se aprecia en la Figura 2.25, el Timer/Counter0 y Timer/Counter1 comparten
el mismo módulo preajustador, pero los Timer/Counter’s pueden tener diferente
configuración de preajustador. La siguiente descripción se aplica a ambos, al
Timer/Counter1 y al Timer/Counter0.

La Fuente Interna de Reloj. El Timer/Counter puede ser provisto de señal de reloj


directamente por el reloj del sistema (configurando el CSn2:0=1). Esto proporciona
funcionamiento más rápido, con una frecuencia máxima de reloj del Timer/Counter
equivalente a la frecuencia del reloj del sistema (fCLK_I/O). Alternativamente, una de las
cuatro opciones del preajustador puede usarse como una fuente de reloj. El reloj
preajustado tiene una frecuencia de cualquier de las siguientes: fCLK_I/O /8, fCLK_I/O /64,
fCLK_I/O /256, o fCLK_I/O /1024.

La Fuente Externa de Reloj. Una fuente externa de reloj aplicada al pin T1/T0 puede
usarse como reloj del Timer/Counter (clkT1/clkT0).
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 96 -

Figura. 2.25. Preajustador para el Timer/Counter0 y Timer/Counter1.

El Registro General de Control del Timer/Counter – GTCCR

Bit 7 – TSM: Modo de Sincronización para el Timer/Counter. Escribiendo el bit TSM


a uno activa el modo de Sincronización del Timer/Counter. En este modo, el valor que se
escribe al bit PSR2 y PSR10 se mantiene. Esto asegura que los correspondientes
Timer/Counters sean detenidos y puedan ser configurados al mismo valor sin el riesgo de
que avancen durante la configuración. Cuando el bit TSM se escribe a cero, los bits PSR2
y PSR10 se borran por hardware, y los Timer/Counters empiezan contando
simultáneamente.

Bit 0 – PSR10: Reset del Preajustador para el Timer/Counter1 y Timer/Counter0.


Cuando éste bit es uno, se reseteará el preajustador del Timer/Counter1 y del
Timer/Counter0. Este bit normalmente se borra inmediatamente por hardware, excepto si
el bit TSM está seteado. Nótese que el Timer/Counter1 y el Timer/Counter0 comparten el
mismo preajustador y un reset a este preajustador afectará a ambos timers.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 97 -

2.11.5. Descripción de los Registros del Timer/Counter0 de 8 bits

Registro A para Control del Timer/Counter0 – TCCR0A

Bit 7 – FOC0A: Forzar a Output Compare A. Este bit está activo únicamente cuando el
bit WGM especifica un modo sin-PWM. Al escribir un uno en este bit, se forza a una
coincidencia de comparación inmediata en la Unidad Generadora de Onda. La salida
OC0A cambia según la configuración de sus bits COM0A1:0.

Bit 6, 3 – WGM01:0: Modo de Generación de Onda. Los modos de operación


soportados por la unidad Timer/Counter0 son: modo Normal, modo Clear Timer on
Compare Match (CTC) y dos tipos de modo PWM. Ver la Tabla 2.30.

Tabla. 2.30. Descripción de los bits para el Modo de Generación de Onda

Bit 5:4 – COM0A1:0: Modo Compare Match Output. Estos bits controlan el
comportamiento del pin Output Compare (OC0A). El bit del Registro de Dirección de
Datos correspondiente al pin OC0A debe ser escrito con uno lógico “1” para habilitarlo
como salida.

La Tabla 2.31 muestra la configuración de estos bits para el modo CTC.


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 98 -

Tabla. 2.31. Modo de Comparación, sin Modo PWM

La Tabla 2.32 muestra la configuración de estos bits para el modo PWM rápido.

Tabla. 2.32. Modo de Comparación, Modo PWM Rápido

La Tabla 2.33 muestra la configuración de estos bits para el modo PWM de Fase
Correcta.

Tabla. 2.33. Modo de Comparación, Modo PWM de Fase Correcta

Bit 2:0 – CS02:0: Selección de Reloj. Estos bits seleccionan la fuente de reloj que usará el
Timer/Counter0. En la Tabla 2.34 se muestra las distintas opciones de reloj para el
Timer/Counter0.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 99 -

Tabla. 2.34. Descripción de los Bits Selectores de Reloj

Registro del Timer/Counter0 – TCNT0

Registro A para Comparación (Output Compare Register A) – OCR0A

Registro Enmascarador de Interrupciones del Timer/Counter0 – TIMSK0

Bit 1 – OCIE0A: Habilitador de la Interrupción por Coincidencia en la Comparación entre


el TCNT0 y el OCR0A.

Bit 0 – TOIE0: Habilitador de la Interrupción por Desbordamiento del Timer/Counter0.


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 100 -

Registro para Indicadores de Interrupción del Timer/Counter0 – TIFR0

Bit 1 – OCF0A: Indicador de Comparación entre TCNT0 y OCR0A. El bit OCF0A se


pone a uno cuando ocurre una coincidencia en la comparación entre el Timer/Counter0
(TCNT0) y el dato en el registro OCR0A. OCF0A es borrado por hardware al ejecutar el
correspondiente vector de interrupción. Alternativamente, el Indicador OCF0A puede ser
borrado escribiendo un uno lógico en este.

Bit 0 – TOV0: Indicador de Desbordamiento del Timer/Counter0. El bit TOV0 se pone


a uno cuando ocurre un desbordamiento en el Timer/Counter0. TOV0 es borrado por
hardware al ejecutar el correspondiente vector de interrupción. Alternativamente, el
Indicador TOV0 puede ser borrado escribiendo un uno lógico en este.

2.12. EL TIMER/COUNTER1 DE 16 BITS


La unidad del Timer/Counter1 de 16 bits permite la correcta temporización
(sincronización) para la ejecución del programa (administración de evento), generación de
onda y medición temporizada de la señal. Las características principales del
Timer/Counter1 se listan a continuación.

• Diseño verdadero de 16 bit (p.ej. permite PWM de 16 bit).


• Dos Unidades Comparadoras independientes.
• Registros Comparadores de doble buffer.
• Una Unidad para Captura de Datos (Input Capture).
• Anulador de Ruido para la Captura de Datos.
• Timer Encerado por Coincidencia en Comparación (Auto Recarga).
• Fase Correcta del Modulador de Ancho de Pulso (PWM), libre de fallos.
• PWM de Período Variable.
• Generador de Frecuencia.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 101 -

• Contador de Evento Externo.


• Cuatro Fuentes de Interrupción Independientes (TOV1, OCF1A, OCF1B e ICF1).

En la Figura 2.26 se muestra un diagrama de bloque simplificado del Timer/Counter


de 16 bit.

Figura. 2.26. Diagrama de Bloques del Timer/Counter1 de 16 bits.

Los Registros. El Timer/Counter (TCNT1), los Registros para Comparación (Output


Compare Registers OCR1A/B) y el Registro para Captura de Datos (Input Capture
Register ICR1) son todos registros de 16 bits. Los Registros para el Control del
Timer/Counter (Timer/Counter Control Registers TCCR1A/B) son registros de 8 bits y no
tienen restricciones de acceso para la CPU. Las señales de petición de Interrupción son
todas visibles en el Registro para Indicadores de Interrupción del Timer (Timer Interrupt
Flag Register TIFR1). Todas las interrupciones son enmascaradas individualmente con el
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 102 -

Registro Enmascarador de Interrupciones del Timer (Timer Interrupt Mask Register


TIMSK1).

El Timer/Counter puede ser provisto de señal de reloj internamente, vía preajustador


(prescaler) o por una fuente externa de reloj en el pin T1. El bloque lógico Clock Select
controla cual fuente de reloj y flanco usará el Timer/Counter para incrementar (o
decrementar) su valor. El Timer/Counter permanece inactivo cuando ninguna fuente de
reloj está seleccionada. La salida de la lógica del Clock Select es llamada reloj del timer
(clkT1).

Los Registros de Comparación con doble buffer (OCR1A/B) son comparados en


todo momento con el valor del Timer/Counter (TCNT1). El resultado de la comparación
puede ser usado por el Generador de Onda para generar un PWM o una salida de
frecuencia variable en el pin Output Compare (OC1A/B). El evento de Coincidencia en la
Comparación también seteará al Indicador de Coincidencia en la Comparación (Compare
Match Flag OCF1A/B), el cual podrá ser usado para generar una petición de interrupción
por la Comparación.

La unidad para Captura de Datos (Input Capture Unit) incluye una unidad de filtraje
digital (Anulador de Ruido) para reducir la probabilidad de capturar picos de ruido.

El bit PRTIM1 de “Power Reduction Register - PRR” debe ser escrito con cero para
habilitar el módulo Timer/Counter1.

2.12.1. Fuentes de Reloj para el Timer/Counter


El Timer/Counter puede ser provisto de señal de reloj por una fuente de reloj interna
o externa. La fuente de reloj se selecciona por la lógica del Clock Select, la cual es
controlada por los bits Clock Select (CS12:0) localizados en el Registro B para Control
del Timer/Counter0 (Timer/Counter Control Register B – TCCR1B).
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 103 -

2.12.2. La Unidad de Conteo (Counter Unit)


La parte principal del Timer/Counter de 16 bit es la unidad Contadora bi-direccional
programable de 16 bits. La Figura 2.27 muestra un diagrama de bloques del Contador y su
entorno.

Figura. 2.27. Diagrama de Bloques de la Unidad Contadora.

Descripción de las señales (señales internas):

Count Incrementar o decrementar por uno al TCNT1.


Direction Seleccionar entre incremento y decremento.
Clear Borrar contenido del TCNT1 (poner todos los bits en cero).
clkT1 Reloj del Timer/Counter
TOP Significa que TCNT1 ha alcanzado el valor máximo.
BOTTOM Significa que TCNT1 ha alcanzado el valor mínimo (cero).

Dependiendo del modo de operación usado, el Contador es borrado, incrementado o


decrementado por el reloj del timer (clkT1). clkT1 puede ser generado desde una fuente reloj
externa o interna, seleccionado por los bits Clock Select (CS12:0). Cuando no se haya
seleccionado ninguna fuente de reloj (CS12:0=0) el timer permanecerá detenido. Sin
embargo, el valor del TCNT1 puede ser accedido por la CPU, indiferentemente de si está o
no presente clkT1.

La secuencia de conteo está determinada por la configuración de los bits (WGM13:0)


localizados en los Timer/Counter Control Registers A y B (TCCR1A y TCCR1B).
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 104 -

El Indicador de Desbordamiento del Timer/Counter (TOV1) es seteado de acuerdo al


modo de operación seleccionado por los bits WGM13:0. TOV1 puede usarse para generar
una interrupción.

2.12.3. Descripción de los Registros del Timer/Counter1 de 16 bits

Registro A para Control del Timer/Counter1 – TCCR1A

Bit 7:6 – COM1A1:0. Modo de Comparación para la Unidad A (Output Compara for
Unit A).

Bit 5:4 – COM1B1:0. Modo de Comparación para la Unidad B (Output Compara for
Unit B).

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


Compare (OC1A y OC1B respectivamente). Los bits de los Registros de Dirección de
Datos correspondientes a los pines OC1A y OC1B deben ser seteados para habilitarlos
como salidas.

La Tabla 2.35 muestra la funcionalidad de los pines COM1x1:0 cuando los bits
WGM13:0 están seteados para un modo Normal o un modo CTC (sin PWM).
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 105 -

Tabla. 2.35. Modo de Salida de Comparación, sin PWM

La Tabla 2.36 muestra la funcionalidad de los pines COM1x1:0 cuando los bits
WGM13:0 están seteados para el modo PWM rápido.

Tabla. 2.36. Modo de Comparación, PWM Rápido

La Tabla 2.37 muestra la funcionalidad de los pines COM1x1:0 cuando los bits
WGM13:0 están seteados para el modo PWM de fase correcta o de Fase y Frecuencia
Correcta.

Tabla. 2.37. Modo de Comparación, PWM de Fase Correcta y de Fase y Frecuencia Correcta
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 106 -

Bit 1:0 – WGM11:0: Modo de Generación de Onda. Combinados con los bits
WGM13:2 que se encuentran en el Registro TCCR1B, estos bits controlan la secuencia del
contador, la procedencia del valor máximo (TOP) del contador y el tipo de generación de
onda que se usará, ver la Tabla 2.38. Los Modos de operación soportados por la unidad
Timer/Counter son: modo Normal (contador), modo de Timer Encerado en cada
Coincidencia en la Comparación (CTC) y tres tipos de modos de Modulación de Ancho de
Pulso (PWM).

Tabla. 2.38. Descripción de Bits para el Modo de Generación de Onda (1)

Nota:
1. Los nombres de las definiciones de los bits CTC1 y PWM11:0 son obsoletos. Use las
definiciones WGM12:0. Sin embargo, la funcionalidad y localidad de estos bits son
compatibles con versiones anteriores del timer.

Registro B para Control del Timer/Counter1 – TCCR1B

Bit 7 – ICNC1. Anulador de Ruido para la Captura de Datos (Input Capture).


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 107 -

Bit 6 – ICES1. Selector de Flanco para la Captura de Datos.

Bit 5 – Bit. Reservado.

Bit 4:3 – WGM13:2. Modo de Generación de Onda.

Bit 2:0 – CS12:0. Selectores de Reloj. Los tres bits Selectores de Reloj seleccionan la
fuente de reloj que será usada por el Timer/Counter1. Ver Tabla 2.39.

Tabla. 2.39. Descripción del Selector de Reloj

Registro C para Control del Timer/Counter1 – TCC1RC

BIT 7 – FOC1A. Forzar a Output Compare para la Unidad A.

BIT 7 – FOC1B. Forzar a Output Compare para la Unidad B.

Los bits FOC1A/FOC1B están activos únicamente cuando los bits WGM13:0
especifican un modo sin-PWM. Sin embargo, para asegurar compatibilidad con futuros
dispositivos, estos bits deben ser puestos a cero cuando TCCR1A se escriba al operar en un
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 108 -

modo de PWM. Al escribir un uno en los bits FOC1A/FOC1B, se forza a una coincidencia
de comparación inmediata en la Unidad Generadora de Onda. Las salidas OC1A/OC1B
cambian según la configuración de sus bits COM1x1:0

Timer/Counter1 – TCNT1H y TCNT1L

Las dos localidades de I/O del Timer/Counter (TCNT1H y TCNT1L, combinadas


TCNT1) dan acceso directo, para las operaciones de lectura y escritura, al contador de 16
bits de la Unidad Timer/Counter. Para asegurarse que ambos bytes, alto y bajo, sean leídos
y escritos simultáneamente cuando la CPU accede a estos registros, el acceso es realizado
usando un Registro temporal de 8 bit para Byte Alto (TEMP). Este registro temporal es
compartido por todos los otros registros de 16 bit.

Registro A para Comparación con TCNT1 – OCR1AH y OCR1AL

Registro B para Comparación con TCNT1– OCR1BH y OCR1BL


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 109 -

Los Registros para Comparación contienen un valor de 16 bits que es comparado


continuamente con el valor del contador (TCNT1). Una coincidencia puede usarse para
generar una interrupción por Comparación ó para generar una onda en el pin OC1x.

Los Registros para Comparación tienen un tamaño de 16 bits. Para asegurarse que
ambos bytes, el alto y el bajo, sean escritos simultáneamente cuando la CPU escribe en
estos registros, el acceso se lo realiza usando un Registro temporal (TEMP) para el Byte
Alto de 8 bit. Este registro temporal es compartido por todos los otros registros de 16 bits.

Registro para Captura de Datos del Timer 1 – ICR1H e ICR1L

Este registro se actualiza con el valor del contador (TCNT1) cada vez que ocurre un
evento en el pin ICP1. El registro ICR1 (ICR1H e ICR1L) puede ser usado para definir el
valor TOP del Contador.

Registro Máscara de Interrupción del Timer/Counter1

Bit 5 – ICIE1. Habilitador de la Interrupción por Captura de Datos del Timer/Counter1.

Bit 2 – OCIE1B. Habilitador de la Interrupción por Coincidencia en la Comparación entre


OCR1B y TCNT1.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 110 -

Bit 1 – OCIE1A. Habilitador de la Interrupción por Coincidencia en la Comparación entre


OCR1A y TCNT1.

Bit 0 – TOIE1. Habilitador de la Interrupción por Desbordamiento del Timer/Counter1

Registro Indicador de Interrupción del Timer/Counter1

Bit 5 – ICF1: Indicador de Interrupción por Captura de Datos del Timer/Counter1.


Este indicador se setea cuando ocurre un evento en el pin ICP1. Cuando los bits WGM13:0
están configurados para utilizar el registro ICR1 como valor TOP, el indicador ICF1 se
setea cuando el contador alcanza el valor TOP.

Este indicador es puesto a cero por hardware luego de que se ejecuta el vector de
interrupción correspondiente. Alternativamente, puede ser borrado escribiendo un uno
lógico en su posición de bit.

Bit 2 – OCF1B: Indicador de Interrupción por Coincidencia en la Comparación entre


el OCR1B y el TCNT1 del Timer/Counter1. Este indicador se setea en el ciclo de reloj
siguiente al ciclo en el que el valor del contador (TCNT1) coincide con el registro OCR1B
(TCNT1 es igual que OCR1B).

Este indicador es puesto a cero por hardware luego de que se ejecuta el vector de
interrupción correspondiente. Alternativamente, puede ser borrado escribiendo un uno
lógico en su posición de bit.

Bit 1 – OCF1A: Indicador de Interrupción por Coincidencia en la Comparación entre


el OCR1A y el TCNT1 del Timer/Counter1. Este indicador se setea (se pone a 1) en el
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 111 -

flanco de reloj siguiente al ciclo en el que el valor del contador (TCNT1) coincide con el
registro OCR1A en la comparación.

Este indicador es puesto a cero por hardware luego de que se ejecuta el vector de
interrupción correspondiente. Alternativamente, puede ser borrado escribiendo un uno
lógico en su posición de bit.

Bit 0 – TOV1: Indicador de Desborde del Timer/Counter1. Este indicador se setea


dependiendo de la configuración de los bits WGM13:0.

Este indicador es puesto a cero por hardware luego de que se ejecuta el vector de
interrupción correspondiente. Alternativamente, puede ser borrado escribiendo un uno
lógico en su posición de bit.

2.13. EL TIMER/COUNTER2 DE 8 BITS CON PWM Y FUNCIONAMIENTO


ASINCRÓNICO
El Timer/Counter2 es un módulo Timer/Counter de 8 bit de propósito general con
una Unidad de Comparación. Las principales características del Timer/Counter2 se listan a
continuación.

• Contador con Una Unidad de Comparación


• Timer Encerado al Coincidir la Comparación (Auto Recarga).
• Modulador de Ancho de Pulso (PWM) de Fase Correcta, libre de fallo.
• Generador de Frecuencia.
• Preajustador de Reloj de 10 bit.
• Fuentes de Interrupción por Desbordamiento y por Coincidencia en la Comparación
(TOV2 y OCF2A respectivamente).
• Permite Clocking desde Reloj de Cristal Externo de 32 KHz Independiente del Reloj
de I/O.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 112 -

En la Figura 2.28 se muestra un diagrama de bloque simplificado del Timer/Counter


de 8 bits. Los Registros de I/O accesibles por la CPU, incluyendo los bits de I/O y los pines
de I/O, se muestran en negrita.

Figura. 2.28. Diagrama de Bloques del Timer/Counter de 8 bits.

2.13.1. Descripción de los Registros del Timer/Counter de 16 bit

Registro A para Control del Timer/Counter2


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 113 -

Bit 7 – FOC2A: Forzar a Output Compare A. Este bit está activo únicamente cuando el
bit WGM especifica un modo sin-PWM. Al escribir un uno en este bit, se forza a una
coincidencia de comparación inmediata en la Unidad Generadora de Onda. La salida
OC2A cambia según la configuración de sus bits COM2A1:0.

Bit 6, 3 – WGM21:0: Modo de Generación de Onda. Los modos de operación


soportados por la unidad Timer/Counter2 son: modo Normal, modo Clear Timer on
Compare Match (CTC) y dos tipos de modo PWM. Ver la Tabla 2.40.

Tabla. 2.40. Descripción de los bits para el Modo de Generación de Onda

Bit 5:4 – COM2A1:0: Modo Compare Match Output. Estos bits controlan el
comportamiento del pin Output Compare (OC2A). El bit del Registro de Dirección de
Datos correspondiente al pin OC2A debe ser seteado para habilitarlo como salida.

La Tabla 2.41 muestra la configuración de estos bits para el modo CTC (sin PWM).

Tabla. 2.41. Modo de Comparación, sin Modo PWM

La Tabla 2.42 muestra la configuración de estos bits para el modo PWM rápido.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 114 -

Tabla. 2.42. Modo de Comparación, Modo PWM Rápido

La Tabla 2.43 muestra la configuración de estos bits para el modo PWM de Fase
Correcta.

Tabla. 2.43. Modo de Comparación, Modo PWM de Fase Correcta

Bit 2:0 – CS22:0: Selección de Reloj. Estos bits seleccionan la fuente de reloj que usará el
Timer/Counter2. En la Tabla 2.44 se muestra las distintas opciones de reloj para el
Timer/Counter2.

Tabla. 2.44. Descripción de los Bits Selectores de Reloj


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 115 -

Registro del Timer/Counter2

Registro A para Comparación (Output Compare Register A) – OCR2A

El Registro A para Comparación contienen un valor de 8 bits que es comparado


continuamente con el valor del contador (TCNT2). Una coincidencia puede usarse para
generar una interrupción por Comparación ó para generar una onda en el pin OC2A.

2.13.2. Funcionamiento Asincrónico del Timer/Counter2

Registro de Estado Asincrónico

Bit 4 – EXCLK: Habilitador de la Entrada de Reloj Externo. Cuando el EXCLK es


escrito a uno y se selecciona el reloj asincrónico, se habilita la entrada de reloj externa y un
reloj externo puede entrar por el pin TOSC1 (Timer Oscillator 1) en lugar de un cristal de
32 KHz. La escritura en EXCLK debe hacerse antes de seleccionar la operación
asincrónica. Nótese que el Oscilador de cristal funcionará únicamente cuando este bit sea
cero.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 116 -

Bit 3 – AS2: Timer/Counter2 Asincrónico. Cuando el AS2 es escrito a cero, el


Timer/Counter2 utiliza el reloj de I/O, clkI/O. Cuando el AS2 es escrito a uno, el
Timer/Counter2 utiliza el Oscilador de cristal conectado al pin TOSC1 (Timer Oscillator
1).

Bit 2 – TCN2UB: Ocupado en la Actualización del Timer/Counter2. Cuando el


Timer/Counter2 funciona asincrónicamente y el TCNT2 es escrito, este pin se setea.
Cuando el TCNT2 se ha actualizado, este bit es borrado por hardware. Un cero lógico en
este bit indica que el TCNT2 está listo para ser actualizado con un nuevo valor.

Bit 1 – OCR2UB: Ocupado en la Actualización del Registro para Comparación del


Timer/Counter2. Cuando el Timer/Counter2 funciona asincrónicamente y el OCR2A es
escrito, este pin se setea. Cuando el OCR2A se ha actualizado, este bit es borrado por
hardware. Un cero lógico en este bit indica que el OCR2A está listo para ser actualizado
con un nuevo valor.

Bit 0 – TCR2UB: Ocupado en la Actualización del Registro para Control del


Timer/Counter2. Cuando el Timer/Counter2 funciona asincrónicamente y el TCCR2A es
escrito, este pin se setea. Cuando el TCCR2A se ha actualizado, este bit se borra por
hardware. Un cero lógico en este bit indica que el TCCR2A está listo para ser actualizado
con un nuevo valor.

Registro Enmascarador de Interrupciones del Timer/Counter2 – TIMSK2

Bit 1 – OCIE2A: Habilitador de la Interrupción por Coincidencia en la Comparación entre


el TCNT2 y el OCR2A.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 117 -

Bit 0 – TOIE2: Habilitador de la Interrupción por Desbordamiento del Timer/Counter2.


Registro para Indicadores de Interrupción del Timer/Counter2 – TIFR2

Bit 1 – OCF2A: Indicador de Comparación entre TCNT2 y OCR2A. El bit OCF2A se


pone a uno cuando ocurre una coincidencia en la comparación entre el Timer/Counter2
(TCNT2) y el dato en el registro OCR2A. OCF2A es borrado por hardware al ejecutar el
correspondiente vector de interrupción. Alternativamente, el Indicador OCF2A puede ser
borrado escribiendo un uno lógico en este.

Bit 0 – TOV2: Indicador de Desbordamiento del Timer/Counter2. El bit TOV2 se pone


a uno cuando ocurre un desbordamiento en el Timer/Counter2. TOV2 es borrado por
hardware al ejecutar el correspondiente vector de interrupción. Alternativamente, el
Indicador TOV2 puede ser borrado escribiendo un uno lógico en este.

2.13.3. El Preajustador del Timer/Counter2


La fuente de reloj para el Timer/Counter2 es llamada clkT2S. clkT2S está por defecto
conectada al reloj de I/O principal del sistema clkI/O. Seteando el bit AS2 en el ASSR,
habilita el uso del Timer/Counter2 como un Contador de Tiempo Real (RTC). Cuando el
AS2 es seteado, se desconectan los pines TOSC1 y TOSC2 del PORTC. Entonces un
cristal puede conectarse entre los pines TOSC 1 y TOSC2 para utilizarlo como una fuente
de reloj independiente para el Timer/Counter2. El Oscilador está optimizado para usar un
cristal de 32768 KHz.

Para el Timer/Counter2, las posibles selecciones preajustadas son: clkTS2/8, clkTS2/32,


clkTS2/64, clkTS2/128, clkTS2/256 y clkTS2/1024. Adicionalmente, pueden seleccionarse
clkTS2 como también 0 (detenido).
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 118 -

Registro para Control General del Timer/Counter – GTCCR

Bit 1 – PSR2: Reset del Preajustador para el Timer/Counter2. Cuando éste bit es uno,
se reseteará el preajustador del Timer/Counter2. Este bit normalmente se borra
inmediatamente por hardware, excepto si el bit TSM está seteado.

2.14. LA INTERFAZ USART


El Transmisor y Receptor Serial Universal Sincrónico y Asincrónico (Universal
Synchronous and Asynchronous Serial Receiver and Transmitter USART) es un
dispositivo de comunicación serial altamente flexible. Sus características principales se
listan a continuación.

• Operación Full Duplex (Registros Independientes para Recepción y Transmisión


Serial).
• Funcionamiento Asincrónico y Sincrónico.
• Funcionamiento Master o Slave.
• Generador de Tasa de Baudio de Alta Resolución.
• Soporta Tramas Seriales con 5, 6, 7, 8 y 9 Bits de Datos y 1 ó 2 Bits de Parada.
• Generación de Paridad Par e Impar y Comprobación de Paridad Soportada por
Hardware.
• Detección de Desbordamiento de Datos.
• Detección de Error de Trama.
• Filtraje de Ruido que Incluye Detección de Falso Bit de Inicio y Filtro Digital
Pasabajo.
• Tres Interrupciones Separadas por los Eventos “TX Finalizada”, “Registro de Datos
de TX Vacío” y “RX Finalizada”.
• Modo de Comunicación de Multi-procesador.
• Modo de Comunicación Asincrónico de Doble Velocidad.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 119 -

Para habilitar el módulo USART el bit PRUSART0 en el “Power Reduction Register


- PRR” debe escribirse con un cero.

En la Figura 2.29 se muestra un diagrama de bloque simplificado del Transmisor


USART. Los Registros de I/O accesibles por la CPU, incluyendo los bits de I/O y los pines
de I/O, se muestran en negrita.

Figura. 2.29. Diagrama de Bloque de la USART

Las zonas con líneas entrecortadas en el diagrama de bloque separa las tres partes
principales de USART (listadas desde arriba): Generador de Reloj, Transmisor y Receptor.
Los Registros de Control son compartidos por todas las unidades. La lógica de la
Generación de Reloj consiste de la lógica de sincronización a causa de la entrada de reloj
externa usada por la operación slave sincrónica, y el generador de tasa de baudio. El pin
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 120 -

XCK (Transfer Clock – Reloj para Transferencia) es únicamente usado por el modo de
transferencia sincrónico. El transmisor consiste de un buffer de escritura sencillo, un
Registro de Desplazamiento serial, Generador de Paridad y lógica de Control para manejar
diferentes formatos de trama serial. El buffer de escritura permite la transferencia continua
de datos sin ningún retrazo entre tramas.

El Receptor es la parte más compleja del módulo USART debido a su reloj y


unidades de recuperación de datos. Las unidades de recuperación se usan para recepción
asincrónica de datos. Además de las unidades de recuperación, el Receptor incluye un
Comprobador de Paridad, lógica de Control, un Registro de Desplazamiento y un buffer de
recepción de dos niveles (UDR). El Receptor soporta los mismos formatos de trama que el
Transmisor, y puede detectar Error de Trama, Desbordamiento de Datos y Errores de
Paridad.

2.14.1. Generación de Reloj


La lógica para la Generación de Reloj genera el reloj base para el Transmisor y
Receptor. USART soporta cuatro modos de operación del reloj: modo asincrónico Normal,
asincrónico de Velocidad Doble, sincrónico Master y sincrónico Slave. El bit UMSEL en
el Registro C para el Control y Estado de USART (USART Control and Status Register C
– UCSRC) selecciona entre la operación asincrónica y la sincrónica.

La velocidad doble (únicamente modo asincrónico) se controla por medio del bit
U2X que se encuentra en el Registro UCSRA. Al usar modo sincrónico (UMSEL=1), el
Registro de Dirección de Datos para el pin XCK (DDR_XCK) controla si la fuente de reloj
es interna (modo Master) o externa (modo Slave). El pin XCK está activo únicamente al
usar el modo sincrónico. En la Figura 2.30 se muestra el diagrama de bloques de la Lógica
de Generación de Reloj.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 121 -

Figura. 2.30. Diagrama de Bloque de la Lógica de Generación de Reloj

Descripción de las señales:

txclk Reloj del Transmisor (Señal Interna).


rxclk Reloj base del Receptor (Señal Interna).
xcki Entrada desde el pin XCK (Señal interna). Usada en el funcionamiento
sincrónico slave.
xcko Salida de Reloj para el pin XCK (Señal Interna). Usada en el
funcionamiento sincrónico Master.
fosc frecuencia del pin XTAL (Reloj del Sistema).

Generación del Reloj Interno – El Generador de Baud Rate (Velocidad de


Transmisión en Baudios). La generación de reloj interno se usa para los modos de
operación asincrónico y sincrónico master. El Registro para la Baud Rate de USART
(USART Baud Rate Register – UBRR) y el down-counter (contador regresivo) conectado a
éste funcionan como un preajustador programable ó generador de velocidad de transmisión
en baudios (baud rate generator).

El down-counter, ejecutando al reloj del sistema (fOSC), es cargado con el valor


UBRR cada vez que el contador ha contado regresivamente hasta llegar a cero o cuando el
Registro UBRRL es escrito. Un pulso de reloj se genera cada vez que el contador alcanza
el cero. Este reloj es la salida de reloj para el generador de baud rate (=fosc/(UBRR+1)).
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 122 -

El Transmisor divide la salida de reloj del generador de baud rate, para 2, 8 o 16,
dependiendo del modo. La salida del generador de baud rate es directamente usada por el
reloj del Receptor y por las unidades de recuperación de datos. Sin embargo, las unidades
de recuperación usan una máquina de estados que usa 2, 8 o 16 estados dependiendo del
modo fijado por el estado de los bits UMSEL, U2X y DDR_XCK.

La Tabla 2.45 contiene ecuaciones para calcular la baud rate (en bits por segundo) y
para calcular el valor de UBRR para cada modo de operación usando una fuente de reloj
generada internamente.

Tabla. 2.45. Ecuaciones para Calcular la Configuración del Registro de la Baud Rate

Nota: La baud rate se define como la velocidad de transferencia en bit por segundo (bps).

Las variables utilizadas en la Tabla 2.45 son las siguientes:

BAUD Baud rate (en bits por segundo, bps).


fOSC Frecuencia de reloj del Oscilador del Sistema.
UBRR Contenido de los Registros UBRRH y UBRRL, (0-4095).

Funcionamiento con Velocidad Doble (U2X). La velocidad de transferencia puede


duplicarse configurando el bit U2X en el UCSRA. La configuración de este bit únicamente
tiene efecto para el funcionamiento asincrónico. Cuando use el funcionamiento sincrónico
ponga este bit a cero.

La configuración de este bit reducirá el divisor de la baud rate de 16 a 8, doblando


efectivamente la velocidad de transferencia para la comunicación asincrónica. Nótese sin
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 123 -

embargo que el Receptor, en este caso, únicamente usa la mitad del número de muestras
(se reducen de 16 a 8) para el muestreo de datos y recuperación del reloj, y por lo tanto
cuando se usa este modo se requiere una configuración más precisa de baud rate y de reloj
de sistema. Para el Transmisor, no hay ningún inconveniente.

El Reloj Externo. El uso de reloj externo se lo emplea para el modo de funcionamiento


slave sincrónico.

La entrada de reloj externo del pin XCK se muestrea por un registro de


sincronización para minimizar la posibilidad de metastabilidad. La salida del registro de
sincronización debe entonces pasar a través de un detector de flanco antes de que éste
pueda ser usado por el Transmisor y Receptor. Este proceso introduce un retrazo de dos
periodos de reloj de la CPU y por lo tanto la frecuencia máxima de reloj externo XCK se
limita por la Ecuación 2.1.

f OSC
f XCK <
4
Ecuación. 2.1. Frecuencia máxima de reloj

Nótese que fOSC depende de la estabilidad de la fuente de reloj del sistema. Se


recomienda añadir algún margen para evitar la posible pérdida de datos debido a
variaciones de frecuencia.

Funcionamiento Sincrónico del Reloj. Al usar el modo sincrónico (UMSEL=1), el pin


XCK se usará como cualquier entrada de reloj (Slave) o salida de reloj (Master). La
dependencia entre los flancos de reloj y el muestreo de datos ó el cambio de datos es la
misma. El principio básico es que la entrada de datos (en RxD) se muestrea a causa del
flanco de reloj XCK opuesto al borde en que la salida de datos (TxD) cambia.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 124 -

Figura. 2.31. Tiempos del Modo Sincrónico XCK

El bit UCPOL selecciona el flanco de reloj XCK que se usará para el muestreo de
datos y el que se usará para el cambio de datos. Como muestra la Figura 2.31, cuando
UCPOL es cero los datos cambiarán en el flanco ascendente de XCK y se muestrearán en
el flanco descendente de XCK. Si UPCOL = 1 (uno), los datos cambiarán en el flanco
descendente de XCK y se muestrearán en el flanco ascendente de XCK.

2.14.2. Formatos de la Trama


Una trama serial se define como un carácter de bits de datos con bits de
sincronización (bits de inicio y parada), y opcionalmente un bit de paridad para
verificación de errores. USART acepta como formatos de trama válidos a todas las 30
combinaciones de los siguientes:

• 1 bit de inicio

• 5, 6, 7, 8 o 9 bits de datos.

• Bit de paridad par, impar o sin bit de paridad.

• 1 o 2 bits de parada.

Una trama empieza con el bit de inicio seguido por el bit menos significativo de
datos. Después los siguientes bits de datos, hasta un total de nueve, sucesivamente,
finalizando con el bit más significativo. Si se habilita, el bit de paridad es insertado luego
de los bits de datos, antes del bit de parada. Cuando se transmite una trama completa, esta
puede ser seguida directamente por una nueva trama, o la línea de comunicación puede
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 125 -

ponerse en estado inactivo (en high – en alto). La Figura 2.32 ilustra las combinaciones
posibles de los formatos de trama. Los bits dentro de los corchetes son opcionales.

Figura. 2.32. Formatos de Trama.

St Bit de inicio, siempre en bajo.


(n) Bits de Datos (de 0 a 8).
P Bit de Paridad. Puede ser par o impar.
Sp Bit de Parada, siempre en alto.
IDLE Sin transferencia en la línea de comunicación (RxD o TxD), una
línea INACTIVA (IDLE) debe estar en alto.

El formato de trama usado por USART es fijado por los bits UCSZ2:0, UPM1:0 y
USBS en UCSRB y UCSRC. El Receptor y el Transmisor usan la misma configuración.
Nótese que cambiar la configuración de cualquiera de estos bits alterará todas las
comunicaciones que estén en proceso para ambos, Receptor y Transmisor.

Los bits para configuración del Tamaño de Carácter USART (UCSZ2:0) seleccionan
el número de bits de datos en el paquete. Los bits para la configuración del modo de
Paridad USART (UPM1:0) habilitan el tipo de bit de paridad. La selección entre uno o dos
bits de parada se la hace mediante el bit Selector de Bit de Parada USART (USART Stop
Bit Select – USBS). El Receptor ignora el segundo bit de parada. Un FE (Error de Paquete)
será por consiguiente detectado únicamente en casos donde el primer bit de parada sea
cero.

2.14.3. Inicialización de la Interfaz USART


El módulo USART tiene que ser inicializado antes de que cualquier comunicación
pueda tener lugar. El proceso de inicialización normalmente consiste en configurar la baud
rate, configurar el formato de la trama y dependiendo del uso habilitar el Transmisor o el
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 126 -

Receptor. Cuando se hace la inicialización, el Indicador Global de Interrupción debe ser


borrado (I = 0, todas las interrupciones deshabilitadas globalmente).

Antes de hacer una re-inicialización con cambios en la baud rate o en el formato de


trama, hay que asegurarse que ninguna transmisión esté en proceso durante el período en
que se haga cambios en los registros. El Indicador TXC puede usarse para chequear que el
Transmisor ha finalizado todas las transferencias. El Indicador RXC puede usarse para
chequear que no haya ningún dato sin leer en el buffer de recepción. Nótese que el
Indicador TXC debe ser borrado antes de cada transmisión (antes de que el UDR sea
escrito).

2.14.4. Transmisión de Datos – El Transmisor de USART


El Transmisor USART es habilitado por el bit Habilitador de Transmisión (Transmit
Enable – TXEN) en el registro UCSRB. Cuando el transmisor está habilitado, el USART
anula el funcionamiento normal de puerto del pin TxD y le da la función de salida serial
del Transmisor. La baud rate, el modo de funcionamiento y el formato de la trama deben
fijarse una sola vez antes de que se haga cualquier transmisión. Si se usa funcionamiento
sincrónico, el reloj en el pin XCK será anulado y usado como reloj de la transmisión.

Transmisión de Tramas de 5 a 8 Bits de Datos. Una transmisión de datos comienza


cargando el buffer de transmisión con el dato que será transmitido. La CPU puede cargar el
buffer de transmisión escribiendo en la localidad de I/O del UDR. El dato colocado en el
buffer de transmisión será movido hacia el Registro de Desplazamiento (Shift Register)
cuando el Registro de Desplazamiento esté listo para enviar una nueva trama. El Registro
de Desplazamiento se carga con datos nuevos si USART está en el estado inactivo (sin
transmisión en proceso) ó inmediatamente luego de que se haya transmitido el último bit
de parada de la trama previa. Cuando el Registro de Desplazamiento está cargado con
datos nuevos, éste transferirá una trama completa a la velocidad de transmisión dada por el
Registro de la Baud Rate (Baud Register), bit U2X o por XCK dependiendo del modo de
funcionamiento.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 127 -

El Indicadores e Interrupciones del Transmisor. El Transmisor USART tiene dos


indicadores que revelan su estado: Registro de Datos Vacante (USART Data Register
Empty – UDRE) y Transmisión Finalizada (Transmit Complete – TXC). Ambos
indicadores pueden usarse para generar interrupciones.

El Indicador UDRE indica si el buffer de transmisión está listo para recibir datos
nuevos. Este bit es puesto a uno cuando el buffer de transmisión está vacante, y a cero
cuando el buffer de transmisión aún contiene datos para transmitir que aún no se han
movido hacia dentro del Registro de Desplazamiento. Por compatibilidad con futuros
dispositivos, se recomienda escribir siempre este bit a cero al escribir en el Registro
UCSRA.

Cuando el bit Habilitador de la Interrupción por Registro de Datos Vacante (Data


Register Empty Interrupt Enable – UDRIE) en el UCSRB está escrito a uno, la
Interrupción por Registro de Datos Vacante de USART se ejecutará con tal que UDRE esté
seteado (con tal de que las interrupciones estén habilitadas globalmente). El UDRE es
puesto a cero al escribir en el UDR. Cuando se usa la transmisión de datos manejada por
interrupción, la rutina de la interrupción por Registro de Datos Vacante debe escribir el
dato nuevo en el UDR para poner en cero al UDRE ó deshabilitar la interrupción por
Registro de Datos Vacante, de lo contrario una interrupción nueva ocurrirá una vez
terminada la rutina de interrupción.

El bit Indicador de Transmisión Finalizada (TXC) es puesto a uno cuando la trama


entera en el Registro de Desplazamiento para Transmisión (Transmit Shift Register) se ha
desplazado hacia fuera y actualmente no hay nuevos datos presentes en el buffer de
transmisión. El bit Indicador TXC es automáticamente borrado cuando se ejecuta una
interrupción por transmisión finalizada. El TXC es útil en la interfaz de comunicación half-
duplex (como el Standard RS-485), donde una aplicación de transmisión debe entrar al
modo de recepción y liberar el bus de comunicación inmediatamente luego de finalizar la
transmisión.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 128 -

Cuando el bit Habilitador de la Interrupción por Transmisión Finalizada (Transmit


Complete Interrupt Enable – TXCIE) está seteado, la Interrupción por Transmisión
Finalizada de USART se ejecutará cuando el Indicador TXC vuelva a setearse (con tal de
que las interrupciones estén habilitadas globalmente). Cuando se usa la interrupción por
transmisión finalizada, la rutina que maneja a la interrupción no tiene que limpiar al
indicador TXC, se hace automáticamente cuando la interrupción se ejecuta.

El Generador de Paridad. El Generador de Paridad calcula el bit de paridad para los


datos de la trama serial. Cuando el bit de paridad está habilitado (UPM1=1), la lógica de
control del transmisor inserta el bit de paridad entre el último bit de datos y el primer bit de
parada de la trama que se está enviando.

Desactivación del Transmisor. La desactivación del Transmisor (poniendo a cero al


TXEN) no se hará efectiva hasta que las transmisiones en curso y las pendientes se
completen, p.ej., cuando el Registro de Desplazamiento para Transmisión y el Registro
Buffer para Transmisión no contienen datos para transmitir. Al desactivarlo, el Transmisor
no anulará el pin TxD.

2.14.5. Recepción de Datos – El Receptor de USART


El Receptor USART es habilitado por el bit Habilitador de Recepción (RXEN) en el
registro UCSRB. Cuando el Receptor está habilitado, el USART anula el funcionamiento
normal del pin RxD y le da la función de entrada serial del Receptor. La baud rate, el modo
de funcionamiento y el formato de la trama deben ser fijados una sola vez antes de que se
pueda hacer cualquier recepción. Si se usa funcionamiento sincrónico, el reloj en el pin
XCK será anulado y usado como reloj de transferencia.

Recepción de Tramas de 5 a 8 Bits de Datos. El Receptor inicia la recepción de datos


cuando detecta un bit de inicio válido. Cada bit que sigue al bit de inicio será muestreado a
la velocidad de transmisión en baudios (baud rate) o con el reloj XCK, y desplazado hacia
dentro del Registro de Desplazamiento para Recepción hasta que se reciba el primer bit de
parada de una trama. Un segundo bit de parada será ignorado por el receptor. Al recibir el
primer bit de parada se moverán los contenidos del Registro de Desplazamiento hacia el
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 129 -

buffer de recepción. El buffer de recepción puede leerse entonces leyendo la localidad de


I/O del UDR.

Indicador e Interrupción del evento Recepción Finalizada. El Indicador de Recepción


Finalizada (RXC) indica que hay datos sin leer presentes en el buffer de recepción. Este
indicador está a uno cuando existen datos sin leer en el buffer, y a cero cuando el buffer de
recepción está vacío (no contiene datos sin leer). Si está deshabilitado el Receptor
(RXEN=0), el buffer de recepción será vaciado y consecuentemente el bit RXC se volverá
a cero.

Cuando el Habilitador de Interrupción por Recepción Finalizada (Receive Complete


Interrupt Enable – RXCIE) en UCSRB está seteado, la Interrupción por Recepción
USART Finalizada se ejecutará con tal de que el Indicador RXC esté seteado (con tal de
que las interrupciones estén habilitadas globalmente). Cuando se usa la recepción de datos
manejada por interrupción, la rutina de Recepción Finalizada debe leer el dato recibido
desde el UDR para limpiar el Indicador RXC, de otro modo ocurrirá una nueva
interrupción una vez terminada la rutina de interrupción.

Indicadores de Error del Receptor. El Receptor USART tiene tres Indicadores de Error:
Error de Trama (FE – Frame Error), Desbordamiento de Datos (DOR – Data OverRun) y
Error de Paridad (UPE – Parity Error). Todos pueden ser accedidos leyendo el UCSRA. Es
común para los Indicadores de Error que éstos estén situados en el buffer de recepción
junto con la trama para que indiquen el estado del error. Debido a lo anterior, el UCSRA
debe ser leído antes que el buffer de recepción (UDR), puesto que la leer la localidad de
I/O del UDR cambia la localidad de lectura del buffer. Otra igualdad para los Indicadores
de Error es que no pueden ser alterados por software haciendo una escritura en la localidad
del indicador. Sin embargo, todos los indicadores deben ser puestos a cero cuando el
UCSRA es escrito. Ninguno de los Indicadores de Error puede generar interrupciones.

El Indicador de Error de Trama (FE) indica el estado del primer bit de parada de la
siguiente trama legible almacenada en el buffer de recepción. El Indicador FE es cero
cuando el bit de parada fue leído correctamente (como uno), y el Indicador FE será uno
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 130 -

cuando el bit de parada fue incorrecto (cero). Éste indicador puede usarse para detectar
condiciones de fuera-de-sincronización, detectando condiciones de ruptura y manejo de
protocolo. El Indicador FE no es afectado por la configuración del bit USBS en el UCSRC.
Por compatibilidad con futuros dispositivos, siempre fije este bit a cero cuando escriba al
UCSRA.

El Indicador de Desbordamiento de Datos (DOR) indica pérdida de datos debido a


una condición de buffer de recepción lleno. Un Desbordamiento de Datos ocurre cuando
el buffer de recepción está lleno (dos caracteres), está un carácter nuevo esperando en el
Registro de Desplazamiento de Recepción, y se detecta un nuevo bit de inicio. Si el
Indicador DOR está seteado (DOR=1) hay una o más tramas seriales perdidas entre la
última trama leída desde el UDR y la siguiente trama leída desde UDR. Por compatibilidad
con dispositivos futuros, escribir siempre a cero éste bit al escribir en UCSRA. El
Indicador DOR es limpiado cuando la trama recibida fue movida con éxito desde el
Registro de Desplazamiento hacia el buffer de recepción.

El Indicador de Error de Paridad (UPE – Parity Error) indica que la siguiente trama
en el buffer de recepción tiene un Error de Paridad al recibirla. Si la Verificación de
Paridad (Parity Check) no está habilitada el bit UPE siempre será leído como cero. Para
compatibilidad con dispositivos futuros, siempre ponga éste bit a cero cuando escriba en el
UCSRA.

El Verificador de Paridad (Parity Checker). El Verificador de Paridad está activado


cuando está puesto a uno el bit UPM1 (modo alto de Paridad de USART). El tipo de
Verificación de Paridad (par o impar) a ejecutarse se selecciona por medio del bit UPM0.
Al habilitarlo, el Verificador de Paridad calcula la paridad de los bits de datos en las tramas
entrantes y compara el resultado con el bit de paridad de la trama serial. El resultado de la
comprobación es almacenado en el buffer de recepción junto con el dato recibido y los bits
de parada. El Indicador Error de Paridad (UPE) puede entonces leerse por software
comprobando si la trama tiene un Error de Paridad.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 131 -

El bit UPE es puesto a uno si el carácter siguiente, que puede leerse desde el buffer
de recepción, tiene un Error de Paridad cuando fue recibido y la Verificación de Paridad
fue habilitada en aquel punto (UPM1=1). Éste bit es válido hasta que el buffer de recepción
(UDR) es leído.

Desactivación del Receptor. En contraste con el Transmisor, la desactivación del


Receptor es inmediata. Por lo tanto los datos de las recepciones en proceso se perderán.
Deshabilitar el Receptor (p.ej. el RXEN puesto a cero) no anulará la función normal del
pin RXD del puerto. El buffer de Recepción FIFO será vaciado cuando se desactiva al
Receptor. Los datos que permanecen en el buffer se perderán.

Vaciar el Buffer de Recepción. El buffer FIFO de recepción será vaciado cuando el


Receptor esté deshabilitado/desactivado. Los datos sin leer se perderán. Si el buffer tiene
que ser vaciado durante su operación normal, debido a por ejemplo una condición de error,
se debe leer la localidad de I/O del UDR hasta que el indicador RXC esté borrado.

2.14.6. Recepción Asincrónica de Datos


USART incluye una unidad de recuperación del reloj y de recuperación de datos para
manejar recepción asincrónica de datos. La lógica de recuperación del reloj se usa para
sincronizar la baud rate generada internamente para las tramas seriales asincrónicas
entrantes en el pin RxD. La lógica para la recuperación de datos muestrea y filtra mediante
pasa-bajos cada bit entrante, mejorando la inmunidad al ruido en el Receptor. El rango
operacional de recepción asincrónica depende de la precisión del reloj interno de baud rate,
la velocidad de las tramas entrantes y el tamaño de la trama en número de bits.

Recuperación Asincrónica del Reloj. La lógica de recuperación de reloj sincroniza el


reloj interno con las tramas seriales entrantes. La Figura 2.33 ilustra el proceso de muestreo
del bit de inicio de una trama entrante. La velocidad de muestreo es 16 veces la baud rate
para el modo Normal, y ocho veces la baud rate para el modo de Velocidad Doble. Las
flechas horizontales ilustran la variación de sincronización debido al proceso de muestreo.
Nótese la variación grande de tiempo al usar el modo de operación de Velocidad Doble
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 132 -

(U2X=1). Las muestras que denotan cero son muestras hechas cuando la línea RXD está
inactiva. (Idle, p. ej. Sin actividad de comunicación).

Figura. 2.33. Muestreo del Bit de Inicio

Cuando la lógica de recuperación del reloj detecta una transición de alto (high: idle
Æ inactivo) a bajo (low: start Æ inicio) en la línea RXD, se inicia la secuencia de
detección del bit de inicio. Permitiendo que la muestra 1 denote la primera muestra-cero
como se muestra en la Figura 2.33. Entonces la lógica de recuperación de reloj usa las
muestras 8, 9 y 10 para modo Normal, y las muestras 4, 5 y 6 para el modo de Velocidad
Doble (indicado con números de muestra dentro de las rectángulos en la Figura 2.33), para
decidir si un bit de inicio válido es recibido. Si dos o más de estas tres muestras tiene
niveles lógicos altos (la mayoría gana), el bit de inicio es rechazado como un pico de ruido
y el Receptor comienza la búsqueda de la próxima transición de alto (high) a bajo (low). Si
de cualquier modo es detectado un bit de inicio válido, la lógica de recuperación del reloj
se sincroniza y la recuperación de datos puede empezar. El proceso de sincronización se
repite para cada bit de inicio.

Recuperación Asincrónica de Datos. Cuando el reloj del receptor está sincronizado con
el bit de inicio, la recuperación de datos puede empezar. La unidad de recuperación de
datos usa una máquina de estados que tiene 16 estados para cada bit en el modo Normal y
ocho estados para cada bit en el modo de Velocidad Doble. La Figura 2.34 exhibe el
muestreo de los bits de datos y del bit de paridad. A cada una de las muestras se le da un
número que es igual al estado de la unidad de recuperación.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 133 -

Figura. 2.34. Muestreo de los Datos y Bit de Paridad

La decisión del nivel lógico del bit recibido se toma haciendo una votación
mayoritaria del valor lógico para las tres muestras en el centro del bit recibido. En la
Figura 2.34 las muestras del centro están enfatizadas al tener el número de muestra dentro
del recuadro. El proceso de votación de mayoría está hecho como sigue: Si es que dos o
tres muestras tienen niveles altos, el bit recibido se registra como un 1 lógico. Si es que dos
o tres muestras tienen niveles bajos, el bit recibido se registra como un 0 lógico. Este
proceso de votación por mayoría actúa como un filtro pasa-bajo para la señal entrante en el
pin RxD. El proceso de recuperación entonces se repite hasta que se reciba una trama
completa, incluyendo el primer bit de parada. Nótese que el Receptor usa únicamente el
primer bit de parada de una trama.

La Figura 2.35 denota el muestreo del bit de parada y el posible comienzo anticipado
del bit del inicio de la siguiente trama.

Figura. 2.35. Muestreo del Bit de Inicio y del Siguiente Bit de Inicio

Se hace la misma votación mayoritaria para el bit de parada, tal como se hace para
los otros bits en la trama. Si el bit de parada se registra teniendo un valor de 0 lógico, el
Indicador de Error de Trama (FE – Frame Error) se seteará.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 134 -

Una nueva transición de alto a bajo, indicando el bit de inicio de una nueva trama,
puede venir en seguida antes del último de los bits usados por la votación mayoritaria. Para
el modo de Velocidad Normal, la primera muestra con nivel bajo puede estar en el punto
marcado (A) en la Figura 2.35. Para el modo de Velocidad Doble el primer nivel bajo debe
retrazarse hasta (B). (C) marca un bit de parada de longitud completa. La detección
anticipada del bit de inicio influye en el rango operacional del Receptor.

El Rango Operacional Asincrónico. El rango operacional del Receptor depende de la


desigualdad entre la velocidad del bit recibido y la baud rate internamente generada. Si el
Transmisor está enviando tramas a velocidades de bit muy rápidas o muy lentas, o la baud
rate del Receptor generada internamente no tiene una frecuencia base similar (ver Tabla
2.46), el Receptor no podrá sincronizar las tramas para el bit de inicio.

Las Tablas 2.46 y 2.47 indican el máximo error de la baud rate que el receptor puede
tolerar. Nótese que para el modo de Velocidad Normal existe alta tolerancia de variación
de la baud rate.

Tabla. 2.46. Error Máximo Recomendado para la Baud Rate del Receptor para el Modo de Velocidad
Normal (U2X=0)

Tabla. 2.47. Error Máximo Recomendado para la Baud Rate del Receptor para el Modo de Velocidad
Doble (U2X=1)
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 135 -

2.14.7. Descripción de los Registros de USART

Los Registros para Datos de I/O de USART – UDR

El Registro del Buffer de Datos de la Transmisión USART y el Registro del Buffer


de Datos de la Recepción USART comparten la misma dirección de I/O llamada Registro
de Datos USART o UDR. El Registro del Buffer de Datos de la Transmisión (TXB) será el
destino para los datos escritos a la localidad del Registro UDR. Leer la localidad del
Registro UDR retornará los contenidos del Registro del Buffer de Datos de Recepción
(RXB).

Para caracteres de 5, 6 o 7 bits, los bits superiores no usados serán ignorados por el
Transmisor y puestos a cero por el Receptor.

El buffer de transmisión únicamente puede ser escrito cuando el Indicador UDRE en


el Registro UCSRA está puesto a uno (UDRE=1). Los datos escritos al UDR cuando el
Indicador UDRE no está puesto en uno, serán ignorados por el Transmisor USART.
Cuando se escriben datos al buffer de transmisión, y el Transmisor está habilitado, el
Transmisor cargará los datos dentro del Registro de Desplazamiento para Transmisión
(Transmit Shift Register) cuando el Registro de Desplazamiento esté vacío. Entonces los
datos serán transmitidos serialmente por el pin TxD.

El buffer de recepción consiste de un FIFO de dos niveles. El FIFO cambia su estado


cuando el buffer de recepción es accedido. Debido a éste comportamiento del buffer de
recepción, no use debe usar las instrucciones para Leer-Modificar-Escribir (SBI y CBI) en
ésta localidad. Tenga cuidado al usar las instrucciones de prueba de bit (SBIC y SBIS),
puesto que estas también cambiarán el estado del FIFO.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 136 -

El Registro A para el Control y Estado del USART – UCSRA

Bit 7 – RXC: Recepción Finalizada. Éste bit es “1” cuando hay datos sin leer en el buffer
de recepción y es “0” cuando el buffer de recepción está vacío. Si el Receptor está
deshabilitado, el buffer de recepción será vaciado y consecuentemente el bit RXC se
volverá cero. El Indicador RXC puede usarse para generar una interrupción por Recepción
Finalizada.

Bit 6 – TXC: Transmisión Finalizada. Este bit indicador es puesto a “1” cuando la trama
entera, en el Registro de Desplazamiento para Transmisión, se ha desplazado hacia fuera y
no hay nuevos datos actualmente presentes en el buffer de transmisión (UDR). El bit
Indicador TXC es automáticamente puesto a “0” cuando se ejecuta una interrupción por
transmisión finalizada. El Indicador TXC puede generar una interrupción por Transmisión
Finalizada.

Bit 5 – UDRE: Registro de Datos Vacante. El Indicador UDRE indica si el buffer de


transmisión (UDR) está listo para recibir nuevos datos. Si el UDRE es “1”, el buffer está
vacío, y por lo tanto, listo para ser escrito. El Indicador UDRE puede generar una
interrupción por Registro de Datos Vacante.

El UDRE es “1” luego de un reset para indicar que el transmisor está listo.

Bit 4 – FE: Error en la Trama. Este bit es “1” si el siguiente carácter en el buffer de
recepción tiene un Error en la Trama recibida. Por ejemplo, cuando el primer bit de parada
del siguiente carácter en el buffer de recepción es cero. Éste bit es válido hasta que el
buffer de recepción (UDR) se lee. EL bit FE es “0” cuando el bit de parada del dato
recibido es uno. Siempre ponga éste bit a cero al escribir en el UCSRA.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 137 -

Bit 3 – DOR: Desbordamiento de Datos. Este bit es puesto a “1” si se detecta


condiciones de Desbordamiento de Datos. Un Desbordamiento de Datos ocurre cuando el
buffer de recepción está lleno (dos caracteres), está un nuevo carácter esperando en el
Registro de Desplazamiento para Recepción y un nuevo bit de inicio es detectado. Éste bit
es válido hasta que el buffer de recepción (UDR) es leído. Siempre ponga este bit a cero al
escribir en el UCSRA.

Bit 2 – UPE: Error de Paridad. Éste bit es puesto a “1” si el siguiente carácter en el
buffer de recepción tiene un Error de Paridad cuando se lo recibió y la Verificación de
Paridad fue habilitada en aquel punto (UPM1=1). Éste bit es válido hasta que el buffer de
recepción (UDR) es leído. Siempre poner este bit a cero al escribir en el UCSRA.

Bit 1 – U2X: Doblar la Velocidad de Transmisión. Este bit únicamente tiene efecto en el
funcionamiento asincrónico. Escriba este bit a cero al usar funcionamiento sincrónico.

Escribiendo éste bit a uno reducirá el divisor de la baud rate, de 16 a 8, doblando


efectivamente la velocidad de transferencia para comunicación asincrónica.

Bit 0 – MPCM: Modo de Comunicación de Multi-procesador. Este bit habilita el modo


de Comunicación Multi-procesador. Cuando el bit MPCM está escrito a uno se ignoran
todas las tramas entrantes, recibidas por el Receptor USART, que no contienen
información de dirección. El Transmisor no es afectado por la configuración MPCM.

El Registro B para Control y Estado del USART – UCSRB

Bit 7 – RXCIE: Habilitar la Interrupción por RX Finalizada. Escribir éste bit a uno
habilita la interrupción por el Indicador RXC. Una interrupción por Recepción USART
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 138 -

Finalizada se generará únicamente si el bit RXCIE es escrito a uno (RXCIE=1), el


Indicador de la Interrupción Global en SREG está escrito a uno y el bit RXC en UCSRA se
pone a uno.

Bit 6 – TXCIE: Habilitar la Interrupción por TX Finalizada. Escribir este bit a uno
habilita la interrupción por el Indicador TXC. Una interrupción por Transmisión USART
Finalizada se generará únicamente si el bit TXCIE es escrito a uno, el Indicador de la
Interrupción Global en SREG está escrito a uno y el bit TXC en UCSRA se pone a uno.

Bit 5 – UDRIE: Habilitar la Interrupción por Registro de Datos Vacante. Escribir este
bit a uno habilita la interrupción por el Indicador UDRE. Una interrupción por Registro de
Datos Vacante se generará únicamente si el bit UDRIE es escrito a uno, el Indicador de la
Interrupción Global en SREG está escrito a uno y el bit UDRE en el UCSRA se pone a
uno.

Bit 4 – RXEN: Habilitador del Receptor. Escribir este bit a uno habilita el Receptor
USART. Cuando está habilitado, el Receptor anula el funcionamiento normal del puerto
para el pin RxD. Al Deshabilitar el Receptor se vaciará el buffer de recepción, invalidando
los Indicadores FE, DOR y UPE.

Bit 3 – TXEN: Habilitador del Transmisor. Escribir este bit a uno habilita el Transmisor
USART. Al habilitarlo, el Transmisor anulará el funcionamiento normal del puerto para el
pin TxD. La desactivación del Transmisor (escribiendo TXEN=0) no se hará efectiva hasta
que las transmisiones en proceso y pendientes se completen. Al deshabilitarlo, el
Transmisor ya no anulará el puerto TxD.

Bit 2 – UCSZ2: Tamaño de Carácter. Los bits UCSZ2 combinados con el bit UCSZ1:0
del UCSRC fijan el número de bits de datos (Tamaño de Carácter) que el Receptor y el
Transmisor usarán en una trama.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 139 -

Bit 1 – RXB8: Bit 8 de los Datos Recibidos. RXB8 es el noveno bit de datos del carácter
recibido al operar con tramas seriales de nueve bits de datos. Debe leerse antes de leer los
bits bajos del UDR.

Bit 0 – TXB8: Bit 8 de los Datos Transmitidos. TXB8 es el noveno bit de datos del
carácter a transmitirse al operar con tramas seriales de nueve bits de datos. Debe escribirse
antes de escribir los bits bajos al UDR.

El Registro C para el Control y Estado de USART – UCSRC

Bit 6 – UMSEL: Selección del Modo de USART. Éste bit selecciona entre los modos de
funcionamiento asincrónico y sincrónico. Ver Tabla 2.48.

Tabla. 2.48. Configuración del Bit UMSEL

Bit 5:4 UPM1:0: Modo de Paridad. Estos bits habilitan y fijan el tipo de generación y
verificación de paridad. Ver Tabla 2.49. Si está habilitado, el transmisor generará
automáticamente y enviará, dentro de cada trama, la paridad de los bits de datos
transmitidos. El Receptor generará un valor de paridad para el dato entrante y lo comparará
a la configuración del UPM0. Si se detectada una desigualdad, el Indicador UPE en el
UCSRA se pondrá a uno.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 140 -

Tabla. 2.49. Configuración de los Bits UPM

Bit 3 – USBS: Selección del Bit de Parada. Este bit selecciona el número de bits de
parada a ser insertados por el Transmisor. Ver Tabla 2.50. El Receptor ignora esta
configuración.

Tabla. 2.50. Configuración del Bit USBS

Bit 2:1 – UCSZ1:0: Tamaño del Carácter. Los bits UCSZ1:0 combinados con el bit
UCSZ2 del UCSRB fijarán el número de bits de datos (Tamaño del Carácter) que el
Receptor y el Transmisor usarán en una trama. Ver Tabla 2.51.

Tabla. 2.51. Configuración de los Bits UCSZ

Bit 0 – UCPOL: Polaridad del Reloj. Este bit se usa únicamente para el modo sincrónico.
Este bit debe ser escrito a cero cuando se usa el modo asincrónico. El bit UPCOL fija la
relación entre el cambio de la salida de datos, el muestreo de la entrada de datos y el reloj
sincrónico (XCK). Ver Tabla 2.52.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 141 -

Tabla. 2.52. Configuración del Bit UCPOL

Los Registros de la Baud Rate USART – UBRRL y UBRRH

Bit 15:12 – Bits Reservados. Estos bits son reservados para uso futuro. Por
compatibilidad con dispositivos futuros, estos bits deben escribirse a cero cuando el
UBRRH es escrito.

Bit 11:0 – UBRR11:0: Registro de la Baud Rate de USART. Este es un registro de 12


bis que contiene la baud rate de USART. El UBRRH contiene los cuatro bits más
significativos, y el UBRRL contienen los ocho bits menos significativos de la baud rate
USART. Las transmisiones en proceso se alterarán si la baud rate es cambiada. Escribir en
el UBRRL activará una actualización inmediata del preajustador de la baud rate.

2.14.8. Configuración de la Baud Rate


Para frecuencias estándar de cristal y resonador, las baud rate más comúnmente
usadas por el funcionamiento asincrónico pueden ser generadas usando la configuración
del UBRR en la Tabla 2.53. Las Tasas de Error superiores son aceptables, pero el Receptor
tendrá menos resistencia al ruido cuando los índices de error sean altos, especialmente para
tramas seriales grandes. Los valores de error se calculan usando la Ecuación 2.2.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 142 -

Ecuación. 2.2. Tasa de Error de Baud Rate

Tabla. 2.53. Ejemplos de configuración de UBRR para Frecuencias del Oscilador comúnmente usadas

2.15. EL CONVERTIDOR ANÁLOGO DIGITAL (ADC)

2.15.1. Características del ADC


• Resolución de 10 bits.
• No linealidad Integral de 0.5 LSB.
• Precisión Absoluta de 2 LSB.
• Tiempo de Conversión de 13us a 260us (reloj del ADC: 50KHz a 1MHz).
• Hasta 15kSPS en Máxima Resolución (reloj del ADC: 200 kHz).
• Ocho Canales de Entrada Multiplexados.
• Ajuste Opcional para Lectura del Resultado del ADC.
• Rango del Voltaje de Entrada de 0 – Vcc.
• Voltaje de Referencia del ADC de 1.1 V elegible.
• Funcionamiento Libre o Modo de Conversión Única.
• Inicio de la Conversión del ADC por Auto Activación mediante Fuentes de
Interrupción.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 143 -

• Interrupción por Conversión Finalizada del ADC.


• Anulador de Ruido en Modo de Sleep.

El microcontrolador ATmega169 ofrece un ADC de aproximación sucesiva de 10


bits. El ADC está conectado a un Multiplexor Analógico de 8 canales, que permite ocho
entradas de voltaje, construido con los pines del Puerto F. Las entradas de voltaje tienen
referencia de 0V (GND). El diagrama de bloques del ADC se muestra en la Figura 2.36.

El ADC contiene un circuito para Muestrear y Retener, este asegura que el voltaje de
entrada al ADC sea retenido en un nivel constante durante la conversión.

El ADC tiene un pin separado de alimentación analógica, AVCC. El AVCC no debe


tener una diferencia mayor de ±0.3V de Vcc.

Se proporcionan en el chip voltajes de referencia interna de nominalmente 1.1V o


AVCC. El voltaje de referencia puede ser desacoplado del pin AREF por un condensador
para mejorar el desempeño ante el ruido.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 144 -

Figura. 2.36. Bloque Esquemático del Convertidor de Analógico a Digital

2.15.2. Funcionamiento del ADC


El ADC convierte un voltaje analógico de entrada en un valor digital de 10 bits a
través de aproximaciones sucesivas. El valor mínimo representa a GND y el valor máximo
representa al voltaje en el pin AREF menos 1 LSB. Opcionalmente, AVCC o un voltaje de
referencia interna de 1.1V puede conectarse al pin AREF escribiendo en los bits REFSn en
el Registro ADMUX. La referencia de voltaje interna puede ser desacoplada por un
condensador externo en el pin AREF para mejorar la inmunidad al ruido.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 145 -

El ADC genera un resultado de 10 bits que se presenta en los Registros de Datos del
ADC (ADC Data Registers), ADCH y ADCL. Por defecto, el resultado se presenta
ajustado hacia la derecha, pero opcionalmente puede presentarse ajustado hacia la
izquierda configurando el bit ADLAR en el ADMUX.

Si el resultado está ajustado hacia la izquierda y no se requiere más que 8 bits, es


suficiente leer el ADCH. De otro modo, ADCL debe leerse primero, luego ADCH, para
asegurarse de que el contenido de los Registros de Datos correspondan a la misma
conversión. Una vez que el ADCL es leído, se bloquea el acceso del ADC a los Registros
de Datos. Esto significa que si se ha leído el ADCL, y una conversión se completa antes de
que se lea el ADCH, ni el registro es actualizado ni el resultado de la conversión se pierde.
Cuando el ADCH es leído, el acceso del ADC a los Registros ADCH y ADCL se habilita
nuevamente.

El ADC tiene su propia interrupción que puede activarse cuando una conversión se
ha completado. Cuando se prohíbe el acceso del ADC a los Registros de Datos en medio
de la lectura del ADCH y del ADCL, la interrupción se activará aún si el resultado se
pierde.

2.15.3. Iniciar una Conversión ADC


Una conversión simple es iniciada escribiendo un uno lógico en el bit Iniciar
Conversión del ADC (ADC Start Conversión – ADSC). Este bit permanece en alto
mientras la conversión está en marcha y es borrado por hardware cuando la conversión
finaliza. Si se selecciona un canal de datos diferente mientras una conversión está en
marcha, el ADC finalizará la conversión actual antes de realizar el cambio de canal.

Alternativamente, una conversión puede activarse automáticamente por varias


fuentes, ver Figura 2.37. La Auto Activación se habilita configurando al bit Habilitador de
Auto Activación del ADC, ADATE en el ADCSRA. La fuente de activación se selecciona
configurando los bits Selectores de Activación del ADC, ADTS en el ADCSRB. Cuando
un flanco positivo ocurre por la señal de activación seleccionada, el preajustador del ADC
es reseteado y se inicia una conversión. Esto provee un método para iniciar conversiones
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 146 -

en intervalos fijos. Si la señal de activación aún está puesta cuando la conversión concluye,
una nueva conversión no se iniciará. Si otro flanco positivo ocurre por la señal de
activación durante la conversión, el flanco será ignorado.

Nótese que un Indicador de Interrupción se seteará incluso si la interrupción


específica está deshabilitada o el bit Habilitador Global de Interrupción en el SREG está
borrado. Así una conversión puede ser activada sin causar una interrupción. Sin embargo,
el Indicador de la Interrupción debe borrarse para activar una nueva conversión con el
siguiente evento de interrupción.

Figura. 2.37. Lógica del Auto Activador del ADC

2.15.4. El Preajustador y la Temporización de la Conversión


Por defecto, la circuitería para la aproximación sucesiva requiere una frecuencia de
reloj de entrada entre 50 kHz y 200kHz para obtener la máxima resolución. Si se necesita
una resolución más baja que 10 bits, la frecuencia del reloj de entrada al ADC puede ser
superior que 200 kHz para obtener una tasa de muestreo superior.

El módulo ADC contiene un preajustador, el cual genera una frecuencia de reloj


aceptable para el ADC desde cualquier frecuencia de la CPU que esté por encima de 100
kHz. El preajuste es fijado por los bits ADPS en el ADCSRA. El preajustador empieza a
contar desde el momento en que el ADC es encendido, esto es, poniendo a uno al bit
ADEN en el ADCSRA. El preajustador seguirá funcionando con tal de que el bit ADEN
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 147 -

esté en alto, y se reiniciará continuamente cuando el ADEN esté en bajo. El diagrama de


bloques del Preajustador de Reloj del ADC se aprecia en la Figura 2.38.

Figura. 2.38. Preajustador del ADC

Al iniciar una Conversión Única, poniendo a uno el bit ADSC del ADCSRA, la
conversión empezará en el siguiente flanco ascendente de reloj del ADC.

Una conversión normal toma 13 ciclos de reloj del ADC. La primera conversión,
luego de que el ADC se enciende (ADEN en ADCSRA está en alto), toma 25 ciclos de
reloj del ADC para inicializar la circuitería analógica. Esto se aprecia en la Figura 2.39.

Figura. 2.39. Diagrama de Tiempo del ADC, Primera conversión (Modo de Conversión Simple)

El muestrear-y-retener toma lugar a 1.5 ciclos del reloj del ADC luego del inicio de
una conversión normal y 13.5 ciclos de reloj del ADC luego del inicio de una primera
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 148 -

conversión. Cuando una conversión finaliza, el resultado se escribe en el Registro de Datos


del ADC, y ADIF se pone en uno. En el modo de Conversión Simple, el contenido del
ADSC es borrado simultáneamente. Después el software puede nuevamente poner en uno
al ADSC, y una conversión nuevamente se iniciará en el primer flanco ascendente del reloj
del ADC. Esto se aprecia en la Figura 2.40.

Figura. 2.40. Diagrama de Tiempo del ADC, Conversión Simple

Cuando se usa Auto Activación (Auto Triggering), el preajustador se reinicia cuando


ocurre el evento de activación (trigger). Esto asegura un retrazo fijo del evento de
activación al inicio de la conversión. En éste modo, el muestrear-y-retener toma lugar a dos
ciclos de reloj del ADC, luego del flanco ascendente de la señal fuente de activación
(trigger). Se usan tres ciclos adicionales de reloj de la CPU para la lógica de
sincronización. Esto se aprecia en la Figura 2.41.

Figura. 2.41. Diagrama de Tiempo del ADC, Conversión Auto Activada


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 149 -

En el modo de Funcionamiento Libre, una conversión nueva se iniciará


inmediatamente luego de que se complete la conversión, mientras el ADSC permanezca en
alto. En la Figura 2.42 se aprecia el diagrama de tiempo para el modo Libre y en la Tabla
2.54 se muestra un resumen de tiempos de conversión para el mismo modo.

Figura. 2.42. Diagrama de Tiempo del ADC, Conversión en Funcionamiento Libre

Tabla. 2.54. Tiempo de Conversión del ADC

2.15.5. Canales de Entrada al ADC


Al cambiar la selección del canal, el usuario debe observar las siguientes directrices
para asegurarse de seleccionar el canal correcto:

En el modo de Conversión Simple, siempre es necesario seleccionar el canal antes de


iniciar la conversión. La selección del canal puede ser cambiada luego de un ciclo de reloj
del ADC, después de haber escrito un uno lógico en el ADSC. Sin embargo, el método más
simple es esperar hasta que la primera conversión se complete, y entonces cambiar la
selección del canal. Puesto que la siguiente conversión ya ha empezado automáticamente,
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 150 -

el siguiente resultado reflejará la previa selección de canal. Las conversiones subsecuentes


reflejarán la nueva selección de canal.

Referencia de Voltaje del ADC. La referencia de voltaje para el ADC (VREF) indica el
rango de conversión para el ADC. Canales single-ended (cuyo voltaje de entrada tienen
como referencia GND) que excedan VREF resultarán en códigos cercanos a 0x3FF. VREF
puede seleccionarse de entre los siguientes: AVCC, referencia interna de 1.1 V ó pin
AREF externo.

AVCC se conecta al ADC a través de un switch pasivo. La referencia interna de 1.1V


se genera desde la referencia bandgap (VBG) a través de un buffer interno. En cualquier
caso, el pin externo AREF está conectado directamente al ADC, y el voltaje de referencia
puede hacerse más inmune al ruido conectando un condensador entre el pin AREF y tierra.
VREF también puede medirse en el pin AREF con un voltímetro de alta impedancia. Nótese
que VREF es una fuente de alta impedancia, razón por la cual únicamente debe conectarse
una carga capacitiva en el sistema.

Si el usuario tiene una fuente de voltaje fija conectada al pin AREF, el usuario no
puede usar las otras opciones de voltaje de referencia en la aplicación, puesto que se
pondrán en cortocircuito al voltaje externo. Si se aplica voltaje externo al pin AREF, el
usuario puede cambiar entre AVCC y 1.1V como referencia seleccionada. El primer
resultado de la conversión del ADC luego de cambiar la fuente de voltaje de referencia
puede ser incorrecto, se aconseja al usuario el descartar éste resultado.

2.15.6. Anulador de Ruido en el ADC


El ADC ofrece un anulador de ruido que permite la conversión durante el modo de
Sleep para reducir el ruido proveniente del núcleo del CPU y de los periféricos de I/O. El
anulador de ruido puede usarse con el modo ADC Noise Reduction y con el modo Idle.
Para hacer uso de esta característica, se deberá seguir el siguiente procedimiento.

1. Asegurarse de que el ADC está habilitado y no está ocupado en una conversión.


Debe seleccionarse el modo de Conversión Única y debe habilitarse la Interrupción
por Conversión ADC Finalizada.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 151 -

2. Entrar en el modo ADC Noise Reduction (o en el modo Idle). El ADC iniciará una
conversión una vez que se haya detenido la CPU.

3. Si no ocurre otra conversión antes de que la conversión se complete. La Interrupción


ADC obligará a la CPU a abandonar el modo de Sleep y ejecutará la Interrupción
por Conversión ADC Finalizada. Si otra interrupción saca a la CPU del modo Sleep
antes de que la Conversión ADC se complete, se ejecutará dicha interrupción y se
generará una petición de interrupción por Conversión ADC Finalizada cuando la
Conversión ADC finalice. La CPU permanecerá en el modo activo hasta que se
ejecute una nueva orden de Sleep.

Circuitería de la Entrada Analógica. La circuitería para la entrada analógica para canales


single-ended se ilustra en la Figura 2.43. Una fuente analógica aplicada al ADCn está
expuesta a la capacitancia del pin y a la fuga de entrada de aquel pin, sin tener en cuenta
cual canal se selecciona como entrada para el ADC. Cuando el canal es seleccionado, la
fuente debe conducirse al condensador S/H a través de las resistencias serie (resistencias
combinadas en la ruta de la entrada).

El ADC está optimizado para señales analógicas con una impedancia de salida de
aproximadamente 10kΩ o menor. Si se usa una fuente con alta impedancia, el tiempo de
muestreo dependerá del tiempo que necesita la fuente para cargar al condensador S/H,
pudiendo variar ampliamente. Se recomienda al usuario usar únicamente fuentes de baja
impedancia con señales de variación lenta, puesto que esto minimiza la transferencia de
carga requerida para el condensador S/H.

Las componentes de señal superiores a la frecuencia de Nyquist (fADC/2) no deben


estar presentes para ningún tipo de canal, para evitar la distorsión de la convolución
impredecible de la señal. Se recomienda al usuario remover las componentes de frecuencia
alta con filtros pasa-bajas antes de aplicar las señales como entradas al ADC.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 152 -

Figura. 2.43. Circuitería de la Entrada Analógica

Técnicas Analógicas para Anular el Ruido. La circuitería dentro y fuera del dispositivo
genera EMI (Interferencia Electro Magnética) que puede afectar la precisión de las
mediciones analógicas. Si la precisión de la conversión es crítica, el nivel del ruido puede
reducirse aplicando las siguientes técnicas:

1. Mantener trayectorias de señales analógicas tan cortas como sea posible. Haciendo
pistas analógicas seguras que corran por encima del plano de tierra analógico, y
manténgalas bien alejadas de pistas digitales de conmutación de alta velocidad.

2. El pin AVCC en el dispositivo debe conectarse al voltaje de alimentación VCC


digital vía una red LC, tal como se aprecia en la Figura 2.44.

3. Usar el anulador de ruido del ADC para reducir el ruido inducido desde la CPU.

4. Si algunos de los pines del puerto ADC son usados como salidas digitales, es
esencial que estos no conmuten mientras una conversión esté en marcha.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 153 -

Figura. 2.44. Conexiones para Energizar al ADC

2.15.7. Resultado de la Conversión del ADC


Luego de que la conversión finalice (ADIF en uno), puede encontrarse el resultado
de la conversión en los Registros de Resultados del ADC (ADC Result Registers ADCL,
ADCH).

Para la conversión single-ended, el resultado se lo obtiene de la Ecuación 2.3:

Ecuación. 2.3. Resultado de la Conversión ADC

Para la Ecuación 2.3, VIN es el voltaje de entrada en el pin seleccionado y VREF la


referencia de voltaje seleccionada. 0x000 representa la tierra analógica, y 0x3FF representa
al voltaje de referencia seleccionado menos un LSB.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 154 -

2.15.8. Descripción de Registros del ADC

Registro para la Selección del Multiplexor del ADC – ADMUX

Bit 7:6 – REFS1:0: Bits para Seleccionar la Referencia. Estos bits seleccionan la
referencia de voltaje para el ADC, como se muestra en la Tabla 2.55. Si estos bits son
cambiados durante una conversión, el cambio no tendrá efecto hasta que esta conversión
finalice (ADIF en ADCSRA esté en uno). Las opciones de referencia interna de voltaje no
pueden usarse si un voltaje de referencia externa se está aplicado al pin AREF.

Tabla. 2.55. Selecciones del Voltaje de Referencia para el ADC

Bit 5 – ADLAR: Ajuste del Resultado hacia la Izquierda. El bit ADLAR afecta a la
presentación del resultado de la conversión del ADC en el Registro de Datos del ADC.
Escribir uno en el ADLAR ajustará el resultado hacia la izquierda. De otro modo, el
resultado se ajustará hacia la derecha. Cambiando el bit ADLAR afectará inmediatamente
al Registro de Datos del ADC, sin tener en cuenta cualquier conversión en curso.

Bits 4:0 – MUX4:0: Bits para Seleccionar el Canal Analógico. El valor de estos bits
selecciona la combinación de entradas analógicas que se conectan al ADC. Ver la Tabla
2.56 para más detalles. Si estos bits son cambiados durante una conversión, el cambio no
se hará efectivo hasta que esta conversión finalice (ADIF en ADCSRA en uno).
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 155 -

Tabla. 2.56. Selección de los Canales de Entrada

Registro A para el Control y Estado del ADC – ADCSRA

Bit 7 – ADEN: Habilitador del ADC. Al escribir este bit con uno lógico se habilitará el
ADC. Al escribirlo con cero lógico, el ADC se apaga.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 156 -

Bit 6 – ADSC: Iniciar Conversión del ADC. En el modo de Conversión Única, se debe
escribir este bit con uno lógico para empezar cada conversión. En el modo de
Funcionamiento Libre, se debe escribir este bit con uno lógico para empezar la primera
conversión. La primera conversión después de escribir en el ADSC, luego de habilitar el
ADC, o si el ADSC es escrito al mismo tiempo en el que se habilita al ADC, tomará 25
ciclos de reloj del ADC en lugar de los normales 13. Esta primera conversión lleva a cabo
la inicialización del ADC.

El ADSC será leído como un uno lógico cuando esté en marcha una conversión.
Cuando la conversión finaliza, éste retornará a cero. Escribir cero a este bit no tiene efecto.

Bit 5 – ADATE: Habilitador de Auto Activación del ADC. Cuando este bit es escrito
con un uno lógico, se habilita la Auto Activación (Auto Triggering) del ADC. El ADC
iniciará una conversión en el flanco positivo de la señal de activación (trigger signal)
seleccionada. La fuente de activación se selecciona configurando los bits Selectores del
Activador del ADC, ADTS (ADC Trigger Select) en el ADCSRB.

Bit 4 – ADIF: Indicador de la Interrupción del ADC. Este bit se pone en uno lógico
cuando se completa una conversión del ADC y los Registros de Datos se actualizan. La
Interrupción por Conversión ADC Finalizada se ejecuta si el bit ADIE y el bit-I en el
SREG están seteados. ADIF se borra por hardware ejecutando el vector de manejo de la
interrupción correspondiente. Se debe tener cuidado al hacer una Lectura-Modificación-
Escritura en el ADCSRA, porque puede deshabilitar una interrupción pendiente. Esto
también aplica si se usan las instrucciones SBI y CBI.

Bit 3 - ADIE: Habilitador de la Interrupción ADC. Cuando este bit es escrito a uno y el
bit-I en el SREG está seteado, se habilita la Interrupción por Conversión ADC Finalizada.

Bit 2:0 – ADPS2:0: Bits para Seleccionar el Preajustador del ADC. Estos bits
determinan el factor de división entre la frecuencia del XTAL y la entrada de reloj para el
ADC. Ver Tabla 2.57.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 157 -

Tabla. 2.57. Selección del Preajustador del LCD

El Registro para Datos del ADC – ADCL y ADCH


Con el bit ADLAR = 0:

Con el bit ADLAR = 1:

Cuando una conversión ADC se completa, el resultado se encuentra en estos dos


registros. Cuando se lee al ADCL, el Registro de Datos del ADC no se actualiza hasta que
se lea el ADCH. Consecuentemente, si el resultado está ajustado hacia la izquierda y no se
requiere más de 8 bits de precisión, es suficiente leer el ADCH. Caso contrario, el ADCL
debe leerse primero, luego el ADCH.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 158 -

El bit ADLAR del registro ADMUX y los bits MUXn del mismo registro afectan el
modo de lectura del resultado de los registros. Si ADLAR es puesto a uno, el resultado se
ajusta hacia la izquierda. Si ADLAR es puesto a cero (por defecto), el resultado se ajusta
hacia la derecha.

ADC9:0: Resultado de la Conversión del ADC. Estos bits representan el resultado


proveniente de la conversión.

El Registro B para el Control y Estado del ADC - ADCSRB

Bit 7 – Res: Bit Reservado. Este bit está reservado para uso futuro. Cuando se escribe en
el ADCSRB, este bit debe escribirse a cero para asegurar compatibilidad con futuros
dispositivos.

Bit 2:0 – ADTS2:0: Fuente para Auto Activación (disparo) del ADC. Si el ADATE del
ADCSRA es escrito a uno, el valor de estos bits selecciona la fuente que activará
(disparará) una conversión ADC, ver Tabla 2.58. Si se borra el ADATE, la configuración
de ADTS2:0 no tendrá efecto. Una conversión se activará por el flanco ascendente del
Indicador de Interrupción seleccionado.

Tabla. 2.58. Selecciones de la Fuente Auto Activadora del ADC


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 159 -

Registro 0 para Deshabilitar las Entradas Digitales – DIDR0

Bit 7…0 – ADC7D…ADC0D: Deshabilitador de las Entradas Digitales. Escribir este


bit con uno lógico deshabilitará el buffer de entrada digital sobre el correspondiente pin del
ADC. Cuando se aplica una señal analógica al pin ADC7…0 y la entrada digital de este
pin no es necesaria, este bit debe escribirse con uno lógico para reducir el consumo de
energía en el buffer digital de entrada.

2.16. EL CONTROLADOR DE LCD


El Controlador de LCD está creado para la pantalla de cristal líquido monocromática
pasiva con hasta cuatro terminales comunes y terminales de hasta 25 segmentos.

2.16.1. Características del Controlador de LCD

• Capacidad para una Pantalla de 25 Segmentos y Cuatro Terminales Comunes.


• Voltaje de Salida para LCD (contraste) Seleccionable por Software, desde 2.6V
hasta 3.35V en el Rango Completo de Operación.
• Suministro de Energía para el LCD, Integrado en el Chip, necesitando solamente
Un Condensador Externo.
• Visualización Posible en el Modo Power-save, para Bajo Consumo de Energía.
• Capacidad de Forma de Onda de Baja Potencia Seleccionable por Software.
• Frecuencia de la Trama de Selección Flexible.
• Selección de Reloj mediante Software, entre el Reloj del Sistema o una Fuente de
Reloj Externa Asincrónica.
• Capacidad Equivalente de Fuente y Sumidero para maximizar el Tiempo de Vida
del LCD.
• Puede Usarse la Interrupción del LCD para Actualizar los Datos de la Pantalla o
para Salir del Modo Sleep.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 160 -

2.16.2. Visión General


En la Figura 2.45 se muestra un diagrama simplificado de bloques del Controlador
del LCD.

Un LCD consiste de varios segmentos (pixeles o símbolos completos) que pueden


ser visibles o no visibles. Un segmento tiene dos electrodos con cristal líquido entre ellos.
Cuando se aplica un voltaje por encima de un voltaje umbral a través del cristal líquido, el
líquido se vuelve visible.

El voltaje debe alternar para evitar que una electroforesis afecte al cristal líquido, eso
degradaría la pantalla. La forma de la onda a través de un segmento no debe tener una
componente de DC.

Definiciones. Varios términos se usan al describir al LCD. Las definiciones constan en la


Tabla 2.59.

Tabla. 2.59. Definición de Términos usados en la descripción del Controlador LCD


LCD Un panel de despliegue pasivo con terminales llevadas directamente hacia un segmento
Segment Los elementos visibles mínimos que pueden estar encendidos o apagados
Common Denota cuantos estan conectados a una terminal de segmento
Duty 1/(Número de terminales comunes en la LCD actual)
Bias 1/(Número de niveles de voltaje usados al emplear una LCD - 1)
Frame Rate Número de veces por segundo que estan energizados los segmentos de la LCD
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 161 -

Figura. 2.45. Diagrama de Bloques del Módulo LCD.

Fuentes de Reloj para el LCD. El Controlador de LCD puede ser provisto de señal de
reloj por una fuente de reloj interna sincrónica o por una externa asincrónica. Por defecto,
la fuente de reloj clkLCD es igual al reloj del sistema, clkI/O. Cuando el bit LCDCS del
Registro LCDCRB es escrito con uno lógico, la fuente de reloj se toma desde el pin
TOSC1.

La fuente de reloj debe ser estable para obtener temporización precisa para el LCD y
así minimizar el offset de voltaje DC a través de los segmentos del LCD.

Preajustador del LCD. El preajustador consiste de un Contador de crestas de ondas de 12


bits y un divisor de reloj de 1 a 8. Los bits LCDPS2:0 seleccionan al clkLCD dividido para
16, 64, 128, 256, 1024, 2048 o 4096.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 162 -

Si se requiere una tasa de resolución fina, los bits LCDCD2:0 pueden usarse para
dividir el reloj adicionalmente para 1, 2, 3,…, 8.

La salida del divisor de reloj clkLCD_PS se usa como fuente para la temporización del
LCD.

La Memoria del LCD. La memoria de la pantalla está disponible a través de los Registros
de I/O agrupados para cada terminal común. Cuando un bit en la memoria de la pantalla se
escribe a uno, los segmentos correspondientes se energizan (encienden), y se desenergizan
cuando un bit en la memoria de la pantalla se escribe a cero.

Para energizar un segmento, debe aplicarse un voltaje absoluto por encima de un


cierto umbral. Esto se realiza permitiendo que el voltaje de salida en el correspondiente pin
COM y pin SEG tenga fase opuesta. Para pantallas con más de un común, debe aplicarse
uno (1/2 bias) o dos (1/3 bias) niveles de voltaje adicional.

Controlador de Contraste del LCD/Suministro de Energía. El valor pico (VLCD) en la


forma de onda de salida determina el Contraste del LCD. VLCD es controlado por software,
desde 2.6V hasta 3.35V, independientemente de VCC. Una señal interna inhibe la salida al
LCD hasta que VLCD alcance su valor objetivo.

LCDCAP. Un condensador externo (típicamente > 470 nF) debe conectarse al pin
LCDCAP como se muestra en la Figura 2.46. Este condensador actúa como un reservorio
de energía para el LCD (VLCD). Una capacitancia grande reduce el rizo en VLCD pero
incrementa el tiempo hasta el cual VLCD alcanza su valor designado.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 163 -

Figura. 2.46. Conexión del LCDCAP.

2.16.3. Modos de Funcionamiento

Duty y Bias Estáticos. Si todos los segmentos en un LCD tienen un electrodo


común, entonces cada segmento debe tener un único terminal.

Este tipo de pantalla se maneja con la forma de onda mostrada en la Figura 2.47.
SEG0 – COM0 es el voltaje a través de un segmento que está encendido, y SEG1 – COM0
es el voltaje a través de un segmento que está apagado.

Figura. 2.47. Manejando una LCD con Una Terminal Común.

½ Duty y ½ Bias. Para LCD con dos terminales comunes (1/2 duty) debe usarse una forma
de onda más compleja para controlar individualmente los segmentos. Aunque puede
seleccionarse 1/3 bias, para este tipo de pantallas es más común ½ bias. La forma de onda
se muestra en la Figura 2.48. SEG0 – COM0 es el voltaje a través de un segmento que está
encendido, y SEG0 – COM1 es el voltaje a través de un segmento que está apagado.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 164 -

Figura. 2.48. Manejando un LCD con Dos Terminales Comunes.

1/3 Duty y 1/3 Bias. Para LCD con tres terminales comunes (1/3 duty) usualmente se
recomienda 1/3 bias. La forma de onda se muestra en la Figura 2.49. SEG0 – COM0 es el
voltaje a través de un segmento que está encendido, y SEG0 – COM1 es el voltaje a través
de un segmento que está apagado.

Figura. 2.49. Manejando una LCD con Tres Terminales Comunes.

1/4 Duty y 1/3 Bias. Para LCD con cuatro terminales comunes (1/4 duty) es óptimo 1/3
bias. La forma de onda se muestra en la Figura 2.50. SEG0 – COM0 es el voltaje a través
de un segmento que está encendido, y SEG0 – COM1 es el voltaje a través de un segmento
que está apagado.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 165 -

Figura. 2.50. Manejando una LCD con Cuatro Terminales Comunes.

Forma de Onda de Baja Potencia. Para reducir la actividad alternada y el consumo de


potencia, puede seleccionarse una forma de onda de baja potencia, escribiendo el LCDAB
a uno. La forma de onda de baja potencia requiere dos tramas subsiguientes con los
mismos datos de la pantalla para obtener Voltaje DC cero. En consecuencia el latcheo de
datos y el Indicador de Interrupción únicamente se setean en cada segunda trama. Las
formas de onda predeterminada y de baja potencia para 1/3 duty y 1/3 bias se muestran en
la Figura 2.51. Para otras selecciones de duty y bias, el efecto es similar.

Figura. 2.51. Formas de Onda Predeterminada y de Baja Potencia.


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 166 -

Funcionamiento en el Modo Sleep. Cuando se selecciona el reloj sincrónico del LCD


(LCDCS = 0) la pantalla LCD funcionará en el modo Inactivo y en el modo Power-save
con cualquier fuente de reloj.

Un reloj asincrónico desde TOSC1 puede ser seleccionado como reloj para el LCD,
escribiendo a uno el bit LCDCS, cuando el Oscilador Interno RC Calibrado se selecciona
como fuente de reloj del sistema. El LCD funcionará entonces en el modo Inactivo, modo
de Reducción de Ruido y modo Power-save.

Cuando el EXCLK en el Registro ASSR se escribe a uno, y se selecciona el reloj


asincrónico, el buffer de entrada de reloj externo es habilitado y un reloj externo puede
entrar por el pin Oscilador del Timer 1 (TOSC1) en lugar de un cristal de 32 kHz.

Antes de entrar al modo Power-down, al modo Standby o al modo de Reducción de


Ruido del ADC con el reloj sincrónico para LCD seleccionado, el usuario tiene que
deshabilitar el LCD.

Blanqueo de la Pantalla. Cuando el LCDBL es escrito a uno, el LCD es blanqueado luego


de finalizar la trama actual. Todos los segmentos y pines comunes son conectados a GND,
descargando el LCD. La memoria de la pantalla se conserva. El blanqueo de la Pantalla
debe usarse antes de deshabilitar el LCD para evitar voltaje a través de los segmentos y un
desvanecimiento lento de la imagen.

Máscara del Puerto. Para LCD con terminales con menos de de 25 segmentos, es posible
enmascarar algunos de los pines no usados para usarlos mejor como pines ordinarios del
puerto. Los pines comunes no usados son automáticamente configurados como pines del
puerto.

2.16.4. Uso del LCD

Inicialización del LCD. Previo a la activación del LCD debe realizarse alguna
inicialización. El proceso de inicialización consiste normalmente en configurar la
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 167 -

velocidad de transferencia de la trama, duty, bias y máscara del puerto. El contraste del
LCD se fija inicialmente, pero también puede ajustarse durante el funcionamiento.

La Figura 2.52 ilustra un ejemplo del uso del LCD:

Pantalla: TN Positivo, Reflectivo


Número de terminales comunes: 3
Número de terminales segmentos: 21
Sistema Bias: 1/3 Bias
Sistema de Manejo: 1/3 Duty
Voltaje de Funcionamiento: 3.0 ± 0.3 V
Figura. 2.52. Ejemplo de uso del LCD

Actualización del LCD. La memoria de la pantalla (LCDDR0, LCDDR1,…), el Blanqueo


del LCD (LCDBL), la forma de onda de baja potencia (LCDAB) y el control del contraste
(LCDCCR) son retenidos previo a cada nueva trama. No hay restricciones de escritura en
estas localidades del Registro del LCD, pero una actualización de datos del LCD puede
dividirse entre dos tramas si los datos son retenidos mientras una actualización está en
marcha. Para evitarlo, puede usarse una rutina de interrupción para actualizar la memoria
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 168 -

de la Pantalla, Blanqueo del LCD, forma de onda de baja potencia, y control de contraste,
solamente luego de que los datos sean retenidos.

Desactivación del LCD. En algunas aplicaciones puede ser necesario desactivar el LCD.
Este es el caso si la MCU entra en el modo Power-down, donde ninguna fuente de reloj
está presente.

El LCD debe estar completamente descargado antes de ser desactivado. Ningún


voltaje de DC debe irse por ningún segmento. La mejor manera de lograrlo es usar la
característica de Blanqueo del LCD, que conduce todos los pines del segmento y pines
comunes a GND.

Cuando el LCD es desactivado, la función de puerto se activa nuevamente. Por lo


tanto, el usuario debe revisar cuales pines del puerto conectados a una terminal del LCD
están ó en alta impedancia ó en salida en bajo (sumidero).

2.16.5. Descripción de Registros del Controlador de LCD

Registro A para el Control y Estado del LCD – LCDCRA

Bit 7 – LCDEN: Habilitador del LCD. Escribir este bit a uno habilitará el
Controlador/Driver del LCD. Escribiéndolo a cero, se apaga el LCD inmediatamente. Al
apagar el Controlador/Driver del LCD mientras maneja una pantalla, habilita la función
normal del puerto y puede aplicarse voltaje DC a la pantalla si los puertos están
configurados como salidas. Se recomienda llevar la salida del controlador a tierra para
descargar la pantalla si el Controlador/Driver del LCD es desactivado.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 169 -

Bit 6 – LCDAB: Forma de Onda de Baja Potencia del LCD. Cuando LCDAB se escribe
con un cero lógico, la salida en los pines para LCD es la forma de onda predefinida.
Cuando LCDAB se escribe con uno lógico, la salida en los pines para LCD es la Forma de
Onda de Baja Potencia. Si éste bit es modificado durante el funcionamiento de la pantalla,
el cambio tomará lugar al inicio de una nueva trama.

Bit 5 – Res: Bit Reservado. Este bit está reservado en el ATmega169 y siempre se leerá
como cero.

Bit 4 – LCDIF: Indicador de Interrupción del LCD. Este bit es seteado por hardware al
inicio de una nueva trama, al mismo tiempo en que la pantalla se actualiza. La Interrupción
por Inicio de Trama del LCD se ejecuta si el bit LCDIE y el bit-I en el SREG están
seteados (escritos con uno lógico). LCDIF se borra por hardware al ejecutar el
correspondiente Vector de Manejo de Interrupción. Alternativamente, escribir un uno
lógico en su posición de bit borrará el LCDIF. Se debe tener cuidado al hacer una Lectura-
Modificación-Escritura en LCDCRA porque puede desactivar una interrupción pendiente.
Si selecciona la Forma de Onda de Baja Potencia, el Indicador de Interrupción se setea
cada segunda trama.

Bit 3 – LCDIE: Habilitador de la Interrupción del LCD. Cuando este bit se escribe a
uno y el bit-I en SREG está escrito con uno lógico, se habilita la Interrupción por Inicio de
Trama del LCD.

Bit 2:1 – Res: Bits Reservado. Estos bits están reservados en el ATmega169 y siempre se
leerán como cero.

Bit 0 – LCDBL: Blanqueo del LCD. Cuando este bit se escribe a uno, la pantalla se
blanquea luego de la finalización de una trama. Todos los segmentos y pines comunes se
llevan a tierra.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 170 -

Registro B para el Control y Estado del LCD – LCDCRB

Bit 7 – LCDCS: Selección de Reloj para el LCD. Cuando este bit se escribe a cero, se
usa el reloj del sistema. Cuando este bit se escribe a uno, se usa la fuente externa de reloj
asincrónico. La fuente de reloj asincrónico es el Oscilador del Timer/Counter ó el reloj
externo, dependiendo de EXCLK en el ASSR.

Bit 6 – LCD2B: Selección de ½ Bias para el LCD. Cuando este bit se escribe a cero, se
usa 1/3 bias. Cuando se escribe este bit a uno, se usa ½ bias. Consúltese al Fabricante del
LCD para la selección recomendada de Bias.

Bit 5:4 – LCDMUX1:0: Selección del Mux LCD. Los bits LCDMUX1:0 determinan el
duty. Los pines comunes no usados son pines ordinarios del puerto. Las diferentes
selecciones de duty se muestran en la Tabla 2.60.

Tabla. 2.60. Selección del Duty para el LCD

Bit 3 – Res: Bit Reservado. Este bit está reservado en el ATmega169 y siempre se leerá
como cero.

Bit 2:0 – LCDPM2:0: Máscara del Puerto LCD. Los bits LCDPM2:0 determinan el
número de pines del puerto que se usarán como controladores de segmento. Las diferentes
selecciones se muestran en la Tabla 2.61. Los pines sin uso pueden emplearse como pines
ordinarios del puerto.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 171 -

Tabla. 2.61. Máscara del Puerto LCD

Registro de la Velocidad de Transferencia de Trama del LCD – LCDFRR

Bit 7 – Res: Bit Reservado.

Bit 6:4 – LCDPS2:0: Selectores del Preajustador para el LCD. Los bits LCDPS2:0
seleccionan el punto de toma desde un preajustador. La salida del preajustador puede ser
dividida nuevamente configurando los bits de división del reloj (LCDCD2:0). Las
diferentes selecciones se muestran en la Tabla 2.62. Juntos determinan el reloj preajustado
para el LCD (clkLCD_PS), que provee de reloj al módulo del LCD.

Tabla. 2.62. Selección del Preajustador para el LCD


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 172 -

Bit 3 – Res: Bit Reservado.

Bit 2:0 – LCDCD2:0: Divisores 2, 1 y 0 del Reloj del LCD. Los bits LCDCD2:0
determinan la relación de división en el divisor de reloj. En la Tabla 2.63 se muestran
varias selecciones. Este Divisor de Reloj da flexibilidad extra en la selección de velocidad
de transferencia de la trama.

Tabla. 2.63. Preajuste del Reloj del LCD

La frecuencia de la trama puede calcularse mediante la Ecuación 2.4.

Ecuación. 2.4. Frecuencia de la Trama LCD

Para la Ecuación 2.4:

N = Divisor del preajustador (16, 64, 128, 256, 512, 1024, 2048 o 4096).
K = 8 para duty = ¼, ½ y estático.
K = 6 para duty = 1/3.
D = Factor de división (ver Tabla 2.63).
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 173 -

Nótese que al usar 1/3 duty la velocidad de transferencia de trama se incrementa con
el 33% cuando el Registro de Velocidad de Transferencia de Trama es constante. Un
ejemplo del cálculo de la velocidad de transferencia de trama se muestra en la Tabla 2.64.

Tabla. 2.64. Ejemplo de cálculo de la velocidad de transferencia de la trama

Registro para Control del Contraste del LCD - LCDCCR

Bit 7:5 – LCDDC2:0: Configuración de la Pantalla LDC. Los bits LCDDC2:0


determinan la cantidad de tiempo que los controladores del LCD están encendidos para
cada transición de voltaje en el segmento y en los pines comunes. Ver Tabla 2.65. Un
tiempo corto llevará a bajo consumo de potencia, pero pantallas con alta resistencia interna
pueden necesitar mucho tiempo para alcanzar contraste satisfactorio. Nótese que el tiempo
de control nunca deberá ser más extenso que un medio del período de reloj preajustado de
LCD, incluso si el tiempo seleccionado es más largo. Al emplear bias estático o blanqueo,
el tiempo será siempre un medio del período del reloj preajustado del LCD.

Tabla. 2.65. Configuración de la Pantalla LCD


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 174 -

Bit 4 – Res: Bit Reservado.

Bit 3:0 – LCDCC3:0: Control del Contraste del LCD. Los bits LCDCC3:0 determinan
el voltaje máximo VLCD en el segmento y pines comunes. Las diferentes selecciones se
muestran en la Tabla 2.66. Los valores nuevos toman efecto al inicio de cada nueva trama.

Tabla. 2.66. Control del Contraste del LCD

2.16.6. Distribución de Memoria del Controlador LCD


Escribir un uno lógico en un bit de la memoria LCD energizará (visualizará) el
segmento correspondiente. Los bits de Memoria LCD no usados para la visualización
actual pueden usarse libremente para almacenamiento. Ver Tabla 2.67.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 175 -

Tabla. 2.67. Distribución de Memoria LCD

2.17. PROGRAMACIÓN DE LA MEMORIA

2.17.1. Lock Bits para la Memoria de Programa y Datos


El ATmega169 provee seis Lock bits (ver Tabla 2.68) que pueden dejarse sin
programar (“1”) ó pueden programarse (“0”) para obtener las características adicionales
listadas en la Tabla 2.69. Los Lock bits pueden únicamente borrarse poniéndose a “1” con
el comando Chip Erase.

Tabla. 2.68. Byte de Lock bits (1)

“1” significa sin programar, “0” significa programado


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 176 -

Tabla. 2.69. Modos de Protección con Lock Bits

Nota:
1. Programe los Fuse bits y Boot Lock bits antes de programar LB1 y LB2.
2. “1” significa sin programar, “0” significa programado

2.17.2. Fuse Bits


El ATmega169 tiene tres Fuse bytes, las Tablas 2.70 – 2.72 describen brevemente la
funcionalidad de todos los fuses y como éstos están distribuidos dentro de los Fuse bytes.
Nótese que los fuses son leídos como cero lógico, “0”, si están programados.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 177 -

Tabla. 2.70. Fuse byte Extendido

Notas:
1. Vea la Tabla para decodificar el BODLEVEL Fuse
2. Este bit nunca debe ser programado.

Tabla. 2.71. Byte Alto del Fuse

Nota:
1. El Fuse SPIEN no es accesible en el modo de programación serial.
2. El valor predefinido de BOOTSZ1…0 produce el máximo Boot Size.
3. Ver “Watchdog Timer Control Register - WDTCR” para detalles.
4. Nunca entregue un producto con el Fuse OCDEN programado sin tener en
cuenta la configuración de Lock bits y del Fuse JTAGEN. Un Fuse OCDEN
programado permite a algunas partes del reloj del sistema estar en
funcionamiento en todos los modos de sleep. Esto puede incrementar el
consumo de energía.
5. Si la interfaz JTAG queda desconectada, el fuse JTAGEN debe en lo posible
quedar desactivado para evitar corriente estática en el pin TDO en la interfaz
JTAG.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 178 -

Tabla. 2.72. Byte Bajo del Fuse

Nota:
1. El valor predeterminado de SUT1…0 produce el tiempo de inicio máximo para la
fuente de reloj predeterminada
2. La configuración predefinida de CKSEL3…0 resulta en el Oscilador interno RC a
8MHz.
3. El Fuse CKOUT permite que el reloj del sistema sea la salida en el PORTE7.
4. Ver “System Clock Prescaler”.

El estado de los Fuse bits no es afectado por el comando Chip Earse. Nótese que los
Fuse bits se bloquean si se programa al Lock bit1 (LB1). Los Fuse bits deben ser
programados antes de programar los Lock bits.

Retención de los Fuses. Los valores de los Fuses son retenidos cuando el dispositivo entra
en modo de programación y los cambios de los valores de los Fuses no tendrán efecto sino
hasta que se haya abandonado el modo de Programación. Esto no aplica al Fuse EESAVE,
el cual tomará efecto una vez que este esté programado. Los fuses también son retenidos en
el Power-up en el modo Normal.

2.17.3. Bytes de Signatura (Signature Bytes)


Todos los microcontroladores de Atmel tienen un código de signatura (firma) de tres
bytes que identifica al dispositivo. Este código puede leerse en los modos serial y paralelo,
también cuando el dispositivo está bloqueado. Estos tres bytes residen en espacios de
memoria separada.

Para el ATmega169, los bytes de signatura son los siguientes:

1. 0x000: 0x1E (indica que es fabricado por Atmel).


2. 0x001: 0x94 (indica memoria Flash de 16KB).
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 179 -

3. 0x002: 0x05 (indica dispositivo Atmega169 cuando 0x001 es 0x94).

2.17.4. Byte para Calibración del Oscilador Interno


El ATmega169 tiene un valor de byte para calibración para el Oscilador interno RC.
Este byte reside en el byte alto de la dirección 0x000 del espacio de dirección para
signatura. Durante el reset, este byte es automáticamente escrito dentro del Registro
OSCCAL para asegurar la frecuencia correcta del Oscilador calibrado RC.

2.17.5. Distribución de Pines para Programación Serial


En la Tabla 2.73 se lista la distribución de pines para programación SPI.

Tabla. 2.73. Distribución de Pines para la Programación Serial

2.17.6. Descarga Serial (Serial Downloading)


Las matrices de memoria Flash y EEPROM pueden ser programadas usando un bus
serial SPI mientras se mantiene el RESET conectado a GND. La interfaz serial consiste de
los pines: SCK, MOSI (input) y MISO (output). Ver la Figura 2.53. Luego de poner el
RESET a nivel bajo, es necesario ejecutar primero la instrucción Habilitar Programación
(Programming Enable) antes de que puedan ejecutarse las operaciones programar/borrar.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 180 -

Notas:
1. El dispositivo es dotado de reloj por el Oscilador Interno, no es
necesario conectar una fuente de reloj al pin XTAL1.
2. VCC – 0.3V < AVCC < VCC + 0.3V, sin embargo, AVCC debe siempre
estar dentro de 1.8 – 5.5V.

Figura. 2.53. Programación y Verificación Serial (1).

Al programar la EEPROM, se establece un ciclo de auto-borrado dentro de la


operación de programación auto-temporizada (en el modo Serial ÚNICAMENTE) y no se
necesita ejecutar primero la instrucción Chip Erase. La operación Chip Erase vuelve a
0xFF el contenido de cada localidad de memoria en las matrices de Programa y de
EEPROM.

Los períodos mínimos de bajo y de alto para la entrada de reloj serial (SCK) se
definen a continuación:

• Bajo: >2 ciclos de reloj de la CPU para fck < 12 MHz, 3 ciclos de reloj de la CPU
para fck >= 12 MHz.

• Alto: >2 ciclos de reloj de la CPU para fck < 12 MHz, 3 ciclos de reloj de la CPU
para fck >= 12 MHz.

Algoritmo para la Programación Serial. Al escribir datos serialmente al ATmega169,


los datos son puestos por reloj en el flanco ascendente de SCK. Al leer datos serialmente al
ATmega169, los datos son puestos por reloj en el flanco descendente de SCK. Ver la
Figura 2.54.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 181 -

Figura. 2.54. Formas de onda de la Programación Serial.

Para programar y verificar el ATmega169 en el modo de programación serial, se


recomienda la siguiente secuencia:

1. Secuencia Power-up. Aplique energía entre VCC y GND mientras el RESET y el


SCK están puestos a “0”. En algunos sistemas, el programador no pude garantizar
que SCK se mantenga en bajo durante el Power-up. En éste caso, debe darse al
RESET un pulso positivo de duración de por lo menos dos ciclos de reloj de la
CPU luego de que SCK se haya puesto a “0”.

2. Esperar por lo menos 20 ms y entonces activar la programación serial enviando la


instrucción serial Habilitar Programación (Programming Enable) al pin MOSI.

3. La Instrucción serial no trabajará si la comunicación está fuera de sincronización.


Al estar en sincronización, el segundo byte (0x53) hará eco al emitir el tercer byte
de la instrucción Programming Enable. Si el eco es o no correcto, todos los cuatro
bytes de la instrucción deben transmitirse. Si el byte 0x53 no hace eco, es necesario
dar un pulso positivo al RESET y emita un nuevo comando Programming Enable.

4. La Flash se programa una página a la vez. La página de memoria se carga un byte a


la vez, proporcionando los 6 LSB de la dirección y datos junto con la instrucción
Load Program Memory Page (Cargar Página de Memoria de Programa). Para
asegurar la carga correcta de la página, el byte bajo de datos debe cargarse antes de
que el byte alto de datos sea solicitado para una dirección dada. La página de
Memoria de Programa se almacena cargando la instrucción Write Program Memory
Page (Escribir Página de Memoria de Programa) con los 7 MSB de la dirección. Si
no se usa el sondeo (RDY/ BSY ), el usuario debe esperar por lo menos tWD_FLASH
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 182 -

antes de emitir la página siguiente. Ver Tabla 2.74. Acceder a la interfaz serial de
programación, antes de que la finalice operación de escritura en la Flash, puede
tener como resultado programación incorrecta.

5. A: La matriz de la EEPROM se programa un byte a la vez proporcionando la


dirección y el dato juntos con la instrucción Write (de escritura) apropiada. Una
localidad de memoria de EEPROM se borra primero, automáticamente antes de que
se escriba un dato nuevo. Si no se usa el sondeo (RDY/ BSY ), el usuario debe
esperar por lo menos tWD_EEPROM antes de emitir el siguiente byte.

B: La matriz de la EEPROM se programa una página a la vez. La página de


Memoria se carga un byte a la vez al proporcionar los 2 LSB de la dirección y datos
junto con la instrucción Load EEPROM Memory Page (Cargar Página de Memoria
EEPROM). La Página de Memoria EEPROM se almacena cargando la Instrucción
Escribir Página de Memoria EEPROM (Write EEPROM Memory Page) junto con
los 4 MSB de la dirección. Al usar acceso de página EEPROM únicamente se altera
las localidades de byte cargadas con la instrucción Load EEPROM Memory Page
(Cargar Página de Memoria EEPROM). Las localidades restantes permanecen sin
cambios. Si no se usa el sondeo (RDY/ BSY ), el usuario debe esperar por lo menos
tWD_EEPROM antes de emitir la siguiente página.

6. Cualquier localidad de memoria puede verificarse usando la instrucción Read


(Lectura) que devuelve el contenido de la dirección seleccionada a la salida serial
MISO.

7. Al final de la sesión de programación, el RESET puede ser puesto en alto para


empezar la operación normal.

8. Secuencia de Apagado:
- Poner RESET a “1”.
- Apagar VCC.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 183 -

Tabla. 2.74. Retrazo Mínimo de Espera previo a la Escritura en la siguiente Localidad Flash o
EEPROM

2.18. RESUMEN DE INSTRUCCIONES

Tabla. 2.75. Resumen de Instrucciones


CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 184 -

Tabla. 2.75. Resumen de Instrucciones (continuación)


CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 185 -

CAPITULO 3

KIT DE DESARROLLO AVR BUTTERFLY

3.1. DESCRIPCIÓN
El Kit AVR Butterfly se diseñó para demostrar los beneficios y las características
importantes de los microcontroladores ATMEL.

El AVR Butterfly utiliza el microcontrolador AVR ATmega169V, que combina la


Tecnología Flash con el más avanzado y versátil microcontrolador de 8 bits disponible. En
la Figura 3.1 se puede apreciar el Kit AVR Butterfly.

Figura. 3.1. AVR Butterfly

El Kit AVR Butterfly expone las siguientes características principales:

• La arquitectura AVR en general y la ATmega169 en particular.


• Diseño de bajo consumo de energía.
• El encapsulado tipo MLF.
• Periféricos:
- Controlador LCD.
- Memorias:
CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 186 -

Flash, EEPROM, SRAM.


DataFlash externa.
• Interfaces de comunicación:
- UART, SPI, USI.
• Métodos de programación
- Self-Programming/Bootloader, SPI, Paralelo, JTAG.
• Convertidor Analógico Digital (ADC).
• Timers/Counters:
- Contador de Tiempo Real (RTC).
- Modulación de Ancho de Pulso (PWM).

El AVR Butterfly está proyectado para el desarrollo de aplicaciones con el


ATmega169 y además puede usarse como un módulo dentro de otros productos.

3.2. HARDWARE DISPONIBLE


Los siguientes recursos están disponibles en el Kit AVR Butterfly:

• Microcontrolador ATmega169V (en encapsulado tipo MLF).


• Pantalla tipo vidrio LCD de 120 segmentos, para demostrar las capacidades del
controlador de LCD incluido dentro del ATmega169.
• Joystick de cinco direcciones, incluida la presión en el centro.
• Altavoz piezoeléctrico, para reproducir sonidos.
• Cristal de 32 KHz para el RTC.
• Memoria DataFlash de 4 Mbit, para el almacenar datos.
• Convertidor de nivel RS-232 e interfaz USART, para comunicarse con unidades
fuera del Kit sin la necesidad de hardware adicional.
• Termistor de Coeficiente de Temperatura Negativo (NTC), para sensar y medir
temperatura.
• Resistencia Dependiente de Luz (LDR), para sensar y medir intensidad luminosa.
• Acceso externo al canal 1 del ADC del ATmega169, para lectura de voltaje en el
rango de 0 a 5 V.
• Emulación JTAG, para depuración.
CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 187 -

• Interfaz USI, para una interfaz adicional de comunicación.


• Terminales externas para conectores tipo Header, para el acceso a periféricos.
• Batería de 3 V tipo botón (600mAh), para proveer de energía y permitir el
funcionamiento del AVR Butterfly.
• Bootloader, para programación mediante la PC sin hardware especial.
• Aplicación demostrativa preprogramada.
• Compatibilidad con el Entorno de Desarrollo AVR Studio 4.

En las Figuras 3.2 y 3.3 se observa el Hardware disponible en el AVR Butterfly.

Figura. 3.2. Hardware Disponible (Parte Frontal)

Figura. 3.3. Hardware Disponible (Parte Posterior)


CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 188 -

Este Kit puede reprogramarse de varias formas diferentes, incluyendo programación


serial a través del puerto JTAG; pero, se preferirá el uso del Bootloader precargado junto
con el AVR Studio, para descargar nuevo código sin la necesidad de hardware especial.

3.3. FIRMWARE INCLUIDO


El AVR Butterfly viene con una aplicación preprogramada. Esta sección presentará
una revisión de los elementos de esta aplicación.

Los siguientes bloques vienen preprogramados en el AVR Butterfly:

• Código Cargador de Arranque (Bootloader Code).


• Código de la Aplicación.
- Máquina de Estados.
- Funciones incluidas:
ƒ Nombre-etiqueta.
ƒ Reloj (fecha).
ƒ Mediciones de temperatura.
ƒ Mediciones de luz.
ƒ Lecturas de voltaje.
ƒ Reproducción de tonadas/melodías.
ƒ Ahorro de energía automático.
ƒ Ajuste de contraste del LCD.
- Más funciones podrán ser agregadas después, como por ejemplo:
ƒ Calculadora.
ƒ Función de recordatorio.
ƒ Alarma (alarmas diarias, temporizadores para la cocina, etc.).
ƒ Reproducción de melodías y visualización del texto (función de
Karaoke).
ƒ Con la DataFlash de 4 Mb el usuario podrá almacenar una cantidad
grande de datos.
CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 189 -

Nota: La aplicación puede ser actualizada sin ningún hardware externo, debido al
convertidor de nivel RS-232 integrado en el AVR Butterfly y a la característica de Auto-
Programación (Self-programming).

3.3.1. Joystick
Para operar el AVR Butterfly se emplea el joystick como una entrada para el usuario.
Este opera en cinco direcciones, incluyendo presión en el centro; tal como se puede ver en
la Figura 3.4.

Figura. 3.4. Entrada tipo Joystick

Utilizando el joystick el usuario puede moverse a través el menú mostrado en la


Figura 3.5 y editar valores, ingresar nombres, etc.

3.3.2. Menú
El sistema de menú está creado para poder desplazarse, de manera eficiente, entre los
diferentes módulos de la aplicación.
CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 190 -

La Figura 3.5 muestra el menú de la aplicación que viene con el AVR Butterfly. La
columna a la izquierda muestra el menú principal: “AVR Butterfly”, “Tiempo”, “Música”,
etc.

Para moverse entre las alternativas del menú, se debe presionar el joystick hacia
ARRIBA o hacia ABAJO. Para entrar en un submenú, se debe presionar el joystick hacia
la DERECHA. Para salir de un submenú, se debe presionar el joystick hacia la
IZQUIERDA. Para ingresar/ajustar un valor, se debe presionar ENTRAR. Por ejemplo,
cuando aparece “Ajustar reloj” en el LCD, se debe presionar ENTRAR para ingresar a la
función ajustar.
CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 191 -

Figura. 3.5. Menú del Firmware Incluido en el AVR Butterfly (en español)
CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 192 -

3.3.3. Actualización

El Bootloader
El AVR Butterfly viene con un Bootloader que usa la característica self-
programming del microcontrolador ATmega169. El Bootloader combinado con el circuito
convertidor de nivel RS-232, integrado en el AVR Butterfly, hace posible actualizar la
aplicación sin ningún hardware externo adicional. El AVR Prog, que es una herramienta
incluida en el AVR Studio 4, es usado como interfaz entre la PC y el usuario. Ver Figura
3.6.

Figura. 3.6. AVR Prog en el AVR Studio4

Los datos son transmitidos hacia el microcontrolador a través de la interfaz RS-232,


para lo cual se debe conectar un cable serial desde la PC hacia el AVR Butterfly como se
describe en la sección 3.5.

Actualización del AVR ATmega169


Desde la aplicación del AVR Butterfly se puede saltar hacia la sección de Arranque
(boot section), desplazándose a través del menú: “Opciones>Bootloader>Saltar hacia
Bootloader”, como se ve en la Figura 3.5; ó simplemente reseteando el microcontrolador
ATmega169 al cortocircuitar los pines 5 y 6 en el conector J403, conector ISP. Ver Figura
3.7 y Figura 3.9.
CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 193 -

Figura. 3.7. Conector J403 para ISP

Luego de un reset, el microcontrolador ATmega169 comenzará desde la sección de


Arranque. Nada se desplegará en el LCD mientras esté en la sección de Arranque.
Entonces se deberá presionar ENTRAR en el joystick y mantener esa posición; mientras
tanto desde la PC en el AVR Studio, iniciar el AVR Prog.

Una vez que se haya iniciado el AVR Prog, soltar el joystick del AVR Butterfly.
Desde el AVR Prog, como se ve en la Figura 3.8, utilizar el botón “Browse” para buscar el
archivo con la extensión *.hex con el que desea actualizar al AVR Butterfly. Una vez
localizado el archivo *.hex, presionar el botón “Program”. Se notará que “Erasing Device”,
“Programming” y “Verifying” se ponen en “OK”, de manera automática. Luego de
actualizar la aplicación, presionar el botón “Exit” en el AVR Prog para salir del modo de
programación del ATmega169.

Figura. 3.8. AVR Prog


CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 194 -

Saltar hacia el Sector de la Aplicación. Para saltar de la Sección de Arranque hacia la de


Aplicación presione el joystick hacia ARRIBA.

3.3.4. Ejemplo del uso de las aplicaciones incluidas en el AVR Butterfly


A continuación se exponen ejemplos del uso de dos de las aplicaciones incluidas en
el AVR Butterfly. Estos ejemplos se refieren a cómo ingresar un nombre; el primer
ejemplo utiliza el joystick y el segundo una PC.

Ingresando un nombre mediante el Joystick


1. Presionar el joystick hacia arriba (“DESPLAZAR HACIA ARRIBA”) para sacar
del reposo al AVR Butterfly. Si sobre la pantalla no se desplaza el texto “AVR
Butterfly”, presionar el joystick hacia la izquierda (“SALIR SUB-MENÚ”) hasta
que se desplace dicho texto.

2. Presionar el joystick hacia abajo (“DESPLAZAR HACIA ABAJO”) tres veces,


para que la cadena “NAME” se visualice.

3. Presionar el joystick hacia la derecha (“ENTRAR SUB-MENÚ”). Si esta es la


primera vez que se ingresa un nombre, la cadena “ENTER NAME” se visualizará;
de lo contrario, se visualizará el nombre ya ingresado y será necesario presionar el
joystick hacia la derecha (“ENTRAR SUB-MENÚ”) una vez más.

4. Cuando se visualice “ENTER NAME”, presionar el joystick en el centro


(“ENTRAR”). Si ésta es la primera vez que se ingresa un nombre, el carácter “A”
debe estar intermitentemente en el lado derecho de la pantalla; de lo contrario, el
último carácter del nombre ya ingresado aparecerá intermitentemente.

5. Presionar el joystick hacia arriba (“DESPLAZAR HACIA ARRIBA”) o hacia


abajo (“DESPLAZAR HACIA ABAJO”) para conseguir el carácter deseado.
Presionar el joystick hacia la derecha (“ENTRAR SUB-MENÚ”) para añadir un
nuevo carácter o presionar el joystick hacia la izquierda (“SALIR SUB-MENÚ”)
para remover un carácter.
CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 195 -

6. Cuando se tenga todos los caracteres del nombre, hasta un máximo de 25


caracteres, presionar el joystick en el centro (“ENTRAR”) para guardarlo. El
nombre se visualizará en la pantalla. Si el nombre es de más de 6 caracteres éste se
desplazará a través de la pantalla, de lo contrario permanecerá estático.

Ingresando un nombre mediante una Terminal


1. Conectar un cable serial desde la PC hacia el AVR Butterfly como se indica en la
sección 3.5. Abrir una terminal en la PC (por ej. HyperTerminal) y configurar sus
parámetros con una baud rate de 19200, 8 bits de datos, sin paridad y un bit de
parada.

2. Repetir los puntos 1, 2 y 3 de la sección “Ingresando un nombre mediante el


joystick”.

3. Cuando se visualice en el LCD la frase “ENTER NAME”, presionar el joystick


hacia abajo (“DESPLAZAR HACIA ABAJO”) y entonces la frase “DOWNLOAD
NAME” se visualizará.

4. Presionar el joystick en el centro (“ENTRAR”) para activar la UART y se


visualizará en el LCD la frase “WAITING FOR INPUT ON RS232”.

5. Digitar el nombre del usuario en la ventana de la Terminal de la PC (hasta 25


caracteres) y guardar el nombre presionando la tecla INTRO en el teclado de la PC.
El nombre que fue digitado por el usuario se visualizará en la pantalla del AVR
Butterfly.

Nota. La característica de Auto Apagado se activa por defecto y apagará al LCD


luego de 30 minutos. Este tiempo de auto apagado puede ser cambiado o cancelado por el
usuario. Para sacar del SLEEP al AVR Butterfly, presionar el joystick hacia ARRIBA.
CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 196 -

3.3.5. Fuses y Lock bits


Para que el firmware funcione correctamente, los siguientes Fuses y Lock bits del
microcontrolador ATmega169 son los únicos que se debe programar.

Extended Fuse Byte (0xFF)


− Nada

Fuse High Byte (0x98)


− JTAGEN (Interfaz JTAG Activada)
− SPIEN (Programación Serial Activada)
− BOOTSZ1 (Tamaño del Boot 1024 palabras)
− BOOTSZ0
− BOOTRST (Vector Boot Reset Activado)

Fuse Low Byte (0xE2)


− SUT0 (Tiempo de inicio 65 ms)
− CKSEL3 (Oscilador RC Interno)
− CKSEL2
− CKSEL0

Lock Bit Byte (0xEF)


− BLB11 (SPM no está autorizado para escribir a la sección del Boot Loader)

Nota. Aplicado al AVR Butterfly, para todos los Fuses y Lock bits, “1” significa sin
programar y “0” significa programado.

3.4. CONECTORES
Algunos de los pines de I/O del microcontrolador ATmega169 están disponibles en
los conectores del AVR Butterfly. Estos conectores son para comunicación, programación
y entrada al ADC del ATmega169. En la Figura 3.9 se puede apreciar los conectores del
AVR Butterfly.
CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 197 -

Figura. 3.9. Conectores del AVR Butterfly para acceso a periféricos

3.5. PROGRAMACIÓN MEDIANTE CONEXIÓN SERIAL (UART) CON LA PC


El AVR Butterfly tiene incluido un convertidor de nivel para la interfaz RS-232. Esto
significa que no se necesita de hardware especial para reprogramar al AVR Butterfly
utilizando la característica self-programming del ATmega169. A continuación se explica
brevemente la distribución de los pines y como se debe realizar el cableado para la
comunicación serial entre el AVR Butterfly y la PC.

3.5.1. Distribución de pines para la comunicación serial entre el AVR y la PC


La comunicación con la PC requiere de tres líneas: TXD, RXD y GND. TXD es la
línea para transmitir datos desde la PC hacia el AVR Butterfly, RXD es la línea para
recepción de datos enviados desde el AVR Butterfly hacia la PC y GND es la tierra común.
En la Tabla 3.1 se observa la distribución de los pines para la comunicación serial, a la
izquierda los pines del AVR Butterfly y a la derecha los pines del conector DB9 de la PC.

Tabla. 3.1. Distribución de pines, AVR Butterfly Vs. PC

En la Figura 3.10 se observa como se debe hacer el cableado para la comunicación, a


través de la interfaz serial RS-232, entre el AVR Butterfly y la PC. A la izquierda se
CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 198 -

aprecia un conector DB9 hembra soldado a los cables que se conectan a la interfaz USART
del AVR Butterfly (derecha).

Figura. 3.10. Conexiones para interfaz USART del AVR Butterfly

3.5.2. Programación del AVR Butterfly


Los pasos necesarios para la Programación del Kit AVR Butterfly son los siguientes:

- En la PC, localizar y ejecutar el AVR Studio.

- En el menú “File” del AVR Studio seleccionar “Open File“, luego seleccionar el
archivo con el que se desea programar al AVR Butterfly, tal como indica la
Figura 3.11; por ejemplo: …\nombre_del_programa.cof.

Figura. 3.11. AVR Studio, selección del archivo COF para depuración
CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 199 -

- Seleccionar el AVR Simulator y luego el ATmega169 como en la Figura 3.12.

Figura. 3.12. Selección del AVR Simulator y Dispositivo ATmega169

- Presionar “Finish”.

- Conectar el cable serial entre la PC y el AVR Butterfly como se indica en la


Figura 3.10.

- Resetear el AVR Butterfly cortocircuitando los pines 5 y 6 en el conector J403,


conector ISP, o quitando y aplicando nuevamente la fuente de alimentación. Ver
Figura 3.7 y Figura 3.9.

- Luego de un reset, el microcontrolador ATmega169 comenzará desde la sección


de Arranque. Nada se desplegará en el LCD mientras esté en la sección de
Arranque. Entonces se deberá presionar ENTRAR en el joystick y mantener esa
posición; mientras tanto desde la PC en el AVR Studio, iniciar el AVR Prog.

- Una vez que se haya iniciado el AVR Prog, soltar el joystick del AVR Butterfly.
Desde el AVR Prog, como se ve en la Figura 3.8, utilizar el botón “Browse” para
buscar el archivo con la extensión *.hex con el que desea actualizar al AVR
Butterfly. Una vez localizado el archivo *.hex, presionar el botón “Program”. Se
notará que “Erasing Device”, “Programming” y “Verifying” se ponen en “OK”,
CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 200 -

de manera automática. Luego de actualizar la aplicación, presionar el botón


“Exit” en el AVR Prog para salir del modo de programación del ATmega169.

- Para que empiece a ejecutarse la nueva aplicación, resetear el AVR Butterfly


cortocircuitando los pines 5 y 6 en el conector J403 y presionar el joystick hacia
ARRIBA.

3.6. EL LCD
En las aplicaciones donde es necesaria la interacción con el usuario es muy útil poder
mostrar información para el usuario. Una interfaz muy simple para mostrar información
podría ser el estado de unos LEDs; mientras que la interacción más compleja puede
beneficiarse de una pantalla capaz de desplegar letras, números, palabras o incluso
oraciones. Las Pantallas de Cristal Líquido (LCD) son frecuentemente usadas para
desplegar mensajes. Los módulos LCD pueden ser gráficos y se los puede usar para
desplegar gráficos y texto, ó pueden ser alfanuméricos capaces de visualizar entre 10 y 80
caracteres. Los módulos LCD alfanuméricos estándar son fáciles de conectar, pero son
bastante costosos debido a que tienen incorporado drivers/controladores que se ocupan de
la generación de los caracteres/gráficos sobre el vidrio LCD.

El vidrio LCD es la placa de vidrio en la cual el cristal líquido está contenido. Para
reducir el costo de una aplicación donde se requiere una pantalla se puede elegir usar una
MCU que tenga un driver incorporado para LCD. La MCU puede entonces manejar
directamente el vidrio LCD, eliminando la necesidad del driver integrado en el módulo
LCD. El costo de la pantalla puede reducirse tanto como para un factor de 10, puesto que
un vidrio LCD (LCD sin Driver) tiene un costo mucho más bajo que un módulo LCD
(LCD con Driver).

El microcontrolador ATmega169 tiene un controlador LCD (LCD Driver) integrado


capaz de controlar hasta 100 segmentos. El núcleo altamente eficiente y el consumo de
corriente muy bajo de este dispositivo lo hace ideal para aplicaciones energizadas por
batería que requieren de una interfaz humana.
CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 201 -

3.6.1. Conexiones entre el LCD y el microcontrolador ATmega169


Los pines para el LCD en el AVR se sitúan en PORTA, PORTC, PORTD y PORTG.
El vidrio LCD incluido en el AVR Butterfly tiene un total de 120 segmentos controlados a
través de cuatro terminales comunes y 30 líneas de segmento. Puesto que el Atmega169 es
capaz de manejar 100 segmentos, algunos de los segmentos del vidrio LCD no están
conectados en el AVR Butterfly.

Figura. 3.13. Vidrio LCD

En la Figura 3.13 se muestra el vidrio LCD montado en el AVR Butterfly. Este


consiste de siete símbolos alfanuméricos y varios símbolos fijos: números de cero a nueve,
una campana, un indicador de batería descargada (low-battery) y flechas de navegación;
todo esto se puede apreciar más detalladamente en la Figura 3.14.

Figura. 3.14. Símbolos alfanuméricos y símbolos fijos en el LCD

Los pines 19 y 24 del LCD están puenteados, como se observe la Figura 3.26, la
razón para hacerlo se debe a que el pin 24 tiene al segmento COL1 y el pin 19 tiene al
COL2. Esto puede ser útil en aplicaciones donde un reloj, dato, etc. debe visualizarse, para
controlar a ambos signos de “dos puntos” (COLONS) en la pantalla. Pero conectando estos
CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 202 -

pines del LCD también llevará a una conexión entre los segmentos SEG5 y SEG3, SEG8 y
SEG7, SEG8 y SEG7 que en la práctica los hará inutilizables.

En la Figura 3.15 se muestra los segmentos que están disponibles.

Figura. 3.15. LCD puenteado (izquierda) y LCD sin puentear (derecha)

El AVR Butterfly tiene seis grupos similares de segmentos, donde cada grupo de
segmentos es capaz de desplegar un carácter alfanumérico. Un cierto grupo de segmentos
capaz de desplegar un carácter alfanumérico es llamado un dígito LCD. Este consiste de 14
segmentos separados. La Figura 3.16 muestra un dígito LCD y la letra usada para referirse
a cada uno de los segmentos dentro del dígito LCD.

Figura. 3.16. Segmentos y Letras de Referencia de los Dígitos LCD

El LCD debe funcionar a ¼ Duty y 1/3 Bias (ver Capítulo 2, Controlador de LCD)
para poder controlar los cuatro terminales comunes. Es muy importante notar que la
energía para el LCD es suministrada desde el microcontrolador ATmega169 y no tienen
líneas de alimentación separadas.
CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 203 -

3.7. EL JOYSTICK
El AVR Butterfly tiene un joystick en miniatura como entrada para el usuario. Este
opera en cinco direcciones, incluyendo presión en el centro. La línea común de todas las
direcciones es GND. Esto significa que se deberá activar las pull-ups internas del
microcontrolador ATmega169V para detectar la entrada desde el joystick. En la Figura
3.17 se puede apreciar al joystick y la referencia de los puertos del ATmega169 a los que
se debe conectar.

Figura. 3.17. Joystick

3.8. LOS SENSORES


El AVR Butterfly tiene a bordo dos sensores que hacen posible medir la temperatura
y la intensidad de luz. Además tienen un divisor de voltaje que es empleado para medir
voltajes desde 0 a 5 V.

3.8.1. Sensor de Temperatura


El sensor de temperatura se encuentra en la parte posterior del AVR Butterfly como
se indica en la Figura 3.18.
CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 204 -

Figura. 3.18. Termistor de Coeficiente Negativo de Temperatura

Un termistor NTC (Termistor de Coeficiente Negativo de Temperatura) es empleado


por el AVR Butterfly para medir la temperatura. Un termistor NTC se caracteriza por el
hecho de que cuando la temperatura baja la resistencia sube. Valiéndose de un divisor de
voltaje y leyendo el voltaje sobre el termistor, a través de los canales del ADC del
microcontrolador ATmega169, se podrá medir la temperatura.

Para calcular la temperatura en grados Celsius se emplea la Ecuación 3.1.

β
Temperatura = − Tcero
⎛ ⎛ ADC ⎞ β ⎞
⎜⎜ ln⎜ ⎟+ ⎟⎟
⎝ ⎝ 1024 − ADC ⎠ Tamb ⎠
Ecuación. 3.1 Ecuación para calcular la Temperatura en ºC

β = 4250
ADC = valor en el Registro de Datos del ADC en el ATmega169 – ADCH
y ADCL.
Tcero = 273 ºK
Tamb = 298 ºK (273º + 25º)

La temperatura en grados Fahrenheit puede encontrarse usando la Ecuación 3.2.

⎛ (º F − 32) ⎞
ºC = ⎜ ⎟
⎝ 1.8 ⎠
Ecuación. 3.2. Ecuación para convertir ºC en ºF
CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 205 -

El AVR Butterfly es capaz de medir la temperatura, en el rango de -10 ºC / +14 ºF


hasta +60 ºC / +140 ºF, con una precisión de ±1 ºC.

3.8.2. Sensor de Luz


El sensor de Intensidad de luz está ubicado en la parte frontal del AVR Butterfly,
encima del LCD, como se aprecia en la Figura 3.19.

Figura. 3.19. Sensor de Luz

Un LDR (Resistor Dependiente de la Luz) se emplea para medir la intensidad de la


luz. Un LDR se caracteriza por el hecho de que cuando la intensidad de la luz disminuye,
la resistencia en el LDR tiende a incrementarse. Utilizando un divisor de voltaje y leyendo
el voltaje sobre el LDR a través de los canales del ADC del ATmega169, puede medirse la
intensidad de la luz.

3.9. EL LECTOR DE VOLTAJE (ADC, CANAL 1)


El AVR Butterfly es capaz de leer voltajes en el rango de 0 a 5 V. El voltaje a leerse
debe aplicarse a los conectores externos del canal uno del ADC, tal como se indica en la
Figura 3.20. Valiéndose de un divisor de voltaje y leyendo el voltaje sobre la resistencia, a
través del canal 1 del ADC del ATmega169, se podrá medir el voltaje aplicado. La
precisión es aproximadamente de 0.1 V.
CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 206 -

Figura. 3.20. Pines para lectura de voltaje

Nota. No aplicar voltajes superiores al máximo de 10 V.

3.10. LA DATAFLASH
Una DataFlash externa es proporcionada con el AVR Butterfly, esta se aprecia en la
Figura 3.21. Esta es la DataFlash serial de 4 Megabits de Atmel, del tipo AT45DB041B.

La DataFlash está conectada a la interfaz SPI. Esto significa que además de


comunicarse con el ATmega169 en el AVR Butterfly, ésta también puede ser accedida
externamente a través del conector ISP.

Nota. Si la DataFlash será accedida externamente, el ATmega169 en el AVR


Butterfly debe desactivar su propia interfaz SPI para evitar la disputa en la interfaz.

Figura. 3.21. DataFlash de 4 Mbits


CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 207 -

Figura. 3.22. Esquema de la conexión de la DataFlash

3.11. EL ELEMENTO PIEZOELÉCTRICO (BUZZER)


Para poder reproducir sonidos en el AVR Butterfly se emplea un elemento
piezoeléctrico; a este se lo aprecia en la Figura 3.23. El piezoeléctrico se conecta al
PORTB5 del ATmega169, que valiéndose del PWM puede generar las diferentes
frecuencias requeridas para reproducir melodías.

Figura. 3.23. Elemento Piezoeléctrico

3.12. LA BATERÍA
La batería del AVR Butterfly está protegida por un diodo schottky, éste evitará la
recarga de la batería si se aplica energía externamente al PORTB o PORTD del AVR
Butterfly.
CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 208 -

La batería incluida en el AVR Butterfly tiene las siguientes características:

Modelo: CR2450.
Voltaje Nominal: 3.0 Voltios.
Capacidad Normal: 550 mAh (@ Corriente de Descarga de 0.2mA, +23ºC).
Corriente Estándar de Descarga: 0.2 mAh.
Corriente máxima recomendada bajo descarga continua: 3 mA.
Corriente máxima recomendada bajo descarga de pulso: 15 mA.

Nota. NO recargue, cortocircuite, desarme, deforme, caliente o ponga la batería cerca


del fuego. Esta batería contiene materiales inflamables que pueden causar explosión o
daño.

3.13. DIAGRAMAS ESQUEMÁTICOS

Figura. 3.24. MCU


CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 209 -

Figura. 3.25. Microcontrolador AVR ATmega169V

Figura. 3.26. Pantalla de Cristal Líquido, LCD


CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 210 -

Figura. 3.27. DataFlash de 4 Mb, AT45DB041B-SC-2.5

a) b) c)
Figura. 3.28. Sensores: (a) resistor NTC, (b) acceso al ADC y (c) LDR

Figura. 3.29. Joystick

Figura. 3.30. Elemento Piezoeléctrico, Buzzer


CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 211 -

Figura. 3.31. Cristal Externo de 32 768 Hz

Figura. 3.32. Circuito conversor de nivel para interfaz RS-232

Figura. 3.33. Batería de 3V y acceso a VCC externo


CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 212 -

Figura. 3.34. Conectores externos para: ISP y JTAG

Figura. 3.35. Conectores externos: PORTB y PORTD


CAPÍTULO 3: KIT DE DESARROLLO AVR BUTTERFLY - 213 -

Figura. 3.36. Conectores externos para: USI, USART y ADC1


CAPÍTULO 4: AVR STUDIO 4 - 214 -

CAPÍTULO 4

AVR STUDIO 4

4.1. INTRODUCCIÓN
AVR Studio es un Entorno de Desarrollo Integrado (IDE) para escribir y depurar
aplicaciones AVR en el entorno de Windows 9x/Me/NT/2000/XP.

AVR Studio 4 soporta varias de las fases por las cuales se atraviesa al crear un nuevo
producto basado en un microcontrolador AVR. Las fases típicas son:

• La definición del producto. El producto que debe crearse se define basándose en el


conocimiento de la tarea que se quiere resolver y la entrada que tendrá en el
mercado.

• La especificación formal. Se define una especificación formal para el producto.

• Asignación de la tarea a un equipo. A un equipo del proyecto, que consiste de una o


mas personas, se le asigna la tarea de crear el producto basándose en la
especificación formal.

• El equipo del proyecto pasa por la secuencia normal de diseño, desarrollo,


depuración, comprobación, planificación de producción, producción, prueba y
embarque.

AVR Studio apoya al diseñador en el diseño, desarrollo, depuración y parte de la


comprobación del proceso.
CAPÍTULO 4: AVR STUDIO 4 - 215 -

AVR Studio es actualizado continuamente y está disponible para descargarlo desde


www.atmel.com

A continuación se lista brevemente los requerimientos mínimos del sistema,


necesarios para poder utilizar el AVR Studio 4 en una PC:

• Windows 2000/XP (o Windows NT 4.0 con Internet Explorer 5.0 o posterior).


• Windows 95/98/Me (con Internet Explorer 5.0 o posterior).
• Hardware Recomendado:
- Procesador Intel Pentium de 200MHz o equivalente.
- Resolución de Pantalla de 1024x768 (Resolución mínima de 800x600).
- Memoria RAM de 64Mb.
- Disco Duro con 50 Mb de espacio disponible.

4.2. DESCRIPCIÓN GENERAL DEL IDE


Como se dijo anteriormente, el AVR Studio es un Entorno de Desarrollo Integrado
(IDE). Éste tiene una arquitectura modular completamente nueva, que incluso permite
interactuar con software de otros fabricantes.

AVR Studio 4 proporciona herramientas para la administración de proyectos, edición


de archivo fuente, simulación del chip e interfaz para emulación In-circuit para la poderosa
familia RISC de microcontroladores AVR de 8 bits.

AVR Studio 4 consiste de muchas ventanas y sub-módulos. Cada ventana apoya a las
partes del trabajo que se intenta emprender. En la Figura 4.1 se puede apreciar las ventanas
principales del IDE.
CAPÍTULO 4: AVR STUDIO 4 - 216 -

Figura. 4.1. Entorno de Desarrollo Integrado AVR Studio4

Administración de Proyectos. Toda creación de código dentro del AVR Studio se la


realiza como proyectos de programación. Todos los proyectos de código tienen un archivo
project que mantiene la información acerca del proyecto, de qué archivos consta, la
estructuración del ensamblador, vistas personalizadas y así sucesivamente. El archivo
project asegura que el proyecto sea el mismo cada vez que regrese a él, que todo esté
adecuadamente organizado y que ensamble / compile.

4.3. LAS VENTANAS PRINCIPALES DEL IDE AVR STUDIO 4

4.3.1. La Ventana Editor


Este es el lugar donde se realiza el trabajo de codificar. El AVR Studio usa el editor
Stringray de la corporación Bsquare. Este es un editor completo para programación con
toda la funcionalidad que el usuario empleará, incluso codificación de color para la sintaxis
(que puede ser alterada y extendida por el usuario). La ventana del editor también se usa
cuando al depurar código. En la Figura 4.2 se aprecia la ventana del Editor.
CAPÍTULO 4: AVR STUDIO 4 - 217 -

Figura. 4.2. Ventana del Editor

4.3.2. La Ventana Output (Ventana de Resultados)


Es una colección de varias ventanas (Build, Messages,…) integradas en un marco
etiquetado. Con las etiquetas sobre el marco se selecciona la ventana que se desea
observar. En la Figura 4.3 se observa la ventana de Resultados (Output) y en la misma se
aprecia las distintas etiquetas correspondientes a las ventanas que la conforman.

Figura. 4.3. Ventana Output

Las opciones que se presentan en esta ventana son las siguientes:

Build. El resultado del compilador/ensamblador se dirige hacia esta ventana. Aquí puede
leerse el resultado de la compilación / ensamblaje.

Messages. AVR Studio está hecho con muchos objetos SW encapsulados con tecnología
Microsoft DCOM. Muchos de los objetos del software no tienen su propia interfaz de
usuario. La ventaja Messages es la ventana común que todos los módulos de software
emplean para presentar mensajes al usuario. Los mensajes están codificados por color. La
mayoría de mensajes son mensajes simples sin prioridad significante que no tienen color.
Las advertencias que se presentan en amarillo señalan problemas potenciales. Los errores
CAPÍTULO 4: AVR STUDIO 4 - 218 -

están en rojo. Todos los mensajes pueden mostrarse acompañados del tiempo, haciendo
clic derecho con mouse sobre la ventana y seleccionando la opción mostrar el tiempo (time
stamp option).

Find in files. AVR Studio 4 tiene una función avanzada para “buscar en archivos”. El
resultado de la búsqueda es dirigido hacia esta ventana.

Breakpoints. Enlista todos los breakpoints (puntos de detención) activos en todos los
módulos. A los breakpoints se los puede habilitar, deshabilitar y remover desde esta
ventana.

4.3.3. La Ventana Workspace (Área de Trabajo)


El área de trabajo del AVR Studio 4 consiste de varias ventanas proyectadas para
ayudar al desarrollador en la depuración del código que él ha escrito de forma sistemática.

Las ventanas disponibles dentro de la ventana Workspace son las siguientes:

La ventana Project
Si se ha creado un proyecto de código, la ventana Project lista los archivos que están
incluidos en dicho proyecto. Si se tiene abierto un archivo objeto para depuración, la
ventana Project muestra el nombre del archivo objeto actualmente cargado así como
también los archivos fuente a los cuales el archivo objeto se refiere. En la Figura 4.4 se
puede apreciar la vista Project.

Figura. 4.4. Ventana Project


CAPÍTULO 4: AVR STUDIO 4 - 219 -

La ventana I/O
Esta ventana despliega información de los registros de I/O así como también del
procesador y de los registros.

Figura. 4.5. Ventana I/O

Como se aprecia en la Figura 4.5, la ventana I/O permite visualizar los siguientes
campos:

Registro. Todos los controladores AVR tienen un conjunto de 32 registros de propósito


general que pueden usarse libremente por el programador o compilador. Cada vez que una
simulación o una emulación se detiene temporalmente (break), este campo se actualiza con
los valores actuales de los registros internos del dispositivo. Si el valor cambió desde la
última detención, el registro aparece codificado con color.
CAPÍTULO 4: AVR STUDIO 4 - 220 -

Procesador. En comparación con el campo del registro, los registros del procesador se
actualizan cuando la ejecución se detiene temporalmente (break). Aquí se puede ver el
contador del programa, el contador de la pila (stack) y otros.

Registros de los módulos de I/O. Cada dispositivo AVR diferente se caracteriza por los
periféricos que el dispositivo soporta. Un ATmega169 tiene un conjunto de periféricos
completamente diferente comprado con un AT90S8515, pero el núcleo y el conjunto de
instrucciones de los dos chips son totalmente iguales. Todos los periféricos son controlados
a través de registros de 8 o 16 bits que pueden ser leídos ó escritos. Este campo de I/O se
configura para el dispositivo que se ha seleccionado e indica todos los registros y bits
lógicamente agrupados. Los bits y registros pueden ser escritos cuando la emulación está
en modo break. Esta vista ofrece control total sobre el dispositivo sometido a depuración.
La actualización de los dispositivos que soporta AVR Studio se hacen a través de la página
de Atmel en la web.

La ventana Info
Esta ventana es estática y muestra todas las interrupciones, configuración de pin y
direcciones disponibles de I/O para el dispositivo seleccionado.

Figura. 4.6. Ventana Info

Como se aprecia en la Figura 4.6, la ventana Info se subdivide en los siguientes


campos:

Interrupt vectors. Los vectores de interrupción para un dispositivo usualmente reflejan


sus periféricos. En consecuencia son diferentes para cada dispositivo AVR. Este campo
CAPÍTULO 4: AVR STUDIO 4 - 221 -

enlista todas las interrupciones y sus correspondientes direcciones de vector de


interrupción. Este material es útil si se programa las rutinas para el servicio de
interrupción.

Packages. Enlista los encapsulados disponibles para el dispositivo, y la correspondiente


distribución de pines para cada encapsulado. La ayuda informativa sobre las herramientas
tendrá información sobre el uso de la mayoría de los pines. Así mismo, es una
característica útil si se está depurando HW y SW, se tiene la información necesaria de
pines en todo momento en este campo.

Registers. Es un complemento para la ventana de I/O. La ventana de I/O muestra todos los
registros lógicamente agrupados en funciones periféricas. Este campo enlista a todos los
registros desde la dirección más alta hasta la más baja.

4.3.4. La Ventana Watch


En la Figura 4.7 se aprecia la ventana para vigilancia de variables, esta es la ventana
Watch.

Figura. 4.7. Vista Watch

Al depurar lenguajes de alto nivel como C/C++, se necesita vigilar las variables. Con
herramientas como AVR Studio 4 esto es una tarea fácil, se debe hacer clic sobre la
variable que se quiera vigilar, arrastrarla y soltarla dentro de la ventana para vigilancia
(Watch). Si la variable seleccionada es una estructura o una matriz, un símbolo [+]
aparecerá en frente de la variable, indicando que ésta puede ser expandida dentro de la
vista. Cuando la ejecución se interrumpe temporalmente (break), la variable se actualizará
automáticamente si está dentro del alcance. Diferentes lenguajes definen diferentemente su
CAPÍTULO 4: AVR STUDIO 4 - 222 -

alcance, pero estar dentro del alcance significa que la variable actualmente existe en la
memoria en la localidad donde el programa detiene su ejecución.

4.3.5. La Ventana Memory


Un microcontrolador como el AVR no puede hacer nada sin memoria. El código
ejecutado está en la memoria de programa, las variables se ubican en la SRAM
(principalmente), los registros de I/O se distribuyen dentro del área de memoria de I/O y la
EEPROM es otra área de memoria. La ventana Memory está disponible para visualizar
todos los diferentes tipos de memoria asociados a los dispositivos AVR. Y en relación a la
ventana Watch y la I/O, el área expuesta en la pantalla se actualiza automáticamente
cuando ocurre una detención temporal (break) de la ejecución. En la Figura 4.8 se aprecia
la ventana Memory.

Figura. 4.8. Vista Memory

4.3.6. La Barra de Estado


La barra de estado siempre indica el nombre del dispositivo actual, la plataforma de
depuración, el estado de ejecución y la ubicación del cursor dentro de la ventana Editor;
esto se puede verificar en la Figura 4.9.

Figura. 4.9. Barra de Estado

4.4. GENERACIÓN DE PROYECTOS


Iniciar el AVR Studio 4 desde el menú [Inicio] [Programas] [Atmel AVR Tools],
como se indica en la Figura 4.10.
CAPÍTULO 4: AVR STUDIO 4 - 223 -

Figura. 4.10. Ubicación del AVR Studio en la Barra de Inicio

Luego aparecerá la ventana que se ilustra en la Figura 4.11.

Figura. 4.11. Creación de nuevo proyecto.

Para crear un nuevo proyecto el usuario debe hacer clic en el botón Create New
Project que aparece resaltado en la Figura 4.11.

Luego, el usuario debe configurar el tipo de proyecto que desea crear, el nombre del
archivo y el lugar donde será guardado.

Esto se hace en cinco pasos tal como se ilustra en la Figura 4.12:


CAPÍTULO 4: AVR STUDIO 4 - 224 -

Figura. 4.12. Configuración del proyecto

1. Todos los tipos de proyecto disponibles se listan en el cuadro Project type list. El
usuario debe hacer clic aquí (en Atmel AVR Assembler) para dejar saber al AVR
Studio que se quiere crear un programa en ensamblador.

2. Aquí se coloca el nombre del proyecto, puede ser cualquiera.

3. Aquí el usuario puede especificar si el AVR Studio debe crear automáticamente un


archivo ensamblador. El nombre del archivo puede ser cualquiera.

4. Seleccionar la ruta donde se quiere guardar el proyecto y los archivos.

5. Verificar siempre una vez más y asegurarse de que las casillas de verificación estén
seleccionadas. Una vez seguro, presionar el botón “Next>>”.

A continuación, siguiendo el orden que aparece en la Figura 4.13, el usuario debe


escoger la plataforma de depuración.
CAPÍTULO 4: AVR STUDIO 4 - 225 -

Figura. 4.13. Selección de la Plataforma para Depuración y del Dispositivo para Simulación

1. El AVR Studio 4 soporta un amplio rango de herramientas para emulación y


depuración. Por conveniencia el usuario debe seleccionar la funcionalidad de
simulación incluida, el AVR Simulator; ya que, el resto de opciones requieren de
H/W especial.

2. Aquí el usuario debe seleccionar el microcontrolador que utilizará en su aplicación,


en este caso ATmega169.

3. Verificar una vez más, luego presionar “Finish” para crear el proyecto e ir a editar
archivo ensamblador (.asm).

El AVR Studio iniciará y abrirá un archivo .asm.

En la vista Editor el usuario debe escribir el código fuente, al hacerlo el usuario


notará que el código fuente cambia de color. Esto se conoce como resaltamiento de la
sintaxis y es muy útil para hacer código más legible.

Si el usuario desarrolla para un dispositivo específico debe tener en mente incluir el


archivo *def.inc para el dispositivo. Cada dispositivo tiene su propio archivo *.inc que
define todos los registros internos, bits y un poco de otras cosas que hace más simple
escribir código para el dispositivo. Adicionalmente el archivo *.inc establece la directiva
CAPÍTULO 4: AVR STUDIO 4 - 226 -

del dispositivo para el ensamblador, dejando saber al ensamblador para qué dispositivo
está desarrollando.

Los archivos para el dispositivo se encuentran en la carpeta


Files\Atmel\AVRTools\AVRAssembler\Appnotes de la PC. Un archivo include para el
ATmega169 típicamente aparecerá con el nombre “m169def.inc”. No se debe dar una ruta
con el archivo *.inc, con tal de que se encuentre en el directorio predefinido.

Una vez que el usuario haya ingresado correctamente y verificado el código fuente,
debe presionar CTRL + F7 ó seleccionar [Build and Run] en el menú [Project], para
compilar y ejecutar el código en el depurador.

En la ventana Output el usuario debe obtener el mensaje: Assembly complete, 0


errors, 0 warnings, que indica que el código se ha escrito correctamente; de no ser así debe
revisar el archivo ensamblador (.asm) ayudándose de los mensajes de error.

4.5. DEPURACIÓN DE PROYECTOS


AVR Studio 4 puede orientarse hacia el Simulador AVR incorporado ó hacia un
Emulador de Circuito AVR.

Independientemente de la plataforma que se esté ejecutado, el entorno de AVR


Studio aparecerá idéntico. Al cambiar entre plataformas de depuración, todas las opciones
del entorno se mantienen para la nueva plataforma. Muchas plataformas tienen
características únicas y consecuentemente aparecerán nuevas funcionalidades/ventanas.

Diferencias entre Plataformas. Aunque todas las plataformas para depuración parezcan
idénticas, en el entorno de depuración habrá pequeñas diferencias entre ellas. Un emulador
de tiempo real sería significativamente más rápido que el simulador. Un emulador también
permitirá depurar mientras el sistema está conectado al entorno real de hardware; mientras
el simulador únicamente permite aplicar estímulos predefinidos. En el simulador, todos los
registros están siempre disponibles potencialmente para ser visualizados, ese no es el caso
con un emulador.
CAPÍTULO 4: AVR STUDIO 4 - 227 -

4.5.1. Formato del Archivo Objeto


Todas las sesiones de depuración requieren que el usuario cargue un archivo objeto
para depuración que sea soportado por el AVR Studio. Usualmente un archivo para
depuración contiene información simbólica que no está incluida en un archivo simple. La
información para depuración habilita al AVR Studio para dar posibilidades extendidas al
depurar.

La Tabla 4.1 es una breve descripción de los formatos de archivo objeto que son
soportados por el AVR Studio.

Tabla. 4.1. Formatos del Archivo Objeto

La ventaja de esto es que, se puede generar código en otros Entornos de Desarrollo y


con otros lenguajes como C++. Pero la simulación se la puede hacer en AVR Studio.

Antes de depurar asegúrese de tener configurado su compilador /ensamblador para


que genere un archivo para depuración con un formato como los anteriormente mostrados
en la tabla.
CAPÍTULO 4: AVR STUDIO 4 - 228 -

4.5.2. Controles para la Depuración


Se usan para controlar la ejecución de un programa. Todos los controles para la
depuración están disponibles a través de los menús, accesos directos y barra de
herramientas para depuración (Debug).

Start Debugging. Este comando iniciará el proceso de depuración y todos los


comandos para control de la depuración estarán disponibles. Normalmente en modo de
depuración ninguna edición de código puede hacerse. Este conecta a la plataforma de
depuración, carga el archivo objeto y realiza un reset.

Stop Debugging. Este comando detiene el proceso de depuración. Este desconecta la


plataforma de depuración y el modo de edición estará disponible.

Reset (SHIFT+F5). El comando Reset realiza una Reinicialización de la ejecución


designada. Si un programa está ejecutándose cuando se emite el comando, la ejecución se
detendrá. Luego de que se complete el Reset, toda la información en la ventana se
actualizará.

Run (F5). El comando Run del menú Debug iniciará (o reanudará) la ejecución del
programa. El programa se ejecutará hasta que sea detenido (acción del usuario) o se
encuentre un breakpoint. El comando Run está disponible únicamente cuando la ejecución
está detenida.

Break (CTRL+F5). El comando Break del menú Debug detiene la ejecución del
programa. Cuando la ejecución se detiene, toda la información en todas las ventanas se
actualiza. El comando Break está disponible únicamente cuando un programa está
ejecutándose.

Single step, Trace Into (F11). El comando Trace Into del menú Debug ejecuta una
instrucción. Luego de que Trace Into se complete, toda la información en todas las
ventanas se actualiza.
CAPÍTULO 4: AVR STUDIO 4 - 229 -

Step Over (F10). El comando Step Over del menú Debug ejecuta una instrucción. Si la
instrucción contiene una llamada a función/ llamada a subrutina, la función/subrutina se
ejecuta también. Si un breakpoint del usuario es encontrado durante el Step Over, la
ejecución se detiene. Luego de que el Step Over se complete, toda la información en todas
las ventanas se actualiza.

Step Out (SHIFT+F11). El comando Step Out del menú Debug ejecuta hasta que la
función actual haya concluido. Si un breakpoint del usuario se encuentra durante el Step
Over, la ejecución se detiene. Si un comando Step Out es emitido cuando el programa está
en el nivel máximo, el programa continuará ejecutándose hasta que alcance un breakpoint
o éste sea detenido por el usuario. Luego de que el comando Step Out se complete, toda la
información en las ventanas se actualizará.

Run To Cursor (CTRL+F10). El comando Run To Cursor del menú Debug ejecuta
hasta que el programa alcance la instrucción indicada por el cursor en la ventana Source. Si
un breakpoint del usuario es encontrado durante un comando Run To Cursor, la ejecución
no se detiene. Si la instrucción indicada por el cursor nunca es alcanzada, el programa se
ejecuta hasta que este sea detenido por el usuario. Luego del comando Run To Cursor se
complete, toda información en las ventanas se actualizará. Como el comando Run To
Cursor es dependiente de la posición del cursor, esta está disponible cuando está activa la
ventana Source (ventana del editor con el código fuente).

Auto Step (ALT+F5). El comando Auto Trace del menú Debug ejecuta repetidamente
el comando Trace Into. Luego de que cada Trace Into se completa, toda la información en
todas las ventanas se actualiza. Auto Trace Into se ejecuta hasta que es detenida (por
accion del usuario) o porque un breakpoint se ha encontrado (opcional).

Set next statement. Con este comando el usuario puede colocar el marcador amarillo en
cualquier parte del código. Apunte el código fuente actual del programa y elija el comando.
El siguiente comando de depuración Run se ejecutará desde este punto.
CAPÍTULO 4: AVR STUDIO 4 - 230 -

Show next statement. Fija el marcador amarillo en la localidad actual del contador de
programa. La ventana actual es enfocada.

4.5.3. Control de los Breakpoints


El usuario puede establecer un número ilimitado de breakpoints en el código. Los
breakpoints son recordados entre sesiones.

Cuando se establece un breakpoint sobre un sitio, el breakpoint es señalado por una


marca en la barra izquierda en la ventana Source. Haciendo clic derecho con el Mouse
sobre la línea del código que contiene un breakpoint se despliega un menú, desde este el
usuario puede alternar el breakpoint entre encendido, apagado o desactivado.

Los breakpoints también pueden ser controlados desde la barra de herramientas y


desde la lista de breakpoints en la vista output; en la Figura 4.14 el usuario puede apreciar
un ejemplo.

Figura. 4.14. Breakpoints

Toggle breakpoint (F9). El comando Toggle breakpoint alterna el estado


(activado/desactivado) del breakpoint para la instrucción donde el cursor está ubicado. Esta
función estará disponible únicamente cuando la ventana Source sea la vista activa.

Disable/enable breakpoints. Los breakpoints pueden ser deshabilitados. Esto significa


que no se usarán, pero un círculo blanco mostrará donde estaban. Esto puede ser útil para
encender/apagar la detención (breaking) sin perder la posición de los breakpoints.
CAPÍTULO 4: AVR STUDIO 4 - 231 -

Clear all break points. Esta función borra todos los breakpoints establecidos,
incluyendo breakpoints que fueron desactivados.

Haciendo clic derecho con el mouse sobre un Breakpoint, aparece un cuadro de


diálogo tal como se aprecia en la Figura 4.15, aquí el usuario puede fijar algunas
condiciones para el breakpoint.

Figura. 4.15. Configuración de los Breakpoints.

Como se observa en la Figura 4.15, la ventana Breakpoint Conditions presenta las


siguientes opciones:

Iterations. Seleccionar esta casilla de verificación significa que la detención (break)


únicamente ocurrirá luego, después de varios pasos del breakpoint. Note que si usa esta
característica, la emulación no será en tiempo real. La ejecución se detiene al encontrar el
breakpoint, pero la ejecución se reanuda automáticamente hasta que el número de
iteraciones sea pasado. Las vistas del AVR Studio no se actualizan durante el descanso
temporal.

Watchpoint. Seleccionar esta casilla de verificación significa que la ejecución se detiene y


todas las vistas se actualizan cuando el breakpoint es pasado. Cuando las vistas se han
actualizado, la ejecución del programa se reanuda automáticamente. Esta condición puede
ser combinada con la condición de las iteraciones anteriores.

Show Message. Seleccionando esta opción aparecerá un mensaje en la ventana output


cuando la condición se cumple. Esto puede informar si se usan cualquiera de las
condiciones anteriores.
CAPÍTULO 4: AVR STUDIO 4 - 232 -

4.5.4. Trace
Trace es una herramienta que el usuario puede usar para examinar la conducta de sus
programas en tiempo de ejecución. Usando la funcionalidad Trace, el usuario puede
determinar el flujo de ejecución de su programa.

Trace es únicamente soportado por la plataforma ICE50.

4.5.5. Depuración de Proyectos de Código generados con otro Compilador


Para proyectos extensos en código, el ensamblador puede no ser la mejor opción,
mientras que C/C++ puede serlo. Hay varios compiladores buenos disponibles para la
familia de microcontroladores AVR, incluyendo los compiladores de IAR e Imagecraft que
deben ser comprados y el compilador GCC AVR (WinAVR) que puede ser descargado
desde varios sitios, incluyendo www.avrfreaks.com.

Usando estos compiladores, el usuario programará en un ambiente establecido por el


fabricante del compilador. El usuario debe configurar al compilador para producir código
para el modo de DEPURACIÓN, esto significa que se agregan referencias al código de
alto nivel a la fuente compilada. Cuando usted compila y enlaza, crea un archivo objeto y
ese archivo objeto se cargará directamente en AVR Studio 4.

Actualmente AVR Studio 4 soporta y automáticamente detecta UBROF (IAR),


Nordic (Ensamblador AVR), COFF (Imagecraft, CodeVision, ELAB, WinAVR, etc) y
archivos objeto tipo Intel Hex.

4.6. SIMULADOR
El AVR Simulator es un simulador para la arquitectura y dispositivos AVR. Este
simula la CPU, incluyendo todas las instrucciones, interrupciones y la mayoría de los
módulos de I/O del chip.

El AVR Simulator permite al usuario usar los comandos normales de depuración tal
como Run, Break, Reset, Single step, set breakpoints y watch variables. Las vistas I/O,
Register y Memory son totalmente funcionales usando el AVR Simulator.
CAPÍTULO 4: AVR STUDIO 4 - 233 -

El usuario debe notar que en la ventana I/O, las ventanas de memoria y registros no
se actualizan mientras el simulador está ejecutándose. Ninguno de los contenidos de estas
ventanas puede ser modificado en modo de ejecución (run mode).

4.6.1. Opciones del Simulador


El diálogo Simulator Options estará disponible, tal como se aprecia en la Figura 4.16,
mientras la sesión de depuración esté activa. Para visualizar el diálogo, selecciones el
menú [Debug] y elija [AVR Simulator Options].

Figura. 4.16. Opciones del Simulador

El diálogo Simulator Options tiene dos secciones, Device selection y Stimuli and
logging.

Device Selection
En Device Selection (Selección del Dispositivo), ilustrado con la Figura 4.17, el
usuario puede seleccionar las siguientes opciones:
CAPÍTULO 4: AVR STUDIO 4 - 234 -

Figura. 4.17. Selección del Dispositivo, Frecuencia y Bootloader

Device. Permite seleccionar el dispositivo que será simulado. La información sobre el


dispositivo se muestra en la parte derecha de la ventana. Al seleccionar otro dispositivo,
provocará que el AVR Simulator se reconfigure para el nuevo dispositivo y recargue el
proyecto.

Frecuencia. Especifica la velocidad del dispositivo que está siendo simulado. Esta
configuración no tiene efecto en la simulación, es usado únicamente para el cálculo del
valor del stop watch en la ventana I/O.

Boot loader. Si la casilla de verificación Enable Boot reset está seleccionada, el


dispositivo iniciará el funcionamiento desde la dirección boot reset cuando este es
reseteado.

La dirección boot reset es determinada por el valor en la casilla tipo lista (listbox) del
boot reset, la cual contiene todas las direcciones válidas de boot reset para el dispositivo.
La dirección también determina la dirección de inicio del Vector de Interrupción cuando se
configura el bit Selector del Vector de Interrupción (IVSEL).

No todos los dispositivos soportan boot loaders.


CAPÍTULO 4: AVR STUDIO 4 - 235 -

Enable external Memory. Si se selecciona la casilla de verificación Enable external


Memory, la SRAM externa será simulada y estará disponible para la aplicación que está
siendo ejecutada.

Si el dispositivo seleccionado no soporta SRAM externa, esta opción estará


desactivada.

4.6.2. Módulos del Simulador


Esta es una breve descripción de varios módulos de I/O que existen en dispositivos
AVR:

I/O Ports. Los puertos de I/O son simulados como en el dispositivo real. Cuando un
módulo de I/O toma el control sobre un pin, el valor leído desde el registro PINx es el
valor generado por el módulo de I/O.

Interrupciones Externas e Interrupciones por Cambio en Pin. Todas las interrupciones


externas y por cambio en pin son soportadas por el simulador.

Timer/Counters. Los Output Compare Modulators no son soportados.

Los Timer/Counters son simulados correctamente excepto:

− Timer/Counters de 16 bits, en todos los dispositivos tienen varios problemas con


PWM, preajustador y output compare.

− El Asynchronous Status Register (ASSR), no es soportado en timers con el modo


asincrónico. Esto se debe a la falta de una implementación genérica del reloj
externo.

UART y USART. El registro UDR de UART/USART únicamente puede ser modificado


desde la aplicación.
CAPÍTULO 4: AVR STUDIO 4 - 236 -

Interfaz Serial para Periféricos (SPI). SPI es soportada.

Interfaz Serial Universal (USI). USI es soportada.

Interfaz Serial de Dos Cables (TWI). TWI es soportada.

Comparador Analógico (AC). El Comparador Analógico no es soportado.

Convertidor de Analógico a Digital (ADC). Entrada Analógica no es soportada. Sin


embargo, basado en los bits Selectores del Preajustador del ADC (ADPS), el Indicador
ADIF se setea luego del número correcto de ciclos. La interrupción por culminación de la
conversión ADC es también simulada correctamente.

El registro de Datos del ADC (ADCH/ADCL) puede configurarse manualmente.

Controlador LCD. El Controlador LCD es soportado en todas los dispositivos equipados


con un Controlador LCD.

Watchdog. El Watchdog es soportado en algunos dispositivos.

4.7. RESUMEN DE MENÚS Y BARRAS DE HERRAMIENTAS

4.7.1. Resumen de Menús


En las tablas siguientes se resume los menús de AVR Studio 4, conservando en
idioma inglés el nombre de cada menú y las opciones correspondientes a los mismos para
facilitar su ubicación.
CAPÍTULO 4: AVR STUDIO 4 - 237 -

Tabla. 4.2. Menú File

Tabla. 4.3. Menú Project

Tabla. 4.4. Menú Edit


CAPÍTULO 4: AVR STUDIO 4 - 238 -

Tabla. 4.5. Menú Debug.

Tabla. 4.6. Menú Window

Tabla. 4.7. Menú Help

Tabla. 4.8. Menú View


CAPÍTULO 4: AVR STUDIO 4 - 239 -

Tabla. 4.9. Menú Tools

4.7.2. Barras de Herramientas


A continuación se hace un resumen de las barras de herramientas, incluyendo el
icono correspondiente a cada herramienta:

Create an empty text file (Crear archivo de texto vacío).


Open an existing text file (Abrir un archivo de texto existente).
Save current text file (Guardar el archivo de texto actual).
Save project (Guardar el proyecto).
Reload object file (Recargar el archivo objeto).
Cut from text file (Cortar del archivo de texto).
Copy from text file (Copiar del archivo de texto).
Paste into text file (Pegar dentro del archivo de texto).
Print text file (Imprimir el archivo de texto).
Print text file (Buscar en los archivos).
Undo editing (Deshacer cambios).
Redo editing (Rehacer cambios).
Redo editing (Buscar en el archivo actual).
Set bookmark (Ctrl+F2) (Fijar marcador).
Next bookmark (F2) (Marcador siguiente).
Previous bookmark (Marcador anterior).
Clear bookmark (Borrar marcador).
Increase indent (Aumentar sangría).
Decrease indent (Disminuir sangría).
Select font and colors for editor (Seleccionar fuente y colores para el editor).
Build project (F7) (Construir el proyecto).
Run debugger (Ejecutar el depurador).
Break debugger (Detener el depurador).
Reset debugger (Resetear el Depurador).
CAPÍTULO 4: AVR STUDIO 4 - 240 -

Exit debugger (Salir del Depurador).


Show next statement (Mostrar la siguiente instrucción).
Step into (F11).
Step over (F10).
Step out of (Shift+F11).
Run to cursor (ctrl.+F10) (Ejecutar hasta el cursor).
Auto step .
Toggle breakpoint (Alternar el estado del breakpoint).
Clear all breakpoints (Borrar todos los breakpoints).
Quick watch (Watch rápido).
Toggle watch view (Alternar mostrar/ocultar ventana Watch).
Toggle register view (Alternar mostrar/ocultar ventana Register).
Toggle memory view (Alternar mostrar/ocultar ventana Memory).
Toggle trace-view (Alternar mostrar/ocultar ventana Trace).
Toggle disassembly view (Alternar mostrar/ocultar ventana Disassembly).
CAPÍTULO 5: TUTORIAL - 241 -

CAPÍTULO 5

TUTORIALES

5.1. UTILIZACIÓN DEL FIRMWARE PRE-INSTALADO


El AVR Butterfly viene con una aplicación pre-programada llamada Firmware. Para
utilizar este Firmware, es necesario empezar por energizar el AVR Butterfly, ya sea con la
batería que entrega el fabricante o con una fuente externa de 3V.

A continuación, el usuario debe mover el joystick hacia arriba para sacar del reposo
al AVR Butterfly. Si en el LCD no se desplaza el texto “AVR BUTTERFLY”, el usuario
debe presionar el joystick hacia la izquierda hasta que se desplace dicho texto. Este es el
punto inicial del menú de la aplicación (Firmware) que se incluye en el AVR Butterfly.

En la Figura 3.5 (ver Capítulo 3), la columna de la izquierda muestra el menú


principal con los siguientes ítems:

− AVR Butterfly (AVR BUTTERFLY).


− Tiempo (TIME).
− Música (MUSIC).
− Nombre (NAME).
− Temperatura (TEMPERATURE).
− Voltaje (VOLTAGE).
− Luz (LIGHT).
− Opciones (OPTIONS).

Para moverse entre las alternativas del menú, el usuario debe mover el joystick hacia
ARRIBA o hacia ABAJO. Para entrar en un submenú, el usuario debe mover el joystick
CAPÍTULO 5: TUTORIAL - 242 -

hacia la DERECHA. Para salir de un submenú, debe mover el joystick hacia la


IZQUIERDA. Para ingresar o ajustar un valor, debe presionar el joystick en el centro,
ENTRAR.

Por ejemplo, para ajustar la fecha el usuario debe seguir el siguiente procedimiento:

1. Mover el joystick hacia ABAJO o hacia ARRIBA hasta que aparezca en el


LCD la palabra “TIME”.

2. Mover el joystick hacia la DERECHA hasta que aparezca en el LCD la palabra


“CLOCK”.

3. Mover el joystick hacia ABAJO o hacia ARRIBA hasta que aparezca en el


LCD la palabra “DATE”

4. Mover el joystick hacia la DERECHA hasta que aparezca la fecha en el


siguiente formato YY:MM:DD (año:mes:día).

5. Mover el joystick hacia la DERECHA hasta que aparezca “ADJUST DATE”.

6. Presionar el joystick en el centro, ENTRAR, y entonces aparecerá la fecha. El


primer carácter LCD, que en este caso corresponde al año, aparecerá
intermitentemente.

7. Mover el joystick hacia ARRIBA o hacia ABAJO hasta que se visualice el año
deseado. Si se desea cambiar únicamente este parámetro, mover el joystick
hacia la IZQUIERDA para guardar el cambio y abandonar el modo de ajuste de
fecha; de lo contrario, si se desea cambiar los otros parámetros, mover el
joystick hacia la DERECHA hasta que se presente intermitentemente en el LCD
el parámetro correspondiente al mes.

8. Si se desea cambiar el valor de este parámetro, mover el joystick hacia


ARRIBA o hacia ABAJO hasta que se visualice el mes deseado. Si se desea
CAPÍTULO 5: TUTORIAL - 243 -

cambiar únicamente este parámetro, mover el joystick dos veces hacia la


IZQUIERDA para guardar el cambio y abandonar el modo de ajuste de fecha;
de lo contrario, si se desea cambiar el último parámetro, mover el joystick hacia
la DERECHA hasta que se presente intermitentemente en el LCD el parámetro
correspondiente al día.

9. Mover el joystick hacia ARRIBA o hacia ABAJO hasta que se visualice el día
deseado, entonces mover el joystick hacia la DERECHA para guardar los
cambios y abandonar el modo de ajuste de la fecha.

10. Mover el joystick hacia la IZQUIERDA para visualizar la fecha actual. La


fecha se incrementará y actualizará automáticamente cada vez que el reloj de
esta aplicación (firmware) alcance las 24 horas, en el LCD: 00:00:00.

5.2. WINAVR
WinAVR es un conjunto de herramientas de desarrollo para microcontroladores
RISC AVR de Atmel, basado en software de código abierto y compilado para funcionar en
la plataforma Microsoft Windows. WinAVR incluye las siguientes herramientas:

− avr-gcc, el compilador de línea de comandos para C y C++.


− avr-libc, la librería del compilador que es indispensable para avr-gcc.
− avr-as, el ensamblador.
− avrdude, la interfaz para programación.
− avarice, la interfaz para JTAG ICE.
− avr-gdb, el depurador.
− Programmers Notepad, el editor.
− MFile, generador de archivo makefile.

5.2.1. Instalación de WinAVR


Para obtener gratuitamente WinAVR, es necesario visitar la página Web
http://sourceforge.net/projects/winavr y descargar la última versión de este software.
CAPÍTULO 5: TUTORIAL - 244 -

Para instalar WinAVR es necesario ejecutar el archivo descargado y aceptar las


opciones predeterminadas durante la instalación.

5.2.2. El Archivo Makefile


Un makefile es un archivo que contiene información que dice al compilador los
comandos que tiene que ejecutar, que archivos compilar y enlazar, la clase de salidas a
crear, y también puede hacer otras cosas como programar el chip.

La función ‘Make all’ de WinAVR busca el archivo makefile en el directorio actual


y lo ejecuta; entonces, compila los archivos de código fuente y crea un archivo con
extensión *.hex.

El archivo makefile se encuentra en el directorio c:\WinAVR\Sample. Este archivo


debe llamarse makefile, sin ninguna extensión. Puesto que no tiene extensión, el usuario
puede utilizar cualquier editor de texto para abrirlo y editarlo; se recomienda usar el
Programmers Notepad de WinAVR.

Para compilar correctamente el código fuente desarrollado para el microcontrolador


ATmega169, que en este caso comanda al AVR Butterfly, el usuario debe modificar el
archivo makefile que viene con WinAVR; a continuación se explica las modificaciones
necesarias:

1. Copiar el archivo makefile desde c:\WinAVR\Sample y pegarlo en el directorio


actual de la aplicación.

2. Editar el archivo makefile utilizando el Programmers Notepad de WinAVR, la


primera línea de interés es la línea 34. Esta resulta ser la línea donde se configura
el tipo de MCU y se presenta como en la Figura 5.1. El usuario debe cambiar la
MCU atmega128 por la MCU atmega169, tal como indica la Figura 5.2. El
usuario puede encontrar una lista de todos los tipos de MCU soportados y sus
nombres en la documentación de avr-libc (C:\WinAVR\doc\avr-libc\avr-libc-
user-manual\index.html).
CAPÍTULO 5: TUTORIAL - 245 -

Figura. 5.1. Archivo Makefile, tipo predeterminado de MCU

Figura. 5.2. Archivo Makefile, tipo de MCU para la aplicación actual

3. La siguiente línea de interés es la línea 40, que especifica el nombre del proyecto,
tal como se aprecia en la Figura 5.3. El nombre del proyecto es el nombre del
archivo fuente principal escrito en lenguaje C, que es el que contiene a la función
principal main( ). Por ejemplo, tal como se observa en la Figura 5.4, el nombre
del proyecto puede ser nombre_del_programa_actual.c; entonces, el archivo
HEX resultante será nombre_del_programa_actual.hex y el archivo EXTCOFF
resultante será nombre_del_programa_actual.cof.

Figura. 5.3. Archivo Makefile, nombre predeterminado del proyecto


CAPÍTULO 5: TUTORIAL - 246 -

Figura. 5.4. Archivo Makefile, nombre del proyecto actual

4. En la línea 44 el usuario puede especificar archivos adicionales de código fuente,


escritos en lenguaje C, que se usan en el proyecto. Por ejemplo,
archivo_adicional.c, que en este caso representa un archivo de código fuente
adicional que contiene código necesario para la aplicación y es accedido por el
código principal, debe ser especificado en esta línea añadiendo el símbolo ‘\’
seguido del nombre del archivo adicional, tal como se indica en la Figura 5.6.

Figura. 5.5. Archivo Makefile, sin archivos adicionales de código fuente

Figura. 5.6. Archivo Makefile, especificación de un archivo adicional de código fuente


CAPÍTULO 5: TUTORIAL - 247 -

5. En la línea 237 el usuario puede especificar el tipo de archivos que se generará


durante la compilación. En la Figura 5.7 se aprecia los tipos de archivos que se
generan por defecto. Para poder simular y depurar proyectos utilizando AVR
Studio, versión 4.07 o superior, el usuario debe añadir en esta línea la palabra
‘extcoff’ tal como se indica en la Figura 5.8; entonces, se generará
adicionalmente el archivo EXTCOFF que contiene la información necesaria para
la simulación y depuración de proyectos en AVR Studio. Este tipo de archivo
tiene la extensión *.cof.

Figura. 5.7. Archivo Makefile, archivos generados en la compilación

Figura. 5.8. Archivo Makefile, especificación para que se genere el archivo COFF
CAPÍTULO 5: TUTORIAL - 248 -

6. Finalmente, el usuario debe guardar los cambios y cerrar la edición del archivo
makefile.

5.2.3. El Programmers Notepad


Programmers Notepad es una herramienta para edición de archivos que incluye
resaltamiento de sintaxis. Este es ideal para llamar a la utilidad Make, que ejecuta el
makefile, que a su vez llama al compilador, enlazador (linker), y las otras utilidades para
construir el software que gobernará en el microcontrolador.

Programmers Notepad toma los resultados de la compilación y los despliega en una


ventana. El usuario puede hacer clic sobre una advertencia o sobre un error para que el
Programmers Notepad vaya inmediatamente hacia la línea donde ocurre una advertencia o
un error.

5.2.4. Creación de Proyectos con WinAVR


Para crear un proyecto con WinAVR, el usuario debe seguir el siguiente
procedimiento:

1. Abrir el Programmers Notepad, ya sea usando el acceso directo en el escritorio o


ejecutando el archivo pn.exe que se encuentra en el directorio del WinAVR
(c:\WinAVR\pn\pn.exe).

2. Iniciar un nuevo archivo en lenguaje C, tal como indica la Figura 5.9.


CAPÍTULO 5: TUTORIAL - 249 -

Figura. 5.9. Programmers Notepad, creación de archivo C

3. Escribir el código tal como indica la Figura 5.10. Como ejemplo, se utiliza el
siguiente código escrito en lenguaje C, este incluye errores para más adelante
demostrar los resultados que se despliegan luego de la compilación.

#include <avr/io.h>
#include <avr/delay.h>

void main (void)


{
unsigned char contador;
//configurar PORTB como salida
DRB = 0xFF;
while (1)
{
//poner PORTB.2 en alto
PORTB |= 1<<2;
CAPÍTULO 5: TUTORIAL - 250 -

//esperar (10 * 120000) ciclos = esperar 1200000 ciclos


contador = 0;
while (contador != 5)
{
//esperar (30000 x 4) ciclos = esperar 120000 ciclos
_delay_loop_2(30000);
contador++;
}
//poner PORTB.2 en bajo
PORTB &= ~(1<<2);
//esperar (10 * 120000) ciclos = esperar 1200000 ciclos
contador = 0;
while (contador != 5)
{
//esperar (30000 x 4) ciclos = esperar 120000 ciclos
_delay_loop_2(30000);
contador++;
}
}
return 1;
}
CAPÍTULO 5: TUTORIAL - 251 -

Figura. 5.10. Programmers Notepad de WinAVR, escritura de código

Al analizar la primera línea de código (#include <avr/io.h>), se observa que se


incluye el archivo de cabecera principal para la MCU AVR. En este archivo están
definidos todos los registros (tal como DDRB, PORTB, etc) para la MCU AVR
seleccionada por el usuario en el archivo makefile. Todos los archivos de
cabecera se encuentran en el directorio c:\WinAVR\avr\include. El resto del
código es de fácil comprensión, ya que son sentencias usadas frecuentemente en
lenguaje C, por lo que se omite su explicación.

4. Guardar el archivo en el directorio del proyecto, es recomendable asignarle un


nombre que tenga relación con la aplicación que se desea desarrollar. Puesto que
la aplicación utilizada como ejemplo en esta sección trata sobre la intermitencia
de un LED en el pin 2 del Puerto B, entonces el nombre del directorio del
proyecto será LED y el nombre del archivo fuente C será led.c.

5. Modificar el archivo makefile, tal como se indica en la Sección 5.2.2.


CAPÍTULO 5: TUTORIAL - 252 -

6. Utilizando la función Make all, compilar el código fuente como se indica en la


Figura 5.11.

Figura. 5.11. Programmers Notepad de WinAVR, compilación del código fuente

Para este ejemplo, se obtendrá el resultado mostrado en la Figura 5.12. En


la ventana Output se aprecia el resultado de la compilación, aquí el usuario puede
visualizar los errores y las advertencias luego de la compilación.

Figura. 5.12. WinAVR, resultado de la compilación de código fuente con errores


CAPÍTULO 5: TUTORIAL - 253 -

7. Depurar el código fuente del proyecto valiéndose de la información de los


mensajes de error y advertencia que se presentan en la ventana Output. Para ir a
la línea del código que presenta error o advertencia, el usuario debe hacer clic en
cada mensaje de error o advertencia que se visualiza en la ventana Output.

8. Proceder a compilar nuevamente el archivo fuente. Cuando la compilación se


ejecuta exitosamente, sin errores, la ventana Output se presenta como en la
Figura 5.13.

Figura. 5.13. Ventana Output de Programmers Notepad, resultados de la compilación exitosa

9. Verificar que los archivos generados, en el directorio del proyecto, sean los
necesarios para la aplicación. En la Figura 5.14 se observa los archivos generados
luego de la compilación, además el archivo fuente (en este ejemplo: led.c) y el
archivo makefile. En esta figura se aprecia que constan los archivos HEX y
COFF.
CAPÍTULO 5: TUTORIAL - 254 -

Figura. 5.14. Archivos generados luego de la compilación con WinAVR

5.3. SIMULACIÓN DE PROYECTOS EN AVR STUDIO 4


AVR Studio 4 es un Entorno de Desarrollo Integrado para depurar software AVR.
AVR Studio permite simulación de chip y emulación In-circuit para los
microcontroladores AVR. La interfaz del usuario está diseñada especialmente para facilitar
su uso y para visualizar de forma general la información completa. AVR Studio 4 usa la
misma interfaz de usuario para ambas, depuración y simulación, permitiendo rápido
aprendizaje.

AVR Studio usa el archivo objeto COFF para la simulación. Este archivo es creado
con el compilador C al seleccionar COFF como el tipo de archivo de salida. Para más
información al respecto, revisar la sección 5.2.

La simulación del software para el microcontrolador ATmega169, utilizando AVR


Simulator de AVR Studio 4, debe hacerse según el procedimiento que se lista a
continuación:
CAPÍTULO 5: TUTORIAL - 255 -

1. Abrir y cargar el archivo COFF extendido (de extensión *.cof) que se genera con
la compilación en el directorio del proyecto. En este ejemplo, este archivo se
llama led.cof, tal como se observa en la Figura 5.15 (b).

a) b)
Figura. 5.15. AVR Studio, a) localizar el directorio del proyecto y b) abrir el archivo COFF

2. En la ventana que emerge a continuación, seleccionar la plataforma para


depuración; la que se utiliza es AVR Simulator. Ver Figura 5.16.

Figura. 5.16. AVR Studio, selección de la Plataforma para Depuración

3. Seleccionar el dispositivo (Device) empleado en la aplicación, en este caso el


ATmega169 que es el microcontrolador que comanda al AVR Butterfly. Ver
Figura 5.17.
CAPÍTULO 5: TUTORIAL - 256 -

Figura. 5.17. AVR Studio, selección del Dispositivo a Simular

4. Hacer clic en el botón Finish; entonces, AVR Studio aparecerá tal como se
observa en la Figura 5.18.

Figura. 5.18. AVR Studio, interfaz del usuario en AVR Simulator

5. En la barra de herramientas de AVR Studio, hacer clic en Debug; entonces,


seleccionar la opción AVR Simulator Options del menú que emerge como en la
Figura 5.19.
CAPÍTULO 5: TUTORIAL - 257 -

Figura. 5.19. AVR Studio, Menú Debug

6. En la ventana Simulator Options que emerge a continuación se observa que la


opción Frequency tiene el valor predeterminado de 4 MHz, tal como se aprecia
en la Figura 5.20 (a). El usuario debe cambiar este parámetro a 8 MHz, tal como
se observa en la Figura 5.20 (b), puesto que el ATmega169V del AVR Butterfly
funciona a una frecuencia de 8 MHz. Para salir de esta ventana, el usuario debe
aceptar el cambio haciendo clic en OK.

a) b)
Figura. 5.20. AVR Studio, Opciones del Simulador
CAPÍTULO 5: TUTORIAL - 258 -

7. En la ventana Workspace de AVR Studio, expandir los componentes de los


recursos utilizados en la aplicación; en este caso, PORTB (Puerto B) y Processor
(Procesador), tal como se indica en la Figura 5.21. En este ejemplo, PORTB
simulará la intermitencia de un led conectado en el Pin 2 del Puerto B. Processor
contiene el Cycle Counter (Contador de Ciclos), que en este caso se utilizará para
verificar el número de ciclos que transcurre cuando se ejecuta la sentencia
_delay_loop_2(30000).

Figura. 5.21. AVR Studio, visualización de recursos dentro de la ventana Workspace


CAPÍTULO 5: TUTORIAL - 259 -

8. En la ventana Editor (Editor Window), hacer clic derecho sobre la variable


‘contador’ y seleccionar Add to Watch: contador, tal como indica la Figura 5.22
(a); entonces, aparecerá la ventana Watch y la variable ‘contador’ dentro de ella,
tal como se observa en la Figura 5.22 (b). Esto servirá para, utilizando la
herramienta Watch del Depurador, analizar el comportamiento de la variable
‘contador’ dentro del programa.

a) b)
Figura. 5.22. AVR Studio, añadir variable a la ventana Watch

9. Hacer clic dentro de la ventana Editor y posicionar el cursor en la línea 12


(PORTB |= 1 <<2;); entonces, presionar la tecla F9 para activar un Breakpoint
(punto de detención) en esa línea. Consecuentemente aparecerá un círculo de
color rojo a la izquierda de esa línea de código, este indica que se ha colocado un
Breakpoint en aquella línea.

10. Repetir el paso nueve para activar los breakpoints en las líneas de código de
mayor interés, tal como se observa en la Figura 5.23.
CAPÍTULO 5: TUTORIAL - 260 -

Figura. 5.23. AVR Studio, activación de Breakpoints

11. Presionar la tecla F11 y observar como se incrementa el contador de programa


(Program Counter) y el Contador de Ciclos (Cycle Counter) en la ventana
Workspace, en el campo Processor.

12. Presionar la tecla F11 y observar DDRB dentro de PORTB, en la ventana


Workspace. Se aprecia que DDRB cambia de estado, indicando que todos los
pines del Puerto B se han configurado como salidas, tal como se aprecia en la
Figura 5.24.
CAPÍTULO 5: TUTORIAL - 261 -

Figura. 5.24. AVR Studio, Puerto B configurado como salida de datos

13. Presionar la tecla F11 y observar PORTB dentro de PORTB, en la ventana


Workspace. En este se aprecia que el bit 2 de PORTB cambia de estado,
indicando que se ha puesto en alto el Pin 2 del Puerto B. Esto se aprecia en la
Figura 5.25.

Figura. 5.25. AVR Studio, Pin 2 del Puerto B en nivel alto

14. Presionar la tecla F11 y observar el Contador de Ciclos, este tiene el valor de 39,
tal como se observa en la Figura 5.26 (a).
CAPÍTULO 5: TUTORIAL - 262 -

15. Presionar la tecla F5 y analizar el Contador de Ciclos, este ahora tiene el valor de
120 040, tal como se aprecia en la Figura 5.26 (b). Esto se debe a que la sentencia
_delay_loop_2(30000) detiene la ejecución de la MCU durante 4 x 30 000 ciclos,
o sea durante 120 000 ciclos.

a) b)
Figura. 5.26. AVR Studio, Contador de Ciclos luego de la función _delay_2

16. Presionar la tecla F5 y observa el valor de la variable ‘contador’ en la ventana


Watch. En esta se observa que el valor de la variable ‘contador’ se incrementa,
como en la Figura 5.27, luego de pulsar la tecla F5; debido a la sentencia
contador++, en el código del programa.

Figura. 5.27. AVR Studio, análisis de variables en la ventana Watch

17. Repetir los pasos 15 y 16, hasta que la variable ‘contador’ tenga el valor de 5,
como se observa en la Figura 5.28. Esto se debe a que las líneas analizadas en
esos pasos están dentro de un lazo while(contador != 5). Se observará que la
variable contador se incrementa en pasos de 1 y el valor del Contador de Ciclos
se incrementa en pasos de 120000.
CAPÍTULO 5: TUTORIAL - 263 -

Figura. 5.28. AVR Studio, análisis de variables en la ventana Watch

18. Presionar repetidamente la tecla F5 y analizar las líneas que aparecen con
breakpoints en la Figura 5.23.

19. Luego de varias pruebas, si se llega a la conclusión de que el código fuente


funciona correctamente, se puede utilizar el archivo HEX correspondiente para
programar el microcontrolador ATmega169; caso contrario, se deberá depurar y
compilar nuevamente el código.

5.4. PROGRAMACIÓN DEL AVR BUTTERFLY USANDO UNA PC


El Kit AVR Butterfly está equipado con un circuito convertidor de nivel para la
interfaz RS-232, este permitir la comunicación con la PC sin la necesidad de hardware
adicional.

AVR Studio 4 incluye un programador que utiliza la interfaz serial RS-232 de la PC,
este programador es el AVR Prog. Cuando se llama al AVR Prog, este busca un
dispositivo conectado a cualquiera de sus puertos COM; el dispositivo conectado debe
estar energizado y ejecutando su sección de arranque, para que el AVR Prog reconozca el
dispositivo y determine el puerto COM que utilizará en el proceso de programación.

Entonces, para programar el Kit AVR Butterfly mediante una PC, se recomienda al
usuario seguir el procedimiento que se detalla a continuación:

1. Conectar el cable para la interfaz serial RS-232 entre la PC y el AVR Butterfly,


tal como se indica en la Figura 5.29.
CAPÍTULO 5: TUTORIAL - 264 -

Figura. 5.29. Conexión Serial entre la PC y el AVR Butterfly

2. En la PC, ejecutar AVR Studio 4.

3. Presionar el joystick del AVR Butterfly en el centro y mantenerlo en esa


posición.

4. Energizar el AVR Butterfly con una fuente de voltaje de 3 V.

5. En AVR Studio 4, en la barra de herramientas, abrir el menú Tools. En este menú


se visualiza la función AVR Prog, tal como se observa en la Figura 5.30 (a);
entonces, seleccionar dicha función para que aparezca la ventana AVRprog que
se observa en la Figura 5.30 (b).
CAPÍTULO 5: TUTORIAL - 265 -

a) b)
Figura. 5.30. AVR Studio, AVR Prog

6. Quitar la presión que se mantiene sobre el joystick del AVR Butterfly desde el
paso 3.

7. Hacer clic en el botón Browse de la Ventana AVRprog, para localizar y cargar el


archivo HEX generado con la compilación en el directorio del proyecto. En este
caso, utilizar el proyecto utilizado como ejemplo en la sección 5.3 y cargar el
archivo led.hex, tal como se aprecia en las Figuras 5.31 y 5.32.

Figura. 5.31. AVR Studio, AVRprog, carga de archivo HEX


CAPÍTULO 5: TUTORIAL - 266 -

Figura. 5.32. AVR Studio, AVRprog, archivo HEX cargado

8. Hacer clic en el botón Advanced de la ventana AVRprog, para acceder a las


opciones para programar los Lock Bits, tal como se aprecia en la Figura 5.33. En
este ejemplo no se harán cambios. Hacer clic en el botón Close.

Figura. 5.33. AVR Studio, AVRprog, opciones avanzadas (Lock bits)

9. Hacer clic en el botón Program de la ventana AVRprog, para programar el


microcontrolador ATmega169V del AVR Butterfly y actualizarlo con la nueva
CAPÍTULO 5: TUTORIAL - 267 -

aplicación. Entonces, se apreciará el proceso de grabación del microcontrolador


tal como en la Figura 5.34.

Figura. 5.34. AVR Studio, AVRprog, proceso de grabación del microcontrolador

10. Presionar el botón Exit de la ventana AVRprog, para salir del modo de
programación.

Para que el AVR Butterfly empiece a funcionar, el usuario debe mover el Joystick
hacia arriba haciendo que la MCU salte del sector de arranque (boot loader) hacia el sector
de la aplicación (programa del usuario), y entonces se ejecute el programa escrito por el
usuario. Desde aquí, el usuario puede evaluar el desempeño del software-hardware del
AVR Butterfly.

5.5. CONEXIONES EXTERNAS EN EL KIT AVR BUTTERFLY

5.5.1. PORTB y PORTD


PORTB y PORTD, puerto B y puerto D respectivamente, son accesibles
externamente en el AVR Butterfly a través de sus conectores externos distribuidos como se
indica en la Figura 5.35.
CAPÍTULO 5: TUTORIAL - 268 -

a) b)
Figura. 5.35. AVR Butterfly, PORTB (a) y PORTD (b)

Para facilitar el acceso a PORTD y PORTB, es necesario soldar Headers de 10 pines


en los conectores (holes) del AVR Butterfly. Para hacerlo se recomienda utilizar un
espadín como el que se observa en la Figura 5.36.

Figura. 5.36. Espadín

Como se observa en la Figura 5.35, es necesario dividir el espadín en segmentos de


5 pines para formar Headers de 10 pines que coincidan con los agujeros de los conectores
(holes) del AVR Butterfly. Entonces, se debe soldar los pines de dichos segmentos de tal
modo que queden fijos y parecidos a lo que se observa en la Figura 5.37.

a) b)
Figura. 5.37. AVR Butterfly, instalación de Headers: soldaduras (a) y vista frontal (b)

Una vez mejorado el acceso a las conexiones externas del AVR Butterfly, es
necesario disponer de cables que permitan conectarlo a dispositivos externos. Una solución
recomendable es el uso de buses de datos de 10 hilos acoplados a Headers plásticos de 10
entradas, como los que se aprecian en la Figura 5.38. Estos buses y Headers no necesitan
CAPÍTULO 5: TUTORIAL - 269 -

herramientas especiales para su fabricación, ya que los Headers plásticos se acoplan a los
buses mediante presión.

Figura. 5.38. Buses de datos de 10 hilos acoplados a Headers de 10 entradas

5.5.2. USART
En el AVR Butterfly, USART es accesible a conexiones externas mediante
conectores de tres pines. Para mejorar el acceso, es necesario soldar un segmento de
espadín de 3 pines, tal como se observa en la Figura 5.37.

Una vez optimizado el acceso a USART, es necesario un cable para interfaz serial
RS-232. Para el un extremo del cable, se recomienda usar un conector de 3 entradas, como
el que se aprecia en la Figura 5.39 (a), que sea compatible con la dimensión del conector
soldado en el AVR Butterfly. En el otro extremo del cable, se recomienda utilizar un
conector hembra DB-9 compatible con el conector de la PC, como el que se muestra en la
Figura 5.39 (d). En lo que respecta al cable, es recomendable usar uno flexible de cuatro
hilos.
CAPÍTULO 5: TUTORIAL - 270 -

En la Figura 5.39 se muestra la fabricación de cable para la interfaz serial RS-232; y


en la Figura 5.40 se muestra la conexión entre la PC y el AVR Butterfly, utilizando el
cable fabricado para la interfaz serial.

a) b)

c) d)
Figura. 5.39. Cable para interfaz serial RS-232

Figura. 5.40. PC (RS-232) y AVR Butterfly (USART), conectados a través de la interfaz serial

5.5.3. ADC
Para facilitar el acceso a las conexiones externas del ADC del AVR Butterfly, canal
ADC1 del microcontrolador ATmega169V, es necesario soldar un segmento de espadín de
2 pines en los conectores del ADC en el Kit, tal como se indica en la Figura 5.41. Además,
es recomendable un cable de 2 hilos acoplado a un conector hembra compatible con la
dimensión del espadín soldado para este propósito.
CAPÍTULO 5: TUTORIAL - 271 -

Figura. 5.41. AVR Butterfly, conexión externa para el ADC

5.5.4. FUENTE DE ALIMENTACIÓN EXTERNA


Tal como se aprecia en la Figura 5.35, el AVR Butterfly puede ser
alimentado/energizado por una fuente de voltaje externa de 3 V, a través de los pines
VCC_EXT y GND de los conectores externos PORTB y PORTE. Por comodidad, se
recomienda utilizar dos baterías tipo AA de 1.5 V y un porta-baterías para las mismas, tal
como se muestra en la Figura 5.42.

Figura. 5.42. Baterías AA de 1.5 V y porta-baterías


CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 272 -

CAPÍTULO 6

PRÁCTICAS DE LABORATORIO

6.1. PRÁCTICA 1

6.1.1. Tema
Lectura y Escritura en Puertos de I/O Digitales Generales.

6.1.2. Objetivo
− Exponer el procedimiento para acceder a los puertos de I/O digitales generales.
− Escribir el código fuente mediante el compilador WinAVR, para acceder a los
puertos de I/O digitales generales.
− Leer y escribir en los puertos de I/O digitales generales.

6.1.3. Materiales

Tabla. 6.1. Lista de Materiales


Cantidad Unidad Item
1 u AVR Butterfly
1 u Dip Switch de 8 posiciones
8 u Leds de propósito general
16 u Resistencias de 330 ohm, 1/8 Watt
2 u Bus de datos de 10 hilos, con Headers
1 u Project Board
2 u Baterías tipo AA - 1,5 V
1 u Porta Baterías AA
40 cm Cable multipar de 8 hilos
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 273 -

6.1.4. Marco Teórico

Puertos de I/O Digitales Generales


A cada puerto de I/O le son asignadas tres ubicaciones de dirección de memoria de
I/O, una a cada uno de los siguientes registros: Registros de Datos – PORTx, el Registro de
Dirección de Datos – DDRx, y los Pines de Entrada del Puerto – PINx. Los Pines de
Entrada del Puerto son únicamente de lectura, mientras que el Registro de Datos y el
Registro de Dirección de Datos son de lectura/escritura.

Por ejemplo para el PUERTO A:

Registro de Datos del Puerto A – PORTA

Registro de Dirección de Datos del Puerto A – DDRA

Dirección de Pines de Entrada del Puerto A – PINA

Para poder emplear los puertos de E/S es necesario primeramente configurar el


DDRx. Cuando se escribe con “0” (cero lógico) en uno de sus bits, el puerto
correspondiente resulta ser una entrada de datos en el pin correspondiente a la posición en
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 274 -

el DDRx; caso contrario, si es escrito con “1” (uno lógico), el pin correspondiente será una
salida de datos.

Cuando el programador desea leer un pin/puerto, configurado como entrada de datos,


debe leer el registro PINx correspondiente al pin/puerto que emplea como entrada de datos.
En cambio, cuando el programador desea escribir en un pin/puerto debe escribir en el
registro PORTx correspondiente al pin/puerto que emplea como salida de datos.

Para más detalle, revisar la Sección 2.10 del Capítulo 2.

6.1.5. Desarrollo
El programador debe empezar por desarrollar un sencillo diagrama de bloques,
definiendo los puertos/pines que empleará como I/O, luego éste le servirá para tener mayor
claridad en el momento de escribir el código.

En el AVR Butterfly se tiene acceso, a través de conexiones externas, a dos de los


puertos de 8 bits del microcontrolador ATmega169. Estos puertos son el puerto B y el
puerto D, por lo que en el diagrama de bloques mostrado en la Figura 6.1 utiliza el puerto
B para entrada de datos y el puerto D para salida de datos.

PINB0 PORTD0

PINB1 PORTD1

PINB2 PORTD2

PINB3 PORTD3
MCU
PUERTO B PUERTO D
PINB4 PORTD4

PINB5 PORTD5

PINB6 PORTD6

PINB7 PORTD7

Figura. 6.1. Diagrama de Bloques de los recursos utilizados en la Práctica 1


CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 275 -

Basándose en el diagrama de bloques mostrado en la Figura 6.1, el programador debe


ir al siguiente paso que es escribir el código fuente que controlará al dispositivo. La
codificación (escritura del código fuente) y compilación del código fuente se la hace
mediante el compilador WinAVR como se indica en el Capítulo 5.

Al momento de codificar el programador debe incluir los archivos de cabecera


necesarios para la aplicación. En la presente práctica únicamente es necesaria la cabecera
avr/io.h, que contiene la definición de los periféricos y registros con los nombres que
especifica la documentación de ATMEL para cada microcontrolador.

#include <avr/io.h>

Luego se debe declarar la función main que debe ser del tipo int (entero) y se debe
especificar que no contiene ningún argumento (void); además, debido a que main() es de
tipo entero entonces debe retornar un valor entero:

int main(void)
{

return 0;
}

Luego, dentro de main(), se debe empezar por definir cuales pines/puertos se


utilizarán como entradas o salidas (ver Figura 6.1). Puesto que se utilizarán todas las líneas
del puerto B como entradas, entonces se debe escribir con “0” (cero lógico) en todos los
bits del registro DDRB:

DDRB = 0x00;

Debido a que todas las líneas del puerto D se utilizarán como salidas, entonces se
debe escribir con “1” (uno lógico) en todos los bits del registro DDRD de la siguiente
forma:
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 276 -

DDRD = 0xFF;

Como se puede notar, los valores asignados están en formato hexadecimal;


traduciendo al formato binario:

DDRB = 0x00 (hexadecimal) = 00000000 (binario)


y
DDRD = 0xFF (hexadecimal) = 11111111 (binario)

Luego, en vista de que no es necesario el empleo de variables adicionales, no se


declarará ninguna. Se procede directamente a escribir el código que comandará el
microcontrolador y para ello se escribe el lazo cerrado que caracteriza al programa
principal de cualquier microcontrolador, y permite la ejecución continua e infinita del
código contenido en su interior:

for(;;)
{
//código
}

Dentro del lazo infinito, escribir las sentencias necesarias para la presente práctica.
En este caso, el microcontrolador leerá el valor lógico del puerto B a través del registro
PINB e inmediatamente escribirá aquel valor en el registro PORTD, dando como resultado
la escritura de dicho valor lógico en los pines del puerto D. Esta sentencia se ejecutará
infinitamente, leyendo el puerto B y escribiendo en el puerto D.

PORTD = PINB;

Entonces se debe proceder a la compilación y la generación de los archivos .hex y


.cof. Para ello es necesario cambiar previamente el archivo makefile (refiérase al Capítulo
5) como se indica en las Figuras 6.2 y 6.3. Para editar el archivo makefile se puede utilizar
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 277 -

el Programmers Notepad de WinAVR o cualquier procesador de texto como MS Word,


WordPad, Bloc de Notas, etc.

Figura. 6.2. Archivo Makefile, sin cambios

El programador deberá cambiar el parámetro MCU (línea de código #34) y TARGET


(línea de código #40), reemplazando la MCU actual por la Atmega169 y el TARGET por
el nombre del archivo que contiene el código fuente actual (sin la extensión *.C):

Figura. 6.3. Archivo Makefile, luego de los cambios necesarios

Una vez finalizado el cambio de parámetros del archivo makefile, como se aprecia en
la Figura 6.3, se lo debe guardar en la carpeta que contiene el archivo fuente, conservando
el nombre makefile y sin extensión.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 278 -

Lo siguiente es compilar (Make all), que en palabras simples significa generar el


archivo *.hex; luego, generar el archivo *.cof (Make Extcoff), que es generar el archivo
necesario para la simulación. Ver Figura 6.4.

a) b)
Figura. 6.4. WinAVR, generación de los archivos (a)*.hex y (b)*.cof

Antes de cargar el programa en el microcontrolador, es recomendable evaluar dicho


programa con el AVR Simulator del AVR Studio (ver Capítulo 5) y realizar la depuración
correspondiente.

Una vez culminada la simulación de forma satisfactoria, se procede a descargar el


programa (archivo *.hex) en el microcontrolador ATmega169 que comanda al AVR
Butterfly.

Finalmente, armar el circuito como indica el esquema de conexiones mostrado en la


Figura 6.15 y proceder a hacer las pruebas.

Para evaluar el funcionamiento software-hardware se debe conmutar los interruptores


del DIP switch, con la finalidad de dar los niveles de voltaje en los pines del puerto B.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 279 -

Estos niveles deberán reflejarse idénticamente en los LEDs conectados en los pines del
puerto D.

6.1.6. Código Fuente

//LecturaEscritura.c

#include <avr/io.h>

int main(void)
{
DDRB = 0x00;
DDRD = 0xFF;

for(;;)
{
PORTD = PINB;
}
return 0;
}

6.1.7. Simulación
Cargar el archivo generado con la extensión *.cof, en este caso LecturaEscritura.cof,
como se indica en la Figura 6.5.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 280 -

Figura. 6.5. AVR Studio 4, carga del archivo *.cof para simular

Seleccionar la plataforma para depuración, la que se utilizará es el AVR Simulator;


luego, seleccionar el dispositivo empleado en la aplicación, en este caso el ATmega169
que es el microcontrolador que comanda al AVR Butterfly. Ver Figura 6.6.

Figura. 6.6. AVR Studio 4, selección del AVR Simulator y del ATmega169

En el árbol que se visualiza en la ventana Workspace, como se aprecia en la Figura


6.7, expandir los componentes de los puertos utilizados. En este caso, los puertos utilizados
son el puerto B y el puerto D.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 281 -

Figura. 6.7. AVR Simulator

Presionar continuamente la tecla F11 para ejecutar, paso a paso, la aplicación


actualmente cargada, entonces se observará que el programa de la aplicación se ejecuta
línea por línea.

Figura. 6.8. AVR Simulator, simulación de la configuración de los puertos de I/O

Como se observa en la Figura 6.8, exclusivamente para esta aplicación, los puertos se
configuran luego de ejecutarse las dos primeras líneas de código, el puerto B como entrada
y el puerto D como salida.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 282 -

Hacer clic con el mouse en cualquiera de los bits del registro PINB, puesto que éste
es el registro de entrada del puerto configurado como entrada en esta aplicación. Como
ejemplo, se observa en la Figura 6.9 que se seleccionó el bit 0 del registro PINB luego de
haber hecho clic con el mouse en aquel bit, asignándole el valor de uno lógico. Cuando la
casilla correspondiente a la posición de bit de un registro aparece rellenada significa que se
le ha asignado el valor de uno lógico; de lo contrario, significa que tiene asignado un cero
lógico. Presionar F11.

Figura. 6.9. AVR Simulator, simulación de escritura en PINB0

Como se aprecia en la Figura 6.10, el pin leído en el puerto B se refleja en el puerto


que está configurado como salida, en este caso el puerto D, luego de la instrucción
correspondiente.

Figura. 6.10. AVR Simulator, simulación de lectura del puerto B y escritura en el puerto D
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 283 -

Luego, el usuario puede seguir cargando bits en PINB y se dará cuenta que,
ejecutando el programa (F11), el bit escrito en el puerto de entrada se reflejará en la misma
posición pero en el puerto de salida.

Figura. 6.11. AVR Simulator, simulación de escritura en PINB5

Figura. 6.12. AVR Simulator, simulación de lectura del puerto B y escritura en el puerto D

Luego de varias pruebas, se llega a la conclusión de que el código fuente funciona


correctamente y puede ser utilizado para programar el microcontrolador ATmega169 en el
AVR Butterfly; caso contrario, se deberá depurar el código si éste no satisface los
requerimientos del programador
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 284 -

6.1.8. Programación del AVR Butterfly


Para programar el microcontrolador Atmega169 del AVR Butterfly, se deberá
ejecutar el AVR Prog en el AVR Studio al mismo tiempo que se energiza al AVR
Butterfly. Como indica la Figura 6.13, utilizando el botón Browse se procede a localizar el
archivo con la extensión *.hex que se generó luego de la compilación; en este caso se
llama LecturaEscritura.hex.

Figura. 6.13. AVR Prog, localización del archivo *.hex

Una vez cargado el archivo *.hex, se deberá presionar el botón Program en la sección
Flash del AVR Prog, como se aprecia en la Figura 6.14, ya que el programa residirá en la
memoria Flash de Programa.

Figura. 6.14. AVR Prog, programación del ATmega169


CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 285 -

Cuando se observe “Erasing Devise…Programming…Verifying…OK” en el AVR


Prog, el microcontrolador ya estará programado. El usuario deberá presionar el botón Exit
(salir) del AVR Prog para salir del modo de programación.

Para que el AVR Butterfly empiece a funcionar, el usuario debe mover el Joystick
hacia arriba para que el microcontrolador salte del sector de arranque hacia el de la
aplicación y entonces se ejecute el programa escrito por el programador. Desde aquí el
usuario puede evaluar el software-hardware del AVR Butterfly.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 286 -

6.1.9. Esquema de Conexiones

Figura. 6.15. Práctica 1, Esquema de Conexiones


CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 287 -

6.2. PRÁCTICA 2

6.2.1. Tema
El Joystick y las Interrupciones Externas.

6.2.2. Objetivo
− Exponer las interrupciones externas del ATmega169.
− Validar la funcionalidad del joystick mediante el empleo de las interrupciones
externas.
− Emplear el joystick para según la manipulación de éste desplazar bits que se
mostrarán en LEDs conectados al puerto D.

6.2.3. Materiales

Tabla. 6.2. Lista de Materiales


Cantidad Unidad Item
1 u AVR Butterfly
8 u Leds de propósito general
8 u Resistencias de 330 ohm, 1/8 Watt
1 u Bus de datos de 10 hilos, con Headers
1 u Project Board
2 u Baterias AA - 1,5V
1 u Porta Baterias AA
20 cm Cable multipar de 8 hilos

6.2.4. Marco Teórico

Las Interrupciones Externas


Las Interrupciones Externas se activan por el pin INT0 (en el Atmega169, el pin
PD1) o cualquiera de los pines PCINT15…PCINT0 (en el ATmega169, los pines:
PB7...PB0, PE7…PE0). En caso de que estén habilitadas, las interrupciones se activarán
incluso si el pin INT0 o los pines PCINT15…PCINT0 están configurados como salidas.
Esta característica proporciona un modo para generar interrupción por software.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 288 -

La interrupción PCI1 por cambio en pin se activará si conmuta cualquier pin


PCINT15…PCINT8 habilitado. La interrupción PCI0 por cambio en pin se activará si
conmuta cualquier pin PCINT7…PCINT0 habilitado. Los Registros PCMSK1 y PCMSK0
controlan cual de los pines contribuye con interrupciones por cambio en el pin. Las
interrupciones por cambio en pin, en PCINT15…PCINT0, son detectadas
asincrónicamente. Esto implica que estas interrupciones también pueden emplearse para
sacar al microcontrolador del modo de sleep.

Los Registros usados para habilitar y configurar las interrupciones externas son
citados a continuación (para más detalle referirse a la Sección 2.9 del Capítulo 2):

Registro A para Control de la Interrupción Externa – EICRA (External Interrupt


Control Register A).

Registro Máscara para la Interrupción Externa – EIMSK (External Interrupt Mask


Register).

Registro Indicador de Interrupción Externa – EIFR (External Interrupt Flag Register).


CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 289 -

Registro Máscara 1 para Cambio en Pin – PCMSK1 (Pin Change Mask Register 1):

Registro Máscara 0 para Cambio en Pin – PCMSK0 (Pin Change Mask Register 0):

6.2.5. Desarrollo
El joystick con el que está equipado el AVR Butterfly está conectado como se indica
en la Figura 6.16.

Figura. 6.16. Diagrama de conexión del joystick

Basándose en el diagrama de conexión del joystick, mostrado en la Figura 6.16; el


diagrama de bloques será como el que se muestra en la Figura 6.17.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 290 -

PINB0 PORTD0

PINB1 PORTD1

PINB2 PORTD2

PINB3 PORTD3
MCU
PUERTO B PUERTO D
PINB4 PORTD4

PINB5 PORTD5

PINB6 PORTD6

PINB7 PORTD7

Figura. 6.17. Diagrama de Bloques de los recursos utilizados en la Práctica 2

Como ilustra el diagrama de bloques, en la Figura 6.17, el Butterfly emplea los


puertos B y E del ATmega169 para acceder al Joystick. En esta práctica también se
empleará el Puerto D, accesible a conexiones externas en el AVR Butterfly, para mostrar la
acción que se realizará en concordancia con la selección hecha con el joystick.

Las acciones que se generarán, de acuerdo a la dirección seleccionada con el


joystick, serán las siguientes:

− ARRIBA.- desplazará el dato actual en el puerto D, o sea la luz del LED, dos
posiciones hacia la derecha.
− ABAJO.- desplazará el dato actual en el puerto D, o sea la luz del LED, dos
posiciones hacia la izquierda.
− DERECHA.- desplazará el dato actual en el puerto D, o sea la luz del LED, una
posición hacia la derecha.
− IZQUIERDA.- desplazará el dato actual en el puerto D, o sea la luz del LED, una
posición hacia la izquierda.
− CENTRO.- borrará el contenido del puerto D y cargará un bit en el primer pin del
mismo puerto (PIND0), lo que activará la luz del LED únicamente en aquel pin.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 291 -

Para visualizar las acciones en el Puerto D, se conectará un LED a cada uno de los
pines del puerto D.

En lo que se refiere al software que gobernará al AVR Butterfly, este será como a
continuación:

Primero. Se deberán incluir los siguientes archivos de cabecera (#include):

− avr/io.h, que contiene la definición de los registros y de sus respectivos bits, tal
como especifica la documentación de ATMEL para cada microcontrolador.

− avr/interrupt.h, que habilita el uso de las funciones habilitadora global de


interrupción “sei( )” y deshabilitadora global “cli( )” de interrupción, así como
también funciones para habilitar o deshabilitar individualmente las interrupciones
externas y del timer, adicionalmente contiene algunas macros para acceder al
registro EIMSK y a la máscara para el mismo.

− avr/signal.h, que contiene macros que permiten escribir funciones gestoras de


interrupción.

Segundo. Se deberá definir que pines contribuirán con las interrupciones y para ello se
empleará dos constantes llamadas MASCARA_PINB y MASCARA_PINE correspondientes al
puerto B y al E respectivamente:

A estas constantes se les asignará la distribución de bits que corresponde a los pines
que contribuirán con las interrupciones, estas constantes son simplemente máscaras que
más adelante facilitarán la codificación y la interpretación del programa:

#define MASCARA_PINB ((1<<PINB7)|(1<<PINB6)|(1<<PINB4))


#define MASCARA_PINE ((1<<PINE3)|(1<<PINE2))
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 292 -

En lenguaje más sencillo:

(1<<PINB7) = desplazar 1 hacia la izquierda 7 veces,


por ejemplo: 00000001 << 7 = 10000000.
(1<<PINB6) = desplazar 1 hacia la izquierda 6 veces,
por ejemplo: 00000001 << 6 = 01000000.
(1<<PINB4) = desplazar 1 hacia la izquierda 4 veces,
por ejemplo: 00000001 << 4 = 00010000.

PINB7 = 7, PINB6 = 6, PINB5 = 5, PINB4 = 4, …, PINB0 = 0; según la definición


de bit dada para cada registro dentro del archivo iom169.h, que se incluye
automáticamente al incluir el archivo avr/iom.h.

Entonces, reemplazando y resolviendo:

((1<<PINB7)|(1<<PINB6)|(1<<PINB4)) = (10000000) OR (01000000) OR (00010000)

((1<<PINB7)|(1<<PINB6)|(1<<PINB4)) = 11010000

Por lo que:

MASCARA_PINB = 11010000

Repitiendo para el puerto E:

MASCARA_PINE = 00001100

Los valores de las constantes PINA7…PINA0, PINB7…PINB0, PINC7…PINC0,


PIND7…PIND0, etc., están definidos en el archivo iom169.h que es cargado
automáticamente por el compilador cuando se añade el archivo cabecera avr/io.h; por tal
razón, el iom169.h no debe ser cargado directamente por el programador (usuario).
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 293 -

Tercero. Se deberán definir algunas constantes y variables globales que facilitarán la


interpretación del código del programa:

#define ARRIBA 0
#define ABAJO 1
#define IZQUIERDA 2
#define DERECHA 3
#define CENTRO 4
#define NO_VALIDA 5

Según el diagrama de conexión del joystick anteriormente visto:

#define posicion_A 6 //ARRIBA


#define posicion_B 7 //ABAJO
#define posicion_C 2 //DERECHA
#define posicion_D 3 //IZQUIERDA
#define posicion_O 4 //CENTRO

Otras constantes auxiliares:

#define VERDADERO 1
#define FALSO 0

Variables auxiliares:

volatile unsigned char SELECCION = 0;


volatile unsigned char SELECCION_VALIDA = 0;

Cuarto. Escribir las funciones necesarias para utilizar el Joystick, estas deben ser
declaradas antes de poder definirlas y de utilizarlas.

void inicializar(void);
void manejar_interrupcion(void);
void obtener_seleccion(void);
int main(void);
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 294 -

La función inicializar( ) se empleará para configurar y habilitar las interrupciones


externas por cambio en bit y también para configurar la direccionalidad de los puertos, esto
es, definir cuales pines de los puertos funcionarán como entradas y cuales como salidas.

Debido a que el Joystick no es más que un conjunto de cinco pulsadores agrupados y


que cada pulsador ofrece dos valores: flotante y tierra, se deberán habilitar las resistencias
pull-up para evitar valores flotantes. Esta función habilitará dichas resistencias en cada pin
que aporta con las interrupciones.

void inicializar(void)
{
Habilitar el cambio de preajustador del reloj del sistema:
CLKPR = (1<<CLKPCE);

Seleccionar el preajustador del reloj del sistema, de 256, para ahorrar energía
(8MHz/256):
CLKPR = (1<<CLKPS3);

Esperar a que se complete el ajuste del reloj:


while(CLKPR & (1<<CLKPCE));

Este bloque de código es válido únicamente para poder simular con el AVR
Simulator, puesto que se emplea las pull-ups internas y las interrupciones se activan
por la presencia de nivel bajo en los pines conectados al joystick. Cuando el joystick
es movido hacia cualquiera de sus direcciones válidas, el pin correspondiente es
llevado a tierra (0 voltios):
DDRB = 0xD0;
PORTB = MASCARA_PINB;
DDRE = 0x0C;
PORTE = MASCARA_PINE;

Definir todos los pines del PUERTO B como entradas:


DDRB = 0;
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 295 -

Habilitar las PULL-UPs en el puerto B, únicamente en los pines que contribuirán con
interrupciones:
PORTB = MASCARA_PINB;

Definir todos los pines del PUERTO E como entradas:


DDRE = 0;

Habilitar las PULL-UPs en el puerto E, únicamente en los pines que contribuirán con
interrupciones:
PORTE = MASCARA_PINE;

Configurar los Registros Máscara para habilitar las Interrupción Externa por Cambio
de nivel lógico en Pin en cada uno de los pines necesarios para la aplicación:
Habilitar las interrupciones en los pines PINB7, PINB6 y PINB4:
PCMSK1 |= MASCARA_PINB;
Habilitar las interrupciones en los pines PINE3 y PINE2:
PCMSK0 |= MASCARA_PINE;

Borrar los indicadores (flags) de interrupción externa por cambio de nivel en pin:
EIFR = ((1<<PCIF1)|(1<<PCIF0));

Habilitar las interrupciones por cambio de nivel en los puertos B (PCIE1) y E


(PCIE0):
EIMSK = ((1<<PCIE1)|(1<<PCIE0));

Definir todos los pines del puerto D como salidas:


DDRD = 0xFF;

Poner a cero todos los pines del puerto D:


PORTD = 0x00;
}

La función manejar_interrupcion( ) es la función que será llamada por las funciones


gestoras de interrupción, ésta se ejecutará cuando ocurra una de las interrupciones, en ésta
se definirá que acciones se debe realizar cuando ocurre una interrupción. Puesto que todas
las interrupciones obedecerán únicamente a las acciones provenientes del joystick,
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 296 -

entonces esta función será la única que será llamada por las gestoras de todas las
interrupciones.

Las siguientes funciones SIGNAL(_argumento) son las gestoras de interrupciones, su


argumento es el macro que identifica a la interrupción a la que debe obedecer la función
gestora.

SIG_PIN_CHANGE0 es el alias de la fuente de interrupción PCINT0 (Pin Change


Interrupt Request 0):

SIGNAL(SIG_PIN_CHANGE0)
{
Llamar a la función manejar_interrupcion():
manejar_interrupcion();
}

SIG_PIN_CHANGE1 es el alias de la fuente de interrupción PCINT1 (Pin Change


Interrupt Request 0):

SIGNAL(SIG_PIN_CHANGE1)
{
Llamar a la función manejar_interrupcion():
manejar_interrupcion();
}

En este caso, los argumentos de las gestoras identifican a dos interrupciones externas
(eventos): interrupción debida a cambio de nivel en los pines del Puerto B,
SIG_PIN_CHANGE1, y a la interrupción externa debido al cambio de nivel en los pines
del Puerto E, SIG_PIN_CHANGE0.

Al ocurrir una interrupción en uno de los pines habilitados se ejecuta la función


gestora correspondiente, llamando a la función manejar_interrupcion( ).
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 297 -

void manejar_interrupcion(void)
{
unsigned char joystick;
unsigned char seleccion;

Identificar cual pin del puerto B presenta cambio de nivel, obtener su posición:
joystick = ((~PINB) & MASCARA_PINB);

Identificar cual pin del puerto E presenta cambio de nivel, obtener su posición:
joystick |= ((~PINE) & MASCARA_PINE);

Asignar una selección válida de joystick según el valor lógico y la posición del pin
luego de manipular el joystick:
if((joystick & (1<< posicion_A)))
seleccion = ARRIBA;
else if((joystick & (1<< posicion_B)))
seleccion = ABAJO;
else if((joystick & (1<< posicion_C)))
seleccion = DERECHA;
else if((joystick & (1<< posicion_D)))
seleccion = IZQUIERDA;
else if((joystick & (1<< posicion_O)))
seleccion = CENTRO;
else seleccion = NO_VALIDA;

Entrar cuando la selección es válida:


if(seleccion != NO_VALIDA)
{

Entrar únicamente si se completó la interrupción anterior:


if(!SELECCION_VALIDA)
{

Asignar el valor de la variable “selección” a la variable global SELECCIÓN:


SELECCION = seleccion;
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 298 -

Definir globalmente como válida la selección:


SELECCION_VALIDA = VERDADERO;
}
}

Borrar los indicadores de interrupción correspondientes al cambio de nivel en los


pines de los puertos B y E:
EIFR = ((1<<PCIF1)|(1<<PCIF0));

Llamar a la función obtener_seleccion( ):


obtener_seleccion();
}

La función obtener_seleccion( ) deshabilita globalmente las interrupciones para que


se cumplan las instrucciones restantes, toma el valor correspondiente a la selección hecha
con el joystick y de acuerdo a ésta realiza una de las acciones indicadas anteriormente.
Finalmente, habilita globalmente las interrupciones. Toda acción se visualizará por medio
de LEDs en el puerto D.

void obtener_seleccion(void)
{
unsigned char seleccion;

Deshabilitar globalmente todas las interrupciones:


cli();

Entrar si la selección es válida:


if(SELECCION_VALIDA)
{

Tomar el valor de la selección hecha con el joystick:


seleccion = SELECCION;

Definir globalmente como no válida la selección, para que la función


manejar_interrupcion() pueda actualizar el valor de la variable global SELECCION
luego de culminada la rutina de la interrupción actual:
SELECCION_VALIDA = FALSO;
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 299 -

}
else seleccion = NO_VALIDA;

Entrar si la selección es válida:


if(seleccion != NO_VALIDA)
{

Actuar según la selección:


switch(seleccion)
{

Al seleccionar ARRIBA con el joystick, desplazar el valor del Puerto D dos


posiciones hacia la izquierda y actualizarlo:
case ARRIBA:
PORTD <<= 2;
break;

Al seleccionar ABAJO con el joystick, desplazar el valor del Puerto D dos


posiciones hacia la derecha y actualizarlo:
case ABAJO:
PORTD >>= 2;
break;

Al seleccionar IZQUIERDA con el joystick, desplazar el valor del Puerto D una


posición hacia la izquierda y actualizarlo:
case IZQUIERDA:
PORTD <<= 1;
break;

Al seleccionar DERECHA con el joystick, desplazar el valor del Puerto D una


posición hacia la derecha y actualizarlo:
case DERECHA:
PORTD >>= 1;
break;

Al seleccionar CENTRO con el joystick, cargar un bit en el PIN 0 del Puerto D:


case CENTRO:
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 300 -

PORTD = 1;
default:
break;
}
}

Habilitar globalmente las interrupciones


sei();
}

Quinto. Definir la función principal, esta función llamará primero a la función


inicializar(_), que debe tener prioridad ante las demás sentencias, puesto que primero se
deben inicializar interrupciones, registros, periféricos, etc. antes de poder utilizarlos para
evitar comportamiento no deseado del microcontrolador. Luego, esta función habilitará
globalmente el uso de interrupciones empleando la función sei( ). Finalmente
implementará un lazo infinito - while(1) - dentro del cual permanecerá ejecutándose
continuamente el algoritmo que controla el comportamiento del microcontrolador.

Debido a que en ésta práctica el microcontrolador obedecerá únicamente a las


interrupciones activadas por eventos externos (joystick), la única instrucción que se
incluirá en el lazo infinito será la que ordenará al microcontrolador ir hacia un modo de
sleep para que espere en ese modo hasta que ocurra algún evento externo. Cuando se active
una interrupción por algún evento externo (joystick), el microcontrolador saldrá del modo
sleep, atenderá a la rutina de interrupción actual y una vez culminada devolverá el control
al lazo infinito para continuar desde el punto de donde fue interrumpido, entonces ejecutará
la siguiente instrucción que será regresar al modo de sleep puesto que es la única
instrucción.

int main(void)
{
Llama la función inicializar para que inicie los parámetros necesarios:
inicializar();

Habilita el uso de interrupciones:


sei();
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 301 -

Entrar en un lazo infinito:


while(1)
{

Habilitar modo sleep y entrar en el modo Power-Down, para que el microcontrolador


consuma energía mínima y salga de éste modo únicamente cuando ocurra una
interrupción, volviendo a este modo de sleep cada vez que se complete la rutina de
interrupción:
SMCR = ((1<<SM1)|(1<<SE));
}
return 0;
}

Sexto. Se procede a la compilación y la generación de los archivos .hex y .cof.

Séptimo. Antes de cargar el programa en el microcontrolador, es recomendable evaluar


dicho programa con el AVR Simulator del AVR Studio (ver Capítulo 5) y realizar la
depuración correspondiente.

Octavo. Una vez culminada la simulación de forma satisfactoria, descargar el programa


(archivo *.hex) en el microcontrolador ATmega169 que comanda al AVR Butterfly.

Noveno. Armar el circuito como indica el esquema de conexiones mostrado en la Figura


6.18 y proceder a hacer las pruebas.

6.2.6. Código Fuente


El software que gobernará el ATmega169, y por ende al AVR Butterfly, se lista a
continuación:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

/*
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 302 -

Pines del ATmega169 conectados con el Joystick:


-------------------------------------------------------------
Bit 7 6 5 4 3 2 1 0
-------------------------------------------------------------
PORTB B A O
PORTE D C
-------------------------------------------------------------
PORTB | PORTE B A O D C => posición
-------------------------------------------------------------
*/
#define MASCARA_PINB ((1<<PINB7)|(1<<PINB6)|(1<<PINB4))
#define MASCARA_PINE ((1<<PINE3)|(1<<PINE2))

#define ARRIBA 0
#define ABAJO 1
#define IZQUIERDA 2
#define DERECHA 3
#define CENTRO 4
#define NO_VALIDA 5

#define posicion_A 6 //ARRIBA


#define posicion_B 7 //ABAJO
#define posicion_C 2 //DERECHA
#define posicion_D 3 //IZQUIERDA
#define posicion_O 4 //CENTRO

#define VERDADERO 1
#define FALSO 0
volatile unsigned char SELECCION = 0;
volatile unsigned char SELECCION_VALIDA = 0;

void inicializar(void);
void manejar_interrupcion(void);
void obtener_seleccion(void);

int main(void)
{
inicializar();
sei();
while(1)
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 303 -

{
SMCR = ((1<<SM1)|(1<<SE));
}
return 0;
}

void inicializar(void)
{
CLKPR = (1<<CLKPCE);
CLKPR = (1<<CLKPS3);
while(CLKPR & (1<<CLKPCE));

DDRB |= 0xD0;
PORTB |= MASCARA_PINB;
DDRE |= 0x0C;
PORTE |= MASCARA_PINE;

DDRB = 0;//entrada
PORTB = MASCARA_PINB;//habilitar PULL-UPs
DDRE = 0;//entrada
PORTE = MASCARA_PINE;//habilitar PULL-UPs

PCMSK1 |= MASCARA_PINB;
PCMSK0 |= MASCARA_PINE;

EIFR = ((1<<PCIF1)|(1<<PCIF0));
EIMSK = ((1<<PCIE1)|(1<<PCIE0));
DDRD = 0xFF;
PORTD = 0x00;
}

void manejar_interrupcion(void)
{
unsigned char joystick;
unsigned char seleccion;

joystick = ((~PINB) & MASCARA_PINB);


joystick |= ((~PINE) & MASCARA_PINE);

if((joystick & (1<<A)))


CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 304 -

seleccion = ARRIBA;
else if((joystick & (1<<B)))
seleccion = ABAJO;
else if((joystick & (1<<C)))
seleccion = DERECHA;
else if((joystick & (1<<D)))
seleccion = IZQUIERDA;
else if((joystick & (1<<O)))
seleccion = CENTRO;
else seleccion = NO_VALIDA;
if(seleccion != NO_VALIDA)
{
if(!SELECCION_VALIDA)
{
SELECCION = seleccion;
SELECCION_VALIDA = VERDADERO;
}
}
EIFR = ((1<<PCIF1)|(1<<PCIF0));
obtener_seleccion();
}

void obtener_seleccion(void)
{
unsigned char seleccion;

cli();
if(SELECCION_VALIDA)
{
seleccion = SELECCION;
SELECCION_VALIDA = FALSO;
}
else seleccion = NO_VALIDA;

if(seleccion != NO_VALIDA)
{
switch(seleccion)
{
case ARRIBA:
PORTD <<= 2;
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 305 -

break;
case ABAJO:
PORTD >>= 2;
break;
case IZQUIERDA:
PORTD <<= 1;
break;
case DERECHA:
PORTD >>= 1;
break;
case CENTRO:
PORTD = 1;
default:
break;
}
}
sei();
}

SIGNAL(SIG_PIN_CHANGE0)
{
manejar_interrupcion();
}

SIGNAL(SIG_PIN_CHANGE1)
{
manejar_interrupcion();
}
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 306 -

6.2.7. Esquema de Conexiones

Figura. 6.18. Práctica 2, Esquema de Conexiones


CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 307 -

6.3. PRÁCTICA 3

6.3.1. Tema
Controlador de LCD (Pantalla de Cristal Líquido).

6.3.2. Objetivo
− Presentar el controlador LCD incluido en el microcontrolador ATmega169.
− Validar el funcionamiento del controlador LCD.
− Desplegar mensajes alfanuméricos en el LCD.

6.3.3. Materiales

Tabla. 6.3. Lista de Materiales


Cantidad Unidad Item
1 u AVR Butterfly
2 u Baterias AA - 1,5V
1 u Porta Baterias AA

6.3.4. Marco Teórico

Controlador de LCD
El Controlador de LCD está creado para una pantalla de cristal líquido
monocromática pasiva con hasta cuatro terminales comunes y hasta 25 terminales de
segmento.

Características del Controlador de LCD


− Capacidad para LCD de 25 Segmentos y 4 Terminales Comunes.
− Voltaje de Salida para LCD (contraste) seleccionable por Software, desde 2.6 V
hasta 3.35 V en el Rango Completo de Operación.
− Suministro de Energía para el LCD, Integrado en el Chip.
− Visualización Posible en Modo Power-save, para Bajo Consumo de Energía.
− Capacidad de Forma de Onda de Baja Potencia Seleccionable por Software.
− Frecuencia de Trama de Selección Flexible.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 308 -

− Selección de Reloj mediante Software, entre el Reloj del Sistema o una Fuente de
Reloj Externa Asincrónica.
− Capacidad Equivalente de Fuente (source) y Sumidero (drain) para maximizar el
Tiempo de Vida del LCD.
− Interrupción del LCD para Actualizar los Datos de la Pantalla o para Salir del
Modo Sleep.

Un LCD consiste de varios segmentos (pixeles o símbolos completos) que pueden


estar o no visibles. Un segmento tiene dos electrodos con cristal líquido entre ellos.
Cuando se aplica un voltaje por encima de un voltaje umbral a través del cristal líquido, el
líquido se vuelve visible.

En la Tabla 6.4 se explica los términos que se usan en la configuración del LCD.

Tabla. 6.4. Definición de Términos usados en la descripción del Controlador LCD


LCD Un panel de despliegue pasivo con terminales llevadas directamente hacia un segmento
Segment Los elementos visibles mínimos que pueden estar encendidos o apagados
Common Denota cuantos estan conectados a una terminal de segmento
Duty 1/(Número de terminales comunes en la LCD actual)
Bias 1/(Número de niveles de voltaje usados al emplear una LCD - 1)
Frame Rate Número de veces por segundo que estan energizados los segmentos de la LCD

La Tabla 6.5 muestra los niveles de voltaje que genera un controlador LCD en
concordancia con el número de terminales comunes, Duty y Bias.

Tabla. 6.5. Niveles de Voltaje del controlador de LCD


Terminales Comunes 1 2 3 4 6 7 11 12
Duty Static 1/2 1/3 1/4 1/6 1/7 1/11 1/12
Bias 1 1/2 1/3 1/3 1/3 1/4 1/4 1/5
Niveles de Voltaje 2 3 4 4 4 5 5 6

El vidrio LCD con el que está equipado el AVR Butterfly tiene un total de 120
segmentos, controlados a través de 4 terminales comunes y 30 líneas de segmentos. Puesto
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 309 -

que el ATmega169 es capaz de manejar 100 segmentos algunos segmentos no están


conectados en el AVR Butterfly.

El LCD incluido en el AVR Butterfly tiene seis grupos similares de segmentos,


donde cada grupo de segmentos es capaz de desplegar un caracter alfanumérico. Cada uno
de esos grupos de segmentos es conocido como dígito LCD, éste consiste de 14 segmentos
separados.

Distribución de Memoria para el controlador LCD. Escribiendo un “1” (uno lógico) en


un bit de memoria del LCD energizará (visible) el segmento correspondiente. Los bits de la
Memoria del LCD no usados para la pantalla actual pueden usarse libremente para
almacenamiento. En la Tabla 6.6 se observa la distribución de los bits de memoria de LCD.

Tabla. 6.6. Asignación de Memoria LCD


CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 310 -

6.3.5. Desarrollo
El diagrama de bloques mostrado en la Figura 6.19 indica los recursos que emplea el
controlador LCD del ATmega169 y será de mucha ayuda para el entendimiento del código
fuente del programa que gobernará el microcontrolador en la aplicación de esta práctica.

Figura. 6.19. Diagrama de Bloques de los recursos utilizados en la Práctica 3

En lo que respecta al hardware, según lo que indica el diagrama de bloques, la


MCU169 cargará los caracteres en la Memoria LCD, controlará las terminales comunes del
LCD a través del Puerto A y activará la interrupción en cada inicio de trama LCD, esta
interrupción actualizará el LCD con los datos contenidos en la Memoria LCD.

En lo que se refiere al software que gobernará el AVR Butterfly, esta práctica


predefine mensajes alfanuméricos en el software, estos mensajes serán visualizados cuando
arranque la aplicación. El software de esta aplicación será desarrollado como a
continuación:

Primero. Agregar los archivos de cabecera necesarios:

− avr/io.h, que contiene la definición de los registros y de sus respectivos bits, tal
como especifica la documentación de ATMEL para cada microcontrolador.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 311 -

− avr/pgmspace.h, contiene funciones para acceder datos almacenados en


espacios de memoria de programa (memoria flash) del dispositivo.

− signal.h, que contiene macros que permiten escribir funciones gestoras de


interrupción.

− avr/interrupt.h, que habilita el uso de las funciones habilitadora global de


interrupción “sei( )” y deshabilitadora global “cli( )” de interrupción, así como
también funciones para habilitar o deshabilitar individualmente las
interrupciones externas y del Timer, adicionalmente contiene algunas macros
para acceder al registro EIMSK y a la máscara para el mismo.

− avr/delay.h, contiene funciones para establecer períodos de retraso (delay).

Segundo. Declarar variables globales, funciones, constantes y macroinstrucciones.

− Constantes:

Número de direcciones de memoria asignadas para la memoria del LCD (como se


aprecia en la Tabla 6.6):

#define TAMANIO_DEL_REGISTRO_LCD 20

El número máximo de caracteres que se desplazará en el LCD:

#define NUMERO_MAXIMO_DE_CARACTERES 36

− Variables Globales:

Buffer datos del LCD que contendrá los SCC:

char LCD_Data[TAMANIO_DEL_REGISTRO_LCD];
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 312 -

Auxiliar para hacer desplazamiento de caracteres en el LCD:

char memo_temp_texto[NUMERO_MAXIMO_DE_CARACTERES];

Variable que controla la acción de desplazar o no caracteres en cada actualización:

unsigned char ESCRITURA_DE_CADENA_HABILITADO = 0;

Contador auxiliar que permitirá desplazar un caracter en cada actualización

unsigned char LCD_INT_contador = 0;

− Funciones:

void inicializar_LCD(void);
void escribir_caracter_en_LCD(char , char );
void escribir_palabra_en_LCD(char *);
void borrar_LCD(void);
void actualizar_LCD(void);

− Macroinstrucción que apunta a primera dirección de Memoria de LCD (ver Tabla


2.67):

#define pLCDREG ((unsigned char *)(0xEC))

Tercero. Definir los Códigos Controladores de Segmentos SCC (Segment Control Codes)
y grabarlos en la memoria flash de programa utilizando el modificador PROGMEM,
exclusivo de WinAVR. Estos códigos al ser escritos en la Memoria LCD energizarán los
segmentos LCD, permitiendo visualizar los segmentos que conforman los caracteres en el
LCD.

unsigned int tabla_de_caracteres_LCD[] PROGMEM =


{
0x0A51, // '*' (?)
0x2A80, // '+'
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 313 -

0x0000, // ',' (Sin definir)


0x0A00, // '-'
0x0A51, // '.' Signo de grados
0x0000, // '/' (Sin definir)
0x5559, // '0'
0x0118, // '1'
0x1e11, // '2
0x1b11, // '3
0x0b50, // '4
.
.
.
}

Cuarto. Escribir las funciones que permitan controlar el LCD.

La función inicializar_LCD( ) primeramente borra el buffer de datos del LCD y la


memoria LCD, luego habilita la interface LCD, configura el nivel de contraste, configura
la fuente de reloj, preajustador y divisor, configura segmentos y líneas comunes (segments
y commons) y habilita la interrupción por LCD.

void inicializar_LCD(void)
{
Borrar el buffer y la memoria LCD:
Borrar_LCD( );

Habilitar la interfaz LCD y configurar la forma de onda de baja potencia:


LCDCRA = (1<<LCDEN) | (1<<LCDAB);

Fijar el tiempo de control al 50% del CLK_LCD_PS y el nivel de contraste al 100%:


LCDCCR = (1<<LCDDC2)|(1<<LCDDC1)|(1<<LCDDC0)|(1<<LCDCC3)|(1<<LCDCC2)
|(1<<LCDCC1)|(1<<LCDCC0);

Seleccionar N=16 para determinar una velocidad de trama de 64 Hz (la mínima


recomendable es 32 Hz para que el ojo humano no note el barrido):
LCDFRR = (0<<LCDPS0) | (1<<LCDCD2);
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 314 -

Seleccionar fuente de reloj externa asincrónica de 32768Hz, determinar Duty – Bias


y el número máximo de segmentos visible igual a 25:
LCDCRB = (1<<LCDCS)|(1<<LCDMUX1)|(1<<LCDMUX0)|(1<<LCDPM2)|(1<<LCDPM1)
|(1<<LCDPM0);

Habilitar interrupción por inicio de trama LCD:


LCDCRA |= (1<<LCDIE);
}

La función escribir_caracter_en_LCD(caracter , posicion) verifica si el caracter


está dentro del rango alfanumérico, en caso de ser una letra minúscula la transforma en
mayúscula, busca el SCC (Segment Control Code) correspondiente al caracter dentro de la
tabla de caracteres LCD, enmascara el SCC (Segment Control Code) para darle la posición
solicitada en el LCD y copia el SCC en el buffer (registro temporal de datos) del LCD.

void escribir_caracter_en_LCD(char c, char posicion)


{
unsigned int seg = 0x0000;
char mascara, nibble;
char *ptr;
char i;

Abortar si la posición no es correcta, en este caso cuando es mayor que 5:


if (posicion > 5)
return;

Verificar que el caracter sea un caracter alfanumérico presente en la


tabla_de_caracteres_LCD:
if ((c >= '*') && (c <= 'z'))
{

Si el caracter ‘c’ es una letra, convertirlo a mayúsculas:


if (c >= 'a')
c &= ~0x20;
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 315 -

Tomar la posición del caracter en la tabla_de_caracteres_LCD, respecto al primer


caracter '*':
c -= '*';

Obtener el SCC correspondiente a la posición del caracter en la tabla y asignarlo a la


variable seg:
seg = (unsigned int) pgm_read_word(&tabla_de_caracteres_LCD [(uint8_t)c]);
}

Adaptar la máscara en relación a la distribución de segmentos en el LCD, cada byte


de memoria LCD energiza a dos segmentos similares de 2 posiciones consecutivas
del LCD {0,1,2,3,4,5} = {0,0,1,1,2,2}, como se aprecia en la Figura 6.20, por lo que
hay que enmascarar cada SCC (Segment Control Code) de acuerdo a su posición par
o impar en el LCD:

Figura. 6.20. Control de Segmentos LCD mediante la memoria LCD

Entonces:
if (posicion & 0x01)

Posiciones 1, 3, 5 en el LCD (digito del LCD):


mascara = 0x0F;
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 316 -

else

Posiciones 0, 2, 4 en el LCD (digito del LCD):


mascara = 0xF0;

Apuntar al Buffer de datos del LCD en la posición requerida:


Posición = {0, 0, 1, 1, 2, 2} Æ (5>>1=2), (4>>1=2), (3>>1=1), (2>>1=1),
(1>>1=0), (0>>1=0)
ptr = LCD_Data + (posicion >> 1);

Un caracter SCC está formado por cuatro nibbles, como indica la Figura 6.21:
for (i = 0; i < 4; i++)
{
Aislar el nibble menos significativo del SCC para tomar un nibble a la vez:
nibble = seg & 0x000F;

Desplazar el SCC, 4 posiciones a la derecha para ir por el siguiente nibble:


seg >>= 4;

Si la posición en el LCD es 1, 3, 5 desplazar el nibble 4 posiciones hacia la


izquierda:
if (posicion & 0x01)
nibble <<= 4;

Escribir el nibble en el buffer LCD:


*ptr = (*ptr & mascara) | nibble;

Incrementar en 5 la dirección del buffer LCD, para que el siguiente nibble del
buffer sea escrito en LCCDRx+5, el siguiente en LCDDRx+10 y el último en
LCDDRx+15; consiguiendo dividir el SCC en 4 nibbles como muestra la Figura
6.21:
ptr += 5;
}
}
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 317 -

Figura. 6.21. Distribución de Nibbles, tomando como ejemplo el caracter ‘B’ en la posición 0 (cero)

La función escribir_palabras_en_LCD(*cadena) recibe un puntero a una cadena de


caracteres como argumento, la asigna a una matriz de caracteres global para que pueda ser
accedida desde la función gestora de interrupción LCD.

void escribir_palabras_en_LCD(char *palabra)


{
unsigned char i=0;

Borrar el contenido de la matriz declarada como global para luego poder llenarla con
la cadena de caracteres que recibe como argumento la función:
for( i=0;i<NUMERO_MAXIMO_DE_CARACTERES;i++,palabra++)
memo_temp_texto[i]='\0';

Reinicializar el contador, para que al enviar una cadena de caracteres ésta se presente
en el LCD desde el inicio cuando la interrupción por inicio de trama intente
actualizar el LCD:
LCD_INT_contador = 0;

Habilitar la escritura de cadena dentro de la interrupción por inicio de trama LCD:


ESCRITURA_DE_CADENA_HABILITADO = 1;
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 318 -

Copiar la cadena de caracteres que recibe como argumento, dentro de la matriz


declarada como variable global, para que la interrupción pueda tener acceso a la
cadena de caracteres:
for( i=0;(i<NUMERO_MAXIMO_DE_CARACTERES)&&(*palabra!='\0');i++,palabra++)
memo_temp_texto[i]=*palabra;
}

La función borrar_LCD( ) borra lo que se está visualizando actualmente en el LCD


por medio del borrado del contenido de la memoria del LCD y del contenido del buffer de
datos SCC.

void borrar_LCD(void)
{
Borrar el contenido de la matriz global memo_temp_texto[ ]:
for( i=0;i<NUMERO_MAXIMO_DE_CARACTERES;i++)
memo_temp_texto[i]='\0';

for (char i = 0; i < TAMANIO_DEL_REGISTRO_LCD; i++)


{
Borrar la pantalla borrando la memoria LCD:
*(pLCDREG + i) = 0x00;

Borrar el buffer de datos LCD:


*(LCD_Data+i) = 0x00;
}

Actualizar el LCD para así borrar lo que haya en la pantalla:


actualizar_LCD();
}

La función actualizar_LCD( ) actualiza la memoria LCD con los SCC presentes en


el buffer. Esta función es útil cuando se desea escribir caracter por caracter en el LCD
utilizando la función escribir_caracter_en_LCD(caracter, posicion).
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 319 -

void actualizar_LCD(void)
{
Deshabilitar la escritura de cadena de caracteres, para que cuando se presente una
interrupción ésta no actualice el LCD con los datos de la cadena, sino con los
caracteres escritos individualmente con la función escribir caracter_en_LCD:
ESCRITURA_DE_CADENA_HABILITADO = 0;

La función escribir_caracter_en_LCD(caracter, posicion) únicamente copia dentro


del buffer de datos los SCC correspondientes a los caracteres, por lo que es necesario
copiar los SCC del buffer en la memoria LCD para que se visualicen:
for (char i = 0; i < TAMANIO_DEL_REGISTRO_LCD; i++)
*(pLCDREG + i) = *(LCD_Data+i);
}

La función SIGNAL(SIG_LCD) es la gestora de la interrupción por el evento de


inicio de una nueva trama LCD. Al escribir una cadena de caracteres, esta función desplaza
los caracteres hacia la izquierda con cada interrupción, los envía a escribir en grupos de
seis y luego actualiza la memoria LCD para así visualizarlos en el LCD.

SIGNAL(SIG_LCD)
{
unsigned char letra=0;
unsigned char i=0;

Entrar cuando se escriba una cadena de caracteres:


if (ESCRITURA_DE_CADENA_HABILITADO==1)
{

Escribir en el buffer de datos LCD los SCC correspondientes a seis caracteres en las
seis posiciones del LCD:
for(i=0;(i<6);i++)
{

Continuar si aún no llega al final de la cadena de caracteres:


if(!(memo_temp_texto[i+LCD_INT_contador]=='\0'))
{
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 320 -

Tomar los caracteres de la cadena desde la matriz memo_temp_texto declarada como


global:
letra = memo_temp_texto[i+LCD_INT_contador];

Enviar a escribir los caracteres ordenadamente en el buffer, asignándoles una de las


seis posiciones dentro del LCD:
escribir_caracter_en_LCD(letra,i);
}

Al llegar al final de la cadena, llenar los últimos espacios del LCD con espacios
vacíos:
else
{
escribir_caracter_en_LCD(' ',i);
}
_delay_loop_2(20000);
}

Incrementar el contador hasta lograr desplazar todos los caracteres de la cadena en el


LCD:
if(LCD_INT_contador<NUMERO_MAXIMO_DE_CARACTERES)
LCD_INT_contador++;

Al llegar al final de la cadena, reiniciar el contador y deshabilitar la escritura de


cadena:
else
{
LCD_INT_contador=0;
ESCRITURA_DE_CADENA_HABILITADO = 0;
}
}

Una vez que se hayan escrito seis caracteres en el buffer LCD, copiar los SCC del
buffer LCD en la memoria LCD para actualizar la pantalla:
for (char i = 0; i < TAMANIO_DEL_REGISTRO_LCD; i++)
*(pLCDREG + i) = *(LCD_Data+i);
}
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 321 -

Cuarto. Escribir la función principal:

int main(void)
{
Definir la matriz de caracteres que contendrá la cadena de caracteres:
char palabra[NUMERO_MAXIMO_DE_CARACTERES]="Facultad de Ingenieria
Electronica\0";
unsigned char i = 0;

Inicializar la interfaz LCD:


inicializar_LCD();

Habilitar el uso de interrupciones, para poder emplear la interrupción por inicio de


trama LCD:
sei();

Escribir toda la cadena en el LCD:


escribir_palabras_en_LCD(palabra);

Esperar:
for(i=0;i<5;i++)_delay_loop_2(50000);

while(1)
{

Borrar LCD, buffer LCD:


borrar_LCD();

Escribir la palabra ESPE, caracter por caracter, seleccionando la posición para cada
caracter:
escribir_caracter_en_LCD('E',0);
escribir_caracter_en_LCD('S',1);
escribir_caracter_en_LCD('P',2);
escribir_caracter_en_LCD('E',3);
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 322 -

Actualizar la memoria LCD y la pantalla con la palabra ESPE que está en el buffer
LCD:
actualizar_LCD();

Esperar:
for(i=0;i<5;i++)_delay_loop_2(50000);

Entrar en modo Sleep, en el modo Power-down que permite al LCD seguir


funcionando:
SMCR = ((1<<SM1)|(1<<SE));
}

return 0;
}

Quinto. Se procede a la compilación y la generación de los archivos .hex y .cof.

Sexto. Antes de cargar el programa en el microcontrolador, es recomendable evaluar dicho


programa con el AVR Simulator del AVR Studio (ver Capítulo 5) y realizar la depuración
correspondiente.

Séptimo. Una vez culminada la simulación de forma satisfactoria, descargar el programa


(archivo *.hex) en el microcontrolador ATmega169 que comanda al AVR Butterfly.

Octavo. Armar el circuito como indica el esquema de conexiones mostrado en la Figura


6.22 y proceder a hacer las pruebas.

6.3.6. Código Fuente

#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 323 -

#define pLCDREG ((unsigned char *)(0xEC))

#define TAMANIO_DEL_REGISTRO_LCD 20
#define NUMERO_MAXIMO_DE_CARACTERES 36

char LCD_Data[TAMANIO_DEL_REGISTRO_LCD];
char memo_temp_texto[NUMERO_MAXIMO_DE_CARACTERES];
unsigned char ESCRITURA_DE_CADENA_HABILITADO = 0;
unsigned char LCD_INT_contador = 0;

void inicializar_LCD(void);
void escribir_caracter_en_LCD(char , char );
void escribir_palabras_en_LCD(char *);
void borrar_LCD(void);
void actualizar_LCD(void);

unsigned int tabla_de_caracteres_LCD[] PROGMEM =


{
0x0A51, // '*' (?)
0x2A80, // '+'
0x0000, // ',' (Sin definir)
0x0A00, // '-'
0x0A51, // '.' Signo de grados
0x0000, // '/' (Sin definir)
0x5559, // '0'
0x0118, // '1'
0x1e11, // '2
0x1b11, // '3
0x0b50, // '4
0x1b41, // '5
0x1f41, // '6
0x0111, // '7
0x1f51, // '8
0x1b51, // '9'
0x0000, // ':' (Sin definir)
0x0000, // ';' (Sin definir)
0x0000, // '<' (Sin definir)
0x0000, // '=' (Sin definir)
0x0000, // '>' (Sin definir)
0x0000, // '?' (Sin definir)
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 324 -

0x0000, // '@' (Sin definir)


0x0f51, // 'A' (+ 'a')
0x3991, // 'B' (+ 'b')
0x1441, // 'C' (+ 'c')
0x3191, // 'D' (+ 'd')
0x1e41, // 'E' (+ 'e')
0x0e41, // 'F' (+ 'f')
0x1d41, // 'G' (+ 'g')
0x0f50, // 'H' (+ 'h')
0x2080, // 'I' (+ 'i')
0x1510, // 'J' (+ 'j')
0x8648, // 'K' (+ 'k')
0x1440, // 'L' (+ 'l')
0x0578, // 'M' (+ 'm')
0x8570, // 'N' (+ 'n')
0x1551, // 'O' (+ 'o')
0x0e51, // 'P' (+ 'p')
0x9551, // 'Q' (+ 'q')
0x8e51, // 'R' (+ 'r')
0x9021, // 'S' (+ 's')
0x2081, // 'T' (+ 't')
0x1550, // 'U' (+ 'u')
0x4448, // 'V' (+ 'v')
0xc550, // 'W' (+ 'w')
0xc028, // 'X' (+ 'x')
0x2028, // 'Y' (+ 'y')
0x5009, // 'Z' (+ 'z')
0x0000, // '[' (Sin definir)
0x0000, // '\' (Sin definir)
0x0000, // ']' (Sin definir)
0x0000, // '^' (Sin definir)
0x0000 // '_'
};

int main(void)
{
char palabra[NUMERO_MAXIMO_DE_CARACTERES]="Facultad de Ingenieria Electronica\0";
unsigned char i = 0;

inicializar_LCD();
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 325 -

sei();
escribir_palabras_en_LCD(palabra);

for(i=0;i<5;i++)_delay_loop_2(50000);

while(1)
{
borrar_LCD();
actualizar_LCD();

escribir_caracter_en_LCD('E',0);
escribir_caracter_en_LCD('S',1);
escribir_caracter_en_LCD('P',2);
escribir_caracter_en_LCD('E',3);
actualizar_LCD();

for(i=0;i<5;i++)_delay_loop_2(50000);

SMCR = ((1<<SM1)|(1<<SE));
}
return 0;
}

void inicializar_LCD(void)
{
borrar_LCD();
LCDCRA = (1<<LCDEN) | (1<<LCDAB);
LCDCCR = (1<<LCDDC2)|(1<<LCDDC1)|(1<<LCDDC0)|(1<<LCDCC3)|(1<<LCDCC2)
|(1<<LCDCC1)|(1<<LCDCC0);
ASSR = (1<<AS2);
LCDFRR = (0<<LCDPS0) | (1<<LCDCD1)|(1<<LCDCD0);
LCDCRB = (1<<LCDCS)|(1<<LCDMUX1)|(1<<LCDMUX0)|(1<<LCDPM2)|(1<<LCDPM1)
|(1<<LCDPM0);
LCDCRA |= (1<<LCDIE);
}

void escribir_caracter_en_LCD(char c, char posicion)


{
unsigned int seg = 0x0000;
char mascara, nibble;
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 326 -

char *ptr;
char i;
if (posicion > 5) return;

if ((c >= '*') && (c <= 'z'))


{
if (c >= 'a') c &= ~0x20;
c -= '*';
seg = (unsigned int) pgm_read_word(&tabla_de_caracteres_LCD[(uint8_t)c]);
}

if (posicion & 0x01) mascara = 0x0F;


else mascara = 0xF0;

ptr = LCD_Data + (posicion >> 1);

for (i = 0; i < 4; i++)


{
nibble = seg & 0x000F;
seg >>= 4;

if (posicion & 0x01) nibble <<= 4;

*ptr = (*ptr & mascara) | nibble;


ptr += 5;
}
}

void escribir_palabras_en_LCD(char *palabra)


{
unsigned char i=0;

for( i=0;i<NUMERO_MAXIMO_DE_CARACTERES;i++)
memo_temp_texto[i]='\0';
LCD_INT_contador = 0;
ESCRITURA_DE_CADENA_HABILITADO = 1;
for( i=0;(i<NUMERO_MAXIMO_DE_CARACTERES)&&(*palabra!='\0');i++,palabra++)
memo_temp_texto[i]=*palabra;
}
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 327 -

void borrar_LCD(void)
{
unsigned char i=0;

for( i=0;i<NUMERO_MAXIMO_DE_CARACTERES;i++)
memo_temp_texto[i]='\0';
for (i = 0; i < TAMANIO_DEL_REGISTRO_LCD; i++)
{
*(pLCDREG + i) = 0x00;
*(LCD_Data+i) = 0x00;
}
actualizar_LCD();
}

void actualizar_LCD(void)
{
ESCRITURA_DE_CADENA_HABILITADO = 0;
for (char i = 0; i < TAMANIO_DEL_REGISTRO_LCD; i++)
*(pLCDREG + i) = *(LCD_Data+i);
}

SIGNAL(SIG_LCD)
{
unsigned char letra=0;
unsigned char i=0;
if (ESCRITURA_DE_CADENA_HABILITADO==1)
{
for(i=0;(i<6);i++)
{
if(!(memo_temp_texto[i+LCD_INT_contador]=='\0'))
{
letra = memo_temp_texto[i+LCD_INT_contador];
escribir_caracter_en_LCD(letra,i);
}
else
{
escribir_caracter_en_LCD(' ',i);
}
_delay_loop_2(20000);
}
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 328 -

if(LCD_INT_contador<NUMERO_MAXIMO_DE_CARACTERES)
LCD_INT_contador++;
else
{
LCD_INT_contador=0;
ESCRITURA_DE_CADENA_HABILITADO = 0;
}
}
for (char i = 0; i < TAMANIO_DEL_REGISTRO_LCD; i++)
*(pLCDREG + i) = *(LCD_Data+i);
}
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 329 -

6.3.7. Esquema de Conexiones

Figura. 6.22. Práctica 3, Esquema de Conexiones


CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 330 -

6.3.8. Simulación
El usuario deberá cargar el archivo generado con la extensión *.cof para poder
realizar la simulación correspondiente. AVR Studio tiene la función RUN, presionando la
tecla F5, que permite la ejecución automática de todo el programa y por consiguiente
observar en esta práctica el despliegue de todos los mensajes como si se estuviese
ejecutando el programa en el mismo AVR Butterfly. La simulación resultante se aprecia en
las Figura 6.23.

a) b)

c) d)

Figura. 6.23. AVR Simulator, Simulación del programa


CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 331 -

6.4. PRÁCTICA 4

6.4.1. Tema
Comunicación Serial con la PC mediante la Interfaz USART (Universal
Synchronous and Asynchronous Serial Receiver and Transmitter).

6.4.2. Objetivo
− Presentar la interfaz USART (Transmisor y Receptor Serial Universal
Sincrónico y Asincrónico).
− Enviar mensajes alfanuméricos, entre la PC y el AVR Butterfly, a través de la
interfaz serial RS-232 de la PC y la interfaz USART del ATmega169.
− Desplegar en el LCD del AVR Butterfly los mensajes alfanuméricos enviados
por interfaz serial desde la PC hacia el AVR Butterfly.

6.4.3. Materiales

Tabla. 6.7. Lista de Materiales


Cantidad Unidad Item
1 u AVR Butterfly
1 m Cable Serial, con conector DB-9 hembra
2 u Baterias AA - 1,5V
1 u Porta Baterias AA

6.4.4. Marco Teórico

La Interfaz USART
El Transmisor y Receptor Serial Universal Sincrónico y Asincrónico (Universal
Synchronous and Asynchronous Serial Receiver and Transmitter USART) es un
dispositivo de comunicación serial altamente flexible. Sus características principales se
listan a continuación.

− Operación Full Duplex (Registros Independientes para Recepción y Transmisión


Serial).
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 332 -

− Funcionamiento Asincrónico y Sincrónico.


− Funcionamiento Master o Slave.
− Generador de Tasa de Baudio de Alta Resolución.
− Soporta Tramas Seriales con 5, 6, 7, 8 y 9 Bits de Datos y 1 ó 2 Bits de Parada.
− Generación de Paridad Par e Impar y Comprobación de Paridad Soportada por
Hardware.
− Detección de Desbordamiento de Datos.
− Detección de Error de Trama.
− Filtraje de Ruido que Incluye Detección de Falso Bit de Inicio y Filtro Digital
Pasabajo.
− Tres Interrupciones Separadas por los Eventos “TX Finalizada”, “Registro de Datos
de TX Vacío” y “RX Finalizada”.
− Modo de Comunicación de Multi-procesador.
− Modo de Comunicación Asincrónico de Doble Velocidad.

Para más información, revisar el Capítulo 2 – Sección 2.14.

6.4.5. Desarrollo
El diagrama de bloques para la presente aplicación se muestra en la Figura 6.24.

U MCU
S
169
PIN2 PORTE0
Tx Rx
RS-232
Conector DB9
A UDR LCD
PIN3 PORTE1 R
Rx Tx
T Interrupción
Rx USART
habilitada
19200 bps 19200 bps
8 bits 8 bits
sin paridad sin paridad
1 bit de parada 1 bit de parada

Figura. 6.24. Diagrama de Bloques de los recursos utilizados en la Práctica 4


CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 333 -

Como indica el diagrama de bloques de la Figura 6.24, se deberán configurar tanto la


PC como el microcontrolador a la misma velocidad de transferencia de bits, número de bits
de datos, paridad y bits de parada.

Para utilizar la interfaz serial de la PC, para la comunicación con el


microcontrolador, se deberá abrir una sesión en HyperTerminal que viene como accesorio
de comunicaciones de Microsoft Windows; tal como se aprecia en la Figura 6.25.

Figura. 6.25. Inicio de sesión de HyperTerminal

El HyperTerminal deberá configurarse de la siguiente forma:

− Escoger el puerto COM correspondiente a la interfaz serial RS-232 disponible en la


PC. En esta práctica se utiliza el COM1. Ver Figura 6.26.

Figura. 6.26. HyperTerminal, Selección de Puerto Serial


CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 334 -

− Configurar los parámetros del COM1: la velocidad de transmisión dada en bits por
segundo en 19200, número de Bits de datos en 8, Bits de Paridad Ninguno, Bits de
parada 1 y el Control de flujo Ninguno. Ver Figura 6.27.

Figura. 6.27. HyperTerminal, Configuración de parámetros

El desarrollo del software que gobernará al ATmega169 del AVR Butterfly se


cumple de la siguiente forma:

Primero. Incluimos los archivos de cabecera necesarios:

− avr/io.h, que contiene la definición de los registros y de sus respectivos bits, tal
como especifica la documentación de ATMEL para cada microcontrolador.

− lcd.h, debe ser incluido entre comillas, “lcd.h”. El código fuente de la práctica
Controlador LCD debe ser modificado, para ello hay que borrar la función void
main( void) con su contenido. Este archivo ya modificado deberá guardarse con
la extensión *.h en lugar de *.c para identificarlo como un archivo cabecera (.h
= header = cabecera). El archivo lcd.h deberá guardarse en la carpeta que
contienen el archivo correspondiente a la presente práctica, lo que implica que
el archivo lcd.h deberá ser incluido entre comillas para indicar que está dentro
de la misma carpeta que contiene el archivo fuente.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 335 -

Segundo. Declarar las funciones necesarias para la comunicación serial USART, estas
deben tener nombres que identifiquen claramente la operación que se desea que realicen y
deberán declararse en concordancia con el tipo de valor que retornarán y el tipo de
argumento que reciben.

void inicializar_USART(void);
unsigned char leer_USART(void);
void enviar_caracter_por_USART(unsigned char );
void enviar_cadena_por_USART(unsigned char *);
void PC_LCD(void);
void inicializar_modo_SLEEP(void); //OPCIONAL PARA ESTA PRACTICA

Tercero. Definir las funciones antes declaradas:

La función inicializar_USART() configura el reloj del sistema a 2 MHz, luego define


la velocidad de transferencia de datos, paridad, número de bits de datos y de parada;
finalmente habilita la transmisión, recepción e interrupción por recepción completada
exitosamente. Toda la configuración se hace de acuerdo a la Tabla 6.8:

Tabla. 6.8. Frecuencias del Oscilador más usadas

void inicializar_USART(void)
{
Permitir cambio de los bits CLPKS:
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 336 -

CLKPR = (1<<CLKPCE);
Dividir reloj del sistema para 4, entonces RC = 8MHz/4 = 2MHz:
CLKPR = (1<<CLKPS1);

Definir velocidad de transmisión de datos baudrate = 9600 bps (ver Tabla 6.8):
Los registros de 16 bits deben ser escritos empezado con el en byte alto
UBRR0H = 0;

Para luego escribir en el byte bajo:


UBRR0L = 12;

Doblar la velocidad de transmisión U2X=1, entonces BaudRate = 9600 bps x 2 =


19200 bps (Ver Tabla 6.8):
UCSR0A = (1<<U2X0);

Definir: operación asincrónica, sin paridad, 1 bit de parada, 8 bits de datos:


Polaridad del reloj deshabilitada (permitida únicamente para operación sincrónica)
UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);

Permitir recepción, transmisión e interrupción por Rx finalizada exitosamente


UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
}

La función leer_USART( ) leerá el contenido del registro de datos de recepción


USART y devolverá su valor como un dato de un byte sin signo, causando que el
contenido del registro de recepción se borre después de la lectura.

unsigned char leer_USART()


{
Leer y retornar el caracter presente en el buffer de recepción
return UDR0;
}
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 337 -

La función enviar_caracter_por_USART(unsigned char ) enviará un caracter por


USART, para enviarlo escribe el dato de un byte sin signo en el registro de datos de
transmisión USART, este tiene el mismo nombre que el registro de recepción.

void enviar_caracter_por_USART(unsigned char caracter)


{
int espera = 0;

Escribir el caracter en el registro de transmisión, o sea enviar el carácter:


UDR0 = caracter;

Continuar si las interrupciones están permitidas, inspeccionando el habilitador global


de interrupciones:
if(SREG & (1<<SREG_I))
{

Esperar mientras la transmisión no se complete y no haya concluido el tiempo


máximo de espera:
while ( !(UCSR0A&(1<<TXC0)) && (espera<10000) ) espera++;
}

De lo contrario, esperar hasta que se complete la transmisión:


else while( !(UCSR0A&(1<<TXC0)) );

Borrar el indicador de transmisión completada:


UCSR0A |= (1<<TXC0);
}

La función enviar_cadena_por_USART(unsigned char * ) recibe un puntero con la


dirección del primer caracter de la cadena y lo envía a escribir utilizando la función
enviar_caracter_por_USART, luego incrementa la dirección del puntero apuntando al
siguiente caracter de la cadena, repite al proceso sucesivamente hasta llegar hasta el
caracter ‘\0’ que indica el final de la cadena.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 338 -

void enviar_cadena_por_USART(unsigned char *cadena)


{
Enviar caracteres hasta llegar al indicador de fin de cadena
for(unsigned char indice=0;cadena[indice] != '\0';indice++)
enviar_caracter_por_USART(cadena[indice]);
}

La función PC_LCD( ) toma caracter por caracter lo que el usuario escribe desde la
PC, hasta el instante en el cual éste pulsa la tecla ENTER que envía el caracter ‘\r’ o hasta
que llega a un máximo de caracteres, almacena los caracteres en una matriz y reemplaza el
caracter ‘\r’ por el caracter ‘\0’ al final de la cadena; una vez completa envía la cadena al
LCD. El número máximo de caracteres se definió anteriormente para las funciones del
LCD.

void PC_LCD(void)
{
static unsigned char contador_de_caracteres;
static unsigned char LECTURA_USART[NUMERO_MAXIMO_DE_CARACTERES];

Leer los datos recibidos mediante USART:


LECTURA_USART[contador_de_caracteres]=leer_USART();

Cada vez que el usuario presiona la tecla ENTER en la PC o el mensaje que escribe
es mayor al número de caracteres definidos en LCD.h, escribir el mensaje en el LCD:
if((LECTURA_USART[contador_de_caracteres]=='\r')||(contador_de_caracteres>=NU
MERO_MAXIMO_DE_CARACTERES-1))
{
LECTURA_USART[contador_de_caracteres+1]='\0';

Escribir el mensaje en el LCD


escribir_palabras_en_LCD(LECTURA_USART);

Enviar un mensaje a la PC a través de USART


enviar_cadena_por_USART("\n\rMensaje: \0");
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 339 -

Luego de procesar el mensaje recibido, borrar la matriz que contiene el mensaje. Esto
se debe a que dicha matriz está definida como static, lo que significa que conserva el
contenido:
for(contador_de_caracteres=0;contador_de_caracteres<NUMERO_MAXIMO_DE_CARACTE
RES;contador_de_caracteres++)
LECTURA_USART[contador_de_caracteres]='\0';

Reinicializar el contador de caracteres:


contador_de_caracteres=0;
}
else
{

Si el usuario aún no presiona ENTER o no ha llegado al máximo de caracteres,


entonces incrementar el índice llamado contador de caracteres:
contador_de_caracteres++;
}
}

La función SIGNAL(SIG_UART0_RECV) es la gestora de la interrupción que se activa


cuando se completa exitosamente la recepción USART y hay un dato sin leer presente en
el registro de recepción USART. Esta función llamará a la función PC_LCD cada vez que
el microcontrolador reciba una dato serialmente a través de la interfaz USART.

SIGNAL(SIG_UART0_RECV)
{
Cuando hay un dato sin leer presente en el Registro de Recepción USART, luego de
una recepción exitosa, invocar a la función:
PC_LCD();
}

La función inicializar_modo_SLEEP( ) está implementada pero no es objeto de esta


práctica, simplemente es utilizada para reducir el consumo de energía por medio del
apagado del Watch Dog Timer. Esta función no es imprescindible pero es útil para
entender el procedimiento para apagar el Watch Dog Timer.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 340 -

void inicializar_modo_SLEEP(void)
{
Permitir el cambio del Watch Dog Timer:
WDTCR |= (1<<WDTCE)|(1<<WDE);

Desactivar o apagar el Watch Dog Timer:


WDTCR = 0;

Habilitar interrupción externa en los pines PCINT7...PCINT0:


EIFR = (1<<PCIE0);

Enmascarar interrupciones para que únicamente el cambio de nivel en los pines Rx y


Tx active interrupciones:
PCMSK0 = (1<<PCINT1)|(1<<PCINT0);
}

Cuarto. Definir la función principal. La función main( ) empieza ordenando la


inicialización de la interfaz serial USART, habilita el uso de interrupciones y envía un
mensaje indicando que se estableció la conexión y luego entra en el lazo infinito que
ordena al microcontrolador entrar en modo Sleep luego de cualquier interrupción.

int main(void)
{
Prohibir interrupciones:
cli();

Inicializar la interfaz LCD:


inicializar_LCD();

Inicializar la interfaz USART


inicializar_USART();

Para disminuir el consumo de energía, se puede utilizar opcionalmente esta función:


inicializar_modo_SLEEP();
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 341 -

Enviar un mensaje inicial a la PC (‘\a’ = enviar una alerta sonora):


enviar_cadena_por_USART("Conectado! presione ENTER!\a\n\r\0");

Permitir interrupciones:
sei();

Entrar en el lazo infinito:


while(1)
{
Inicialmente y luego de concluir una rutina de interrupción, entrar en el modo Power-
save
SMCR = (1<<SM1)|(1<<SM0)|(1<<SE);
}
return 0;
}

Quinto. Se procede a la compilación y la generación de los archivos .hex y .cof.

Sexto. Antes de cargar el programa en el microcontrolador, es recomendable evaluar dicho


programa con el AVR Simulator del AVR Studio (ver Capítulo 5) y realizar la depuración
correspondiente.

Séptimo. Una vez culminada la simulación de forma satisfactoria, descargar el programa


(archivo *.hex) en el microcontrolador ATmega169 que comanda al AVR Butterfly.

Octavo. Armar el circuito como indica el esquema de conexiones mostrado en la Figura


6.31 y proceder a hacer las pruebas. Se recomienda conservar la conexión física serial que
se utilizó para programar el microcontrolador. Para hacer las pruebas, es necesario abrir
una sesión en HyperTerminal y establecer la comunicación PC-Butterfly. La ventana del
HyperTerminal mostrará un mensaje como el que se observa en la Figura 6.28 una vez que
se establece la comunicación.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 342 -

Figura. 6.28. HyperTerminal, comunicación establecida

Al presionar la tecla ENTER (↵) aparecerá un mensaje en la ventana del


HyperTerminal, como en la Figura 6.29, indicando que ingrese un mensaje. Este mensaje
será el que se desplegará en el LCD del Butterfly.

Figura. 6.29. HyperTerminal, envío del mensaje hacia el Butterfly

Como ejemplo, ingresar en el HyperTerminal el siguiente mensaje: ESCUELA


POLITECNICA DEL EJERCITO (sin tildes, porque sería un caracter no visible en el
LCD) y presionar la tecla ENTER. El mensaje se visualizará desplazándose en el LCD del
AVR Butterfly, como se observa en la Figura 6.30, ya que en este ejemplo el mensaje
ocupa más de 6 caracteres.

Figura. 6.30. Visualización del mensaje enviado desde la PC


CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 343 -

6.4.6. Código Fuente

#include <avr/io.h>
#include <lcd.h>

unsigned char leer_USART(void);


void enviar_caracter_por_USART(unsigned char );
void enviar_cadena_por_USART(unsigned char *);
void inicializar_USART(void);
unsigned char caracter_listo_en_buffer_de_entrada(void);

void PC_LCD(void);
void inicializar_modo_SLEEP(void); //OPCIONAL
int main(void)
{
cli();
inicializar_LCD();
inicializar_USART();
inicializar_modo_SLEEP();
enviar_cadena_por_USART("Conectado! presione ENTER!\a\n\r\0");
sei();
while(1)
{
SMCR = (1<<SM1)|(1<<SM0)|(1<<SE);
}
return 0;
}

void inicializar_USART(void)
{
CLKPR = (1<<CLKPCE);
CLKPR = (1<<CLKPS1);
UBRR0H = 0;
UBRR0L = 12;
UCSR0A = (1<<U2X0);
UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
}
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 344 -

void inicializar_modo_SLEEP(void)
{
WDTCR |= (1<<WDTCE)|(1<<WDE);
WDTCR = 0;
EIFR = (1<<PCIE0);
PCMSK0 = (1<<PCINT1)|(1<<PCINT0);
}
unsigned char leer_USART()
{
return UDR0;
}

void enviar_cadena_por_USART(unsigned char *cadena)


{
for(unsigned char indice=0;cadena[indice] != '\0';indice++)
enviar_caracter_por_USART(cadena[indice]);
}

void enviar_caracter_por_USART(unsigned char caracter)


{
int espera = 0;
UDR0 = caracter;
if(SREG & (1<<SREG_I))
{
while ( !(UCSR0A&(1<<TXC0)) && (espera<10000) ) espera++;
}
else while( !(UCSR0A&(1<<TXC0)) );
UCSR0A|=(1<<TXC0);
}

void PC_LCD(void)
{
static unsigned char contador_de_caracteres;
static unsigned char LECTURA_USART[NUMERO_MAXIMO_DE_CARACTERES];

LECTURA_USART[contador_de_caracteres]=leer_USART();
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 345 -

if((LECTURA_USART[contador_de_caracteres]=='\r')||(contador_de_caracteres>=NUMERO_MA
XIMO_DE_CARACTERES-1))
{
LECTURA_USART[contador_de_caracteres+1]='\0';
escribir_palabras_en_LCD(LECTURA_USART);
enviar_cadena_por_USART("\a\n\rMensaje: \0");

for(contador_de_caracteres=0;contador_de_caracteres<NUMERO_MAXIMO_DE_CARA
CTERES;contador_de_caracteres++)
LECTURA_USART[contador_de_caracteres]='\0';
contador_de_caracteres=0;
}
else
{
contador_de_caracteres++;
}
}

SIGNAL(SIG_UART0_RECV)
{
PC_LCD();
}
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 346 -

6.4.7. Esquema de Conexiones

Figura. 6.31. Práctica 4, Esquema de Conexiones


CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 347 -

6.5. PRÁCTICA 5

6.5.1. Tema
Calibración del Oscilador Interno y el Timer/Counter1 de 16 bits.

6.5.2. Objetivo
− Presentar el Timer/Counter1 de 16 bits del ATmega169.
− Calibrar el Oscilador Interno OSCCAL utilizando el cristal externo.
− Configurar el Timer/Counter1 y emplear el Modo de Comparación para generar
señales luminosas de período preciso empleando la Salida del Modo de
Comparación y la interrupción por Coincidencia en la Comparación.

6.5.3. Materiales

Tabla. 6.9. Lista de Materiales


Cantidad Unidad Item
1 u AVR Butterfly
2 u Leds de propósito general
2 u Resistencias de 330 ohm, 1/8 Watt
1 u Bus de datos de 10 hilos, con headers
1 u Project Board
2 u Baterias AA - 1,5V
1 u Porta Baterias AA
20 cm Cable multipar de 8 hilos

6.5.4. Marco Teórico

El Timer/Counter1 de 16 bits
La unidad del Timer/Counter1 de 16 bits permite la correcta temporización
(sincronización) para la ejecución del programa (administración de evento), generación de
onda y medición temporizada de la señal. Las características principales del
Timer/Counter1 se listan a continuación:

− Diseño verdadero de 16 bit (p.ej. permite PWM de 16 bit).


− Dos Unidades Comparadoras independientes.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 348 -

− Registros Comparadores de doble buffer.


− Una Unidad para Captura de Datos (Input Capture).
− Anulador de Ruido para la Captura de Datos.
− Timer Encerado por Coincidencia en Comparación (Auto Recarga).
− Fase Correcta del Modulador de Ancho de Pulso (PWM), libre de fallos.
− PWM de Período Variable.
− Generador de Frecuencia.
− Contador de Evento Externo.
− Cuatro Fuentes de Interrupción Independientes (TOV1, OCF1A, OCF1B e
ICF1).

Los Registros. El Timer/Counter1 (TCNT1), los Registros para Comparación (Output


Compare Registers OCR1A/B) y el Registro para Captura de Datos (Input Capture
Register ICR1) son todos registros de 16 bits. Los Registros para el Control del
Timer/Counter (Timer/Counter Control Registers TCCR1A/B) son registros de 8 bits y no
tienen restricciones de acceso para la CPU. Las señales de petición de Interrupción son
todas visibles en el Registro de Indicadores de Interrupción del Timer (Timer Interrupt
Flag Register TIFR1). Todas las interrupciones son enmascaradas individualmente con el
Registro Enmascarador de Interrupciones del Timer (Timer Interrupt Mask Register
TIMSK1).

El Timer/Counter1 puede ser provisto de señal de reloj internamente, vía


preajustador (prescaler) o por una fuente externa de reloj en el pin T1. El bloque lógico
Clock Select controla cual fuente de reloj y flanco usará el Timer/Counter para incrementar
(o decrementar) su valor. El Timer/Counter permanece inactivo cuando ninguna fuente de
reloj está seleccionada. La salida de la lógica del Clock Select es llamada reloj del timer
(clkT1).

Los Registros de Comparación (OCR1A/B) son comparados en todo momento con el


valor del Timer/Counter (TCNT1). El resultado de la comparación puede ser usado por el
Generador de Onda para generar un PWM o una salida de frecuencia variable en el pin
Output Compare (OC1A/B). El evento de Coincidencia en la Comparación también seteará
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 349 -

al Indicador de Coincidencia en la Comparación (Compare Match Flag OCF1A/B), el cual


podrá ser usado para generar una petición de interrupción por la Comparación.

La unidad para Captura de Datos (Input Capture Unit) incluye una unidad de filtraje
digital (Anulador de Ruido) para reducir la probabilidad de capturar picos de ruido.

Para mayor información, referirse a la sección 2.12 del Capítulo 2.

6.5.5. Desarrollo
El diagrama de bloques mostrado en la Figura 6.32 exhibe los recursos del AVR
Butterfly empleados en la presente práctica.

Figura. 6.32. Diagrama de Bloques de los Recursos utilizados en la práctica 5

Guiándose en el diagrama de bloques se procede a la codificación del programa que


gobernará al Atmega169 y por ende al AVR Butterfly. Para la codificación se recomienda
seguir los siguientes pasos:

Primero. Incluir los archivos de cabecera necesarios para la aplicación:

− avr/io.h, que contiene la definición de los registros y de sus respectivos bits, tal
como especifica la documentación de ATMEL para cada microcontrolador.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 350 -

− signal.h, que contiene macros que permiten escribir funciones gestoras de


interrupción.

− avr/interrupt.h, que habilita el uso de las funciones habilitadora global de


interrupción “sei( )” y deshabilitadora global “cli( )” de interrupción, así como
también funciones para habilitar o deshabilitar individualmente las
interrupciones externas y del Timer, adicionalmente contiene algunas macros
para acceder al registro EIMSK y a la máscara para el mismo.

− avr/delay.h, contiene funciones para establecer períodos de retraso (delay).

Segundo. Definir constantes que ayudarán en la simplificación de la escritura del código


fuente.

#define VERDADERO 1
#define FALSO 0
#define ACTIVAR (1<<PE3)
#define DESACTIVAR (1<<PE2)
#define MASCARA_PORTE ((1<<PE3)|(1<<PE2))

Tercero. Declarar las funciones que interactuarán entre si para gobernar al


microcontrolador.

void calibrar_OSCCAL(void);
void inicializar_TIMER1(void);
void inicializar_joystick(void);
void activar_TIMER1(void);
void desactivar_TIMER1(void);
void seleccionar_CLKsys(void);
void modo_SLEEP(void);
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 351 -

Cuarto. Definir las funciones antes declaradas:

La función seleccionar_CLKsys( ) preajusta el reloj del sistema a 1 MHz (CLKsys =


1 MHz) a través del Registro Preajustador del Reloj CLKPR:

void seleccionar_CLKsys(void)
{
Habilitar cambio del preajustador del reloj:
CLKPR = (1<<CLKPCE);

Configurar el preajustador a 8 para dividir el RC/8, RC=8MHz, RC/8=1MHz:


CLKPR = (1<<CLKPS1) | (1<<CLKPS0);
}

La función calibrar_OSCCAL( ) calibrará el Oscilador RC Interno variando el Valor


del Registro de Calibración del Oscilador, OSCCAL. Para calibrarlo, utilizará como
referencia al cristal externo de 32 768 Hz (por su precisión) empleado como reloj para el
Timer/Counter2 y utilizará al Oscilador RC Interno como reloj para el Timer/Counter1.
Una vez configurado el reloj del sistema y los registros de los dos Timer/Counters, ordena
que ambos Timer/Counters cuenten pulsos de reloj hasta cuando el Timer/Counter2 llega a
contar 200 pulsos; entonces, compara el número de pulsos que cuenta el Timer/Counter1
con el valor que le corresponde al tiempo que transcurre desde que ambos empiezan a
contar hasta que el Timer/Counter2 cuenta 200, de la siguiente forma:

El tiempo que se demora el Timer/Counter2 en contar hasta 200 es el siguiente:

200 pulsos
t= = 0,006103515625seg
32768 pulsos / seg

El número de cuentas que hace el Timer/Counter1 en el tiempo calculado


anteriormente es el siguiente:

cuentas = 0,006103515625seg *1000000pulsos/seg = 6103.515625 = 6104 pulsos


CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 352 -

Entonces, en la Tabla 6.10 se aprecia una comparativa de número de cuentas entre el


Timer/Counter1 y el Timer/Counter2.

Tabla. 6.10. Timer/Counter 1 – 2, número de cuentas en un tiempo t = 0.0061 seg

Si el Timer/Counter1 contó más pulsos que el valor considerado como máximo


aceptable, entonces ésta función decrementará el OSCCAL; caso contrario, si contó menos
del valor considerado como mínimo, entonces incrementará el OSCCAL. Este proceso se
repite hasta que la cuenta del Timer/Counter1 esté dentro del rango aceptable, luego de lo
cual culmina la calibración del OSCCAL y finalmente deshabilita ambos Timer/Counters.

void calibrar_OSCCAL(void)
{
unsigned char calibrado = FALSO;
unsigned int temp=0;

seleccionar_CLKsys();

Deshabilitar interrupciones en el Registro Enmascarador de Interrupciones del


Timer/Counter2:
TIMSK2 = 0;

Seleccionar operación asincrónica del Timer2 para obtener la señal de reloj externa
desde el cristal externo de 32.768kHz:
ASSR = (1<<AS2);

Configurar el valor del OCR2A, para que este se compare con el Timer/Counter2.
Cuando se de una coincidencia en la comparación entre el Timer/Counter2 y el
OCR2A, osea TNCT2 = 200, el indicador correspondiente se utilizará para detener el
conteo:
OCR2A=200;
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 353 -

Deshabilitar todas las fuentes de interrupción del Timer/Counter1:


TIMSK1 = 0;

Iniciar el Timer1 sin preajuste:


TCCR1B = (1<<CS10);

Iniciar el Timer2 sin preajuste:


TCCR2A = (1<<CS20);

Esperar hasta que se actualicen el Timer/Counter2 y el OCR2A, evaluando los


indicadores OCR2UB y TCN2UB hasta que se borren. Necesario en el modo
asincrónico:
while((ASSR & (1<<OCR2UB)) | (ASSR & (1<<TCR2UB)));

Esperar hasta que se estabilice el reloj externo de cristal de 32768 Hz:


for(int i = 0; i < 10; i++) _delay_loop_2(30000);

Repetir mientras no esté calibrado el OSCCAL:


while(!calibrado)
{

Deshabilitar todas las interrupciones a través del habilitador global de interrupciones:


cli();

Borrar los indicadores de interrupción del Timer1 y del Timer2 escribiendo unos
lógicos en ellos:
TIFR1 = 0xFF;
TIFR2 = 0xFF;

Borrar el contenido del contador del Timer1 y ponerlo en cero, C maneja registros de
16 bits:
TCNT1 = 0;

Borrar el contenido del contador del Timer2 y ponerlo en cero:


TCNT2 = 0;
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 354 -

Esperar hasta que el indicador OCF2A indique que el Timer2 ha contado hasta 200 y
se produjo una coincidencia entre Timer/Counter2 y el OCR2A:
while(!(TIFR2 && (1<<OCF2A)));

Detener el Timer1:
TCCR1B = 0;

Habilitar todas las interrupciones a través del habilitador global de interrupciones:


sei();

Si el Timer1 se desborda, definir temp como 0xFFFF:


if ((TIFR1 && (1<<TOV1)))
{
temp = 0xFFFF;
}

De lo contrario, cargar la cuenta del Timer1 en temp:


else
{
temp = TCNT1;
}

OSCCAL: Registro para la Calibración del Oscilador.


Si el oscilador interno va muy rápido, entonces decrementar el OSCCAL:
if(temp > 6200)
{
OSCCAL--;
}

Si el oscilador interno va muy lento, entonces incrementar el OSCCAL:


else
if(temp < 6110)
{
OSCCAL++;
}
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 355 -

Si el oscilador interno RC está correcto, entonces calibrado = VERDADERO:


else calibrado = VERDADERO;

Reactivar el Timer1:
TCCR1B = (1<<CS10);
}

Una vez calibrado el OSCCAL, detener el Timer/Counter1 y el Timer/Counter2:


TCCR1B = 0;
TCCR2A = 0;
}

La función inicializar_TIMER1( ) configura el Timer/Counter1. Esta función


preajusta el reloj del Timer/Counter1, selecciona el modo de operación (modo de
generación de forma de onda) a CTC que causa que el registro que almacena el conteo se
borre cada vez que coincide con el valor del Registro de Comparación OCR1A, configura
el valor con el que se comparará el contador OCR1A, configura la Salida del Modo de
Comparación para que cada vez que coincida la comparación alterne el valor lógico del pin
OC1A, habilita la interrupción por coincidencia en la comparación.

Selección del reloj preajustado para el Timer/Counter1:

CLKsys 1MHz
CLK Timer / Counter1 = = = 125 KHz
N 8

El valor del OCR1A con el que se compara el contador permite que cada
coincidencia de comparación se efectúe a una frecuencia de 2 Hz, esto implica dos
coincidencias por segundo, dos interrupciones por segundo y dos conmutaciones de OC1A
por segundo. El valor OCR1A se calcula con la ecuación 6.1.

Ecuación. 6.1. Frecuencia de Coincidencia en la Comparación


CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 356 -

CLKsys 1000000 Hz
OCRnA = −1 = − 1 = 62499 = 0 xF 423
2 * N * f OCnA 2 * 8 * 1Hz

n = 1 ⇒ OCR1A y f OC1 A
N = Divisor del reloj = preajustador del reloj para el Timer / Counter1
fclk _ I / O = CLKsys
fOCnA = fgenerada = fcoincidencia / 2 = 2 Hz / 2 = 1Hz

Entonces, la frecuencia de coincidencia en la comparación es la siguiente:

125000Hz
= 2 Hz = 2veces / segundo
62500

void inicializar_TIMER1(void)
{
Prohibir las interrupciones:
cli();

Resetear el preajustador del reloj del Timer/Counter2:


GTCCR = (1<<PSR2);

Configurar la Salida del Modo de Comparación para que el pin OC1A alterne su
valor lógico con cada coincidencia:
TIMSK1 = (1<<OCIE1A);

Fijar el valor del registro OCR1A (en WinAVR, OCRA1) con el valor calculado
anteriormente utilizando la Ecuación 6.1, para que se compare con el
Timer/Counter1 y se genere una coincidencia de comparación cada 0.5 segundos
(1/(2Hz) = 0.5 seg):
OCRA1 = 0xF423;

Encerar el Contador:
TCNT1 = 0;
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 357 -

Borrar los indicadores de interrupción del Timer/Counter2:


TIFR1 = 0xFF;

Configurar el pin 5 del Puerto B como salida, para utilizarlo como pin de salida
OC1A:
DDRB |= (1<<DDB5);

Poner a cero el pin 5 del Puerto B:


PORTB |= (0<<PB5);
Modo de Salida de Comparación configurado para que conmute el pin OC1A en cada
coincidencia de comparación:
TCCR1A = ((1<<COM1A0)|(0<<WGM11)|(0<<WGM10));

Establecer el modo de generación de onda en el modo CTC, Timer detenido sin reloj:
TCCR1B = ((0<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(0<<CS10));
}

La función inicializar_joystick( ) habilitará el joystick, permitiendo utilizar dos de


sus direcciones, izquierda y derecha, que más adelante permitirán activar y desactivar
respectivamente el Timer/Counter1.

void inicializar_joystick(void)
{
Configurar como entradas los 2 pines del Puerto E que contribuyen con
interrupciones:
DDRE = ~(MASCARA_PORTE);

Habilitar las Pull-Ups en los 2 pines del Puerto E que contribuyen con
interrupciones:
PORTE = MASCARA_PORTE;

Habilitar interrupciones por cambio de nivel en los pines del Puerto E:


EIMSK = (1<<PCIE0);
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 358 -

Enmascarar las interrupciones del Puerto E para que únicamente los 2 pines del
Puerto E, que están conectados al Joystick, contribuyan con interrupciones (izquierda
- derecha):
PCMSK0 = MASCARA_PORTE;
}

La función activar_TIMER1( ) activa el Timer/Counter1, seleccionando como


fuente de reloj al reloj preajustado con 8 (CLKsys/8).
void activar_TIMER1(void)
{
sbi(TCCR1B,CS11);
}

La función desactivar_TIMER1( ) desactiva el Timer/Counter1, para hacerlo quita la


fuente de reloj del Timer/Counter1.

void desactivar_TIMER1(void)
{
cbi(TCCR1B,CS11);
}

La función modo_SLEEP( ) configura el modo SLEEP adecuado para que el


Timer/Counter1 no se detenga.

void modo_SLEEP(void)
{
Seleccionar modo Idle:
SMCR = (1<<SE);
}

Las gestora de Interrupción SIGNAL(SIG_OUTPUT_COMPARE1A) gestiona la


interrupción que se activa cuando ocurre una coincidencia en la comparación entre el
Timer/Counter1 y el registro OCR1A.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 359 -

SIGNAL(SIG_OUTPUT_COMPARE1A)
{
En cada interrupción conmuta el estado del pin 0 del Puerto B:
if(PORTB &= 1) cbi(PORTB,0);
else sbi(PORTB,0);
}

La gestora de Interrupción SIGNAL(SIG_PIN_CHANGE0) atiende a la interrupción


que se activa cuando se mueve el joystick hacia la izquierda o hacia la derecha.

SIGNAL(SIG_PIN_CHANGE0)
{
unsigned char opcion=0;
Obtener la selección hecha con el joystick, izquierda o derecha:
opcion=( ~(PINE) & 0x0C );

Si se mueve el joystick hacia la derecha, activar el Timer/Counter1:


if(opcion==ACTIVAR) activar_TIMER1();

Si se mueve el joystick hacia la izquierda, desactivar el Timer/Counter1:


else if(opcion==DESACTIVAR) desactivar_TIMER1();
}

Quinto. Definir la función principal. La función principal main( ) inicializa los recursos
que se emplearán.

int main(void)
{
Prohibir interrupciones:
cli();

Configurar el pin 0 del Puerto B como salida para utilizarlo en la interrupción por
coincidencia:
DDRB = (1<<DDB0);
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 360 -

Poner a cero el Puerto B:


PORTB = 0;

Calibrar el Oscilador Interno:


calibrar_OSCCAL();

Inicializar el Timer/Counter1 y el joystick:


inicializar_TIMER1();
inicializar_joystick();

Habilitar interrupciones:
sei();

Entrar en el lazo infinito:


while(1)
{
Entrar en modo sleep, inicialmente y luego de asistir a cada interrupción:
modo_SLEEP();
}
return 0;
}

Sexto. Se procede a la compilación y la generación de los archivos .hex y .cof.

Séptimo. Antes de cargar el programa en el microcontrolador, es recomendable evaluar


dicho programa con el AVR Simulator del AVR Studio (ver Capítulo 5) y realizar la
depuración correspondiente.

Octavo. Una vez culminada la simulación de forma satisfactoria, descargar el programa


(archivo *.hex) en el microcontrolador ATmega169 que comanda al AVR Butterfly.

Noveno. Armar el circuito como indica la Figura 6.33 y proceder a hacer las pruebas.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 361 -

6.5.6. Código Fuente

#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

#define VERDADERO 1
#define FALSO 0
#define ACTIVAR (1<<PE3)
#define DESACTIVAR (1<<PE2)
#define MASCARA_PORTE ((1<<PE3)|(1<<PE2))

void calibrar_OSCCAL(void);
void inicializar_TIMER1(void);
void inicializar_joystick(void);
void activar_TIMER1(void);
void desactivar_TIMER1(void);
void seleccionar_CLKsys(void);
void modo_SLEEP(void);

int main(void)
{
cli();
DDRB = (1<<DDB0);
PORTB = 0;
calibrar_OSCCAL();
inicializar_TIMER1();
inicializar_joystick();
sei();
while(1)
{
modo_SLEEP();
}
return 0;
}

void seleccionar_CLKsys(void)
{
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 362 -

CLKPR = (1<<CLKPCE);
CLKPR = (1<<CLKPS1) | (1<<CLKPS0);
}

void inicializar_TIMER1(void)
{
cli();
GTCCR = (1<<PSR2);
TIMSK1 = (1<<OCIE1A);
OCRA1 = 0xF423;
TCNT1 = 0;
TIFR1 = 0xFF;
DDRB |= (1<<DDB5);
PORTB |= (0<<PB5);
TCCR1A = ((1<<COM1A0)|(0<<WGM11)|(0<<WGM10));
TCCR1B = ((0<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(0<<CS10));
}

void inicializar_joystick(void)
{
DDRE = ~(MASCARA_PORTE);
PORTE = MASCARA_PORTE;
EIMSK = (1<<PCIE0);
PCMSK0 = MASCARA_PORTE;
}

void activar_TIMER1(void)
{
sbi(TCCR1B,CS11);
}

void desactivar_TIMER1(void)
{
cbi(TCCR1B,CS11);
}

void calibrar_OSCCAL(void)
{
unsigned char calibrado = FALSO;
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 363 -

unsigned int temp=0;

seleccionar_CLKsys();
TIMSK2 = 0;
ASSR = (1<<AS2);
OCR2A=200;
TIMSK1 = 0;
TCCR1B = (1<<CS10);
TCCR2A = (1<<CS20);
while((ASSR & (1<<OCR2UB)) | (ASSR & (1<<TCR2UB)));
for(int i = 0; i < 10; i++) _delay_loop_2(30000);
while(!calibrado)
{
cli();
TIFR1 = 0xFF;
TIFR2 = 0xFF;
TCNT1 = 0;
TCNT2 = 0;
while(!(TIFR2 && (1<<OCF2A)));
TCCR1B = 0;
sei();
if ((TIFR1 && (1<<TOV1))) temp = 0xFFFF;
else temp = TCNT1;
if(temp > 6200) OSCCAL--;
else if(temp < 6110) OSCCAL++;
else calibrado = VERDADERO;

TCCR1B = (1<<CS10);
}
TCCR1B = 0;
TCCR2A = 0;
}

void modo_SLEEP(void)
{
SMCR = (1<<SE);
}

SIGNAL(SIG_OUTPUT_COMPARE1A)
{
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 364 -

if(PORTB &= 1) cbi(PORTB,0);


else sbi(PORTB,0);
}

SIGNAL(SIG_PIN_CHANGE0)
{
unsigned char opcion=0;
opcion=( ~(PINE) & 0x0C );
if(opcion==ACTIVAR) activar_TIMER1();
else if(opcion==DESACTIVAR) desactivar_TIMER1();
}
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 365 -

6.5.7. Esquema de Conexiones

Figura. 6.33. Práctica 5, Esquema de Conexiones


CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 366 -

6.6. PRÁCTICA 6

6.6.1. Tema
El Sensor de Temperatura y el Convertidor Analógico Digital, ADC.

6.6.2. Objetivo
− Presentar el Convertidor Analógico Digital, ADC, que contiene el ATmega169
del AVR Butterfly.
− Utilizar el ADC para realizar mediciones de temperatura a través del Sensor de
Temperatura del tipo Resistor NTC (Coeficiente Negativo de Temperatura).

6.6.3. Materiales

Tabla. 6.11. Lista de Materiales


Cantidad Unidad Item
1 u AVR Butterfly
2 u Baterias AA - 1,5V
1 u Porta Baterias AA

6.6.4. Marco Teórico

El Convertidor Analógico Digital

Características del Convertidor Analógico Digital


− Resolución de 10 bits.
− No linealidad Integral de 0.5 LSB.
− Precisión Absoluta de 2 LSB.
− Tiempo de Conversión de 13us a 260us (reloj del ADC: 50KHz a 1MHz).
− Hasta 15kSPS en Máxima Resolución (reloj del ADC: 200 kHz).
− Ocho Canales de Entrada Multiplexados.
− Ajuste Opcional para Lectura del Resultado del ADC.
− Rango del Voltaje de Entrada de 0 – Vcc.
− Voltaje de Referencia del ADC de 1.1 V elegible.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 367 -

− Funcionamiento Libre o Modo de Conversión Única.


− Inicio de la Conversión del ADC por Auto Activación mediante Fuentes de
Interrupción.
− Interrupción por Conversión Finalizada del ADC.
− Anulador de Ruido en Modo de Sleep.

Funcionamiento del ADC. El ADC convierte un voltaje analógico de entrada en un valor


digital de 10 bits a través de aproximaciones sucesivas. El valor mínimo de una conversión
representa a GND y el valor máximo representa al voltaje en el pin AREF menos 1 LSB.
Opcionalmente, puede conectarse AVCC o un voltaje de referencia interna de 1.1V al pin
AREF al escribir en los bits REFSn del Registro ADMUX. La referencia de voltaje interna
puede ser desacoplada por un condensador externo en el pin AREF, para mejorar la
inmunidad al ruido.

El ADC genera un resultado de 10 bits que se presenta en los Registros de Datos del
ADC (ADC Data Registers), ADCH (8 bits) y ADCL (8 bits). Por defecto, el resultado se
presenta ajustado hacia la derecha pero, opcionalmente, puede presentarse ajustado hacia la
izquierda configurando el bit ADLAR del ADMUX.

Si el resultado está ajustado hacia la izquierda y no se requiere más que 8 bits, es


suficiente leer el ADCH. De otro modo, el ADCL deberá ser leído primero y luego el
ADCH, para asegurarse de que el contenido de los Registros de Datos correspondan a la
misma conversión. Una vez que el ADCL es leído, se bloquea el acceso del ADC a los
Registros de Datos. Esto significa que si se ha leído el ADCL y una conversión se
completa antes de que se lea el ADCH, ni el registro es actualizado ni el resultado de la
conversión se pierde. Cuando el ADCH es leído, el acceso del ADC a los Registros ADCH
y ADCL se habilita nuevamente.

El ADC tiene su propia interrupción que puede activarse cuando una conversión se
ha completado. Cuando se prohíbe el acceso del ADC a los Registros de Datos en medio
de la lectura del ADCH y del ADCL, la interrupción se activará aún si el resultado se
pierde.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 368 -

El Resistor de Coeficiente Negativo de Temperatura


Un Resistor NTC se caracteriza por el hecho de que su resistencia aumenta cuando la
temperatura desciende y viceversa. Valiéndose de un divisor de voltaje para leer el voltaje
sobre el Resistor NTC, a través de los canales ADC del ATmega169, se medirá la
temperatura.

Para calcular la temperatura en grados Celsius se emplea la siguiente ecuación:

β
Temperatur a = − Tcero
⎛ ⎛ ADC ⎞ β ⎞
⎜⎜ ln ⎜ ⎟+ ⎟⎟
⎝ ⎝ 1024 − ADC ⎠ Tamb ⎠
Ecuación. 6.2. Temperatura en grados Celsius

β = 4250
ADC = valor del Registro de Datos del ADC en el ATmega169 - ADCL y
ADCH.
Tcero = 273 ºK
Tamb = (273º + 20º) = 293 ºK

El AVR Butterfly es capaz de medir la temperatura, en el rango de -10 ºC / +14 ºF


hasta +60 ºC / +140 ºF, con una precisión de ±1 ºC.

6.6.5. Desarrollo
El diagrama de bloques de la Figura 6.34 exhibe los recursos que se utilizarán en la
presente práctica.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 369 -

Figura. 6. 34. Diagrama de Bloques de los Recursos utilizados en la práctica 5

Para realizar mediciones de Temperatura, el AVR Butterfly está equipado con un


Resistor NTC. El procedimiento a seguir en la presente práctica se lista a continuación:

1. Calcular la temperatura usando la Ecuación 6.2 para el rango completo del


ADC, de 0 hasta 1023 como se aprecia en la Figura 6.35, e indexar en una tabla
las lecturas ADC correspondientes a 0 ºC, 1 ºC, 2 ºC, …, hasta 60 ºC.

2. Configurar el Conversor ADC para realizar lecturas de nivel de voltaje,


mediante el canal 0 (cero) del ADC, en el Resistor NTC.

3. Convertir la lectura analógica al formato digital, obteniendo valores entre 0


(para 0 V) y 1023 (para 3 V) ya que el conversor ADC es de 10 bits.

4. Hacer ocho lecturas y ocho conversiones, para luego obtener una lectura
promedio.

5. Comparar la lectura promedio, obtenida del ADC, con la Temperatura indexada


en la tabla del paso 1, para obtener el índice (posición en la Tabla) de la
temperatura indexada más próxima a la lectura promedio, tal como en las
Figuras 6.36 y 6.37.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 370 -

Figura. 6.35. Cálculo de la temperatura

Se observa en la Figura 6.36 que una lectura cercana a 761 corresponde a 0ºC.

Figura. 6.36. Conversión ADC para 0 ºC

En la Figura 6.37 se observa que una lectura cercana a 512 corresponde a la


temperatura de 20ºC (temperatura ambiente).

Figura. 6.37. Conversión ADC para la temperatura ambiente

La tabla que indexa las temperaturas calculadas con la Ecuación 6.2 es almacenada
en la memoria flash de programa del ATmega169 y contiene los valores ADC
correspondientes a los valores enteros de temperatura calculados en el rango de 0 ºC hasta
60 ºC; por ejemplo, el valor 761 (0 ºC) tendrá el índice 0 (posición 0 en la tabla), …, 640
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 371 -

(10 ºC) tendrá el índice 10, …, 512 (20 ºC) tendrá el índice 20, …, 153 (60 ºC)tendrá el
índice 60. Ver Figura 6.38.

Figura. 6.38. Índice, lectura ADC, Temperatura Calculada

Por ejemplo, cuando el conversor ADC obtiene el valor de 515, el microcontrolador


busca en la tabla este el valor; si ningún valor coincide, busca el valor inmediatamente
inferior al obtenido del ADC que esté presente en la tabla, como se observa en la Figura
6.38 el inmediato inferior es 512 cuyo índice en la tabla es 20 que corresponde a 20 ºC.

Desplegar en el LCD el índice correspondiente al valor del ADC (posición en la tabla


de temperaturas).

A continuación se explica el código del software que se utiliza para hacer


mediciones de Temperatura empleando el ADC del ATmega169 del AVR Butterfly.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 372 -

Primero. Se deberán incluir los siguientes archivos de cabecera (#include):

− avr/io.h, que contiene la definición de los registros y de sus respectivos bits, tal
como especifica la documentación de ATMEL para cada microcontrolador.

− avr/signal.h, que contiene macros que permiten escribir funciones gestoras de


interrupción.

− progmem.h, contiene las macros que permiten el acceso a la memoria de


programa.

− stdlib.h, contiene macros básicas y funciones como las definidas por el estándar
ISO. Necesario para poder utilizar más adelante la función itoa( ) que transforma
un valor entero en una cadena de caracteres.

− LCD.h, es el código desarrollado para la Práctica 3 modificado. La modificación


que se hace es borrar la función principal, main( ), junto con su contenido y
grabar el archivo cambiando la extensión *.c por *.h. Este archivo debe ser
grabado en la misma carpeta que contiene el código fuente.

− tabla.h, es el archivo en el que se encuentran indexadas las lecturas ADC


correspondientes a las temperaturas de 0 ºC a 60 ºC, calculadas mediante la
Ecuación 6.2. Este archivo debe ser grabado en la misma carpeta que contiene el
código fuente.

Segundo. Declarar las funciones necesarias para la conversión ADC y para el


procesamiento de la información obtenida.

void Inicializar_ADC(void);
int leer_ADC(void);
void leer_temperatura(void);
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 373 -

Tercero. Definir las funciones declaradas anteriormente.

La función Inicializar_ADC( ) selecciona la frecuencia de reloj de sistema,


selecciona el canal ADC que se utilizará, habilita el ADC y ejecuta una conversión ADC
para inicializar el ADC.

void Inicializar_ADC(void)
{
Seleccionar la frecuencia del reloj del sistema, RC/4 = 8MHz/4 = 2 MHz:
CLKPR = (1<<CLKPCE);
CLKPR = (1<<CLKPS1);

Seleccionar el Canal 0 del ADC:


ADMUX = 0;

Habilitar el ADC y seleccionar el reloj para el ADC, 2MHz/16 = 125 KHz para
obtener una velocidad de muestreo promedio. Para obtener máxima resolución, el
fabricante recomienda seleccionar una frecuencia entre 50KHz - 200 KHz:
ADCSRA = (1<<ADEN)|(1<<ADPS2);

Ejecutar una conversión para inicializar el ADC y evitar errores en la primera


lectura de la aplicación:
leer_ADC();
}

La función leer_ADC( ) activa/energiza los sensores del AVR Butterfly, habilita el


ADC, ejecuta 8 conversiones ADC y obtiene el promedio de las 8 conversiones.

int leer_ADC(void)
{
char i;
int ADC_temp;
int ADCsuma = 0;
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 374 -

Activar/energizar los sensores, PORTF3 será la alimentación VCP para el Resistor


NTC y para la LDR.
Configurar el pin 3 del Puerto F como salida:
sbi(PORTF, PF3);
Configurar pin 3 del Puerto F a nivel alto para activar/energizar a los sensores:
sbi(DDRF, DDF3);

Habilitar el ADC, por si otra aplicación lo deshabilita:


sbi(ADCSRA, ADEN);

Activar/ordenar la ejecución de una conversión ADC:


ADCSRA |= (1<<ADSC);

Esperar hasta que el ADC indique que ha culminado una conversión, mediante el
sondeo del indicador ADIF:
while(!(ADCSRA & 0x10));

Repetir ocho veces el proceso dentro del lazo FOR:


for(i=0;i<8;i++)
{

Activar/ordenar la ejecución de una conversión ADC:


ADCSRA |= (1<<ADSC);

Esperar hasta que el ADC indique que ha culminado una conversión, mediante el
sondeo del indicador ADIF:
while(!(ADCSRA & 0x10));

Leer el byte bajo del Registro de Datos de 16 bits del ADC:


ADC_temp = ADCL;

Leer el byte alto del Registro de Datos de 16 bits del ADC:


ADC_temp += (ADCH << 8);
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 375 -

Acumular en ADCsuma los resultados de las 8 lecturas/conversiones ADC:


ADCsuma += ADC_temp;
}

Calcular el promedio de las lecturas ADC. Como son 8 lecturas, se debe dividir
ADCsuma para 8, puesto que es lo mismo que desplazar el contenido de ADCsuma
hacia la derecha 3 posiciones:
ADCsuma = ADCsuma >> 3;

Deshabilitar los Sensores quitándoles la alimentación de voltaje desde PORTF3:


cbi(PORTF,PF3);
cbi(DDRF,DDF3);

Deshabilitar el ADC:
cbi(ADCSRA, ADEN);

Retornar el promedio de las lecturas/conversiones, retorna un valor de 16 bits (int):


return ADCsuma;
}

La función leer_temperatura( ) obtiene el resultado de la función leer_ADC( ), lo


procesa y lo despliega en el LCD.

void leer_temperatura(void)
{
int lectura=0;
int i = 0;

Reservar espacio para máximo 3 dígitos para la lectura de temperatura, puesto que
luego del procesamiento de la lectura ADC el resultado será desplegado en el LCD;
para ello, es necesario convertir el resultado final de la lectura, de un valor entero a
una cadena de máximo tres caracteres:
char temperatura_ASCII[]={'0','0','0','\0'};

Leer la temperatura utilizando el ADC:


lectura = leer_ADC();
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 376 -

Localizar en la tabla el índice correspondiente a la lectura ADC, en la tabla constan


61 lecturas, correspondientes a 0 ºC hasta 60 ºC, esto quiere decir índices de 0 hasta
61:
for(i=0;i<=61;i++)
{

Incrementar el índice hasta que lectura sea igual o mayor a uno de los valores
indexados en la tabla almacenada en la memoria de programa. pgm_read_word() lee
una palabra en la memoria de programa Flash con direcciones de 16 bits:
if(lectura>=pgm_read_word(&TEMP_Celcius_pos[i]))
{

Cuando llega a ser igual o mayor, romper el lazo FOR que se utiliza para búsqueda,
quedando almacenado el índice en la variable i:
break;
}
}

Obtenido el índice, que en este caso representa la temperatura, se realiza una


conversión de formato entero a formato ASCII, esta función está contenida en el
archivo cabecera stdlib.h. Entonces, almacenar en una matriz, en este caso
temperatura_ASCII, el valor del entero contenido en la variable ‘i’ (el índice) que
representa la temperatura en grados Celsius:
itoa(i,temperatura_ASCII,10);

Enviar a escribir/desplegar en el LCD el valor resultante del proceso de medición de


temperatura (conversión ADC-procesamiento):
escribir_caracter_en_LCD(temperatura_ASCII[0],0);
escribir_caracter_en_LCD(temperatura_ASCII[1],1);
escribir_caracter_en_LCD(temperatura_ASCII[2],2);
escribir_caracter_en_LCD('.',3);
escribir_caracter_en_LCD('C',4);
actualizar_LCD();
}
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 377 -

Cuarto, Crear y guardar el archivo de cabecera tabla.h que contiene las conversiones ADC
equivalentes, o las más cercanas, a las que corresponden a los valores enteros de
Temperatura calculados con la Ecuación 6.2 en el rango de 0 ºC a 60 ºC.

PROGMEM permite el acceso a la memoria de programa FlashROM, entonces la


tabla TEMP_Celcius_pos[] de temperaturas será declarada como una matriz que estará
almacenada en la Memoria Flash de Programa.
const int TEMP_Celcius_pos[] PROGMEM =
{ // de 0 a 60 grados
761,750,738,727,715,703,691,678,666,653, //0-9 ºC
640,628,615,602,589,576,563,551,538,525, //10-19 ºC
512,500,487,475,462,450,438,426,415,403, //20-29 ºC
392,381,370,359,349,338,328,319,309,300, //30-39 ºC
291,282,273,265,256,248,240,233,225,218, //40-49 ºC
211,205,198,192,186,180,174,168,163,158, //50-59 ºC
153 //60 ºC
};

Quinto. Definir la función principal. La función main( ) empieza ejecutando la


inicialización del ADC y del LCD, habilita el uso de interrupciones y despliega la palabra
“Temperatura” en el LCD; luego entra en el lazo infinito, ordenando al microcontrolador
que ejecute una lectura de Temperatura y que entre en modo Sleep luego de atender a
cualquier interrupción.

int main(void)
{
char *palabra="Temperatura\0";

Inicializar el ADC y el LCD:


Inicializar_ADC();
Inicializar_LCD();

Habilitar globalmente las interrupciones:


sei();

Desplegar en el LCD la palabra “Temperatura”:


CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 378 -

escribir_palabra_en_LCD(palabra);
while(1)
{

Leer la temperatura y desplegar su valor en el LCD:


leer_temperatura();

Entrar en modo Sleep, en el modo ADC Noise Reduction (Reducción de Ruido del
ADC):
SMCR=(1<<SM0)|(1<<SE);
}
return 0;
}

Sexto. Se procede a la compilación y la generación de los archivos .hex y .cof.

Séptimo. Antes de cargar el programa en el microcontrolador, es recomendable evaluar


dicho programa con el AVR Simulator del AVR Studio (ver Capítulo 5) y realizar la
depuración correspondiente.

Octavo. Una vez culminada la simulación de forma satisfactoria, descargar el programa


(archivo *.hex) en el microcontrolador ATmega169 que comanda al AVR Butterfly.

Noveno. Armar el circuito como indica el esquema de conexiones mostrado en la Figura


6.39 y proceder a hacer las pruebas.

6.6.6. Código Fuente

#include <avr/io.h>
#include <interrupt.h>
#include <progmem.h>
#include <stdlib.h>

#include "LCD.h"
#include "tabla.h"
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 379 -

void Inicializar_ADC(void);
int leer_ADC(void);
void leer_temperatura(void);

int main(void)
{
char *palabra="Temperatura\0";
Inicializar_ADC();
Inicializar_LCD();
sei();
escribir_palabra_en_LCD(palabra);
while(1)
{
leer_temperatura();
SMCR=1; //entrar en Sleep modo Idle
}
return 0;
}

void Inicializar_ADC(void)
{
CLKPR = (1<<CLKPCE);
CLKPR = (1<<CLKPS1);
ADMUX = 0;
ADCSRA = (1<<ADEN)|(1<<ADPS2);
leer_ADC();
}

int leer_ADC(void)
{
char i;
int ADC_temp;
int ADCsuma = 0;
sbi(PORTF, PF3);
sbi(DDRF, DDF3);
sbi(ADCSRA, ADEN);
ADCSRA |= (1<<ADSC);
while(!(ADCSRA & 0x10));
for(i=0;i<8;i++)
{
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 380 -

ADCSRA |= (1<<ADSC);
while(!(ADCSRA & 0x10));
ADC_temp = ADCL;
ADC_temp += (ADCH << 8);
ADCsuma += ADC_temp;
}
ADCsuma = (ADCsuma >> 3);
cbi(PORTF,PF3);
cbi(DDRF,DDF3);
cbi(ADCSRA, ADEN);
return ADCsuma;
}

void leer_temperatura(void)
{
int lectura=0;
int i = 0;
char temperatura_ASCII[]={'0','0','0','\0'};
lectura = leer_ADC();
for(i=0;i<=61;i++)
{
if(lectura>pgm_read_word(&TEMP_Celcius_pos[i]))
{
break;
}
}
itoa(i,temperatura_ASCII,10);
escribir_caracter_en_LCD(temperatura_ASCII[0],0);
escribir_caracter_en_LCD(temperatura_ASCII[1],1);
escribir_caracter_en_LCD(temperatura_ASCII[2],2);
escribir_caracter_en_LCD('.',3);
escribir_caracter_en_LCD('C',4);
actualizar_LCD();
}
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 381 -

//Archivo cabecera tabla.h

const int TEMP_Celcius_pos[] PROGMEM = // temperaturas - ADC


{ // de 0 a 60 grados
761,750,738,727,715,703,691,678,666,653, //0-9 ºC
640,628,615,602,589,576,563,551,538,525, //10-19 ºC
512,500,487,475,462,450,438,426,415,403, //20-29 ºC
392,381,370,359,349,338,328,319,309,300, //30-39 ºC
291,282,273,265,256,248,240,233,225,218, //40-49 ºC
211,205,198,192,186,180,174,168,163,158, //50-59 ºC
153 //60 ºC
};
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 382 -

6.6.7. Esquema de Conexiones

Figura. 6.39. Práctica 6, Esquema de Conexiones


CAPÍTULO 7: CONCLUSIONES Y RECOMENDACIONES - 383 -

CAPÍTULO 7

CONCLUSIONES Y RECOMENDACIONES

7.1. CONCLUSIONES

- El microcontrolador ATmega169 de ATMEL es un dispositivo programable de


excelente desempeño y de poca complejidad.

- La característica de controlador LCD, del microcontrolador ATmega169, permite


abaratar costos en la implementación de aplicaciones que necesitan despliegue de
información a través de LCD. Esta característica permite controlar pantallas de
cristal líquido de bajo costo, que por ser básicas no poseen ni driver interno, ni
interfaces de comunicación como la mayoría de los costosos módulos LCD.

- El Kit AVR Butterfly es una poderosa herramienta de aprendizaje, es práctico,


eficaz y muy amigable; que con el desarrollo de las prácticas va descubriendo
progresivamente las características del microcontrolador ATmega169.

- El Boot Loader del ATmega169, combinado con el circuito convertidor de nivel


RS-232 incluido en el Kit AVR Butterfly, permite la funcionalidad de
Programación dentro del Sistema (In-System Programming, ISP); en este caso,
entiéndase como Sistema al Kit AVR Butterfly. ISP permite programar al
microcontrolador sin la necesidad de extraerlo del sistema.

- El Ambiente de Desarrollo Integrado AVR Studio 4, es una herramienta poderosa


que permite simular, emular y depurar un proyecto antes de intentar probarlo con
el hardware, ahorrando tiempo y recursos.
CAPÍTULO 7: CONCLUSIONES Y RECOMENDACIONES - 384 -

- El Compilador C, WinAVR, es una herramienta gratuita y poderosa, su sencillez


permite enfocarse en la programación y no en las bondades del mismo.

- El lenguaje C es óptimo en el desarrollo de software para microcontroladores,


este permite segmentar el código fuente en varias funciones especializadas y
archivos, permitiéndole al programador rehusar las mismas funciones en otras
aplicaciones. Además, este lenguaje permite codificar más ordenadamente y es
un lenguaje de medio nivel, que lo hace ideal para desarrollar aplicaciones de
ingeniería.

- La información y soporte que proporciona Atmel Corp. es satisfactoria. La


documentación es clara, las herramientas son gratuitas y su gente es rápida en dar
respuesta a las inquietudes de los clientes.

- Puesto que AVR Studio y WinAVR son gratuitos, se evita el uso ilegal de
software con licencias adulteradas que atentan contra la ética y las buenas
prácticas profesionales.

- El Kit AVR Butterfly es una herramienta de muy bajo costo (19.99 USD + gastos
de envío, en www.digikey.com) y está equipado con una gran variedad de
dispositivos que permiten una amplia gama de prácticas de laboratorio, que
facilitarán el proceso de enseñanza-aprendizaje en la cátedra de
Microcontroladores y adicionalmente en las cátedras de Instrumentación y
Sensores, e Interfaces con PCs.

- Se ha logrado alcanzar exitosamente el objetivo de este proyecto y se ha


demostrado, con la Guía de Prácticas de Laboratorio, que el Kit propuesto en este
proyecto es actualmente, en el Departamento de Eléctrica y Electrónica de la
ESPE, la mejor opción para el proceso de enseñanza/aprendizaje en la cátedra de
Microcontroladores.
CAPÍTULO 7: CONCLUSIONES Y RECOMENDACIONES - 385 -

7.2. RECOMENDACIONES

- No apoyar el Kit AVR Butterfly en superficies conductivas tales como metal,


líquidos, etc., puesto que podrían causar daños en el mismo.

- No conectar cables directamente en los espacios para conexiones externas del


Kit, ya que podrían causar cortocircuito; en su lugar, colocar Headers fijos como
se indica en el Capítulo 5.

- Reemplazar la batería que incluye el fabricante en el Kit AVR Butterfly, por una
fuente externa de voltaje de 3 V. Esto permitirá desarrollar fiablemente las
aplicaciones, ya que se evita los errores que por batería descargada confunden al
usuario.

- Editar el archivo C:\WinAVR\avr\include\avr\iom169.h, con cualquier software


procesador de textos, para verificar que los nombres de los registros, vectores de
interrupción, etc., sean iguales a los que constan en el datasheet del
microcontrolador ATmega169.

- Al momento de codificar software en lenguaje C, es recomendable segmentar el


código fuente en funciones especializadas, esto quiere decir que cada función
realice una sola tarea específica; de este modo se podrán utilizar las mismas
funciones en otras aplicaciones.

- Simular el dispositivo y depurar el código fuente simultáneamente en AVR


Studio, antes de descargar el software en el dispositivo. Con esto, se evita daños
en el dispositivo por errores en la codificación del software.

- Al momento de la compra del Kit, es recomendable informarse completamente


de los gastos y tiempos de envío del mismo; de lo contrario, es muy probable
encontrarse con inconvenientes.

- Es preciso y necesario recomendar el uso del Kit AVR Butterfly,


simultáneamente con la Guía de Prácticas de Laboratorio, en la cátedra de
Microcontroladores.
REFERENCIAS BIBLIOGRÁFICAS

REFERENCIAS BIBLIOGRÁFICAS

BIBLIOGRAFÍA DE TEXTO

- PARDUE, Joe, C Programming for Microcontrollers, tomo 1, 1ra Edición, Editorial


Smiley Micros, Knoxville-Tennessee Octubre del 2005.

BIBLIOGRAFÍA DE INTERNET

- 8-bit AVR Microcontroller with 16K Bytes In-System Programmable Flash


ATmega169V Atmega169 Rev A to E, www.atmel.com, 4 de mayo del 2005.

- Introduction to the Atmel AVR Butterfly, www.atmel.com, 19 de julio del 2003.

- AVR Butterfly Evaluation Kit User Guide, www.atmel.com/products/AVR/butterfly,


25 de abril del 2005.

- AVR-libc Reference Manual 1.2.3, http://savannah.nongnu.org/projects/avr-libc/, 15 de


febrero de 2005.

- MANN, Richard, How to Program an 8-bit Microcontroller Using C Language,


www.atmel.com, 23 de junio del 2004.

- SVENDLSI, Odd Jostein, Designing for Efficient Production with In-System Re-
programmable Flash µCs, www.atmel.com, 28 de enero del 2005.

- RODLAND, Arild, Novice’s Guide to AVR Development, www.atmel.com, 2 de


febrero del 2004.

- AVRProg User Guide, www.atmel.com, 24 de mayo del 2000.


REFERENCIAS BIBLIOGRÁFICAS

- BARNETTE, M.D., AVR Simulation with the ATMEL AVR Studio 4,


www.avr.freaks.com, 27 de Septiembre del 2005.

- SVENDLSI, Odd Jostein, Atmel’s Self-Programming Flash Microcontrollers,


www.atmel.com, 7 de julio del 2003.

- O’FLYNN, Colin, Downloading, Installing and Configuring WinAVR,


http://winavr.sourceforge.net/, 17 de marzo del 2004.

- SNILSBERG, Rolf Kristian, AVR064: A Temperature Monitoring System with LCD


Output, www.atmel.com, 17 de febrero del 2006.

- SNILSBERG, Rolf Kristian, AVR065: LCD Driver for the STK502 and AVR
Butterfly, www.atmel.com, 17 de febrerol del 2006.

- AVR STK500 User Guide, www.atmel.com, 26 de abril del 2005.

- SIVERTSEN, Eivind, Basic Interrupts and I/O, www.atmel.com, 2 de febrero del 2004.

- MIKLEBUST, Gaute, The AVR Microcontroller and C Compiler Co-Design,


www.atmel.com, 24 de abril del 2003.

- AVR306: Using the AVR UART in C, www.atmel.com, 3 de julio del 2002.

- AVR106: C functions for reading and writing to Flash Memory, www.atmel.com, 5 de


agosto del 2004.

- AVR103: Using the EEPROM Programming Modes, www.atmel.com, 10 de marzo del


2005.

- ATMEL AT45DB041B DataFlash, www.atmel.com, 9 de mayo del 2005.

- PATEL, Deena, Needham Growth Conference, www.atmel.com, 11 de enero del 2005.


Sangolquí: ______________________

ELABORADO POR:

______________________________
Richard Leonel Guerrero Jumbo

_________________________ _________________________
Ing. Gonzalo Olmedo Dr. Jorge Carvajal R.

COORDINADOR DE CARRERA SECRETARIO ACADÉMICO

También podría gustarte