Conjunto de instrucciones de Atmel AVR
|
|
El Conjunto de instrucciones de Atmel AVR es el lenguaje máquina para el Atmel AVR, un Arquitectura Harvard modificada 8-bit RISC solo chip microcontrolador que fue desarrollado por Atmel en 1996. El AVR fue una de las primeras familias de microcontroladores para usar la en-viruta memoria Flash para el almacenaje de programa.
Contenido
- 1 Registros de procesador
- 2 Direccionamiento
- 3 Tiempo de instrucción
- 4 Lista de instrucciones
- 5 Conjunto de instrucciones herencia
- 6 Instrucciones de codificación
- 7 Enlaces externos
Registros de procesador
Hay 32 registros de 8 bits para fines generales, R0 – R31. Todas las operaciones de aritmética y lógica operan en esos registros; Sólo cargar y almacenar acceso instrucciones RAM.
Un número limitado de instrucciones operar con registro de 16 bits pares. El número menor registro de las Bodegas par los bits menos significativos y debe ser impares. Los tres registro pares se utilizan como puntero de registros para el direccionamiento de memoria. Son conocidos como X (R27:R26), (R29:R28), Y y Z (R31:R30). Coma y predecrement modos de direccionamiento son compatibles con los tres. Y y Z también admiten un desplazamiento positivo de seis bits.
Las instrucciones que permiten un valor inmediato se limitan a registros R16 – R31 (8-bit operaciones) o registrar los pares R25:R24 – R31:R30 (16-bit operaciones ADIW y SBIW). Algunas variantes de la operación de MUL se limitan a ocho registros, R16 a través R23.
Además de estos 32 registros de propósito generales, la CPU tiene unos registros especiales:
- PC: contador de programa 16 o 22 bits
- SP: puntero de pila 8 o 16 bits
- SREG: registro del estado de 8 bits
- RAMPX, RAMPY, RAMPZ, RAMPD y EIND: registros de segmento de 8 bits que se antepone a direcciones de 16 bits en orden de direcciones de 24 bits de forma; Sólo disponible en partes con espacios de direcciones grandes.
Los bits de registro de estado son:
- C Llevar bandera. Esta es una bandera pida prestado por resta.
- Z Señal de cero. Ajuste a 1 cuando un resultado aritmético es cero.
- N Bandera negativo. Establezca una copia del bit más significativo de un resultado aritmético.
- V Bandera de desbordamiento. Ajuste en caso de desbordamiento de complemento de dos.
- Bandera de signo S. Único en AVR, esto siempre es N⊕V y muestra el verdadero signo de una comparación.
- Llevan H media. Este es un transporte interno de adiciones y se utiliza para apoyar BCD aritmética.
- Copia T Bit. Carga poco especial y poco tienda instrucciones utilizan este bit.
- I Bandera de interrupción. Conjunto cuando se activan las interrupciones.
Direccionamiento
Los espacios de direcciones siguientes están disponibles:
- los registros de propósito general son tratados por sus números (0-31), aunque el número total de 5 bits no se almacena en las instrucciones que sólo pueden operar en un subconjunto de los registros
- I/O registros tienen un espacio dedicado de 6 bits de dirección, la mitad inferior de las cuales es poco-direccionable; algunas partes tienen I/O registros fuera de este espacio de direcciones, que se denomina "extended I/O" y sólo son accesibles como I/O asignados a la memoria en el espacio de direcciones de datos
- el espacio de direcciones de datos mapas los 32 registros de propósito generales, todos los registros de I/O (incluidos los también accesible a través del espacio de direcciones de I/O) y la memoria RAM; se pueda abordarla directamente o indirectamente a través de los registros de puntero X, Y y Z, antepone si es necesario por RAMPY, RAMPX y RAMPZ respectivamente
- (memoria de programaFlash) dispone de un espacio de Dirección separada, dirigido como palabras de 16 bits con el fin de obtener instrucciones
- con el fin de obtener datos constantes, memoria de programa se dirige bytewise a través del registro de puntero Z, antepone si es necesario por RAMPZ
- el EEPROM es asignado a la memoria en algunos dispositivos; en otros, no es directamente direccionable y en su lugar se accede a través de la dirección, datos y registros de control de I/O
- el propósito general registros, el registro del estado y algunos registros de I/O son poco direccionables, con poco 0 siendo el menos significativo y poco 7 los más significativos.
Los primeros 64 registros I/O son accesibles a través de la entrada-salida y el espacio de direcciones de datos. Por lo tanto tienen dos direcciones diferentes. Estos generalmente se escriben como "0 x 00 (0 x 20)" a través "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 CPU especial, con la excepción de PC, pueden tener acceso como I/O registra. Por ejemplo: SREG (0x3F (0x5F)), SP (0x3E:0x3D (0x5E:0x5D)), EIND (0x3C (0x5C)) o RAMPZ (0x3B (0x5B)).
Puede verse un mapa de memoria del ATmega típico como:
Dirección de datos | Dirección de la entrada-salida | contenido |
---|---|---|
0 x 0000 – 0x001f | registra R0 – R31 | |
0x0020 – 0x003f | 0 x 00-0x1f | Registros de I/O (bit-direccionable) |
0x0040 – 0x005f | 0 x 20 – 0x3f | Registros de I/O (no poco-direccionable) |
0x0060 – 0x00ff | I/O extendida registra (entrada-salida asignados a la memoria solamente) | |
0100 – RAMEND | SRAM interno |
donde RAMEND es la última dirección de RAM. En las partes carecen de I/O extendida el RAM comenzaría en 0x0060.
Tiempo de instrucción
Operaciones aritméticas trabajan en registros R0-R31 pero no directamente en RAM y tomar un ciclo de reloj, con excepción de multiplicación y adición de nivel mundial (ADIW y SBIW) que tienen dos ciclos.
Espacio de memoria RAM y de la entrada-salida puede accederse sólo copiando o de registros. Acceso indirecto (incluyendo desplazamiento constante, predecrement o postincrement opcional) es posible a través de registros de X, Y y Z. Todos los accesos a la RAM lleva dos ciclos de reloj. Moviéndose entre los registros y de la entrada-salida es un ciclo. Mover ocho o 16 bit de datos entre registros o constante para registrar también es un ciclo. Lectura de memoria de programa (LPM) lleva tres ciclos.
Lista de instrucciones
Las instrucciones son una palabra de 16 bits larga, excepto para aquellos incluyendo una dirección de 16 bits o 22 bits, que tienen dos palabras.
Existen dos tipos de ramas condicionales: Salta a la dirección y salta. Ramas condicionales (BRxx) pueden probar una bandera ALU y saltar a la dirección especificada. Salta (SBxx) prueba un poco arbitrario en un registro o I/O y omitir la instrucción siguiente si la prueba era cierto.
En el siguiente:
- es un número de bits en el registro del estado (0 = C, 1 = Z, etc., ver la lista de arriba)
- b es un número de bits en un propósito general o I/O registro (0 = menos significativo, 7 = más importante)
- K6 es un inmediato 6-bit unsigned constante (rango: 0 – 63)
- K8 es una constante inmediata de 8 bits; puesto que se utiliza sólo en las operaciones de 8 bits, su signo es irrelevante
- IO5 es una dirección de la entrada-salida 5 bits cubriendo la parte poco direccionable del espacio de direcciones I/O, es decir, la mitad inferior (rango: 0 – 31)
- IO6 es una dirección de la entrada-salida de 6 bits cubriendo el espacio de direcciones completo de I/O (rango: 0 – 63)
- D16 es una dirección de 16 bits de datos abarca 64Hola!; en lugares con espacio de datos de más de 64 KiB, se antepone el contenido del registro de segmento RAMPD
- P22 es una dirección de programa de 22 bits cubriendo 222 palabras de 16 bits (es decir, 8MiB)
- ΔD6 es un 6-bit unsigned desplazamiento con respecto a la dirección de datos almacenada en el puntero Y o Z
- ΔP7 y δP12 son 7 bits (Resp. 12-bit) firmado desplazamientos en relación con la dirección de programa almacenado en el contador del programa
Aritmética | Bit & otros | Transferencia | Salto | Rama | Llamada |
---|---|---|---|---|---|
ADD Rd, Rr ADC Rd, Rr COM Rd MUL Rd, Rr |
BSET s BCLR s |
MOV Rd, Rr MOVW Rd, 1:Rd, Rr + 1:Rr |
RJMP ΔP12 IJMP |
CPSE Rd, Rr
|
RCALL ΔP12 ICALL |
Conjunto de instrucciones herencia
No todas las instrucciones se implementan en todo Atmel AVR Controladores. Éste es el caso de las instrucciones de realizar multiplicaciones, cargas/salta/llamadas extendidas, saltos largo y control de la alimentación.
Familia | Miembros | Aritmética | Sucursales | Transferencias | Bit-Wise |
---|---|---|---|---|---|
Base mínima | AT90S1200 ATtiny11 ATtiny12 ATtiny15 ATtiny28 |
AÑADIR ADC SUB SUBI SBC SBCI Y ANDI O ORI EOR COM NEG SBR CBR INC DEC TST CLR SER |
RJMP RCALL RET RETI CPSE CP CPC IPC SBRC SBR SBIC SBIS BRBS BRBC BREQ BRNE BRCS BRCC BRSH BRLO BRMI BRPL BRGE BRLT BRHS BRHC BRT BRTC BRVS BRVC BRIE BRID |
LD ST MOV LDI EN HACIA FUERA LPM (no en AT90S1200) |
OSE CBI LSL LSR ROL ROR ASR SWAP BSET BCLR BST BLD SEC CLC SEN CLN SEZ CLZ SEI CLI SES CLS SEV CLV CONJUNTO CLT SEH CLH NOP DORMIR WDR |
Núcleo clásico hasta 8 K programa espacial | AT90S2313 AT90S2323 ATtiny22 AT90S2333 AT90S2343 AT90S4414 AT90S4433 AT90S4434 AT90S8515 AT90C8534 AT90S8535 ATtiny26 |
nuevas instrucciones: ADIW SBIW |
nuevas instrucciones: IJMP ICALL |
nuevas instrucciones: LD (ahora 9 modos) LDD LDS ST (9 modos) STD STS EMPUJE POP |
(nada nuevo) |
Base clásica con hasta 128K | ATmega103 ATmega603 AT43USB320 AT76C711 |
(nada nuevo) | nuevas instrucciones: JMP LLAMADA |
nuevas instrucciones: ELPM |
(nada nuevo) |
Base mejorada con hasta 8K | ATmega8 ATmega83 ATmega85 ATmega8515 |
nuevas instrucciones: MUL MUL MULSU FMUL FMULS FMULSU |
(nada nuevo) | nuevas instrucciones: MOVW LPM (3 modos) SPM |
(nada nuevo) |
Base mejorada con hasta 128K | ATmega16 ATmega161 ATmega163 ATmega32 ATmega323 ATmega64 ATmega128 AT43USB355 AT94 (FPSLIC) Serie AT90CAN Serie AT90PWM ATmega48 ATmega88 ATmega168 ATmega162 ATtiny13 ATtiny25 ATtiny45 ATtiny85 ATtiny2313 ATmega164 ATmega324 ATmega328 ATmega644 ATmega165 ATmega169 ATmega325 ATmega3250 ATmega645 ATmega6450 ATmega406 |
(nada nuevo) | (nada nuevo) | (nada nuevo) | nuevas instrucciones: DESCANSO |
Base mejorada con hasta 4M | ATmega640 ATmega1280 ATmega1281 ATmega2560 ATmega2561 |
(nada nuevo) | nuevas instrucciones: EIJMP EICALL |
(nada nuevo) | (nada nuevo) |
Núcleo XMEGA | Serie ATxmega | nuevas instrucciones: DES |
(nada nuevo) | nuevas instrucciones: (del segundo silicio revisión - AU, B, C piezas) XCH LAS LAC LAT |
(nada nuevo) |
Núcleo reducido | ATtiny10 ATtiny9 ATtiny5 ATtiny4 |
(Idéntico al núcleo mínimo, excepto CPU registro conjunto reducido) | (Idéntico al clásico núcleo con hasta 8K, excepto CPU registro conjunto reducido) | Idéntico al clásico núcleo con hasta 8K, con las excepciones siguientes: LPM (eliminado) LDD (eliminado) STD (eliminado) LD (también memoria de programa de accesos) LDS (patrón de bits diferentes) STS (patrón de bits diferentes) Conjunto de registro de CPU reducido |
(Idéntico al núcleo mejorado con hasta 128K, excepto CPU registro conjunto reducido) |
Instrucciones de codificación
Asignaciones de bit:
- Rrrrr = registro fuente
- Rrrr = par de registro fuente
- ddddd = registro de destino
- dddd = par de registro destino
- HHHH = alto registro, R16 – R31
- PP = registro par, W, X, Y o Z
- y = par de registro Y/Z poco (0 = Z, 1 = Y)
- s = tienda/carga un poco (0 = load, 1 = tienda)
- c = llamada/salto (0 = saltar, 1 = llamada)
- AAAAAA = dirección de espacio de la entrada-salida
- aaaaa = dirección de espacio la entrada-salida (primera 32 solamente)
- BBB = número de bits
- B = valor
- kkkkkk = 6 bits sin signo constante
- KKKKKKKK = constante de 8 bits
El Atmel AVR utiliza muchos campos de split, donde los bits no son contiguos en la palabra de instrucción. La carga/tienda con instrucciones de desplazamiento son el ejemplo más extremo donde un desplazamiento de 6 bits se divide en tres partes.
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Instrucción |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | NOP |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | d d d | r r r r | MOVW mover registro par | ||||||
0 | 0 | 0 | 0 | 0 | 0 | 1 | d d | r r r | Firmado y fraccionarios se multiplican (R16 – R23) | |||||||
0 | 0 | 0 | 0 | 0 | 1 | r | d d d d | r r r r | 2-operando instrucciones CPC, SBC, ADD, CPSE, CP, SUB. ADC Y, EOR O MOV |
|||||||
0 | 0 | 0 | 0 | 1 | ||||||||||||
0 | 0 | 0 | 1 | |||||||||||||
0 | 0 | 1 | 0 | |||||||||||||
0 | 0 | 1 | 1 | K K K K | h h h h | K K K K | Instrucciones de registro inmediato IPC SBCI, SUBI, ORI, ANDI |
|||||||||
0 | 1 | |||||||||||||||
1 | 0 | k | 0 | k k | s | d d d d | y | k k k | LDD/STD a Z o Y + k, k | |||||||
1 | 0 | 0 | 1 | 0 | 0 | s | d d d d | LD/ST otro | ||||||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | d d d d | 0 | 1-operando instrucciones (COM, NEG, SWAP, etc.). | |||||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | B̅ | b b b | 1 | 0 | 0 | 0 | Registro del sexo/CLx estado poco claro/set | ||
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | Misc instrucciones (RET, RETI, sueño, etc.). | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | c | 0 | 0 | 0 | 1 | 0 | 0 | 1 | Salto indirecto/llamada a Z o EIND:Z | |
1 | 0 | 0 | 1 | 0 | 1 | 0 | d d d d | 1 | 0 | 1 | 0 | DEC Rd | ||||
1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | k k k k | 1 | 0 | 1 | 1 | DES redondo k | |||
1 | 0 | 0 | 1 | 0 | 1 | 0 | k k k k k | 1 | 1 | c | k | JMP/CALL abs22 | ||||
1 | 0 | 0 | 1 | 0 | 1 | 1 | k k | p p | k k k k | ADIW/SBIW Rp, uimm6 | ||||||
1 | 0 | 0 | 1 | 1 | 0 | B | un un un un un | b b b | Operaciones de E/S espacio poco | |||||||
1 | 0 | 0 | 1 | 1 | 1 | r | d d d d | r r r r | MUL, sin firmar: R1:R0 = Rr × Rd | |||||||
1 | 0 | k | 0 | k k | s | d d d d | y | k k k | Ver 10k 0 por encima de |
|||||||
1 | 0 | 1 | 1 | s | un un | d d d d | un un un un | OUT/en el espacio a I/O | ||||||||
1 | 1 | 0 | c | desplazamiento firmado 12 bit | Salto/llamada relativa a PC ± 2 × simm12 | |||||||||||
1 | 1 | 1 | 0 | K K K K | h h h h | K K K K | LDI Rh, K | |||||||||
1 | 1 | 1 | 1 | 0 | B̅ | 7-bit firmado offset | b b b | Rama condicional en bits de registro de estado | ||||||||
1 | 1 | 1 | 1 | 1 | 0 | s | d d d d | 0 | b b b | BLD/BST registro poco al estado.T | ||||||
1 | 1 | 1 | 1 | 1 | 1 | B | d d d d | 0 | b b b | Skip SBRC/SBR si registro un poco es igual a B |
Enlaces externos
El Wikibook Sistemas embebidos tiene una página sobre el tema: Atmel AVR |
- Entorno de desarrollo de GNU
- Programando el microcontrolador AVR con GCC por Guido Socher
- Un entorno de desarrollo de GNU para el microcontrolador AVR por Rich Neswold
- Opciones de AVR AVR-GCC
- Conjunto de instrucciones de Atmel AVR PDF(149 pages)