Académique Documents
Professionnel Documents
Culture Documents
AVR es el primer diseño de CPU de ATMEL, una compañía más conocida por sus
productos de memoria "flash" y EEPROM. La firma también produce y vende varios
subproductos de la popular familia 8051, con la diferencia que estos están basados en
"flash". La tabla que se presenta a continuación resume las características más
importantes de algunos modelos que pueden ser adquiridos en el mercado local:
Los AVR cuentan con un amplio conjunto de instrucciones y con 32 registros de trabajo
de propósito general. Los 32 registros se conectan directamente a la Unidad Aritmético-
Lógica (ALU), permitiendo acceder a dos registros independientes con una instrucción
ejecutada en un ciclo de reloj. La arquitectura resultante trabaja con un código más
eficaz, logrando capacidades de procesamiento diez veces más rápidas que los
microcontroladores CISC convencionales.
1
Diagrama a bloques del AT90S8535
2
El espacio de memoria I/O contiene
64 direcciones para la configuración
de funciones periféricas de la CPU
como los registros de control,
Temporizadores / Contadores,
convertidores A/D y otras funciones.
Los registros de I/O deben ser
accedidos con su dirección del
espacio I/O –no considerando su
dirección absoluta-. A estos registros
de propósito específico ATMEL
también los llama Puertos (Ports).
Con las instrucciones de salto relativo (relative jump) y llamada a subrutina (call), se
accede directamente a cualquier dirección de la memoria de programa. La mayoría de
las instrucciones de los AVR tiene el formato de palabra (word) de 16-bit. Cada
dirección de memoria de programa contiene una instrucción de 16 o 32 bit.
3
CONJUNTO DE INSTRUCCIONES
En este apartado se comentan las instrucciones de ensamblador que poseen los µC AVR
de 8-BIT. Se explica la función de cada una de ellas, su sintaxis, operandos utilizados y
una descripción con ejemplos.
Los Mnemónicos son las instrucciones en lenguaje ensamblador que puede reconocer el
microprocesador. Dependiendo de la instrucción, puede haber uno o dos operandos,
incluso pueden no existir; su contenido consiste en un número, una variable o una
dirección; normalmente el resultado de una operación lógica, aritmética o de carga es
almacenado en operando1.
Registros y operandos
Rd Registro destino (y fuente) del bloque de registros de trabajo
Rr Registro fuente del bloque de registros de trabajo
R Resultado después de que una instrucción es ejecutada
K Dato inmediato (constante)
k Dirección de memoria
b Bit de un registro I/O (7-0)
s Bit en el registro de estado (SREG)
X,Y,Z Registros de direccionamiento indirecto o registros de palabra (X=R27:R26
Y=R29:R28 Z=R31:R30)
P Registros del bloque I/O
q Desplazamiento (6-bit) por direccionamiento directo
4
Banderas del registros de estado (SREG)
C: Bandera de acarreo S: N⊕V para pruebas de signo
Z: Bandera de resultado cero H: Bandera de medio acarreo
N: Bandera de resultado negativo T: Bit transferido por la instrucción BLD
o BST
V: Indicador de complemento a dos I: Bandera de interrupciones globales
desbordado
5
EICALL Ninguno Llamada indirecta a subrutina extendida
CALL k Llamada a subrutina
RET Ninguno Regreso de subrutina
RETI Ninguno Regreso de interrupción
CPSE Rd,Rr Compare y salta si es igual
CP Rd,Rr Compara
CPC Rd,Rr Compara con acarreo
CPI Rd,K Compara con inmediato
SBRC Rr,b Salta si el bit del registro es cero
SBRS Rr,b Salta si el bit del registro es uno
SBIC P,b Salta si el bit del registro I/O es cero
SBIS P,b Salta si el bit del registro I/O es uno
BRBC s,k Salta si el bit de SREG es cero
BRBS s,k Salta si el bit de SREG es uno
BREQ k Salta si es igual
BRNE k Salta si es diferente
BRCS k Salta si C está a uno
BRCC k Salta si C está a cero
BRSH k Salta si es mayor o igual
BRLO k Salta si es menor
BRMI k Salta si es negativo
BRPL k Salta si es mayor
BRGE k Salta si es mayor o igual (con signo)
BRLT k Salta si es menor (con signo)
BRHS k Salta si H está a uno
BRHC k Salta si H está a cero
BRTS k Salta si T está a uno
BRTC k Salta si T está a cero
BRVS k Salta si V esta a uno
BRVC k Salta si V está a cero
BRIE k Salta si I está a uno
BRID k Salta si I está a cero
6
ST X,Rr Almacena indirectamente
ST X+,Rr Almacena indirectamente con Post-Incremento
ST -X,Rr Almacena indirectamente con Pre-Decremento
ST Y,Rr Almacena indirectamente
ST Y+,Rr Almacena indirectamente con Post-Incremento
ST -Y,Rr Almacena indirectamente con Pre-Decremento
ST Y+q,Rr Almacena indirectamente con desplazamiento
ST Z,Rr Almacena indirectamente
ST Z+,Rr Almacena indirectamente con Post-Incremento
ST -Z,Rr Almacena indirectamente con Pre-Decremento
ST Z+q,Rr Almacena indirectamente con desplazamiento
LPM Ninguno Carga memoria de programa
SPM Ninguno Almacena memoria de programa
IN Rd,P Cargar un registro con un I/O
OUT P,Rr Cargar un I/O con un registro
PUSH Rr Cargar registro en la pila
POP Rd Sacar dato de la pila
7
ADC Suma de dos registros con acarreo ADD Suma de dos registros sin acarreo
Sintaxis: ADC Rd, Rr Sintaxis: ADD Rd, Rr
Operación: Rd ← Rd + Rr + C Operación: Rd ← Rd + Rr
Descripción: Suma dos registros y el contenido de la bandera C; Descripción: Suma dos registros sin considerar la bandera C y
deja el resultado en el registro destino Rd. deja el resultado en el registro destino Rd.
H: Se activa si hay un acarreo del bit 3, de lo contrario se H: Se activa si hay un acarreo del bit 3, de lo contrario se
borrará. borrará.
V: Se activa si ocurre un desbordamiento del complemento a dos V: Se activa si ocurre un desbordamiento del complemento a dos
como resultado de la operación, de lo contrario se borrará. como resultado de la operación, de lo contrario se borrará.
N: Se activa si el bit MSB del resultado está a uno, de lo N: Se activa si el bit MSB del resultado está a uno, de lo
contrario se borrará. contrario se borrará.
Z: Se activa si el resultado es $00, de lo contrario se borrará. Z: Se activa si el resultado es $00, de lo contrario se borrará.
C: Se activa si hay acarreo del bit MSB del resultado, de lo C: Se activa si hay acarreo del bit MSB del resultado, de lo
contrario se borrará. contrario se borrará.
Ejemplo: Ejemplo:
ADIW Suma un dato inmediato a un registro de AND Función lógica AND entre registros
palabra
Sintaxis: AND Rd, Rr
Sintaxis: ADIW Rd+1:Rd,K
Operación: Rd ← Rd (AND) Rr
Operación: Rd +1: Rd ← Rd+1: Rd + K
Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31
Operandos:
Operando1: Puede ser uno de los 3 registros de 16 bits. Podemos Descripción: Se realiza el AND lógico entre el contenido del
indicarlo de las siguientes maneras: XH:XL o sólo a XL; YH:YL registro Rd y del registro Rr; deja el resultado en el registro
o sólo a YL; ZH:ZL o sólo es a ZL. También podemos utilizar destino Rd.
R27:R26 o sólo a R26; R29:R28 o sólo a R28; R31:R30 o sólo a
R30. También podemos usar el registro de 16 bits compuesto por Banderas afectadas:
R25:R24 al que también podemos indicar como R24.
V: Se pone a cero.
Operando2: 0≤ K ≤ 63 N: Se activa si el bit MSB del resultado está a uno, de lo
contrario se borrará.
Descripción: Agrega un valor K a un par de registros y deja el Z: Se activa si el resultado es $00, de lo contrario se borrará.
resultado en el par de registros
Ejemplo:
Banderas afectadas:
AND r2, r3 ; AND lógico entre r2 y r3, resultado en r2
S: Se activa sólo si una de las banderas V o N está a uno. LDI r16, 1 ; Poner 0000 0001 en r16
V: Se activa si hay desbordamiento en el complemento a dos de AND r2, r16 ; Aislar el bit 0 en r2
la operación.
N: Se activa si el bit MSB está a uno.
Z: Se activa si el resultado es 0x00.
C: Se activa si hay acarreo del bit MSB.
Ejemplo:
8
ANDI Función lógica AND entre un registro y ASR Desplazamiento aritmético a la derecha
un dato inmediato
Sintaxis: ASR Rd
Sintaxis: AND Rd, K
Operación:
Operación: Rd ← Rd (AND) K
Operandos: 0 ≤ d ≤ 31
Operandos: 0 ≤ d ≤ 31, 0 ≤ K ≤ 255
Descripción: Desplaza todos los bits de Rd una posición hacia la
Descripción: Se realiza el AND lógico entre el contenido del derecha. El bit 7 se mantiene constante. El bit 0 se carga dentro
registro Rd y el valor K; deja el resultado en el registro destino de la bandera C. Esta operación divide entre dos un valor con
Rd. signo sin cambiar su signo. La bandera C puede usarse para
redondear el resultado.
Banderas afectadas:
Banderas afectadas:
V: Se pone a cero.
N: Se activa si el bit MSB del resultado está a uno, de lo S: N ⊕ C, para prueba de signo
contrario se borrará. V: N ⊕ C (para N y C después del desplazamiento)
Z: Se activa si el resultado es $00, de lo contrario se borrará. N: Se pone a uno si el MSB de Rd esta a uno.
Z: Se activa si el resultado es $00, de lo contrario se borrará.
Ejemplo: C: Se activa antes del desplazamiento el LSB de Rd estaba a
uno.
ANDI r17, $0F ; Borrar el nibble alto de r17
ANDI r18, $10 ; Aislar el bit 4 en r18 Ejemplo:
ANDI r19, $AA ; Borrar los bits impares de r19
LDI r16, $10 ; Cargar 16 decimal en r16
ASR r16 ; r16 = r16 / 2
LDI r17, $FC ; Cargar -4 en r17
ASR r17 ; r17 = r17 / 2
BCLR Poner a cero el bit de una bandera BLD Carga en un registro la bandera T
Sintaxis: BCLR s Sintaxis: BLD Rd, b
Descripción: Pone a cero un bit específico del registro de Descripción: Carga la bandera T del registro SREG en el bit b
banderas SREG. del registro Rd.
Ejemplo:
9
BRBC Brinca si el bit de SREG es cero BRBS Brinca si el bit de SREG está a set (uno)
Sintaxis: BRBC s, k Sintaxis: BRBS s, k
Descripción: Examina un bit del registro SREG y realiza un Descripción: Examina un bit del registro SREG y realiza un
salto relativo en el PC (contador de programa) si el bit está a salto relativo en el PC (contador de programa) si el bit está a uno
cero. La instrucción desvía relativamente al PC en cualquier . La instrucción desvía relativamente al PC en cualquier
dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el
offset de PC y es representado en forma de complemento a dos. offset de PC y es representado en forma de complemento a dos.
Ejemplo: Ejemplo:
CPI r20, 5 ; Comparar r20 con el valor 5 BST r0, 3 ; Carga la bandera T con el bit 3 de r0
BRBC 1, dife ; Salta si la bandera Z es cero BRBS 6, salto ; Salta si el bit T está a uno
... ...
dife: NOP ; Destino de desvío (No hacer nada) salto: NOP ; Destino de desvío (No hacer nada)
BRCC Salta si la bandera C es cero BRCS Salta si la bandera C está a set (uno)
Sintaxis: BRCS k Sintaxis: BRCS k
Descripción: Examina la bandera C y si es cero desvía Descripción: Examina la bandera C y si está a uno desvía
relativamente al PC (contador de programa) en cualquier relativamente al PC (contador de programa) en cualquier
dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el
offset de PC y es representado en forma de complemento a dos. offset de PC y es representado en forma de complemento a dos.
(Equivalente a la instrucción BRBS 0, k). (Equivalente a la instrucción BRBS 0, k).
Ejemplo: Ejemplo:
ADD r22, r23 ; Suma r23 a r22 CPI r26, $56 ; Comparar r26 con $56
BRCC desvío ; Desvía si C está borrado BRCS desvío ; Desvía si C está a uno
... ...
desvío: NOP ; Destino de desvío desvío: NOP ; Destino de desvío
10
BREAK Pausa BREQ Salta si es igual
Sintaxis: BREAK Sintaxis: BREQ k
Ejemplo:
BRGE Salta si es mayor o igual (con signo) BRHC Salta si la bandera H está a cero
Sintaxis: BRGE k Sintaxis: BRHS k
11
BRHS Salta si la bandera H está a uno BRID Salta si la bandera I está a cero
Sintaxis: BRHS k Sintaxis: BRID k
Descripción: Examina la bandera H y si está a uno desvía Descripción: Examina la bandera I; si está a cero desvía
relativamente al PC (contador de programa) en cualquier relativamente al PC (contador de programa) en cualquier
dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el
offset de PC y es representado en forma de complemento a dos. offset de PC y es representado en forma de complemento a dos.
(Equivalente a la instrucción BRBS 5, k). (Equivalente a la instrucción BRBS 7, k).
Ejemplo: Ejemplo:
BRHS desvio ; Desvío si la bandera H está a uno BRIE desvio ; Desvía si la bandera I está a cero
... ...
desvio: NOP ; Destino de desvío desvio: NOP ; Destino de desvío
Descripción: Examina la bandera I; si está a uno desvía Descripción: Examina la bandera C y si está a uno desvía
relativamente al PC (contador de programa) en cualquier relativamente al PC (contador de programa) en cualquier
dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el
offset de PC y es representado en forma de complemento a dos. offset de PC y es representado en forma de complemento a dos.
(Equivalente a la instrucción BRBS 7, k). (Equivalente a la instrucción BRBC 0, k). Si la instrucción se
ejecuta inmediatamente después de alguna de las instrucciones
Banderas afectadas: Ninguna CP, CPI, SUB o SUBI, el desvío puede ocurrir si y sólo si el
número binario con o sin signo representado en Rd es mayor o
Ejemplo: igual al número binario con o sin signo representado en Rr.
12
BRLT Salta si es menor (con signo) BRMI Salta si es negativo
Sintaxis: BRLT k Sintaxis: BRMI k
Descripción: Examina la bandera Z y ejecuta un salto relativo en Descripción: Examina la bandera N y si está a cero se desvía
PC (contador de programa) si Z está a cero. Si la instrucción se relativamente al PC (contador de programa en cualquier
ejecuta inmediatamente después de alguna de las instrucciones dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el
CP, CPI, SUB o SUBI, el salto ocurre si el número binario con o offset de PC y es representado en forma de complemento a dos.
sin signo representado en Rd es diferente al número binario con (Equivalente a la instrucción BRBS 2, k).
o sin signo representado en Rr. Esta instrucción desvía
relativamente a PC en cualquier dirección (PC - 63 ≤ destino ≤ Banderas afectadas: Ninguna
PC + 64). El parámetro k es el offset de PC y es representado en
forma de complemento a dos. (Equivalente a la instrucción Ejemplo:
BRBS 1, k).
SUBI r26, $50 ; Restar $50 de r26
Banderas afectadas: Ninguna BRPL desvío ; Desvía si r26 es positivo
...
Ejemplo: desvío: NOP ; Destino de desvío
13
BRSH Salta si es mayor o igual (sin signo) BRTC Salta si la bandera T está a cero
Sintaxis: BRSH k Sintaxis: BRTC k
Descripción: Examina la bandera C y si está a cero desvía Descripción: Examina la bandera T y si está a cero desvía
relativamente al PC (contador de programa) en cualquier relativamente al PC (contador de programa) en cualquier
dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el
offset de PC y es representado en forma de complemento a dos. offset de PC y es representado en forma de complemento a dos.
(Equivalente a la instrucción BRBC 0, k). Si la instrucción se (Equivalente a la instrucción BRBS 5, k).
ejecuta inmediatamente después de alguna de las instrucciones
CP, CPI, SUB o SUBI, el desvío puede ocurrir si y sólo si el Banderas afectadas: Ninguna
número binario con o sin signo representado en Rd es mayor o
igual al número binario con o sin signo representado en Rr. Ejemplo:
BRTS Salta si la bandera T está a uno BRVC Salta si la bandera V está a cero
Sintaxis: BRTS k Sintaxis: BRTC k
Descripción: Examina la bandera T y si está a uno desvía Descripción: Examina la bandera V y si está a cero desvía
relativamente al PC (contador de programa) en cualquier relativamente al PC (contador de programa) en cualquier
dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el dirección (PC - 63 ≤ destino ≤ PC + 64). El parámetro k es el
offset de PC y es representado en forma de complemento a dos. offset de PC y es representado en forma de complemento a dos.
(Equivalente a la instrucción BRBS 6, k). (Equivalente a la instrucción BRBS 6, k).
Ejemplo: Ejemplo:
14
BRVS Salta si la bandera V está a uno BSET Poner a uno el bit de una bandera
Sintaxis: BRVS k Sintaxis: BSET s
T: Se pone a uno si el bit b del registro Rd está a uno, de lo Descripción: Llama a una subrutina en cualquier lugar de la
contrario se pone a cero. memoria de programa. La dirección de retorno se almacena en la
pila. El puntero de pila SP es post-decrementado durante la
Ejemplo: instrucción CALL.
15
CBI Poner a cero un bit del registro I/O CBR Pone a cero los bits del registro
Sintaxis: CBI P, b Sintaxis: CBR Rd, K
Descripción: Pone a cero un bit específico en un registro de I/O. Descripción: Pone a uno los bits del registro Rd indicados.
Esta operación funciona en los 32 registros de I/O más bajos, y Realiza la operación ORI lógica entre el contenido del registro
en los registros de trabajo de 0 a 31. Rd y una constante K, y deja el resultado en el registro destino
Rd.
Banderas afectadas: Ninguna
Banderas afectadas:
Ejemplo:
V: Se pone a cero.
CBI $12, 7 ; Poner a cero el bit 7 de Port D N: Se activa si el bit MSB del resultado está a uno, de lo
contrario se borrará.
Z: Se activa si el resultado es $00, de lo contrario se borrará.
Ejemplo:
Operación: C ← 0 Operación: H ← 0
Descripción: Pone a cero la bandera de acarreo C del registro de Descripción: Pone a cero la bandera de medio acarreo H del
estado SREG. registro de estado SREG.
Ejemplo: Ejemplo:
16
CLI Deshabilitar las interrupciones globales CLN Poner a cero la bandera N
Sintaxis: CLI Sintaxis: CLN
Operación: N ← 0 Operación: N ← 0
Descripción: Pone a cero la bandera de habilitación de Descripción: Pone a cero la bandera de resultado negativo N del
interrupciones globales I del registro de estado SREG. registro de estado SREG.
Ejemplo: Ejemplo:
Descripción: Borra un registro. Esta instrucción realiza una OR Descripción: Pone a cero la bandera de signo S del registro de
exclusiva entre un registro y en sí mismo. Borrará todos los bits estado SREG.
del registro.
Banderas afectadas:
Banderas afectadas:
S: Se pone a cero
V: Se pone a cero.
N: Se pone a cero Ejemplo:
Z: Se pone a uno.
ADD r2, r3 ; Sumar r3 a r2
Ejemplo: CLS ; Borrar la bandera S
17
CLT Poner a cero la bandera T CLV Poner a cero la bandera V
Sintaxis: CLT Sintaxis: CLV
Operación: T ← 0 Operación: V ← 0
Descripción: Pone a cero la bandera T del registro de estado Descripción: Pone a cero la bandera de desbordamiento V del
SREG. registro de estado SREG.
Ejemplo: Ejemplo:
Descripción: Pone a cero la bandera de resultado cero Z del Descripción: Realiza el complemento a uno del registro Rd.
registro de estado SREG.
Banderas afectadas:
Banderas afectadas:
V: Se pone a cero.
Z: Se pone a cero N: Se activa si el bit MSB del resultado está a uno, de lo
contrario se borrará.
Ejemplo: Z: Se activa si el resultado es $00, de lo contrario se borrará.
C: se pone a uno.
ADD r2, r3 ; Suma r3 a r2
CLZ ; Borra la bandera Z Ejemplo:
18
CP Compara CPC Compara con acarreo
Sintaxis: CP Rd, Rr Sintaxis: CPC Rd, Rr
Descripción: Efectúa una comparación entre dos registros Rd y Descripción: Realiza una comparación entre dos registros Rd y
Rr. Ninguno de los registros es cambiado. Todos los desvíos Rr y también se toma en cuenta el estado de la bandera C previo.
condicionales pueden usarse después de esta instrucción. Ninguno de los registros es cambiado. Todos los desvíos
condicionales pueden usarse después de esta instrucción
Banderas afectadas:
Banderas afectadas:
H: Se activa si hay un acarreo negativo del bit 3, de lo contrario
se borrará. H: Se activa si hay un acarreo negativo del bit 3, de lo contrario
V: Se activa si ocurre un desbordamiento del complemento a dos se borrará.
como resultado de la operación, de lo contrario se borrará. V: Se activa si ocurre un desbordamiento del complemento a dos
N: Se activa si el bit MSB del resultado está a uno, de lo como resultado de la operación, de lo contrario se borrará.
contrario se borrará. N: Se activa si el bit MSB del resultado está a uno, de lo
Z: Se activa si el resultado es $00, de lo contrario se borrará. contrario se borrará.
C: Se activa si el valor absoluto del contenido de Rr es mayor Z: El valor previo permanece sin cambio cuando el resultado es
que el contenido de Rd, de lo contrario se borrará. cero, de lo contrario se borrará.
C Estará a uno si el valor absoluto del contenido de Rr + C, es
Ejemplo: mayor que el contenido de Rd, de lo contrario se borrará.
CPI Compara un registro con dato inmediato CPSE Compara y saltar si es igual
Sintaxis: CPI Rd, K Sintaxis: CPSE Rd, Rr
Ejemplo:
19
DEC Decrementar el registro EOR Función lógica OR-exclusiva (⊕) entre
registros
Sintaxis: DEC Rd
Sintaxis: EOR Rd, Rr
Operación: Rd ← Rd -1
Operación: Rd ← Rd ⊕ Rr
Operandos: 0 ≤ d ≤ 31
Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31
Descripción Se decrementa en uno al contenido del registro Rd y
deja el resultado en Rd. La bandera C de SREG no es afectada
Descripción: Se realiza el XOR lógico entre el contenido del
por la operación. Al funcionar con números sin signo, sólo se
registro Rd y del registro Rr; deja el resultado en el registro
puede esperar que funcionen de forma consistente las
destino Rd.
instrucciones BREQ y BRNE. Al operar con valores en
complemento a dos todas las instrucciones de desvío están
Banderas afectadas:
disponibles.
V: Se pone a cero.
Banderas afectadas:
N: Se activa si el bit MSB del resultado está a uno, de lo
contrario se borrará.
V: Se activa si ocurre un desbordamiento del complemento a dos
Z: Se activa si el resultado es $00, de lo contrario se borrará.
como resultado de la operación, de lo contrario se borrará. Un
desbordamiento del complemento a dos ocurrirá si y sólo si Rd
Ejemplo:
era $80 antes de la operación.
N: Se activa si el bit MSB del resultado está a uno, de lo
EOR r4, r4 ; Borrar r4
contrario se borrará.
EOR r0, r22 ; OR exclusiva entre r0 y r22
Z: Se activa si el resultado es $00, de lo contrario se borrará.
Ejemplo:
Pila: Stack ← PC + 1 : SP ← SP -2 (2 Bytes) Descripción: Efectúa un salto indirecto a una dirección apuntada
por el registro puntero Z. El registro puntero Z es de 16 bits y
Descripción: Realiza una llamada indirecta a una subrutina permite saltos hacia los 64K words (128K bytes) más bajos de la
apuntada por el registro puntero Z. El registro puntero Z es de 16 sección de memoria de programa. La instrucción no está
bit y permite la llamada a subrutina dentro de los 64K words disponible para todos los modelos de AVR’s.
(128K bytes) más bajos de la sección de espacio de memoria de
programa. El SP (puntero de pila) utiliza durante el ICALL un Banderas afectadas: Ninguna
esquema de post-decremento.
Ejemplo:
Banderas afectadas: Ninguna
MOV r30, r0 ; Poner offset a la tabla de salto
Ejemplo: IJMP ; Saltar a la rutina apuntada por r31:r30
20
IN Cargar un registro de trabajo con I/O INC Incrementar el registro
Sintaxis: IN Rd, P Sintaxis: INC Rd
Operación: Rd ← P Operación: Rd ← Rd +1
Descripción: Carga un dato proveniente del bloque de registros Descripción Se incrementa en uno al contenido del registro Rd y
I/O (Puertos, Timers, registros de configuración, etc.) en el deja el resultado en el registro Rd. La bandera C de SREG no es
registro de trabajo Rd. afectada por la operación. Al funcionar con números sin signo,
sólo se puede esperar que funcionen de forma consistente las
Banderas afectadas: Ninguna instrucciones BREQ y BRNE. Al operar con valores en
complemento a dos todas las instrucciones de desvío están
Ejemplo: disponibles.
Ejemplo:
Operación: PC ← k Operación: Rd ← K
Descripción: Ejecuta un salto a cualquier posición de la Descripción: Carga un dato inmediato de 8-bits en cualquiera de
memoria de programa. La instrucción no es disponible para todos los registros de trabajo a partir de R16 hasta R31.
los modelos de AVRs.
Banderas afectadas: Ninguna
Banderas afectadas: Ninguna
Ejemplo:
Ejemplo:
CLR r31 ; Borra el byte alto de Z
MOV r1, r0 ; Copia r0 en r1 LDI r30, $F0 ; Pone el byte bajo de Z a $F0
JMP lejos ; Salto incondicional LPM ; Carga una constante de la memoria
… ; de programa apuntada por Z
lejos: nop ; Destino de salto
21
LD Carga indirecta usando X
El resultado de estas combinaciones es indefinido:
Sintaxis: LD Rd, X
LD Rd, X+ LD r26, X+
LD Rd, -X
LD r27, X+
Operación: Rd ← (X) X: Sin cambios
Rd ← (X), X ← X+1 X: Con post-incremento LD r26, -X
X ← X–1, Rd ← (X) X: Con pre-decremento
LD r27, -X
Operandos: 0 ≤ d ≤ 31
Algunas variantes de esta instrucción no son disponibles para
Descripción Se carga un byte de manera indirecta procedente del todos los modelos de AVR’s.
área de datos hacia un registro de trabajo. Para los dispositivos
con SRAM, el área de datos se compone de los registros de: Banderas afectadas: Ninguna
trabajo, I/O y SRAM interna (y SRAM externa si es aplicable).
Para los dispositivos sin SRAM, el espacio de datos se compone Ejemplo:
sólo por los registros de trabajo. La EEPROM tiene un espacio
de dirección separado. CLR r27 ; Borra el byte alto de X
LDI r26, $60 ; Pone el byte bajo de X a $60
La dirección de los datos es apuntado por el registro puntero X LD r0, X+ ; Carga en r0 el dato de la localidad $60
(16 bits). Se limita el acceso de memoria al segmento de datos de ;(X post-incrementado)
64K bytes. Para acceder a otro segmento de datos en dispositivos LD r1, X ; Carga en r1 el dato contenido en la
con más de 64K bytes de datos de espacio, el registro I/O ; localidad $61
RAMPX tiene que ser correctamente configurado. LDI r26, $63 ; Pone el byte bajo de X a $63
LD r2, X ; Carga en r2 el dato de la localidad $63
El registro puntero X puede permanecer sin cambios por la LD r3, -X ; Cargar en r3 el dato de la localidad $62
operación, puede post-incrementarse o pre-decrementarse. Estas ;(X pre-decremento)
características son apropiadas para acceder a matrices, tablas y
uso del puntero de pila con el registro puntero X. Sólo el byte
bajo del puntero X se ocupa para dispositivos sin más de 256
bytes de espacio de datos. Para tales dispositivos, el byte alto del
puntero no es usado por esta instrucción y puede usarse para
otros propósitos.
Descripción Se carga un byte de manera indirecta procedente del Banderas afectadas: Ninguna
área de datos hacia un registro de trabajo. Para los dispositivos
con SRAM, el área de datos se compone de los registros de: Ejemplo:
trabajo, I/O y SRAM interna (y SRAM externa si es aplicable).
Para los dispositivos sin SRAM, el espacio de datos se compone CLR r29 ; Borra el byte alto de Y
sólo por los registros de trabajo. La EEPROM tiene un espacio LDI r28, $60 ; Pone el byte bajo de Y a $60
de dirección separado. LD r0, Y+ ; Carga en r0 el dato de la localidad $60
; (Y post-incrementado)
La dirección de los datos es apuntado por el registro puntero Y LD r1, Y ; Carga en r1 el dato de la localidad $61
(16 bits). Se limita el acceso de memoria al segmento de datos de LDI r28, $63 ; Pone el byte bajo de Y a $63
64K bytes. Para acceder a otro segmento de datos en dispositivos LD r2, Y ; Carga en r0 el dato de la localidad $63
con más de 64K bytes de datos de espacio, el registro I/O LD r3,-Y ; Carga en r0 el dato de la localidad $62
RAMPY tiene que ser correctamente configurado. ; (Y pre-decrementado)
LDD r4, Y+2 ; Carga en r4 el dato de la localidad $64
El registro puntero Y puede permanecer sin cambios por la
operación, puede post-incrementarse o pre-decrementarse. Estas
características son apropiadas para acceder a matrices, tablas y
uso del puntero de pila con el registro puntero Y. Sólo el byte
bajo del puntero Y se ocupa para dispositivos sin más de 256
bytes de espacio de datos. Para tales dispositivos, el byte alto del
puntero no es usado por esta instrucción y puede usarse para
otros propósitos.
22
LD (LDD) Carga indirecta usando Z
Sólo el byte bajo del puntero Z se ocupa para dispositivos sin
Sintaxis: LD Rd, Z más de 256 bytes de espacio de datos. Para tales dispositivos, el
LD Rd, Z+ byte alto del puntero no es usado por esta instrucción y puede
LD Rd, -Z usarse para otros propósitos.
LDD Rd, Z+q
El resultado de estas combinaciones es indefinido:
Operación: Rd ← (Z) Z: Sin cambios
Rd ← (Z), Z ← Z+1 Z: Con post-incremento LD r30, Z+
Z ← Z – 1, Rd ← (Z) Z: Con pre-decremento
Rd ← (Z+q) Z: Sin cambios, LD r31, Z+
q: Desplazamiento
Operandos: 0 ≤ d ≤ 31, 0 ≤ q ≤ 63 LD r30, -Z
23
LSL Desplazamiento a la izquierda LSR Desplazamiento a la derecha
Sintaxis: LSL Rd Sintaxis: LSR Rd
Operación: Operación:
Operandos: 0 ≤ d ≤ 31 Operandos: 0 ≤ d ≤ 31
Descripción: Desplaza todos los bits de Rd una posición hacia la Descripción: Desplaza todos los bits de Rd una posición hacia la
izquierda. El bit 7 se carga en la bandera C de SREG. derecha. En el bit 7 se carga un cero, en la bandera C se carga el
Prácticamente esta operación multiplica por dos al contenido de LSB de Rd. Prácticamente esta operación divide entre dos al
Rd. contenido de Rd.
Operación: Rd ← Rr Operación: Rd + 1: Rd ← Rr + 1: Rr
Descripción: Efectúa una copia de un registro en otro registro. Descripción: Efectúa una copia de un par de registros en otro par
El registro fuente Rr permanece sin cambiar, mientras el registro de registros. Los registros fuente Rr permanecen sin cambiar,
destino Rd es cargado con una copia de Rr. mientras los registros destino Rd son cargados con una copia de
Rr.
Banderas afectadas: Ninguna
Banderas afectadas: Ninguna
Ejemplo:
Esta instrucción no es disponible para todos los modelos de
MOV r16,r0 ; Copiar r0 en r16 AVR’s.
CALL check ; Llamada a subrutina
... Ejemplo:
check: CPI r16,$11 ; Comparar r16 con $11
... MOVW r17:r16,r1:r0 ; Copiar r1:r0 en r17:r16
RET ; Retorno de subrutina CALL check ; Llamada a subrutina
...
check: CPI r16, $11 ; Comparar r16 con $11
...
RET ; Retorno de subrutina
24
MUL Multiplicación sin signo MULS Multiplicación con signo
Sintaxis: MUL Rd, Rr Sintaxis: MULS Rd, Rr
Banderas afectadas:
Banderas afectadas:
C: Se pone a uno si el bit 15 del resultado está a uno.
C: Se pone a uno si el bit 15 del resultado está a uno. Z: Se pone a uno si el resultado es cero.
Z: Se pone a uno si el resultado es cero.
Esta instrucción no es disponible para todos los modelos de
Esta instrucción no es disponible para todos los modelos de AVR’s.
AVR’s.
Ejemplo:
Ejemplo:
MUL r21 r20 ; Multiplica R21 con R20
MUL r5, r4 ; Multiplica R5 con R4 MOVW r20, r0 ; Copia el resultado en R21: R20
MOVW r4, r0 ; Copia el resultado en R5: R4
Descripción: Cambia el contenido del registro Rd con su Descripción: Consume un ciclo sin realizar operaciones.
complemento a dos; el valor $80 se deja sin cambiar.
Banderas afectadas: Ninguna
Banderas afectadas:
Ejemplo:
H: Se activa si había un acarreo negativo (Borrow) del bit 3, de
lo contrario se borrará (cero). CLR r16 ; Borrar r16
V: Se activa si ocurre un desbordamiento del complemento a dos SER r17 ; Poner a uno r17
de la resta implícita de cero, de lo contrario se borrará. Un OUT $18, r16 ; Escribir ceros en el Puerto B
desbordamiento del complemento a dos ocurrirá si y sólo si el NOP ; Esperar (No hacer nada)
contenido del registro después de la operación es $80. OUT $18, r17 ; Escribir unos en el Puerto B
N: Se activa si el bit MSB del resultado está a uno, de lo
contrario se borrará.
Z: Se activa si el resultado es $00, de lo contrario se borrará.
C: Se activa si hay un acarreo negativo (borrow) en la resta
implícita de cero, de lo contrario se borrará. La bandera C se
activa en todos los casos excepto cuando el contenido del
registro después de la operación es $00.
Ejemplo:
25
OR Función lógica OR entre registros ORI Función lógica OR entre un registro y un
dato inmediato
Sintaxis: OR Rd, Rr
Sintaxis: ORI Rd, K
Operación: Rd ← Rd (OR) Rr
Operación: Rd ← Rd (OR) K
Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31
Operandos: 0 ≤ d ≤ 31, 0 ≤ K ≤ 255
Descripción: Se realiza el OR lógico entre el contenido del
registro Rd y del registro Rr; deja el resultado en el registro Descripción: Se realiza el OR lógico entre el contenido del
destino Rd. registro Rd y el valor K; deja el resultado en el registro destino
Rd.
Banderas afectadas:
Banderas afectadas:
V: Se pone a cero.
N: Se activa si el bit MSB del resultado está a uno, de lo V: Se pone a cero.
contrario se borrará. N: Se activa si el bit MSB del resultado está a uno, de lo
Z: Se activa si el resultado es $00, de lo contrario se borrará. contrario se borrará.
Z: Se activa si el resultado es $00, de lo contrario se borrará.
Ejemplo:
Ejemplo:
OR r15, r16 ; Hacer OR lógico entre registros
BST r15, 6 ; Almacena el bit 6 de r15 en el flag T ORI r16, $F0 ; Poner a uno el nibble alto de r16
BRTS ok ; Desvío si el flag T está a uno ORI r17, 1 ; Poner a uno el bit 0 de r17
...
ok: NOP ; Destino de desvío (No hacer nada)
Descripción: Carga en un registro del bloque I/O el contenido de Descripción: Carga el registro Rd con un byte de la pila. El
un registro trabajo. puntero de pila es incrementado en uno antes del POP
26
PUSH Guardar registro en la pila RCALL llamada relativa a subrutina
Sintaxis: PUSH Rr Sintaxis: RCALL k
Descripción: Efectúa un retorno de subrutina. La dirección de Descripción: Realiza un retorno de una interrupción. La
retorno es cargada de la pila. El SP (puntero de pila) utiliza dirección de retorno es cargada desde la pila; la bandera I de
durante el RET un esquema de post-incremento. SREG (interrupción global) se pone a uno. El registro de estado
no se guarda automáticamente al entrar en una rutina de
Banderas afectadas: Ninguna interrupción, y no se restaura al volver de la rutina interrupción.
De ser necesario el programa debe incluir una rutina para
Ejemplo: manejar adecuadamente esta situación. El puntero de pila usa un
esquema de pre-incremento durante el RETI.
CALL routine ; Llamada a subrutina
... Banderas afectadas:
routine: PUSH r14 ; Guardar r14 en la pila
... I: Se pone a uno.
POP r14 ; Restaurar r14
RET ; Retorno de subrutina Ejemplo:
...
27
RJMP Salto relativo ROL Desplazamiento a la izquierdo con acarreo
Sintaxis: RJMP k Sintaxis: ROL Rd
Operación: PC ← PC + k + 1 Operación:
Descripción: Ejecuta un salto relativo a una dirección que se Descripción: Desplaza todos los bits de Rd una posición hacia la
encuentra dentro de PC - 2K + 1 y PC +2K. En ensamblador, se izquierda. La bandera C se desplaza al bit 0 de Rd. El bit 7 se
usan etiquetas en lugar de operadores relativos. Para los desplaza hacia la bandera C. Esta operación combinada con LSL,
microcontroladores AVR con memoria de programa que no multiplica por dos a valores multi-byte con o sin signo.
excede 4K words (8K bytes) esta instrucción puede dirigirse a
toda la memoria desde cualquier posición de dirección. Banderas afectadas:
ROR Desplazamiento a la derecha con acarreo SBC Resta de dos registros con acarreo
Sintaxis: ROR Rd Sintaxis: SBC Rd, Rr
Operación: Operación: Rd ← Rd – Rr - C
Operandos: 0 ≤ d ≤ 31 Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31
Descripción: Desplaza todos los bits de Rd una posición hacia la Descripción: Resta dos registros y resta la bandera C; deja el
derecha. La bandera C se desplaza al bit 7 de Rd. El bit 0 se resultado en el registro Rd.
desplaza hacia la bandera C. Esta operación combinada con LSR
divide entre dos a valores multi-byte con o sin signo. Banderas afectadas:
Banderas afectadas: H: Se activa si había un acarreo negativo (Borrow) del bit 3, de
lo contrario se borrará (cero).
S: N ⊕ C, para prueba de signo V: Se activa si ocurre un desbordamiento del complemento a dos
V: N ⊕ C (para N y C después del desplazamiento) como resultado de la operación, de lo contrario se borrará.
N: Se pone a uno si el MSB de Rd esta a uno. N: Se activa si el bit MSB del resultado está a uno, de lo
Z: Se activa si el resultado es $00, de lo contrario se borrará. contrario se borrará.
C: Se activa antes del desplazamiento el LSB de Rd estaba a Z: El estado anterior permanece sin cambio cuando el resultado
uno. es cero, de lo contrario se borrará.
C: Se activa si el valor absoluto del contenido de Rr + el acarreo
Ejemplo: previo es mayor que el valor absoluto de Rd, de lo contrario se
borrará.
ADD r0, r4 ; Sumar r4 a r0
LSL r0 ; Multiplicar r0 por 2 Ejemplo:
28
SBCI Resta a un registro una constante y el SBI Poner a uno un bit del registro I/O
acarreo
Sintaxis: SBI P, b
Sintaxis: ADD Rd, Rr
Operación: (P, b) ← 1
Operación: Rd ← Rd –K - C
Operandos: 0 ≤ P ≤ 31, 0 ≤ b ≤ 7
Operandos: 16 ≤ d ≤ 31, 0 ≤ K ≤ 255
Descripción: Pone a uno un bit específico de un registro del
Descripción: Resta una constante con un registro y con la bloque I/O. Esta operación funciona en los 32 registros de I/O
bandera C; deja el resultado en el registro destino Rd. más bajos. Direcciones de $00 a $1F.
.
Banderas afectadas: Banderas afectadas: Ninguna
Ejemplo:
; Resta $4F23 de r17:r16
SUBI r16, $23 ; Restar el byte bajo
SBCI r17, $4F ; Restar con acarreo el byte alto
SBIC Salta si el bit del registro I/O es cero SBIS Salta si el bit del registro I/O es uno
Sintaxis: SBCI P, b Sintaxis: SBIS P, b
Descripción: Examina un bit del registro de I/O seleccionado y Descripción: Examina un bit del registro de I/O seleccionado y
salta la siguiente instrucción si el bit está en cero. Está operación salta la siguiente instrucción si el bit está en uno. Está operación
funciona en los 32 registros de I/O más bajos, direcciones 0-31). funciona en los 32 registros de I/O más bajos, direcciones 0-31).
Ejemplo: Ejemplo:
espera: SBIC $1C, 1 ; Saltar próxima instrucción si espera: SBIS $10, 0 ; Saltar la siguiente instrucción
; EEWE* está borrado ; si el bit 0 en el Puerto D está a uno
RJMP espera ; Escritura de EEPROM no RJMP espera ; Bit 0 borrado
; terminada NOP ; Continuar (No hacer nada)
NOP ; Continuar (No hacer nada)
29
SBIW Resta un dato inmediato a un registro de SBR Pone a uno los bits del registro
palabra
Sintaxis: SBR Rd, K
Sintaxis: SBIW Rd+1:Rd,K
Operación: Rd ← Rd v K
Operación: Rd +1: Rd ← Rd+1 : Rd - K
Operandos: 16 ≤ d ≤ 31, 0 ≤ K ≤ 255
Operandos:
Operando1: Puede ser uno de los 3 registros de 16 bits. Podemos Descripción: Pone a uno los bits del registro Rd indicados.
indicarlo de las siguientes maneras: XH:XL o sólo a XL; YH:YL Realiza la operación ORI lógica entre el contenido del registro
o sólo a YL; ZH:ZL o sólo es a ZL. También podemos utilizar Rd y una constante K, y deja el resultado en el registro destino
R27:R26 o sólo a R26; R29:R28 o sólo a R28; R31:R30 o sólo a Rd.
R30. También podemos usar el registro de 16 bits compuesto por
R25:R24 al que también podemos indicar como R24. Banderas afectadas:
S: Se activa sólo si una de las banderas V o N está a uno. SBR r16, 3 ; Poner a uno los bits 0 y 1 de r16
V: Se activa si ocurre un desbordamiento del complemento a dos SBR r17, $F0 ; Poner a uno los 4 MSB en r17
como resultado de la operación, de lo contrario se borrará.
N: Se activa si el bit MSB del resultado está a uno, de lo
contrario se borrará.
Z: Se activa si el resultado es $0000, de lo contrario se borrará.
C: Se activa si el valor absoluto de K es mayor que el valor
absoluto de Rd, de lo contrario se borrará.
Ejemplo:
SBRC Salta si el bit del registro es cero SBRS Salta si el bit del registro es uno
Sintaxis: SBRC Rr, b Sintaxis: SBRC Rr, b
Descripción: Examina un bit del registro seleccionado y salta la Descripción: Examina un bit del registro seleccionado y salta la
siguiente instrucción si el bit está borrado (cero). siguiente instrucción si el bit está a uno.
Ejemplo: Ejemplo:
30
SEC Poner a uno la bandera C SEH Pone a uno la bandera H
Sintaxis: SEC Sintaxis: SEH
Operación: C ← 1 Operación: H ← 1
Descripción: Pone a uno la bandera de acarreo C del registro de Descripción: Pone a uno la bandera de medio acarreo H del
estado SREG. registro de estado SREG.
Ejemplo: Ejemplo:
Operación: I ← 1 Operación: N ← 1
Descripción: Pone a uno la bandera de habilitación de Descripción: Pone a uno la bandera de resultado negativo N del
interrupciones globales I del registro de estado SREG. registro de estado SREG.
Ejemplo: Ejemplo:
31
SER Carga todos los bits de un registro SES Pone a uno la bandera S
Sintaxis: SER Rd Sintaxis: SES
Descripción: SER Carga directamente $FF al registro Descripción: Pone a uno la bandera de signo S del registro de
seleccionado. estado SREG.
Operación: T ← 1 Operación: V ← 1
Descripción: Pone a uno la bandera T del registro de estado Descripción: Pone a uno la bandera de desbordamiento V del
SREG. registro de estado SREG.
Ejemplo: Ejemplo:
32
SEZ Poner a uno la bandera Z SLEEP Activar modo sleep
Sintaxis: SEZ Sintaxis: SLEEP
33
ST (STD) Almacenar indirectamente usando Y
El resultado de estas combinaciones es indefinido:
Sintaxis: LD Y, Rr
LD Y+, Rr ST Y+, r28
LD -Y, Rr
STD Y+q, Rr ST Y+, r29
34
STS Almacena directamente en SRAM SUB Resta de dos registros sin acarreo
Sintaxis: STS (k), Rr Sintaxis: SUB Rd, Rr
Descripción: Almacena un byte de un registro de trabajo en la Descripción: Resta dos registros sin considerar la bandera C y
memoria de datos. Para los dispositivos con SRAM, el espacio deja el resultado en el registro destino Rd.
de datos está compuesto por los registros de trabajo, memoria de
I/O y SRAM interna (y SRAM externa si es aplicable). Para los Banderas afectadas:
dispositivos sin SRAM, el espacio de datos está compuesto sólo
por los registros de trabajo. La EEPROM tiene un espacio de H: Se activa si hay un acarreo negativo (Borrow) del bit 3, de lo
direcciones separado. Debe proporcionarse una dirección de 16- contrario se borrará.
bit. Se limita el acceso de memoria al segmento de datos de 64K V: Se activa si ocurre un desbordamiento del complemento a dos
bytes. Para acceder a otro segmento de datos en dispositivos con como resultado de la operación, de lo contrario se borrará.
más de 64K bytes de datos de espacio, el registro I/O RAMPD N: Se activa si el bit MSB del resultado está a uno, de lo
tiene que ser correctamente configurado. contrario se borrará.
Z: Se activa si el resultado es $00, de lo contrario se borrará.
Banderas afectadas: Ninguna C: Se activa si el valor absoluto del contenido de Rr es mayor
que el valor absoluto de Rd, de lo contrario se borrará.
Esta instrucción no es disponible para todos los modelos de Ejemplo:
AVR’s.
ADD r1, r2 ; Suma r2 a r1 (r1=r1+r2)
Ejemplo: ADD r28, r28 ; Suma r28 a sí mismo (r28=r28+r28)
Descripción: Resta un registro con una constante y deja el Descripción: Intercambia al nibble bajo con el nibble alto del
resultado en el registro Rd. Esta instrucción trabaja con los Rd.
registros R16 a R31 y es ideal para utilizarla con los punteros X,
Y y Z. Banderas afectadas: Ninguna
Ejemplo:
35
TST revisa si es cero o menor WDR Reinicio del Watchdog
Sintaxis: TST Rd Sintaxis: WDR
Descripción: Prueba si el registro es cero o negativo. Realiza un Descripción: Hace un Reinicio del Temporizador Watchdog. La
AND lógico entre el registro y él mismo. El registro permanece instrucción debe ejecutarse en un tiempo limitado por el
sin cambios. prescaler del Watchdog. Consulta las especificaciones del
Watchdog en el manual del dispositivo.
Banderas afectadas:
Banderas afectadas: Ninguna
V: Se pone a cero.
N: Se activa si el bit MSB del resultado está a uno, de lo Ejemplo:
contrario se borrará.
Z: Se activa si el resultado es $00, de lo contrario se borrará. WDR ; Reinicializa el temporizador del Watchdog
Ejemplo:
TST r0 ; Prueba r0
BREQ prueba ; Brinca si r0 = 0
...
prueba: NOP ; Destino de desvío (No hacer nada)
36