Hola!
Estoy tratando de resolver un ejercicio:
tengo que leer unos pulsadores que me dicen la velocidad a la que tengo que rotar unos leds . A ver lo detallo más, tengo esto:
Pulsadores:
D0 -> que si está activo a nivel bajo tengo que aumentar la velocidad con la que rotan los leds
D1 -> que si está activo a nivel bajo tengo que disminuir la velocidad con la que rotan los leds
Están en la 300h
Están conectados al bus de datos del 8086 así
xxxx xxD1D0
Leds:
Conjunto de 8 leds conectados al bus de datos através de su interfaz
Están en la 300h
Estos leds rotarán indefinidamente, y su velocidad será controlada por los pulsadores
Pues ese es el enunciado.
Entonces, yo me pongo a ver como solucionarlo y la primera pregunta que me viene a la cabeza es: sería conveniente hacer una especie de pseudocódigo en alto nivel y apartir de él traducirlo a instrucciones asm? O la lógica se suele pensar de otra forma mejor a esta?
Yo he pensado algo así:
leds = 01h
while(1)
{
Hago retardo
if (D0 == 0) //d0 pulsado -> aumento velocidad
{
if(speed != FFFF) //limite que tendrá mi registro de 16 bits
{
speed++
}
if (D1 == 0) //d1 pulsado -> decremento velocidad
{
if(D1 != 0) //limite de registro de 16 bits
{
speed--
}
}
Roto leds
visualizo leds
}
Es una mezcla de c y de pseudocódigo, jaja, bueno, seguro que se entiende la lógica del programita.
Pasándolo a ensamblador me sale esto:
.dosseg
.model small
.stack 100h
.code
;procedimiento de retardo: mantener un led encendido
retardo proc
mov cx, di
bucle:
loop bucle
retardo endp
leds equ 300h ;Dirección E/S de los leds
pulsador equ 300h ;Dirección E/S de los pulsadores
; di -> speed
; bl -> Leds on/off
; ax y dx -> para in/out
ini:
;le damos a cx una velocidad inicial
mov di, 10h
mov bl, 01h
;inicializo leds
mov dx, leds
mov al, bl
;Inicializo leds
out dx, al
ln1@ini:
call retardo
mov dx, pulsador
in al, dx
;Los pulsadores se activan a nivel bajo, en reposo están a vcc
;si he pulsado d0 y si di (contador de retardo) no
;ha pasado el limite ffffh, entonces incremento velocidad
test al, 01h
jnz ln2@ini
cmp di, 0FFFFh
je ln3@ini
inc di
jmp ln3@ini
ln2@ini:
;Decremento velocidad si he pulsado d1 y no he llegado a 0
test al, 02h
jnz ln3@ini
cmp di, 0
je ln3@ini
dec di
;Sabiendo la velocidad, puedo rotar y encender led
ln3@ini:
;roto leds y actualizo su estado
rol bl, 1
mov dx, leds
mov al, bl
out dx, al
jmp ln1@ini ;siguiente iteración bucle infinito
end ini
Masm lo ensambla correctamente... probarlo no he podido, quizás haya un simulador que permita simular cosas como esta, si conocéis alguno...
Yo creo que está bien, pero me surgen unas dudas:
Puedo saber el tiempo "exacto" de retardo de la rutina "retardo"? Por ejemplo si cx toma el valor ffh, cuantos segundos está haciendo el bucle loop?
Bueno creo que eso es todo; disculpad la extensión del post pero quería explicar todo bien para facilitaros un poquitín
Se agradece cualquier aportación. Muchas gracias!!!