You are on page 1of 21

SISTEMAS MICROPROCESADOS

Departamento de Automatizacin y
Control Industrial - DACI
Control de Flujo

Temario

Control de Flujo

Se analizara varios ejemplos de control


de flujo en C y la forma de codificar en
Assembler AVR.
Control de Flujo

Declaracin IF
Cumple con la condicin se ejecuta la
declaracin; de lo contrario la declaracin se
omite.

Por ejemplo, el siguiente cdigo C.

if (n >= 3)
{
expr++;
n = expr;
}
Control de Flujo

Su equivalente en assembler

.def n = r16
.def expr = r17
.equ cmp = 3
...
cpi n, cmp ; Compara valor
IF: brsh EXEC ; If n <= 3 entonces salta a NEXT
rjmp NEXT ; Salta a NEXT si la expresion es falsa
EXEC: inc expr ; incrementa expr
mov n, expr ; Setea n = expr
NEXT: ... ; Continuar con el codigo
Control de Flujo

Declaracin IF-ELSE
Esto es muy similar a la instruccin IF, excepto
que tiene una sentencia else incondicional
adicional.

Un ejemplo Cdigo C.

if (n == 5)
expr++;
else
n = expr;
Flujos de Control

Su equivalente en assembler

.def n = r16
.def expr = r17
.equ cmp = 5
...
cpi n, cmp ; Comparo valor
IF: brne ELSE ; Salta a ELSE si la expresion es falsa
inc expr ; Ejecuta la declaracin IF
rjmp NEXT ; Cotinua con el cdigo
ELSE: mov n, expr ; Ejecuta la declaracin ELSE
NEXT: ... ; Continua con el cdigo
Flujos de Control

Declaracin IF-ELSEIF-ELSE
Esto es simplemente una mezcla anidada de
la IF y ELSE IF. Un ejemplo sera C:

if (n < 3)
expr++;
else if (n == 5)
n = expr;
else
n++;
Control de Flujo

Su equivalente en assembler
.def n = r16
.def expr = r17
.equ val1 = 3
.equ val2 = 5
...
cpi n, val1 ; Comparar n con val1
IF: brsh ELIF ; If no es n < 3, luego salta ELSEIF
inc expr ; Ejecuta condicion if
rjmp NEXT ; Salta Next
ELIF: cpi n, val2 ; Compara n con val2
brne ELSE ; If no es n == 5, luego salta condicion ELSE
mov n, expr ; Ejecuta condicion Execute ELSEIF
rjmp NEXT ; Salta Next
ELSE: inc n ; Ejecuta condicion ELSE
NEXT: ... ; Continua con el codigo
Control de Flujo

Declaracin WHILE
La sentencia while se utiliza comnmente
para crear bucles repetitivos. De hecho, es
comn utilizar un bucle infinito.

while (n < 10) {


sum += n;
n++;
}
Control de Flujo

Su equivalente en assembler

.def n = r16
.def sum = r16
.equ limit = 10
...
WHILE: cpi n, limit ; Compara n con limit
brsh NEXT ; Cuando n > limit, salta NEXT
add sum, n ; sum += n
inc n ; n++
rjmp WHILE ; Salta para compenzar el lazo WHILE
NEXT: ... ; Continua el codigo
Control de Flujo

Sentencia DO
La sentencia DO puede considerarse una
variante de la sentencia while. En lugar de
hacer su ensayo en la parte superior del
bucle, se hace en la parte inferior. El
siguiente es un ejemplo:

do {
sum += n;
n--;
} while (n > 0);
Control de Flujo

Su equivalente en assembler

.def n = r16
.def sum = r17
.equ limit = 0
...
DO: add sum, n ; sum += n
dec n ; n--
brne DO ; si n mayor a zero sigue sumando
NEXT: ... ; Continua con el codigo
Control de Flujo

Sentencia FOR
La sentencia FOR, al igual que la sentencia
while, se utiliza para ejecutar cdigo de
forma iterativa.

for (n = 0; n < 10; n++)


sum += n;
Control de Flujo

Su equivalente en assembler

.def n = r16
.def sum = r17
.equ max = 10
...
ldi n, max ; Inicializa n al max
FOR: add sum, n ; sum += n
dec n ; Decrementa n
brne FOR ; Repita el lazo si n no es igual a 0
NEXT: ... ; Rest of code
Control de Flujo

Sentencia Switch
La sentencia switch es una sentencia
condicional multiva generalizar la
instruccin IF-ELSE.
switch (val) {
case 1:
a_cnt++;
break;
case 2:
case 3:
b_cnt++;
break;
default:
c_cnt++;
}
Control de Flujo
Su equivalente en assembler
.def val = r16
.def a_cnt = r17
.def b_cnt = r18
.def c_cnt = r19
...
SWITCH: ; Comenzamos declaracion SWITCH
S_1: cpi val, 1 ; Comparo val con 1
brne S_2 ; Salta a S_2 si val != 1
inc a_cnt ; Ejecuta case 1
rjmp NEXT ; Break switch
S_2: cpi val, 2 ; Compara val con 2
brne S_3 ; Salta a S_3 si val != 2
rjmp NEXT ; Break switch
S_3: cpi val, 3 ; Compara val con 3
brne DFLT ; Salta a DFLT si val != 3
inc b_cnt ; Ejecuta case 3
rjmp NEXT ; Break switch
DFLT: inc c_cnt ; Ejecuta default
NEXT: ... ; Resto de codigo
EJERCICIO

Ejercicio:

Mover 10 datos de memoria flash y enviarlos a memoria


SRAM (0x0100)
SOLUCION
.include "m164pdef.inc" copiar:
.def Aux=R16 ldi ZH,high (tabla<<1) ; inicializar el puntero parte alta
.def Dato=R17 ldi ZL,low (tabla<<1) ; inicializar el puntero parte baja
.def temp=r18 add ZL,temp
lpm Dato,Z
.org 0x00 inc temp
rjmp inicio st X+,Dato
ret
inicio:
ldi Aux,10 ; tabla de datos
ldi temp,0 tabla:
ldi R26,0x00 .db 255,10,4,127,63,31,15,7,3,1
ldi R27,0x01

salto:
rcall copiar
dec Aux
brne salto
lazo: rjmp lazo
DEBER

Ejercicio:

Dados 50 datos de memoria flash, ordenar estos datos


De menor a mayor en la memoria SRAM a partir de la direccin
0x0100.
Bibliografa

1. Muhammad Ali Mazidi (2011). The avr


microcontroller and embedded system.

2. Yago Torroja & Jorge Portilla, Curso de


Microcontroladores, Escuela Tcnica
Superior de Ingenieros Industriales,
Universidad Politcnica de Madrid
SISTEMAS MICROPROCESADOS
Departamento de Automatizacin y
Control Industrial - DACI

Marco Herrera
marco.herrera@epn.edu.ec

You might also like