INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

August 17, 2017 | Author: Javier Sanchez Mojica | Category: Microcontroller, Pointer (Computer Programming), Central Processing Unit, Electronic Design, Computing
Share Embed Donate


Short Description

TIENE TODAS LAS INSTRUCIONES DE MICROS AVR EXPLICADAS AL DETALLE EN ESPAÑOL...

Description

MICROCONTROLADORES AVR

ATMEL ha llevado la filosofía de diseño RISC (adaptada) a los microprocesadores de 8 BIT. Esta nueva arquitectura proporciona todos los beneficios habituales del RISC: tasa de reloj más rápida, mejor desempeño, y una optimización más eficiente en el compilador. AVR compite con varias familias de microprocesadores bien establecidas en el mercado, tales como: 8051, 68HC05, 68HC11 y los PIC de Microchip que se han extendido rápidamente en los últimos años. 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 dispositivos se fabrican usando la tecnología de memoria no volátil de alta densidad de ATMEL. La Flash programable permite reprogramar la memoria de programa en el sistema a través de un interfaz serie SPI o por un programador de memoria no volátil convencional. Combinando una reforzada CPU RISC de 8-bit y la Flash programable en un chip monolítico, los microcontroladores de ATMEL serie AT90SXX proporcionan una gran flexibilidad y soluciones eficaces a muchas aplicaciones de control integradas. 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éticoLó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 Pueden usarse seis de los 32 registros como tres punteros de registro de dirección indirectos (de 16-bits) para el direccionamiento del espacio de datos (memoria de datos RAM), proporcionando cálculos de dirección eficaces. También se usa uno de los tres punteros de dirección para observar una tabla de constantes. Estos registros de funciones agregados son los registros: X, Y y Z. 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). El AVR utiliza el concepto de arquitectura Harvard, con buses y memorias de programa y datos por separado. La memoria de programa se ejecuta con un sistema de dos fases. Mientras una instrucción está ejecutándose, la siguiente instrucción se pre-extrae de la memoria de programa. 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. Durante las interrupciones y las llamadas a subrutinas, la dirección de retorno del contador de programa (PC) se guarda en la pila. La pila está de forma acertada situada en la SRAM de datos de propósito general, y por consiguiente, el tamaño de la pila está sólo limitado por el tamaño total de la SRAM. Todos los programas del usuario deben inicializar el puntero de pila (SP) antes de la ejecución de subrutinas o interrupciones, considerando que cada vez que se carga un valor en la pila la dirección del SP decrece. El SP de 16 bit es accesible para lectura y escritura mediante el espacio de memoria I/O. Las localidades de la memoria de datos (SRAM) pueden ser accedidos fácilmente a través de los diferentes modos de direccionamiento soportados en la arquitectura AVR. El modo ocioso (idle) detiene la CPU, permitiendo que continúen funcionando la SRAM, el puerto SPI, los Temporizadores / Contadores y el sistema de interrupciones. El modo hibernación (power-down) guarda los contenidos de los registros pero congela el oscilador, deshabilitando todas las otras funciones del chip hasta la próxima interrupción externa o Reset del hardware.

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. El conjunto de instrucciones para estos microcontroladores se puede dividir en el siguiente orden de grupos: Instrucciones Aritméticas y Lógicas Instrucciones de Desvío (salto) Instrucciones de Transferencia de Datos Instrucciones de Bit y prueba de Bit Una línea típica en lenguaje ensamblador está dada de la siguiente forma: [Mnemónico] operando1, operando2 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.

NOMENCLATURA DEL CONJUNTO DE INSTRUCCIONES 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 I: Bandera de interrupciones globales

V: Indicador de complemento a dos desbordado

RESUMEN DEL CONJUNTO DE INSTRUCCIONES Instrucciones Aritméticas y Lógicas Mnemónico ADD ADC ADIW SUB SUBI SBC SBCI AND ANDI OR ORI EOR COM NEG SBR CBR INC DEC TST CLR SER ADIW SBIW MUL MULS MULSU

Operandos Rd,Rr Rd,Rr Rd, K Rd,Rr Rd,K Rd,Rr Rd,K Rd,Rr Rd,K Rd,Rr Rd,K Rd,Rr Rd Rd Rd,K Rd,K Rd Rd Rd Rd Rd Rd+1:Rd,K Rd+1:Rd,K Rd,Rr Rd,Rr Rd,Rr

Mnemónicos RJMP IJMP EIJMP JMP RCALL ICALL

Operandos k Ninguno Ninguno k k Ninguno

Descripción Suma sin acarreo Suma sin acarreo Suma un inmediato a un registro de palabra Resta sin acarreo Resta un inmediato Resta con acarreo Resta un inmediato con acarreo AND lógico AND lógico con inmediato OR lógico OR lógico con inmediato OR exclusivo Complemento a uno Complemento a dos Pon a uno los bits de un registro Pon a cero los bits de un registro Incrementa al registro Decrementa al registro Revisa si es cero o menor Borra el registro Carga los bits de un registro Suma un inmediato a un registro de palabra Resta un inmediato a un registro de palabra Multiplica sin signo Multiplica con signo Multiplica signado con no signado

Instrucciones de desvío (salto) Descripción Salto relativo Salto indirecto Salto indirecto extendido Salto Llamada relativa a subrutina Llamada indirecta a subrutina

5

EICALL CALL RET RETI CPSE CP CPC CPI SBRC SBRS SBIC SBIS BRBC BRBS BREQ BRNE BRCS BRCC BRSH BRLO BRMI BRPL BRGE BRLT BRHS BRHC BRTS BRTC BRVS BRVC BRIE BRID

Ninguno k Ninguno Ninguno Rd,Rr Rd,Rr Rd,Rr Rd,K Rr,b Rr,b P,b P,b s,k s,k k k k k k k k k k k k k k k k k k k

Llamada indirecta a subrutina extendida Llamada a subrutina Regreso de subrutina Regreso de interrupción Compare y salta si es igual Compara Compara con acarreo Compara con inmediato Salta si el bit del registro es cero Salta si el bit del registro es uno Salta si el bit del registro I/O es cero Salta si el bit del registro I/O es uno Salta si el bit de SREG es cero Salta si el bit de SREG es uno Salta si es igual Salta si es diferente Salta si C está a uno Salta si C está a cero Salta si es mayor o igual Salta si es menor Salta si es negativo Salta si es mayor Salta si es mayor o igual (con signo) Salta si es menor (con signo) Salta si H está a uno Salta si H está a cero Salta si T está a uno Salta si T está a cero Salta si V esta a uno Salta si V está a cero Salta si I está a uno Salta si I está a cero

Instrucciones de Transferencia de Datos Mnemónicos MOV MOVW LDI LDS LD LD LD LD LD LD LDD LD LD LD LDD STS

Operandos Rd,Rr Rd,Rr Rd,K Rd,k Rd,X Rd,X+ Rd,-X Rd,Y Rd,Y+ Rd,-Y Rd,Y+q Rd,Z Rd,Z+ Rd,-Z Rd,Z+q k,Rr

Descripción Copia de registros Copia registros de palabra Carga de un inmediato Carga directa Carga indirecta Carga indirecta con Post-Incremento Carga indirecta con Pre-Decremento Carga indirecta Carga indirecta con Post-Incremento Carga indirecta con Pre-Decremento Carga indirecta con desplazamiento Carga indirecta con Carga indirecta con Post-Incremento Carga indirecta con Pre-Decremento Carga indirecta con desplazamiento Almacena directamente

6

ST ST ST ST ST ST ST ST ST ST ST LPM SPM IN OUT PUSH POP

X,Rr X+,Rr -X,Rr Y,Rr Y+,Rr -Y,Rr Y+q,Rr Z,Rr Z+,Rr -Z,Rr Z+q,Rr Ninguno Ninguno Rd,P P,Rr Rr Rd

Almacena indirectamente Almacena indirectamente con Post-Incremento Almacena indirectamente con Pre-Decremento Almacena indirectamente Almacena indirectamente con Post-Incremento Almacena indirectamente con Pre-Decremento Almacena indirectamente con desplazamiento Almacena indirectamente Almacena indirectamente con Post-Incremento Almacena indirectamente con Pre-Decremento Almacena indirectamente con desplazamiento Carga memoria de programa Almacena memoria de programa Cargar un registro con un I/O Cargar un I/O con un registro Cargar registro en la pila Sacar dato de la pila

Instrucciones de Bit y prueba de Bit Mnemónicos LSL LSR ROL ROR ASR SWAP BSET BCLR SBI CBI BST BLD SEC CLC SEN CLN SEZ CLZ SEI CLI SES CLN SEV CLV SET CLT SEH CLH NOP SLEEP WDR

Operandos Rd Rd Rd Rd Rd Rd s s P,b P,b Rr,b Rd,b Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno

Descripción Desplazamiento a la izquierda Desplazamiento a la derecha Rotación a la izquierda con acarreo Rotación a la derecha con acarreo Desplazamiento aritmético Intercambio de nibbles Poner a uno la bandera Poner a cero la bandera Poner a uno el bit de un registro I/O Poner a cero el bit de un registro I/O Guarda en T el bit de un registro Carga T en el bit de un registro Poner a uno la bandera C Poner a cero la bandera C Poner a uno la bandera N Poner a cero la bandera N Poner a uno la bandera Z Poner a cero la bandera Z Poner a uno la bandera I Poner a cero la bandera I Poner a uno la bandera S Poner a cero la bandera S Poner a uno la bandera V Poner a cero la bandera V Poner a uno la bandera T Poner a cero la bandera T Poner a uno la bandera H Poner a cero la bandera H No operación Modo Sleep Reiniciar el Watchdog

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

Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31

Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31

Descripción: Suma dos registros y el contenido de la bandera C; deja el resultado en el registro destino Rd.

Descripción: Suma dos registros sin considerar la bandera C y deja el resultado en el registro destino Rd.

Banderas afectadas:

Banderas afectadas:

H: Se activa si hay un acarreo del bit 3, de lo contrario se borrará. V: Se activa si ocurre un desbordamiento del complemento a dos 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 $00, de lo contrario se borrará. C: Se activa si hay acarreo del bit MSB del resultado, de lo contrario se borrará.

H: Se activa si hay un acarreo del bit 3, de lo contrario se borrará. V: Se activa si ocurre un desbordamiento del complemento a dos 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 $00, de lo contrario se borrará. C: Se activa si hay acarreo del bit MSB del resultado, de lo contrario se borrará.

Ejemplo:

Ejemplo:

ADC r1, r2

; Suma r1, r2 y C ; el resultado lo pone en r1

ADD r1, r2 ADD r28, r28

ADIW Suma un dato inmediato a un registro de palabra

AND Función lógica AND entre registros 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 indicarlo de las siguientes maneras: XH:XL o sólo a XL; YH:YL o sólo a YL; ZH:ZL o sólo es a ZL. También podemos utilizar 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 R25:R24 al que también podemos indicar como R24.

Descripción: Se realiza el AND lógico entre el contenido del registro Rd y del registro Rr; deja el resultado en el registro destino Rd. Banderas afectadas: V: Se pone a cero. 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á.

Operando2: 0≤ K ≤ 63 Descripción: Agrega un valor K a un par de registros y deja el resultado en el par de registros

Ejemplo:

Banderas afectadas:

AND r2, r3 LDI r16, 1 AND r2, r16

S: Se activa sólo si una de las banderas V o N está a uno. V: Se activa si hay desbordamiento en el complemento a dos de 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: ADIW

R25:R24, 1

; Suma r2 a r1 (r1=r1+r2) ; Suma r28 a sí mismo (r28=r28+r28)

; Suma 1 a R24 y en caso de que haya ; acarreo se lo suma a R25

8

; AND lógico entre r2 y r3, resultado en r2 ; Poner 0000 0001 en r16 ; Aislar el bit 0 en r2

ANDI Función lógica AND entre un registro y un dato inmediato

ASR Desplazamiento aritmético a la derecha 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 derecha. El bit 7 se mantiene constante. El bit 0 se carga dentro de la bandera C. Esta operación divide entre dos un valor con signo sin cambiar su signo. La bandera C puede usarse para redondear el resultado.

Descripción: Se realiza el AND lógico entre el contenido del 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 contrario se borrará. Z: Se activa si el resultado es $00, de lo contrario se borrará.

S: N ⊕ C, para prueba de signo V: N ⊕ C (para N y C después del desplazamiento) 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á. C: Se activa antes del desplazamiento el LSB de Rd estaba a uno.

Ejemplo: ANDI r17, $0F ANDI r18, $10 ANDI r19, $AA

; Borrar el nibble alto de r17 ; Aislar el bit 4 en r18 ; Borrar los bits impares de r19

Ejemplo: LDI r16, $10 ASR r16 LDI r17, $FC ASR r17

; Cargar 16 decimal en r16 ; r16 = r16 / 2 ; Cargar -4 en 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

Operación: SREG(s) ← 0

Operación: Rd(b) ← T

Operandos: 0 ≤ s ≤ 7

Operandos: 0 ≤ d ≤ 31, 0 ≤ b ≤ 7

Descripción: Pone a cero un bit específico del registro de banderas SREG.

Descripción: Carga la bandera T del registro SREG en el bit b del registro Rd.

Banderas afectadas:

Banderas afectadas: Ninguna

I: 0 si s = 7; de lo contrario sin cambio T: 0 si s = 6; de lo contrario sin cambio H: 0 si s = 5; de lo contrario sin cambio S: 0 si s = 4; de lo contrario sin cambio V: 0 si s = 3; de lo contrario sin cambio N: 0 si s = 2; de lo contrario sin cambio Z: 0 si s = 1; de lo contrario sin cambio C: 0 si s = 0; de lo contrario sin cambio

Ejemplo: BST r1, 2 BLD r0, 4

Ejemplo: BCLR 0 BCLR 7

; Borrar la bandera C ; Deshabilitar interrupciones

9

; Guardar el bit 2 de r1 en la bandera T ; Cargar T en el bit 4 de r0

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

Operación: Si SREG(s) = 0 entonces PC ← PC + k +1 Si SREG(s) = 1 entonces PC ← PC + 1

Operación: Si SREG(s) = 1 entonces PC ← PC + k +1 Si SREG(s) = 0 entonces PC ← PC + 1

Operandos: 0 ≤ s ≤ 7, -64 ≤ k ≤ 63

Operandos: 0 ≤ s ≤ 7, -64 ≤ k ≤ 63

Descripción: Examina un bit del registro SREG y realiza un salto relativo en el PC (contador de programa) si el bit está a cero. La instrucción desvía relativamente al PC en cualquier 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.

Descripción: Examina un bit del registro SREG y realiza un salto relativo en el PC (contador de programa) si el bit está a uno . La instrucción desvía relativamente al PC en cualquier 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.

Banderas afectadas: Ninguna

Banderas afectadas: Ninguna

Ejemplo:

Ejemplo:

dife:

CPI r20, 5 BRBC 1, dife ... NOP

; Comparar r20 con el valor 5 ; Salta si la bandera Z es cero ; Destino de desvío (No hacer nada)

salto:

BST r0, 3 ; Carga la bandera T con el bit 3 de r0 BRBS 6, salto ; Salta si el bit T está a uno ... 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

Operación: Si C = 0 entonces PC ← PC + k + 1 Si C = 1 entonces PC ← PC + 1

Operación: Si C = 1 entonces PC ← PC + k + 1 Si C = 0 entonces PC ← PC + 1

Operandos: -64 ≤ k ≤ 63

Operandos: -64 ≤ k ≤ 63

Descripción: Examina la bandera C y si es cero desvía relativamente al PC (contador de programa) en cualquier 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. (Equivalente a la instrucción BRBS 0, k).

Descripción: Examina la bandera C y si está a uno desvía relativamente al PC (contador de programa) en cualquier 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. (Equivalente a la instrucción BRBS 0, k).

Banderas afectadas: Ninguna

Banderas afectadas: Ninguna

Ejemplo:

Ejemplo:

desvío:

ADD r22, r23 BRCC desvío ... NOP

; Suma r23 a r22 ; Desvía si C está borrado desvío:

; Destino de desvío

10

CPI r26, $56 BRCS desvío ... NOP

; Comparar r26 con $56 ; Desvía si C está a uno ; Destino de desvío

BREAK Pausa

BREQ Salta si es igual

Sintaxis: BREAK

Sintaxis: BREQ k

Operación: Pausa en la depuración

Operación: Si Rd = Rr : Z = 1 entonces PC ← PC + k + 1 Si Rd ≠ Rr : Z = 0 entonces PC ← PC + 1

Operandos: Ninguno Operandos: -64 ≤ k ≤ 63 Descripción: Se utiliza para la depuración y normalmente no se utiliza en el programa de la aplicación. Cuando la instrucción es ejecutada el CPU del AVR se pone en modo de inactividad. Esto le da al depurador acceso a los recursos internos.

Descripción: Examina la bandera Z y ejecuta un salto relativo en PC (contador de programa) si Z está a uno. Si la instrucción se ejecuta inmediatamente después de alguna de las instrucciones CP, CPI, SUB o SUBI, el salto ocurre si el número binario con o sin signo representado en Rd es igual al número binario con o sin signo representado en Rr. Esta instrucción desvía relativamente a PC en cualquier 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. (Equivalente a la instrucción BRBS 1, k).

La instrucción no está disponible para todos los modelos de AVRs. Banderas afectadas: Ninguna

Banderas afectadas: Ninguna Ejemplo:

igual:

CP r1, r0 BREQ igual ... NOP

; Comparar registros r1 y r0 ; Salta si Z=0 (los registros son iguales) ; Destino de desvío (No hacer nada)

BRGE Salta si es mayor o igual (con signo)

BRHC Salta si la bandera H está a cero

Sintaxis: BRGE k

Sintaxis: BRHS k

Operación: Si Rd ≥ Rr : (N ⊕ V = 0) entonces PC ← PC + k + 1

Operación: Si H = 0 entonces PC ← PC + k + 1 Si H = 1 entonces PC ← PC + 1

Si Rd < Rr entonces PC ← PC + 1

Operandos: -64 ≤ k ≤ 63 Operandos: -64 ≤ k ≤ 63 Descripción: Examina la bandera H y si está a cero desvía relativamente al PC (contador de programa) en cualquier 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. (Equivalente a la instrucción BRBS 5, k).

Descripción: Examina la bandera S y si está a cero desvía relativamente al PC (contador de programa) en cualquier 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. (Equivalente a la instrucción BRBC 0, k). Si la instrucción se 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 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.

Banderas afectadas: Ninguna Ejemplo:

Banderas afectadas: Ninguna desvio: Ejemplo:

desvío:

CP r11, r12 BRGE desvío ... NOP

; Comparar los registros r11 y r12 ; Desvía si r11 ≥ r12 (con signo) ; Destino de desvío

11

BRHC desvio ... NOP

; Desvío si la bandera H está a cero ; Destino de desvío

BRHS Salta si la bandera H está a uno

BRID Salta si la bandera I está a cero

Sintaxis: BRHS k

Sintaxis: BRID k

Operación: Si H = 1 entonces PC ← PC + k + 1 Si H = 0 entonces PC ← PC + 1

Operación: Si T = 0 entonces PC ← PC + k + 1 Si T = 1 entonces PC ← PC + 1

Operandos: -64 ≤ k ≤ 63

Operandos: -64 ≤ k ≤ 63

Descripción: Examina la bandera H y si está a uno desvía relativamente al PC (contador de programa) en cualquier 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. (Equivalente a la instrucción BRBS 5, k).

Descripción: Examina la bandera I; si está a cero desvía relativamente al PC (contador de programa) en cualquier 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. (Equivalente a la instrucción BRBS 7, k).

Banderas afectadas: Ninguna

Banderas afectadas: Ninguna

Ejemplo:

Ejemplo:

desvio:

BRHS desvio ... NOP

; Desvío si la bandera H está a uno ; Destino de desvío

desvio:

BRIE desvio ... NOP

; Desvía si la bandera I está a cero ; Destino de desvío

BRIE Salta si la bandera I está a uno

BRLO Salta si es menor

Sintaxis: BRIE k

Sintaxis: BREQ k

Operación: Si I = 1 entonces PC ← PC + k + 1 Si I = 0 entonces PC ← PC + 1

Operación: Si Rd < Rr : C = 1 entonces PC ← PC + k + 1 Si Rd ≥ Rr : C = 0 entonces PC ← PC + 1

Operandos: -64 ≤ k ≤ 63

Operandos: -64 ≤ k ≤ 63

Descripción: Examina la bandera I; si está a uno desvía relativamente al PC (contador de programa) en cualquier 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. (Equivalente a la instrucción BRBS 7, k).

Descripción: Examina la bandera C y si está a uno desvía relativamente al PC (contador de programa) en cualquier 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. (Equivalente a la instrucción BRBC 0, k). Si la instrucción se 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 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.

Banderas afectadas: Ninguna Ejemplo:

desvio:

BRIE desvio ... NOP

; Desvía si la bandera I está a uno

Banderas afectadas: Ninguna

; Destino de desvío

Ejemplo:

igual:

12

CP r1, r0 BREQ igual ... NOP

; Comparar registros r1 y r0 ; Salta si Z=0 (los registros son iguales) ; Destino de desvío (No hacer nada)

BRLT Salta si es menor (con signo)

BRMI Salta si es negativo

Sintaxis: BRLT k

Sintaxis: BRMI k

Operación: Si Rd ≥ Rr : (N ⊕ V = 1) entonces PC ← PC + k + 1

Operación: Si N = 1 entonces PC ← PC + k + 1 Si N = 0 entonces PC ← PC + 1

Si Rd < Rr entonces PC ← PC + 1

Operandos: -64 ≤ k ≤ 63 Operandos: -64 ≤ k ≤ 63 Descripción: Examina la bandera N y si está a uno se desvía relativamente al PC (contador de programa en cualquier 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. (Equivalente a la instrucción BRBS 2, k).

Descripción: Examina la bandera S y si está a uno desvía relativamente al PC (contador de programa) en cualquier 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. (Equivalente a la instrucción BRBC 0, k). Si la instrucción se 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 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.

Banderas afectadas: Ninguna Ejemplo:

Banderas afectadas: Ninguna desvío:

Ejemplo:

desvío:

SUBI r18, 4 BRMI desvío ... NOP

; Restar 4 de r18 ; Desvía si la bandera N=1 ; Destino de desvío

CP r16, r1 ; Comparar los registros r16 con r1 BRLT desvío ; Desvía si r16 < r1 (con signo) ... NOP ; Destino de desvío (No hacer nada)

BRNE Salta si es diferente

BRPL Salta si es positivo

Sintaxis: BRNE k

Sintaxis: BRPL k

Operación: Si Rd = Rr : Z = 0 entonces PC ← PC + k + 1 Si Rd ≠ Rr : Z = 1 entonces PC ← PC + 1

Operación: Si N = 0 entonces PC ← PC + k + 1 Si N = 1 entonces PC ← PC + 1

Operandos: -64 ≤ k ≤ 63

Operandos: -64 ≤ k ≤ 63

Descripción: Examina la bandera Z y ejecuta un salto relativo en PC (contador de programa) si Z está a cero. Si la instrucción se ejecuta inmediatamente después de alguna de las instrucciones CP, CPI, SUB o SUBI, el salto ocurre si el número binario con o sin signo representado en Rd es diferente al número binario con o sin signo representado en Rr. Esta instrucción desvía relativamente a PC en cualquier 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. (Equivalente a la instrucción BRBS 1, k).

Descripción: Examina la bandera N y si está a cero se desvía relativamente al PC (contador de programa en cualquier 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. (Equivalente a la instrucción BRBS 2, k). Banderas afectadas: Ninguna Ejemplo:

Banderas afectadas: Ninguna desvío:

Ejemplo: loop:

EOR r27, r27 INC r27 ... CPI r27,5 BRNE loop NOP

; Borrar r27 ; Incrementar r27 ; Comparar r27 con 5 ; Desvío si r27 ≠ 5 ; Salida de Loop

13

SUBI r26, $50 BRPL desvío ... NOP

; Restar $50 de r26 ; Desvía si r26 es positivo ; Destino de desvío

BRSH Salta si es mayor o igual (sin signo)

BRTC Salta si la bandera T está a cero

Sintaxis: BRSH k

Sintaxis: BRTC k

Operación: Si Rd ≥ Rr : C = 0 entonces PC ← PC + k + 1 Si Rd < Rr : C = 1 entonces PC ← PC + 1

Operación: Si T = 0 entonces PC ← PC + k + 1 Si T = 1 entonces PC ← PC + 1

Operandos: -64 ≤ k ≤ 63

Operandos: -64 ≤ k ≤ 63

Descripción: Examina la bandera C y si está a cero desvía relativamente al PC (contador de programa) en cualquier 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. (Equivalente a la instrucción BRBC 0, k). Si la instrucción se 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 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.

Descripción: Examina la bandera T y si está a cero desvía relativamente al PC (contador de programa) en cualquier 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. (Equivalente a la instrucción BRBS 5, k). Banderas afectadas: Ninguna Ejemplo:

Banderas afectadas: Ninguna Ejemplo: desvio:

desvío:

SUBI r19, 4 BRSH desvío ... NOP

BST r3, 5 BRTS desvio ... NOP

; cargar el bit 5 de r3 en la bandera T ; Desvía si ese bit está a cero ; Destino de desvío

; Restar 4 de r19 ; Desvía si r19 ≥ 4 (sin signo) ; Destino de desvío

BRTS Salta si la bandera T está a uno

BRVC Salta si la bandera V está a cero

Sintaxis: BRTS k

Sintaxis: BRTC k

Operación: Si T = 1 entonces PC ← PC + k + 1 Si T = 0 entonces PC ← PC + 1

Operación: Si V = 1 entonces PC ← PC + k + 1 Si V = 0 entonces PC ← PC + 1

Operandos: -64 ≤ k ≤ 63

Operandos: -64 ≤ k ≤ 63

Descripción: Examina la bandera T y si está a uno desvía relativamente al PC (contador de programa) en cualquier 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. (Equivalente a la instrucción BRBS 6, k).

Descripción: Examina la bandera V y si está a cero desvía relativamente al PC (contador de programa) en cualquier 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. (Equivalente a la instrucción BRBS 6, k).

Banderas afectadas: Ninguna

Banderas afectadas: Ninguna

Ejemplo:

Ejemplo:

desvio:

BST r3, 5 BRTS desvio ... NOP

; cargar el bit 5 de r3 en la bandera T ; Desvía si ese bit está a uno ; Destino de desvío

desvio:

14

ADD r3, r4 BRVS desvio ... NOP

; Suma el registro r4 a r3 ; Desvía si no hay desbordamiento ; Destino de desvío

BRVS Salta si la bandera V está a uno

BSET Poner a uno el bit de una bandera

Sintaxis: BRVS k

Sintaxis: BSET s

Operación: Si V = 1 entonces PC ← PC + k + 1 Si V = 0 entonces PC ← PC + 1

Operación: SREG(s) ← 1 Operandos: 0 ≤ s ≤ 7

Operandos: -64 ≤ k ≤ 63 Descripción: Pone a uno un bit específico del registro de banderas SREG.

Descripción: Examina la bandera V y si está a uno desvía relativamente al PC (contador de programa) en cualquier 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. (Equivalente a la instrucción BRBS 6, k).

Banderas afectadas:

; Suma el registro r4 a r3 ; Desvía si hay desbordamiento

I: 1 si s = 7; de lo contrario sin cambio T: 1 si s = 6; de lo contrario sin cambio H: 1 si s = 5; de lo contrario sin cambio S: 1 si s = 4; de lo contrario sin cambio V: 1 si s = 3; de lo contrario sin cambio N: 1 si s = 2; de lo contrario sin cambio Z: 1 si s = 1; de lo contrario sin cambio C: 1 si s = 0; de lo contrario sin cambio

; Destino de desvío

Ejemplo:

Banderas afectadas: Ninguna Ejemplo:

desvio:

ADD r3, r4 BRVS desvio ... NOP

BSET 6 BSET 7

; Poner a uno la bandera T ; Interrupción habilitada

BST Guarda en T el bit de un registro

CALL llamada larga a subrutina

Sintaxis: BST Rd, b

Sintaxis: CALL k

Operación: T ← Rd(b)

Operación: PC ← k Dispositivos con PC de 16 bits PC ← k Dispositivos con PC de 22 bits

Operandos: 0 ≤ d ≤ 31, 0 ≤ b ≤ 7 Operandos: 0 ≤ k ≤ 64K 0 ≤ k ≤ 4M

Descripción: Guarda el bit b del registro Rd en la bandera T del registro de SREG.

Pila: Stack ← PC + 2 : SP ← SP -2 (2 Bytes) Stack ← PC + 2 : SP ← SP -3 (3 Bytes)

Banderas afectadas: T: Se pone a uno si el bit b del registro Rd está a uno, de lo contrario se pone a cero.

Descripción: Llama a una subrutina en cualquier lugar de la memoria de programa. La dirección de retorno se almacena en la pila. El puntero de pila SP es post-decrementado durante la instrucción CALL.

Ejemplo: BST r1, 2 BLD r0, 4

; Guardar el bit 2 de r1 en la bandera T ; Cargar T en el bit 4 de r0

Banderas afectadas: Ninguna Ejemplo:

15

check:

MOV r16, r0 CALL check ... CPI r16, $42

error:

... BREQ error RET … RJMP error

; Copiar r0 en r16 ; Llamado a subrutina ; Compara r16 con un valor ; específico ; Salta si son iguales ; Retorno de subrutina ; Ciclo infinito

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

Operación: (P, b) ← 1

Operación: Rd ← Rd AND ($FF – K)

Operandos: 0 ≤ P ≤ 31, 0 ≤ b ≤ 7

Operandos: 16 ≤ d ≤ 31, 0 ≤ K ≤ 255

Descripción: Pone a cero un bit específico en un registro de I/O. Esta operación funciona en los 32 registros de I/O más bajos, y en los registros de trabajo de 0 a 31.

Descripción: Pone a uno los bits del registro Rd indicados. Realiza la operación ORI lógica entre el contenido del registro Rd y una constante K, y deja el resultado en el registro destino Rd.

Banderas afectadas: Ninguna Banderas afectadas: Ejemplo: CBI $12, 7

V: Se pone a cero. 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á.

; Poner a cero el bit 7 de Port D

Ejemplo: CBR r16, $F0 CBR r18, 1

; Borra el nibble alto de r16 ; Borra el bit 0 de r18

CLC Poner a cero la bandera C

CLH Poner a cero la bandera H

Sintaxis: CLC

Sintaxis: CLH

Operación: C ← 0

Operación: H ← 0

Operandos: Ninguno

Operandos: Ninguno

Descripción: Pone a cero la bandera de acarreo C del registro de estado SREG.

Descripción: Pone a cero la bandera de medio acarreo H del registro de estado SREG.

Banderas afectadas:

Banderas afectadas:

C: Se pone a cero

H: Se pone a cero

Ejemplo:

Ejemplo:

ADD r0, r0 CLC

; Sumar r0 a sí mismo ; Borrar la bandera de acarreo

CLH

16

; Borrar la bandera H

CLI Deshabilitar las interrupciones globales

CLN Poner a cero la bandera N

Sintaxis: CLI

Sintaxis: CLN

Operación: N ← 0

Operación: N ← 0

Operandos: Ninguno

Operandos: Ninguno

Descripción: Pone a cero la bandera de habilitación de interrupciones globales I del registro de estado SREG.

Descripción: Pone a cero la bandera de resultado negativo N del registro de estado SREG.

Banderas afectadas:

Banderas afectadas:

I: Se pone a cero

C: Se pone a cero

Ejemplo:

Ejemplo:

CLI IN r11, $16 SEI

; Interrupciones deshabilitadas ; Leer el Puerto B ; Interrupciones habilitadas

ADD r2, r3 CLN

; Sumar r3 a r2 ; Borrar la bandera N

CLR Borra un registro

CLS Poner a cero la bandera S

Sintaxis: CLR Rd

Sintaxis: CLS

Operación: Rd ← Rd (XOR) Rd

Operación: S ← 0

Operandos: 0 ≤ d ≤ 31

Operandos: Ninguno

Descripción: Borra un registro. Esta instrucción realiza una OR exclusiva entre un registro y en sí mismo. Borrará todos los bits del registro.

Descripción: Pone a cero la bandera de signo S del registro de estado SREG. Banderas afectadas:

Banderas afectadas: S: Se pone a cero V: Se pone a cero. N: Se pone a cero Z: Se pone a uno.

Ejemplo: ADD r2, r3 CLS

Ejemplo: loop:

CLR r18 ; Borrar r18 INC r18 ; Incrementar r18 ... CPI r18, $50 ; Comparar r18 con $50 BRNE loop

17

; Sumar r3 a r2 ; Borrar la bandera S

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

Operandos: Ninguno

Operandos: Ninguno

Descripción: Pone a cero la bandera T del registro de estado SREG.

Descripción: Pone a cero la bandera de desbordamiento V del registro de estado SREG.

Banderas afectadas:

Banderas afectadas:

T: Se pone a cero

V: Se pone a cero

Ejemplo:

Ejemplo:

CLT

ADD r2, r3 CLV

; Borrar la bandera T

; Sumar r3 a r2 ; Borrar la bandera V

CLZ Poner a cero la bandera Z

COM Complemento a uno

Sintaxis: CLZ

Sintaxis: COM Rd

Operación: Z ← 0

Operación: Rd ← $FF - Rd

Operandos: Ninguno

Operandos: 0 ≤ d ≤ 31

Descripción: Pone a cero la bandera de resultado cero Z del registro de estado SREG.

Descripción: Realiza el complemento a uno del registro Rd. Banderas afectadas:

Banderas afectadas: V: Se pone a cero. 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 pone a uno.

Z: Se pone a cero Ejemplo: ADD r2, r3 CLZ

; Suma r3 a r2 ; Borra la bandera Z

Ejemplo:

prueba:

18

COM r4 ; Realiza el complemento a uno de r4 BREQ prueba ; brinca si la bandera Z está en uno. ... NOP ; Destino de desvío (No hacer nada)

CP Compara

CPC Compara con acarreo

Sintaxis: CP Rd, Rr

Sintaxis: CPC Rd, Rr

Operación: Rd -Rr

Operación: Rd –Rr -C

Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31

Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31

Descripción: Efectúa una comparación entre dos registros Rd y Rr. Ninguno de los registros es cambiado. Todos los desvíos condicionales pueden usarse después de esta instrucción.

Descripción: Realiza una comparación entre dos registros Rd y Rr y también se toma en cuenta el estado de la bandera C previo. 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á. V: Se activa si ocurre un desbordamiento del complemento a dos 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 $00, de lo contrario se borrará. C: Se activa si el valor absoluto del contenido de Rr es mayor que el contenido de Rd, de lo contrario se borrará.

H: Se activa si hay un acarreo negativo del bit 3, de lo contrario se borrará. V: Se activa si ocurre un desbordamiento del complemento a dos 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: El valor previo permanece sin cambio cuando el resultado es cero, de lo contrario se borrará. C Estará a uno si el valor absoluto del contenido de Rr + C, es mayor que el contenido de Rd, de lo contrario se borrará.

Ejemplo:

noteq:

CP r4, r19 BRNE noteq ... NOP

; Comparar r4 con r19 ; Desvía si la bandera Z está activa.

Ejemplo:

; Destino de desvío (No hacer nada)

noteq:

CP r2, r0 CPC r3, r1 BRNE noteq ... NOP

; Comparar r3:r2 con r1:r0 ; Compara el byte bajo ; Compara el byte alto ; Desvía si la bandera Z está activa ; Destino de desvío( no hacer nada)

CPI Compara un registro con dato inmediato

CPSE Compara y saltar si es igual

Sintaxis: CPI Rd, K

Sintaxis: CPSE Rd, Rr

Operación: Rd -K

Operación: Si Rd = Rr entonces PC ← PC + 2 ( o 3) Si Rd ≠ Rr entonces PC ← PC + 1

Operandos: 16 ≤ d ≤ 31, 0 ≤ K ≤ 255 Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 Descripción: Efectúa una comparación entre el registro Rd y un dato inmediato. El registro no es cambiado. Todos los desvíos condicionales pueden usarse después de esta instrucción.

Descripción: Ejecuta una comparación entre dos registros Rd y Rr, y si Rd ≠ Rr entonces la siguiente instrucción se ejecuta de lo contrario la siguiente instrucción es brincada.

Banderas afectadas: Banderas afectadas: Ninguna H: Se activa si hay un acarreo negativo del bit 3, de lo contrario se borrará. V: Se activa si ocurre un desbordamiento del complemento a dos 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 $00, de lo contrario se borrará. C: Se activa si el valor absoluto del contenido de K es mayor que el contenido de Rd, de lo contrario se borrará.

Ejemplo: INC r4 CPSE r4, r0 NEG r4 NOP

Ejemplo:

error:

CPI r19,3 BRNE error ... NOP

; Comparar r19 con 3 ; Desvía si la bandera Z está activa ; Destino de desvío (No hacer nada)

19

; Incrementar r4 ; Comparar r4 con r0 ; Sólo ejecutar si r4 ≠ r0 ; Continuar (No hacer nada)

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 por la operación. Al funcionar con números sin signo, sólo se puede esperar que funcionen de forma consistente las instrucciones BREQ y BRNE. Al operar con valores en complemento a dos todas las instrucciones de desvío están disponibles.

Descripción: Se realiza el XOR lógico entre el contenido del registro Rd y del registro Rr; deja el resultado en el registro destino Rd. Banderas afectadas: V: Se pone a cero. 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á.

Banderas afectadas: V: Se activa si ocurre un desbordamiento del complemento a dos como resultado de la operación, de lo contrario se borrará. Un desbordamiento del complemento a dos ocurrirá si y sólo si Rd era $80 antes de la operación. 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: EOR r4, r4 EOR r0, r22

; Borrar r4 ; OR exclusiva entre r0 y r22

Ejemplo: Loop:

LDI r17, $10 ADD r1, r2 DEC r17 BRNE loop NOP

; Cargar constante en r17 ; Sumar r2 a r1 ; Decrementar r17 ; Desvío si r17 ≠ 0 ; Continuar (No hacer nada)

ICALL llamada indirecta a subrutina

IJMP Salto indirecto

Sintaxis: ICALL

Sintaxis: IJMP

Operación: PC (15:0) ← Z (15:0)

Operación: PC ← Z(15:0)

Operandos: Ninguno

Operandos: Ninguno

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 permite saltos hacia los 64K words (128K bytes) más bajos de la sección de memoria de programa. La instrucción no está disponible para todos los modelos de AVR’s.

Descripción: Realiza una llamada indirecta a una subrutina apuntada por el registro puntero Z. El registro puntero Z es de 16 bit y permite la llamada a subrutina dentro de los 64K words (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 esquema de post-decremento.

Banderas afectadas: Ninguna Ejemplo:

Banderas afectadas: Ninguna MOV r30, r0 IJMP

Ejemplo: MOV r30, r0 ICALL

; Poner offset a la tabla de llamada ; Rutina de llamada que apunta a r31:r30

20

; Poner offset a la tabla de salto ; Saltar a la rutina apuntada por r31:r30

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

Operandos: 0 ≤ d ≤ 31, 0 ≤ P ≤ 63

Operandos: 0 ≤ d ≤ 31

Descripción: Carga un dato proveniente del bloque de registros I/O (Puertos, Timers, registros de configuración, etc.) en el registro de trabajo Rd.

Descripción Se incrementa en uno al contenido del registro Rd y deja el resultado en el registro Rd. La bandera C de SREG no es afectada por la operación. Al funcionar con números sin signo, sólo se puede esperar que funcionen de forma consistente las instrucciones BREQ y BRNE. Al operar con valores en complemento a dos todas las instrucciones de desvío están disponibles.

Banderas afectadas: Ninguna Ejemplo: IN r25, $16 CPI r25,4

exit:

BREQ exit ... NOP

; Carga en r25 el ;dato ;contenido en Puerto B ; Comparar el valor de r25 con ; un dato inmediato ; Desvía si r25 = 4

Banderas afectadas: V: Se activa si ocurre un desbordamiento del complemento a dos como resultado de la operación, de lo contrario se borrará. Un desbordamiento del complemento a dos ocurrirá si y sólo si Rd era $7F antes de la operación. 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á.

; Destino de desvío

Ejemplo: loop:

CLR r22 INC r22 ... CPI r22, $4F BRNE loop NOP

; Borrar r22 ; Incrementar r22 ; Comparar r22 con $4f ; Desvío si no son iguales ; Continuar (No hacer nada)

JMP Salto

LDI Carga de un dato inmediato

Sintaxis: JMP k

Sintaxis: LDI Rd, K

Operación: PC ← k

Operación: Rd ← K

Operandos: 0 ≤ k ≤ 4M

Operandos: 16 ≤ Rd ≤ 31, 0 ≤ K ≤ 255

Descripción: Ejecuta un salto a cualquier posición de la memoria de programa. La instrucción no es disponible para todos los modelos de AVRs.

Descripción: Carga un dato inmediato de 8-bits en cualquiera de los registros de trabajo a partir de R16 hasta R31. Banderas afectadas: Ninguna

Banderas afectadas: Ninguna Ejemplo: Ejemplo:

lejos:

MOV r1, r0 JMP lejos … nop

CLR r31 LDI r30, $F0 LPM

; Copia r0 en r1 ; Salto incondicional ; Destino de salto

21

; Borra el byte alto de Z ; Pone el byte bajo de Z a $F0 ; Carga una constante de la memoria ; de programa apuntada por Z

LD Carga indirecta usando X El resultado de estas combinaciones es indefinido:

Sintaxis: LD Rd, X LD Rd, X+ LD Rd, -X Operación: Rd ← (X) Rd ← (X), X ← X+1 X ← X–1, Rd ← (X)

LD r26, X+ LD r27, X+

X: Sin cambios X: Con post-incremento X: Con pre-decremento

LD r26, -X LD r27, -X

Operandos: 0 ≤ d ≤ 31

Algunas variantes de esta instrucción no son disponibles para todos los modelos de AVR’s.

Descripción Se carga un byte de manera indirecta procedente del área de datos hacia un registro de trabajo. Para los dispositivos con SRAM, el área de datos se compone de los registros de: trabajo, I/O y SRAM interna (y SRAM externa si es aplicable). Para los dispositivos sin SRAM, el espacio de datos se compone sólo por los registros de trabajo. La EEPROM tiene un espacio de dirección separado.

Banderas afectadas: Ninguna Ejemplo: CLR r27 LDI r26, $60 LD r0, X+

La dirección de los datos es apuntado por el registro puntero X (16 bits). Se limita el acceso de memoria al segmento de datos de 64K bytes. Para acceder a otro segmento de datos en dispositivos con más de 64K bytes de datos de espacio, el registro I/O RAMPX tiene que ser correctamente configurado.

LD r1, X LDI r26, $63 LD r2, X LD r3, -X

El registro puntero X 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 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.

; Borra el byte alto de X ; Pone el byte bajo de X a $60 ; Carga en r0 el dato de la localidad $60 ;(X post-incrementado) ; Carga en r1 el dato contenido en la ; localidad $61 ; Pone el byte bajo de X a $63 ; Carga en r2 el dato de la localidad $63 ; Cargar en r3 el dato de la localidad $62 ;(X pre-decremento)

LD (LDD) Carga indirecta usando Y El resultado de estas combinaciones es indefinido:

Sintaxis: LD Rd, Y LD Rd, Y+ LD Rd, -Y LDD Rd, Y+q Operación: Rd ← (Y) Rd ← (Y), Y ← Y+1 Y ← Y–1, Rd ← (Y) Rd ← (Y+q)

LD r28, Y+ LD r29, Y+ Y: Sin cambios Y: Con post-incremento Y: Con pre-decremento Y: Sin cambios, q: Desplazamiento

LD r28, -Y LD r29, -Y Algunas variantes de esta instrucción no son disponibles para todos los modelos de AVR’s.

Operandos: 0 ≤ d ≤ 31, 0 ≤ q ≤ 63 Descripción Se carga un byte de manera indirecta procedente del área de datos hacia un registro de trabajo. Para los dispositivos con SRAM, el área de datos se compone de los registros de: trabajo, I/O y SRAM interna (y SRAM externa si es aplicable). Para los dispositivos sin SRAM, el espacio de datos se compone sólo por los registros de trabajo. La EEPROM tiene un espacio de dirección separado.

Banderas afectadas: Ninguna

La dirección de los datos es apuntado por el registro puntero Y (16 bits). Se limita el acceso de memoria al segmento de datos de 64K bytes. Para acceder a otro segmento de datos en dispositivos con más de 64K bytes de datos de espacio, el registro I/O RAMPY tiene que ser correctamente configurado.

LD r1, Y LDI r28, $63 LD r2, Y LD r3,-Y

Ejemplo: CLR r29 LDI r28, $60 LD r0, Y+

LDD r4, Y+2

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

; Borra el byte alto de Y ; Pone el byte bajo de Y a $60 ; Carga en r0 el dato de la localidad $60 ; (Y post-incrementado) ; Carga en r1 el dato de la localidad $61 ; Pone el byte bajo de Y a $63 ; Carga en r0 el dato de la localidad $63 ; Carga en r0 el dato de la localidad $62 ; (Y pre-decrementado) ; Carga en r4 el dato de la localidad $64

LD (LDD) Carga indirecta usando Z Sólo el byte bajo del puntero Z 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.

Sintaxis: LD Rd, Z LD Rd, Z+ LD Rd, -Z LDD Rd, Z+q Operación: Rd ← (Z) Rd ← (Z), Z ← Z+1 Z ← Z – 1, Rd ← (Z) Rd ← (Z+q)

El resultado de estas combinaciones es indefinido:

Z: Sin cambios Z: Con post-incremento Z: Con pre-decremento Z: Sin cambios, q: Desplazamiento

LD r30, Z+ LD r31, Z+

Operandos: 0 ≤ d ≤ 31, 0 ≤ q ≤ 63

LD r30, -Z

Descripción Se carga un byte de manera indirecta procedente del área de datos hacia un registro de trabajo. Para los dispositivos con SRAM, el área de datos se compone de los registros de: trabajo, I/O y SRAM interna (y SRAM externa si es aplicable). Para los dispositivos sin SRAM, el espacio de datos se compone sólo por los registros de trabajo. La EEPROM tiene un espacio de dirección separado.

LD r31, -Z Algunas variantes de esta instrucción no son disponibles para todos los modelos de AVR’s. Banderas afectadas: Ninguna Ejemplo:

La dirección de los datos es apuntado por el registro puntero Z (16 bits). Se limita el acceso de memoria al segmento de datos de 64K bytes. Para acceder a otro segmento de datos en dispositivos con más de 64K bytes de datos de espacio, el registro I/O RAMPX tiene que ser correctamente configurado.

CLR r31 LDI r30, $60 LD r0, Z+ LD r1, Z LDI r30, $63 LD r2, Z LD r3,-Z

El registro puntero Z 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; Sin embargo, debido a que este puntero puede usarse para las llamadas indirectas a subrutinas y los saltos indirectos, es mejor usar a los punteros X o Y para direccionar al puntero de pila. .

LDD r4, Z+2

; Borra el byte alto de Z ; Pone el byte bajo de Z a $60 ; Carga en r0 el dato de la localidad $60 ; (Z post-incrementado) ; Carga en r1 el dato de la localidad $61 ; Pone el byte bajo de Z a $63 ; Carga en r0 el dato de la localidad $63 ; Carga en r0 el dato de la localidad $62 ; (Z pre-decrementado) ; Carga en r4 el dato de la localidad $64

LDS Carga directa desde SRAM

LPM Carga memoria de programa

Sintaxis: LDS Rd, k

Sintaxis: LPM LPM Rd, Z LPM Rd, Z+

Operación: Rd ← (k) Operandos: 0 ≤ d ≤ 31, 0 ≤ k ≤ 65535

Operación: R0 ← (Z) Z: Sin cambio, R0 implícito Rd ← (Z) Z: Sin cambio Rd ← (Z), Z ← Z + 1 Z: Post-incrementado

Descripción: Carga un byte del espacio de memoria de datos a un registro de trabajo. Para los dispositivos con SRAM, el espacio de datos está compuesto por los registros de trabajo, memoria de I/O y SRAM interna (y SRAM externa si es aplicable). Para los dispositivos sin SRAM, el espacio de datos está compuesto sólo por los registros de trabajo. La EEPROM tiene un espacio de direcciones separado. Debe proporcionarse una dirección de 16-bit. Se limita el acceso de memoria al segmento de datos de 64K bytes. Para acceder a otro segmento de datos en dispositivos con más de 64K bytes de datos de espacio, el registro I/O RAMPD tiene que ser correctamente configurado.

Operandos: 0 ≤ d ≤ 31 Descripción: Se carga un byte apuntado por el registro Z en el registro R0. La memoria de programa está organizada en palabra (word) de 16-bits; el bit menos significativo del puntero Z selecciona el byte bajo (0) o el byte alto (1). Esta instrucción puede dirigirse a los primeros 64K bytes (32K words) de memoria de programa. El registro puntero Z queda inalterado por el funcionamiento. Banderas afectadas: Ninguna

Banderas afectadas: Ninguna Esta instrucción no es disponible para todos los modelos de AVR’s.

Esta instrucción no es disponible para todos los modelos de AVR’s.

Ejemplo: Ejemplo: LDS r2, $FF00 ADD r2, r1 STS $FF00, r2

CLR r31 LDI r30, $F0 LPM

; Carga r2 con el contenido de la localidad ; $FF00 de la memoria de datos ; Sumar r1 a r2 ; Escribir en SRAM el contenido de r2

23

; Borrar el byte alto de Z ; Poner a cero el byte bajo de Z ; Cargar la constante de la ;memoria de programa ;apuntada por Z (r31:r30)

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 izquierda. El bit 7 se carga en la bandera C de SREG. Prácticamente esta operación multiplica por dos al contenido de Rd.

Descripción: Desplaza todos los bits de Rd una posición hacia la derecha. En el bit 7 se carga un cero, en la bandera C se carga el LSB de Rd. Prácticamente esta operación divide entre dos al contenido de Rd.

Banderas afectadas:

Banderas afectadas:

H: Se activa si hay un acarreo del bit 3, de lo contrario se borrará. S: N ⊕ C, para prueba de signo V: N ⊕ C (para N y C después del desplazamiento) 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 antes del desplazamiento el MSB del Rd está a uno, de lo contrario se borrará.

S: N ⊕ C, para prueba de signo V: N ⊕ C (para N y C después del desplazamiento) N: Se pone a cero Z: Se activa si el resultado es $00, de lo contrario se borrará. C: Se activa si el LSB de Rd antes del desplazamiento estaba a uno. Ejemplo: ADD r0, r4 LSR r0

Ejemplo: ADD r0, r4 LSL r0

; Sumar r4 a r0 ; Dividir a r0 entre 2

; Sumar r4 a r0 ; Multiplicar r0 por 2

MOV Copia de registros

MOVW Copia de registros de palabra

Sintaxis: MOV Rd, Rr

Sintaxis: MOVW Rd + 1: Rd, Rr + 1: Rr

Operación: Rd ← Rr

Operación: Rd + 1: Rd ← Rr + 1: Rr

Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31

Operandos: d Є {0,2,…,30}

Descripción: Efectúa una copia de un registro en otro registro. El registro fuente Rr permanece sin cambiar, mientras el registro destino Rd es cargado con una copia de Rr.

Descripción: Efectúa una copia de un par de registros en otro par de registros. Los registros fuente Rr permanecen sin cambiar, mientras los registros destino Rd son cargados con una copia de Rr.

r Є {0,2,…,30}

Banderas afectadas: Ninguna Banderas afectadas: Ninguna Ejemplo:

check:

MOV r16,r0 CALL check ... CPI r16,$11 ... RET

Esta instrucción no es disponible para todos los modelos de AVR’s.

; Copiar r0 en r16 ; Llamada a subrutina

Ejemplo: ; Comparar r16 con $11 ; Retorno de subrutina check:

24

MOVW r17:r16,r1:r0 ; Copiar r1:r0 en r17:r16 CALL check ; Llamada a subrutina ... CPI r16, $11 ; Comparar r16 con $11 ... RET ; Retorno de subrutina

MUL Multiplicación sin signo

MULS Multiplicación con signo

Sintaxis: MUL Rd, Rr

Sintaxis: MULS Rd, Rr

Operación: R1:R0 ← Rd x Rr

Operación: R1:R0 ← Rd x Rr

Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31

Operandos: 16 ≤ d ≤ 31, 0 ≤ r ≤ 16

Descripción: El multiplicando Rd y el multiplicador Rr son registros con números sin signo. El resultado sin signo es de 16bit y se coloca la parte más significativa del resultado en registro R1 y la menos significativa en R0. Si el multiplicando y el multiplicador son R1 y R0 el resultado se sobrescribirá en ellos.

Descripción: El multiplicando Rd y el multiplicador Rr son registros con números signados. El resultado con signo es de 16bit y se coloca la parte más significativa del resultado en registro R1 y la menos significativa en R0.

Banderas afectadas: Banderas afectadas: C: Se pone a uno si el bit 15 del resultado está a uno. Z: Se pone a uno si el resultado es cero.

C: Se pone a uno si el bit 15 del resultado está a uno. Z: Se pone a uno si el resultado es cero.

Esta instrucción no es disponible para todos los modelos de AVR’s.

Esta instrucción no es disponible para todos los modelos de AVR’s.

Ejemplo: Ejemplo: MUL r5, r4 MOVW r4, r0

MUL r21 r20 MOVW r20, r0

; Multiplica R5 con R4 ; Copia el resultado en R5: R4

; Multiplica R21 con R20 ; Copia el resultado en R21: R20

NEG Complemento a dos

NOP No operación

Sintaxis: NEG Rd

Sintaxis: NOP

Operación: Rd ← $00 - Rd

Operación: Ninguna

Operandos: 0 ≤ d ≤ 31

Operandos: Ninguno

Descripción: Cambia el contenido del registro Rd con su complemento a dos; el valor $80 se deja sin cambiar.

Descripción: Consume un ciclo sin realizar operaciones. 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). V: Se activa si ocurre un desbordamiento del complemento a dos de la resta implícita de cero, de lo contrario se borrará. Un desbordamiento del complemento a dos ocurrirá si y sólo si el contenido del registro después de la operación es $80. 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.

CLR r16 SER r17 OUT $18, r16 NOP OUT $18, r17

Ejemplo:

prueba:

SUB r11, r0 ; Restar r0 de r11 BRPL prueba ; Desvío si la bandera N está a cero. NEG r11 ; Realizar el complemento a dos de r11 NOP ; Destino de desvío (No hacer nada)

25

; Borrar r16 ; Poner a uno r17 ; Escribir ceros en el Puerto B ; Esperar (No hacer nada) ; Escribir unos en el Puerto B

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 destino Rd.

Descripción: Se realiza el OR lógico entre el contenido del 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 contrario se borrará. Z: Se activa si el resultado es $00, de lo contrario se borrará.

V: Se pone a cero. 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: OR r15, r16 BST r15, 6 BRTS ok

; Hacer OR lógico entre registros ; Almacena el bit 6 de r15 en el flag T ; Desvío si el flag T está a uno

NOP

; Destino de desvío (No hacer nada)

Ejemplo: ORI r16, $F0 ORI r17, 1

... ok:

; Poner a uno el nibble alto de r16 ; Poner a uno el bit 0 de r17

OUT Cargar en I/O un registro de trabajo

POP Sacar registro de la pila

Sintaxis: OUT P, Rr

Sintaxis: POP Rr

Operación: P ← Rr

Operación: Rr ← STACK

Operandos: 0 ≤ r ≤ 31, 0 ≤ P ≤ 63

Operandos: 0 ≤ r ≤ 31

Descripción: Carga en un registro del bloque I/O el contenido de un registro trabajo.

Descripción: Carga el registro Rd con un byte de la pila. El puntero de pila es incrementado en uno antes del POP

Banderas afectadas: Ninguna

Banderas afectadas: Ninguna

Ejemplo:

Esta instrucción no es disponible para todos los modelos de AVR’s.

CLR r16 SER r17 OUT $18, r16 NOP OUT $18, r17

; Borrar r16 ; Poner a unos r17 ; Escribir ceros en el Puerto B ; Esperar (No hacer nada) ; Escribir unos en el Puerto B

Ejemplo:

routine:

26

CALL routine ... PUSH r14 PUSH r13 ... POP r13 POP r14 RET

; Llamar a subrutina ; Guardar r14 en la pila ; Guardar r13 en la pila ; Restaurar r13 ; Restaurar r14 ; Retorno de subrutina

PUSH Guardar registro en la pila

RCALL llamada relativa a subrutina

Sintaxis: PUSH Rr

Sintaxis: RCALL k

Operación: STACK ← Rr

Operación: PC ← PC + k + 1

Operandos: 0 ≤ r ≤ 31

Operandos: -2K ≤ k ≤ 2K

Descripción: Guarda el contenido del registro Rr en la pila. El puntero de pila es post-decrementado en uno después del PUSH

Pila: Stack ← PC + 1 :

Descripción: Realiza una llamada relativa a una dirección que se encuentra dentro de PC - 2K + 1 y PC +2K (words, palabra). En ensamblador, se usan etiquetas en lugar de operadores relativos. Para los microcontroladores AVR con memoria de programa que no excede 4K words (8K bytes) esta instrucción puede direccionar a toda la memoria desde cualquier posición. El SP (puntero de pila) utiliza durante el RCALL un esquema de postdecremento.

Banderas afectadas: Ninguna Esta instrucción no es disponible para todos los modelos de AVR’s. Ejemplo:

routine:

CALL routine ... PUSH r14 PUSH r13 ... POP r13 POP r14 RET

SP ← SP -2 (2 Bytes)

; Llamar a subrutina Banderas afectadas: Ninguna ; Guardar r14 en la pila ; Guardar r13 en la pila

Ejemplo:

; Restaurar r13 ; Restaurar r14 ; Retorno de subrutina

routine:

RCALL routine ... PUSH r14 ... POP r14 RET

; Llamada a subrutina ; Guardar r14 en la pila ; Restaurar r14 ; Retorno de subrutina

RET Retorno de subrutina

RETI Retorno de interrupción

Sintaxis: RET

Sintaxis: RETI

Operación: PC ← Stack

Operación: PC ← Stack

Operandos: Ninguno

Operandos: Ninguno

Pila: SP ← SP + 2 (bytes)

Pila: SP ← SP + 2 (bytes)

Descripción: Efectúa un retorno de subrutina. La dirección de retorno es cargada de la pila. El SP (puntero de pila) utiliza durante el RET un esquema de post-incremento.

Descripción: Realiza un retorno de una interrupción. La dirección de retorno es cargada desde la pila; la bandera I de SREG (interrupción global) se pone a uno. El registro de estado no se guarda automáticamente al entrar en una rutina de interrupción, y no se restaura al volver de la rutina interrupción. De ser necesario el programa debe incluir una rutina para manejar adecuadamente esta situación. El puntero de pila usa un esquema de pre-incremento durante el RETI.

Banderas afectadas: Ninguna Ejemplo:

routine:

CALL routine ... PUSH r14 ... POP r14 RET

; Llamada a subrutina Banderas afectadas: ; Guardar r14 en la pila I: Se pone a uno. ; Restaurar r14 ; Retorno de subrutina

Ejemplo: ... extint:

27

PUSH r0 ; Guardar r0 en la pila ... POP r0 ; Restaurar r0 RETI ; Retorno y habilitación de interrupciones

RJMP Salto relativo

ROL Desplazamiento a la izquierdo con acarreo

Sintaxis: RJMP k

Sintaxis: ROL Rd

Operación: PC ← PC + k + 1

Operación:

Operandos: -2K ≤ k ≤ 2K

Operandos: 0 ≤ d ≤ 31

Descripción: Ejecuta un salto relativo a una dirección que se encuentra dentro de PC - 2K + 1 y PC +2K. En ensamblador, se usan etiquetas en lugar de operadores relativos. Para los microcontroladores AVR con memoria de programa que no excede 4K words (8K bytes) esta instrucción puede dirigirse a toda la memoria desde cualquier posición de dirección.

Descripción: Desplaza todos los bits de Rd una posición hacia la izquierda. La bandera C se desplaza al bit 0 de Rd. El bit 7 se desplaza hacia la bandera C. Esta operación combinada con LSL, multiplica por dos a valores multi-byte con o sin signo.

Banderas afectadas: Ninguna

H: Se activa si hay un acarreo del bit 3, de lo contrario se borrará. S: N ⊕ C, para prueba de signo V: N ⊕ C (para N y C después del desplazamiento) 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 antes del desplazamiento el MSB del Rd está a uno, de lo contrario se borrará.

Banderas afectadas:

Ejemplo:

error: ok:

CPI r16, $42 BRNE error RJMP ok ADD r16, r17 INC r16 NOP

; Compara r16 con $42 ; Desvío si r16 ≠ $42 ; Salto incondicional ; Suma r17 a r16 ; Incrementa r16 ; Destino de RJMP

Ejemplo: LSL r18 ROL r19 BRCS oneenc

; Multiplica r19:r18 por dos ; r19:r18 es un entero de dos ;bytes -con o sin signo; Desvía si C está a uno

NOP

; Destino de desvío

... oneenc:

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 derecha. La bandera C se desplaza al bit 7 de Rd. El bit 0 se desplaza hacia la bandera C. Esta operación combinada con LSR divide entre dos a valores multi-byte con o sin signo.

Descripción: Resta dos registros y resta la bandera C; deja el resultado en el registro Rd.

Banderas afectadas:

H: Se activa si había un acarreo negativo (Borrow) del bit 3, de lo contrario se borrará (cero). V: Se activa si ocurre un desbordamiento del complemento a dos 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: El estado anterior permanece sin cambio cuando el resultado es cero, de lo contrario se borrará. C: Se activa si el valor absoluto del contenido de Rr + el acarreo previo es mayor que el valor absoluto de Rd, de lo contrario se borrará.

Banderas afectadas:

S: N ⊕ C, para prueba de signo V: N ⊕ C (para N y C después del desplazamiento) 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á. C: Se activa antes del desplazamiento el LSB de Rd estaba a uno. Ejemplo: ADD r0, r4 LSL r0

; Sumar r4 a r0 ; Multiplicar r0 por 2

Ejemplo: SUB r2, r0 SBC r3, r1

28

; Restar r1:r0 de r3:r2 ; Restar el byte bajo ; Restar con acarreo el byte alto

SBCI Resta a un registro una constante y el acarreo

SBI Poner a uno un bit del registro I/O 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 bloque I/O. Esta operación funciona en los 32 registros de I/O más bajos. Direcciones de $00 a $1F.

Descripción: Resta una constante con un registro y con la bandera C; deja el resultado en el registro destino Rd. . Banderas afectadas:

Banderas afectadas: Ninguna Ejemplo:

H: Se activa si había un acarreo negativo (Borrow) del bit 3, de lo contrario se borrará (cero). V: Se activa si ocurre un desbordamiento del complemento a dos 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: El estado anterior permanece sin cambio cuando el resultado es cero, de lo contrario se borrará. C: Se activa si el valor absoluto del contenido de Rr + el acarreo previo es mayor que el valor absoluto de Rd, de lo contrario se borrará.

OUT $1E, r0 SBI $1C, 0 IN r1, $1D

; Escribir la dirección de EEPROM ; Poner a uno el bit 0 de EECR ; Leer datos de EEPROM

Ejemplo: SUBI r16, $23 SBCI r17, $4F

; Resta $4F23 de r17:r16 ; Restar el byte bajo ; 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

Operación: Si I/O(P,b) = 0 entonces PC ← PC + 2 ( o 3) Si I/O(P,b) ≠ 0 entonces PC ← PC + 1

Operación: Si I/O(P,b) = 1 entonces PC ← PC + 2 ( o 3) Si I/O(P,b) ≠ 1 entonces PC ← PC + 1

Operandos: 0 ≤ P ≤ 31, 0 ≤ b ≤ 7

Operandos: 0 ≤ P ≤ 31, 0 ≤ b ≤ 7

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 funciona en los 32 registros de I/O más bajos, direcciones 0-31).

Descripción: Examina un bit del registro de I/O seleccionado y 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).

Banderas afectadas: Ninguna

Banderas afectadas: Ninguna

Ejemplo:

Ejemplo:

espera:

SBIC $1C, 1 RJMP espera NOP

; Saltar próxima instrucción si ; EEWE* está borrado ; Escritura de EEPROM no ; terminada ; Continuar (No hacer nada)

espera:

SBIS $10, 0 RJMP espera NOP

* EEWE es el bit 1 del registro EECR (Registro de Control de la memoria EEprom) mapaeado en la localidad $1C de la memoria RAM.

29

; Saltar la siguiente instrucción ; si el bit 0 en el Puerto D está a uno ; Bit 0 borrado ; Continuar (No hacer nada)

SBIW Resta un dato inmediato a un registro de palabra

SBR Pone a uno los bits del registro 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 indicarlo de las siguientes maneras: XH:XL o sólo a XL; YH:YL o sólo a YL; ZH:ZL o sólo es a ZL. También podemos utilizar 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 R25:R24 al que también podemos indicar como R24.

Descripción: Pone a uno los bits del registro Rd indicados. Realiza la operación ORI lógica entre el contenido del registro Rd y una constante K, y deja el resultado en el registro destino Rd. Banderas afectadas:

Descripción: SBIW resta un valor K a un par de registros y deja el resultado en el par de registros

V: Se pone a cero. 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á.

Banderas afectadas:

Ejemplo:

S: Se activa sólo si una de las banderas V o N está a uno. V: Se activa si ocurre un desbordamiento del complemento a dos 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á.

SBR r16, 3 SBR r17, $F0

Operando2: 0≤ K ≤ 63

; Poner a uno los bits 0 y 1 de r16 ; Poner a uno los 4 MSB en r17

Ejemplo: SBIW r24, 1 SBIW r28, 63

; Restar 1 de r25:r24 ; Restar 63 del puntero Y (r29:r28)

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

Operación: Si Rr(b) = 0 entonces PC ← PC + 2 ( o 3) Si Rr(b) ≠ 0 entonces PC ← PC + 1

Operación: Si Rr(b) = 1 entonces PC ← PC + 2 ( o 3) Si Rr(b) ≠ 1 entonces PC ← PC + 1

Operandos: 0 ≤ r ≤ 31, 0 ≤ b ≤ 7

Operandos: 0 ≤ r ≤ 31, 0 ≤ b ≤ 7

Descripción: Examina un bit del registro seleccionado y salta la siguiente instrucción si el bit está borrado (cero).

Descripción: Examina un bit del registro seleccionado y salta la siguiente instrucción si el bit está a uno.

Banderas afectadas: Ninguna

Banderas afectadas: Ninguna

Ejemplo:

Ejemplo:

SUB r0, r1 SBRC r0, 7 SUB r0, r1 NOP

; Restar r1 de r0 ; Saltar si el bit 7 en r0 está borrado ; Sólo se ejecuta si el bit 7 en r0 es uno ; Continuar (No hacer nada)

SUB r0, r1 SBRS r0, 7 SUB r0, r1 NOP

30

; Restar r1 de r0 ; Saltar si el bit 7 en r0 está a uno ; Sólo se ejecuta si el bit 7 en r0 es cero ; Continuar (No hacer nada)

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

Operandos: Ninguno

Operandos: Ninguno

Descripción: Pone a uno la bandera de acarreo C del registro de estado SREG.

Descripción: Pone a uno la bandera de medio acarreo H del registro de estado SREG.

Banderas afectadas:

Banderas afectadas:

C: Se pone a uno

H: Se pone a uno

Ejemplo:

Ejemplo:

SEC ADC r0, 1

; Poner a uno la bandera de acarreo ; r0 = r0 + r1 + 1

SEH

; Poner a uno la bandera H

SEI Habilitar las interrupciones globales

SEN Poner a uno la bandera N

Sintaxis: SEI

Sintaxis: SEN

Operación: I ← 1

Operación: N ← 1

Operandos: Ninguno

Operandos: Ninguno

Descripción: Pone a uno la bandera de habilitación de interrupciones globales I del registro de estado SREG.

Descripción: Pone a uno la bandera de resultado negativo N del registro de estado SREG.

Banderas afectadas:

Banderas afectadas:

I: Se pone a uno

N: Se pone a uno

Ejemplo:

Ejemplo:

SEI SLEEP

; Interrupciones habilitadas ; Activación de modo SLEEP, esperando ; alguna interrupción

ADD r2, r19 SEN

31

; Sumar r19 a r2 ; Poner a uno la bandera N

SER Carga todos los bits de un registro

SES Pone a uno la bandera S

Sintaxis: SER Rd

Sintaxis: SES

Operación: Rd ← $FF

Operación: S ← 1

Operandos: 16 ≤ d ≤ 31

Operandos: Ninguno

Descripción: SER Carga directamente $FF al registro seleccionado.

Descripción: Pone a uno la bandera de signo S del registro de estado SREG.

Banderas afectadas: Ninguna

Banderas afectadas:

Ejemplo:

S: Se pone a uno

CLR r16 SER r17 OUT $18, r16 NOP OUT PORTB, r17

; Borrar r16 ; Poner a uno r17 ; Escribir ceros al Puerto B ; Retardo (No hacer nada) ; Escribir unos en el Puerto B

Ejemplo: ADD r2, r19 SES

; Sumar r19 a r2 ; Poner a uno la bandera S

SET Pone a uno la bandera T

SEV Pone a uno la bandera V

Sintaxis: SET

Sintaxis: SEV

Operación: T ← 1

Operación: V ← 1

Operandos: Ninguno

Operandos: Ninguno

Descripción: Pone a uno la bandera T del registro de estado SREG.

Descripción: Pone a uno la bandera de desbordamiento V del registro de estado SREG.

Banderas afectadas:

Banderas afectadas:

T: Se pone a uno

V: Se pone a uno

Ejemplo:

Ejemplo:

SET

ADD r2, r19 SEV

; Poner a uno la bandera T

32

; Sumar r19 a r2 ; Poner a uno la bandera V

SEZ Poner a uno la bandera Z

SLEEP Activar modo sleep

Sintaxis: SEZ

Sintaxis: SLEEP

Operación: Z ← 1

Operación: Consulta el manual del dispositivo para obtener una información detalla acerca de este modo de operación.

Operandos: Ninguno Operandos: Ninguno Descripción: Pone a uno la bandera de resultado cero Z del registro de estado SREG.

Descripción: Pone en modo Sleep al microcontrolador

Banderas afectadas:

Banderas afectadas: Ninguna

Z: Se pone a uno

Ejemplo:

Ejemplo:

MOV r0, r11 LDI r16, (1
View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF