22/05/12
Tema 5 Ejemplo de un computador real: ATmegaX8PA 8-bit Microcontroller
EdC-ISW-T5-AVR-2012-v2.0
1
Índice 1. Introducción 2. Descripción general 3. Arquitectura interna 4. Organización de memoria 5. Modos de direccionamiento 6. Juego de instrucciones 7. Directivas de ensamblador 2
1
22/05/12
Índice (ii) 8. Reloj del sistema 9. Circuito de Reset 10. Interrupciones 11. Puertos de E/S 12. Temporizadores 13. Herramientas de programación y simulación
3
Índice 1. Introducción 2. Descripción general 3. Arquitectura interna 4. Organización de memoria 5. Modos de direccionamiento 6. Juego de instrucciones 7. Directivas de ensamblador 4
2
22/05/12
Índice (ii) 8. Reloj del sistema 9. Circuito de Reset 10. Interrupciones 11. Puertos de E/S 12. Temporizadores 13. Herramientas de programación y simulación
3
Índice 1. Introducción 2. Descripción general 3. Arquitectura interna 4. Organización de memoria 5. Modos de direccionamiento 6. Juego de instrucciones 7. Directivas de ensamblador 4
2
22/05/12
¿Qué es un microcontrolador?
Es un chip (Circuito integrado C.I.) que contiene una CPU sencilla, unidad de reloj, memoria, y puertos de E/S (timers, I/ O ports, puertos de comunicaciones comunicaciones serie,..).
Arquitectura interna
La mayoría de los microcontroladores comerciales tienen arquitectura Harvard (Memoria de programa y memoria de datos separadas)
3
22/05/12
Principales familias de µcontroladores •
•
•
PICmicro
AVR
Freescale (franquicia de Motorola)
Aplicaciones µcontroladores
4
22/05/12
Aplicaciones µcontroladores
Aplicaciones µcontroladores
5
22/05/12
Índice 1. Introducción 2. Descripción general 3. Arquitectura interna 4. Organización de memoria 5. Modos de direccionamiento 6. Juego de instrucciones 7. Directivas de ensamblador 11
Familia AVR ATmega •
•
•
AVR ATmega es una familia de microcontroladores (MCU o µC) fabricado por Atmel AVR es una arquitectura de CPUs que integra ATMEL en algunos de sus microcontroladores
Un microcontrolador es una pequeña computadora empotrada en un C.I. que contiene: una CPU sencilla, unidad de reloj, memoria, y puertos de E/S (timers, IO ports, USARTs,..).
6
22/05/12
Familia AVR ATmega Descripción General •
Diversos periféricos
•
Encapsulados: PDIP, TQFP, MLF
•
PDIP TQFP Versiones bajo consumo: •
0-10 Mhz< @(2.7 -5.5V)
•
0-4 Mhz< @(1.8 -5.5V)
MLF
Familia AVR ATmega Dispositivos
ATmegaX8PA Dispositivos
ATmega48PA ATmega88PA ATmega168PA ATmega328P
Flash (Programa) 4K Bytes 8K Bytes 16K Bytes 32K Bytes
SRAM (datos) 256 Bytes 512 Bytes 512 Bytes 1K Bytes
EEPROM (datos) 512 Bytes 1K Bytes 1K Bytes 2K Bytes
Tamaño vector interrupción 1 instrucción 1 instrucción 2 instrucciones 2 instrucciones
7
22/05/12
ATmegaX8PA Carácterísticas CPU AVR • Arquitectura RISC. 8 bits • Frecuencia de reloj de hasta 20 Mhz @ (4.5-5.5V) • Hasta 20 Millones de instrucciones por segundo (MIPS) (para frecuencia de operación del reloj del sistema XTAL a 20Mhz) • Memoria de Programas: • Flash EEPROM X=4,8,16,32 Kb ATmegaX8pa
• Memoria de Datos: • Data SRAM 512/1K/2K bytes • Data EEPROM 256/512 bytes
Índice 1. Introducción 2. Descripción general 3. Arquitectura interna 4. Organización de memoria 5. Modos de direccionamiento 6. Juego de instrucciones 7. Directivas de ensamblador 16
8
22/05/12
Diagrama de bloques simplificado del microcontrolador ATmega
www.cursomicros.com
Arquitectura interna ATmegaX8PA
9
22/05/12
Arquitectura interna Memorias Generación de reloj CPU
Depuración Puertos E/S
Arquitectura interna •
AVR-CPU
•
Memorias (Flash, SRAM)
•
Generación de reloj
•
Depuración
•
Circuito de Reset
•
Puertos de E/S: Conv A/D, Analog Comp. Ports B,C,D USART, TWI, SPI Timers – – – –
10
22/05/12
Arquitectura interna CPU AVR •
•
Arquitectura Harvard Pipeline de 1 nivel: (Execute y pre-fetch simultáneos)
•
Bus de datos de 8 bits
•
Banco de 32 Registros
•
Arquitectura RISC Load/Store ALU con multiplicador –
•
Registros de propósito general (CPU AVR) •
Ocupan las 32 primeras posiciones de la memoria
•
Instrucciones con datos de direccionamiento inmediato sólo pueden usar los 16 superiores (R16 a R31) X, Y, Z: registros de 16 bits “punteros” para modos de direccionamiento indirecto
•
X Y Z
11
22/05/12
Registros X, Y, Z
• Se comportan como registros de 16 bits cuando se usan (direccionamientos indirectos)
Registro de estado (SR) -
Bit C (Carry) Bit Z (Zero) . Bit N (Negative). Bit V (oVerflow en Ca2) Bit S (Signo: S = N ⊕ V) Bit H (Half Carry) Bit T. Bit I (Interrupción).
12
22/05/12
Registro de estado (cont.) • •
Ubicado en el área de entrada/salida de la memoria de datos. Banderines (flags) que reflejan el resultado de la ejecución de algunas instrucciones (principalmente aritméticas, lógicas, etc.) - Bit C (Carry) - Bit Z (Zero) . Se pone a 1 para resultado cero, 0 en otro caso. - Bit N (Negative). Bit 7 del resultado.
Registro de estado (cont.) - Bit V (oVerflow en Ca2) Si A,B son operandos y R resultado, este bit se calcula como: l
l
V = A7 B7 R7' + A7' B7' R7 en suma V = A7 B7' R7' + A7' B7 R7 en resta
- Bit S (Signo) Refleja el signo correcto del resultado en operaciones en Ca2. l
S=N⊕V
13
22/05/12
Registro de estado (cont.) - Bit H (Half Carry) Bit de acarreo de la etapa 3 de la ALU (semiacarreo). - Bit T. Bit de propósito general, para instrucciones BLD y BST - Bit I (Interrupción). Para permitir (I=1) o deshabilitar (I=0) interrupciones
Puntero de Pila (Stack Pointer) • Se encuentra en la región de memoria asignada a E/S. • Apunta al área de pila (Valor inicial RAMEND, última dirección de la RAM). §
SP apunta a la primera posición libre de la pila
§
Las instrucciones de llamada a subrutina o de interrupción (RCALL, etc), almacenan la dirección de retorno en la pila, por lo que SP se decrementa en 2 unidades (la direcciones son de 16 bits)
§
Las instrucciones de retorno de subrutina (RET) o de interrupción (RETI), recuperan la dirección de 16 bits de la pila, por lo que
incrementan el SP en 2 unidades.
14
22/05/12
Puntero de Pila (Stack Pointer) 0
PUSH Ri
POP Ri
MEM(SP) ß Ri SPß SP+1 SP ß SP-1 Ri ß MEM(SP)
SPH
RAM
SPL
STACK POINTER
PILA
LIFO RAMEND
Índice 1. Introducción 2. Descripción general 3. Arquitectura interna 4. Organización de memoria 5. Modos de direccionamiento 6. Juego de instrucciones 7. Directivas de ensamblador 30
15
22/05/12
Organización de la memoria de Programa (Flash) 0x0000
Sección de Aplicación
0x0000
Sección de Aplicación 0x07FF
16 bits Atmega48PA 4Kbytes (2Kx16 bits FLASH)
Sección de arranque (Boot Loader)
0x0FFF/0x1FFF/0x3FFF
16 bits Atmega88PA, ATmega168PA, ATmega328PA 8Kbytes/16Kbytes/32Kbytes (4K/8K/16K x16 bits FLASH)
Organización del mapa de memoria de Datos
RAMEND
0x1FF/0x1FF/0x3FF 8 bits ATmega88PA, ATmega168PA, ATmega328PA 512bytes/512bytes/1Kbytes (4K/8K/16K x16 bits FLASH)
16
22/05/12
Organización del mapa de memoria de Datos •
•
32 Registros de propósito general con todos los modos de direccionamiento (inmediato sólo de R16 a R31, indexado sólo X,Y,Z) Registros de E/S - 64 I/O Registers (instrucciones IN, OUT, modo directo e indirecto) - 160 Ext Registers (modos directo e indirecto)
• SRAM (modos directo e indirecto)
Índice 1. Introducción 2. Descripción general 3. Arquitectura interna 4. Organización de memoria 5. Modos de direccionamiento: 5.1 Direccionamiento de la memoria de datos 5.2 Direccionamiento de la memoria de programa
34
17
22/05/12
5.1 Modos de direccionamiento de la memoria de Datos • Registro directo • Directo • Indirectos • • • •
Indirecto Indirecto con predecremento Indirecto con postincremento Indirecto con desplazamiento
• Inmediato
Direccionamiento de Registro Directo (memoria de Datos)
• La instrucción define el registro o registros cuyo
contenido se verá afectado por la propia instrucción. - Ejemplos: COM R4 MOV R1,R2
;Ej.CalculaelCa1deR4 COMR4;R4 ß$FF-R4
;Ej.TransfiereR2aR1 MOVR1,R2;R1ßR2
18
22/05/12
Direccionamiento de E/S Directo (memoria de Datos, zona E/S)
• La instrucción define el Puerto de E/S (0 a 64) y el Registro de propósito general afectados ( Sólo instrucciones IN y OUT ). - Ejemplos: IN R1, 56 ;
OUT 21, R10
;Ejemplos: INR1,56 ;R1 ßPORT56 OUT21,R10;PORT21 ßR10
Direccionamiento Directo (“ St raight”) (memoria de Datos)
•
La instrucción contiene la dirección de memoria (16bits) del operando , así como un campo de 5 bits (Rd/Rf) que identifica el registro destino o fuente.
• Instrucciones LDS, STS. 31 OP Rd o Rf
24 OP
Memoria de Datos 20
16
r rrrr 0000
Dirección del Dato
;Ejemplos: LDSR23,$1D0;R23ß($1D0) STS$1D2,R1;($1D2)ßR1
19
22/05/12
Direccionamiento Indirecto (memoria de Datos) •
La instrucción referencia al registro X,Y o Z que contiene la dirección del operando. ;Ejemplos: LDR1,X ;R1 ßMEMDAT(X) STZ,R10 ;MEMDAT(Z) ßR10
OJO: en el CS2010 la sintaxis era LD R1,(X) ST (Z),R10 En CS2010 se podía usar cualquier registro Aquí solo X, Y Z Los Registros X, Y Z actúan como “punteros” al dato en memoria
Direccionamiento Indirecto con postincremento (memoria de Datos) •
La instrucción referencia al registro X,Y o Z que contiene la dirección del operando, que después se incrementa en una unidad. ;Ejemplos: LDRO,X+;R0ßMEMDAT(X),XßX+1 STZ+,R1;MEMDAT(Z)ßR1,Z ßZ+1
Es muy útil para recorrer los datos de una tabla. Después de direccionar un dato, el puntero (X, Y ó Z) apunta al Dato siguiente de la tabla
20
22/05/12
Direccionamiento Indirecto con predecremento (memoria de Datos) •
La instrucción referencia al registro X,Y o Z que tras decrementarse en una unidad, contiene la dirección del operando. ;Ejemplos: LDRO,-X;XßX-1,R0ßMEMDAT(X), ST-Z,R1;ZßZ-1,MEMDAT(Z)ßR1
Es muy útil para recorrer los datos de una tabla en orden inverso. Antes de direccionar un dato, el puntero (X, Y ó Z) se decrementa
Direccionamiento Indirecto con desplazamiento (memoria de Datos) •
La dirección del dato se obtiene sumando el desplazamiento q (5 bits: 0
;R0 ßMEMDAT(Y+10) ;MEMDAT(Z+9) ßR1
21
22/05/12
Direccionamiento Inmediato (memoria de Datos) •
El operando es suministrado en la propia instrucción •
En modo inmediato sólo pueden usarse
del R16 al R31 ;Ejemplos: LDIR16,255 ;R16 ß255 ANDIR25,0X10;R25 ßR25&0x10
Índice 1. Introducción 2. Descripción general 3. Arquitectura interna 4. Organización de memoria 5. Modos de direccionamiento: 5.1 Direccionamiento de la memoria de datos
5.2. Direccionamiento de la memoria de programa
44
22
22/05/12
5.2 Modos de Direccionamiento para la memoria de programa
• Constantes de programa (fuera del alcance de esta asignatura).
• •
Indirecto Indirecto con postincremento
• Instrucciones • Directo • Indirecto • Relativo
Direccionamiento Directo de Instrucciones (memoria de programa)
•
El programa continua su ejecución en la dirección de memoria de programa indicada en la instrucción
•
Instrucciones: JMP y CALL
;Saltoaladirección0x3F0: JMP0x3F0;PCß0x3F0
;Llamadaalasubrutina ;almacenadaen0x500 ;retornaconunRET CALL0x500
23
22/05/12
Direccionamiento Indirecto de Instrucciones (memoria de programa)
•
El programa continua su ejecución en la dirección de memoria almacenada en el Registro Z
•
Instrucciones: IJMP y ICALL
;Saltoaladirección ;almacenadaenReg.Z IJMP;PC ßZ
;Llamadaalasubrutina ;almacenadaenReg.Z ;retornaconunRET ICALL
Direccionamiento Relativo de Instrucciones (memoria de programa)
•
El programa continua su ejecución en la dirección de memoria PC PC+K+1 (k Є [-2048, 2047]
•
Instrucciones:
RJMP (Relative Jump) RCALL (Relative Call) BRXX (Branch if condition XX)
24
22/05/12
Índice 1. Introducción 2. Descripción general 3. Arquitectura interna 4. Organización de memoria 5. Modos de direccionamiento 6. Juego de instrucciones 7. Directivas de ensamblador 49
6. Juego de Instrucciones • •
•
• •
Instrucciones de transferencia de datos Instrucciones aritmético-lógicas Instrucciones de salto Instrucciones de manejo de bits Instrucciones de control del sistema
25
22/05/12
Juego de Instrucciones AVR •
Instrucciones sin operandos –
•
Instrucciones con un operando –
•
Mnemónico opfuente/opdestino
Instrucciones con dos operandos –
•
Mnemónico
Mnemónico opdestino,opfuente
Para cada instrucción se presentará la siguiente información Mnemónico
Operandos Descripción Rango
Operación
Banderines Ciclos de reloj
Instrucciones de Transferencia de Datos MOV
Rd,Rr Rd,Rr Rd,k
Copiar registro Copiar registro W Cargar dato inmediato
LDS
Rd,k
LD
Rd,X Rd,X+ Rd,-X Rd,Y Rd,Y+ Rd,-Y Rd,Z Rd,Z+ Rd,-Z Rd,Y+q Rd,Z+q
Cargar dato desde la memoria Carga el registro con un dato indirecto
MOVW LDI
LDD
Carga el registro con un dato indirecto con desplazamiento
d,r ∈[0,31] d,r ∈[0,30] d∈ [16,31] k ∈ [0,255] d∈ [0,31] k<64K d∈ [0,31]
d∈ [0,31] q∈ [0,63]
RdßRr Rd+1:Rd ßRr+1:Rr Rdß k
Ninguno Ninguno Ninguno
Rdß (k)
Ninguno
Rdß (X) Rdß (X);X ßX+1 XßX-1-,Rdß (X) Rdß (Y) Rdß (Y);Y ßY+1 YßY-1;Rd ß (Y) Rdß (Z) Rdß (Z);Z ßZ+1 ZßZ-1;Rd ß (Z) Rdß (Y+q) Rdß (Z+q)
Ninguno
1 1 1 2
2 Ninguno 2
26
22/05/12
Instrucciones de Transferencia de Datos (ii) STS
K, Rr
ST
X,Rr X+,Rr -X,Rr Y,Rr Y+,Rr -Y,Rr Z,Rr Z+,Rr -Z,Rr Y+q,Rr Z+q,Rr
STD
LPM
Rd,Z Rd,Z+ SPM
Almacenar dato en memoria Almacenar registro en memoria
r ∈[0,31] K ∈[0,64k] r ∈[0,31]
Almacenar registro en memoria con indirecto con desplazamiento Carga memoria de programa
r ∈[0,31]
(K)ß Rr
Ninguno
(X)ß Rr (X)ß Rr;X ßX+1 XßX-1-, (X) ßRr (Y)ßRr (Y)ß Rr;Y ßY+1 YßY-1; (Y) ß Rr (Z)ß Rr (Z)ßRr;Z ßZ+1 ZßZ-1; (Z) ßRr (Y+q) ß Rr (Z+q) ß Rr
Ninguno
R0ß (Z) Rdß (Z) Rdß (Z); Z ßZ+1 (Z) ß R1:R0
Ninguno
2
2 Ninguno 2
Almacenar en memoria de programa
3 Ninguno
-
Instrucciones de Transferencia de Datos (iii) IN
Rd,P
Entrada del puerto
OUT
P,Rr
Salida hacia el puerto
PUSH
Rr Rd
Empujar en pila Sacar de pila
POP
d∈[0,31] P∈ [0,63] r ∈[0,31] P∈ [0,63] r ∈[0,31] d∈[0,31]
RdßP
Ninguno
Pß Rr
Ninguno
STACK ßRr Rdß STACK
Ninguno Ninguno
1 1 2 2
27
22/05/12
Instrucciones de Transferencia de Datos MOV R1,R2 IN R1,$10
32 registros (R0:R31)
$00
OUT 12,R3
64 registros E/S 160 registros E/S
LD R1,Z LDD R30,Y+2 LDS R23,$10
SRAM
ST Z,R1 STD Y+1,R30 STS $DE,R4 RAMEND
Instrucciones de Transferencia de Datos Puerto E/S INRd,P
IN
OUTP,Rf
OUT Registro Rd LDR1,X LDDR1,Y+2 LDSRd,dir
LoaD
MOVRd,Rf
MOVe SRAM
Registro Rf STX,Rf STDY+d,Rf STSdir,Rf
STore
28
22/05/12
Instrucciones Aritmético-Lógicas ADD ADC ADIW
SUB SUBI
Rd,Rr Rd,Rr Rd,K Rd,Rr Rd,K
SBCI
Rd,Rr Rd,K
SBIW
Rd,K
AND
Rd,Rr Rd,K
SBC
ANDI
OR ORI
EOR COM NEG INC DEC
Rd,Rr Rd,K Rd,Rr Rd Rd Rd Rd
Suma sin carry Suma con carry Suma inmediato con palabra Resta sin carry Resta inmediato Resta con carry Resta inmediato con carry Resta inmediato con palabra And lógica And lógica con dato inmediato Or lógica Or lógica con dato inmediato Exclusive or C omp le me nto a 1 C omp le me nto a 2 Incre me nta Decreme nta
d,r ∈[0,31] d,r ∈[0,31] d∈[24,26,28,30] K ∈[0,63] d,r ∈[0,31] d∈[16,31] K ∈[0,255] d,r ∈[0,31] d∈[16,31] K ∈[0,255] d∈[24,26,28,30] K ∈[0,63] d,r ∈[0,31] d∈[16,31] K ∈[0,255] d,r ∈[0,31] d∈[16,31] K ∈[0,255] d,r ∈[0,31] d,r ∈[0,31] d,r ∈[0,31] d,r ∈[0,31] d,r ∈[0,31]
Rdß Rd+Rr Rdß Rd+Rr+C Rd+1:Rd ß Rd+1:Rd + K
Z,N,V,C,H Z,N,V,C,H Z,N,V,C
RdßRd-Rr RdßRd-K
Z,N,V,C,H Z,N,V,C,H
RdßRd-Rr-C RdßRd-K-C
Z,N,V,C,H Z,N,V,C,H
Rd+1:Rd ß Rd+1:Rd - K
Z,N,V,C
RdßRdΛRr RdßRdΛK
Z,N,V Z,N,V
RdßRd∨Rr RdßRd∨K
Z,N,V Z,N,V
RdßRd⊕Rr Rdß$FF-Rd Rdß$00-Rd RdßRd+1 RdßRd-1
Z,N,V Z,N,V,C Z,N,V,C Z,N,V Z,N,V
1 1 2 1 1 1 1 2 1 1 1 1 1 1 1 1 1
Instrucciones Aritmético-Lógicas (ii) CLR SER CP CPC CPI MUL MULS MULSU
Rd Rd Rd,Rr Rd,Rr Rd ,K
Poner a cero Poner todo a 1 Compara Compara con carry C omp ara in me dia to
Rd,Rr Rd,Rr Rd,Rr
Multiplica sin signo Multiplica con signo Multiplica signo con sin signo
d,r ∈[0,31] d,r ∈[0,31] d,r ∈[0,31] d,r ∈[0,31] d∈[16,31] K ∈[0,255] d,r ∈[0,31] d,r ∈[0,31] d,r ∈[0,31]
Rdß0 Rdß$FF Rd-Rr Rd-Rr-C Rd-K
Z,N,V Z,N,V Z,N,V,C,H Z,N,V,C,H Z,N,V,C,H
R1:R0 ßRd x Rr R1:R0 ßRd x Rr R1:R0 ßRd x Rr (Rd signed Rr unsigned)
Z,C Z,C Z,C
1 1 1 1 1 2 2 2
29
22/05/12
Instrucciones de salto Permiten saltara una instrucción en otra zona de memoria de código (en lugar de ejecutar la siguiente instrucción) 4 tipos de instrucciones de salto
JUMP: salto incondicional BRANCH : salto “corto” si se cumple una condición SKIP : “sáltate” (esquiva) la siguiente instrucción si se cumple la condición CALL/RET: llamada/retorno de subrutina
Salto incondicional directo JMPdir El programa sigue ejecutándose a partir de la dirección suministrada en la propia instrucción
PC
dir
;Ejemplodesaltoincondicionaldirecto ;ponemosunaetiquetayelensambladorcalcula ;ladireccióndelsalto mov r1,r0
jmp farplc
;saltoincondicional
. . . . farplc: nop
30
22/05/12
Salto incondicional relativo RJMPk La dirección de salto se obtiene sumando una constante con signo (k) al PC
PC
PC+k+1
-63
;Ejemplodesaltoincondicionalrelativo ;ponemosunaetiquetayelensambladorcalcula ;laconstantek ;permitesaltos“cortos”de+/-2K mov r1,r0
rjmpok
;saltoincondicionalrelativo
. . . . ok:
nop
Salto incondicional indirecto IJMP La dirección de salto está en el registro Z
PC
Z
(esto es: PC
r31:r30)
;Ejemplodesaltoincondicionalindirecto ; .... ldi r30,0
;partebajadeladir.desalto
ldi r31,$8
;partealtadeladir.desalto
ijmp
;salto a la dirección $800
....
31
22/05/12
Salto condicional relativo BRxxk Si se cumple una condición xx, la dirección de salto se obtiene sumando una constante con signo (k) al PC PC+k+1 PC: La condición de salto xx comprueba el valor de determinados bits del STATUS REGISTER Ejemplos:
BREQ: Branch if EQual (Z=1) BRNE: Branch if Not Equal (Z=0) BRCS: Branch if Carry Set (CY=1) BRCC: Branch if Carry Clear (CY=0) BRSH: Branch if Same or Higher (CY=0)
Ejemplo de salto condicional relativo BRNEBranchifNotEqual(Z=0) Si Z = 0 entonces PC ßPC+k+1 en otro caso PC ß PC+1
-63
;Ejemplodesaltocondicionalrelativo ;pararealizarunbucle eor r27,r27
; borra r27 con una exor
buclue: ... . . . inc r27
; incrementa r27
cpi r27,5
; compara r27 con 5
brnebucle
;saltasir27<>5
nop
32
22/05/12
SKIP condicional SBxxRr,b Esquiva la siguiente instrucción si el bit de un registro cumple una condición Ejemplos:
SBRC: Skip if Bit in Register is Clear SBRS: Skip if Bit in Register is Set SBIC: Skip if Bit in I/O Port is Clear SBIS: Skip if Bit in I/O Port is Set
Ejemplo SKIP condicional SBRCRr,b . . . sub r0,r1
; r0
ßr0-r1
sbrcr0,7;esquivasielbit7der0estáa0 subr0,r1;sóloseejecutasielbit7der0estáa1 nop
33
22/05/12
Llamada a subrutina directo CALLdir(LongCalltoSubrutine) Llama a una subrutina almacenada en cualquier posición de la memoria de programa.
PC
dir
La dirección de retorno se guarda en la pila
PILA PC+2 SP SP-2 (2bytes) La subrutina debe terminar con una instrucción RET
Ejemplo de llamada a subrutina directo CALLdir(LongCalltoSubrutine) . . . mov r16,r0
callcheck;llamadaasubrutinacheck nop
; continua
. . . ;nosotrosponemoslaetiquetacheckyelensamblador ;calculaladirección check:
cpir16,$42 breq error
ret . . . Error:
rjmp error
;bluque infinito
34
22/05/12
Llamada a subrutina relativo RCALLk(RelativeCalltoSubrutine) Llamada a una subrutina ubicada en una posición relativa a la dirección de esa instrucción
PC
PC+k+1
-2047 < k < +2048
La dirección de retorno se guarda en la pila
PILA PC+1 SP SP-2 (2bytes) La subrutina debe terminar con una instrucción RET
Ejemplo de llamada a subrutina relativo RCALLk(RelativeCalltoSubrutine) . . .
rcall routine ;llamadaasubrutinaroutine . . . ;nosotrosponemoslaetiqueta“routine”yelensamblador ;calculaladirección routine:pushr14 ;salvar14enlapila ... pop r14
;restaura r14
ret . . .
35
22/05/12
Resumen de Instrucciones de salto RJMP JMP (1) IJMP RCALL
Etiqueta Etiqueta
CALL
Et iq ueta
(1)
Etiqueta
ICALL RET RETI CPSE
Rd,Rr
SBRC
Rr,b
SBRS
Rr,b
Salto relativo Salto Salto indirecto Llamada a subrutina relativa L la mad a a subrut in a Llamada a subrutina indirecta Regreso de subrutina Regreso de interrup. Compara, esquiva si iguales Esquiva si el bit está a cero Esquiva si el bit está a uno
-2k< Etiqueta <2k 0
d,r ∈[0,31] r ∈[0,31] b∈[0,7] r ∈[0,31] b∈[0,7]
PCßPC+ Etiqueta +1 PCß Etiqueta PC ß (Z) STACK ß PC PCßPC+ Etiqueta +1 STAC K ß PC PCß Etiqueta STACK ß PC PC ß (Z) PCß STACK PCß STACK Si Rd=Rr PC ß PC+2 (ó 3) Si (Rd(b)=0) PCß PC+2 (ó 3) Si (Rd(b)=1) PCß PC+2 (ó 3)
Ninguno Ninguno Ninguno Ninguno
2 2 3 3
Ninguno 3 Ninguno 4 4 4
Ninguno I Ninguno
01/02/03 Ninguno 01/02/03 Ninguno 01/02/03
(1) Sólo disponibles para ATMEGA168PA y ATMEGA328PA
Instrucciones de salto (ii)
BREQ
Esquiva si el bit del puerto está a 0 P,b Esquiva si el bit del puerto está a1 Etiq ueta Salta si iguales
P∈[0,31] b∈[0,7] P∈[0,31] b∈[0,7] Etiqueta ∈[-64,63]
BRNE
Etiqueta Salta si distintos
Etiqueta
∈[-64,63]
BRCS
Etiq ueta Salta si C está a 1
Etiqueta
∈[-64,63]
BRCC
Etiq ueta Salta si Cestá a 0
Etiqueta
∈[-64,63]
BRSH
Etiqueta Salta si igual o mayor
Etiqueta
∈[-64,63]
SBIC SBIS
P,b
Si (I/o(P,b)=0) PCß PC+2 (ó 3) Si (I/O(P,b)=1) PCß PC+2 (ó 3) Si (Z=1) PCß PC+ Etiqueta +1 Si (Z=0) PCß PC+ Etiqueta +1 Si (C=1) PCß PC+ Etiqueta +1 Si (C=0) PCß PC+ Etiqueta +1 Si (C=1) PCß PC+ Etiqueta +1
Ninguno
Ninguno
1o2o 3 1o2o 3 1o2
Ninguno
1o2
Ninguno
1o2
Ninguno
1o2
Ninguno
1o2
Ninguno
36
22/05/12
Instrucciones de salto (iii) BRLO
Etiqueta Salta si menor
Etiqueta
∈ [-64,63]
BRMI
Etiqueta Salta si negativo
Etiqueta
∈ [-64,63]
BRPL
Etiqueta Salta si positivo
Etiqueta
∈ [-64,63]
BRHS
Etiqueta Salta si H está a 1
Etiqueta
∈ [-64,63]
BRHC
Etiqueta Salta si H está a 0
Etiqueta
∈ [-64,63]
BRTS
Etiqueta Salta si T está a 1
Etiqueta
∈ [-64,63]
BRTC
Etiqueta Salta si T está a 0
Etiqueta
∈ [-64,63]
BRVS
Etiqueta Salta si V está a 1
Etiqueta
∈ [-64,63]
BRVC
Etiqueta Salta si V está a 0
Etiqueta
∈ [-64,63]
BRIE
Etiqueta Salta si I está a 1
Etiqueta
∈ [-64,63]
BRID
Etiqueta Salta si I está a 0
Etiqueta
∈ [-64,63]
Si (C=0) PCß PC+ Etiqueta +1 Si (N=1) PCß PC+ Etiqueta +1 Si (N=0) PCß PC+ Etiqueta +1 Si (H=1) PCß PC+ Etiqueta +1 Si (H=0) PCß PC+ Etiqueta +1 Si (T=1) PCß PC+ Etiqueta +1 Si (T=0) PCß PC+ Etiqueta +1 Si (V=1) PCß PC+ Etiqueta +1 Si (V=0) PCß PC+ Etiqueta +1 Si (I=1) PCß PC+ Etiqueta +1 Si (I=0) PCß PC+ Etiqueta +1
Ninguno
1o2
Ninguno
1o2
Ninguno
1o2
Ninguno
1o2
Ninguno
1o2
Ninguno
1o2
Ninguno
1o2
Ninguno
1o2
Ninguno
1o2
Ninguno
1o2
Ninguno
1o2
Instrucciones de salto (iv) BRGE BRLT
Etiqueta Salta si mayor o igual, (signo) Etiqueta Salta si menor (signo)
Test (CP Rd,Rr) Rd ≥Rr Rd < Rr Rd = Rr Rd ≠ Rr Rd ≥ Rr Rd < Rr Carry Sin carry Negativo Positivo Overflow Sin overflow Cero No cero
Etiqueta ∈[- 64,63] Etiqueta ∈[- 64,63]
Booleana (N ⊕ V) = 0 (N ⊕ V) = 1 Z=1 Z= 0 C=0 C=1 C=1 C=0 N=1 N=0 V=1 V=0 Z=1 Z=0
Si (N⊕V=0) PCß PC+ Etiqueta +1 Si (N⊕V=1) PCß PC+ Etiqueta +1
Mnemonico BRGE BRLT BREQ BRNE BRCC/ BRSH BRCS/BRLO BRCS BRCC BRMI BRPL BRVS BRVC BREQ BRNE
Ninguno
1o2
Ninguno
1o2
Comentario Signo Signo Signo/Sin signo Signo/Sin signo Sin signo Sin signo Simple Simple Simple Simple Simple Simple Simple Simple
37
22/05/12
Instrucciones de bit y bit-test LSL
Rd
d∈ [0,31]
Rd
Desplazamiento a la izquierda Desplazamiento a la derecha Rotació n a la izq uie rda
LSR
Rd
ROL ROR
Rd
Rotació n a la derecha
d∈ [0,31]
ASR
Rd
Desplazamiento aritmético a la derecha
d∈ [0,31]
Rd(n+1) ßRd(n), Rd(0) ß0, Cß Rd(7) Rd(n) ßRd(n+1), Rd(7) ß0, Cß Rd(0) Rd(n+1) ßRd(n), Rd(0) ßC, C ß Rd(7) Rd(n) ßRd(n+1), Rd(7) ßC, C ß Rd(0) Rd(n) ßRd(n+1), Rd(7) ßRd(7), Cß Rd(0)
d∈ [0,31] d∈ [0,31]
0
Rn
C
LSR
C
Rn
0
LSL
Rn
C
ASR
7
Z,C,N,V,H 1 Z,C,N,V 1 Z,C,N,V,H 1 Z,C,N,V, 1 Z,C,N,V,
C
Rn
ROR
ROL
Rn
C
1
Instrucciones de bit y bit-test
SBI
Rd P, b
Intercamb ia n ibb les P one r a 1 e l bit b d el p ue rto IO
CBI
P, b
P one r a 0 e l bit b d el p ue rto IO
SWAP
SEcc 1
CLcc 1
Poner a 1 el bit cc del registro de estado Poner a o el bit cc del registro de estado
d∈ [0,31] b∈ [0,7] P∈ [0,31] b∈ [0,7] P∈ [0,31]
Rd(3..0) ßàRd(7.4) IO(P,b) ß1
Ninguno Ninguno
IO(P,b) ß0
Ninguno
1 2 2
cc 1 cc 1
cc= C,N,T,Z,I,V,H,S
38
22/05/12
Instrucciones de control
NOP BREAK WDR SLEEP
Nada Para depuración Reinica el temporizador del perro guardián Dormir
Ninguno Ninguno Ninguno Ninguno
1 N/A 1 1
Índice 1. Introducción 2. Descripción general 3. Arquitectura interna 4. Organización de memoria 5. Modos de direccionamiento 6. Juego de instrucciones 7. Directivas de ensamblador 78
39
22/05/12
AVR Studio •
•
Es una herramienta de desarrollo que suministra el fabricante ATMEL para desarrollar aplicaciones con sus microcontroladores ATmega. Entre otras herramientas, incluye: •
•
•
Ensamblador: para genera código objeto (máquina) a partir de un programa fuente escrito en lenguaje ensamblador Simulador: permite simular la ejecución del programa, para depurar su funcionamiento Programador AVR, para volcar el código generado en la memoria de programa del microcontrolador
Estructura de un programa en ensamblador CABECERA
Común a todo el programa
SEGMENTO DE CÓDIGO (FLASH) SEGMENTO DE DATOS (SRAM)
Generan código específico para cada uno de los tres tipos de memoria
SEGMENTO EEPROM
Directivas: son comandos de control de la herramienta que genera el código fuente (programa ensamblador) - No generan código objeto (código máquina) - pero sí influyen en cómo se genera ese código
40
22/05/12
;EJEMPLOdeficherofuentecondirectivas ;CABECERA .INCLUDE“m328pdef.inc” ;incluyeunficheroexternoyensambla ;su contenido con el fichero fuente .DEFcontador=r16;lavariablecontadorseráelre gistror16 .EQU numdatos=9 ;defineunsímboloyestablecesuvalor
;SEGMENTODECÓDIGO .CSEG ;comienzaelsegmentodecódigo(FLASH) .ORG0x10 ;estableceladireccióndelCSEGdondeseensamblará ;el código main:ldicontador,0 nop rjmpmain
;SEGMENTODEDATOS .DSEG ;comienzaelsegmentodeDATOS(SRAM) .ORG0x0100;estableceladireccióninicialdelDSEGdondese ;almacenarán las variables suma:.BYTE2 ;reserva2bytesparalavariablesuma tabla:.BYTE10 ;reserva10bytesparalavariabletabla
Principales directivas de la cabecera •
Afectan a todos los segmentos del código generado .INCLUDE – incluye un fichero externo en el código fuente
Ejemplo:
.INCLUDE “m328pdef.inc”
.DEF – Asigna un nombre simbólico a un registro.
Sintaxis: .DEF symbol=register .DEFtemp=r16 .DEFior=r0
.EQU – Define un símbolo y establece su valor
Sintaxis: .EQU label = expression .EQU puertas=2
41
22/05/12
Principales directivas del segmento de código .CSEG – indica que empieza el segmento de código
.CSEG .ORG – indica la dirección del segmento de código (FLASH) donde se ubicará el código generado
.ORG 0x02B
;el código generado comienza en $2B
.DB – Inserta una o más constantes de tamaño byte en el segmento de código
tablafija:
.DB13,5,9,4 ;tablade4bytes
mensaje:
.DB “error”
;tablade5caracteresASCII
.DW –inserta una tabla de datos tamaño “word” (2 bytes) en el segmento de código
datos: .DW1930,25000,987,33879;tablade4words
Principales directivas del segmento de datos .DSEG – indica que empieza el segmento de datos (SRAM)
.DSEG .ORG – indica la dirección del segmento datos (SRAM) donde se ubicará las variables declaradas
.ORG $0100
;el código generado comienza en $0100 ;si no se especifica, comienza en $60
.BYTE – Reserva espacio en el segmento de datos para almacenar variables
variable1: .BYTE 1 temp: .BYTE 1 suma: .BYTE 2
;reserva 1 byte para la variable “variable1” ;reserva 1 byte para la variable “temp” ;reserva 2 bytes para la variable “suma”
42