Professional Documents
Culture Documents
5.1 INTRODUCCIÓN
Las instrucciones en ensamblador son pequeñas, por ejemplo out PortD,r15, la cual
escribe el contenido del registro 15 en el Puerto D (el cual es un registro de 8 líneas de
I/O).
La mayoría de las instrucciones al ser ejecutadas dejan ciertos bits en cero o puestos a
uno en el Registro de Estado [SREG (5Fh)]. Estos bits se pueden usar para
instrucciones de salto o instrucciones aritméticas.
Aquí se tiene un ejemplo sencillo, que muestra las instrucciones aritméticas, de salto y
de I/O.
DIAGRAMA DE FLUJO
El Diagrama de Flujo es una representación grafica del código, el estado del programa
o incluso el contenido de la SRAM. Especialmente cuando se escribe código en
ensamblador ellos son de gran ayuda, debido a que las instrucciones en ensamblador
no siempre son del todo explicativas.
contador = 0
for_loop
contador =
contador + 1
PortD = counter
Falso
contador = 10?
Verdadero
siguiente
línea
A menudo, por ejemplo cuando se reciben comando de valores vía el Puerto serial
(USART), es necesario construir una estructura “case” que determine que función se
necesita llamar. La estructura “case” compara un valor para varios casos de valores.
Como la instrucción de salto no cambian las banderas, esto puede se implementado de
la siguiente manera:
Después de que todos los casos se hayan comparado, tu puedes escribir la directiva
“default” la cual se ejecutara si ninguno de los casos han resultado iguales. La
estructura “case” no solamente compara valores unicos, también de pueden verificar un
rango específico de valores o comparar cadenas. Aquí tenemos un ejemplo:
Para esté último ejemplo también se puede usar la instrucción brlt (salta si es menor
que) si estas usando números con signo.
Una versión flexible cuenta de cero hacia arriba hasta un número requerido de
iteraciones. Es posible usar el registro de conteo
¿Cual es la diferencia entre los dos lazos? El primer lazo incrementa el contador antes
de escribirse en el Puerto B. Así los valores en el puerto van de 0..9. Mientras que en el
segundo lazo se incrementa el contador antes de escribirse en el puerto B. Así que
vemos los valores en el puerto que van de 1..10.
Recuerda que siempre que utilices los registros en los lazos de control, tendrás que
incrementar el registro, de lo contrario entrarías a un ciclo infinito.
Este tipo de lazo solamente ejecutara las instrucciones del lazo si la condición es
verdadera, de lo contrario nunca hará nada.
El lazo do{}...while() ejecuta las instrucciones del lazo al menos una vez:
Las macros son una mejor manera de hacer el código más legible, por ejemplo, si existe
código que es a menudo reutilizado o si alrededor de 16 cálculos de bits se ejecutan.
Las macros en el ensamblador AVR pueden definirse en cualquier lugar dentro del
código, pero tendrán que ser usadas después de ser definidas.
La directiva MACRO le dice al ensamblador que este es el inicio de una macro. Las
macros pueden tomar hasta 10 argumentos. Estos argumentos son referidos como @0-
@9 dentro de la definición de la macro. Estos argumentos son reemplazados durante el
ensamblado pero no pueden cambiarse durante el tiempo de ejecución. Los
argumentos que maneja el ensamblador son casi todos: enteros, caracteres, registros,
direcciones de I/O, enteros de 16 o 32 bits, expresiones binarias, etc.
.macro ldi16 ;la macro se llama ldi16, utiliza dos registros de 8 bits
ldi @0,low(@2) ;se carga el primer argumento en (@0) con el byte bajo de @2
ldi @1,high(@2) ;se carga el segundo argumento en (@1) y el byte alto de @2
.endmacro ;fin de la macro
ldi16 r16,r17,1024 ;se manda a llamar así: ldi16 arg 0,arg 1,arg 2
;r16 = 0x00 r17 = 0x04
Mientras que esto no, macro se manda a llamar primero sin haber sido definida:
.macro ldi16
ldi @0, low(@2)
ldi @1, high(@2)
.endmacro
Las macros pueden también usarse para reemplazar los cálculos a 16 bits.
.macro addi
subi @0,-(@1)
; Esta es la instrucción "Suma inmediata a registro”
.endmacro
; que no se encuentra en el set de instrucciones!
.macro addi16
; La versión a 16 bits ”Suma inmediata a registro”
subi @0, low(-@2)
sbci @1, high(-@2)
.endmacro
Las macros pueden ser más complejas, tener más argumentos. Si muchas macros se
definen una sola línea, las últimas no podrán encontrarse.