You are on page 1of 39

PROBLEMAS PROPUESTOS

1.

Disee un programa que controle el encendido de 8 leds ubicados en el


puerto D, Estos deben encender de dos en dos hasta que
todos estn encendidos, el encendido debe comenzar cuando se cierra un
interruptor ubicado en el pin pc0.
Se pide:
a) Realizar el diagrama de flujo del programa:

b) Escribir el programa :
.include "m8def.inc"
.cseg
.org 0x00
rjmp INICIO
INICIO:

FIEE-UNAC
LDI R16,HIGH(RAMEND); Se apunta a la posicin de la memoria
OUT SPH,R16
LDI R16,LOW(RAMEND);Stack
OUT SPL,R16
SER R16; poner a '1' los bits R16
OUT DDRD,R16; el puerto salida de datos
CBI DDRC,0; pone PC0 como entrada
Interruptor:
ldi r16,0x00
out portd,r16
SBIC PINC,0; si pinc=0 salta la instruccin
rjmp Interruptor
loop:
LDI R17,0x00
OUT PORTD,R17; Leds apagados
Rcall delay
LDI R17,0xC0
OUT PORTD,R17; led pb7,pb6 encendidos
Rcall delay
LDI R17,0xF0
OUT PORTD,R17; led pb7,pb6,pb5,pb4 encendidos
Rcall delay
LDI R17,0xFC
out portD,R17; led pb7,...,pb2 encendidos
Rcall delay
LDI R17,0xFF
Out portD,R17; todos los leds encendidos
Rcall delay
rjmp interruptor
Delay:;retardo de 1 seg
LDI R18,95
X1: LDI R19,82
X2: LDI R20,50
X3: DEC R20
BRNE X3
DEC R19
BRNE X2
DEC R18
BRNE X1
RET

c) Presentar el circuito dejando listo para hacer pruebas en el laboratorio:

FIEE-UNAC

d) Simular el funcionamiento de dicho circuito con el software proteus

2. Un programa sigue los siguientes pasos:


Definicin del procesador a emplearse.
Definicin de variables, en nuestro caso de tipo byte.
Configuracin de los puertos. Pin B0 salida.
a) Pone la salida B0 a 1 (prende LED) durante 300ms
b) Pone la salida B0 a 0 (apaga LED) durante 300ms.

Repite a ) y b ) 10 veces

FIEE-UNAC

Retardo de un segundo
c) Prende LED durante 500ms
d) Apaga LED durante 200ms
Repite c ) y d ) 5 veces
Retardo un segundo
Repite de manera infinita.
I.
Se pide escribir las instrucciones para implementar el programa
II.
Realice la simulacin del sistema

SOLUCION:
a) Diagrama de flujo del programa:

FIEE-UNAC

b) Escribir el programa:
.include "m8def.inc"
.cseg
.org 0x00
rjmp INICIO
INICIO:
LDI R16,HIGH(RAMEND); Se apunta a la posicin de la memoria
OUT SPH,R16
LDI R16,LOW(RAMEND);Stack
OUT SPL,R16

FIEE-UNAC
SBI DDRB,0;declaramos PB0 como salida
PROGRAMA:
LDI R16,0b00000001;cargamos"1" en el registro R16
OUT PORTB,R16;mostramos por el puerto B el valor de R16
RCALL pausa300;llama ala subrutina"pausa300"
LDI R16,0b00000010;cargamos"2" en el registro R16
OUT PORTB,R16
RCALL pausa300
LDI R16,0b00000001
OUT PORTB,R16
RCALL pausa300
LDI R16,0b00000010
OUT PORTB,R16
RCALL pausa300
LDI R16,0b00000001
OUT PORTB,R16
RCALL pausa300
LDI R16,0b00000010
OUT PORTB,R16
RCALL pausa300
LDI R16,0b00000001
OUT PORTB,R16
RCALL pausa300
LDI R16,0b00000010
OUT PORTB,R16
RCALL pausa300
LDI R16,0b00000001
OUT PORTB,R16
RCALL pausa300
LDI R16,0b00000010
OUT PORTB,R16
RCALL pausa300
LDI R16,0b00000001
OUT PORTB,R16
RCALL pausa300
LDI R16,0b00000010
OUT PORTB,R16
RCALL pausa300
LDI R16,0b00000001
OUT PORTB,R16
RCALL pausa300
LDI R16,0b00000010
OUT PORTB,R16
RCALL pausa300
LDI R16,0b00000001
OUT PORTB,R16
RCALL pausa300
LDI R16,0b00000010
OUT PORTB,R16
RCALL pausa300
LDI R16,0b00000001
OUT PORTB,R16
RCALL pausa300
LDI R16,0b00000010
OUT PORTB,R16
RCALL pausa300
LDI R16,0b00000001
OUT PORTB,R16

FIEE-UNAC
RCALL pausa300
LDI R16,0b00000010
OUT PORTB,R16
RCALL pausa1;llamamos a la subrutina"pausa1"
LDI R16,0b00000001;cargamos"1" en el registro R16
OUT PORTB,R16;mostramos por el puerto B el valor de R16
RCALL pausa500;llamamos a la subrutina"pausa500"
LDI R16,0b00000010
OUT PORTB,R16
RCALL pausa200;llamamos a la subrutina"pausa200"
LDI R16,0b00000001
OUT PORTB,R16
RCALL pausa500
LDI R16,0b00000010
OUT PORTB,R16
RCALL pausa200
LDI R16,0b00000001
OUT PORTB,R16
RCALL pausa500
LDI R16,0b00000010
OUT PORTB,R16
RCALL pausa200
LDI R16,0b00000001
OUT PORTB,R16
RCALL pausa500
LDI R16,0b00000010
OUT PORTB,R16
RCALL pausa200
LDI R16,0b00000001
OUT PORTB,R16
RCALL pausa500
LDI R16,0b00000010
OUT PORTB,R16
RCALL pausa1;llamamos a la subrutina"pausa1"
RJMP PROGRAMA;retornamos a"PROGRAMA"
pausa200:;retardo de 200ms
LDI R18,25;carga R18 con 25
X1: LDI R19,40;carga R19 con 40
X2: LDI R20,25;carga R20 con 25
X3: DEC R20;decrementa en 1 a R20
BRNE X3;si R20 es diferente de cero, sigue decrementando (salto a "x3"), si R20 = 0, sigue
DEC R19;decrementa en 1 a R19
BRNE X2;si R19 es diferente de cero, sigue decrementando (salto a "x2"), si R19 = 0, sigue
DEC R18;decrementa en 1 a R18
BRNE X1;si R18 es diferente de cero, sigue decrementando (salto a "x1"), si R18 = 0, sigue
RET;retorno a la linea siguiente
pausa300:;retardo de 300ms
LDI R21,30;carga R21 con 30
Y1: LDI R22,42;carga R22 con 42
Y2: LDI R23,50;carga R23 con 50
Y3: DEC R23;decrementa en 1 a R23
BRNE Y3;si R23 es diferente de cero, sigue decrementando (salto a "Y3"), si R23 = 0, sigue
DEC R22;decrementa en 1 a R22
BRNE Y2;si R22 es diferente de cero, sigue decrementando (salto a "Y2"), si R22 = 0, sigue
DEC R21;decrementa en 1 a R21
BRNE Y1;si R21 es diferente de cero, sigue decrementando (salto a "Y1"), si R21 = 0, sigue
RET;retorno a la linea siguiente
pausa500:;retardo de 500ms

FIEE-UNAC
LDI R24,50;carga R24 con 50
Z1: LDI R25,75;carga R25 con 75
Z2: LDI R26,50;carga R26 con 50
Z3: DEC R26;decrementa en 1 a R26
BRNE Z3;si R26 es diferente de cero, sigue decrementando (salto a "Z3"), si R26 = 0, sigue
DEC R25;decrementa en 1 a R25
BRNE Z2;si R25 es diferente de cero, sigue decrementando (salto a "Z2"), si R25 = 0, sigue
DEC R24;decrementa en 1 a R24
BRNE Z1;si R24 es diferente de cero, sigue decrementando (salto a "Z1"), si R24 = 0, sigue
RET;retorno a la linea siguiente
pausa1:;retardo de 1seg
LDI R27,70;carga R27 con 70
S1: LDI R28,60;carga R28 con 60
S2: LDI R29,60;carga R29 con 60
S3: DEC R29;decrementa en 1 a R29
BRNE S3;si R29 es diferente de cero, sigue decrementando (salto a "S3"), si R29 = 0, sigue
DEC R28;decrementa en 1 a R28
BRNE S2;si R28 es diferente de cero, sigue decrementando (salto a "S2"), si R28 = 0, sigue
DEC R27;decrementa en 1 a R27
BRNE S1;si R27 es diferente de cero, sigue decrementando (salto a "S1"), si R27 = 0, sigue
RET;retorno a la linea siguiente

c) Realizar la simulacin:
No Compilado

Compilado

FIEE-UNAC

3. Hacer funcionar un motor CD, con el integrado L293, tal que durante 5
segundos gire en un sentido y durante 5 segundos en el otro.
a) Realizar el diagrama de flujo del programa

FIEE-UNAC

b) Escriba la programacin:
.include "m8def.inc"
.cseg
.org 0x00
rjmp inicio
inicio:
LDI R16,HIGH(RAMEND); Se apunta a la posicin de la memoria
OUT SPH,R16
LDI R16,LOW(RAMEND);Stack
OUT SPL,R16
SBI DDRB,0;declara como salida a PB0
SBI DDRB,1;declara como salida a PB1
PROGRAMA:
LDI R16,0b00000001;cargamos"1" en el registro R16
OUT PORTB,R16;mostramos por el puerto B el valor de R16
RCALL PAUSA;llama ala subrutina"PAUSA"
LDI R16,0b00000010;cargamos"2" en el registro R16

10

FIEE-UNAC
OUT PORTB,R16
RCALL PAUSA
RJMP PROGRAMA;retorna a"PROGRAMA"
PAUSA:
LDI R17,100;carga R17 con 100
ZZ:LDI R18,150;carga R18 con 150
YY:LDI R19,100;carga R19 con 100
XX:DEC R19;decrementa en 1 a R19
BRNE XX;si R19 es diferente de cero, sigue decrementando (salto a "XX"), si
R19 = 0, sigue
DEC R18;decrementa en 1 a R18
BRNE YY;si R18 es diferente de cero, sigue decrementando (salto a "YY"), si
R18 = 0, sigue
DEC R17;decrementa en 1 a R17
BRNE ZZ;si R17 es diferente de cero, sigue decrementando (salto a "ZZ"), si
R17 = 0, sigue
RET;retorno a la linea siguiente

c) Realizar la simulacin :
Sin Compilar

Compilado

11

FIEE-UNAC

4. Empleando el microcontrolador ATmega8 realizar el encendido intermitente (5


veces) de 8 Leds conectados en nodo comn al Puerto D. Luego de un retardo
de 2 segundos un LED se desplaza desde el pin D0 a D7 y reversa, emulando las
luces de auto fantstico, con un retardo de 150ms. Toda las acciones debe
comenzar cunado se cierra un interruptor
a) Realizar el diagrama de flujo del programa:

12

FIEE-UNAC

b) Escriba la programacin:
.include "m8def.inc"
.cseg
.org 0x00
rjmp inicio
inicio:
LDI R16,HIGH(RAMEND); Se apunta a la posicin de la memoria
OUT SPH,R16
LDI R16,LOW(RAMEND);Stack
OUT SPL,R16
SER R16; ponemos en "1" todos los bit de R16
OUT DDRD,R16; declaramos como salida al puerto D
CBI DDRB,0; declaramos como entrada PB0
PROGRAMA:
LDI R16,0x00
OUT PORTD,R16

13

FIEE-UNAC
SBIC PINB,0; lee el estado del pinB0=0,salta una linea
RCALL PROGRAMA; llama subrutina "PROGRAMA"
RCALL LUCES1; llama subrutina "LUCES1"
LUCES1:
LDI R17,0b10101010; carga "10101010" en R17
OUT PORTD,R17; muestra por el puerto D el valor de R17
RCALL PAUSA2; llama subrutina "PAUSA2"
LDI R17,0b01010101; carga "01010101" en R17
OUT PORTD,R17; muestra por el puerto D el valor de R17
RCALL PAUSA2
LDI R17,0b10101010
OUT PORTD,R17
RCALL PAUSA2
LDI R17,0b01010101
OUT PORTD,R17
RCALL PAUSA2
LDI R17,0b10101010
OUT PORTD,R17
RCALL PAUSA2
LDI R17,0b01010101
OUT PORTD,R17
RCALL PAUSA2
LDI R17,0b10101010
OUT PORTD,R17
RCALL PAUSA2
LDI R17,0b01010101
OUT PORTD,R17
RCALL PAUSA2
LDI R17,0b10101010
OUT PORTD,R17
RCALL PAUSA2
LDI R17,0b01010101
OUT PORTD,R17
RCALL PAUSA3; llama a la subrutina "PAUSA3"
RCALL LUCES2; llama a la subrutina "LUCES2"
LUCES2:
LDI R17,0b00000001; carga "00000001" en R17
OUT PORTD,R17; muestra por el puerto D el valor de R17
RCALL PAUSA1; llama a la subrutina "PAUSA1"
LDI R17,0b00000010; carga "00000010" en R17
OUT PORTD,R17; muestra por el puerto D el valor de R17
RCALL PAUSA1
LDI R17,0b00000100
OUT PORTD,R17
RCALL PAUSA1
LDI R17,0b00001000
OUT PORTD,R17
RCALL PAUSA1
LDI R17,0b00010000
OUT PORTD,R17
RCALL PAUSA1
LDI R17,0b00100000
OUT PORTD,R17
RCALL PAUSA1
LDI R17,0b01000000
OUT PORTD,R17
RCALL PAUSA1
LDI R17,0b10000000

14

FIEE-UNAC
OUT PORTD,R17
RCALL PAUSA1
LDI R17,0b01000000
OUT PORTD,R17
RCALL PAUSA1
LDI R17,0b00100000
OUT PORTD,R17
RCALL PAUSA1
LDI R17,0b00010000
OUT PORTD,R17
RCALL PAUSA1
LDI R17,0b00001000
OUT PORTD,R17
RCALL PAUSA1
LDI R17,0b00000100
OUT PORTD,R17
RCALL PAUSA1
LDI R17,0b00000010
OUT PORTD,R17
RCALL PAUSA1
LDI R17,0b00000001
OUT PORTD,R17
RCALL PAUSA1
RJMP PROGRAMA; retorna a "PROGRAMA"
PAUSA2:
LDI R21,50; carga R21 con 50
AA:LDI R22,50; carga R22 con 50
BB:LDI R23,70; carga R23 con 70
CC:DEC R23;decrementa en 1 a R23
BRNE CC;si R23 es diferente de cero, sigue decrementando (salto a "CC"), si R23
= 0, sigue
DEC R22;decrementa en 1 a R19
BRNE BB;si R22 es diferente de cero, sigue decrementando (salto a "BB"), si R22
= 0, sigue
DEC R21;decrementa en 1 a R19
BRNE AA;si R21 es diferente de cero, sigue decrementando (salto a "AA"), si R21
= 0, sigue
RET;retorno a la linea siguiente
PAUSA1:
LDI R24,20; carga R24 con 20
XX:LDI R25,40; carga R25 con 40
YY:LDI R26,30; carga R26 con 30
ZZ:DEC R26;decrementa en 1 a R26
BRNE ZZ;si R26 es diferente de cero, sigue decrementando (salto a "ZZ"), si R26
= 0, sigue
DEC R25;decrementa en 1 a R25
BRNE YY;si R25 es diferente de cero, sigue decrementando (salto a "YY"), si R25
= 0, sigue
DEC R24;decrementa en 1 a R24
BRNE XX;si R24 es diferente de cero, sigue decrementando (salto a "XX"), si R24
= 0, sigue
RET;retorno a la linea siguiente
PAUSA3:
LDI R27,80; carga R27 con 80
PP:LDI R28,85; carga R28 con 85
QQ:LDI R29,90; carga R29 con 90
RR:DEC R29;decrementa en 1 a R29

15

FIEE-UNAC
BRNE RR;si R29 es diferente de cero, sigue decrementando (salto a "RR"), si R29
= 0, sigue
DEC R28;decrementa en 1 a R28
BRNE QQ;si R28 es diferente de cero, sigue decrementando (salto a "QQ"), si
R28 = 0, sigue
DEC R27;decrementa en 1 a R27
BRNE PP;si R27 es diferente de cero, sigue decrementando (salto a "PP"), si R27
= 0, sigue
RET;retorno a la linea siguiente

c)

Hacer la simulacin:

No compilado

Compilado

16

FIEE-UNAC

5. Hacer los cambios en el ejercicio6 en caso de conectarse los Leds en ctodo


comn.
a) Realizar el diagrama de flujo del programa

17

FIEE-UNAC

b) Escriba la programacin:
.include "m8def.inc"
.cseg
.org 0x00
rjmp inicio
inicio:
LDI R16,HIGH(RAMEND); Se apunta a la posicin de la memoria
OUT SPH,R16
LDI R16,LOW(RAMEND);Stack
OUT SPL,R16

18

FIEE-UNAC
SER R16; poner a "1" los bits de R16
OUT DDRB,R16; declara como salida al puerto B
CBI DDRC,0; declara como entrada a PC0
PROGRAMA:
LDI R16,0x00
OUT PORTB,R16
SBIC PINC,0; lee el estado de PC0=0,salta una linea
RCALL JUEGODELEDS; llama a la subrutina "JUEGODELEDS"
RCALL PROGRAMA; llama a la subrutina "PROGRAMA"
JUEGODELEDS:
LDI R16,0xFF;cargamos"FF" en el registro R16
OUT PORTB,R16;mostramos por el puerto B el valor de R16
RCALL PAUSA; llama a la subrutina "PAUSA"
LDI R16,0x7E;cargamos"7E" en el registro R16
OUT PORTB,R16;mostramos por el puerto B el valor de R16
RCALL PAUSA
LDI R16,0x3C;cargamos"3C" en el registro R16
OUT PORTB,R16;mostramos por el puerto B el valor de R16
RCALL PAUSA
LDI R16,0x18;cargamos"18" en el registro R16
OUT PORTB,R16;mostramos por el puerto B el valor de R16
RCALL PAUSA
LDI R16,0x00;cargamos"00" en el registro R16
OUT PORTB,R16;mostramos por el puerto B el valor de R16
RCALL PAUSA
RJMP PROGRAMA
PAUSA:
LDI R18,50;carga R18 con 50
X1: LDI R19,40;carga R19 con 40
X2: LDI R20,25;carga R20 con 25
X3: DEC R20;decrementa en 1 a R20
BRNE X3;si R20 es diferente de cero, sigue decrementando (salto a "X3"), si
R20 = 0, sigue
DEC R19;decrementa en 1 a R19
BRNE X2;si R19 es diferente de cero, sigue decrementando (salto a "X2"), si
R19 = 0, sigue
DEC R18;decrementa en 1 a R18
BRNE X1;si R18 es diferente de cero, sigue decrementando (salto a "X1"), si
R18 = 0, sigue
RET;retorno a la linea siguiente

c) Hacer la simulacin:
No Compilado

19

FIEE-UNAC

Compilado

6. Realizar un juego de Leds que se desplacen desde los extremos (D7 y D0


inicialmente encendidos) hacia el centro. Los Leds estn conectados al PORTB.
Toda la accin de encendido debe comenzar cuando se cierra un interruptor
ubicado en el pin PC0
a) Realizar el diagrama de flujo del programa

20

FIEE-UNAC

b) Escriba la programacin:
.include "m8def.inc"
.cseg
.org 0x00
rjmp inicio
inicio:
LDI R16,HIGH(RAMEND); Se apunta a la posicin de la memoria
OUT SPH,R16
LDI R16,LOW(RAMEND);Stack
OUT SPL,R16
SER R16; poner a "1" los bits de R16

21

FIEE-UNAC
OUT DDRB,R16; declara como salida al puerto B
CBI DDRC,0; declara como entrada a PC0
PROGRAMA:
LDI R16,0x00
OUT PORTB,R16
SBIC PINC,0; lee el estado de PC0=0,salta una linea
RCALL PROGRAMA; llama a la subrutina "PROGRAMA"
RCALL JUEGODELEDS; llama a la subrutina "JUEGODELEDS"
JUEGODELEDS:
LDI R16,0xFF;cargamos"FF" en el registro R16
OUT PORTB,R16;mostramos por el puerto B el valor de R16
RCALL PAUSA
LDI R16,0x7E;cargamos"7E" en el registro R16
OUT PORTB,R16;mostramos por el puerto B el valor de R16
RCALL PAUSA; llama a la subrutina "PAUSA"
LDI R16,0x3C;cargamos"3C" en el registro R16
OUT PORTB,R16;mostramos por el puerto B el valor de R16
RCALL PAUSA
LDI R16,0x18;cargamos"18" en el registro R16
OUT PORTB,R16;mostramos por el puerto B el valor de R16
RCALL PAUSA
LDI R16,0x00;cargamos"00" en el registro R16
OUT PORTB,R16;mostramos por el puerto B el valor de R16
RCALL PAUSA
RJMP PROGRAMA; retorna a "PROGRAMA"
PAUSA:
LDI R18,50;carga R18 con 50
X1: LDI R19,40;carga R19 con 40
X2: LDI R20,25;carga R20 con 25
X3: DEC R20;decrementa en 1 a R20
BRNE X3;si R20 es diferente de cero, sigue decrementando (salto a "X3"), si
R20 = 0, sigue
DEC R19;decrementa en 1 a R19
BRNE X2;si R19 es diferente de cero, sigue decrementando (salto a "X2"), si
R19 = 0, sigue
DEC R18;decrementa en 1 a R18
BRNE X1;si R18 es diferente de cero, sigue decrementando (salto a "X1"), si
R18 = 0, sigue
RET;retorno a la linea siguiente

c) Hacer la simulacin:

Sin Compilar

22

FIEE-UNAC

Compilado

7. Se conectan dos interruptores al PORTC<1:0> con pull -up internas y segn el


valor ledo realice una accin determinada conforme la siguiente tabla de
verdad:

23

FIEE-UNAC
a) Realizar el diagrama de flujo del programa

b) Escriba la programacin:
.include "m8def.inc"
.cseg
.org 0x00
rjmp inicio
inicio:
LDI R16,HIGH(RAMEND); Se apunta a la posicin de la memoria
OUT SPH,R16
LDI R16,LOW(RAMEND);Stack
OUT SPL,R16
cbi ddrc,0; declara PC0 como entrada
cbi ddrc,1; declara PC1 como entrada
ser r16; pone a "1" los bits del r16

24

FIEE-UNAC
out ddrd,r16;declara como salida al puerto D
programa:
ldi r16,0x00
out portd,r16
sbic pinc,0; lee el estado del PC0=0, salta una linea
rcall prendido1; llama a "prendido1"
rcall apagado1; llama a "apagado1"
apagado1:
sbic pinc,1; lee el estado del PC1=0, salta una linea
rcall ledsintermitentes; llama a "ledsintermitentes"
rcall apagadototal; llama a "apagadototal"
apagadototal:
ldi r16,0x00
out portd,r16
rjmp programa; retorna a "programa"
ledsintermitentes:
LDI R17,0b10101010
OUT PORTD,R17
RCALL PAUSA; llama a " PAUSA"
LDI R17,0b01010101
OUT PORTD,R17
RCALL PAUSA
LDI R17,0b10101010
OUT PORTD,R17
RCALL PAUSA
LDI R17,0b01010101
OUT PORTD,R17
RCALL PAUSA
LDI R17,0b10101010
OUT PORTD,R17
RCALL PAUSA
LDI R17,0b01010101
OUT PORTD,R17
RCALL PAUSA
LDI R17,0b10101010
OUT PORTD,R17
RCALL PAUSA
LDI R17,0b01010101
OUT PORTD,R17
RCALL PAUSA
LDI R17,0b10101010
OUT PORTD,R17
RCALL PAUSA
LDI R17,0b01010101
OUT PORTD,R17
rjmp programa; retorna a "programa"
prendido1:
sbic pinc,1; lee el estado del PC1=0, salta una linea
rcall juegodeleds; llama a "juegodeleds"
rcall autofantastico; llama a "autofantastico"
autofantastico:
LDI R17,0b00000001
OUT PORTD,R17
RCALL PAUSA
LDI R17,0b00000010
OUT PORTD,R17
RCALL PAUSA
LDI R17,0b00000100

25

FIEE-UNAC
OUT PORTD,R17
RCALL PAUSA
LDI R17,0b00001000
OUT PORTD,R17
RCALL PAUSA
LDI R17,0b00010000
OUT PORTD,R17
RCALL PAUSA
LDI R17,0b00100000
OUT PORTD,R17
RCALL PAUSA
LDI R17,0b01000000
OUT PORTD,R17
RCALL PAUSA
LDI R17,0b10000000
OUT PORTD,R17
RCALL PAUSA
LDI R17,0b01000000
OUT PORTD,R17
RCALL PAUSA
LDI R17,0b00100000
OUT PORTD,R17
RCALL PAUSA
LDI R17,0b00010000
OUT PORTD,R17
RCALL PAUSA
LDI R17,0b00001000
OUT PORTD,R17
RCALL PAUSA
LDI R17,0b00000100
OUT PORTD,R17
RCALL PAUSA
LDI R17,0b00000010
OUT PORTD,R17
RCALL PAUSA
LDI R17,0b00000001
OUT PORTD,R17
rjmp programa; retorna a "programa"
juegodeleds:
LDI R16,0xFF
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x7E
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x3C
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x18
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x00
OUT PORTD,R16
RCALL PAUSA
rjmp programa; retorna a "programa"
PAUSA:
LDI R18,50;carga R18 con 50
X1: LDI R19,40;carga R19 con 40

26

FIEE-UNAC
X2: LDI R20,25;carga R20 con 25
X3: DEC R20;decrementa en 1 a R20
BRNE X3;si R20 es diferente de cero, sigue decrementando (salto a "X3"), si
R20 = 0, sigue
DEC R19;decrementa en 1 a R19
BRNE X2;si R19 es diferente de cero, sigue decrementando (salto a "X2"), si
R19 = 0, sigue
DEC R18;decrementa en 1 a R18
BRNE X1;si R18 es diferente de cero, sigue decrementando (salto a "X1"), si
R18 = 0, sigue
RET;retorno a la linea siguiente

c) Hacer la simulacin:

Sin Compilar

Compilado
Estado 0-0(apagado)

Estado1-0(leds intermitentes)

27

FIEE-UNAC

Estado0-1(autofantastico)

Estado1-1(juego

leds)

de

8. Realizar un programa que realice el encendido y monitoreo de un motor a travs


de contactores.
Existen 3 pulsadores:
uno de parada ( BP ) ,
uno de marcha ( BM)
y uno para funcionamiento intermitente ( BI ) ,

y un sensor de supervisin (S).


En caso de presionar BM el motor funciona de manera permanente y si se cierra
BP o S el motor se apaga. Con BI el motor funciona solo si este est presionado.
a) Realizar el diagrama de flujo del programa

28

FIEE-UNAC

b) Escriba la programacin:
.include "m8def.inc"
.cseg
.org 0x00
rjmp inicio
inicio:
ldi r16, high(ramend); stack
out sph, r16;
ldi r16, low(ramend); si solo se desea simular
out spl, r16;
ldi r16, 0b00000011; cargamos el registro R16
out ddrb, r16; configuramos el puerto B como salida de datos
cbi ddrc, 0; configuro PC0 como entrada, BP
cbi ddrc, 1; configuro PC1 como entrada; BM
cbi ddrc, 2; configuro PC2 como entrada; BI
cbi ddrc, 3; configuro PC3 como entrada; S
interruptor:
sbic pinc,0; lee estado del PC0=0, salta una linea
rjmp interruptor2; retorna a interruptor2
rjmp interruptor3; retorna a interruptor3
interruptor2:
sbic pinc,2; lee el estado del PC2=0, salta una linea
rjmp interruptor; retorna a interruptor
rjmp bucle2; retorna a bucle2

29

FIEE-UNAC
interruptor3:
sbic pinc,2; lee el estado del PC2=0, salta una linea
rjmp bucle;
rjmp interruptor
bucle:
ldi r17,0b00000010
out portb,r17
rcall analisis1; llama a analisis1
rcall analisis2; llamada a "analisis2"
rjmp bucle
bucle2:
ldi r17,0b00000010
out portb,r17
sbic pinc,2; lee el estado de PC2=0, salta una linea
rjmp analisis3; retorna a analisis3
rjmp bucle2; retorna a bucle2
analisis1:
sbic pinc,1; lee el estado del PC1=0, salta una linea
ret; si no lo pulso, retorna a la linea siguiente de llamar a "analisis1"
cbi portb, 1; pone a 0 la salida PB1
cbi portb, 0; pone a 0 la salida PB0
rjmp interruptor
analisis2:
sbic pinc,3; lee el estado de PC3=0, salta una linea
ret; si no lo pulso, retorna a la linea siguiente de llamar a "analisis1"
cbi portb, 1; pone a 0 la salida PB1
cbi portb, 0; pone a 0 la salida PB0
rjmp interruptor
analisis3:
cbi portb, 1; pone a 0 la salida PB1
cbi portb, 0; pone a 0 la salida PB0
rjmp interruptor

c) Hacer la simulacin:

Sin Compilar

Compilado
30

FIEE-UNAC

9. Se desea visualizar en un display nodo comn, cada 500ms, los nmeros 0 a 9


si el interruptor conectado a la lnea PB0 est abierto y las letras H O-L-A si el
interruptor est cerrado. El display est conectado en el PORTD<6:0>.
a) Realizar el diagrama de flujo del programa

31

FIEE-UNAC

b) Escriba la programacin:
.include "m8def.inc"
.cseg
.org 0x00
rjmp inicio
inicio:
LDI R16,HIGH(RAMEND); Se apunta a la posicin de la memoria
OUT SPH,R16
LDI R16,LOW(RAMEND);Stack
OUT SPL,R16

32

FIEE-UNAC
SER R16; pone en "1" todos los bits de R16
OUT DDRD,R16; declara al puero D como salida
CBI DDRB,0; declara PB0como entrada
LDI R16,0x00
OUT PORTD,R16
PROGRAMA:
SBIC PINB,0; lee PB0=0, salta una linea
RCALL CONTEO; llama a "CONTEO"
RCALL HOLA; llama a "HOLA"
CONTEO:
LDI R16,0x3F
OUT PORTD,R16
RCALL PAUSA; llama a "PAUSA"
LDI R16,0x06
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x5B
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x4F
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x66
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x6D
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x7D
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x07
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x7F
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x6F
OUT PORTD,R16
RCALL PAUSA
RJMP PROGRAMA; retorna a "PROGRAMA"
HOLA:
LDI R16,0x76
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x3F
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x38
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x77
OUT PORTD,R16
RCALL PAUSA
RJMP PROGRAMA; retorna a "PROGRAMA"
PAUSA:
LDI R17,95; carga R17 con 95
ZZ:LDI R18,82; carga R18 con 82

33

FIEE-UNAC
YY:LDI R19,50; carga R19 con 50
XX:DEC R19;decrementa en 1 a R19
BRNE XX;si R19 es diferente de cero, sigue decrementando (salto a "XX"), si R19
= 0, sigue
DEC R18;decrementa en 1 a R18
BRNE YY;si R18 es diferente de cero, sigue decrementando (salto a "YY"), si R18
= 0, sigue
DEC R17;decrementa en 1 a R17
BRNE ZZ;si R17 es diferente de cero, sigue decrementando (salto a "ZZ"), si R17
= 0, sigue
RET;retorno a la linea siguiente

c) Hacer la simulacin:

Sin Compilar

Conteo en 1

34

FIEE-UNAC

Hola en 0

10. Realizar un contador ascendente y descendente segn si el interruptor


conectado al PORTC.0 est abierto (ascendente) o cerrado (descendente). Los
pulsos a contarse entran desde un pulsador conectado al PORTC.1. El nmero de
pulsos es visualizado en un display ctodo comn conectado al PORTD
a) Realizar el diagrama de flujo del programa

35

FIEE-UNAC

b) Escriba la programacin:
.include "m8def.inc"
.cseg
.org 0x00
rjmp inicio
inicio:
LDI R16,HIGH(RAMEND); Se apunta a la posicin de la memoria
OUT SPH,R16
LDI R16,LOW(RAMEND);Stack

36

FIEE-UNAC
OUT SPL,R16
SER R16; pone en "1"a todos los bits de R16
OUT DDRD,R16;declara como salida al puerto D
CBI DDRC,0; declara como entrada PC0
CBI DDRC,1; declara como entrada PC1
PROGRAMA:
LDI R16,0x3F
OUT PORTD,R16
SBIC PINC,0; lee estado de PC0=0, salta una linea
RCALL ASCENDENTE; llama a "ASCENDENTE"
RCALL DESCENDENTE; llama a "DESCENDENTE"
ASCENDENTE:
sbic pinc,1; lee estado de PC1=0, salta una linea
rcall aumento2; llama a "aumento2"
rcall aumento1; llama a "aumento1"
aumento1:
LDI R16,0x3F
OUT PORTD,R16
RCALL PAUSA; llama a "PAUSA"
LDI R16,0x06
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x5B
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x4F
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x66
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x6D
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x7D
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x07
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x7F
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x6F
OUT PORTD,R16
RCALL PAUSA
RJMP PROGRAMA; retorna a "PROGRAMA"
aumento2:
LDI R16,0x3F
OUT PORTD,R16
RCALL PAUSA
RJMP PROGRAMA
DESCENDENTE:
sbic pinc,1; lee estado del PC1=0, salta una linea
rcall deciende2; llama a "deciende2"
rcall deciende1; llama a "deciende1"
deciende1:
LDI R16,0x6F

37

FIEE-UNAC
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x7F
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x07
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x7D
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x6D
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x66
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x4F
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x5B
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x06
OUT PORTD,R16
RCALL PAUSA
LDI R16,0x3F
OUT PORTD,R16
RCALL PAUSA
RJMP PROGRAMA; retorna a "PROGRAMA"
deciende2:
LDI R16,0x3F
OUT PORTD,R16
RCALL PAUSA
RJMP PROGRAMA; retorna a "PROGRAMA"
PAUSA:
LDI R17,95;carga R17 con 95
ZZ:LDI R18,80;carga R18 con 80
YY:LDI R19,50;carga R19 con 50
XX:DEC R19;decrementa en 1 a R19
BRNE XX ;si R19 es diferente de cero, sigue decrementando (salto a "XX"), si
R19 = 0, sigue
DEC R18;decrementa en 1 a R18
BRNE YY ;si R18 es diferente de cero, sigue decrementando (salto a "YY"),
DEC R17;decrementa en 1 a R17
BRNE ZZ ;si R17 es diferente de cero, sigue decrementando (salto a "ZZ"), si
R17 = 0, sigue
RET;retorno a la linea siguiente

c) Hacer la simulacin:

Sin Compilar

38

FIEE-UNAC

Compilado

Estado 01-ascendente

Estado 00-descendente

39

You might also like