Академический Документы
Профессиональный Документы
Культура Документы
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:
Ejemplo: Al usar P1, se ingresa los nmeros 09, 08, y 05, luego si se presiona P2 (sin soltarlo), se obtendr la
/*
* 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:
.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
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 sbis sbic son las ms sencillas para trabajar con un pulsador.