INSTRUCCIONES DE TRANSFERENCIA DE LOS MICROCONTOLADORES ATmega Elaborado por: Ing. Jaime E. Velarde jaime.velarde@epn.edu.ec
1
RESUMEN DE LAS INSTRUCCIONES DE TRANSFERENCIA
jaime.velarde@epn.edu.ec
2
1
INFORMACIÓN DE LAS INSTRUCCIONES EL FABRICANTE PROPORCIONA LA SIGUIENTE INFORMACIÓN SOBRE LAS INSTRUCCIONES: – EL MNEMÓNICO Y LOS OPERANDOS para la elaboración de los programas – LA DESCRIPCIÓN en palabras – LA OPERACIÓN simbólica que explica la acción o acciones que realiza – EL CÓDIGO DE MÁQUINA en formato binario – LAS BANDERAS que se afectan – EL NUMERO DE CICLOS de reloj que se demora en la ejecución jaime.velarde@epn.edu.ec
3
INFORMACIÓN RESUMIDA
jaime.velarde@epn.edu.ec
4
2
INFORMACIÓN DETALLADA Descripción Operación Simbólica Mnemónico y Operandos Código de Máquina Banderas que se afectan Ejemplos Ciclos del reloj que se demora jaime.velarde@epn.edu.ec
5
COPIAR REGISTROS • COPIA DE REGISTROS (R0 … R31) MNEMÓNICO: OPERACIÓN: CÓDIGO:
MOV Rd,Rr [1] Rd ← Rr 0010 11rd dddd rrrr
• COPIA DE PAREJAS DE REGISTROS (SE ESPECIFICAN SOLO REGISTROS PARES R0, R2 … R28, R30 ) MNEMÓNICO: OPERACIÓN: CÓDIGO: jaime.velarde@epn.edu.ec
MOVW Rd,Rr [1] Rd ← Rr Rd+1 ← Rr+1 0000 0001 dddd rrrr 6
3
EJEMPLOS PARA COPIAR REGISTROS MOV R5,R20 0010 1110 0101 MOV R31,R0 0010 1101 1111 MOV R8,R8 0010 1100 1000 MOVW R30,R0 0000 0001 1111 MOVW R8,R18 0000 0001 0100 MOVW R11,R22 0000 0001 dddd jaime.velarde@epn.edu.ec
; R5 ← R20 0100 = 0x2E54 ; R31 ← R0 0000 = 0x2DF0 ; R8 ← R8 1000 = 0x2C88 ; R30 ← R0 R31 ← R1 0000 = 0x01F0 ; R8 ← R18 R9 ← R19 1001 = 0x0149 ; R11 ← R22 R12 ← R23 Error..!! No es un 1011 = 0x01?B registro válido
7
CARGAR A UN REGISTRO CON UN VALOR • EN UN REGISTRO (R16 … R31) SE CARGA UN VALOR DE 8 BITS (0 … 255) MNEMÓNICO: OPERACIÓN: CÓDIGO:
jaime.velarde@epn.edu.ec
LDI Rd,K [1] Rd ← K 1110 KKKK dddd KKKK
8
4
EJEMPLOS PARA CARGAR UN REGISTROS LDI R18,0x30 ; R18 ← 0x30 1110 0011 0010 0000 = 0xE320 LDI R19,30 ; R19 ← 30 1110 0001 0011 1110 = 0xE13E LDI R10,0xA6 ; R10 ← 0xA6 1110 1010 dddd 0110 = 0xEA?6 LDI R20,300 ; R20 ← 300 1110 KKKK 0100 KKKK = 0xE?4? LDI R16,-100 ; R16 ← -100 1110 1001 0000 1100 = 0xE90C
Error..!! No es un registro válido Error..!! Operando fuera de rango
jaime.velarde@epn.edu.ec
9
CARGAR DESDE LA SRAM CON DIRECCIONAMIENTO DIRECTO • EN UN REGISTRO (R0 … R31) SE CARGA EL CONTENIDO DE UNA LOCALIDAD CON DIRECCIÓN k (0 … 65535), UTILIZANDO DIRECCIONAMIENTO DIRECTO MNEMÓNICO: OPERACIÓN: CÓDIGO:
jaime.velarde@epn.edu.ec
LDS Rd,k [2] Rd ← (k) 1001 000d dddd 0000 kkkk kkkk kkkk kkkk 10
5
EJEMPLOS PARA CARGAR DESDE LA SRAM CON DIRECCIONAMIENTO DIRECTO LDS R18,0x13A 0x9120 0x013A LDS R19,0x13B 0x9130 0x013B LDS R6,0x2CF 0x9060 0x02CF LDS R3,0x300 0x9030 0x0300 LDS R25,0x800 0x9190 0x0800 jaime.velarde@epn.edu.ec
; R18 ← (0x13A) ; R19 ← (0x13B) ; R6 ← (0x2CF) ; R3 ← (0x300) ; R25 ← (0x800) Atención..!! Dirección fuera de rango
11
CARGAR DESDE LA SRAM CON DIRECCIONAMIENTO INDIRECTO • EN UN REGISTRO (R0 … R31) SE CARGA DESDE UNA LOCALIDAD (0 … 65535), UTILIZANDO DIRECCIONAMIENTO INDIRECTO MNEMÓNICO: LD Rd,X [2] OPERACIÓN: Rd ← (X) CÓDIGO: 1001 000d dddd 1100 MNEMÓNICO: LD Rd,Y [2] OPERACIÓN: Rd ← (Y) CÓDIGO: 1000 000d dddd 1000 MNEMÓNICO: LD Rd,Z [2] OPERACIÓN: Rd ← (Z) CÓDIGO: 1000 000d dddd 0000 jaime.velarde@epn.edu.ec
12
6
EJEMPLOS PARA CARGAR DESDE LA SRAM CON DIRECCIONAMIENTO INDIRECTO LDI 1110 LDI 1110 LD 1001
R27,0x01 0000 1011 R26,0x3A 0011 1010 R18,X 0001 0010
; R27 ← 0x01 Inicialización 0001 = 0xE0B1 del Puntero X ; R26 ← 0x3A 1010 = 0xE3AA ; R18 ← (X) R18 ← (0x013A) 1100 = 0x912C
LDI 1110 LDI 1110 LD 1000
R29,0x01 0000 1101 R28,0x3B 0011 1100 R19,Y 0001 0011
; R27 ← 0x01 Inicialización 0001 = 0xE0D1 del Puntero Y ; R26 ← 0x3A 1011 = 0xE3CB ; R19 ← (Y) R19 ← (0x013B) 1000 = 0x8138
jaime.velarde@epn.edu.ec
13
CARGAR DESDE LA SRAM CON DIRECCIONAMIENTO INDIRECTO Y CON POST INCREMENTO • EN UN REGISTRO (R0 … R31) SE CARGA DESDE UNA LOCALIDAD (0 … 65535), UTILIZANDO DIRECCIONAMIENTO INDIRECTO Y EL PUNTERO SE INCREMENTA POSTERIORMENTE MNEMÓNICO: OPERACIÓN: CÓDIGO: MNEMÓNICO: OPERACIÓN: CÓDIGO: MNEMÓNICO: OPERACIÓN: CÓDIGO:
LD Rd,X+ [2] Rd ← (X) X ← X+1 1001 000d dddd 1101 LD Rd,Y+ [2] Rd ← (Y) Y ← Y+1 1001 000d dddd 1001 LD Rd,Z+ [2] Rd ← (Z) Z ← Z+1 1001 000d dddd 0001
jaime.velarde@epn.edu.ec
14
7
EJEMPLOS PARA CARGAR DESDE LA SRAM CON POST INCREMENTO LDI R27,0x01 ; R27 ← 0x01 1110 0000 1011 0001 = 0xE0B1 Inicialización del LDI R26,0x3A ; R26 ← 0x3A Puntero X 1110 0011 1010 1010 = 0xE3AA LD R18,X+ ; R18 ← (X) R18 ← (0x013A) X ← X+1 1001 0001 0010 1101 = 0x912D LD R19,X+ ; R19 ← (X) R19 ← (0x013B) X ← X+1 1001 0001 0011 1101 = 0x913D
jaime.velarde@epn.edu.ec
15
CARGAR DESDE LA SRAM CON DIRECCIONAMIENTO INDIRECTO Y CON PRE DISMINUCIÓN • EN UN REGISTRO (R0 … R31) SE CARGA DESDE UNA LOCALIDAD (0 … 65535), UTILIZANDO DIRECCIONAMIENTO INDIRECTO EN EL QUE EL PUNTERO PREVIAMENTE SE HA DISMINUIDO MNEMÓNICO: OPERACIÓN: CÓDIGO: MNEMÓNICO: OPERACIÓN: CÓDIGO: MNEMÓNICO: OPERACIÓN: CÓDIGO:
LD Rd,-X [2] X ← X-1 Rd ← (X) 1001 000d dddd 1110 LD Rd,-Y [2] Y ← Y-1 Rd ← (Y) 1001 000d dddd 1010 LD Rd,-Z [2] Z ← Z-1 Rd ← (Z) 1001 000d dddd 0010
jaime.velarde@epn.edu.ec
16
8
EJEMPLOS PARA CARGAR DESDE LA SRAM CON PRE DISMINUCIÓN LDI R29,0x01 ; R27 ← 0x01 1110 0000 1101 0001 = 0xE0D1 Inicialización del LDI R28,0x3C ; R26 ← 0x3C Puntero Y 1110 0011 1100 1100 = 0xE3CC LD R19,-Y ; Y ← Y-1 R19 ← (Y) R19 ← (0x013B) 1001 0001 0011 1010 = 0x913A LD R18,-Y ; Y ← Y-1 R18 ← (Y) R18 ← (0x013A) 1001 0001 0010 1010 = 0x912A
jaime.velarde@epn.edu.ec
17
CARGAR DESDE LA SRAM CON DIRECCIONAMIENTO INDIRECTO Y CON DESPLAZAMIENTO • EN UN REGISTRO (R0 … R31) SE CARGA DESDE UNA LOCALIDAD (0 … 65535), UTILIZANDO DIRECCIONAMIENTO INDIRECTO AL QUE SE SUMA EL DESPLAZAMIENTO (0 … 63) MNEMÓNICO: OPERACIÓN: CÓDIGO: MNEMÓNICO: OPERACIÓN: CÓDIGO: jaime.velarde@epn.edu.ec
LDD Rd,Y+q Rd ← (Y+q) 10q0 qq0d dddd LDD Rd,Z+q Rd ← (Z+q) 10q0 qq0d dddd
[2] 1qqq [2] 0qqq 18
9
EJEMPLOS PARA CARGAR DESDE LA SRAM CON DESPLAZAMIENTO LDI R31,0x01 ; R31 ← 0x01 1110 0000 1111 0001 = 0xE0F1 Inicialización del LDI R30,0x3A ; R30 ← 0x3A Puntero Z 1110 0011 1110 1010 = 0xE3EA LDD R19,Z+10 ; R19 ← (Z+10) R19 ← (0x0144) 1000 0101 0011 0010 = 0x8532 LDD R18,Z+20 ; R18 ← (Z+20) R18 ← (0x014E) 1000 1001 0010 0100 = 0x8924 LDD R1,Z+64 ; R1 ← (Z+64) R1 ← (0x017A) Error..!! 10q0 qq00 0001 0qqq jaime.velarde@epn.edu.ec
Desplazamiento fuera de rango
19
ALMACENAR EN LA SRAM CON DIRECCIONAMIENTO DIRECTO • EN UNA LOCALIDAD CON DIRECCIÓN k (0 … 65535) UTILIZANDO DIRECCIONAMIENTO DIRECTO, SE ALMACENA EL CONTENIDO DE UN REGISTRO (R0 … R31) MNEMÓNICO: OPERACIÓN: CÓDIGO:
jaime.velarde@epn.edu.ec
STS k,Rr [2] (k) ← Rr 1001 001r rrrr 0000 kkkk kkkk kkkk kkkk 20
10
EJEMPLOS PARA ALMACENAR EN LA SRAM CON DIRECCIONAMIENTO DIRECTO STS 0x13A, R18 0x9320 0x013A STS 0x13B,R19 0x9330 0x013B STS 0x2CF,R6 0x9260 0x02CF STS 0x300,R3 0x9230 0x0300 STS 0x800,R25 0x9390 0x0800 jaime.velarde@epn.edu.ec
; (0x13A) ← R18 ; (0x13B) ← R19 ; (0x2CF) ← R6 ; (0x300) ← R3 ; (0x800) ← R25 Atención..!! Dirección fuera de rango
21
ALMACENAR EN LA SRAM CON DIRECCIONAMIENTO INDIRECTO • EN UNA LOCALIDAD (0 … 65535) UTILIZANDO DIRECCIONAMIENTO INDIRECTO, SE ALMACENA UN REGISTRO (R0 … R31) MNEMÓNICO: ST X,Rr [2] OPERACIÓN: (X) ← Rr CÓDIGO: 1001 001r rrrr 1100 MNEMÓNICO: ST Y,Rr [2] OPERACIÓN: (Y) ← Rr CÓDIGO: 1000 001r rrrr 1000 MNEMÓNICO: ST Z,Rr [2] OPERACIÓN: (Z) ← Rr CÓDIGO: 1000 001r rrrr 0000 jaime.velarde@epn.edu.ec
22
11
EJEMPLOS PARA ALMACENAR EN LA SRAM CON DIRECCIONAMIENTO INDIRECTO LDI 1110 LDI 1110 ST 1001
R27,0x01 0000 1011 R26,0x3A 0011 1010 X,R18 0011 0010
; R27 ← 0x01 Inicialización 0001 = 0xE0B1 del Puntero X ; R26 ← 0x3A 1010 = 0xE3AA ; (X) ← R18 (0x013A) ← R18 1100 = 0x932C
LDI 1110 LDI 1110 ST 1000
R29,0x01 0000 1101 R28,0x3B 0011 1100 Y,R19 0011 0011
; R27 ← 0x01 Inicialización 0001 = 0xE0D1 del Puntero Y ; R26 ← 0x3A 1011 = 0xE3CB ; (Y) ← R19 (0x013B) ← R19 1000 = 0x8338
jaime.velarde@epn.edu.ec
23
ALMACENAR EN LA SRAM CON DIRECCIONAMIENTO INDIRECTO Y CON POST INCREMENTO • EN UNA LOCALIDAD (0 … 65535) UTILIZANDO DIRECCIONAMIENTO INDIRECTO, SE ALMACENA UN REGISTRO (R0 … R31) Y EL PUNTERO SE INCREMENTA POSTERIORMENTE MNEMÓNICO: OPERACIÓN: CÓDIGO: MNEMÓNICO: OPERACIÓN: CÓDIGO: MNEMÓNICO: OPERACIÓN: CÓDIGO:
ST X+,Rr [2] (X) ← Rr X ← X+1 1001 001r rrrr 1101 ST Y+,Rr [2] (Y) ← Rr Y ← Y+1 1001 001r rrrr 1001 ST Z+,Rr [2] (Z) ← Rr Z ← Z+1 1001 001r rrrr 0001
jaime.velarde@epn.edu.ec
24
12
EJEMPLOS PARA ALMACENAR EN LA SRAM CON POST INCREMENTO LDI R27,0x01 ; R27 ← 0x01 1110 0000 1011 0001 = 0xE0B1 Inicialización del LDI R26,0x3A ; R26 ← 0x3A Puntero X 1110 0011 1010 1010 = 0xE3AA ST X+,R18 ; (X) ← R18 (0x013A) ← R18 X ← X+1 1001 0011 0010 1101 = 0x932D ST X+,R19 ; (X) ← R19 (0x013B) ← R19 X ← X+1 1001 0011 0011 1101 = 0x933D
jaime.velarde@epn.edu.ec
25
ALMACENAR EN LA SRAM CON DIRECCIONAMIENTO INDIRECTO Y CON PRE DISMINUCIÓN • EN UNA LOCALIDAD (0 … 65535) UTILIZANDO DIRECCIONAMIENTO INDIRECTO EN EL QUE PREVIAMENTE SE HA DISMINUIDO EL PUNTERO, SE ALMACENA UN REGISTRO (R0 … R31) MNEMÓNICO: OPERACIÓN: CÓDIGO: MNEMÓNICO: OPERACIÓN: CÓDIGO: MNEMÓNICO: OPERACIÓN: CÓDIGO:
ST -X,Rr [2] X ← X-1 (X) ← Rr 1001 001r rrrr 1110 ST -Y,Rr [2] Y ← Y-1 (Y) ← Rr 1001 001r rrrr 1010 ST -Z,Rr [2] Z ← Z-1 (Z) ← Rr 1001 001r rrrr 0010
jaime.velarde@epn.edu.ec
26
13
EJEMPLOS PARA ALMACENAR EN LA SRAM CON PRE DISMINUCIÓN LDI R29,0x01 ; R27 ← 0x01 1110 0000 1101 0001 = 0xE0D1 Inicialización del LDI R28,0x3C ; R26 ← 0x3C Puntero Y 1110 0011 1100 1100 = 0xE3CC ST -Y,R19 ; Y ← Y-1 (Y) ← R19 (0x013B) ← R19 1001 0011 0011 1010 = 0x933A ST -Y,R18 ; Y ← Y-1 (Y) ← R18 (0x013A) ← R18 1001 0011 0010 1010 = 0x932A
jaime.velarde@epn.edu.ec
27
ALMACENAR EN LA SRAM CON DIRECCIONAMIENTO INDIRECTO Y CON DESPLAZMIENTO • EN UNA LOCALIDAD (0 … 65535) UTILIZANDO DIRECCIONAMIENTO INDIRECTO AL QUE SE SUMA EL DESPLAZAMIENTO (0 … 63), SE ALMACENA UN REGISTRO (R0 … R31) MNEMÓNICO: OPERACIÓN: CÓDIGO: MNEMÓNICO: OPERACIÓN: CÓDIGO: jaime.velarde@epn.edu.ec
STD Y+q,Rr (Y+q) ← Rr 10q0 qq1r rrrr STD Z+q,Rr (Z+q) ← Rr 10q0 qq1r rrrr
[2] 1qqq [2] 0qqq 28
14
EJEMPLOS PARA ALMACENAR EN LA SRAM CON DESPLAZAMIENTO LDI R31,0x01 ; R31 ← 0x01 1110 0000 1111 0001 = 0xE0F1 Inicialización del LDI R30,0x3A ; R30 ← 0x3A Puntero Z 1110 0011 1110 1010 = 0xE3EA STD Z+10,R19 ; (Z+10) ← R19 (0x0144) ← R19 1000 0111 0011 0010 = 0x8732 STD Z+20,R18 ; (Z+20) ← R18 (0x014E) ← R18 1000 1011 0010 0100 = 0x8B24 STD Z+64,R1 ; (Z+64) ← R1 (0x017A) ← R1 Error..!! 10q0 qq10 0001 0qqq jaime.velarde@epn.edu.ec
Desplazamiento fuera de rango
29
CARGAR UN REGISTRO DESDE LA FLASH • EN UN REGISTRO SE CARGA DESDE UNA LOCALIDAD DE LA MEMORIA DEL PROGRAMA, UTILIZANDO DIRECCIONAMIENTO INDIRECTO MNEMÓNICO: LPM [3] OPERACIÓN: R0 ← (Z) CÓDIGO: 1001 0101 1100 1000 MNEMÓNICO: LPM Rd,Z [3] OPERACIÓN: Rd ← (Z) CÓDIGO: 1001 000d dddd 0100 MNEMÓNICO: LPM Rd,Z+ [3] OPERACIÓN: Rd ← (Z) Z ← Z+1 CÓDIGO: 1001 000d dddd 0101 jaime.velarde@epn.edu.ec
30
15
EJEMPLOS PARA CARGAR DESDE LA FLASH
LDI R31,0x03 ; R31 ← 0x03 1110 0000 1111 0011 = 0xE0F3 Inicialización del LDI R30,0x3A ; R30 ← 0x3A Puntero Z 1110 0001 1110 0000 = 0xE1E0 LPM ; R0 ← (Z)FLASH R0 ← (0x0310)FLASH 1001 0101 1100 1000 = 0x95C8 LPM R7,Z ; R7 ← (Z)FLASH R7 ← (0x0310)FLASH 1001 0000 0111 0100 = 0x9074 LPM R17,Z+ ; R17 ← (Z)FLASH R17 ← (0x0310)FLASH ; Z ← Z+1
1001 0001 0001 0101 = 0x9115 jaime.velarde@epn.edu.ec
31
TRANSFERIR ENTRE REGISTRO Y PÓRTICO • ENTRADA A UN REGISTRO (R0 … R31) DESDE UN PÓRTICO DE DIRECCIÓN A (0 … 63) MNEMÓNICO: OPERACIÓN: CÓDIGO:
IN Rd,A [1] Rd ← I/O A 1011 0AAd dddd AAAA
• SALIDA HACIA UN PÓRTICO (0 … 63) DESDE UN REGISTROS (R0 … R31) MNEMÓNICO: OPERACIÓN: CÓDIGO: jaime.velarde@epn.edu.ec
OUT A,Rr [1] I/O A ← Rr 1011 1AAr rrrr AAAA 32
16
EJEMPLOS DE TRANSFERENCIAS CON PÓRTICOS IN R16,0x00 ; R16 ← PÓRTICO 0x00 1011 0001 0000 0000 = 0xB100 IN R12,0x20 ; R12 ← PÓRTICO 0x20 1011 0010 1100 0100 = 0xB2C4 OUT 0x02,R18 ; PÓRTICO 0x02 ← R18 1011 1001 0010 0010 = 0xB922 OUT 0x1F,R9 ; PÓRTICO 0x1F ← R9 1011 1010 1001 1111 = 0xBA9F OUT 0x50,R10 ; PÓRTICO 0x50 ← R10 Error..!! 1011 1AA0 1010 AAAA = 0xB?A? jaime.velarde@epn.edu.ec
Pórtico fuera 33 de rango
EJERCICIO QUE UTILIZA INSTRUCCIONES DE TRANSFERENCIA Desarrollar un programa para el microcontrolador ATmega164P, que permita llenar las dieciséis primeras localidades de la memoria de datos, con los códigos ASCII de: $1F4 por cuatro ocasiones, tal como se muestra en la siguiente lámina. jaime.velarde@epn.edu.ec
34
17
16 primeras localidades de datos
GRテ:ICO DEL EJERCICIO
jaime.velarde@epn.edu.ec
Donde: 0x24 es el ASCII del signo $, 0x31 es el ASCII del dテュgito 1, 0x46 es el ASCII de la letra F y 0x34 es el ASCII del dテュgito 4
35
18