Proyecto Instrumento de Medida, parte 1. (Manejo de recursos y elementos básicos)

                                    (Este enunciado será explicado en la primera clase que corresponda a cada grupo)


Objetivos

    Operaciones con números fraccionarios
    Conversión binario-ASCII
    Captura de teclas pulsadas
    Escritura en pantalla
    Manejo de interrupciones, cambio de vectores

Funcionamiento

La finalidad de la práctica es convertir la pantalla del PC en una pantalla de visualización de un equipo de medida. La entrada será una serie de números, comprendidos entre el 0 y el 255, que simularán ser la salida de un conversor analógico-digital de 8 bits. Éste convertiría una señal analógica entre -9 voltios y +9 voltios a un valor binario entre el 0 y el 255. El programa irá leyendo estos datos digitales de uno en uno y de forma periódica, los convertirá al valor de tensión correspondiente y presentará en pantalla (con dos dígitos decimales) lo siguiente:
.

  • En una ventana con cuatro columnas y ocho filas los últimos datos leídos, en hexadecimal. 
  • El valor de tensión máxima recibida, de las medidas que aparecen en la ventana. 
  • El valor de tensión mínima recibida, de las medidas que aparecen en la ventana. 
  • El valor en voltios de la medida actual. 
  • El valor de tensión media de las 8 últimas medidas. 

           Ejemplo orientativo de presentación

La periodicidad con que se leen los datos (y por tanto se refrescará la pantalla) se controlará mediante las teclas + y - e irá desde un mínimo de unos 55 msg. hasta un máximo de 1 segundo, aproximadamente. Este tiempo también se deberá indicar en la pantalla.
El programa comenzará la presentación al pulsar F1 y se detendrá al pulsar F2, pudiendo volver a arrancar con F1. Finalizará al pulsar F3 o bien cuando se terminen los datos.
Los datos se obtendrán a través del servicio 61H (INT 61H), descrito a continuación.

Lectura de un dato del conversor

    INT 61H AH = 01H

Descripción: La función de esta rutina es leer un dato que proviene del conversor analógico-digital

Uso:    Entrada:  AH = 01H

            Salida:    AL = dato leído
                          AH = 0 lectura correcta
                          AH = -1 no hay más datos
            Registros afectados:   AX

En esta primera parte, este servicio será entregado al alumno en un fichero ejecutable que contendrá el programa residente que cumple la especificación anterior. Para su uso se debe ejecutar antes de probar el programa vuestro, con lo que el "driver" queda residente y responderá a la interrupción 61H. Basta con ejecutarlo una sola vez.

Se incluye el código fuente y se recomienda su lectura. (¡No hace falta ensamblarlo ni linkarlo!)


Mejora opcional: Presentación  de la medida del valor medio mediante números grandes, de 8x8 caracteres.

Plazo de entrega : La presentación y evaluación de esta práctica será la semana del 13 de noviembre, según el grupo. El nombre del fichero o ficheros a entregar será de la forma pareja_p1.asm, por ejemplo lt28_p1.asm. Si hay más de un fichero, nombrarlo con números sucesivos y añadir un .bat que los ensamble y linke.(lt28_p11.asm, lt28_p12.asm,... lt28_p1.bat)



Soporte teorico

Conversor Analógico-Digital. Dispositivo que obtiene una representación digital de una señal analógica presente a su entrada. Los procesos que debe llevar a cabo son los de cuantificación, por el que la señal analógica de entrada se transforma en un conjunto discreto de estados de salida, y codificación, el cual asigna un conjunto de bits a cada uno de dichos estados.
En nuestro caso, si la señal de entrada a medir está en el margen de -9 a 9 v. y el conjunto de estados de salida posible es desde el 0 al 255, se realizará la siguiente asignación:

Cualquier valor de tensión se codificará con un número entre el 0 y el FFH, para lo que se deberá calcular a que tensión equivale pasar de un estado al siguiente: si el margen a medir es de 18 voltios y disponemos de 256 estados diferentes, cada estado consecutivo representa un salto de 18/256=0,0703125 voltios. Esto limitará la precisión de la conversión, valores muy cercanos de tensión, cuya diferencia sea menor al valor anterior, tendrán la misma codificación. Para simplificar, se utilizará el valor de 0,071 como valor de salto, con lo que el valor máximo que se podrá medir será de 255*0,071=18,105 voltios.

La siguiente tabla muestra unos ejemplos de codificaciones de diferentes valores de tensión a la entrada del conversor:
 

Tensión entrada 
Codificación  Tensión entrada  Codificación
-9 voltios
0H
3.45 voltios
AFH
-5.5 voltios
31H
7 voltios
E1H
-2 voltios
63H
8,67 voltios
FAH
0 voltios
7FH
9 voltios
FEH

El programa pedido deberá hacer la conversión inversa, dado un número codificado, obtener el valor analógico de tensión al que corresponde. Por ejemplo, sea el estado 57H (dato leído del fichero del disco). El valor absoluto de tensión que representa es de 57H x 0,071 voltios = 6,177 voltios, respecto del 0H, osea, respecto de -9 v. Por tanto la tensión real será -9+6,177 = -2,823. Como nos piden sólo dos decimales, el dato final a presentar será -2,82 voltios.

Operaciones con decimales. Se puede utilizar la técnica que se desee. Una posible solución puede ser emplear punto fijo. Tomar los datos en un tamaño de16 bits, de forma que los 8 más significativos representen la parte entera y los 8 menos significativos la parte decimal. De esta forma se pueden utilizar las operaciones aritméticas definidas en el 8086 sin mayor problema. Recordar la notación binaria para números fraccionarios.

Control de acciones periodicas. La interrupción 8 (INT 8H) del PC se activa mediante un generador de reloj interno cada 55 mseg. La rutina de atención a la interrupción actualiza la hora del PC y llama a la interrupción 1CH. La subrutina de atención a esta interrupción no realiza ninguna función, ya que tan sólo contiene una instrucción IRET.
Se puede realizar un programa que instale unos nuevos vectores a la interrupción 1CH, de forma que apunten a una rutina de atención cuya finalidad sea la que nos convenga. De esta forma podremos realizar ciertas operaciones de forma periodica, sin tener que modificar ni complicar el código del programa principal

Caracteres de gran tamaño. La idea se basa en explorar la tabla de caracteres empleada internamente por el ordenador. Esta tabla se encuentra en la memoria ROM, a partir de la dirección F000:FA6E. La forma de cada carácter está descrita por 8 bytes, cada uno de los cuales representa una fila, según se muestra a continuación:
 

Carácter
     
     
   
   
     
       
     
 .              
 
 ............ Representación en ROM

   0011 1110 = 3EH
   0110 0011 = 63H
   0110 1111 = 6FH
   0111 1011 = 7BH
   0111 0011 = 73H
   0110 0011 = 63H
   0011 1110 = 3EH
   0000 0000 = 00H

 

 La figura representa el número '0', el conjunto de 8 bytes forma una retícula de 64 bits. Los bits que están a '1' definen el contorno del carácter, es decir, los puntos que habrá que iluminar en una pantalla para conseguir una representación del carácter.
La tabla de todos los caracteres está ordenada según el código ASCII. Por tanto, para acceder a un carácter concreto habrá que sumar a la posición inicial (F0000:FA6EH) un desplazamiento que será igual al número ASCII del carácter multiplicado por 8, puesto que, como ya sabemos, cada carácter está representado mediante 8 bytes consecutivos.
Una vez que se conoce la dirección donde está almacenada la representación del carácter que se quiere imprimir, se toman los datos byte a byte (fila a fila) y se va examinando cada uno de los bits individuales. Si el bit correspondiente es '0', el procedimiento escribirá un espacio en la pantalla, mientras que si el bit examinado es un '1', se escribirá un caracter grueso (). Al terminar de escribir una fila habrá que colocar el cursor en la posición correspondiente a la primera columna de la siguiente fila, y volver a repetir la operación hasta terminar de explorar las 8 filas.