Practica 1 de Microcontroladores

PROBLEMAS PROPUESTOS 1. Diseñe un programa que controle el encendido de 8 leds ubicados en el puerto D, Estos deben enc

Views 45 Downloads 1 File size 6MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

PROBLEMAS PROPUESTOS 1.

Diseñe un programa que controle el encendido de 8 leds ubicados en el puerto D, Estos deben encender de dos en dos hasta que todos estén 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 posición 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 instrucción 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:

2

FIEE-UNAC

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

2. Un programa sigue los siguientes pasos:  Definición del procesador a emplearse.  Definición de variables, en nuestro caso de tipo byte.  Configuración 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

3

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 simulación del sistema

SOLUCION: a) Diagrama de flujo del programa:

4

FIEE-UNAC

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

5

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

6

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

7

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 simulación: No Compilado

Compilado

8

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

9

FIEE-UNAC

b) Escriba la programación: .include "m8def.inc" .cseg .org 0x00 rjmp inicio inicio: LDI R16,HIGH(RAMEND); Se apunta a la posición 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 simulación : Sin Compilar

Compilado

11

FIEE-UNAC

4. Empleando el microcontrolador ATmega8 realizar el encendido intermitente (5 veces) de 8 Leds conectados en ánodo común 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 fantástico, 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 programación: .include "m8def.inc" .cseg .org 0x00 rjmp inicio inicio: LDI R16,HIGH(RAMEND); Se apunta a la posición 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 simulación:

No compilado

Compilado

16

FIEE-UNAC

5. Hacer los cambios en el ejercicio6 en caso de conectarse los Leds en cátodo común. a) Realizar el diagrama de flujo del programa

17

FIEE-UNAC

b) Escriba la programación: .include "m8def.inc" .cseg .org 0x00 rjmp inicio inicio: LDI R16,HIGH(RAMEND); Se apunta a la posición 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 simulación: 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 están conectados al PORTB. Toda la acción 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 programación: .include "m8def.inc" .cseg .org 0x00 rjmp inicio inicio: LDI R16,HIGH(RAMEND); Se apunta a la posición 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 simulación:

Sin Compilar

22

FIEE-UNAC

Compilado

7. Se conectan dos interruptores al PORTC con pull -up internas y según el valor leído realice una acción determinada conforme la siguiente tabla de verdad:

23

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

b) Escriba la programación: .include "m8def.inc" .cseg .org 0x00 rjmp inicio inicio: LDI R16,HIGH(RAMEND); Se apunta a la posición 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 simulación:

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 través de contactores. Existen 3 pulsadores:  uno de parada ( BP ) ,  uno de marcha ( BM)  y uno para funcionamiento intermitente ( BI ) ,  y un sensor de supervisión (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 programación: .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 simulación:

Sin Compilar

Compilado 30

FIEE-UNAC

9. Se desea visualizar en un display ánodo común, cada 500ms, los números 0 a 9 si el interruptor conectado a la línea PB0 está abierto y las letras H O-L-A si el interruptor está cerrado. El display está conectado en el PORTD. a) Realizar el diagrama de flujo del programa

31

FIEE-UNAC

b) Escriba la programación: .include "m8def.inc" .cseg .org 0x00 rjmp inicio inicio: LDI R16,HIGH(RAMEND); Se apunta a la posición 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 simulación:

Sin Compilar

Conteo en “1”

34

FIEE-UNAC

Hola en “0”

10. Realizar un contador ascendente y descendente según 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 número de pulsos es visualizado en un display cátodo común conectado al PORTD a) Realizar el diagrama de flujo del programa

35

FIEE-UNAC

b) Escriba la programación: .include "m8def.inc" .cseg .org 0x00 rjmp inicio inicio: LDI R16,HIGH(RAMEND); Se apunta a la posición 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 simulación:

Sin Compilar

38

FIEE-UNAC

Compilado

Estado 01-ascendente

Estado 00-descendente

39