INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

36
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é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

description

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

Transcript of INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

Page 1: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

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é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

Page 2: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

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

Page 3: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

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

Page 4: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

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

Page 5: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

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 desbordado

I: Bandera de interrupciones globales

RESUMEN DEL CONJUNTO DE INSTRUCCIONES

Instrucciones Aritméticas y Lógicas Mnemónico Operandos Descripción ADD Rd,Rr Suma sin acarreo ADC Rd,Rr Suma sin acarreo ADIW Rd, K Suma un inmediato a un registro de palabra SUB Rd,Rr Resta sin acarreo SUBI Rd,K Resta un inmediato SBC Rd,Rr Resta con acarreo SBCI Rd,K Resta un inmediato con acarreo AND Rd,Rr AND lógico ANDI Rd,K AND lógico con inmediato OR Rd,Rr OR lógico ORI Rd,K OR lógico con inmediato EOR Rd,Rr OR exclusivo COM Rd Complemento a uno NEG Rd Complemento a dos SBR Rd,K Pon a uno los bits de un registro CBR Rd,K Pon a cero los bits de un registro INC Rd Incrementa al registro DEC Rd Decrementa al registro TST Rd Revisa si es cero o menor CLR Rd Borra el registro SER Rd Carga los bits de un registro ADIW Rd+1:Rd,K Suma un inmediato a un registro de palabra SBIW Rd+1:Rd,K Resta un inmediato a un registro de palabra MUL Rd,Rr Multiplica sin signo MULS Rd,Rr Multiplica con signo MULSU Rd,Rr Multiplica signado con no signado

Instrucciones de desvío (salto) Mnemónicos Operandos Descripción RJMP k Salto relativo IJMP Ninguno Salto indirecto EIJMP Ninguno Salto indirecto extendido JMP k Salto RCALL k Llamada relativa a subrutina ICALL Ninguno Llamada indirecta a subrutina

5

Page 6: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

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

Instrucciones de Transferencia de Datos Mnemónicos Operandos Descripción MOV Rd,Rr Copia de registros MOVW Rd,Rr Copia registros de palabra LDI Rd,K Carga de un inmediato LDS Rd,k Carga directa LD Rd,X Carga indirecta LD Rd,X+ Carga indirecta con Post-Incremento LD Rd,-X Carga indirecta con Pre-Decremento LD Rd,Y Carga indirecta LD Rd,Y+ Carga indirecta con Post-Incremento LD Rd,-Y Carga indirecta con Pre-Decremento LDD Rd,Y+q Carga indirecta con desplazamiento LD Rd,Z Carga indirecta con LD Rd,Z+ Carga indirecta con Post-Incremento LD Rd,-Z Carga indirecta con Pre-Decremento LDD Rd,Z+q Carga indirecta con desplazamiento STS k,Rr Almacena directamente

6

Page 7: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

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

Instrucciones de Bit y prueba de Bit Mnemónicos Operandos Descripción LSL Rd Desplazamiento a la izquierda LSR Rd Desplazamiento a la derecha ROL Rd Rotación a la izquierda con acarreo ROR Rd Rotación a la derecha con acarreo ASR Rd Desplazamiento aritmético SWAP Rd Intercambio de nibbles BSET s Poner a uno la bandera BCLR s Poner a cero la bandera SBI P,b Poner a uno el bit de un registro I/O CBI P,b Poner a cero el bit de un registro I/O BST Rr,b Guarda en T el bit de un registro BLD Rd,b Carga T en el bit de un registro SEC Ninguno Poner a uno la bandera C CLC Ninguno Poner a cero la bandera C SEN Ninguno Poner a uno la bandera N CLN Ninguno Poner a cero la bandera N SEZ Ninguno Poner a uno la bandera Z CLZ Ninguno Poner a cero la bandera Z SEI Ninguno Poner a uno la bandera I CLI Ninguno Poner a cero la bandera I SES Ninguno Poner a uno la bandera S CLN Ninguno Poner a cero la bandera S SEV Ninguno Poner a uno la bandera V CLV Ninguno Poner a cero la bandera V SET Ninguno Poner a uno la bandera T CLT Ninguno Poner a cero la bandera T SEH Ninguno Poner a uno la bandera H CLH Ninguno Poner a cero la bandera H NOP Ninguno No operación SLEEP Ninguno Modo Sleep WDR Ninguno Reiniciar el Watchdog

7

Page 8: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

ADC Suma de dos registros con acarreo Sintaxis: ADC Rd, Rr Operación: Rd ← Rd + Rr + C 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. 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á. Ejemplo: ADC r1, r2 ; Suma r1, r2 y C

; el resultado lo pone en r1

ADD Suma de dos registros sin acarreo Sintaxis: ADD Rd, Rr Operación: Rd ← Rd + Rr Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 Descripción: Suma dos registros sin considerar la bandera C y deja el resultado en el registro destino Rd. 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á. Ejemplo: ADD r1, r2 ; Suma r2 a r1 (r1=r1+r2) ADD r28, r28 ; Suma r28 a sí mismo (r28=r28+r28)

ADIW Suma un dato inmediato a un registro de palabra Sintaxis: ADIW Rd+1:Rd,K Operación: Rd +1: Rd ← Rd+1: Rd + K 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. Operando2: 0≤ K ≤ 63 Descripción: Agrega un valor K a un par de registros y deja el resultado en el par de registros Banderas afectadas: 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 1 a R24 y en caso de que haya ; acarreo se lo suma a R25

AND Función lógica AND entre registros Sintaxis: AND Rd, Rr Operación: Rd ← Rd (AND) Rr Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 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á. Ejemplo: AND r2, r3 ; AND lógico entre r2 y r3, resultado en r2 LDI r16, 1 ; Poner 0000 0001 en r16 AND r2, r16 ; Aislar el bit 0 en r2

8

Page 9: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

ANDI Función lógica AND entre un registro y un dato inmediato Sintaxis: AND Rd, K Operación: Rd ← Rd (AND) K Operandos: 0 ≤ d ≤ 31, 0 ≤ K ≤ 255 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: 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: ANDI r17, $0F ; Borrar el nibble alto de r17 ANDI r18, $10 ; Aislar el bit 4 en r18 ANDI r19, $AA ; Borrar los bits impares de r19

ASR Desplazamiento aritmético a la derecha Sintaxis: ASR Rd

Operación: Operandos: 0 ≤ d ≤ 31 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. 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: 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 Sintaxis: BCLR s Operación: SREG(s) ← 0 Operandos: 0 ≤ s ≤ 7 Descripción: Pone a cero un bit específico del registro de banderas SREG. Banderas afectadas: 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: BCLR 0 ; Borrar la bandera C BCLR 7 ; Deshabilitar interrupciones

BLD Carga en un registro la bandera T Sintaxis: BLD Rd, b Operación: Rd(b) ← T Operandos: 0 ≤ d ≤ 31, 0 ≤ b ≤ 7 Descripción: Carga la bandera T del registro SREG en el bit b del registro Rd. Banderas afectadas: Ninguna Ejemplo: BST r1, 2 ; Guardar el bit 2 de r1 en la bandera T BLD r0, 4 ; Cargar T en el bit 4 de r0

9

Page 10: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

BRBC Brinca si el bit de SREG es cero Sintaxis: BRBC s, k Operación: Si SREG(s) = 0 entonces PC ← PC + k +1 Si SREG(s) = 1 entonces PC ← PC + 1 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. Banderas afectadas: Ninguna Ejemplo:

CPI r20, 5 ; Comparar r20 con el valor 5 BRBC 1, dife ; Salta si la bandera Z es cero

... dife: NOP ; Destino de desvío (No hacer nada)

BRBS Brinca si el bit de SREG está a set (uno) Sintaxis: BRBS s, k 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 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 Ejemplo:

BST r0, 3 ; Carga la bandera T con el bit 3 de r0 BRBS 6, salto ; Salta si el bit T está a uno

... salto: NOP ; Destino de desvío (No hacer nada)

BRCC Salta si la bandera C es cero Sintaxis: BRCS k Operación: Si C = 0 entonces PC ← PC + k + 1 Si C = 1 entonces PC ← PC + 1 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). Banderas afectadas: Ninguna Ejemplo:

ADD r22, r23 ; Suma r23 a r22 BRCC desvío ; Desvía si C está borrado

... desvío: NOP ; Destino de desvío

BRCS Salta si la bandera C está a set (uno) Sintaxis: BRCS k Operación: Si C = 1 entonces PC ← PC + k + 1 Si C = 0 entonces PC ← PC + 1 Operandos: -64 ≤ k ≤ 63 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 Ejemplo:

CPI r26, $56 ; Comparar r26 con $56 BRCS desvío ; Desvía si C está a uno

... desvío: NOP ; Destino de desvío

10

Page 11: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

BREAK Pausa Sintaxis: BREAK Operación: Pausa en la depuración Operandos: Ninguno 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. La instrucción no está disponible para todos los modelos de AVRs. Banderas afectadas: Ninguna

BREQ Salta si es igual Sintaxis: BREQ k Operación: Si Rd = Rr : Z = 1 entonces PC ← PC + k + 1 Si Rd ≠ Rr : Z = 0 entonces PC ← PC + 1 Operandos: -64 ≤ k ≤ 63 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). Banderas afectadas: Ninguna Ejemplo:

CP r1, r0 ; Comparar registros r1 y r0 BREQ igual ; Salta si Z=0 (los registros son iguales)

... igual: NOP ; Destino de desvío (No hacer nada)

BRGE Salta si es mayor o igual (con signo) Sintaxis: BRGE k Operación: Si Rd ≥ Rr : (N ⊕ V = 0) entonces PC ← PC + k + 1

Si Rd < Rr entonces PC ← PC + 1 Operandos: -64 ≤ k ≤ 63 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:

CP r11, r12 ; Comparar los registros r11 y r12 BRGE desvío ; Desvía si r11 ≥ r12 (con signo)

... desvío: NOP ; Destino de desvío

BRHC Salta si la bandera H está a cero Sintaxis: BRHS k Operación: Si H = 0 entonces PC ← PC + k + 1 Si H = 1 entonces PC ← PC + 1 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). Banderas afectadas: Ninguna Ejemplo:

BRHC desvio ; Desvío si la bandera H está a cero ... desvio: NOP ; Destino de desvío

11

Page 12: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

BRHS Salta si la bandera H está a uno Sintaxis: BRHS k Operación: Si H = 1 entonces PC ← PC + k + 1 Si H = 0 entonces PC ← PC + 1 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). Banderas afectadas: Ninguna Ejemplo:

BRHS desvio ; Desvío si la bandera H está a uno ... desvio: NOP ; Destino de desvío

BRID Salta si la bandera I está a cero Sintaxis: BRID k Operación: Si T = 0 entonces PC ← PC + k + 1 Si T = 1 entonces PC ← PC + 1 Operandos: -64 ≤ k ≤ 63 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 Ejemplo:

BRIE desvio ; Desvía si la bandera I está a cero ...

desvio: NOP ; Destino de desvío

BRIE Salta si la bandera I está a uno Sintaxis: BRIE k Operación: Si I = 1 entonces PC ← PC + k + 1 Si I = 0 entonces PC ← PC + 1 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). Banderas afectadas: Ninguna Ejemplo:

BRIE desvio ; Desvía si la bandera I está a uno ...

desvio: NOP ; Destino de desvío

BRLO Salta si es menor Sintaxis: BREQ k 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 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:

CP r1, r0 ; Comparar registros r1 y r0 BREQ igual ; Salta si Z=0 (los registros son iguales)

... igual: NOP ; Destino de desvío (No hacer nada)

12

Page 13: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

BRLT Salta si es menor (con signo) Sintaxis: BRLT k Operación: Si Rd ≥ Rr : (N ⊕ V = 1) entonces PC ← PC + k + 1

Si Rd < Rr entonces PC ← PC + 1 Operandos: -64 ≤ k ≤ 63 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:

CP r16, r1 ; Comparar los registros r16 con r1 BRLT desvío ; Desvía si r16 < r1 (con signo)

... desvío: NOP ; Destino de desvío (No hacer nada)

BRMI Salta si es negativo Sintaxis: BRMI k Operación: Si N = 1 entonces PC ← PC + k + 1 Si N = 0 entonces PC ← PC + 1 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). Banderas afectadas: Ninguna Ejemplo:

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

... desvío: NOP ; Destino de desvío

BRNE Salta si es diferente Sintaxis: BRNE k Operación: Si Rd = Rr : Z = 0 entonces PC ← PC + k + 1 Si Rd ≠ Rr : Z = 1 entonces PC ← PC + 1 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). Banderas afectadas: Ninguna Ejemplo:

EOR r27, r27 ; Borrar r27 loop: INC r27 ; Incrementar r27 ...

CPI r27,5 ; Comparar r27 con 5 BRNE loop ; Desvío si r27 ≠ 5 NOP ; Salida de Loop

BRPL Salta si es positivo Sintaxis: BRPL k Operación: Si N = 0 entonces PC ← PC + k + 1 Si N = 1 entonces PC ← PC + 1 Operandos: -64 ≤ k ≤ 63 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:

SUBI r26, $50 ; Restar $50 de r26 BRPL desvío ; Desvía si r26 es positivo

... desvío: NOP ; Destino de desvío

13

Page 14: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

BRSH Salta si es mayor o igual (sin signo) Sintaxis: BRSH k Operación: Si Rd ≥ Rr : C = 0 entonces PC ← PC + k + 1 Si Rd < Rr : C = 1 entonces PC ← PC + 1 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. Banderas afectadas: Ninguna Ejemplo:

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

... desvío: NOP ; Destino de desvío

BRTC Salta si la bandera T está a cero Sintaxis: BRTC k Operación: Si T = 0 entonces PC ← PC + k + 1 Si T = 1 entonces PC ← PC + 1 Operandos: -64 ≤ k ≤ 63 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:

BST r3, 5 ; cargar el bit 5 de r3 en la bandera T BRTS desvio ; Desvía si ese bit está a cero

... desvio: NOP ; Destino de desvío

BRTS Salta si la bandera T está a uno Sintaxis: BRTS k Operación: Si T = 1 entonces PC ← PC + k + 1 Si T = 0 entonces PC ← PC + 1 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). Banderas afectadas: Ninguna Ejemplo:

BST r3, 5 ; cargar el bit 5 de r3 en la bandera T BRTS desvio ; Desvía si ese bit está a uno

... desvio: NOP ; Destino de desvío

BRVC Salta si la bandera V está a cero Sintaxis: BRTC k Operación: Si V = 1 entonces PC ← PC + k + 1 Si V = 0 entonces PC ← PC + 1 Operandos: -64 ≤ k ≤ 63 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 Ejemplo:

ADD r3, r4 ; Suma el registro r4 a r3 BRVS desvio ; Desvía si no hay desbordamiento ...

desvio: NOP ; Destino de desvío

14

Page 15: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

BRVS Salta si la bandera V está a uno Sintaxis: BRVS k Operación: Si V = 1 entonces PC ← PC + k + 1 Si V = 0 entonces PC ← PC + 1 Operandos: -64 ≤ k ≤ 63 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: Ninguna Ejemplo:

ADD r3, r4 ; Suma el registro r4 a r3 BRVS desvio ; Desvía si hay desbordamiento ...

desvio: NOP ; Destino de desvío

BSET Poner a uno el bit de una bandera Sintaxis: BSET s Operación: SREG(s) ← 1 Operandos: 0 ≤ s ≤ 7 Descripción: Pone a uno un bit específico del registro de banderas SREG. Banderas afectadas: 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 Ejemplo: BSET 6 ; Poner a uno la bandera T BSET 7 ; Interrupción habilitada

BST Guarda en T el bit de un registro Sintaxis: BST Rd, b Operación: T ← Rd(b) Operandos: 0 ≤ d ≤ 31, 0 ≤ b ≤ 7 Descripción: Guarda el bit b del registro Rd en la bandera T del registro de SREG. Banderas afectadas: T: Se pone a uno si el bit b del registro Rd está a uno, de lo contrario se pone a cero. Ejemplo: BST r1, 2 ; Guardar el bit 2 de r1 en la bandera T BLD r0, 4 ; Cargar T en el bit 4 de r0

CALL llamada larga a subrutina Sintaxis: CALL k Operación: PC ← k Dispositivos con PC de 16 bits PC ← k Dispositivos con PC de 22 bits Operandos: 0 ≤ k ≤ 64K 0 ≤ k ≤ 4M Pila: Stack ← PC + 2 : SP ← SP -2 (2 Bytes) Stack ← PC + 2 : SP ← SP -3 (3 Bytes) 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. Banderas afectadas: Ninguna Ejemplo:

MOV r16, r0 ; Copiar r0 en r16 CALL check ; Llamado a subrutina

... check: CPI r16, $42 ; Compara r16 con un valor ; específico ...

BREQ error ; Salta si son iguales RET ; Retorno de subrutina …

error: RJMP error ; Ciclo infinito

15

Page 16: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

CBI Poner a cero un bit del registro I/O Sintaxis: CBI P, b Operación: (P, b) ← 1 Operandos: 0 ≤ P ≤ 31, 0 ≤ b ≤ 7 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. Banderas afectadas: Ninguna Ejemplo: CBI $12, 7 ; Poner a cero el bit 7 de Port D

CBR Pone a cero los bits del registro Sintaxis: CBR Rd, K Operación: Rd ← Rd AND ($FF – K) Operandos: 16 ≤ d ≤ 31, 0 ≤ K ≤ 255 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: 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: CBR r16, $F0 ; Borra el nibble alto de r16 CBR r18, 1 ; Borra el bit 0 de r18

CLC Poner a cero la bandera C Sintaxis: CLC Operación: C ← 0 Operandos: Ninguno Descripción: Pone a cero la bandera de acarreo C del registro de estado SREG. Banderas afectadas: C: Se pone a cero Ejemplo: ADD r0, r0 ; Sumar r0 a sí mismo CLC ; Borrar la bandera de acarreo

CLH Poner a cero la bandera H Sintaxis: CLH Operación: H ← 0 Operandos: Ninguno Descripción: Pone a cero la bandera de medio acarreo H del registro de estado SREG. Banderas afectadas: H: Se pone a cero Ejemplo: CLH ; Borrar la bandera H

16

Page 17: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

CLI Deshabilitar las interrupciones globales Sintaxis: CLI Operación: N ← 0 Operandos: Ninguno Descripción: Pone a cero la bandera de habilitación de interrupciones globales I del registro de estado SREG. Banderas afectadas: I: Se pone a cero Ejemplo: CLI ; Interrupciones deshabilitadas IN r11, $16 ; Leer el Puerto B SEI ; Interrupciones habilitadas

CLN Poner a cero la bandera N Sintaxis: CLN Operación: N ← 0 Operandos: Ninguno Descripción: Pone a cero la bandera de resultado negativo N del registro de estado SREG. Banderas afectadas: C: Se pone a cero Ejemplo: ADD r2, r3 ; Sumar r3 a r2 CLN ; Borrar la bandera N

CLR Borra un registro Sintaxis: CLR Rd Operación: Rd ← Rd (XOR) Rd Operandos: 0 ≤ d ≤ 31 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. Banderas afectadas: V: Se pone a cero. N: Se pone a cero Z: Se pone a uno. Ejemplo:

CLR r18 ; Borrar r18 loop: INC r18 ; Incrementar r18 ...

CPI r18, $50 ; Comparar r18 con $50 BRNE loop

CLS Poner a cero la bandera S Sintaxis: CLS Operación: S ← 0 Operandos: Ninguno Descripción: Pone a cero la bandera de signo S del registro de estado SREG. Banderas afectadas: S: Se pone a cero Ejemplo: ADD r2, r3 ; Sumar r3 a r2 CLS ; Borrar la bandera S

17

Page 18: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

CLT Poner a cero la bandera T Sintaxis: CLT Operación: T ← 0 Operandos: Ninguno Descripción: Pone a cero la bandera T del registro de estado SREG. Banderas afectadas: T: Se pone a cero Ejemplo: CLT ; Borrar la bandera T

CLV Poner a cero la bandera V Sintaxis: CLV Operación: V ← 0 Operandos: Ninguno Descripción: Pone a cero la bandera de desbordamiento V del registro de estado SREG. Banderas afectadas: V: Se pone a cero Ejemplo: ADD r2, r3 ; Sumar r3 a r2 CLV ; Borrar la bandera V

CLZ Poner a cero la bandera Z Sintaxis: CLZ Operación: Z ← 0 Operandos: Ninguno Descripción: Pone a cero la bandera de resultado cero Z del registro de estado SREG. Banderas afectadas: Z: Se pone a cero Ejemplo: ADD r2, r3 ; Suma r3 a r2 CLZ ; Borra la bandera Z

COM Complemento a uno Sintaxis: COM Rd Operación: Rd ← $FF - Rd Operandos: 0 ≤ d ≤ 31 Descripción: Realiza el complemento a uno del registro 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á. C: se pone a uno. Ejemplo:

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

18

Page 19: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

CP Compara Sintaxis: CP Rd, Rr Operación: Rd -Rr 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. 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á. Ejemplo:

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

... noteq: NOP ; Destino de desvío (No hacer nada)

CPC Compara con acarreo Sintaxis: CPC Rd, Rr Operación: Rd –Rr -C Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 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: 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 ce o, de lo contrario se borrará. rC 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:

; Comparar r3:r2 con r1:r0 CP r2, r0 ; Compara el byte bajo CPC r3, r1 ; Compara el byte alto BRNE noteq ; Desvía si la bandera Z está activa

... noteq: NOP ; Destino de desvío( no hacer nada)

CPI Compara un registro con dato inmediato Sintaxis: CPI Rd, K Operación: Rd -K Operandos: 16 ≤ d ≤ 31, 0 ≤ K ≤ 255 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. 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 K es mayor que el contenido de Rd, de lo contrario se borrará. Ejemplo:

CPI r19,3 ; Comparar r19 con 3 BRNE error ; Desvía si la bandera Z está activa

... error: NOP ; Destino de desvío (No hacer nada)

CPSE Compara y saltar si es igual Sintaxis: CPSE Rd, Rr Operación: Si Rd = Rr entonces PC ← PC + 2 ( o 3) Si Rd ≠ Rr entonces PC ← PC + 1 Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 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: Ninguna Ejemplo: INC r4 ; Incrementar r4 CPSE r4, r0 ; Comparar r4 con r0 NEG r4 ; Sólo ejecutar si r4 ≠ r0 NOP ; Continuar (No hacer nada)

19

Page 20: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

DEC Decrementar el registro Sintaxis: DEC Rd Operación: Rd ← Rd -1 Operandos: 0 ≤ d ≤ 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. 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: LDI r17, $10 ; Cargar constante en r17 Loop: ADD r1, r2 ; Sumar r2 a r1 DEC r17 ; Decrementar r17 BRNE loop ; Desvío si r17 ≠ 0 NOP ; Continuar (No hacer nada)

EOR Función lógica OR-exclusiva (⊕) entre registros Sintaxis: EOR Rd, Rr Operación: Rd ← Rd ⊕ Rr Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 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á. Ejemplo: EOR r4, r4 ; Borrar r4 EOR r0, r22 ; OR exclusiva entre r0 y r22

ICALL llamada indirecta a subrutina Sintaxis: ICALL Operación: PC (15:0) ← Z (15:0) Operandos: Ninguno Pila: Stack ← PC + 1 : SP ← SP -2 (2 Bytes) 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:

MOV r30, r0 ; Poner offset a la tabla de llamada ICALL ; Rutina de llamada que apunta a r31:r30

IJMP Salto indirecto Sintaxis: IJMP Operación: PC ← Z(15:0) Operandos: Ninguno 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. Banderas afectadas: Ninguna Ejemplo: MOV r30, r0 ; Poner offset a la tabla de salto IJMP ; Saltar a la rutina apuntada por r31:r30

20

Page 21: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

IN Cargar un registro de trabajo con I/O Sintaxis: IN Rd, P Operación: Rd ← P Operandos: 0 ≤ d ≤ 31, 0 ≤ P ≤ 63 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. Banderas afectadas: Ninguna Ejemplo:

IN r25, $16 ; Carga en r25 el ;dato ;contenido en Puerto B

CPI r25,4 ; Comparar el valor de r25 con ; un dato inmediato

BREQ exit ; Desvía si r25 = 4 ... exit: NOP ; Destino de desvío

INC Incrementar el registro Sintaxis: INC Rd Operación: Rd ← Rd +1 Operandos: 0 ≤ d ≤ 31 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: 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á. Ejemplo: CLR r22 ; Borrar r22 loop: INC r22 ; Incrementar r22 ... CPI r22, $4F ; Comparar r22 con $4f BRNE loop ; Desvío si no son iguales NOP ; Continuar (No hacer nada)

JMP Salto Sintaxis: JMP k Operación: PC ← k Operandos: 0 ≤ k ≤ 4M 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. Banderas afectadas: Ninguna Ejemplo:

MOV r1, r0 ; Copia r0 en r1 JMP lejos ; Salto incondicional …

lejos: nop ; Destino de salto

LDI Carga de un dato inmediato Sintaxis: LDI Rd, K Operación: Rd ← K Operandos: 16 ≤ Rd ≤ 31, 0 ≤ K ≤ 255 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 Ejemplo: CLR r31 ; Borra el byte alto de Z LDI r30, $F0 ; Pone el byte bajo de Z a $F0 LPM ; Carga una constante de la memoria

; de programa apuntada por Z

21

Page 22: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

LD Carga indirecta usando X Sintaxis: LD Rd, X

LD Rd, X+ LD Rd, -X

Operación: Rd ← (X) X: Sin cambios Rd ← (X), X ← X+1 X: Con post-incremento X ← X–1, Rd ← (X) X: Con pre-decremento Operandos: 0 ≤ d ≤ 31 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. 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. 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.

El resultado de estas combinaciones es indefinido: LD r26, X+ LD r27, X+ LD r26, -X LD r27, -X Algunas variantes de esta instrucción no son disponibles para todos los modelos de AVR’s. Banderas afectadas: Ninguna Ejemplo: CLR r27 ; Borra el byte alto de X LDI r26, $60 ; Pone el byte bajo de X a $60 LD r0, X+ ; Carga en r0 el dato de la localidad $60

;(X post-incrementado) LD r1, X ; Carga en r1 el dato contenido en la

; localidad $61 LDI r26, $63 ; Pone el byte bajo de X a $63 LD r2, X ; Carga en r2 el dato de la localidad $63 LD r3, -X ; Cargar en r3 el dato de la localidad $62

;(X pre-decremento)

El resultado de estas combinaciones es indefinido: LD r28, Y+ LD r29, Y+ LD r28, -Y LD r29, -Y Algunas variantes de esta instrucción no son disponibles para todos los modelos de AVR’s. Banderas afectadas: Ninguna Ejemplo: CLR r29 ; Borra el byte alto de Y LDI r28, $60 ; Pone el byte bajo de Y a $60 LD r0, Y+ ; Carga en r0 el dato de la localidad $60

; (Y post-incrementado) LD r1, Y ; Carga en r1 el dato de la localidad $61 LDI r28, $63 ; Pone el byte bajo de Y a $63 LD r2, Y ; Carga en r0 el dato de la localidad $63 LD r3,-Y ; Carga en r0 el dato de la localidad $62

; (Y pre-decrementado) LDD r4, Y+2 ; Carga en r4 el dato de la localidad $64

LD (LDD) Carga indirecta usando Y Sintaxis: LD Rd, Y

LD Rd, Y+ LD Rd, -Y LDD Rd, Y+q

Operación: Rd ← (Y) Y: Sin cambios Rd ← (Y), Y ← Y+1 Y: Con post-incremento Y ← Y–1, Rd ← (Y) Y: Con pre-decremento

Rd ← (Y+q) Y: Sin cambios, q: Desplazamiento

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

Page 23: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

LD (LDD) Carga indirecta usando Z Sintaxis: LD Rd, Z

LD Rd, Z+ LD Rd, -Z LDD Rd, Z+q

Operación: Rd ← (Z) Z: Sin cambios Rd ← (Z), Z ← Z+1 Z: Con post-incremento Z ← Z – 1, Rd ← (Z) Z: Con pre-decremento

Rd ← (Z+q) Z: Sin cambios, q: Desplazamiento

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

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. El resultado de estas combinaciones es indefinido: LD r30, Z+ LD r31, Z+ LD r30, -Z LD r31, -Z Algunas variantes de esta instrucción no son disponibles para todos los modelos de AVR’s. Banderas afectadas: Ninguna Ejemplo: CLR r31 ; Borra el byte alto de Z LDI r30, $60 ; Pone el byte bajo de Z a $60 LD r0, Z+ ; Carga en r0 el dato de la localidad $60

; (Z post-incrementado) LD r1, Z ; Carga en r1 el dato de la localidad $61 LDI r30, $63 ; Pone el byte bajo de Z a $63 LD r2, Z ; Carga en r0 el dato de la localidad $63 LD r3,-Z ; Carga en r0 el dato de la localidad $62

; (Z pre-decrementado) LDD r4, Z+2 ; Carga en r4 el dato de la localidad $64

LDS Carga directa desde SRAM Sintaxis: LDS Rd, k Operación: Rd ← (k) Operandos: 0 ≤ d ≤ 31, 0 ≤ k ≤ 65535 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. Banderas afectadas: Ninguna Esta instrucción no es disponible para todos los modelos de AVR’s. Ejemplo: LDS r2, $FF00 ; Carga r2 con el contenido de la localidad

; $FF00 de la memoria de datos ADD r2, r1 ; Sumar r1 a r2 STS $FF00, r2 ; Escribir en SRAM el contenido de r2

LPM Carga memoria de programa Sintaxis: LPM LPM Rd, Z LPM Rd, Z+ Operación: R0 ← (Z) Z: Sin cambio, R0 implícito Rd ← (Z) Z: Sin cambio Rd ← (Z), Z ← Z + 1 Z: Post-incrementado 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 Esta instrucción no es disponible para todos los modelos de AVR’s. Ejemplo:

CLR r31 ; Borrar el byte alto de Z LDI r30, $F0 ; Poner a cero el byte bajo de Z LPM ; Cargar la constante de la

;memoria de programa ;apuntada por Z (r31:r30)

23

Page 24: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

LSL Desplazamiento a la izquierda Sintaxis: LSL Rd

Operación: 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. 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á. Ejemplo: ADD r0, r4 ; Sumar r4 a r0 LSL r0 ; Multiplicar r0 por 2

LSR Desplazamiento a la derecha Sintaxis: LSR Rd

Operación: Operandos: 0 ≤ d ≤ 31 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: 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 ; Sumar r4 a r0 LSR r0 ; Dividir a r0 entre 2

MOV Copia de registros Sintaxis: MOV Rd, Rr Operación: Rd ← Rr Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 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. Banderas afectadas: Ninguna Ejemplo:

MOV r16,r0 ; Copiar r0 en r16 CALL check ; Llamada a subrutina

... check: CPI r16,$11 ; Comparar r16 con $11 ...

RET ; Retorno de subrutina

MOVW Copia de registros de palabra Sintaxis: MOVW Rd + 1: Rd, Rr + 1: Rr Operación: Rd + 1: Rd ← Rr + 1: Rr Operandos: d Є {0,2,…,30} r Є {0,2,…,30} 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. Banderas afectadas: Ninguna Esta instrucción no es disponible para todos los modelos de AVR’s. Ejemplo:

MOVW r17:r16,r1:r0 ; Copiar r1:r0 en r17:r16 CALL check ; Llamada a subrutina

... check: CPI r16, $11 ; Comparar r16 con $11 ...

RET ; Retorno de subrutina

24

Page 25: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

NEG Complemento a dos Sintaxis: NEG Rd Operación: Rd ← $00 - Rd Operandos: 0 ≤ d ≤ 31 Descripción: Cambia el contenido del registro Rd con su complemento a dos; el valor $80 se deja sin cambiar. 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 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. Ejemplo:

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 prueba: NOP ; Destino de desvío (No hacer nada)

NOP No operación Sintaxis: NOP Operación: Ninguna Operandos: Ninguno Descripción: Consume un ciclo sin realizar operaciones. Banderas afectadas: Ninguna Ejemplo: CLR r16 ; Borrar r16 SER r17 ; Poner a uno r17 OUT $18, r16 ; Escribir ceros en el Puerto B NOP ; Esperar (No hacer nada) OUT $18, r17 ; Escribir unos en el Puerto B

MULS Multiplicación con signo Sintaxis: MULS Rd, Rr Operación: R1:R0 ← Rd x Rr Operandos: 16 ≤ d ≤ 31, 0 ≤ r ≤ 16 Descripción: El multiplicando Rd y el multiplicador Rr son registros con números signados. El resultado con signo es de 16-bit y se coloca la parte más significativa del resultado en registro R1 y la menos significativa en R0.

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. Esta instrucción no es disponible para todos los modelos de AVR’s. Ejemplo: MUL r21 r20 ; Multiplica R21 con R20 MOVW r20, r0 ; Copia el resultado en R21: R20

MUL Multiplicación sin signo Sintaxis: MUL Rd, Rr Operación: R1:R0 ← Rd x Rr Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 Descripción: El multiplicando Rd y el multiplicador Rr son registros con números sin signo. El resultado sin signo es de 16-bit 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.

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. Esta instrucción no es disponible para todos los modelos de AVR’s. Ejemplo: MUL r5, r4 ; Multiplica R5 con R4 MOVW r4, r0 ; Copia el resultado en R5: R4

25

Page 26: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

OR Función lógica OR entre registros Sintaxis: OR Rd, Rr Operación: Rd ← Rd (OR) Rr Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 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. 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á. Ejemplo: OR r15, r16 ; Hacer OR lógico entre registros

BST r15, 6 ; Almacena el bit 6 de r15 en el flag T BRTS ok ; Desvío si el flag T está a uno ... ok: NOP ; Destino de desvío (No hacer nada)

ORI Función lógica OR entre un registro y un dato inmediato Sintaxis: ORI Rd, K Operación: Rd ← Rd (OR) K Operandos: 0 ≤ d ≤ 31, 0 ≤ K ≤ 255 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: 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: ORI r16, $F0 ; Poner a uno el nibble alto de r16 ORI r17, 1 ; Poner a uno el bit 0 de r17

OUT Cargar en I/O un registro de trabajo Sintaxis: OUT P, Rr Operación: P ← Rr Operandos: 0 ≤ r ≤ 31, 0 ≤ P ≤ 63 Descripción: Carga en un registro del bloque I/O el contenido de un registro trabajo. Banderas afectadas: Ninguna Ejemplo: CLR r16 ; Borrar r16 SER r17 ; Poner a unos r17 OUT $18, r16 ; Escribir ceros en el Puerto B NOP ; Esperar (No hacer nada) OUT $18, r17 ; Escribir unos en el Puerto B

POP Sacar registro de la pila Sintaxis: POP Rr Operación: Rr ← STACK Operandos: 0 ≤ r ≤ 31 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 Esta instrucción no es disponible para todos los modelos de AVR’s. Ejemplo:

CALL routine ; Llamar a subrutina ... routine: PUSH r14 ; Guardar r14 en la pila

PUSH r13 ; Guardar r13 en la pila ...

POP r13 ; Restaurar r13 POP r14 ; Restaurar r14 RET ; Retorno de subrutina

26

Page 27: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

PUSH Guardar registro en la pila Sintaxis: PUSH Rr Operación: STACK ← Rr Operandos: 0 ≤ r ≤ 31 Descripción: Guarda el contenido del registro Rr en la pila. El puntero de pila es post-decrementado en uno después del PUSH Banderas afectadas: Ninguna Esta instrucción no es disponible para todos los modelos de AVR’s. Ejemplo:

CALL routine ; Llamar a subrutina ... routine: PUSH r14 ; Guardar r14 en la pila

PUSH r13 ; Guardar r13 en la pila ...

POP r13 ; Restaurar r13 POP r14 ; Restaurar r14 RET ; Retorno de subrutina

RCALL llamada relativa a subrutina Sintaxis: RCALL k Operación: PC ← PC + k + 1 Operandos: -2K ≤ k ≤ 2K Pila: Stack ← PC + 1 : SP ← SP -2 (2 Bytes) 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 post-decremento. Banderas afectadas: Ninguna Ejemplo:

RCALL routine ; Llamada a subrutina

... routine: PUSH r14 ; Guardar r14 en la pila ...

POP r14 ; Restaurar r14 RET ; Retorno de subrutina

RET Retorno de subrutina Sintaxis: RET Operación: PC ← Stack Operandos: Ninguno 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. Banderas afectadas: Ninguna Ejemplo:

CALL routine ; Llamada a subrutina

... routine: PUSH r14 ; Guardar r14 en la pila

... POP r14 ; Restaurar r14 RET ; Retorno de subrutina

RETI Retorno de interrupción Sintaxis: RETI Operación: PC ← Stack Operandos: Ninguno Pila: SP ← SP + 2 (bytes) 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: I: Se pone a uno. Ejemplo: ... extint: PUSH r0 ; Guardar r0 en la pila ... POP r0 ; Restaurar r0 RETI ; Retorno y habilitación de interrupciones

27

Page 28: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

RJMP Salto relativo Sintaxis: RJMP k Operación: PC ← PC + k + 1 Operandos: -2K ≤ k ≤ 2K 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. Banderas afectadas: Ninguna Ejemplo:

CPI r16, $42 ; Compara r16 con $42 BRNE error ; Desvío si r16 ≠ $42 RJMP ok ; Salto incondicional

error: ADD r16, r17 ; Suma r17 a r16 INC r16 ; Incrementa r16

ok: NOP ; Destino de RJMP

ROL Desplazamiento a la izquierdo con acarreo Sintaxis: ROL Rd

Operación: Operandos: 0 ≤ d ≤ 31 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: 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á. Ejemplo:

LSL r18 ; Multiplica r19:r18 por dos ROL r19 ; r19:r18 es un entero de dos

;bytes -con o sin signo- BRCS oneenc ; Desvía si C está a uno

... oneenc: NOP ; Destino de desvío

ROR Desplazamiento a la derecha con acarreo Sintaxis: ROR Rd

Operación: Operandos: 0 ≤ d ≤ 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. 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 ; Sumar r4 a r0 LSL r0 ; Multiplicar r0 por 2

SBC Resta de dos registros con acarreo Sintaxis: SBC Rd, Rr Operación: Rd ← Rd – Rr - C Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 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á. Ejemplo:

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

28

Page 29: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

SBCI Resta a un registro una constante y el acarreo Sintaxis: ADD Rd, Rr Operación: Rd ← Rd –K - C Operandos: 16 ≤ d ≤ 31, 0 ≤ K ≤ 255 Descripción: Resta una constante con un registro y con la bandera C; deja el resultado en el registro destino 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á. Ejemplo:

; Resta $4F23 de r17:r16 SUBI r16, $23 ; Restar el byte bajo SBCI r17, $4F ; Restar con acarreo el byte alto

SBI Poner a uno un bit del registro I/O Sintaxis: SBI P, b Operación: (P, b) ← 1 Operandos: 0 ≤ P ≤ 31, 0 ≤ b ≤ 7 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. Banderas afectadas: Ninguna Ejemplo: OUT $1E, r0 ; Escribir la dirección de EEPROM SBI $1C, 0 ; Poner a uno el bit 0 de EECR IN r1, $1D ; Leer datos de EEPROM

SBIC Salta si el bit del registro I/O es cero Sintaxis: SBCI 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 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). Banderas afectadas: Ninguna Ejemplo: espera: SBIC $1C, 1 ; Saltar próxima instrucción si

; EEWE* está borrado RJMP espera ; Escritura de EEPROM no

; terminada NOP ; Continuar (No hacer nada) * EEWE es el bit 1 del registro EECR (Registro de Control de la memoria EEprom) mapaeado en la localidad $1C de la memoria RAM.

SBIS Salta si el bit del registro I/O es uno Sintaxis: SBIS P, b 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 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 Ejemplo: espera: SBIS $10, 0 ; Saltar la siguiente instrucción ; si el bit 0 en el Puerto D está a uno RJMP espera ; Bit 0 borrado NOP ; Continuar (No hacer nada)

29

Page 30: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

SBIW Resta un dato inmediato a un registro de palabra Sintaxis: SBIW Rd+1:Rd,K Operación: Rd +1: Rd ← Rd+1 : Rd - K 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. Operando2: 0≤ K ≤ 63 Descripción: SBIW resta un valor K a un par de registros y deja el resultado en el par de registros Banderas afectadas: 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á. Ejemplo: SBIW r24, 1 ; Restar 1 de r25:r24 SBIW r28, 63 ; Restar 63 del puntero Y (r29:r28)

SBR Pone a uno los bits del registro Sintaxis: SBR Rd, K Operación: Rd ← Rd v K Operandos: 16 ≤ d ≤ 31, 0 ≤ K ≤ 255 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: 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: SBR r16, 3 ; Poner a uno los bits 0 y 1 de r16 SBR r17, $F0 ; Poner a uno los 4 MSB en r17

SBRC Salta si el bit del registro es cero Sintaxis: SBRC Rr, b Operación: Si Rr(b) = 0 entonces PC ← PC + 2 ( o 3) Si Rr(b) ≠ 0 entonces PC ← PC + 1 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). Banderas afectadas: Ninguna Ejemplo: SUB r0, r1 ; Restar r1 de r0 SBRC r0, 7 ; Saltar si el bit 7 en r0 está borrado SUB r0, r1 ; Sólo se ejecuta si el bit 7 en r0 es uno NOP ; Continuar (No hacer nada)

SBRS Salta si el bit del registro es uno Sintaxis: SBRC Rr, b 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 Descripción: Examina un bit del registro seleccionado y salta la siguiente instrucción si el bit está a uno. Banderas afectadas: Ninguna Ejemplo: SUB r0, r1 ; Restar r1 de r0 SBRS r0, 7 ; Saltar si el bit 7 en r0 está a uno SUB r0, r1 ; Sólo se ejecuta si el bit 7 en r0 es cero NOP ; Continuar (No hacer nada)

30

Page 31: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

SEC Poner a uno la bandera C Sintaxis: SEC Operación: C ← 1 Operandos: Ninguno Descripción: Pone a uno la bandera de acarreo C del registro de estado SREG. Banderas afectadas: C: Se pone a uno Ejemplo: SEC ; Poner a uno la bandera de acarreo ADC r0, 1 ; r0 = r0 + r1 + 1

SEH Pone a uno la bandera H Sintaxis: SEH Operación: H ← 1 Operandos: Ninguno Descripción: Pone a uno la bandera de medio acarreo H del registro de estado SREG. Banderas afectadas: H: Se pone a uno Ejemplo: SEH ; Poner a uno la bandera H

SEI Habilitar las interrupciones globales Sintaxis: SEI Operación: I ← 1 Operandos: Ninguno Descripción: Pone a uno la bandera de habilitación de interrupciones globales I del registro de estado SREG. Banderas afectadas: I: Se pone a uno Ejemplo: SEI ; Interrupciones habilitadas SLEEP ; Activación de modo SLEEP, esperando ; alguna interrupción

SEN Poner a uno la bandera N Sintaxis: SEN Operación: N ← 1 Operandos: Ninguno Descripción: Pone a uno la bandera de resultado negativo N del registro de estado SREG. Banderas afectadas: N: Se pone a uno Ejemplo: ADD r2, r19 ; Sumar r19 a r2 SEN ; Poner a uno la bandera N

31

Page 32: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

SER Carga todos los bits de un registro Sintaxis: SER Rd Operación: Rd ← $FF Operandos: 16 ≤ d ≤ 31 Descripción: SER Carga directamente $FF al registro seleccionado. Banderas afectadas: Ninguna Ejemplo: CLR r16 ; Borrar r16 SER r17 ; Poner a uno r17 OUT $18, r16 ; Escribir ceros al Puerto B NOP ; Retardo (No hacer nada) OUT PORTB, r17 ; Escribir unos en el Puerto B

SES Pone a uno la bandera S Sintaxis: SES Operación: S ← 1 Operandos: Ninguno Descripción: Pone a uno la bandera de signo S del registro de estado SREG. Banderas afectadas: S: Se pone a uno Ejemplo: ADD r2, r19 ; Sumar r19 a r2 SES ; Poner a uno la bandera S

SET Pone a uno la bandera T Sintaxis: SET Operación: T ← 1 Operandos: Ninguno Descripción: Pone a uno la bandera T del registro de estado SREG. Banderas afectadas: T: Se pone a uno Ejemplo: SET ; Poner a uno la bandera T

SEV Pone a uno la bandera V Sintaxis: SEV Operación: V ← 1 Operandos: Ninguno Descripción: Pone a uno la bandera de desbordamiento V del registro de estado SREG. Banderas afectadas: V: Se pone a uno Ejemplo: ADD r2, r19 ; Sumar r19 a r2 SEV ; Poner a uno la bandera V

32

Page 33: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

SEZ Poner a uno la bandera Z Sintaxis: SEZ Operación: Z ← 1 Operandos: Ninguno Descripción: Pone a uno la bandera de resultado cero Z del registro de estado SREG. Banderas afectadas: Z: Se pone a uno Ejemplo: ADD r2, r19 ; Suma r19 a r2 SEZ ; Poner a uno la bandera Z

SLEEP Activar modo sleep Sintaxis: SLEEP Operación: Consulta el manual del dispositivo para obtener una información detalla acerca de este modo de operación. Operandos: Ninguno Descripción: Pone en modo Sleep al microcontrolador Banderas afectadas: Ninguna Ejemplo: MOV r0, r11 ; Copiar r11 en r0 LDI r16, (1<<SE) ; Modo sleep habilitado OUT MCUCR, r16 SLEEP ; Poner el MCU en modo descanso

ST Almacenar indirectamente usando X Sintaxis: LD X, Rr

LD X+, Rr LD -X , Rr

Operación: (X) ← Rr X: Sin cambios (X) ← Rr, X ← X+1 X: Con post-incremento X ← X–1, (X) ←Rd X: Con pre-decremento Operandos: 0 ≤ r ≤ 31 Descripción Se almacena un byte de manera indirecta procedente de un registro de trabajo hacia el área de datos. 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. 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. 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.

El resultado de estas combinaciones es indefinido: LD X+, r26 LD X+, r27 LD –X, r26 LD -X, r27 Algunas variantes de esta instrucción no son disponibles para todos los modelos de AVR’s. Banderas afectadas: Ninguna Ejemplo: CLR r27 ; Borra el byte alto de X LDI r26, $60 ; Pone el byte bajo de X a $60 ST X+, r0 ; Almacena r0 en la localidad $60 (X post-

; incrementado) ST X, r1 ; Almacenar r1 en la localidad $61 LDI r26, $63 ; Pone el byte bajo de X a $63 ST X, r2 ; Almacena r2 en la localidad $63 ST –X, r3 ; Almacena r3 en la localidad $62 (X pre-

; decrementado)

33

Page 34: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

ST (STD) Almacenar indirectamente usando Y Sintaxis: LD Y, Rr

LD Y+, Rr LD -Y, Rr STD Y+q, Rr

Operación: (Y) ← Rr Y: Sin cambios (Y) ← Rr, Y ← Y+1 Y: Con post-incremento Y ← Y–1, (Y) ← Rr Y: Con pre-decremento

(Y+q) ← Rr Y: Sin cambios, q: Desplazamiento

Operandos: 0 ≤ r ≤ 31, 0 ≤ q ≤ 63 Descripción Se almacena un byte de manera indirecta procedente de un registro de trabajo hacia el área de datos. 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. 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. 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.

El resultado de estas combinaciones es indefinido: ST Y+, r28 ST Y+, r29 ST -Y, r28 ST -Y, r29 Algunas variantes de esta instrucción no son disponibles para todos los modelos de AVR’s. Banderas afectadas: Ninguna Ejemplo: CLR r29 ; Borra el byte alto de Y LDI r28, $60 ; Pone el byte bajo de Y a $60 ST Y+, r0 ; Almacena r0 en la localidad $60

; (Y post-incrementado) ST Y, R1 ; Almacena r1 en la localidad $61 LDI r28, $63 ; Pone el byte bajo de Y a $63 ST Y, r2 ; Almacena r0 en la localidad $63 ST -Y, r3 ; Almacena r0 en la localidad $62

; (Y pre-decrementado) STD Y+2, r4 ; Almacena r4 en la localidad $64

ST (STD) Almacenar indirectamente usando Z Sintaxis: LD Z, Rr

LD Z+, Rr LD -Z, Rr STD Z+q, Rr

Operación: (Z) ← Rr Z: Sin cambios (Z) ← Rr, Z ← Z+1 Z: Con post-incremento Z ← Z–1, (Z) ← Rr Z: Con pre-decremento

(Z+q) ← Rr Z: Sin cambios, q: Desplazamiento

Operandos: 0 ≤ r ≤ 31, 0 ≤ q ≤ 63 Descripción Se almacena un byte de manera indirecta procedente de un registro de trabajo hacia el área de datos. 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. 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 RAMPZ tiene que ser correctamente configurado. 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.

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. El resultado de estas combinaciones es indefinido: ST Z+, r30 ST Z+, r31 ST -Z, r30 ST -Z, r31 Algunas variantes de esta instrucción no son disponibles para todos los modelos de AVR’s. Banderas afectadas: Ninguna Ejemplo: CLR r31 ; Borra el byte alto de Z LDI r30, $60 ; Pone el byte bajo de Z a $60 ST Z+, r0 ; Almacena r0 en la localidad $60

; (Z post-incrementado) ST Z, r1 ; Almacena r1 en la localidad $61 LDI r30, $63 ; Pone el byte bajo de Z a $63 ST Z, r2 ; Almacena r0 en la localidad $63 ST –Z, r3 ; Almacena r0 en la localidad $62

; (Z pre-decrementado) STD Z+2, r4 ; Almacena r4 en la localidad $64

34

Page 35: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

STS Almacena directamente en SRAM Sintaxis: STS (k), Rr Operación: (k) ← Rd Operandos: 0 ≤ r ≤ 31, 0 ≤ k ≤ 65535 Descripción: Almacena un byte de un registro de trabajo en la memoria de datos. 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. Banderas afectadas: Ninguna Esta instrucción no es disponible para todos los modelos de AVR’s. Ejemplo: LDS r2, $FF00 ; Carga r2 con el contenido de la localidad

; $FF00 de la memoria de datos ADD r2, r1 ; Sumar r1 a r2 STS $FF00, r2 ; Escribir en SRAM el contenido de r2

SUB Resta de dos registros sin acarreo Sintaxis: SUB Rd, Rr Operación: Rd ← Rd - Rr Operandos: 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 Descripción: Resta dos registros sin considerar la bandera C y deja el resultado en el registro destino Rd. Banderas afectadas: H: Se activa si hay un acarreo negativo (Borrow) 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 valor absoluto de Rd, de lo contrario se borrará. Ejemplo: ADD r1, r2 ; Suma r2 a r1 (r1=r1+r2) ADD r28, r28 ; Suma r28 a sí mismo (r28=r28+r28)

SUBI Resta un dato inmediato a un registro Sintaxis: SUBI Rd,Rr Operación: Rd ← Rd - K Operandos: 16 ≤ d ≤ 31, 0 ≤ K ≤ 255 Descripción: Resta un registro con una constante y deja el resultado en el registro Rd. Esta instrucción trabaja con los registros R16 a R31 y es ideal para utilizarla con los punteros X, Y y Z. Banderas afectadas: H: Se activa si hay 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: Se activa si el resultado es $00, 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: SUBI r22, $11 ; Resta la constante (dato inmediato) $11 al

;registro de trabajo r22

SWAP Intercambia los nibbles Sintaxis: SWAP Rd Operación: R(7:4) ← Rd(3:0), R(3:0) ← Rd(7:4) Operandos: 0 ≤ d ≤ 31 Descripción: Intercambia al nibble bajo con el nibble alto del Rd. Banderas afectadas: Ninguna Ejemplo: INC r1 ; Incrementar r1 SWAP r1 ; Intercambiar los nibbles alto y bajo de r1 INC r1 ; Incrementar r1 SWAP r1 ; Intercambiar otra vez

35

Page 36: INSTRUCIONES MICROCONTROLADORES AVR EN ESPAÑOL]

TST revisa si es cero o menor Sintaxis: TST Rd Operación: Rd ← Rd (AND) Rd Operandos: 0 ≤ d ≤ 31 Descripción: Prueba si el registro es cero o negativo. Realiza un AND lógico entre el registro y él mismo. El registro permanece sin cambios. 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á. Ejemplo:

TST r0 ; Prueba r0 BREQ prueba ; Brinca si r0 = 0

... prueba: NOP ; Destino de desvío (No hacer nada)

WDR Reinicio del Watchdog Sintaxis: WDR Operación: Reinicio del temporizador “Watchdog” Operandos: Ninguno Descripción: Hace un Reinicio del Temporizador Watchdog. La instrucción debe ejecutarse en un tiempo limitado por el prescaler del Watchdog. Consulta las especificaciones del Watchdog en el manual del dispositivo. Banderas afectadas: Ninguna Ejemplo: WDR ; Reinicializa el temporizador del Watchdog

36