Kit de Desarrollo Avr Butterfly, Desarrollo de Guía de Prácticas de Laboratorio y Tutoriales
Kit de Desarrollo Avr Butterfly, Desarrollo de Guía de Prácticas de Laboratorio y Tutoriales
Kit de Desarrollo Avr Butterfly, Desarrollo de Guía de Prácticas de Laboratorio y Tutoriales
Sangolquí – Ecuador
2006
CERTIFICACIÓ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.
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.
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
ÍNDICE DE CONTENIDO
Contenido Pág.
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
Í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
Í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
GLOSARIO
Término Significado
CAPÍTULO 1
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.
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).
1.3.2. Ventajas
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.
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 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.
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.
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.
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.
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.
Familia megaAVR. Gran capacidad para aplicaciones de alto desempeño. La Tabla 1.5
muestra la familia de Microcontroladores megaAVR.
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 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 -
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 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.
CAPÍTULO 2
• 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 -
• 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.
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.
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 -
GND. Tierra.
CAPÍTULO 2: EL MICROCONTROLADOR AVR ATMEGA169 - 24 -
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 -
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.
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”.
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.
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.
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 1 – Z: Indicador de Resultado Cero. El bit Z indica un resultado cero “0” 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):
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.
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á.
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”.
Las tablas constantes pueden ser colocadas dentro del espacio entero de direcciones
de memoria para programa.
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.
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 -
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.
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.
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.
Bits 15...9 – Res: Bits Reservados. Estos bits están reservados en el ATmega169 y
siempre se leerán como cero.
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.
Bits 7...4 – Res: Bits Reservados. Estos bits son bits reservados en el ATmega169 y
siempre se leerán como cero.
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.
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 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.
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.
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.
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.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
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.
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
Cuando se selecciona esta fuente de reloj, los Fusibles SUT determinan los tiempos
de arranque como se indica en la Tabla 2.12.
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.
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.
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.
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 -
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.
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 -
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.
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.
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.
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
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.
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 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.
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 -
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 -
• Reset Power-On.
• Reset Externo.
• Reset Watchdog.
• Reset Brown-Out.
• Reset JTAG AVR.
Nota: 1. El Power-on Reset no trabaja a menos que la fuente de voltaje esté por
debajo de VPOT (decreciente).
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.
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.
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.
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 -
Reset AVR JTAG. La MCU se reinicia con tal de que haya uno lógico en el Registro del
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 -
Nota: 1. Para el BOOTRST Fuse “1” significa desprogramado mientras que “0” significa
programado.
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.
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.
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 -
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.
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.
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 -
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 -
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 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.
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 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).
PCINT15, fuente 15 para Interrupción por Cambio en un Pin: EL pin PB7 puede
servir como una fuente externa de interrupción.
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 -
PCINT13, fuente 13 para Interrupción por Cambio en un Pin: EL pin PB5 puede
servir como una fuente externa de interrupción.
PCINT12, fuente 12 para Interrupción por Cambio en un Pin: EL pin PB4 puede
servir como una fuente externa de interrupción.
PCINT11, fuente 11 para Interrupción por Cambio en un Pin: EL pin PB3 puede
servir como una fuente externa de interrupción.
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, fuente 8 para Interrupción por Cambio en un Pin: EL pin PB0 puede servir
como una fuente externa de interrupción.
SEG15 – SEG20 – Puerto D, Bit 7:12. SEG15 - SEG20, planos frontales del LCD, desde
el plano 15 hasta el 20.
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.
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.
PCINT5, Fuente de Interrupción por Cambio en el Pin 5: El pin PE5 puede servir
como una fuente de interrupción externa.
PCINT4, Fuente de Interrupción por Cambio en el Pin 4: El pin PE4 puede servir
como una fuente de interrupción externa.
PCINT3, Fuente de Interrupción por Cambio en el Pin 3: El pin PE3 puede servir
como una fuente de interrupción externa.
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 -
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.
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 -
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:
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 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 -
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 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.32 muestra la configuración de estos bits para el modo PWM rápido.
La Tabla 2.33 muestra la configuración de estos bits para el 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 -
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.
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).
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 -
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.
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).
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.
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.
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
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.
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.
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.
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.
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.
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 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 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).
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 -
La Tabla 2.43 muestra la configuración de estos bits para el 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.
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.
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.
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 -
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).
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.
f OSC
f XCK <
4
Ecuación. 2.1. Frecuencia máxima de reloj
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.
• 1 bit de inicio
• 5, 6, 7, 8 o 9 bits de datos.
• 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.
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.
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.
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 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 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.
(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).
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 -
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.
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 -
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.
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.
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 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.
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 -
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.
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.
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 -
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.
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.
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 -
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.
Tabla. 2.53. Ejemplos de configuración de UBRR para Frecuencias del Oscilador comúnmente usadas
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 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.
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.
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.
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 -
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.
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. 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.
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.
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.
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 -
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.
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 -
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 -
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.
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.
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.
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.
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.
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 -
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.
½ 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 -
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.
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 -
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.
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.
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.
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.
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 -
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.
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 -
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.
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.
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.
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.
Nota:
1. Programe los Fuse bits y Boot Lock bits antes de programar LB1 y LB2.
2. “1” significa sin programar, “0” significa programado
Notas:
1. Vea la Tabla para decodificar el BODLEVEL Fuse
2. Este bit nunca debe ser programado.
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 -
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.
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.
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.
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.
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
CAPITULO 3
3.1. DESCRIPCIÓN
El Kit AVR Butterfly se diseñó para demostrar los beneficios y las características
importantes de los microcontroladores ATMEL.
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.
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.
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.
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 -
aprecia un conector DB9 hembra soldado a los cables que se conectan a la interfaz USART
del AVR Butterfly (derecha).
- 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 -
- Presionar “Finish”.
- 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 -
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).
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.
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.
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.
β
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º)
⎛ (º 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 -
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.
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 -
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.
a) b) c)
Figura. 3.28. Sensores: (a) resistor NTC, (b) acceso al ADC y (c) LDR
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:
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 -
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.
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.
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.
Como se aprecia en la Figura 4.5, la ventana I/O permite visualizar los siguientes
campos:
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.
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.
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.
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.
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.
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>>”.
Figura. 4.13. Selección de la Plataforma para Depuración y del Dispositivo para Simulación
3. Verificar una vez más, luego presionar “Finish” para crear el proyecto e ir a editar
archivo ensamblador (.asm).
del dispositivo para el ensamblador, dejando saber al ensamblador para qué dispositivo
está desarrollando.
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.
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 -
La Tabla 4.1 es una breve descripción de los formatos de archivo objeto que son
soportados por el AVR Studio.
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.
Clear all break points. Esta función borra todos los breakpoints establecidos,
incluyendo breakpoints que fueron desactivados.
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.
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).
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 -
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.
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).
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.
CAPÍTULO 5
TUTORIALES
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.
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 -
Por ejemplo, para ajustar la fecha el usuario debe seguir el siguiente procedimiento:
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.
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.
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:
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.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.
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>
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 -
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.
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
4. Hacer clic en el botón Finish; entonces, AVR Studio aparecerá tal como se
observa en la Figura 5.18.
a) b)
Figura. 5.20. AVR Studio, Opciones del Simulador
CAPÍTULO 5: TUTORIAL - 258 -
a) b)
Figura. 5.22. AVR Studio, añadir variable a la ventana Watch
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 -
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
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 -
18. Presionar repetidamente la tecla F5 y analizar las líneas que aparecen con
breakpoints en la Figura 5.23.
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:
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.
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.
a) b)
Figura. 5.35. AVR Butterfly, PORTB (a) y PORTD (b)
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.
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 -
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 -
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
el DDRx; caso contrario, si es escrito con “1” (uno lógico), el pin correspondiente será una
salida de datos.
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.
PINB0 PORTD0
PINB1 PORTD1
PINB2 PORTD2
PINB3 PORTD3
MCU
PUERTO B PUERTO D
PINB4 PORTD4
PINB5 PORTD5
PINB6 PORTD6
PINB7 PORTD7
#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;
}
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;
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;
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 -
a) b)
Figura. 6.4. WinAVR, generación de los archivos (a)*.hex y (b)*.cof
Estos niveles deberán reflejarse idénticamente en los LEDs conectados en los pines del
puerto D.
//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
Figura. 6.6. AVR Studio 4, selección del AVR Simulator y del ATmega169
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.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.12. AVR Simulator, simulación de lectura del puerto B y escritura en el puerto D
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.
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.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
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 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.
PINB0 PORTD0
PINB1 PORTD1
PINB2 PORTD2
PINB3 PORTD3
MCU
PUERTO B PUERTO D
PINB4 PORTD4
PINB5 PORTD5
PINB6 PORTD6
PINB7 PORTD7
− 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:
− 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.
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:
((1<<PINB7)|(1<<PINB6)|(1<<PINB4)) = 11010000
Por lo que:
MASCARA_PINB = 11010000
MASCARA_PINE = 00001100
#define ARRIBA 0
#define ABAJO 1
#define IZQUIERDA 2
#define DERECHA 3
#define CENTRO 4
#define NO_VALIDA 5
#define VERDADERO 1
#define FALSO 0
Variables auxiliares:
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 -
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);
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;
Habilitar las PULL-UPs en el puerto B, únicamente en los pines que contribuirán con
interrupciones:
PORTB = MASCARA_PINB;
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));
entonces esta función será la única que será llamada por las gestoras de todas las
interrupciones.
SIGNAL(SIG_PIN_CHANGE0)
{
Llamar a la función manejar_interrupcion():
manejar_interrupcion();
}
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.
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;
void obtener_seleccion(void)
{
unsigned char seleccion;
}
else seleccion = NO_VALIDA;
PORTD = 1;
default:
break;
}
}
int main(void)
{
Llama la función inicializar para que inicie los parámetros necesarios:
inicializar();
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
/*
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 302 -
#define ARRIBA 0
#define ABAJO 1
#define IZQUIERDA 2
#define DERECHA 3
#define CENTRO 4
#define NO_VALIDA 5
#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;
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.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
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.
− 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.
En la Tabla 6.4 se explica los términos que se usan en la configuración del 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.
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 -
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.
− 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 -
− Constantes:
#define TAMANIO_DEL_REGISTRO_LCD 20
#define NUMERO_MAXIMO_DE_CARACTERES 36
− Variables Globales:
char LCD_Data[TAMANIO_DEL_REGISTRO_LCD];
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 312 -
char memo_temp_texto[NUMERO_MAXIMO_DE_CARACTERES];
− 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);
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.
void inicializar_LCD(void)
{
Borrar el buffer y la memoria LCD:
Borrar_LCD( );
Entonces:
if (posicion & 0x01)
else
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;
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)
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;
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';
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;
SIGNAL(SIG_LCD)
{
unsigned char letra=0;
unsigned char i=0;
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++)
{
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);
}
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 -
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;
Esperar:
for(i=0;i<5;i++)_delay_loop_2(50000);
while(1)
{
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);
return 0;
}
#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 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);
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);
}
char *ptr;
char i;
if (posicion > 5) return;
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.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)
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
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.
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
− 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.
− 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
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;
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];
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';
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';
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();
}
void inicializar_modo_SLEEP(void)
{
Permitir el cambio del Watch Dog Timer:
WDTCR |= (1<<WDTCE)|(1<<WDE);
int main(void)
{
Prohibir interrupciones:
cli();
Permitir interrupciones:
sei();
#include <avr/io.h>
#include <lcd.h>
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 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.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
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:
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.
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.
− 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 -
#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);
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 351 -
void seleccionar_CLKsys(void)
{
Habilitar cambio del preajustador del reloj:
CLKPR = (1<<CLKPCE);
200 pulsos
t= = 0,006103515625seg
32768 pulsos / seg
void calibrar_OSCCAL(void)
{
unsigned char calibrado = FALSO;
unsigned int temp=0;
seleccionar_CLKsys();
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 -
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;
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;
Reactivar el Timer1:
TCCR1B = (1<<CS10);
}
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.
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
125000Hz
= 2 Hz = 2veces / segundo
62500
void inicializar_TIMER1(void)
{
Prohibir las interrupciones:
cli();
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 -
Configurar el pin 5 del Puerto B como salida, para utilizarlo como pin de salida
OC1A:
DDRB |= (1<<DDB5);
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));
}
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;
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;
}
void desactivar_TIMER1(void)
{
cbi(TCCR1B,CS11);
}
void modo_SLEEP(void)
{
Seleccionar modo Idle:
SMCR = (1<<SE);
}
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);
}
SIGNAL(SIG_PIN_CHANGE0)
{
unsigned char opcion=0;
Obtener la selección hecha con el joystick, izquierda o derecha:
opcion=( ~(PINE) & 0x0C );
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 -
Habilitar interrupciones:
sei();
Noveno. Armar el circuito como indica la Figura 6.33 y proceder a hacer las pruebas.
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 361 -
#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 -
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 -
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.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
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.
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 -
β
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
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 -
4. Hacer ocho lecturas y ocho conversiones, para luego obtener una lectura
promedio.
Se observa en la Figura 6.36 que una lectura cercana a 761 corresponde a 0ºC.
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.
− 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.
− 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.
void Inicializar_ADC(void);
int leer_ADC(void);
void leer_temperatura(void);
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 373 -
void Inicializar_ADC(void)
{
Seleccionar la frecuencia del reloj del sistema, RC/4 = 8MHz/4 = 2 MHz:
CLKPR = (1<<CLKPCE);
CLKPR = (1<<CLKPS1);
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);
int leer_ADC(void)
{
char i;
int ADC_temp;
int ADCsuma = 0;
CAPÍTULO 6: PRÁCTICAS DE LABORATORIO - 374 -
Esperar hasta que el ADC indique que ha culminado una conversión, mediante el
sondeo del indicador ADIF:
while(!(ADCSRA & 0x10));
Esperar hasta que el ADC indique que ha culminado una conversión, mediante el
sondeo del indicador ADIF:
while(!(ADCSRA & 0x10));
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 el ADC:
cbi(ADCSRA, ADEN);
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'};
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;
}
}
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.
int main(void)
{
char *palabra="Temperatura\0";
escribir_palabra_en_LCD(palabra);
while(1)
{
Entrar en modo Sleep, en el modo ADC Noise Reduction (Reducción de Ruido del
ADC):
SMCR=(1<<SM0)|(1<<SE);
}
return 0;
}
#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 -
CAPÍTULO 7
CONCLUSIONES Y RECOMENDACIONES
7.1. CONCLUSIONES
- 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.
7.2. RECOMENDACIONES
- 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.
REFERENCIAS BIBLIOGRÁFICAS
BIBLIOGRAFÍA DE TEXTO
BIBLIOGRAFÍA DE INTERNET
- SVENDLSI, Odd Jostein, Designing for Efficient Production with In-System Re-
programmable Flash µCs, www.atmel.com, 28 de enero del 2005.
- SNILSBERG, Rolf Kristian, AVR065: LCD Driver for the STK502 and AVR
Butterfly, www.atmel.com, 17 de febrerol del 2006.
- SIVERTSEN, Eivind, Basic Interrupts and I/O, www.atmel.com, 2 de febrero del 2004.
ELABORADO POR:
______________________________
Richard Leonel Guerrero Jumbo
_________________________ _________________________
Ing. Gonzalo Olmedo Dr. Jorge Carvajal R.