Documente Academic
Documente Profesional
Documente Cultură
Departamento de Automatizacin y
Control Industrial - DACI
Control de Flujo
Temario
Control de Flujo
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
IF:
brsh EXEC
rjmp NEXT
EXEC: inc expr
mov n, expr
NEXT: ...
; Compara valor
; If n <= 3 entonces salta a NEXT
; Salta a NEXT si la expresion es falsa
; incrementa expr
; Setea n = expr
; 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
.def
.equ
...
n = r16
expr = r17
cmp = 5
cpi n, cmp
IF: brne ELSE
inc expr
rjmp NEXT
ELSE: mov n, expr
NEXT: ...
; Comparo valor
; Salta a ELSE si la expresion es falsa
; Ejecuta la declaracin IF
; Cotinua con el cdigo
; Ejecuta la declaracin ELSE
; 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
brsh NEXT
add sum, n
inc n
rjmp WHILE
NEXT: ...
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
dec n
brne DO
NEXT: ...
; sum += n
; n-; si n mayor a zero sigue sumando
; 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
FOR: add sum, n
dec n
brne FOR
NEXT: ...
; Inicializa n al max
; sum += n
; Decrementa n
; Repita el lazo si n no es igual a 0
; 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:
S_1: cpi val, 1
brne S_2
inc a_cnt
rjmp NEXT
S_2: cpi val, 2
brne S_3
rjmp NEXT
S_3: cpi val, 3
brne DFLT
inc b_cnt
rjmp NEXT
DFLT: inc c_cnt
NEXT: ...
EJERCICIO
Ejercicio:
Mover 10 datos de memoria flash y enviarlos a memoria
SRAM (0x0100)
SOLUCION
.include "m164pdef.inc"
.def Aux=R16
.def Dato=R17
.def temp=r18
copiar:
ldi ZH,high (tabla<<1) ; inicializar el puntero parte alta
ldi ZL,low (tabla<<1) ; inicializar el puntero parte baja
add ZL,temp
lpm Dato,Z
inc temp
st X+,Dato
.org 0x00
rjmp inicio
ret
inicio:
ldi Aux,10
ldi temp,0
ldi R26,0x00
ldi R27,0x01
salto:
rcall copiar
dec Aux
brne salto
lazo: rjmp lazo
; tabla de datos
tabla:
.db 255,10,4,127,63,31,15,7,3,1
DEBER
Ejercicio:
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