Documente Academic
Documente Profesional
Documente Cultură
3.1 INTRODUCCIÓN
Todos los modelos de microcontroladores RISC de la familia AVR soportan los modos
de direccionamiento para accesar a la memoria de programa (Flash) y a la memoria de
datos (SRAM, Archivo de Registros, Memoria de I/O, y la Memoria Extendida de I/O).
Para los siguientes modos de direccionamiento OP significa el Código de Operación de
la Instrucción. Para generalizar, los términos RAMEND y FLASHEND se usan para
representar la memoria más alta de la localidad en los datos y en el programa.
Ejemplos:
INC R16
CLR R22
Ejemplos:
ADD R16,R17
CP R22,R5
MOV R0, R1
Ejemplos:
IN R16,PIND
OUT PORTC,R16
Una dirección de datos de 16 bits esta contenida en los 16 bits menos significativos de
la instrucción de dos bytes. Rd/Rr especifican el registro destino o fuente.
Ejemplos:
STS 0x1000,R16
Ejemplos:
LDD R16, Y+0x10
STD Z+0x20, R16
Documento traducido de la hoja de datos del ATmega32 3
__________________________________________________________________________ITSP
Ejemplos:
LD R16, Y
ST Z, R16
Ejemplos:
LD R16, -Z
ST -Z, R16
Ejemplos:
LD R16, Z+
ST Z+, R16
La dirección del byte se especifica por el contenido del registro Z. Los 15 bytes más
significativos seleccionan la dirección de la palabra. Para LPM, si LSB = 0 se selecciona
el byte bajo, de lo contrario si LSB = 1, se selecciona el byte alto.
Ejemplos:
LPM
Ejemplos:
IJMP
ICALL
Ejemplos:
RJMP
RCALL
Tabla 3.1.
Ejemplo:
add r1,r2 ;Suma r2 a r1 (r1=r1+r2)
add r28,r28 ;Se suma el r28 el mismo (r28=r28+r28)
La instrucción EOR, ejecuta la operación lógica X-OR al contenido del registro destino
y el registro fuente colocando el resultado en el registro destino (Rd).
Ejemplo:
eor r4,r4 ;Se limpia r4
eor r0,r22 ;Se realiza una OR exclusiva entre r0 y r22
Ejemplo:
sub r11,r0 ;Resta r0 de r11
brpl positivo ;Salta si el resultado es positivo
neg r11 ;Toma el complemento a 2 de r11
positivo: nop ;Destino del salto (no hace nada)
Ejemplo:
mul r5,r4 ;multiplica r5 y r4 números sin signo
movw r4,r0 ;Copia el resultado de nuevo a r5:r4
La instrucción MULS, realiza la misma operación que la instrucción MUL solo que se
toma en cuenta el bit de signo.
Ejemplo:
muls r21,r20 ;multiplica r21 y r20 números con signo
movw r20,r0 ;Copia el resultado de nuevo a r21:r20
Instrucciones de Salto
Tabla 3.2.
Existen dos tipos de salto: los saltos condicionales, que son aquellos que antes de
saltar requieren verificar una de las banderas del Registro de Estado (SREG), mientras
que los saltos incondicionales no requieren verificar ninguna bandera, en cuanto el
micro los encuentre este saltará a la nueva posición marcada con la etiqueta.
Ejemplo:
cpi r16,$42 ;Compara r16 con el número 42h
brne error ;Salta si r16 es diferente a 42h
rjmp ok ;Salto incondicional
error: add r16,r17 ;Suma r17 a r16
inc r16 ;Incrementa r16
ok: nop ;Destino para rjmp (no hace nada)
Tabla 3.3
La instrucción MOV, hace una copia de un registro a otro. El registro fuente, Rr, no sufre
ningún cambio, mientras que el registro destino, Rd, se carga con una copia de Rr.
La instrucción MOVW, hace una copia de un par de registros a otro par de registros. El
par de registros fuente, Rr+1:Rr, no sufren ningún cambio, mientras que el par de
registros destino, Rd+1:Rd, se cargan con una copia de Rr+1:Rr.
La instrucción LDI, carga una constante de 8 bits directamente a los registros de r16 a
r31.
Ejemplo:
clr r27 ;Limpia el byte alto de X
ldi r26,$60 ;Coloca el byte bajo de X con el número $60
ld r0,X+ ;Se carga r0 con el valor de la localidad $60 y se increm
ld r1,X ;Se carga r1 con el valor de la localidad $61
ldi r26,$63 ;Coloca el byte bajo de X con el número $63
ld r2,X ;Se carga r2 con el valor de la localidad $63
ld r3,-X ;Se decrem X y se carga r3 con el valor de la localidad $62
La instrucción LPM, carga un byte del registro apuntado por Z a un registro destino.
Ejemplo:
ldi ZH,high(Tabla_1) ;Inicializa el apuntador Z
ldi ZL,low(Tabla_1)
lpm r16,Z ;Carga una constante de la memoria de programa
;apuntada por Z (r31:r30)
La instrucción IN, carga datos desde un espacio de I/O (Puertos, Timers, Registros de
Configuración, etc.) al registro destino, Rd.
Ejemplo:
in r25,$16 ;Lee el puerto B
cpi r25,4 ;Compara el valor leído con una constante
breq exit ;Salta si r25=4
...
exit: nop ;Salta al destino (no hace nada)
La instrucción OUT, envía los datos desde un registro fuente, Rr, a un espacio de I/O
(Puertos, Timers, Registros de Configuración, etc.).
Ejemplo:
clr r16 ;Limpia el registro r16
ser r17 ;Coloca unos en r17
out $18,r16 ;Envía ceros al puerto B
nop ;Espera (no hace nada)
out $18,r17 ;Envía unos al puerto B
Tabla 3.4.
Ejemplo:
out $1E,r0 ;Se escribe la dirección de la EEPROM
sbi $1C,0 ;Pone a 1 el bit 0 del registro 1C (EECR)
in r1,$1D ;Lee el dato de la EEPROM
Ejemplo:
cbi $12,7 ;Limpia el bit 7 del puerto D
La instrucción LSL, recorre todos los bits a la izquierda en un bit. El Bit 0 se limpia. El
Bit 7 se carga en la bandera de acarreo, C, del registro SREG. Esta instrucción efectúa
multiplicaciones de números con signo y sin signo por 2.
Ejemplo:
add r0,r4 ;Suma r4 a r0
lsl r0 ;Multiplica r0 por 2
Documento traducido de la hoja de datos del ATmega32 13
__________________________________________________________________________ITSP
La instrucción LSR, recorre todos los bits a la derecha en un bit. El Bit 7 se limpia. El Bit
0 se carga en la bandera de acarreo, C, del registro SREG. Esta instrucción efectúa
divisiones de números sin signo entre 2.
Ejemplo:
add r0,r4 ;Suma r4 a r0
lsr r0 ;Divide r0 entre 2
La instrucción ROL, recorre todos los bits del registro destino a la izquierda. La bandera
del acarreo se pasa al Bit 0 del registro. El Bit 7 se pasa a la bandera del acarreo, C.
Esta instrucción combinada con LSL, efectúa multiplicaciones de varios bytes con
valores con signo y sin signo por 2.
Tabla 3.5.