Microprocesadores I
Tema 5 Programación avanzada de AVR en ensamblador
Modos de direccionamiento La CPU puede acceder a la información de varia maneras. La información puede estar en un registro, en la memoria o pude ser un valor inmediato.
●
Las distintas formas de acceder a la información se denominan modos de direccionamiento ( direccionamiento (addressing addressing modes). modes).
●
Los AVR AVR tiene los siguientes tipos de d e direccionamiento:
●
•
•
•
•
•
•
Registro imple (!nmediato) Registro "irecto !ndirecto por Registro #las$ "irecto #las$ !ndirecto
Direccionamiento de registro simple (inmediato) ●
%n este modo de direccionamiento, el operando es un registro. NEG COM INC ROR
●
R18 R19 R20 R22
;Negar el contenido de R18 ;Complementar el contenido de R19 ;Incrementar R20 ;Rotar a la derecha R22
%n algunas instrucciones tam&i'n $a una constante con el registro de operación. LDI #$%I (NDI
R190!2" R190!0& R190)10000000
;Cargar 0!2" en R20 ;Re'tar 0!0& de R19 ;(ND entre R19 * 0!+0
Direccionamiento de dos registros ●
%ste modo de direccionamiento involucra dos registros para almacenar la información a ser manipulada. (DD #$% (ND MO/
R20R2, R29R20 R1&R1. R2,R19
;#-ma R20 * R2, ;Re'ta R20 de R29 ;(ND entre R1& * R1. ;Copia el contenido de R2, en R19
Direccionamiento directo ●
●
%n el modo de direccionamiento directo, la información para la operación est en una dirección conocida de la memoria RA*. LD#
R190!0"&0
##
0!0+0R19
;Cargar en R19 el contenido de ;la po'icin de memoria 0!"&0 ;G-ardar R19 en la po'icin 0!0+0
e de&e notar +ue la memoria de datos no soporta el modo de direccionamiento inmediato. Para mover datos a la memoria RA* interna o los registros de %, primero se de&en cargar en los registros de propósito general (R-/ R0-), luego se transfieren de los registros de propósito general $acia la memoria RA*.
Direccionamiento directo de E! ●
●
●
●
Para acceder a los registros de %, se puede utili1ar el modo de direccionamiento directo de E/S. Los registros de % generalmente tienen un nom&re a definido (""R2, P3R4A, P!5C). ólo se puede acceder a las posiciones de memoria entre 678 69#, +ue se conoce como memoria estándar de E/S. Algunos AVR tienen registros de % fuera del espacio estndar, conocido como memoria extendida de E/S. %n este caso se puede usar solo el direccionamiento directo. IN O$
R18IN( OR%R20
;Leer en R18 el p-erto ( ;Copiar el contendido ;de R20 en el p-erto %
Direccionamiento directo de E! ●
*apa de la memoria de datos de los microcontroladores A4mega;;;-;07;
Direccionamiento indirecto por registro ●
●
●
Para acceder a la memoria de datos tam&i'n se puede usar el modo de direccionamiento indirecto por registro. %n el direccionamiento indirecto por registro se usa un registro como puntero a la dirección de memoria +ue se +uiere acceder. %n los AVR se utili1an tres registros con este propósito, <, = >, +ue son registros de - &its.
Direccionamiento indirecto por registro ●
Los registros <, = > se usan como punteros. e pueden usar con la instrucción L" para leer el dato contenido en la dirección a la +ue apuntan estos registros. LDI LDI LD
●
3L0!,0 340!01 R183
;Cargar en R18 el contenido de la ;po'icin de memoria a la 5-e ;ap-nta 3 60!01,07
La instrucción 4 se utili1a para escri&ir un valor en una dirección a la +ue apunta uno de los registros <, = ó >.
LDI LDI #
L0!,0 40!01 R19
;G-ardar el contenido de R19 en la ;po'icin de memoria a la 5-e ;ap-nta 60!01,07
Venta"as del direccionamiento indirecto por registro Permite un acceso a la información de manera dinmica, en lugar de esttica.
●
%scri&ir un programa +ue guarde 8?99 en las posiciones de memoria 8?-8 a 8?-. LDI LDI LDI LDI
R1&0!0" R200!"" :L0!+0 :40!01
;Contador R1&" ;Dato a g-ardar en memoria ;%*te )ao direccin de memoria ;%*te alto direccin de memoria
# INC DEC %RNE
:R20 :L R1& L1
;G-arda dato en memoria ;Incrementar p-ntero ;Decrementar contador ;Repite ha'ta 5-e R1&0
L1<
A#to incremento $ a#to decremento de los registros p#ntero ●
●
Los punteros (<, = >) son registros de - &its, pero al usar la instrucción @!5C >L, si >L es 8?##, el acarreo no se propaga $acia >B. Para solucionar este pro&lema, los AVR tienen la opción de auto incrementar auto decrementar los registros puntero. LD LD LD
●
Rn3 Rn3= Rn>3
;L-ego de cargar el dato 3 no cam)ia ;L-ego de cargar el dato 3 'e incrementa ;#e decrementa 3 * l-ego 'e carga el dato
%l auto incremento auto decremento se aplica a todas las instrucciones +ue usan los registros puntero.
A#to incremento $ a#to decremento de los registros p#ntero %scri&ir un programa para leer los datos de las posiciones de memoria 8?8-88 a 8?8-89, enviar los datos al puerto ", un &te a la ve1. LDI O$ LDI LDI LDI
R200!?? DDRDR20 R1&0!0& :L0!00 :40!01
;-erto D como 'alida ;Contador R1& & ;%*te )ao del p-ntero ;%*te alto del p-ntero
LD O$ DEC %RNE
R20:= ORDR20 R1& L1
;Leer dato de memoria e inc@ : ;E'cri)ir dato en p-erto D ;Decrementar contador ;Repetir ha'ta 5-e R1& 0
L1<
Indirecto por registro con desplazamiento ●
%n este modo de direccionamiento, un nmero fiDo se aEade al registro Y ó al registro Z.
●
L"" Rr, =F+
G8 H + H 0
●
4" =F+, Rr
●
L"" Rr, >F+
G8 H + H 0
●
4" >F+, Rr
G8 H + H 0
G8 H + H 0
%D&' %D $ datos i"os en memoria R*M ●
●
."2 se utili1a para definir datos fiDos de ; &its (byte) en la memoria de programa (R3*) ."I se utili1a para definir datos fiDos de - &its (word ) en la memoria de programa (R3*).
@ORG @D% @D% @D
0!0000 AaA 0!"" 99 0)10101010 cadena de caractere' 0!1020 102+ 0!20
;DeBine + )*te' ;DeBine -n 'tring ;DeBine , ord'
+ect#ra de elementos de #na tabla ●
!nstrucción LP* (Load Program M emory ). Lectura de datos de la memoria de programa (R3*).
●
LP* Rn, >
G> no cam&ia luego de cargar datos.
●
LP* Rn, >F
G> se incrementa luego de cargar datos.
i L2 J 8, se selecciona el &te &aDoG si L2 J -, se selecciona el &te alto. Los &its - a -9 direccionan una pala&ra ( word ).
+ect#ra de elementos de #na tabla Valores de > dirección de memoria #LAB. Byte alto Z
Byte bajo Z
Dirección FLASH
●
4A2LA en 8?888;
8?888-
8?8888
8?8888
●
B!MB(4A2LA) J 8?88
8?8880
8?8887
8?888-
●
8?8889
8?888
8?8887
L3I(4A2LA) J 8?8;
8?888K
8?888
8?8880
8?888
8?888;
8?888 ●
B!MB(4A2LANN-)J8?88
●
L3I(4A2LANN-)J8?-8
8?8882
8?888A
8?8889
8?888"
8?888C
8?888
8?888#
8?888%
8?888K
8?88--
8?88-8
8?888;
8?88-0
8?88-7
8?888
...
...
...
+ect#ra de elementos de #na tabla %scri&ir un programa +ue lea -8 datos de un sector de memoria, identificado como ta&la. INICIO< LDI 4 4IG46(%L(F1 17 LDI L LO6(%L(F1 17 LDI R1& 0!0( LOO< LM R20 = DEC R1& %RNE LOO HM INICIO (%L(F1< @D% A0AA1A A2A A,A A+A
;Carga )*te alto 1 ;Carga )*te )ao 1 ;Contador R1&10 ;Lee memoria ;Decrementa contador ;Repite ha'ta 5-e R1&0 A"A A&A A.A A8A A9A
+ect#ra de elementos de #na tabla
En archio @map< C#EG INICIO C#EG (%L(F1 C#EG LOO
00000000 00000008 0000000,
LDI LDI
44IG46(%L(F1 17 LLO6(%L(F1 17
;4 0!00 ;L 0!10
LDI LDI
44IG46(%L(F17 LLO6(%L(F17
;4 0!00 ;L 0!08
Tabla de cons#lta (look-up table) Leer los pines P28/P20 convertir el nmero en un dOgito (68/6#), +ue se saca por el puerto ", en formato de displa de K segmentos. LDI O$ LDI IN (ND O$
R1&0!?? DDRDR1& ;-erto D como 'alida R1& J61%07 K J61%17 K J61%27 K J61%,7 R1. DDR% R1& R1. DDR% R1& ;%0>%, como entrada'
LDI
44IG46(%L(F.F#EG 17
;%*te alto de la ta)la
L0< LDI LLO6(%L(F.F#EG 17 ;%*te )ao de la ta)la IN R1&IN% ;Leer p-erto % (NDI R1&0!0? ;oner a 0 + )it' m' 'igniBicatio' (DD LR1& ;Calc-lar alor a leer de ta)la LM R1. ;Leer de la ta)la O$ ORDR1. ;E'cri)ir en el p-erto D HM L0 ;Repetir (%L(F.F#EG< ; A0A A1A A2A A,A A+A A"A A&A A.A @D% 0!,? 0!0& 0!"% 0!+? 0!&& 0!&D 0!.D 0!0. ; A8A A9A AaA A)A AcA AdA AeA ABA @D% 0!.? 0!&? 0!.. 0!.C 0!,9 0!"E 0!.9 0!.1
Direccionamiento de bits Para los registros de propósito general (R0R!"# ●
24 Rd, &
GMuarda el &it b de Rd en el &it T del SREG
●
2L" Rd, &
GCopia el &it T del SREG en el &it b de Rd
●
2R Rd, & Galta una instrucción si el &it b de Rd es -
●
2RC Rd, & Galta una instrucción si el &it b de Rd es 8 Para los registros de $%S
●
2!
A, &
GPone en - el &it b del registro A
●
C2!
A, &
GPone en 8 el &it b del registro A
●
2! A, &
Galta una instrucción si el &it b de A es -
●
2!C A, &
Galta una instrucción si el &it b de A es 8
Direccionamiento de bits ●
"ireccionamiento de &its en el R%M Q altos
Direccionamiento de bits ●
"ireccionamiento de &its en el R%M / *anipulación
Macros Un macro es un conDunto de instrucciones +ue se representan por una sola declaración.
●
"efinición de un macro:
●
●
●
@M(CRO nom)re @ENDM(CRO
La directiva .*ACR3 indica el inicio de la definición .%5"*ACR3 indica el final. Lo +ue est en medio se conoce como cuerpo (body ). %l nom&re de&e ser nico. Un macro puede reci&ir $asta -8 parmetros, +ue son referenciados como 8 $asta en el cuerpo del macro.
Macros ●
●
Una ve1 definido, un macro se puede invocar o llamar por su nom&re los valores apropiados se sustituen por parmetros. Por eDemplo, para cargar valores constantes en registros de %, se puede usar el siguiente macro. @M(CRO LO(DIO LDI R201 O$ 0R20 @ENDM(CRO @E$ /(L1 0!?? LO(DIO OR(0!20 LO(DIO DDRC/(L1 LO(DIO #L0!""
;Carga 0!20 en OR( ;Carga /(L1 en DDRC ;Carga 0!"" en #L
Macros %Demplo de macro para retardo cuo tiempo depende del valor +ue se le pasa cuando se lo invoca. @M(CRO LDI L(OF0< NO NO DEC %RNE @ENDM(CRO DEL(:
DEL(: 01
0 L(OF0 R180!.0
;Llamada a DEL(:
Pr,ctica ●
●
%scri&ir simular un programa para leer el &te &aDo del puerto 2 (8?8 a 8?#) sacar el valor leOdo por puerto " en formato de K segmentos. %scri&ir un macro para un retardo de -8 ms, con un reloD de - *B1, +ue se pueda invocar para o&tener tiempos desde -8 ms $asta 7998 ms.