8 - Capitulo 6
8 - Capitulo 6
8 - Capitulo 6
CAPÍTULO 6
LECTURA Y ESCRITURA DE DATOS A TRAVES DEL PUERTO
PARALELO
OBJETIVOS:
Al completar este tema usted podrá:
Este cable tendrá, en un extremo, una ficha DB-25 macho y tiene el aspecto que se
observa en la figura de la izquierda. El otro extremo es el que conectaremos a
nuestro tablero de pruebas, para lo cual debemos retirar la vaina externa
cuidadosamente con un cutter en una extensión de unos 5 a 7 cm, lo que pondrá a
la vista 25 delgados cables multicolores y una línea desnuda (sin plástico), que es
el cable de tierra de la ficha (no del puerto).
Esta distribución debe ser tenida en cuenta para completar la construcción del
cable, como también para la confección de los correspondientes programas. Si algo
no resulta familiar de este listado, se recomienda repasar el tema "Anatomía del
puerto paralelo: designación y funciones de los pines", pp 17 a 19 del capítulo 4:
"Arquitectura interna..."
Nota importante: De las 25 líneas que tiene el cable, hemos usado y conectaremos
sólo 6, como hemos visto. Las 19 líneas restantes deben quedar aisladas entre sí y a
masa. No olvidar que en el otro extremo todas estas líneas están conectadas a
través de la ficha DB-25, a otros pines activos del puerto paralelo, y en caso de
tocarse entre sí, podrían provocar daños a la computadora.
Notar que los leds están conectados como se indica en la figura de la izquierda de
la página 10 del capítulo 2: "Electrónica Básica...", es decir que de esta forma el
puerto actúa como "fuente" o "batería", y debemos ser cuidadosos con la corriente
que va a erogar. Por ese motivo ponemos los leds en serie con resistencias de 1000
ohm, que limitarán la corriente a 5V/1000ohm = 0,005 A, que es bastante alta para
el puerto y provoca una muy escasa iluminación de los leds. Sin embargo, tiene la
ventaja que el led se enciende cuando se aplica un uno lógico desde el puerto.
Notar también que el tact switch está conectado tal como se ha visto en la figura de
la parte inferior de la página 13 del capítulo 2: "Electrónica Básica...", de manera
que estaremos enviando a la PC un 1 lógico si no apretamos el tact y un 0 si lo
apretamos.
Con este tablero igualmente se pueden verificar las partes de los programas Qbasic
del capítulo 5: "Programando el manejo..." que antes no pudimos hacer por no
tener preparado el hardware necesario.
Como probablemente nos decepcione la baja intensidad con que se iluminan los
leds, podemos intentar el circuito del punto siguiente, que ya nos dará mejores
resultados.
Este circuito, muy parecido al anterior, tiene como diferencia fundamental que el
puerto recibe la corriente desde una fuente externa, y de esta forma admite que
circule mayor corriente por él, por lo que pueden disminuirse las resistencias serie
de los led.
Notaremos que ya en este caso los led tienen una intensidad luminosa notable-
mente mayor, pero ahora debemos tener en cuenta que para que un led encienda,
debe aplicarse un 0 lógico a la línea correspondiente del puerto paralelo, de manera
que funciona en forma inversa al circuito anterior.
Esta tarea puede hacerse mediante alguna de las técnicas descriptas anteriormente
en el Capítulo 4, y una vez determinado y elegido el puerto a utilizar, asignando su
número a la variable que identifica el puerto, por ejemplo:
add = &H278
add = &H378
pero cuando hay más de un puerto presente, es más práctico hacerlo mediante un
pequeño programa, que nos permita elegir por teclado el puerto a utilizar, por
ejemplo:
'ELIGPUER.BAS - Detecta los puertos paralelo disponibles y permite
'seleccionarlos por teclado, asignado la variable add al puerto elegido
'Cuando no encuentra puerto devuelve direccion = 0
CLS
DEF SEG = 0
FOR i% = 1 TO 3
lpt% = PEEK(&H408 + (i% - 1) * 2) + PEEK(&H408 + (i% - 1) * 2 + 1) * 256
PRINT " Encontrado LPT"; HEX$(i%); " en "; HEX$(lpt%)
NEXT i%
INPUT "El cero no es valido - Ingrese en hexadecimal el puerto a utilizar-";
puerto
add = puerto
PRINT "El puerto a usar es"; add; "en sistema decimal y "; HEX$(add); " en
hexadecimal"
END
add = &H278
pero queda claro que si no conocemos la dirección del puerto podemos reemplazar
esta línea por el programa anterior.
Este programa puede probarse con nuestro tablero de pruebas, y es obvio que
funcionará tanto en el caso de que el led encienda con un 1 lógico como con un
0 lógico.
b) Ya veremos como podemos construir un pequeño dispositivo para detectar la
obscuridad y que envíe un 0 lógico ó un 1 lógico según haya luz o no, pero por
lo pronto, estas situaciones pueden representarse con un tact switch externo a la
PC, que me envíe tales datos a la PC mediante alguna línea del puerto paralelo.
El circuito Nº 2 del tablero de pruebas dado en la página 6, nos sirve
perfectamente para nuestros fines, el que además nos permite verificar el
funcionamiento del siguiente programa:
'Programa led-03.bas. Enciende y apaga un led en la linea datos bit 0,
'con intervalos de 1 segundo, indicando que esta en espera, lo que se
'mantiene mientras el tact switch no sea apretado (= 1 logico).
'Cuando se acciona el tact switch prende todos los led 1 seg para
'indicar que inicia la secuencia de iluminacion y luego de transcurrido
'cierto tiempo va encendiendo cada uno de los 3 led restantes en forma
'secuencial.
princ:
add = &H278
OUT add, 14 'pone en bajo el bit0, y prende led0; apaga bits 1 a 3
SLEEP 1
OUT add, 15 'apaga los cuatro leds
SLEEP 1.5
sensor = (INP(add + 1) AND 64) / 64 'releva la posicion del tact switch
PRINT sensor
IF sensor = 1 THEN
GOTO princ
ELSE 'como el tact ha sido accionado, comienza la secuencia
OUT add, 0 'apaga todo
SLEEP 1
OUT add, 15 'confirma que inicia conteo prendiendo todo un segundo
SLEEP 1
OUT add, 14 'prende el led correspondiente al bit0
SLEEP 1
OUT add, 13 'prende el led correspondiente al bit1
SLEEP 1
OUT add, 11 'prende el led correspondiente al bit2
SLEEP 1
OUT add, 7 'prende el led correspondiente al bit3
SLEEP 1
END IF
GOTO princ
END
Por último en el programa, los tiempos "sleep" se han fijado cortos para poder
verificar su operación en poco tiempo. Es necesario destacar que Qbasic tiene
otras formas de medir el tiempo para largos periodos, por ejemplo la sentencia
"TIMER", pero no profundizaremos aquí este tema por escapar a los propósitos
del curso.
Para no complicarnos la vida con las unidades de I, diremos que esta resistencia
LDR nos da, para I = 1 (que corresponde a una obscuridad casi total, por
ejemplo, al tapar la LDR con un dedo), una resistencia cercana a los 30 kΩ,
mientras que para I = 50 (que corresponde a una mesa de lectura bien
iluminada), resulta una resistencia ligeramente superior a 1 kΩ. Con estos datos
ya tenemos suficiente para nuestros propósitos, y ya veremos cómo los usamos.
LM324
(perspectiva)
Lo que todos los circuitos integrados tienen en común, es una muesca en una de
sus caras laterales (parte superior de la figura), que es la que define la forma de
identificar las patitas: siempre la Nº 1 es la más cercana a la izquierda de la
muesca, y a partir de ella se comienza a contar en sentido contrario al de las
agujas del reloj, quedando todas las patitas perfectamente identificadas. A
veces, además de la muesca (o en lugar de) viene marcado un punto blanco o
plateado sobre la patita Nº 1 (ver perspectiva).
LM324
Bueno, podemos decir que hay libros enteros para explicar este maravilloso
dispositivo de la electrónica moderna, que tiene cientos sino miles de
Capítulo 6: Lectura y escritura de datos a través del puerto paralelo - 2001 9
Autor: Ing. Jorge J. Ferrero Bajado de: www.profesormolina.com.ar
aplicaciones para sus múltiples funciones. Una de estas funciones, es la de
comparar tensiones (amplificador operacional comparador), y la utilizaremos
para construir nuestro sensor de luz. Veamos primero el circuito que vamos a
utilizar, y luego comprenderemos fácilmente como trabaja el amplificador
operacional (amp op).
1 lógico: oscuro
0 lógico: iluminado
El circuito Nº 3 será exactamente igual al Nº 2, nada más que en lugar del tact
switch y de las resistencias R5 y R6, conectaremos al pin 10 de nuestro puerto
paralelo, directamente la patita 1 del LM324.
Esta aplicación es muy simple, y podemos utilizar el tablero de pruebas tal como
se encuentra armado con el circuito Nº 2, siempre que se tenga presente que para
Capítulo 6: Lectura y escritura de datos a través del puerto paralelo - 2001 11
Autor: Ing. Jorge J. Ferrero Bajado de: www.profesormolina.com.ar
encender el led (o el circuito de iluminación), es necesario poner un 0 lógico en la
correspondiente línea. Si hemos comprendido todas las partes de la aplicación Nº
1, nos será muy sencillo encarar el programa en Qbasic.
add = &H278
princ:
OUT add, 15 'apaga los cuatro leds
sensor = (INP(add + 1) AND 64) / 64 'releva la posicion del tact switch
PRINT sensor 'testigo en pantalla del estado del inerruptor
IF sensor = 1 THEN
GOTO princ 'repite el ciclo eternamente mientras no se accione el
'interruptor
ELSE 'como el tact ha sido accionado, comienza la secuencia
SLEEP 10 'espera T1 = 10 segundos
OUT add, 14 'prende el led correspondiente al bit0
SLEEP 120 'espera T2 = 120 segundos
GOTO princ 'reinicia la secuencia
END IF
END
Todo está muy bien hasta el momento; tenemos un sensor de temperatura que nos
mide con precisión razonable entre 0 y 100 ºC (magnitud analógica), entregán-
donos una tensión que varía concordantemente con la temperatura entre 0 y 1 V
(también magnitud analógica). Nuestro problema radica ahora en transformar esta
magnitud analógica en una digital apta para ingresar a nuestro puerto paralelo.
Para ello utilizaremos el dispositivo que abordamos en el próximo punto.
Analizaremos a continuación los pines de entrada al ADC0831 (Vin (+), Vin (-) y
Vref). Los pines Vin son las entradas de la tensión a medir. La tensión de entrada
Capítulo 6: Lectura y escritura de datos a través del puerto paralelo - 2001 13
Autor: Ing. Jorge J. Ferrero Bajado de: www.profesormolina.com.ar
debe caer dentro del rango de la tensión de alimentación al ADC0831 (en este caso
0 a 5 V), caso contrario se daña irreversiblemente el ADC.
Hacia el pin
del puerto
paralelo Nº
3
2
LM35 visto
desde 10
arriba
Siempre el ADC mide la diferencia entre las tensiones presentes en Vin+ y Vin-,
con el requerimiento que Vin+ tenga un potencial más alto (más positivo) que
Vin-. En nuestro circuito, Vin- se conecta a tierra (0V), de manera de estar seguros
que Vin+ sea siempre más positivo que Vin-.
Vin- es el extremo inferior del rango de lectura del ADC. Si se ingresa Vin- al
ADC, éste entregará un 0 (0000 0000b) a la salida. Por otra parte, Vref fija el
extremo superior de la escala, o sea el que provocará que el ADC entregue el valor
más alto posible de su rango, 255 (1111 1111b). Ahora bien, hay un límite práctico
aconsejable para la diferencia entre Vref y Vin-; no es conveniente que sea inferior
a 1 V. Si ese fuera el caso, esto significaría que cada unidad de salida digital del
ADC (en total 255 unidades), puede representar una diferencia de potencial tan
pequeña como 1/255 = 0,0039 V = 3,9 mV. Por otra parte, la tensión que queremos
medir, o sea la salida del sensor de temperatura, entrega una tensión de 10 mV/ºC.
Luego, es fácil advertir que si fijamos Vref = 2,55 V en el ADC, tendremos a su
salida 2,55/255 = 0,01 V = 10 mV, igual que el sensor. De esta forma la constante
de conversión es igual a 1, o sea que en el monitor de la PC, donde leeremos la
variable que entrega el ADC, tendremos lectura directa en ºC sin necesidad de
hacer conversiones u operaciones matemáticas.
A este punto ya sabemos como conectar el sensor y el ADC; veamos ahora como
se leen las salidas del ADC mediante nuestro puerto paralelo. La figura precedente
muestra que el ADC se conecta al puerto paralelo mediante tres pines: CS, Clk y
D0(del ADC0831).
Este pequeño programa de 22 líneas nos puede dar algunos dolores de cabeza para
entenderlo, por cuanto -debemos asumirlo- no somos programadores experimenta-
dos. Sin embargo, aquí va una receta sencilla para que apliquemos y tratemos de
entenderlo.
Una vez que hemos logrado leer la temperatura y registrarla en una variable dentro
de nuestro programa, es muy sencillo controlar la temperatura, ya que por otra
línea de salida del puerto paralelo, podemos comandar mediante un relé la
conexión de una resistencia de calentamiento cuando la temperatura descienda por
debajo de un valor x, que puede ser ingresado por teclado o estar ya establecido en
el programa. Si hay alguna instrucción no conocida en el programa como por
ejemplo "while...wend", ver la misma en la ayuda de Qbasic.