Este documento proporciona información sobre las instrucciones de transferencia de los microcontroladores ATmega. Explica las instrucciones para copiar registros, cargar valores a registros desde la memoria SRAM usando diferentes tipos de direccionamiento, y almacenar registros en la SRAM. Incluye los mnemónicos, códigos de máquina, operaciones y ejemplos de cada instrucción.
1. jaime.velarde@epn.edu.ec 1 SISTEMAS MICROPROCESADOS INSTRUCCIONES DE TRANSFERENCIA DE LOS MICROCONTOLADORESATmega Elaborado por: Ing. Jaime E. Velarde
3. jaime.velarde@epn.edu.ec 3 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
6. jaime.velarde@epn.edu.ec 6 CARGAR A UN REGISTRO CON UN VALOR EN UN REGISTRO (R16 … R31) SE CARGA UN VALOR DE 8 BITS (0 … 255) MNEMÓNICO: LDIRd,K[1] OPERACIÓN: Rd← K CÓDIGO: 1110 KKKKddddKKKK
7. jaime.velarde@epn.edu.ec 7 EJEMPLOS PARA CARGAR UN REGISTROS LDIR18,0x30; R18 ←0x30 1110 0011 00100000 = 0xE320 LDI R19,30 ; R19 ← 30 1110 0001 00111110 = 0xE13E LDI R10,0xA6 ; R10 ← 0xA6 1110 1010dddd0110 = 0xEA?6 LDI R20,300 ; R20 ← 300 1110 KKKK 0100KKKK = 0xE?4? LDI R16,-100 ; R18 ← -100 1110 1001 00001100 = 0xE90C Error..!! No es un registro válido Error..!! Operando fuera de rango
8. jaime.velarde@epn.edu.ec 8 CARGAR DESDE LA SRAMCON 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: LDSRd,k[2] OPERACIÓN: Rd← (k) CÓDIGO: 1001 000d dddd 0000 kkkkkkkkkkkkkkkk
9. jaime.velarde@epn.edu.ec 9 EJEMPLOS PARA CARGAR DESDE LA SRAM CON DIRECCIONAMIENTO DIRECTO LDSR18,0x13A ; R18 ←(0x13A) 0x9120 0x013A LDS R19,0x13B ; R19 ← (0x13B) 0x9130 0x013B LDS R6,0x2CF ; R6 ← (0x2CF) 0x9060 0x02CF LDS R3,0x300 ; R3 ← (0x300) 0x9030 0x0300 LDS R25,0x800 ; R25 ← (0x800) 0x9190 0x0800 Atención..!! Dirección fuera de rango
10. jaime.velarde@epn.edu.ec 10 CARGAR DESDE LA SRAM CON DIRECCIONAMIENTO INDIRECTO EN UN REGISTRO (R0 … R31) SE CARGA DESDE UNA LOCALIDAD (0 … 65535), UTILIZANDO DIRECCIONAMIENTO INDIRECTO MNEMÓNICO: LDRd,X[2] OPERACIÓN: Rd← (X) CÓDIGO: 1001 000d dddd1100 MNEMÓNICO: LDRd,Y[2] OPERACIÓN: Rd← (Y) CÓDIGO: 1000 000d dddd 1000 MNEMÓNICO: LDRd,Z[2] OPERACIÓN: Rd← (Z) CÓDIGO: 1000 000d dddd 0000
12. jaime.velarde@epn.edu.ec 12 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: LDRd,X+[2] OPERACIÓN: Rd← (X) X ← X+1 CÓDIGO: 1001 000d dddd 1101 MNEMÓNICO: LDRd,Y+[2] OPERACIÓN: Rd← (Y) Y ← Y+1 CÓDIGO: 1001 000d dddd 1001 MNEMÓNICO: LDRd,Z+[2] OPERACIÓN: Rd← (Z) Z ← Z+1 CÓDIGO: 1001 000d dddd 0001
13. jaime.velarde@epn.edu.ec 13 EJEMPLOS PARA CARGAR DESDE LA SRAM CON POST INCREMENTO LDI R27,0x01 ; R27 ← 0x01 1110 0000 10110001 = 0xE0B1 LDI R26,0x3A ; R26 ← 0x3A 1110 0011 10101010 = 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 Inicializa-ción del Puntero X
14. jaime.velarde@epn.edu.ec 14 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: LDRd,-X[2] OPERACIÓN: X ← X-1Rd← (X) CÓDIGO: 1001 000d dddd 1110 MNEMÓNICO: LDRd,-Y[2] OPERACIÓN: Y ← Y-1Rd← (Y) CÓDIGO: 1001 000d dddd 1010 MNEMÓNICO: LDRd,-Z[2] OPERACIÓN: Z ← Z-1 Rd← (Z) CÓDIGO: 1001 000d dddd 0010
15. jaime.velarde@epn.edu.ec 15 EJEMPLOS PARA CARGAR DESDE LA SRAM CON PRE DISMINUCIÓN LDI R29,0x01 ; R27 ← 0x01 1110 0000 11010001 = 0xE0D1 LDI R28,0x3C ; R26 ← 0x3C 1110 0011 11001100 = 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 Inicializa-ción del Puntero Y
16. jaime.velarde@epn.edu.ec 16 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: LDDRd,Y+q[2] OPERACIÓN: Rd← (Y+q) CÓDIGO: 10q0 qq0d dddd 1qqq MNEMÓNICO: LDDRd,Z+q[2] OPERACIÓN: Rd← (Z+q) CÓDIGO: 10q0 qq0d dddd 0qqq
17. jaime.velarde@epn.edu.ec 17 EJEMPLOS PARA CARGAR DESDE LA SRAM CON DESPLAZAMIENTO LDI R31,0x01 ; R31 ← 0x01 1110 0000 11110001 = 0xE0F1 LDI R30,0x3A ; R30 ← 0x3A 1110 0011 11101010 = 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) 10q0 qq00 0001 0qqq Inicializa-ción del Puntero Z Error..!! Desplazamiento fuera de rango
18. jaime.velarde@epn.edu.ec 18 ALMACENAR EN LA SRAMCON 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: STSk,Rr[2] OPERACIÓN: (k) ←Rr CÓDIGO: 1001 001r rrrr 0000 kkkkkkkkkkkkkkkk
19. jaime.velarde@epn.edu.ec 19 EJEMPLOS PARA ALMACENAR EN LA SRAMCON DIRECCIONAMIENTO DIRECTO STS0x13A, R18 ; (0x13A) ← R18 0x9320 0x013A STS 0x13B,R19 ; (0x13B) ← R19 0x9330 0x013B STS 0x2CF,R6 ; (0x2CF) ← R6 0x9260 0x02CF STS 0x300,R3 ; (0x300) ← R3 0x9230 0x0300 STS 0x800,R25 ; (0x800) ← R25 0x9390 0x0800 Atención..!! Dirección fuera de rango
20. jaime.velarde@epn.edu.ec 20 ALMACENAR EN LA SRAMCON DIRECCIONAMIENTO INDIRECTO EN UNA LOCALIDAD (0 … 65535) UTILIZANDO DIRECCIONAMIENTO INDIRECTO, SE ALMACENA UN REGISTRO (R0 … R31) MNEMÓNICO: STX,Rr[2] OPERACIÓN: (X) ←Rr CÓDIGO: 1001 001r rrrr 1100 MNEMÓNICO: STY,Rr[2] OPERACIÓN: (Y) ←Rr CÓDIGO: 1000 001r rrrr 1000 MNEMÓNICO: STZ,Rr[2] OPERACIÓN: (Z) ←Rr CÓDIGO: 1000 001r rrrr 0000
22. jaime.velarde@epn.edu.ec 22 ALMACENAR EN LA SRAMCON 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: STX+,Rr[2] OPERACIÓN: (X) ←Rr X ← X+1 CÓDIGO: 1001 001r rrrr 1101 MNEMÓNICO: STY+,Rr[2] OPERACIÓN: (Y) ←Rr Y ← Y+1 CÓDIGO: 1001 001r rrrr1001 MNEMÓNICO: STZ+,Rr[2] OPERACIÓN: (Z) ←Rr Z ← Z+1 CÓDIGO: 1001 001r rrrr 0001
23. jaime.velarde@epn.edu.ec 23 EJEMPLOS PARA ALMACENAR EN LA SRAMCON POST INCREMENTO LDI R27,0x01 ; R27 ← 0x01 1110 0000 10110001 = 0xE0B1 LDI R26,0x3A ; R26 ← 0x3A 1110 0011 10101010 = 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 Inicializa-ción del Puntero X
24. jaime.velarde@epn.edu.ec 24 ALMACENAR EN LA SRAMCON 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: ST-X,Rr[2] OPERACIÓN: X ← X-1 (X) ←Rr CÓDIGO: 1001 001r rrrr 1110 MNEMÓNICO: ST-Y,Rr[2] OPERACIÓN: Y ← Y-1 (Y) ←Rr CÓDIGO: 1001 001r rrrr 1010 MNEMÓNICO: ST-Z,Rr[2] OPERACIÓN: Z ← Z-1 (Z) ←Rr CÓDIGO: 1001 001r rrrr 0010
25. jaime.velarde@epn.edu.ec 25 EJEMPLOS PARA ALMACENAR EN LA SRAMCON PRE DISMINUCIÓN LDI R29,0x01 ; R27 ← 0x01 1110 0000 11010001 = 0xE0D1 LDI R28,0x3C ; R26 ← 0x3C 1110 0011 11001100 = 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 Inicializa-ción del Puntero Y
26. jaime.velarde@epn.edu.ec 26 ALMACENAR EN LA SRAMCON 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: STDY+q,Rr[2] OPERACIÓN: (Y+q) ←Rr CÓDIGO: 10q0 qq1r rrrr 1qqq MNEMÓNICO: STDZ+q,Rr[2] OPERACIÓN: (Z+q) ←Rr CÓDIGO: 10q0 qq1r rrrr 0qqq
28. jaime.velarde@epn.edu.ec 28 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: LPMRd,Z[3] OPERACIÓN: Rd← (Z) CÓDIGO: 1001 000d dddd 0100 MNEMÓNICO: LPMRd,Z+[3] OPERACIÓN: Rd← (Z) Z ← Z+1 CÓDIGO: 1001 000d dddd 0101
30. jaime.velarde@epn.edu.ec 30 TRANSFERIR ENTRE REGISTRO Y PÓRTICO ENTRADA A UN REGISTRO (R0 … R31) DESDE UN PÓRTICO DE DIRECCIÓN A (0 … 63) MNEMÓNICO: IN Rd,A[1] OPERACIÓN: Rd← I/O A CÓDIGO: 1011 0AAd ddddAAAA SALIDA HACIA UN PÓRTICO (0 … 63) DESDE UN REGISTROS (R0 … R31) MNEMÓNICO: OUTA,Rr[1] OPERACIÓN: I/O A ←Rr CÓDIGO: 1011 1AAr rrrrAAAA
31. jaime.velarde@epn.edu.ec 31 EJEMPLOS DE TRANSFERENCIAS CON PÓRTICOS IN R16,0x00 ; R16 ← PÓRTICO 0x00 1011 0001 00000000 = 0xB100 IN R12,0x20 ; R12 ← PÓRTICO 0x20 1011 0010 11000100 = 0xB2C4 OUT 0x02,R18 ; PÓRTICO 0x02 ← R18 1011 1001 00100010 = 0xB922 OUT 0x1F,R9 ; PÓRTICO 0x1F ← R9 1011 1010 10011111 = 0xBA9F OUT 0x50,R10 ; PÓRTICO 0x50 ← R10 1011 1AA0 1010AAAA = 0xB?A? Error..!! Pórtico fuera de rango
32. jaime.velarde@epn.edu.ec 32 EJERCICIO QUE UTILIZA INSTRUCCIONES DE TRANSFERENCIA Desarrollar un programa para el microcontrolador ATmega164P, para llenar las dieciséis primeras localidades de la memoria de datos, con los códigos ASCII del signo $, del número 1, de la letra F mayúscula y del número 4 en forma alternada, tal como se muestra en la siguiente lámina.
33. GRÁFICO DEL EJERCICIO jaime.velarde@epn.edu.ec 33 0x24 es el ASCII del signo $, 0x31 es el ASCII del 1, 0x46 es el ASCII de la F y 0x34 es el ASCII del 4.