INTRODUCCIÓN El aprendizaje de los microcontroladores en la carrera se ha basado en el conocimiento y estudio del 8051. Estos dispositivos son una herramienta importante para que el estudiante comience a conocer las posibilidades que ofrecen para desarrollar diferentes proyectos. El desarrollo tecnológico del presente siglo permite tener acceso a nuevas tecnologías, como es el caso de los microcontroladores de tipo RISC, especialmente los de la casa Atmel, que permiten tener múltiples opciones de trabajo al tener incorporados incorporados dentro de los mismos diversos periféricos como conversores análogo/digitales, sistemas de modulación por ancho de pulso, etc. A esta familia pertenece el ATmega 32 con el que se desarrolla el proyecto de diseñar y construir un conjunto de prácticas docentes utilizando un entorno de desarrollo con el nombre EI_STEP cuyo elemento fundamental es precisamente este microcontrolador. El objetivo es lograr que el estudiante se familiarice y aprenda a trabajar con el mismo e implemente los distintos programas aplicables al entorno de desarrollo antes mencionado utilizando los programas PROTEUS y AVR STUDIO.
CAPÍTULO 1 EL MICROCONTROLADOR ATMEGA 32 1.1.
Características de la familia de microcontroladores AVR
Los AVR son una familia de microcontroladores RISC del fabricante estadounidense Atmel. La arquitectura de los AVR fue concebida por dos estudiantes en el Norwegian Institute of Technology, y posteriormente refinada y desarrollada en Atmel Norway, la empresa subsidiaria de Atmel, fundada por los dos arquitectos del chip. Se pueden dividir en los siguientes grupos :
ATxmega: procesadores muy potentes con 16 a 384 kB de memoria flash programable, encapsulados de 44, 64 y 100 pines (A4, A3, A1), capacidad de DMA, eventos, criptografía y amplio conjunto de periféricos con DACs. ATmega: microcontroladores AVR grandes con 4 a 256 kB de memoria flash programable, encapsulados de 28 a 100 pines, conjunto de instrucciones extendido (multiplicación y direccionamiento de programas mayores) y amplio conjunto de periféricos. ATtiny: pequeños microcontroladores AVR con 0,5 a 8 kB de memoria flash programable, encapsulados de 6 a 20 pines y un limitado set de periféricos.
AT90USB: ATmega integrado con controlador USB
AT90CAN: ATmega con controlador de bus CAN
Tipos especiales: algunos modelos especiales, por ejemplo, para el control de los cargadores de baterías, pantallas LCD y los controles de los motores o la iluminación. AT90S: tipos obsoletos, los AVR clásicos
El AVR es una CPU de arquitectura Harvard. Tiene 32 registros de 8 bits. Algunas instrucciones sólo operan en un subconjunto de estos registros. La concatenación de los 32 registros, los registros de entrada/salida y la memoria de datos conforman un espacio de direcciones unificado, al cual se accede a través de operaciones de carga/almacenamiento. A diferencia de los microcontroladores PIC, el “stack” se ubica en este espacio de memoria unificado, y no está limitado a un tamaño fijo. El AVR fue diseñado desde un comienzo para la ejecución eficiente de código C compilado. Como este lenguaje utiliza profusamente punteros para el manejo de variables en memoria, los tres últimos pares de registros internos del procesador son usados como punteros de 16 bit al espacio de memoria externa, bajo los nombres X, Y y Z. Esto es un compromiso que se hace en arquitecturas de ocho bit desde los tiempos de Intel 8008, ya que su tamaño de palabra nativo de 8 bit (256 localidades accedidas) es pobre para direccionar. Por otro lado, hacer que todo el banco superior de 16 registros de 8 bit tenga un comportamiento alterno como un banco de 8 registros de 16 bit, complicaría mucho el diseño, violando la premisa original de su simplicidad.
El set de instrucciones AVR está implementado físicamente y disponible en el mercado en diferentes dispositivos, que comparten el mismo núcleo AVR pero tienen distintos periféricos y cantidades de RAM y ROM. La compatibilidad entre los distintos modelos es preservada en un grado razonable. Los microcontroladores AVR tienen una cañería ('pipeline' en inglés) con dos etapas (cargar y ejecutar), que les permite ejecutar la mayoría de las instrucciones en un ciclo de reloj, lo que los hace relativamente rápidos entre los microcontroladores de 8-bit.
1.2.
Características generales del microcontrolador ATmega32
El ATmega32 contiene una arquitectura tipo RISC, sus instrucciones se ejecutan en un solo ciclo de máquina, su estructura elimina la necesidad de usar componentes externos ya que internamente tiene: USART, ISP (in system programming), resistencias pull-up, modulación por ancho de pulso (PWM), convertidor ADC, comparador analógico, etc. Éstas son solo algunas características que se encuentran en este dispositivo. Su programación es posible realizarla en Lenguaje C, ensamblador o Basic. Todo su sistema está depositado en una sola pastilla. Algunas características son:
Microcontrolador de 8 bits con encapsulado PDIP. Utiliza arquitectura RISC. 32 Kbyte de memoria flash programable. - ISP: Programable en sistema. - Capacidad read-while-write (lee mientras escribe). - 10000 ciclos de escritura/borrado. 1024 Bytes EEPROM. - 100000 ciclos de escritura/borrado. 2 Kbyte de memoria SRAM interna. 32 x 8 registros de trabajo de propósito general. 32 líneas de entrada/salida de propósito general. Tensión de alimentación (Vcc): 4,5 – 5,5V. 3 temporizadores/contadores, uno de 16 bits y 2 de 8bits. 3 fuentes de interrupciones externas. Conversor análogo/digital (ADC) de 10 bits. Comparador analógico integrado. 6 modos de ahorro de energía: - Idle (ocioso): detiene la CPU, mientras que permite que la memoria SRAM, los timers/contadores, el puerto ISP e interrupciones del sistema sigan funcionando. - Power-down (baja energía): guarda el contenido del registro, pero congela el oscilador, inhabilitando el resto de funciones del chip hasta la siguiente interrupción o hasta que se realice un RESET del hardware. - Power-save (modo economizador): el contador de tiempo asincrónico continúa funcionando permitiendo al usuario mantener
-
-
una base de tiempo, mientras el resto de los dispositivos continúa en reposo. Standby (modo de espera): el oscilador (cristal) sigue funcionando, mientras el resto de los dispositivos sigue en reposo. Esto permite el reinicio muy rápido con un bajo consumo de energía. Extended standby (modo de espera extendida): Similar al modo standby. ADC Noise reduction (reducción del nivel de ruidos causados por el ADC): detiene la CPU y todos los módulos de entrada y salida excepto el contador asincrónico y el ADC para reducir al mínimo el ruido conmutación durante la conversión ADC.
Combinando una tecnología RISC de 8 bits con una CPU con memoria flash, el ATmega 32 resulta un poderoso microcontrolador que proporciona una alta flexibilidad en los diseños a bajo costo, aportando una solución muy efectiva para la mayoría de las aplicaciones de control. El ATmega 32 está apoyado por un completo juego de programas y sistemas de desarrollo incluyendo: compiladores, ensambladores, simuladores, emuladores en circuito y kits de evaluación.
1.3.
Arquitectura externa del microcontrolador ATmega32
1.4.
Memoria de programa
El ATmega32 cuenta con 32 kBytes de memoria flash programable. Como todas las instrucciones son de 16 o 32 bits, dicha memoria está organizada en 16 x 16 kB. Ésta memoria está dividida en 2 secciones, una destinada a las
1.5.
Puertos
Los puertos se conforman por las líneas del microcontrolador donde se pueden conectar los dispositivos de Entrada/Salida a controlar, por ejemplo LED, displays, transistores o mediante relés u opto acopladores, cargas de 110V/220V como medianos motores. El ATmega 32 tiene 4 puertos, llamados PORTA, PORTB, PORTC y PORTD. Son puertos de 8 bits así que se tienen 4 x 8 = 32 pines en total. Los pines de los puertos tienen nombres compuestos, como PA4 (ADC4), etc. Los nombres compuestos implican que tienen funciones multiplexadas. Por ejemplo, este pin PA4, además de pin digital convencional puede funcionar como el canal 4 del conversor analógico digital ADC4.
Cuando los pines no son interface de algún periférico, como el USART, el ADC, los temporizadores, etc., es decir, cuando son manual y directamente controlados por sus registros PORTx, PINx y DDRx se dice que actúan como entradas y salidas de propósito general. En principio todos los pines son bidireccionales cuando actúan como líneas de Entrada y Salida Generales. La dirección es configurable por software. Algunos pines pierden esa función cuando su control es asumido por algún módulo relacionado, por ejemplo, una vez configurado el puerto serie, el USART asumirá el control de los pines TXD y RXD.
Capacidades de tensión y corriente Cuando actúan como salidas, los pines pueden entregar tensiones de hasta Vcc. Cuando actúan como entradas pueden manejar niveles de hasta 0.5V por encima de Vcc. El diseño de los pines incluye diodos internos de sujeción que les permiten soportar tensiones mucho mayores que Vcc o inferiores que GND, siempre que la corriente no sobrepase del orden de los micro Amperes. Cada pin de entrada/salida (E/S) puede soportar picos de corriente de hasta 40 mA, pero en estado estable cada pin de puerto puede suministrar o recibir hasta 20 mA de corriente cuando Vcc = 5V y hasta 10 mA cuando Vcc = 3V. Sin embargo, esta capacidad no puede estar presente en todos los pines al mismo tiempo. Los límites de corriente total que soportan los puertos en el ATmega 32:
La suma de las corrientes suministradas por los pines PB0 - PB7, PCO PC7, PD0 - PD7 y XTAL2 no deberá exceder los 100 mA. La suma de las corrientes suministradas por los pines PA0 – PA7 no deberá exceder los 100 mA. La suma de las corrientes suministradas por todos los puertos no deberá exceder los 200 mA. La suma de las corrientes recibidas por los pines PB0 - PB7, PCO - PC7, PD0 - PD7 y XTAL2 no deberá exceder los 100 mA. La suma de las corrientes recibidas por los pines PA0 – PA7 no deberá exceder los 100 mA. La suma de las corrientes recibidas por todos los puertos no deberá exceder los 200 mA.
Las Resistencias de Pull-up Una de las cualidades que distinguen a los microcontroladores de los microprocesadores es que encierran en un solo chip todos los elementos posibles de un sistema de control. Con este fin los AVR incorporan en todos sus puertos transistores a manera de fuente de corriente que en la práctica funcionan como resistencias de pull-up. Las mismas nos pueden ahorrar el uso resistencias de sujeción externas en los pines de los puertos configurados como entradas y se podrían
equiparar con resistencias de entre 20 kΩ y 50 kΩ. A partir de dichos valores podemos calcular la corriente que puede fluir por ellas si están activadas. Estas resistencias se pueden habilitar pin por pin independientemente escribiendo un 1 en su registro de salida PORT. Sólo serán efectivas en los pines que actúan como entradas; en los pines configurados como salidas quedan automáticamente deshabilitadas. Existe un bit llamado PUD en el registro SFIOR cuya función es deshabilitar todas las resistencias pull-up de todos los puertos si su valor es 1. El bit PUD (Pull-Ups Disable) inicializa a 0 y un posible interés por “setearlo ” puede ser eliminar la pequeña corriente que puede fluir por las pull-up cuando los pines en cuestión se conectan a 0 lógico. La siguiente figura muestra la conexión de un pulsador al AVR aprovechando la pull-up de un pin de E/S. Fíjate en que las pull-up no se pueden usar como resistencias para excitar dispositivos como LED, relés, etc.
Configuración y Manejo de los Puertos Cuando los pines trabajan como entradas y salidas generales su control descansa principalmente en los Registros de E/S: SFIOR, DDRx, PORTx y PINx, donde x puede ser A, B, C o D. Del registro SFIOR solo interviene el pin PUD, cuya función es deshabilitar las pull-up de todos los pines cuando PUD = 1. Pero si PUD = 0, la habilitación de las pull-up todavía requiere de cierta configuración por parte de los registros DDRx, PORTx y PINx. Registro SFIOR ADTS2 ADTS1 ADTS0 ACME
PUD
PSR2
PSR10
Cada puerto tiene sus correspondientes registros DDRx, PORTx y PINx, así por ejemplo el puerto A tiene sus registros DDRA, PORTA y PINA. Lo mismo es aplicable a los otros puertos. Registro PORTA PORTA7 PORTA6 PORTA5 PORTA4 PORTA3 PORTA2 PORTA1 PORTA0
PINA7
PINA6
PINA5
Registro PINA PINA4 PINA3
PINA2
PINA1
PINA0
DDA7
DDA6
DDA5
Registro DDRA DDA4 DDA3
DDA2
DDA1
DDA0
Registro PORTx: Es para escribir datos en los pines del puerto x que estén configurados como salida. Ése es su uso habitual. Sin embargo, escribir en los bits de PORTx cuyos pines estén configurados como entradas significa activar o desactivar las pull-ups de dichos pines, ésta es la segunda función de PORTx. Leer el registro PORTx solo significa obtener el último valor que se escribió en este registro. Registro PINx: Es para leer el estado de los pines del puerto x, sin importar si los pines están configurados como entradas o como salidas. La función alternativa de este registro es para conmutar el estado de los pines configurados como salidas cuando se escribe un 1 en su bit correspondiente de PINx. Registro DDRx: es para configurar la dirección del puerto x, es decir, para establecer cuáles pines serán entradas y cuáles serán salidas. (Data Direction Register = Registro de Dirección de Datos). Después de un RESET todos los puertos inician con sus pines configurados como entradas, pero se pueden reconfigurar en cualquier punto del programa. Si se escribe un 0 en un bit de DDRx, entonces el pin correspondiente en el puerto x será de entrada y si se escribe un 1, el pin será de salida. Por ejemplo, si escribimos el valor 11110000 en DDRB, entonces los cuatro pines de menor peso del puerto B serán entradas digitales y los cuatro pines superiores serán de salida. Si escribimos 11111111 en DDRA, todos los pines del puerto A serán de salida, y si escribimos 00000000 en DDRB todo el puerto B será de entrada.
Tabla x – Configuración de puertos Caso No.
Bit en DDRx
Bit en PORTx
Bit en PUD
Dirección de pin
Pull-up
1
0
0
X
Entrada
No
2
0
1
0
Entrada
Sí
3
0
1
1
Entrada
No
4 5
1 1
0 1
X X
Salida Salida
No No
Estado del pin
3er estado (alta impedancia Alto, debido al pull-up 3er estado (alta impedancia Bajo (0 lógico) Alto (1 lógico)
Caso 1: Si un pin está configurado como entrada y su bit respectivo en PORTx vale 0, el pin tampoco tendrá pull-up y su estado será de alta impedancia. Caso 2: Si un pin está configurado como entrada y su bit respectivo en PORTx vale 1, el pin tendrá pull-up y su estado se leerá como 1 lógico (por la pull-up), siempre que el bit PUD del registro SFIOR valga 0. Caso 3: Raramente se suele poner PUD a 1, pero si se hace, se deshabilitarán las pull-ups de todos los pines. Por tanto los pines de entrada serán siempre de alta impedancia. Casos 4 y 5: Son los más simples. Si un pin está configurado como salida, de ningún modo tendrá pull-up y su estado de salida será 1 ó 0 lógico, dependiendo del valor escrito en su respectivo bit de PORTx.
1.6.
Interrupciones externas
Una interrupción es una llamada “inesperada”, urgente e inmediata a una función
especial denominada Interrupt Service Routine (ISR). El mecanismo funciona así: sin importar lo que esté haciendo en el programa principal o cualquier función relacionada con el mismo, cuando ocurra la interrupción el microcontrolador hará una pausa y pasará a ejecutar el código de ISR. Tras terminarlo, regresará a la tarea que estaba realizando antes de la interrupción, justo donde la había suspendido. Aunque es posible provocar interrupciones desde el programa ejecutándolas como si fueran funciones ordinarias, las interrupciones son disparadas (llamadas) por eventos del hardware del microcontrolador. El evento puede ser algún cambio en cierto pin de entrada/salida (E/S), el desbordamiento de un Timer, la llegada de un dato serial, etc. Se puede deducir por tanto que las fuentes de interrupción están relacionadas con la cantidad de recursos del microcontrolador. Cada interrupción está identificada por un vector de interrupción, que no es otra cosa que una dirección particular en la memoria flash. Todos los Vectores están ubicados en posiciones consecutivas de la memoria flash y forman la denominada tabla de vectores de interrupción. El RESET no es una interrupción pero su dirección 0x0000
también se conoce como vector de Reset. Por defecto, la tabla de vectores de interrupción está ubicada en las primeras posiciones de la memoria, tal como se ve abajo. Solo cuando se habilita el uso de la Sección de Boot Loader toda la tabla se desplazará al inicio de dicha sección.
Tabla x – Fuentes de interrupción del ATmega 32 No. vector Dirección Nombre vector interrupción 1 $000 RESET 2 $002 INT 0 3 $004 INT1 4 $006 INT2 5 $008 TIMER2 COMP 6 $00A TIMER2 OVF 7 $00C TIMER1 CAPT 8 $00E TIMER1 COMPA 9 $010 TIMER1 COMPB 10 $012 TIMER1 OVF 11 $014 TIMER0 COMP 12 $016 TIMER0 OVF 13 $018 SPI, STC 14 $01A USART, RXC 15 $01C USART, UDRE 16 $01E USART, TXC 17 $020 ADC 18 $022 EE_RDY 19 $024 ANA_COMP 20 $026 TWI 21 $028 SPM_RDY (*)
Descripción Cinco fuentes de reset (*) Fuente de interrupción externa 0 Fuente de interrupción externa 1 Fuente de interrupción externa 2 Comparación timer/contador 2 Desbordamiento del timer/contador 2 Evento de captura con timer/contador 1 Comparación A timer/contador 2 Comparación B timer/contador 2 Desbordamiento temporizador/contador 1 Comparación temporizador/contador 0 Desbordamiento temporizador/contador 0 Transferencia serie completa USART, recepción completa (Rx) USART, registro de datos vacío USART, transferencia completa (Rx) ADC, conversión completa Memoria EEPROM preparada Comparador analógico Interfaz serial two-wire (2 cables) Almacenamiento de memoria programa preparado
Reset al encendido, Reset externo, Reset por Watchdog, Reset por Brown-out y Reset por JTAG AVR.
Fuentes de Reset Existen 5 posibilidades para que se produzca un Reset de las cuáles se explican a continuación las 3 más frecuentemente utilizadas:
Reset al encendido: El microcontrolador se resetea cuando la tensión de la fuente de alimentación está por debajo del nivel requerido para el funcionamiento. Reset externo: Cuando un nivel bajo es ingresado en el pin RESET durante más de 2 ciclos de XTAL. Reset por Watchdog: Si el Watchdog está habilitado y su tiempo de temporización expira antes de producirse la instrucción WDR el microcontrolador se reseteará.
Una vez producido el RESET todos los registros del microcontrolador son puestos a sus valores iniciales y el programa empieza su ejecución en la dirección $000. En esta
dirección debe colocarse una instrucción de salto para ejecutar la rutina de comienzo de programa. Para entender cómo funciona el mecanismo de las interrupciones en bajo nivel, recordemos que el contador de programa es un registro que dirige cada una de las instrucciones que ejecuta el CPU. Pues bien, al dispararse la interrupción el hardware guardará en la pila el valor actual del contador de programa y lo actualizará con el valor del vector de interrupción respectivo, de modo que el CPU pasará a ejecutar el código que se encuentre a partir de esa dirección. Al final del código de la interrupción debe haber una instrucción de retorno que restaure el contador de programa con el valor que se había guardado en la pila. La instrucción es reti y la pone el compilador. Si se llegara a producir el evento excepcional en que se disparen dos o más interrupciones al mismo tiempo, se ejecutarán las interrupciones en orden de prioridad. Tiene mayor prioridad la interrupción que tenga la dirección más baja del espacio de memoria de programa.
1.7. Temporizadores
1.8.
Comparador analógico
El comparador analógico compara los valores de entrada en el pin positivo AIN0 y el pin negativo AIN1. Cuando la tensión en el pin positivo AIN0 es mayor que la tensión en el pin negativo AIN1, la salida del comparador, ACO, está “seteada” (puesta a 1) . La salida del comparador puede ser puesta como activador del temporizador/contador1. Además el comparador puede activar una interrupción exclusiva. El usuario puede seleccionar la activación de la interrupción por flanco de subida, caída o cambio lógico. En la figura se muestra un diagrama de bloque del comparador y su lógica.
Función especial I/O Registro – SFIOR
• Bit 3 – ACME: Analog Comparator Multiplexer Enable
Cuando este bit esta en 1 lógico y el ADC está apagado (ADEN en ADCSRA es cero), el multiplexor del ADC selecciona la entrada negativa del comparador. Cuando este bit tiene un cero lógico AIN1 es aplicado a la entrada negativa del comparador.
Registro de control y estado del comparador analógico ACSR (Analog Comparator Control and Status Register)
• Bit 7 – ACD:
Analog Comparator Disable
Cuando este bit está en 1 lógico la alimentación del comparador esta desconectada. Este bit puede ser seteado en cualquier momento para desconectar el comparador, esto reduce el consumo de energía en los modos activo e Idle (Holgazan). Cuando se cambia el bit ACD la interrupción del comparador debe estar desactivada borrando el bit ACIE en ACSR, sino puede ocurrir una interrupción cuando el bit sea cambiado.
• Bit 6 – ACBG:
Analog Comparator Bandgap Select
Cuando este bit esta seteado un voltaje de referencia de bandgap fijo reemplaza la entrada positive del comprador. Cuando este bit esta en cero AIN0 es aplicado a la entrada positiva del comparador. See “Internal Voltage Reference” on page 41.
• Bit 5 – ACO:
Analog Comparator Output
La salida del comparador es sincronizada y luego conectada directamente a ACO. La sincronización introduce un retardo de 1-2 ciclos de reloj.
• Bit 4 – ACI: Analog Comparator Interrupt Flag
Este bit es seteado por hardware cuando a la salida del comparador ocurre un evento definido en ACIS1 y ACIS0 que activa la interrupción. La rutina de interrupción del comparador es ejecutada si el bit ACIE está en 1 y el I-bit en el SREG está en 1. ACI es borrado por hardware cuando se ejecuta la interrupción correspondiente. Alternativamente ACI es borrado escribiendo uno lógico en la bandera.
• Bit 3 – ACIE: Analog Comparator Interrupt Enable
Cuando este bit tiene un 1 lógico y el I-bit en el SREG está “seteado” la interrupción del comparador esta activada. Cuando está en cero lógico la interrupción esta deshabilitada. Nnxnam,s madncuando 1 lógico este bit habilita que la función captura de entrada en el temporizador/contador 1 sea activada por el comparador analógico. • Bit 2 – ACIC: Analog Comparator Input Capture Enable
When written logic one, this bit enables the Input Capture function in Timer/Counter1 to be triggered by the Analog Comparator. The comparator output is in this case directly connected to the Input Capture front-end logic, making the comparator utilize the noise canceler and edge select features of the Timer/Counter1 Input Capture interrupt. W hen written logic zero, no connection between the Analog Comparator and the Input Capture function exists. To make the comparator trigger the Timer/Counter1 Input Capture interrupt, the TICIE1 bit in the Timer Interrupt Mask Register (TIMSK) must be set. • Bits 1, 0 –
ACIS1, ACIS0: Analog Comparator Interrupt Mode Select
Estos bits determinan que evento activara la interrupción del comparador. Las diferentes opciones se muestran en la tabla.
Para cambiar los bits ACIS1/ACIS0 la interrupción del comparador debe estar deshabilitada borrando su bit de activación en el registro ACSR, de otra manera puede ocurrir una interrupción cuando los bits sean cambiados.
Multiplexor de entradas del comparador análogo Es posible seleccionar cualquiera de los pines ADC7..0 para remplazar la entrada negativa del comparador. El multiplexor del ADC es utilizado para seleccionar esta entrada, en consecuencia el ADC debe estar apagado para utilizar esta característica. Si el bit de activación del multiplexor del comparador (ACME en SFIOR) esta seteado y el ADC está apagado (ADEN en ADCSRA es cero), MUX2..0 seleccionan el pin de entrada para remplazar la entrada negativa del comparador como se muestra en la tabla. Si ACME esta borrado o ADEN esta seteado, AIN1 es aplicado a la entrada negativa del comparador.
1.9. Conversor análogo digital