Вы находитесь на странице: 1из 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 14
PC0/ADC0 PB0/ICP1
24 15
PC1/ADC1 PB1/OC1A
25 16
PC2/ADC2 PB2/SS/OC1B
26 17
PC3/ADC3 PB3/MOSI/OC2
27 18
PC4/ADC4/SDA PB4/MISO
28 19
PC5/ADC5/SCL PB5/SCK
1 9
PC6/RESET PB6/TOSC1/XTAL1
10
PB7/TOSC2/XTAL2
2
PD0/RXD
3
PD1/TXD
4
PD2/INT0
5
PD3/INT1
6
PD4/T0/XCK
11
PD5/T1 R7 R6 R5 R4 R3
12 21 220 220 220 220 220
PD6/AIN0 AREF
13 20
PD7/AIN1 AVCC

R2 ATMEGA8
10k
R1
10k
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 ;contador de numeros c=5?
breq enlace1 ;si,salta a enlace1
presionar: sbis pinc,3 ;lee el pin 3 del puerto C
rjmp presionar
soltar: 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
enlace1: rcall indicadorpren ;led indicador encendido indica que se llenaron los 5 valores

limitar2: cpi c,0 ;c=0?


breq enlace2 ;si, salta a enlace2
rcall indicadorapag ;no,apaga el led indicador y realiza las instrucciones
sgtes
presionar1: sbis pinc,3 ;presionar y soltar el pin 3 del puerto C
rjmp presionar1
soltar1: sbic pinc,3
rjmp soltar1
ld num1,-x
dec 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
23 14
PC0/ADC0 PB0/ICP1
24 15
PC1/ADC1 PB1/OC1A
R1 25
PC2/ADC2 PB2/SS/OC1B
16
10k 26 17
PC3/ADC3 PB3/MOSI/OC2
27 18
PC4/ADC4/SDA PB4/MISO
28 19
PC5/ADC5/SCL PB5/SCK
1 9
PC6/RESET PB6/TOSC1/XTAL1
10
PB7/TOSC2/XTAL2
2
PD0/RXD
3
PD1/TXD
4
PD2/INT0
5
PD3/INT1
6
PD4/T0/XCK
11
PD5/T1
D1
12 21 LED-BLUE
PD6/AIN0 AREF
13 20
PD7/AIN1 AVCC
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.

Вам также может понравиться