Está en la página 1de 2

Dado un sistema con puertos paralelos conectados de la siguiente forma:

Se requiere un programa que satisfaga las siguientes condiciones:


1. La bomba enciende cuando existe presencia de agua y existe nivel bajo
2. La bomba apaga cuando existe ausencia de agua o existe nivel alto.

En este programa el primer paso es leer el puerto de entrada para determinar las condiciones
de los sensores del campo y de esta manera decidir los valores que saldrán para activar o
desactivar la bomba.
Para individualizar los sensores utilizaremos la instrucción TEST, esta instrucción funciona
como la comparación pero utiliza el producto lógico en vez de la resta y el resultado no se
almacena, solo modifica las banderas en el registro de estado.
Las mascaras serán las siguientes:

Sensor presencia de agua: observe que este sensor esta conectado en el bit 2 del puerto,
recuerde que la lectura es variable por lo cual la representamos como indiferencias (condición
no importa) y el producto será con 0 en los bits que no tomaremos y con 1 en el bit de interés,
como se muestra:

Lectura xxxx xxxx AND


Mascara 00000100 (04h)
Resultado 00000x00

De esta manera si el resultado es cero habrá ausencia de agua y si es distinto de cero habrá
presencia de agua, cuando el resultado es cero se activa la bandera Z por lo cual podemos
usar el salto JZ cuando hay ausencia y el JNZ cuando hay presencia de agua.

Sensor de nivel bajo: observe que este sensor esta conectado en el bit 1 del puerto, recuerde
que la lectura es variable por lo cual la representamos como indiferencias (condición no
importa) y el producto será con 0 en los bits que no tomaremos y con 1 en el bit de interés,
como se muestra:

Lectura xxxx xxxx AND


Mascara 00000010 (02h)
Resultado 000000x0
De esta manera si el resultado es cero habrá nivel bajo y si es distinto de cero no habrá nivel
bajo de agua, cuando el resultado es cero se activa la bandera Z por lo cual podemos usar el
salto JZ cuando hay nivel bajo y el JNZ cuando no hay nivel bajo de agua.

Sensor de nivel alto: observe que este sensor está conectado en el bit 0 del puerto, recuerde
que la lectura es variable por lo cual la representamos como indiferencias (condición no
importa) y el producto será con 0 en los bits que no tomaremos y con 1 en el bit de interés,
como se muestra:

Lectura xxxx xxxx AND


Mascara 00000001 (01h)
Resultado 0000000x

De esta manera si el resultado es cero habrá nivel alto y si es distinto de cero no habrá nivel
alto de agua, cuando el resultado es cero se activa la bandera Z por lo cual podemos usar el
salto JZ cuando hay nivel alto y el JNZ cuando no hay nivel alto de agua.

Finalmente para encender y apagar la bomba hay que activar o desactivar el bit 3 del puerto #2
Como solo esta conectado el bit 3 los demás los colocaremos a 0, asi:

Encender 00001000 (08)


Apagar 00000000 (00)

Iniciemos el programa:

Etiq. Oper. Operan. Comentarios


Inicio: MOV DX,02A0 ; carga DX con el valor del puerto #1
IN AL,DX ; lee el puerto #1 y guarda la lectura en AL
TEST AL,04 ; enmascara la lectura para presencia de agua
JZ Apagar ; si hay ausencia va a la rutina apagar bomba
TEST AL,02 ; si hay presencia de agua enmascara la lectura para nivel bajo
JZ Encender ; si hay nivel bajo va a rutina de encender bomba
TEST AL,01 ; si no hay nivel bajo enmascara la lectura para nivel alto
JZ Apagar ; si hay nivel alto va a rutina de apagar bomba
JNZ Inicio ; si no hay nivel alto va a inicio a renovar la lectura

Apagar: MOV DX,12A0 ; carga DX con la dirección del puerto #2


MOV AL,00 ; carga AL con la salida que apaga la bomba
OUT DX,AL ; saca por el puerto
JMP Inicio ; va a inicio a renovar la lectura

Encender: MOV DX,12A0 ; carga DX con la dirección del puerto #2


MOV AL,08 ; carga AL con la salida que enciende la bomba
OUT DX,AL ; saca por el puerto
JMP Inicio ; va a inicio a renovar la lectura

También podría gustarte