El conjunto de instrucciones Atmel AVR es el lenguaje máquina para el Atmel AVR , un microcontrolador RISC de un solo chip de 8 bits con arquitectura Harvard modificada , desarrollado por Atmel en 1996. Atmel fue adquirida por Microchip Technology en 2016. [ 1 ] El AVR fue una de las primeras familias de microcontroladores en utilizar memoria flash integrada para el almacenamiento de programas.
Registros del procesador
Existen 32 registros de propósito general de 8 bits, R0–R31. Todas las operaciones aritméticas y lógicas se realizan sobre estos registros; solo las instrucciones de carga y almacenamiento acceden a la RAM.
Un número limitado de instrucciones opera sobre pares de registros de 16 bits. El registro de menor número del par contiene los bits menos significativos y debe ser par. Los últimos tres pares de registros se utilizan como registros puntero para el direccionamiento de memoria. Se conocen como X (R27:R26), Y (R29:R28) y Z (R31:R30). Los tres admiten modos de direccionamiento de preincremento y postincremento. Y y Z también admiten un desplazamiento positivo de seis bits.
Las instrucciones que permiten un valor inmediato se limitan a los registros R16–R31 (operaciones de 8 bits) o a los pares de registros R25:R24–R31:R30 (operaciones de 16 bits ADIW y SBIW). Algunas variantes de la operación MUL se limitan a ocho registros, del R16 al R23.
Registros de propósito especial
Además de estos 32 registros de propósito general, la CPU tiene algunos registros de propósito especial:
- PC: Contador de programa de 16 o 22 bits
- SP: puntero de pila de 8 o 16 bits
- SREG: registro de estado de 8 bits
- RAMPX, RAMPY, RAMPZ, RAMPD y EIND: registros de segmento de 8 bits que se anteponen a las direcciones de 16 bits para formar direcciones de 24 bits; solo disponibles en partes con grandes espacios de direcciones.
Registro de estado
Los bits del registro de estado son:
- C Bandera de acarreo . Esta es una bandera de préstamo en restas.
- Indicador Z de cero . Se activa cuando el resultado de una operación aritmética es cero y se desactiva cuando es distinto de cero.
- N Indicador negativo . Se establece como una copia del bit más significativo de un resultado aritmético.
- V Indicador de desbordamiento . Se activa en caso de desbordamiento del complemento a dos .
- Bandera con el signo S. Exclusiva de AVR, esta siempre es N ⊕ V, y muestra el signo verdadero de una comparación.
- H Indicador de medio acarreo . Este es un acarreo interno de sumas y se utiliza para admitir la aritmética BCD .
- Copia del bit T. Las instrucciones especiales de carga y almacenamiento de bits utilizan este bit.
- Indicador de interrupción . Se activa cuando las interrupciones están habilitadas.
Existen dos casos especiales que facilitan la aritmética de múltiples bytes:
- Las instrucciones
INC`and` no modifican el indicador de acarreo, por lo que pueden usarse para iterar sobre operandos aritméticos de precisión arbitraria . [ 2 ] : 84, 101DEC - Las instrucciones
CPC,SBCySBCI(comparar/restar con acarreo) no establecen el indicador Z cuando el resultado es cero, sino que solo lo borran si el resultado no es cero. [ 2 ] : 79,147,149 Para comparaciones de varios bytes de precisión fija , implementadas con una secuencia desenrolladaCP; CPC; CPC; CPC, esto produce un indicador cero que se establece solo si la diferencia total es cero.
Direccionamiento
Los siguientes espacios de direcciones están disponibles:
- Los registros de propósito general se direccionan mediante sus números (0-31), aunque el número completo de 5 bits no se almacena en las instrucciones que solo pueden operar en un subconjunto de esos registros.
- Los registros de E/S tienen un espacio de direcciones dedicado de 6 bits , cuya mitad inferior es direccionable por bits; algunas partes tienen registros de E/S fuera de este espacio de direcciones, que se denominan "E/S extendidas" y solo son accesibles como E/S mapeadas en memoria en el espacio de direcciones de datos.
- El espacio de direcciones de datos mapea los 32 registros de propósito general, todos los registros de E/S (incluidos aquellos a los que también se puede acceder a través del espacio de direcciones de E/S) y la RAM; se puede direccionar de forma directa o indirecta a través de los registros de puntero X, Y y Z, antepuestos, si es necesario, por RAMPX, RAMPY y RAMPZ respectivamente.
- La memoria de programa ( flash ) tiene un espacio de direcciones separado, direccionado como palabras de 16 bits con el propósito de obtener instrucciones.
- Para obtener datos constantes, la memoria del programa se direcciona byte a byte a través del registro del puntero Z, anteponiendo, si es necesario, RAMPZ.
- En algunos dispositivos, la memoria EEPROM está mapeada; en otros, no es directamente direccionable y se accede a ella a través de registros de E/S de dirección, datos y control.
- Los registros de propósito general, el registro de estado y algunos registros de E/S son direccionables por bits, siendo el bit 0 el menos significativo y el bit 7 el más significativo.
Los primeros 64 registros de E/S son accesibles tanto a través del espacio de direcciones de E/S como del espacio de direcciones de datos. Por lo tanto, tienen dos direcciones diferentes. Estas se suelen escribir como " 0x00 ( 0x20 )" a " 0x3F ( 0x5F )", donde el primer elemento es la dirección de E/S y el segundo, entre paréntesis, la dirección de datos.
Los registros de propósito especial de la CPU, con la excepción del PC, pueden ser accedidos como registros de E/S. Algunos registros (RAMPX, RAMPY) pueden no estar presentes en máquinas con menos de 64 KiB de memoria direccionable.
Un mapa de memoria típico de ATmega podría tener este aspecto:
donde RAMEND es la última dirección de RAM. En las partes que carecen de E/S extendida, la RAM comenzaría en 0x0060 .
Sincronización de las instrucciones
Las operaciones aritméticas funcionan en los registros R0–R31, pero no directamente en la RAM, y tardan un ciclo de reloj, excepto la multiplicación y la suma a nivel de palabra (ADIW y SBIW), que tardan dos ciclos.
El acceso a la RAM y al espacio de E/S solo se puede realizar mediante la copia de datos desde o hacia los registros. El acceso indirecto (que incluye el postincremento, el predecremento o el desplazamiento de constantes opcionales) es posible a través de los registros X, Y y Z. Todos los accesos a la RAM requieren dos ciclos de reloj. El movimiento entre registros y E/S requiere un ciclo. El movimiento de datos de ocho o dieciséis bits entre registros o de una constante a un registro también requiere un ciclo. La lectura de la memoria de programa (LPM) requiere tres ciclos.
Lista de instrucciones
Las instrucciones constan de una palabra de 16 bits, salvo aquellas que incluyen una dirección de 16 o 22 bits, que requieren dos palabras.
Existen dos tipos de bifurcaciones condicionales: saltos a una dirección y saltos de instrucción. Las bifurcaciones condicionales (BRxx) pueden comprobar un indicador de la ALU y saltar a una dirección específica. Los saltos de instrucción (SBxx) comprueban un bit arbitrario en un registro o entrada/salida y omiten la siguiente instrucción si la comprobación es verdadera.
En lo siguiente:
- Rd y Rr son registros en el rango R0–R31
- Rdh y Rrh son registros en el rango R16–R31 (mitad alta).
- Rdq y Rrq son registros en el rango R16–R23 (una cuarta parte del archivo de registros).
- Rp es un par de registros R25:R24, R27:R26 (X), R29:R28 (Y) o R31:R30 (Z).
- XYZ es un registro de puntero, X o Y o Z
- XYZ+ es un registro de puntero, X o Y o Z, con incremento posterior.
- -XYZ es un registro de puntero, X, Y o Z, predecrementado.
- YZ es un registro de puntero, ya sea Y o Z.
- Z+ es el registro puntero Z, incrementado posteriormente.
- s es un número de bit en el registro de estado (0 = C, 1 = Z, etc., consulte la lista anterior).
- b es un número de bit en un registro de propósito general o de E/S (0 = menos significativo, 7 = más significativo).
- K6 es una constante inmediata sin signo de 6 bits (rango: 0–63).
- K8 es una constante inmediata de 8 bits; dado que solo se utiliza en operaciones de 8 bits, su signo es irrelevante.
- IO5 es una dirección de E/S de 5 bits que cubre la parte direccionable por bits del espacio de direcciones de E/S, es decir, la mitad inferior (rango: 0–31).
- IO6 es una dirección de E/S de 6 bits que cubre todo el espacio de direcciones de E/S (rango: 0–63).
- D16 es una dirección de datos de 16 bits que cubre 64 KiB ; en partes con más de 64 KiB de espacio de datos, se antepone el contenido del registro de segmento RAMPD.
- P22 es una dirección de programa de 22 bits que abarca 2²² palabras de 16 bits (es decir, 8 MiB ).
- S7 y S12 son desplazamientos con signo de 7 y 12 bits , en unidades de palabras, relativos a la dirección del programa almacenada en el contador de programa.
Herencia del conjunto de instrucciones
No todas las instrucciones están implementadas en todos los controladores Atmel AVR . Este es el caso de las instrucciones que realizan multiplicaciones, cargas/saltos/llamadas extendidas, saltos largos y control de potencia.
Las instrucciones opcionales se pueden agrupar en tres categorías:
- Características principales de la CPU (computación), añadidas a núcleos de CPU más potentes.
- funciones de direccionamiento de memoria, añadidas en todos los modelos con memoria lo suficientemente grande como para requerirlas
- Características opcionales, algunos periféricos que pueden o no estar presentes en un modelo en particular.
Si bien los procesadores de gama alta suelen tener núcleos más potentes y más memoria, la presencia de uno no garantiza la presencia del otro.
Instrucciones de la CPU principal
Partiendo del núcleo "clásico" original, las mejoras se organizan en los siguientes niveles, cada uno de los cuales incluye todo lo anterior:
- El núcleo "clásico" solo tiene la forma de instrucción con operando cero
LPM, que es equivalente aLPM r0,Z. - "Classic plus" agrega la
MOVWinstrucción para mover pares de registros y la forma más general de la instrucción LPM (LPM Rd,ZyLPM Rd,Z+) que permite un registro de destino arbitrario y el autoincremento del puntero Z. - Los núcleos "mejorados" añaden las instrucciones de multiplicación.
- Los núcleos XMEGA no añaden nuevas instrucciones propiamente dichas , pero sí introducen algunos cambios significativos:
- Se reorganiza el mapa de memoria, eliminando la asignación de memoria del archivo de registros del procesador (de modo que los puertos de E/S comienzan en la dirección 0 de la RAM) y ampliando el rango de puertos de E/S. Ahora, los primeros 4 KB corresponden a registros de funciones especiales, los siguientes 4 KB a memoria flash de datos y la RAM normal comienza en 8 KB.
- No es necesario deshabilitar explícitamente las interrupciones antes de ajustar los registros del puntero de pila (SPL y SPH); cualquier escritura en SPL deshabilita automáticamente las interrupciones durante 4 ciclos de reloj para dar tiempo a que se actualice SPH.
- Otros registros multibyte cuentan con registros de sombra para permitir lecturas y escrituras atómicas . Al leer el byte de menor orden, los bytes de orden superior se copian a los registros de sombra, de modo que su lectura posterior genera una instantánea del registro en el momento de la primera lectura. Las escrituras en los bytes de menor orden se almacenan en búfer hasta que se escribe el byte de mayor orden, momento en el que se actualiza atómicamente todo el registro multibyte.
- Los núcleos XMEGA posteriores (específicamente, los modelos B, C y AU, como el ATxmega16A4U, pero no los modelos anteriores A, D y E, como el ATxmega16D4) añaden cuatro instrucciones atómicas de lectura, modificación y escritura : intercambio (
XCH), carga y configuración, carga y borrado, y carga y alternancia. Estas ayudan a coordinarse con periféricos de acceso directo a memoria , en particular un controlador USB .
Con menor capacidad que los núcleos de CPU "clásicos" se encuentran dos subconjuntos: el núcleo "AVR1" y el "AVR tiny". Curiosamente, los procesadores con la marca "ATtiny" cuentan con una variedad de núcleos, incluyendo AVR1 (ATtiny11, ATtiny28), clásico (ATtiny22, ATtiny26), clásico+ (ATtiny24) y AVRtiny (ATtiny20, ATtiny40).
El subconjunto AVR1 no fue popular y no se han introducido nuevos modelos desde el año 2000. Omite toda la RAM excepto los 32 registros mapeados en las direcciones 0–31 y los puertos de E/S en las direcciones 32–95. La pila se reemplaza por una pila de hardware de 3 niveles y se eliminan las instrucciones PUSHy POP. Se eliminan todas las operaciones de 16 bits, así como IJMP, ICALL, y todos los modos de direccionamiento de carga y almacenamiento excepto el indirecto a través de Z.
Un segundo intento, más exitoso, de subconjuntar el conjunto de instrucciones AVR es el núcleo "AVR tiny".
El cambio más significativo es que el núcleo AVRtiny omite los registros R0–R15. Los registros tampoco están mapeados en memoria, con puertos de E/S del 0 al 63 y RAM de propósito general que comienza en la dirección 64. Se omiten las operaciones aritméticas de 16 bits ( ADIW, SBIW), así como los modos de direccionamiento de carga/almacenamiento con desplazamiento ( Y+d, Z+d), pero se conservan los modos de direccionamiento de predecremento y postincremento. LPMSe omite la instrucción; en su lugar, la ROM del programa se mapea al espacio de direcciones de datos y se puede acceder a ella con instrucciones de carga normales.
LDSFinalmente, el núcleo AVRtiny elimina las instrucciones de 2 palabras STSpara el direccionamiento directo de la RAM y, en su lugar, utiliza el espacio de código de operaciónLDS previamente asignado a las instrucciones de carga/almacenamiento con desplazamiento para nuevas instrucciones de 1 palabra STSque pueden acceder a las primeras 128 ubicaciones de la RAM de propósito general, direcciones 0x40 a 0xBF. (Las INinstrucciones OUTproporcionan acceso directo al espacio de E/S de 0 a 0x3F).
Instrucciones de direccionamiento de memoria
Los núcleos más pequeños tienen ≤256 bytes de espacio de direcciones de datos (lo que significa ≤128 bytes de RAM después de eliminar los puertos de E/S y otras direcciones reservadas) y ≤8192 bytes (8 KiB) de ROM de programa. Estos solo tienen un puntero de pila de 8 bits (en SPL) y solo admiten las instrucciones de salto/llamada relativas de 12 bits RJMP/ RCALL. (Como el contador de programa AVR cuenta palabras de 16 bits, no bytes, un desplazamiento de 12 bits es suficiente para direccionar 2 13 bytes de ROM).
Se incluyen capacidades adicionales de direccionamiento de memoria según sea necesario para acceder a los recursos disponibles:
- Los modelos con más de 256 bytes de espacio de direcciones de datos (≥256 bytes de RAM) tienen un puntero de pila de 16 bits, con la mitad superior en el registro SPH.
JUMPLos modelos con más de 8 KiB de ROM añaden las instrucciones de 2 palabras (22 bits)CALL. (Algunos modelos antiguos presentan un error si una instrucción de salto va seguida de una instrucción de 2 palabras).- Los modelos con >64 KiB de ROM agregan la
ELPMinstrucción y el registro RAMPZ correspondiente.LPMLas instrucciones extienden con ceros la dirección de ROM en Z;ELPMlas instrucciones anteponen el registro RAMPZ para los bits altos. Esto no es lo mismo que laLPMinstrucción más general; existen modelos "clásicos" con solo la forma de operando cero deELPM(ATmega103 y at43usb320). Cuando el autoincremento está disponible (la mayoría de los modelos), actualiza toda la dirección de 24 bits, incluido RAMPZ. - Los modelos (poco comunes) con más de 128 KiB de ROM tienen un contador de programa de 3 bytes. Las llamadas y retornos de subrutinas utilizan un byte adicional de espacio de pila, hay un nuevo registro EIND para proporcionar bits altos adicionales para saltos y llamadas indirectas, y hay nuevas instrucciones extendidas
EIJMPqueEICALLusan EIND:Z como dirección de destino. (Las instrucciones anterioresIJMPusanICALLZ con extensión de ceros). - Los modelos (poco comunes) con más de 64 KiB de espacio de direcciones de RAM extienden los límites de direccionamiento de RAM de 16 bits con los registros RAMPX, RAMPY, RAMPZ y RAMPD. Estos proporcionan bits altos adicionales para los modos de direccionamiento que utilizan los pares de registros X, Y o Z, respectivamente, o las instrucciones de direccionamiento directo
LDS/STS. A diferencia del acceso a la ROM, no existen instrucciones "extendidas" específicas; en su lugar, los registros RAMP se utilizan incondicionalmente.
Instrucciones para funciones opcionales
Tres instrucciones están presentes únicamente en los modelos que cuentan con la función de hardware correspondiente.
SPMPara almacenar en la memoria flash ROM, solo está presente en procesadores con memoria flash ROM (la mayoría de ellos).BREAKpara invocar el depurador en el chip , se omite en algunos modelos pequeños que no tienen soporte para depurador en el chip.DESPara realizar rondas del Estándar de Cifrado de Datos , está presente en los modelos XMEGA con soporte para acelerador DES.
Las arquitecturas distintas de AVR1 se nombran según las convenciones de avr-libc. [ 3 ]
El conjunto de registros reducido se limita a R16 a R31. [ 2 ]
Codificación de instrucciones
Asignaciones de bits:
- rrrrr / ddddd = Registro de origen/destino
- rrrr / dddd = Registro de origen/destino (R16–R31)
- rrr / ddd = Registro de origen/destino (R16–R23)
- RRRR / DDDD = Par de registros de origen/destino (R1:R0–R31:R30)
- pp = Par de registros, W, X, Y o Z
- y = bit del par de registros Y/Z (0=Z, 1=Y)
- u = FMULS(U) bit sin signo (0=FMULS con signo, 1=FMULSU sin signo)
- s = Bit de almacenamiento/carga (0=LD Rd,mem, 1=ST mem,Rd)
- c = Llamada/salto (0=salto, 1=llamada)
- cy = Con acarreo (0=sin acarreo, 1=con acarreo)
- e = Extiende la dirección de salto/llamada indirecta con EIND (0=0:Z, 1=EIND:Z)
- q = Extiende la dirección de memoria del programa con RAMPZ (0=0:Z, 1=RAMPZ:Z)
- aaaaaa = dirección del espacio de E/S
- aaaaa = Dirección del espacio de E/S (solo los primeros 32)
- bbb = Número de bit (0–7)
- B = Valor del bit (0 o 1)
- kkkk = constante sin signo de 4 bits (código de operación DES)
- kkkkkk = constante sin signo de 6 bits
- KKKKKKKK = constante de 8 bits
El microcontrolador Atmel AVR utiliza numerosos campos divididos, donde los bits no son contiguos en la palabra de instrucción. El caso más común es el del registro fuente de 5 bits en los bits 9 y 3-0. El ejemplo más extremo son las instrucciones de carga/almacenamiento con desplazamiento, que dividen un desplazamiento de 6 bits en tres partes.
Referencias
- ↑ Assis, Claudia (19 de enero de 2016). "Microchip Technology compra al fabricante de chips Atmel en un acuerdo de 3.560 millones de dólares" . MarketWatch . Consultado el 10 de diciembre de 2025 .
- 1 2 3 "Manual de instrucciones del AVR" (PDF) . Atmel. Noviembre de 2016. Atmel-0856L.
- ↑ "Uso de las herramientas GNU" . Manual de AVR Libc . Consultado el 6 de mayo de 2018 .
- ↑ Atmel. Nota de aplicación "AVR201: Uso del multiplicador de hardware AVR" . 2002. Cita: "El megaAVR es una serie de nuevos dispositivos de la familia de microcontroladores RISC AVR que incluye, entre otras mejoras, un multiplicador de hardware."
Enlaces externos
- Entorno de desarrollo GNU:
- Programación del microcontrolador AVR con GCC por Guido Socher
- Un entorno de desarrollo GNU para el microcontrolador AVR por Rich Neswold
- Opciones de AVR en GCC-AVR
- Herencia del conjunto de instrucciones AVR (nota de LLVM), basada en esta página y en el código de GCC y Binutils.
- Microcontroladores Atmel
- Arquitecturas de conjuntos de instrucciones