Home
  Academia
    Sist.Tiempo Real
      Modulo

  Introducción
  Protocolo
    Escape
    Flujo
  Uso
  16550
  Indicaciones

Resultados
  Mód. óptico
  Mód. térmico
  Mód. motor

Watermark

Módulos didácticos - Manejo de la interfase serial de la PC

La interfase serial de la PC aparece para el usuario, como una serie de 'puertos', a traves de las cuales, con escrituras y lecturas, se puede controlar el comportamiento. Los puertos seriales están basados en las siguintes direcciones:

COM1 0x3F8
COM2 0x2F8
COM3 0x3E8
COM4 0x2E8

Para modificar un solo bit de un registro, normalmente es aconsejable leer el valor anterior, modificar el bit, y re-escribir el resultado: Por ejemplo, para poner el bit DLAB en 1:

    base = 0x3f8;
    outport(base + 3, inport(base + 3) | 0x80);
    ... modificar el divisor ...
    outport(base + 3, inport(base + 3) & 0x7f); 

Sin embargo, cuando se utilizan computadoras que no disponen de los periféricos en forma nativa (por ejemplo, con un puerto serial simulado mediante un cable convertidor USB - Serial), este método puede causar problemas. En este caso es mejor no confiar en el valor leido del registro:

    base = 0x3f8;
    conf = 0x03;	// Corresponde a 8bits datos, 1bit stop, sin paridad
    outport(base + 3, conf | 0x80);
    ... modificar el divisor ...
    outport(base + 3, conf);

Nota: Pocos de las interfases USB/Serial contienen el software necesario para emular los puertos correctamente en DOS a nivel de registros. Los que sí lo tienen, a veces hay que habilitarlos en el 'Panel de control'.

Los registros están descritos en las tablas abajo. El procedimiento de uso de la interfase es como sigue:

Inicialización
Es preciso inicializar la interfase para la velocidad de comunicación correcta. Los módulos funcionan a 38400 Bauds. Entonces necesitamos configurar la interfase para esta velocidad.

Para lograrlo, necesitamos entrar primero en un modo 'configuración', escribiendo un 1 en el bit 7 del registro base+3 (Line Control Register). Una vez escrito este valor, el integrado controlador puede recibir un divisor en base+0 (8 bits menos significativos) y base+1 (8 bits mas significativos). Este divisor determina la velocidad de comunicación, derivado como:

115200 dividido por el (valor programado)

O sea, si programamos 1, la velocidad será de 115200 Bauds, 2 da 57600 Bauds, etc.

Una vez programada la velocidad tenemos que poner el bit DLAB nuevamente en 0 para volver al funcionamiento normal.

Enviar caracteres
Para evitar de enviar los caracteres mas rápido de lo que la interfase pueda enviarlos, tenemos que seguir un algoritmo de control.

Antes de enviar tenemos que controlar el bit 'THR Empty' (THR es el registro de almacenamiento del transmisor, que tiene que estar vacio antes de poder recibir un valor nuevo). Si THR Empty está en 1, entonces podemos enviar el caracter siguiente.

Recibir caracteres
Datos recibidos del módulo tienen que ser leidos, pero tenemos que cuidarnos de no leerlos demasiado rápido! Nuevamente, un bit en el mismo registro nos indica cuando es el momento correcto: 'Data Ready' nos marca cuando llego un valor válido nuevo. En el diagrama de flujohay mas información.

Tablas de registros de control

Registros en modo normal de uso
Registros en modo normal de uso

Registros en modo inicialización
Registros en modo inicialización


(c) John Coppens ON6JC/LW3HAZ correo