Sei sulla pagina 1di 8

Problema 1

Se dispone de un circuito compuesto por 3 interruptores, 2 pulsadores y 5 diodos leds que estn
conectados al microcontrolador. Mediante los 3 interruptores (3bits) se ingresa un total de 6
nmeros que son almacenados en una tabla que se inicia en la direccin 0x100 de la memoria
SRAM. Para validar el ingreso del primer nmero y mostrar en la salida se utiliza el pulsador P1
(Se valida al presionar y soltar) y as sucesivamente hasta completar en la tabla los 6 nmeros.
Al presionar el pulsador P2 (sin soltar) en cualquier momento se deben mostrar en los diodos
leds (D1 D2 D3 D4 D5 D6)) la suma parcial de los nmeros ingresados y al soltarse el pulsador
P2, la salida muestra el ltimo nmero ingresado. Se prende otro diodo led (D7) cuando se
termina de ingresar los 6 nmeros, con lo cual P1 ya no graba ningn nmero y P2 siempre
mostrar la suma total en los leds, con el diodo D8 encendido. Escriba un programa que cumpla
con las condiciones planteadas. Para las conexiones considerar:
Conexiones:
Pulsadores P1 y P2 conectados a: PD6, PD7
Interruptores a: PC3(MSB), PC2, PC1 (bit LSB) .
Salidas: Leds al puerto B
Ejemplo: Al usar P1, se ingresa los nmeros 09, 08, y 05, luego si se presiona P2 (sin soltarlo), se
obtendr la
suma igual a 20, y al soltarlo se muestra en la salida 05.

DIAGRAM DE FLUJO:

/*
* preg1final3.asm
*
* Created: 24/09/2015 08:40:04 p.m.
* Author: Anthony

*/
.dseg
.org $0100
numeros: .byte 6
.cseg
.def c=r17
.def num=r18
.def acum=r19
.org $0000
;programa principal
ldi r16,high(ramend)
out sph,r16
ldi r16,low(ramend)
out spl,r16
ldi xl,low(numeros)
;iniciamos los punteros para numero
ldi xh,high(numeros)
rcall configurar_puertos
;*********************************
;espera que preione y suelte el pulsador en PB5
;usamos las instrucciones sbis y sbic
inicio: ldi r16,$00
out portb,r16
ldi c,0
ldi acum,0
ldi num,0
contador: ldi num,0
cpi c,6
brlo prespul1
sbi pinb,4
rjmp fin
;************************************************
;lectura del numero
prespul1:
sbis pind,6
;si,presion?
rjmp prespul1 ;no,presion
soltpul1:
sbic pind,6
;si,solt?
rjmp soltpul1 ;no,solt
lecnum:
in num,pinc
;leemos el puerto
andi num,0x0F ;filtra los 3 bits mas significativos
lsr num
;se desplaza 1 ves para obtener el numero
out portb,num ;muestra el valor validado
st x+,num
;guarda el valor en la direccion definida
add acum,num ;acumula la suma parcial de los valores ingresado
inc c
;incrementa el contador de numeros
prespul2: sbis pind,7
;presion el pulsador PD7
rjmp prespul2 ;no,presion el pulsador en PD7
out portb,acum
;muestra la suma acumulada
soltpul2: sbic pind,7
;solt el pulsador PD7
rjmp soltpul2 ;no,solt el pulsador PD7
out portb,num ;muestra el ultimo numero ingresado
rjmp contador
fin:
rjmp fin
;fin del programa
;*************************************************************8
;subrutina para configurar puertos
;no tiene parametros de salida
configurar_puertos: ldi r16,0x0E
out portc,r16 ;activamos las resistencia pull-up del puerto C
ldi r16,0x00
out ddrd,r16 ;puerto D como entrada
ldi r16,0xFF
out ddrb,r16 ;puerto B como salida
ret

R8
10k

U1
23
24
25
26
27
28
1
2
3
4
5
6
11
12
13

R2
10k

PC0/ADC0
PC1/ADC1
PC2/ADC2
PC3/ADC3
PC4/ADC4/SDA
PC5/ADC5/SCL
PC6/RESET
PD0/RXD
PD1/TXD
PD2/INT0
PD3/INT1
PD4/T0/XCK
PD5/T1
PD6/AIN0
PD7/AIN1
ATMEGA8

R1
10k

PB0/ICP1
PB1/OC1A
PB2/SS/OC1B
PB3/MOSI/OC2
PB4/MISO
PB5/SCK
PB6/TOSC1/XTAL1
PB7/TOSC2/XTAL2

AREF
AVCC

14
15
16
17
18
19
9
10

21
20

R7

R6

R5

R4

R3

220

220

220

220

220

Problema 2
Por medio de cuatro interruptores se deben ingresar 5 nmeros de 4 bits. Cada nmero
ingresado (luego de presionar y soltar el pulsador P1) debe ser validado y almacenado en un
arreglo a partir de la direccin 0x80 en la memoria SRAM , mostrndose a la vez en 4 leds. Luego
de ingresar el ltimo nmero (5to), se prender adicionalmente otro LED indicador. A
continuacin cada vez que se presione y suelte el pulsador se mostrarn en los leds solo los
nmeros mayores a 9 que fueron ingresados, con el LED indicador apagado. Cuando se llegue al
ltimo nmero mayor a 9 debe prenderse el LED indicador y mostrar en los otros leds el
promedio redondeado al entero ms prximo de toso los nmeros mayor a 9. A continuacin, y
luego de presionar y soltar el pulsador, una vez ms, se debe repetir el proceso descrito
Considerar:
Si al momento de mostrar no hubiese un nmero mayor a 9 deben de encenderse todos los leds.
Conexiones:
Pulsadores conectados a: PC3
Interruptores a: PD5(MSB), PD4, PD3, PD2 (bit LSB) .
Salidas: Leds al puerto B

/*
* lab3preg2.asm
*
* Created: 02/10/2015 10:03:30 a.m.
* Author:jalvarado
*/
.dseg
.org $0080
numeros: .byte 5
.cseg
.org $0000
.def num=r17
.def num1=r19
.def c=r18
.def acumm=r20
.def cm9=r21
.def q=r22
ldi r16,high(ramend)
out sph,r16
ldi r16,low(ramend)
out spl,r16
ldi xh,high(numeros)
ldi xl,low(numeros)
rcall configurar_puertos
inicio:
ldi num,0
ldi num1,0
ldi r16,$00
out portb,r16
ldi acumm,0
ldi cm9,0
ldi q,0
ldi c,0
limitar:
cpi c,5

enlace1:

;contador de numeros c=5?


breq enlace1
;si,salta a enlace1
sbis pinc,3
;lee el pin 3 del puerto C
rjmp presionar
sbic pinc,3
rjmp soltar
in num,pind
;lee los interruptores
lsr num
lsr num;dos desplazamientos a la derecha para obtener el numero
andi num,$0F
;filtramos los 4 bits menos significativos
out portb,num
;mostramos el numero
st x+,num
;guardamos en la direccion de memoria especificada
inc c
;incrementamos el contador de numeros
rjmp limitar
;regresa a la etiqueta limitar para hacer una cp
rcall indicadorpren
;led indicador encendido indica que se llenaron los 5 valores

limitar2:

cpi c,0

presionar:
soltar:

presionar1:
soltar1:

breq enlace2
rcall indicadorapag
sbis pinc,3
rjmp presionar1
sbic pinc,3
rjmp soltar1
ld
num1,-x
dec c

;c=0?
;si, salta a enlace2
;no,apaga el led indicador y realiza las instrucciones sgtes
;presionar y soltar el pin 3 del puerto C

cpi num1,9
brsh mayormuestra
ldi r16,$0F
out portb,r16
rjmp limitar2
mayormuestra:
inc cm9
;incrementa el contador de numeros mayores a 9
add acumm,num1
;acumulamos el valor de los numeros
; mayores a 9 en la variable acumm
out portb,num1
rjmp limitar2
enlace2:
rcall indicadorpren
;se prende el led indicador
cpi cm9,0
breq presionar2
en:
cpc acumm,cm9
brsh qdiv
rjmp findiv
qdiv:
sub acumm,cm9
inc q
rjmp en
findiv:
out portb,q
rcall indicadorpren
presionar2:
sbis pinc,3
rjmp presionar2
soltar2:
sbic pinc,3
rjmp soltar2
rjmp inicio
;subprogramas para el indicador de led:
indicadorpren: sbi pinb,4
ret
indicadorapag: cbi pinb,4
ret
configurar_puertos: ldi r16,$00
out ddrc,r16
;configuramos el puerto C como entrada
ldi r16,$3C
out portd,r16
;activamos las res pull-up PD5:PD2
ldi r16,$FF
out ddrb,r16
;configuramos el puerto B como salida
ret

U1
R1
10k

23
24
25
26
27
28
1
2
3
4
5
6
11
12
13

PC0/ADC0
PC1/ADC1
PC2/ADC2
PC3/ADC3
PC4/ADC4/SDA
PC5/ADC5/SCL
PC6/RESET

PB0/ICP1
PB1/OC1A
PB2/SS/OC1B
PB3/MOSI/OC2
PB4/MISO
PB5/SCK
PB6/TOSC1/XTAL1
PB7/TOSC2/XTAL2

PD0/RXD
PD1/TXD
PD2/INT0
PD3/INT1
PD4/T0/XCK
PD5/T1
PD6/AIN0
PD7/AIN1

AREF
AVCC

14
15
16
17
18
19
9
10

21
20

D1
LED-BLUE

ATMEGA8

conclusiones :
Podemos sobrescribir en los 4 leds originales donde se muestran los nmeros mayores a 9 sin
usar 4 leds adicionales ms para el promedio.
Las instrucciones rcall ordenan el cuerpo del programa.
Las instrucciones sbis sbic son las ms sencillas para trabajar con un pulsador.

Potrebbero piacerti anche