Microcontroladores de Atmel Familia AVR Ing. Marone José Introducción: Historia Los AVR son una familia de microcontroladores RISC de 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. El acronimo AVR fue reportado como Advanced Virtual RISC, pero hay rumores de que se debe a sus diseñadores: Alf and Vegard [RISC]. Aunque Atmel dice que no se refiere a nada particular Mas info sobre la arquitectura http://doru.info/projects/hdl/pavr/index.html Introducción: El AVR fue diseñado desde un comienzo para la ejecución eficiente de código C compilado. Por lo tanto, algunas instrucciones tales como 'suma inmediata' ('add immediate' en inglés) faltan, ya que la instrucción 'resta inmediata' ('substract immediate' en inglés) con el complemento dos puede ser usada como alternativa. El set de instrucciones de los AVR es más regular que el de la mayoría de los microcontroladores de 8-bit (por ejemplo, los PIC). Sin embargo, no es completamente ortogonal: Los registros punteros X, Y y Z tienen capacidades de direccionamiento diferentes entre sí. Los registros 0 al 15 tienen diferentes capacidades de direccionamiento que los registros 16 al 31. Las registros de I/O 0 al 31 tienen distintas características que las posiciones 32 al 63. La instrucción CLR afecta los 'flag', mientras que la instrucción SER no lo hace, a pesar de que parecen ser instrucciones complementarias (dejar todos los bits en 1, y dejar todos los bits en 0 respectivamente). Familia AVR La familia de microcontroladores AVR es muy numerosa, incluye 71 dispositivos que comparten el núcleo, pero difieren en recursos. Por ejemplo el atemega8: Arquitectura - Encapsulados CPU (Core) Para maximizar el rendimiento y paralelismo, el AVR usa una arquitectura Harvard – con memorias y buses separados para instrucciones y datos. Las instrucciones en la memoria de Programa son ejecutadas con una segmentación de dos etapas. Mientras una instrucción está siendo ejecutada, la siguiente es pre-capturada de la memoria de programa (fetching). El Archivo de Registros contiene 32 registros de propósito general de 8 bits, habilitados para un acceso rápido. El AVR fue diseñado desde un comienzo para la ejecución eficiente de código C compilado. Por lo tanto, algunas instrucciones tales como 'suma inmediata' ('add immediate' en inglés) faltan, ya que la instrucción 'resta inmediata' ('substract immediate' en inglés) con el complemento dos puede ser usada como alternativa. Arquitectura de la CPU CPU (Core) Seis de los 32 registros pueden ser usados como apuntadores de 16 bits para direccionamiento indirecto en el espacio de datos, habilitando cálculos de direcciones eficientes. Uno de estos apuntadores también puede usarse como apuntador para tablas de búsqueda (look up tables) en la memoria de programa. Para ello, estos registros se denominan X, Y y Z. Después de una operación aritmética, el registro de Estado (Status Register) es actualizado, para reflejar información acerca de la operación. La mayoría de instrucciones AVR tienen un formato en una palabra de 16-bits. En un ciclo de reloj se pueden leer 2 registros que funcionen como operandos para la ALU, que se realice la operación y el resultado quede disponible para escribirse en uno de esos registros. CPU (Core) Para la ejecución, la duración del ciclo es suficiente para permitir la lectura de registros, la operación de la ALU y la escritura en el registro destino. Mapa de Memoria Desde 1 a 256K Toda la memoria de datos se puede direccionar directamente Mapa de Memoria Memoria de programa Espacio continuo de memoria Flash cuyo tamaño varia entre procesadores, para el ATMega 8 es de 8 Kbytes, organizados como 4K x 16 bits. Soporta hasta 10,000 ciclos de escritura/borrado. La memoria se puede particionar en una sección para aplicación y una sección de arranque, donde podría manejarse un cargador para auto programación (Boot Loader Support – Read-WhileWrite Self-programming). Memoria de Programa: (IRQ´s) En el espacio de almacenamiento se incluyen a los Vectores de Interrupciones, iniciando en la dirección $000. El número de vectores, en la familia AVR, varia de procesador a procesador, en función de los recursos existentes. Un programa debería iniciar en una ubicación, mas allá de estos vectores. (rjmp Reset) Memoria de dato Es un espacio de 1120 localidades de 8 bits e incluyen: - Un conjunto de 32 localidades (Registros). - 64 Registros I / O (Puertos, configuración de recursos, etc). - 1024 localidades de propósito general. (RAM) Optimizado para el repertorio de instrucciones AVR. Son accedidos mediante las instrucciones IN y OUT Memoria de dato (Registros I/O) La arquitectura asegura el estado de los registros luego de un reset. - Mas info en el datasheet OJO!!! Una rutina de atención a interrupciones debe terminar con la instrucción RETI, la cual recupera el valor de la pila para el PC . Memoria de dato (EEPROM) La memoria EEPROM está en un espacio independiente y se requiere del uso de 3 registros I/O para su acceso: Inicialización El ATmega8 tiene cuatro fuentes de Inicialización (Reset) Power-on Reset. El MCU es inicializado cuando el voltaje de la fuente está por abajo del voltaje de umbral de encendido (VPOT). Reset Externo. El MCU es inicializado cuando un nivel bajo está presente en la terminal RESET por un tiempo mayor que la longitud mínima del pulso. Watchdog Reset. El MCU es inicializado cuando el Watchdog Timer está habilitado y su periodo termina. Brown-out Reset. El MCU es inicializado cuando el detector de reducción de voltaje está habilitado y el voltaje VCC de la fuente va por debajo del umbral establecido (VBOT). Una vez que el MCU se recupera de una condición de Reset, espera un tiempo de establecimiento (Tout – con un valor típico de 4 ms), antes de recuperar al sistema, para garantizar que los registros tienen su valor inicial. Pila de programa La pila es implementada en el espacio de propósito general (RAM). Es usada para almacenamiento temporal de variables (instrucciones PUSH y POP) o durante la llamada de subrutinas o el manejo de interrupciones. El registro SP es el apuntador al tope de la pila. Realmente el SP se compone de 2 registros, para la parte alta (SPH) y para la parte baja (SPL), esto para direccionar al espacio completo de memoria. La pila tiene un crecimiento hacia abajo, es decir, de las direcciones altas de memoria a las direcciones bajas. Después de un reset, el apuntador de Pila tiene el valor de 0x0000, por lo que debe ser inicializado dentro del programa (con 0x0460 para ATMega8), para que realice un almacenamiento dentro de un espacio válido. Registro de Estado Puertos de Entrada/Salida Para cada puerto se manejan tres registros, dentro del espacio de registros I/O: Un registro de lectura/escritura sobre un lacth, conectado a la terminal del puerto (PORTx). Un registro de lectura/escritura que define la dirección del puerto (DDRx). Las direcciones pueden configurarse de manera independiente, para cada terminal. 1 – Salida 0 – Entrada Un registro solo de lectura, para hacer lecturas directas en las terminales de los puertos (PINx). Mucho Cuidado con el señor PINx in RD,PINA Puertos de Entrada/Salida Si en PORTx.n se escribe un 1 lógico cuando la terminal es configurada como entrada, el resistor de pull-up es activado. Para anular al resistor de pull-up, se debe escribir un 0 en PORTx.n o la terminal se debe configurar como salida (suponiendo que el bit PUD tiene 0). Las terminales están en un treestate cuando una condición de reset llega a estar activa, aún si no haya señal de reloj. Si en PORTxn se escribe un uno lógico cuando la terminal se configura como salida, en PINx.n se tendrá un nivel alto. Si se escribe un cero, se tendrá un nivel bajo. Normalmente, el estado con el pull-up habilitado es aceptable, en un ambiente de alta impedancia no se notará la diferencia entre un nivel alto y el pull-up. Si este no es el caso, con el bit PUD del registro SFIOR se pueden deshabilitar los pull-ups en todos los puertos. Ver manual para conmutar entre estados treestate y salida en alto. CLOCK Se tienen diferentes fuentes para manejar al oscilador interno y a la vez, la señales de reloj se distribuyen por los diferentes módulos: Consumo/Modos Sleep Los modos SLEEP habilitan a la aplicación a apagar módulos sin usar en el MCU y por lo tanto, ahorrar energía. El AVR tiene 5 o 6 modos SLEEP y para entrar en alguno de ellos, el bit SE (SLEEP enable) del registro MCUCR (MCU Control Register) debe ponerse en alto. Los bits SM2, SM1 y SM0 de MCUCR determinan el modo: Consumo/Modos Sleep Referencias y a la Práctica…. Sitio oficial de Atmel: Página de AVR en Atmel Portales, foros: AVRFreaks Guia AVR Mi recomendado AVRBeginners Preguntarle a pepe que tiene bocha…. Desarrollo: Referencias de Wikipedia