Vous êtes sur la page 1sur 84

Dispositivos de E/S Programables

496


















En este captulo se presentarn aplicaciones prcticas que usan dispositivos
programables para interconexin de E/S. El modo de operacin de tales circuitos es
programado al inicio del cdigo y puede ser modificado en cualquier momento. El
uso de estos chips simplifica el circuito de interconexin y reduce el nmero de lneas
del programa de control.

En el interior del encapsulado de los dispositivos microcontroladores moder-
nos se integra un grupo de circuitos programables los cuales realizan las funciones
mnimas necesarias para resolver una tarea tpica de control de complejidad baja. Es-
tas funciones son: E/S digital, control de tiempo, conversin D/A y modulacin por
ancho de pulso. En contraposicin, para que un microprocesador pueda ser usado en
aplicaciones de control es necesario interconectar a la CPU circuitos LSI externos
para que realicen las distintas tareas bajo la direccin del P. Tambin en caso que
los recursos de un microcontrolador no sean suficientes para una aplicacin determi-
nada, es necesario convertir el ctrl en un microprocesador y conectarle hardware
externo.

Aunque estos dispositivos externos pueden ser simples acopladores de tres es-
tados o registros paralelos, el desarrollo de la tecnologa del P introdujo desde hace
30 aos un grupo de dispositivos programables para interconexin de E/S, los cuales
pueden realizar en forma eficiente cualquier tarea que involucre gestin de E/S. Aun-
que cada fabricante de semiconductores (Intel, Motorola y Zilog entre otros) introdu-
jo su propio grupo de chips programables durante la dcada de los setenta. En este
captulo se prestar atencin a los circuitos programables diseados originalmente por
INTEL para la serie MCS-80/85, adoptados luego por los sistemas MCS-86/88 y que
han sido incorporados, bien sea dentro del P o en el conjunto de chips, a los moder-
nos sistemas Pentium.


D Di is sp po os si it ti iv vo os s d de e E E/ /S S P Pr ro og gr ra am ma ab bl le es s
Dispositivos de E/S Programables

497

El circuito de interconexin de E/S paralela PPI 8255A, el controlador de inte-
rrupciones PIC 8259A, el USART 8251, el temporizador programable 8253/54 o ver-
siones avanzadas de estos componentes son ejemplos de dispositivos que cumplen
funciones en sistemas PCs modernos y que son compatibles con sistemas basados en
el 8085A. El avance en la tecnologa de fabricacin de circuitos integrados ha hecho
obsoletos a muchos de estos chips (controladores de CRT y de discos). No obstante
algunos componentes como el USART 8251A y el PPI 8255A mantienen hoy en da
toda su funcionalidad y son usados en aplicaciones con Ps como controladores de
perifricos. En el caso del controlador de interrupciones, las funciones del PIC8259A
se incorporaron al P Pentium como una unidad funcional interna. En este captulo se
discutir el uso de estos chips en ejemplos del mundo real.

9.1 CIRCUITO PARA INTERCONEXIN DE PERIFRICOS 8255

EL PPI 8255A (Peripheral Interface Programmable) fue diseado original-
mente para Ps INTEL, pero ha siso usado en aplicaciones realizadas con la mayora
de los microprocesadores existentes. El 8255A ofrece 24 terminales de E/S las cuales
pueden programarse en dos grupos (A y B) de 12 lneas. El dispositivo puede operar
en tres modos diferentes (0, 1 y 2). La figura 9.1 muestra el diagrama de bloques y la
distribucin de terminales del 8255A.



























Fig.9.1. El PPI 8255A.
8255
Dispositivos de E/S Programables

498
DEFINICIN FUNCIONAL DE LOS TERMINALES DEL 8255A

V
CC

GND
+ 5 V
Tierra
CS
Un nivel bajo en este terminal permite la comunicacin entre el P y el 8255A.
WR
Esta entrada se activa a cero durante una operacin de escritura del P.
RD
Entrada activa en cero durante una operacin de lectura del P.
D
0
-D
7
Es el bus de datos bidireccional y tres estados por medio del cual se transfieren comandos y/o datos
entre el PPI y el P.
RESET Un nivel alto en esta entrada inicia el registro de control con todos los puertos en el modo de entrada.
A
0
A
1
En conjunto con las entradas CS , WR
y
RDcontrolan el acceso a uno de los tres puertos de E/S o
al registro de control. Usualmente se conectan a las salidas A
0-1
del 8085A.
PA
0
-PA
7

Puerto A: Ocho bits de un latch de salida, buffer y un latch de entrada.
PB
0
-PB
7

Puerto C : Ocho bits de un latch de salida , buffer y un latch de entrada.
PC
0
-PC
7

Puerto C: Ocho bits de un latch de salida, y buffer de entrada. Puede usarse como dos puertos de 4
bits.

Al grupo A pertenecen el puerto A: PA0-PA
7
y los cuatro bits ms significati-
vos del puerto C (PC
4
-PC
7
); el grupo B agrupa las ocho lneas del puerto B: PB
0
-PB
7

y los cuatro bits de orden bajo del puerto C (PC
0
-PC
3
). Adems de los puertos, el
8255A contiene un registro de comandos para la programacin del dispositivo. Para
que el 8085A pueda tener acceso a uno de los registros para programar el dispositivo,
o usar uno de los puertos, la entrada de habilitacin CS debe ponerse a nivel bajo. La
seleccin del registro de comando o de un puerto de E/S particular, se realiza por me-
dio de las entradas de direccin A
0
y A
1
, segn lo indicado por la tabla 9.1.

Tabla. 9.1 Direcciones de los registros internos del PPI 82550


El tipo de operacin a realizar es determinado por la activacin de una de las
entradas de control: RDo WR . Estas lneas de entrada puede conectarse a los termi-
nales de igual nombre del P o a las salidas de control de lectura y escritura en puer-
to de E/S: IORDe IOWR, de acuerdo con el modo que se decodifica la direccin del
dispositivo. Las ocho lneas de datos D
0
-D
7
van al bus de direcciones/datos AD
0
-AD
7

y permanecern en estado de alta impedancia cuando CS no est activa; o en caso
que RDy WR estn ambas en uno, independientemente del estado de CS. La tabla de
estados del funcionamiento bsico del 8255, se ofrece en la tabla 9.2.

El modo en el cual el PPI se interconecta con la CPU se muestra en la figura
5.21, donde se usa seleccin lineal para habilitar el 8255A. Cuando al sistema se le
A
7
A
6
A
5
A
4
A
3
A
2
A
1
A
0
x x x x x x 0 0 Puerto A de E/S
x x x x x x 0 1 Puerto B de E/S
x x x x x x 1 0 Puerto C de E/S
x x x x x x 1 1 Registro de comando
Registro seleccionado
Direccin del puerto de E/S
Dispositivos de E/S Programables

499
aplica energa, la lnea RESETOUT del P sube a nivel alto y obliga al 8255A a
iniciarse con todos los puertos programados como entrada. Si tal configuracin no es
la deseada para la aplicacin, el PPI debe ser reprogramado escribiendo un cierto pa-
trn de bits en el registro de comando.

Tabla. 9.2 Operacin del PPI 8255A.


9.1.1 Puertos de entrada y salida

El 8255A tiene tres puertos A, B, C de ocho bits, pudiendo dividirse el puerto
C en dos registros de E/S de cuatro bits cada uno. Los cuatro puertos se organizan
como dos grupos A y B, donde cada grupo es formado por un puerto de ocho bits y
otro de cuatro lneas. Como ilustra la figura 9.1, el grupo A est compuesto por el
puerto A y el nibble ms alto del puerto C. Al grupo B lo forma el puerto B y los cua-
tro bits de orden bajo del puerto C.

Grupo A: PA
0-7
+ PC
4-7

Grupo B: PB
0-7
+ PC
0-3


La funcin de las lneas de cada grupo la fija una palabra de control que se
carga en el registro de comando (A
0
-
1
=11
2
), para operacin en tres modos diferentes.
9.1.2 Modos de operacin del 8255A

El cdigo de la aplicacin puede programar los grupos A y B del 8255A para
que funcione en uno de tres modos de operacin. Estos son:

1. Modo 0 E/S normal.
2. Modo 1 E/S con protocolo de enlace.
3. Modo 2 Transferencia bidireccional.
Dispositivos de E/S Programables

500
Modo 0

Los terminales de los puertos A, B y C pueden programarse como entradas o
salidas con retencin (slo las salidas) de los datos. El puerto C puede usarse como
dos puertos de 4 bits, con posibilidad de activar/desactivar cualquiera de las lneas
individualmente. Son posibles 16 configuraciones diferentes de E/S en este modo.

Modo 1

La transferencia desde/hacia los puertos A y B es controlada por un protocolo
de enlace usando las lneas del puerto C. Los grupos A y B pueden ser programados
en forma independiente para usar el puerto de ocho bits para transferencias controla-
das por las cuatros lneas del puerto C del grupo correspondiente. El puerto A y B
puede ser entrada o salida, ambas con retencin de datos. Los terminales del puerto C
respectivo se usan como seales de control o de estado del puerto de ocho bits.

Modo 2

El puerto A puede programarse para transmisin o recepcin de datos sobre
las mismas lneas. Tanto las entradas como las salidas son retenidas y se usan cinco
lneas del puerto para controlar y examinar el estado de la transferencia a travs del
puerto A.
9.1.3 Programacin del 8255A

La palabra escrita en el registro de control es decodificada por la lgica inter-
na del dispositivo para establecer cual de dos funciones posibles ser realizada. Estas
son:

1. Definicin de modo de operacin.
2. Activacin/desactivacin de bits del puerto C.

Cuando el bit ms significativo (D
7
) de la palabra de control es uno, esta se
interpreta como un byte de definicin de modo de operacin. El formato de esta pala-
bra se muestra en la figura 9.2

Se puede configurar al componente para operacin en un modo o en una com-
binacin de estos. La figura 9.3 muestra un ejemplo de seleccin de modo. En este
caso los grupos A y B se configuran como entradas/salidas en el modo 0. Si la direc-
cin del puerto de control es 0BH y la palabra de control es 91H, el siguiente cdigo
realizar la programacin de chip.

pctrl_8255 equ 0bh ; Direccin del registro de control

mvi a,10010001b ; Dalabra de control al acumulador
out pctrl_8255 ; Se programa el dispositivo
Dispositivos de E/S Programables

501

































Fig. 9.2 Palabra de definicin del modo de operacin.


















Fig. 9.3 Ejemplo de configuracin en modo 0.

Dispositivos de E/S Programables

502
Cuando el bit D
7
de la palabra de control es cero lgico, los circuitos internos
del PPI la entienden como una orden de activacin/desactivacin de uno de los bits
del puerto C. El formato de este comando se muestra en la figura 9.4. Esta funcin se
denomina bit set/reset, y permite poner a uno o a cero cualquiera de las lneas del
puerto C.






















Fig. 9.4 Formato de la palabra de control para activar/desactivar un bit del puerto C.

Suponga que se desea generar un pulso de nivel alto en el terminal 2 del puer-
to C. El siguiente programa realizar la tarea.

;----------------------------------------------------------------------------------------------
pctrl_8255 equ 0bh ; Direccin del registro de control.

; Pulso se inicia en cero

mvi a,00000100b ; Palabra de control al acumulador
out pctrl_8255 ; Bit 2 a cero, al inicio.

; Poner bit a nivel alto

mvi a,00000101b ; Palabra de control al acumulador
out pctrl_8255 ; Bit 2 a uno.

; Poner bit a nivel bajo

mvi a,00000100b ; Palabra de control al acumulador
out pctrl_8255 ; Bit 2 a cero al final del pulso.
;----------------------------------------------------------------------------------------------
Dispositivos de E/S Programables

503
9.1.4 Aplicaciones del 8255

A continuacin se presentan un grupo de ejemplos prcticos que ilustran el
uso del PPI 8255A en sus diferentes modos de operacin.

Operacin en el modo 0

La primera aplicacin del modo 0 consiste en la interconexin de un teclado al
sistema usando un 8255A y la rutina de lectura del teclado.

Ejemplo 9.1

Se debe escribir un programa para la lectura del teclado numrico de la figura
9.5. Cuando se pulse una tecla, debe retornarse su valor en el registro acumulador.












(a) (b)

Fig. 9.5 Teclado numrico. a) Aspecto mecnico. b) Smbolo elctrico.

El teclado de la figura 9.5 se usa para introducir al C informacin numrica
en representacin hexadecimal. El perifrico de entrada est formado por 16 pulsado-
res conectados en una matriz 4 x 4. La presin de un pulsador conectar la fila donde
se encuentra la tecla, con la columna correspondiente.

Las funciones que debe realizar el programa de control de teclado son:

Detectar la pulsacin de una tecla.
Suprimir los rebotes de contactos.
Identificar la tecla.
Generar el cdigo correspondiente.
En forma opcional: proteger al sistema contra pulsaciones simultneas de teclas distintas.

Para conectar el teclado, se usa el puerto C del 8255 funcionando en modo 0.
Las filas del se conectan a los terminales PC
0-3
y las columnas a las lneas PC
4-7
, co-
mo indica la figura 9.6. Tanto las filas como las columnas se fuerzan a +5 V por me-
dio de resistores.
Dispositivos de E/S Programables

504









Fig. 9.6 Un PPI 8255 funciona como puerto para el teclado.

Dispositivos de E/S Programables

505
El programa esperar en un lazo hasta que ocurra la pulsacin de una tecla. La
activacin de un pulsador conectar la fila donde ste se ubica con la columna corres-
pondiente. A cada elemento de la matriz le corresponde un nmero para indicar su
ubicacin y un cdigo que representa el valor de la tecla.

Las teclas se numeran: 00, 11,FF. De modo que para este caso, el c-
digo de la tecla se corresponde con su nmero. Por ejemplo la tecla 6 (nmero 6) es-
tar en la fila 1 columna 2. El algoritmo para determinar el valor de una tecla consis-
te en identificar la fila y la columna de la tecla presionada. El nmero (posicin en la
matriz) del pulsador viene dado por:

Columna la de N Columnas de Nmero Fila la de N N

+ =

La tecla de valor 6 tendr como nmero 1 x 4 + 2 = 6. En este caso el n-
mero corresponde con el valor. Si el teclado tiene teclas de funcin ser necesario el
uso de una tabla, a la cual se entra con el nmero de la tecla para encontrar el valor
correspondiente.

Identificacin de la fila:

PC
bajo
: Entrada
PC
alto
: Salida

Fig. 9.7 Identificacin de la fila.

Se escribe el patrn de bits 0000 en el puerto PC
alto
y se procede a leer en el
puerto PC
bajo
: 1101. El bit 1 estar en nivel bajo debido a que la tecla 6 fue pulsada.
Dispositivos de E/S Programables

506
El valor en el acumulador permite identificar la fila a la cual pertenece el pul-
sador activado.

Identificacin de la columna:

PC
bajo
: Salida
PC
alto
: Entrada

Fig. 9.8 Identificacin de la columna.

Se escribe el patrn 0000 en el puerto PC
bajo
y se lee en el puerto PC
alto
: 1011.
El bit 2 estar en cero debido a que la tecla 6 fue pulsada. Una vez identificadas la fila
y la columna puede calcularse el nmero del pulsador como se describe en la pgina
previa.

En la figura 9.9 se muestra el diagrama de flujo del programa tecla, el cual es-
pera por la presin de una tecla y suprime el efecto del rebote del interruptor o una
activacin falsa por ruido. Si ocurre una pulsacin vlida, se procede a determinar el
nmero del pulsador como se indic. El cdigo de la rutina Tecla se presenta a conti-
nuacin y considera que el 8255 de la figura 9.6 se decodifica en la direccin 0. La
posicin de la tecla pulsada es cargada en el registro acumulador.

El teclado del ejemplo 9.1 solo permite introducir al sistema nmeros del c-
digo hexadecimal. En la prctica, es usual que las aplicaciones requieran teclados con
pulsadores de funcin. Por ejemplo una tecla puede validar un nmero previamente
introducido. Otras pueden permitir: el borrado de la pantalla, el desplazamiento en un
men de opciones, la ejecucin de un programa, especificar la direccin de giro de un
motor o calcular la raz cuadrada del valor cargado previamente.
Dispositivos de E/S Programables

507


Fig. 9.9 Rutina tecla para detectar activacin, eliminar rebote e identificar pulsador.
Dispositivos de E/S Programables

508
;---------------------------------------------------------------------------------------------------------------------------
; Rutina de lectura de teclado 4x4
;---------------------------------------------------------------------------------------------------------------------------
palb_ctrl1 equ 91h
palb_ctrl2 equ 8ah
pc_8255 equ 2
pctrl_8255 equ 3
;---------------------------------------------------------------------------------------------------------------------------

tecla: mvi a,palb_ctrl1 ;PCL:entrada, PCH:salida
out pctrl_8255
mvi a,0fh ; Nibble alto del acumulador a cero
out pc_8255 ; Todas las columnas a cero
leer: in pc_8255 ; Leer filas
ani 0fh ; Poner mascara
cpi 0fh
jnz leer ; Si tecla pulsada, leer
call r20ms ; Teclas liberadas, esperar 20 ms
releer: in pc_8255 ; Leer filas
ani 0fh ; Poner mascara
cpi 0fh ; Detectar tecla pulsada
jz releer ; Tecla no pulsada, leer puerto
call r20ms ; Tecla pulsada, esperar 20 ms
in pc_8255 ; Detectar error por ruido
ani 0fh
cpi 0fh ; Detectar pulsacin falsa
jz releer ; Si ruido, leer puerto
mov c,a ; Cargar patrn de filas en C
mvi a,palb_ctrl2 ; PCL:salida, PCH:entrada
out pctrl_8255
mvi a,0f0h ; Todas las filas en cero
out pc_8255
in pc_8255 ; Patrn de columnas en A

; Identificar columna

mvi b,3 ; Contador de columnas a 3
iden_c: ral ; Desplazar a la izquierda
jnc fila ; Si CY=0, en B numero de columna
dcr b ; Si CY=1, restar 1 a contador de colum.
jmp iden_c ; Volver a desplazar

; Identificar fila

fila: mov a,c ; Patrn de filas en acumulador
mvi c,0 ; Contador de filas a cero
iden_f: rar ; Desplazar a la derecha
jnc listo ; Si CY=0, en C numero de fila
inr c ; Si CY=1, incrementar contador de filas
jmp iden_f ; Desplazar
listo: mov a,c ; Numero de fila al acumulador
ral ; Numero de la fila x 4
ral
ora b ; Sumar nmero de columna
ret ; Nmero de tecla en registro A
Dispositivos de E/S Programables

509
El ejemplo que sigue describe el modo de interconexin al sistema y el pro-
grama de control de un teclado con teclas cuyas funciones son especificadas por el
diseador.

Ejemplo 9.2


La figura 9.10 presenta un teclado de 20 teclas arregladas en una matriz de 4x5
con cuatro pulsadores de funcin. Escriba una rutina que lea el teclado y cargue el
cdigo de la tecla en el registro acumulador.












Fig. 9.10 Matriz de 20 teclas con cuatro funciones.

Debido a la distribucin de los pulsadores en la matriz, el nmero que indica
la posicin no corresponde con el valor que debe retornar la tecla. Por ejemplo la te-
cla nmero 4 es F
4
y la nmero 5 tiene el valor 4. Esto determina que una vez deter-
minada la posicin del elemento en la matriz, debe usarse una tabla de bsqueda para
encontrar el cdigo correspondiente. Tambin deben usarse cuatro lneas del puerto A
para las filas y cinco del puerto B para las columnas. El siguiente cdigo realiza la
tarea solicitada en el ejemplo.


;---------------------------------------------------------------------------------------------------------------------------
; Seccin de programa principal que llama a rutina tecla.
; Con el nmero del pulsador entra en una tabla de consulta y encuentra el cdigo de la tecla activada y
; lo retorna en el registro acumulador.
;---------------------------------------------------------------------------------------------------------------------------
tope_pila equ 300h
;---------------------------------------------------------------------------------------------------------------------------
lxi sp,tope_pila
call tecla
lxi h,cod_tecla
add l
mov l,a
mov a,m
.
.
.
Dispositivos de E/S Programables

510
;---------------------------------------------------------------------------------------------------------------------------
; Tabla de cdigo de tecla
;---------------------------------------------------------------------------------------------------------------------------

cod_tecla: db 00h ; tecla 0
db 01h ; tecla 1
db 02h ; tecla 2
db 03h ; tecla 3
db 10h ; tecla f1
db 04h ; tecla 4
db 05h ; tecla 5
db 06h ; tecla 6
db 07h ; tecla 7
db 11h ; tecla f2
db 08h ; tecla 8
db 09h ; tecla 9
db 0ah ; tecla a
db 0bh ; tecla b
db 12h ; tecla f3
db 0ch ; tecla c
db 0dh ; tecla d
db 0eh ; tecla e
db 0fh ; tecla f
db 13h ; tecla f4
;---------------------------------------------------------------------------------------------------------------------------
; Rutina de lectura de teclado 4x5. Retorna nmero de tecla en el acumulador
;---------------------------------------------------------------------------------------------------------------------------
palb_ctrl1 equ 91h
palb_ctrl2 equ 8ah
pa_8255 equ 0
pb_8255 equ 1
pctrl_8255 equ 3
;---------------------------------------------------------------------------------------------------------------------------
tecla: mvi a, palb_ctrl1
out pctrl_8255
xra a
out pb_8255
leer: in pa_8255
ani 1fh
cpi 1fh
jnz leer
call r20ms
releer: in in pa_8255
ani 1fh
cpi 1fh
jz releer
call r20ms
in pa_8255
ani 1fh
cpi 1fh
jz releer
mov c,a
mvi a, palb_ctrl2
out pctrl_8255
xra a
Dispositivos de E/S Programables

511
out pa_8255
in pb_8255
mvi b,0
iden_c: rar
jnc fila
inr b
jmp iden_c
fila: mov a,c
mvi c,0
iden_f: rar
jnc listo
inr c
jmp iden_f
listo: mov a,c
ral ;Numero de la fila x 5
ral
add c
add b ;Sumar nmero de columna
ret

Observe que a las cuatro teclas de funcin se les asigna cdigos arbitrarios y
diferentes a los dgitos del sistema hexadecimal. Por ejemplo 10H para F
1
, 11H para
F
2
, 12H para F
3
y 13H para F
4
. Estos valores permiten al programador conocer cual
funcin fue seleccionada en cualquier momento.

Es usual que una aplicacin basada en Ps requiera adems de perifricos de
entrada algn tipo de dispositivo para exhibicin de informacin. Los sistemas de
bajo costo usan mdulos LCD o indicadores de siete segmentos. An cuando las pan-
tallas LCD de 2 a 4 neas han disminuido en costo y no requieren refrescar continua-
mente los datos presentados, los visualizadores con diodos 7-segmentos son de uso
difundido en el medio industrial sobre todo cuando la luz ambiental es deficiente.
Puede considerarse que la presentacin con dispositivos tipo LEDs permanecer du-
rante muchos aos como una opcin vlida para el despliegue de informacin en sis-
temas e instrumentos electrnicos de bajo costo. El ejemplo siguiente ilustra el uso de
tales indicadores para exposicin de informacin alfanumrica.

Ejemplo 9.3

La figura 9.11 muestra un circuito visualizador de ocho dgitos con indicadores
de siete segmentos tipo nodo comn, conectados a un PPI 82C55. Para minimizar el
nmero de lneas de interconexin se usa la tcnica de multiplexado de los datos a
presentar. Se debe escribir una rutina para el control de exhibidor, mostrando en la
pantalla el mensaje: Udo 2005.

Al multiplexar en el tiempo, cada indicador es seleccionado durante un lapso
determinado, pero debido a la persistencia de la imagen en la retina humana, ste apa-
renta estar continuamente activado. Los segmentos de todos los LEDs se conectan en
ocho lneas comunes y cada dgito se activa a una frecuencia f
mux
.
Dispositivos de E/S Programables

512













Fig. 9.11. Circuito de presentacin con ocho caracteres alfanumricos.
Dispositivos de E/S Programables

513
Para una presentacin con parpadeo mnimo, la frecuencia de multiplexado
debe estar comprendida entre 100 Hz y 1.5 KHz. Esto significa que si los N indicado-
res se activan en intervalos T
x
de 500 s, la frecuencia f
mux
ser igual:

x
1
T N
1000
250 Hz
0.5 8
mux
mux
f
f
=

= =



El circuito debe estar sincronizado. Esto significa que debe cargarse en el
puerto A del 82C55 (funcionando en modo 0) el complemento del cdigo de 7 seg-
mentos del caracter a presentar en un LED y simultneamente debe aplicarse un nivel
bajo, por medio de una lnea del puerto B, en la base del transistor que aplica energa
al indicador correspondiente. Este proceso se repite para cada dgito, a una frecuencia
Nf
mux
.

Como se observa en la figura 9.11, el puerto A del 82C55 se usa para activar
los segmentos. Para proveer la corriente necesaria para los segmentos se usa un cir-
cuito amplificador ULN2003 el cual puede manejar con comodidad corrientes de sa-
lida de hasta 500 mA. Debido a que el chip solo tiene siete pares darlington, se usa un
transistor discreto Q2N222A para el punto decimal. La seleccin de dgitos se logra
activando con un nivel bajo en el terminal correspondiente del puerto B, uno de los
transistores PNP Q2N4405.

La seleccin de la corriente que debe circular por cada segmento para garanti-
zar una brillantez adecuada ante el observador, depende de distintos factores fsicos y
humanos. La distancia de observacin, el ngulo de visin, la altura del carcter, la
iluminacin ambiental y la razn de contraste entre el indicador y el color del fondo
ambiental son algunos de los parmetros a considerar para fijar el valor adecuado de
la corriente por segmento. En nuestro caso se considera que, de acuerdo con las espe-
cificaciones del fabricante del indicador, una intensidad de I
f
=10 mA por segmento
garantizar un brillo aceptable. La corriente I
f
es provista por los amplificadores del
ULN2003 y por el transistor Q2N222A. La corriente que circula por el circuito de
colector de los transistores Q2N4405 de manejo de dgito ser igual a kI
f
con k igual
al nmero de segmentos iluminados en el indicador correspondiente.

Debido a que cada LED permanece apagado la mayor parte del tiempo, la co-
rriente promedio que circula por un segmento ser mucho menor que 10 mA y en
consecuencia la iluminacin percibida por el observador ser deficiente. Para com-
pensar el efecto del multiplexado sobre el nivel de corriente directa, se calcula la re-
sistencia R
p
de modo el pico de corriente en el segmento produzca una intensidad
promedio de 10 mA. La corriente que circula en promedio durante un periodo de mul-
tiplexado es:

N
I
I
T
N
T
I
pico
pico f
= =
Dispositivos de E/S Programables

514
Esto indica que para obtener un nivel de iluminacin equivalente a la que pro-
ducira una corriente de 10 mA en condiciones de corriente continua, el pico de co-
rriente debe ser igual a 80 mA, para una pantalla de ocho dgitos. Esto es:

f pico
I N I =

Para calcular el valor del resistor limitador de corriente R
p
se usa el circuito de
la figura 9.12 que muestra la trayectoria de la corriente por un segmento de un indi-
cador.



Fig. 9.12 Circuito equivalente para el clculo de R
p
.

El transistor Q
1
de la figura 9.12 conduce por la aplicacin de un nivel bajo en
su base. Esta tensin proviene de una lnea del puerto B. El transistor Q
2
del par dar-
lington del ULN2003 est activado cerrando el camino de la corriente a travs del
segmento a. Para iluminar un segmento, se aplica un nivel alto a la entrada del
ULN2003. El valor del resistor de 510 en la base de Q
1
se calcula para que cuando
todos los segmentos del indicador estn activados, circule una I
CQ1
= 8x80 mA= 640
mA. El V
CESATQ1
, bajo estas condiciones, es de aproximadamente 600 mV, mientras
que la tensin de saturacin de Q
2
a una corriente de 80 mA, es de 0.8 V. Con estos
valores se calcula R
p
:


=

=

= 15
mA 80
V ) 8 . 0 4 . 2 6 . 0 5 (
I
V V V V 5
R
pico
2 CEsatQ F 1 CEsatQ
P

Dispositivos de E/S Programables

515
La resistencia en la base del transistor que maneja el punto decimal se calcula
de modo que una tensin de 4.6 V en la lnea PA7 produzca una intensidad de 80 mA
en el circuito de colector del Q2N2222 con una tensin colector-emisor de 0.8 V.

El programa de control para el circuito de la figura 9.11 se muestra a conti-
nuacin. Este presenta el mensaje especificado con una frecuencia de multiplexado de
250 Hz. La presentacin se inicia por el indicador del extremo derecho.

;----------------------------------------------------------------------------------------------------------------
; Este programa presenta el mensaje Udo 2005 en
; una pantalla de indicadores de 7-segmentos.
;----------------------------------------------------------------------------------------------------------------


;----------------------------------------------------------------------------------------------------------------
i_stack equ 8fbh ; Inicio de la pila
num_dig equ 8
plbr_ctrl equ 80h
;----------------------------------------------------------------------------------------------------------------
; Definicin de segmentos
defseg puertos,start=0, class=iospace ; 8255 en direccin 0
defseg stack, start=i_stack ; La pila reside en la RWM
defseg progr, class=code, start=0
;----------------------------------------------------------------------------------------------------------------
; Puertos del 8255
seg puertos
pa_8255 ds 1 ; Salidas a segmentos
pb_8255 ds 2 ; Seleccin de dgitos
pctrl_8255 ds 1 ; Puerto de control
;----------------------------------------------------------------------------------------------------------------

; Los 8 bytes ltimos de RWM soportan el stack.
seg stack
ds 8
t_stack:equ $-1 ; Base de la pila
;----------------------------------------------------------------------------------------------------------------
; Segmento de cdigo en EPROM
seg progr
lxi sp,t_stack ; Se inicia el apuntador de pila
mvi a,plbr_ctrl ; Palabra de control del 8255
out pctrl_8255 ; Se programan puertos A y B como salidas
rep: lxi h,msj ; Registro par H apunta a primer caracter del mensaje
call visual ; Presentar mensaje
jmp rep ; Repetir por siempre
;----------------------------------------------------------------------------------------------------------------
; Rutina visual
;----------------------------------------------------------------------------------------------------------------
visual: mvi b,num_dig ; Registro B es el contador de dgitos
mvi a,0feh ; Primero se activa el dgito 0
mov c,a ; Salvar patrn de seleccin de indicador
pres: out pb_8255 ; Activar dgito n
mov a,m ; Al registro acumulador primer caracter del mensaje
xchg ; Salvar direccin del mensaje en registro par DE
Dispositivos de E/S Programables

516
lxi h,cod_7seg ; HL apunta al inicio de la tabla de cdigos 7-segmentos
add l ; Sumar desplazamiento
mov l,a
mov a,m ; Cdigo de 7-seg al registro acumulador
out pa_8255 ; Sacar por puerto A
xchg ; Recuperar direccin de caracter del mensaje
call r500us ; Esperar 500 s
mov a,c ; Recuperar patrn de seleccin de dgito
rlc ; Se activar el dgito siguiente
mov c,a ; Guardar patrn
inr l ; Apuntar siguiente caracter del mensaje
dcr b ; Contador de caracteres menos 1
jnz pres ; Si no cero, siguiente caracter
ret ; Retornar si caracter final.
;----------------------------------------------------------------------------------------------------------------
; Mensaje
;----------------------------------------------------------------------------------------------------------------
msj: db u,?d,o,espac,dos,cero,cero,cinco
;----------------------------------------------------------------------------------------------------------------
; Tabla de cdigos de siete segmentos
;----------------------------------------------------------------------------------------------------------------
cod_7Seg:
cero equ $-cod_7Seg
db 0f3h
db 60h
dos equ $-cod_7Seg
db 0b5h
db 0f4h
cuatro equ $-cod_7Seg
db 66h
cinco equ $-cod_7Seg
S equ $-cod_7Seg
db 0d6h
db 0d7h
db 70h
ocho equ $-cod_7Seg
db 0f7h
db 7eh
?A equ $-cod_7Seg
db 77h
?B equ $-cod_7Seg
db 0c7h
?C equ $-cod_7Seg
db 93h
?d equ $-cod_7Seg
db 0e5h
?E equ $-cod_7Seg
db 97h
F equ $-cod_7Seg
db 17h
g equ $-cod_7Seg
db 0f6h
?H equ $-cod_7Seg
db 67h
?L equ $-cod_7Seg
Dispositivos de E/S Programables

517
db 85h
?M equ $-cod_7Seg
db 0e6h
n equ $-cod_7Seg
db 45h
i equ $-cod_7Seg
db 20h
J equ $-cod_7Seg
db 0e1h
o equ $-cod_7Seg
db 0e4h
P equ $-cod_7Seg
db 37h
q equ $-cod_7Seg
db 76h
r equ $-cod_7Seg
db 05h
t equ $-cod_7Seg
db 44h
u equ $-cod_7Seg
db 0Eh
equ $-cod_7Seg
db 0a3h
_ equ $-cod_7Seg
db 80H
espac equ $-cod_7Seg
db 00h
end
;----------------------------------------------------------------------------------------------------------------



Ejemplo 9.4


En este ejemplo se mide y presenta el valor de una tensin continua positiva
en el rango de 0 a +5 V. Se construir y programar un convertidor anlogo digital
por aproximaciones sucesivas (AS). El mtodo de AS usa un conversor digital anal-
gico y un comparador como ilustra la figura 9.13. El proceso de conversin se realiza
en un nmero de pasos igual al de bits (en este caso ocho) que tenga el CDA.


Fig. 9.13. Convertidor A/D por aproximaciones sucesivas.
Dispositivos de E/S Programables

518
Algoritmo:

Al inicio del proceso de conversin se aplica a las entradas del CDA un valor
digital con el bit ms significativo puesto a nivel alto y los bits restantes a cero y se
lee la salida del comparador. Un nivel lgico 1/0 indica que la seal de entrada es
mayor/menor que la generada por el CDA. El valor lgico de la salida del compara-
dor se asigna en la siguiente etapa al bit que se procesa. A continuacin se repite el
proceso con el siguiente bit y as sucesivamente hasta el menos significativo. El prin-
cipio de AS est basado en un mtodo de ensayo y error que aproxima el valor de la
seal de entrada a la mitad superior e inferior del rango de representacin de cada
etapa. En la figura 9.15 se presenta el diagrama de transiciones para un convertidor
anlogo digital por aproximaciones sucesivas de cuatro bits. Las seales V
o
y V
r
re-
presentan las salidas del circuito comparador y del conversor digital anlogo respecti-
vamente. La primera slo puede tomar valores 1 0, segn la tensin de entrada sea
mayor o menor que la generada por el CDA y la segunda es la tensin generada por
este conversor.

Fig.9.14. Circuito del convertidor A/D por aproximaciones sucesivas.

Existen convertidores analgico digital del tipo descrito presentados como un
chip en el cual el controlador se realiza por hardware y se integra al encapsulado. En
este caso se usa el P como controlador, conectando un DAC0808 al puerto de salida
B (01H) de un 8255A y examinando la salida del comparador LM311 por el bit 7 del
puerto de entrada C (02H), como ilustra la figura 9.14. El PPI 8255A funcionar en
modo 0 y no se muestra en el diagrama.

EL convertidor D/A tiene una resolucin de 8 bits y se configura para entregar
una corriente de salida I
OUT
desde 0 hasta I
FS
cuando las entradas A
8-1
van desde 00
hasta FFH. El amplificador operacional LM741 a la salida del CDA es un conversor
de corriente a voltaje y provee una tensin de salida igual a:

10 base 10 base
n
REF
S
OUT S
A
256
5
A
2
V
V
K 6 . 5 I V
= =
=

Dispositivos de E/S Programables

519


Fig. 9.15. Diagrama de transiciones para un CAD por aproximaciones sucesivas.

Los objetivos de este ejemplo son:

1 Escribir un programa en ensamblador para obtener el valor binario de la
tensin analgica de entrada V
i
usando el P para resolver el algoritmo de
aproximaciones sucesivas.

2 Desarrollar una rutina que convierta el valor binario de V
i
en tres dgitos
BCD y los almacene en memoria.

3 Realizar un programa que permita presentar el valor BCD de tres dgitos en
el circuito de exposicin visual de la figura 9.16.
Dispositivos de E/S Programables

520


Fig. 9.16. Pantalla de tres dgitos con indicadores tipo ctodo comn.


El mdulo de presentacin est formado por un display que contiene tres indi-
cadores de 7 segmentos ctodo comn y es especialmente fabricado para uso con la
tcnica de multiplexado. El circuito usa un decodificador CMOS 4511 para generar el
cdigo de 7 segmentos. La frecuencia de multiplexado debe ser 333.33 Hz (1000/3).

Solucin:

El programa de control para el voltmetro de corriente continua del ejemplo
consta de 4 mdulos, estos son:

Programa principal

Configura el 8255A para operar en el modo 0 con los puertos A y B como salidas y el puer-
to C como entrada.

Llama a la rutina ADC, la cual realiza el algoritmo de consultas sucesivas y retorna el valor
digital de la muestra.

Convierte el valor del voltaje de entrada desde binario a BCD y lo almacena en memoria.
Para la conversin a decimal se usa el hecho que dada la salida A del convertidor A/D, el va-
lor del voltaje de entrada es:
10 base i
A
256
5
V =

En representacin hexadecimal se tiene:
16 base i
A
H 100
5
V =

Dispositivos de E/S Programables

521
Si el resultado de la conversin es 255
10
= FFH, entonces el valor del voltaje es:

Volt 98 . 4 255
256
5
V
i
= =

Un nmero de 8 bits, al ser multiplicado por 5 por 10 siempre producir un resultado (su-
puesto de 12 bits) cuyo dgito ms significativo es un nmero BCD. De modo que bastar
ejecutar el producto 5 x FFH = 4FBH para obtener el primer dgito BCD (4) del resultado.
El valor FBH es el residuo despus de la divisin por 256. En realidad esta ltima operacin
no se realiza sino que el remanente FBH se multiplica por diez, resultando 9CEH. La divi-
sin entera de este valor por 256 entrega el dgito BCD (9) de las dcimas de voltios y un
residuo de C0H. Repitiendo el proceso con el nuevo residuo resulta el valor 80CH y se ob-
tienen las centesimas (8) de voltios. Con este algoritmo sencillo puede convertirse el dato
entregado por el ADC a un voltaje en BCD.

Rutina ADC

Realiza el algoritmo de aproximaciones sucesivas y retorna en el registro acumulador la re-
presentacin digital del voltaje V
i
de entrada. Esta tcnica pone a 1 el bit ms significativo
del puerto conectado al convertidor D/A, de modo que la salida del DAC tendr la tensin
de media escala. Este nivel es comparado con el valor del voltaje desconocido de entrada. Si
el voltaje de prueba a la salida del CDA es demasiado bajo, el bit es puesto a 1 permanen-
temente y se prueba el bit menos significativo siguiente. En caso contrario, el bit ms signi-
ficativo es puesto a cero y se procede con el prximo. Este proceso contina tratndose to-
dos los bits de izquierda a derecha, hasta el ltimo.

Rutina POR5

Multiplica por 5 el contenido del registro L y retorna el resultado en el registro par HL.
Tambin es llamada para ejecutar el producto por 10. En este caso el valor de 16 bits retor-
nado por el programa POR5, se desplaza un bit hacia la izquierda.

Rutina VISUAL

Es llamada por el programa principal para presentar el valor de la tensin almacenado en
BCD en la memoria del sistema. Una subrutina RET1MS genera el retardo de 1ms para fijar
la frecuencia de multiplexado deseada. Para disminuir el parpadeo del dgito menos signifi-
cativo, el periodo de muestreo del voltaje de entrada se ajusta aproximadamente a 1 segun-
do. La rutina de retardo forma parte del mismo mdulo que VISUAL.


A continuacin se presentan el contenido de cada mdulo, en el mismo or-
den como se describieron:

;--------------------------------------------------------------------------------------------------------------
$title(Voltmetro DC)
; Modulo de programa principal
;--------------------------------------------------------------------------------------------------------------
public pa_8255,pb_8255,pc_8255,temp,num_dig
extern adc,por5,visual
;--------------------------------------------------------------------------------------------------------------
i_stack equ 8500H ; Inicio de la pila
i_rwm equ 8000H ; Direccin de inicio de RWM para datos
num_dig equ 3 ; Nmero de indicadores LEDs
plbr_ctrl equ 89H ; PA y PB: Salidas PC: Entradas
;--------------------------------------------------------------------------------------------------------------
Dispositivos de E/S Programables

522
; Definicin de segmentos
defseg puertos,start=0, class=iospace ; 8255 en direccin 0
defseg stack, start=i_stack ; La pila reside en la RWM
defseg datos, class=data, start=i_rwm ; Datos a partir de 8000H
defseg progr, class=code, start=6002H ; Primera posicin de RWM de
; usuario en el MPR-85 PLUS
;--------------------------------------------------------------------------------------------------------------
; Puertos del 8255
seg puertos
pa_8255 ds 1 ; Salida de datos BCD y seleccin de indicadores
pb_8255 ds 1 ; Salida a convertidor D/A
pc_8255 ds 1 ; Lnea PC0 = P2.0, salida del comparador
p_ctrl ds 1 ; Puerto de control del 8255
;--------------------------------------------------------------------------------------------------------------
; Los 16 bytes ltimos de RWM soportan el stack.
seg stack
ds 10H
t_stack:equ $-1 ; Base de la pila
;--------------------------------------------------------------------------------------------------------------
; Segmento de datos en RWM
seg datos
temp ds 3 ; Direccin de almacenamiento de valor medido
;--------------------------------------------------------------------------------------------------------------
; Segmento de cdigo cargado en RWM de usuario del MPR-85 PLUS
seg progr
lxi sp,t_stack ; Se carga el apuntador de pila
mvi a,plbr_ctrl ; Palabra de control al A
out p_ctrl ; Se programa el 8255
prpal: call adc ; Adquirir muestra de la entrada
mov l,a ; Valor digital de muestra al registro L
call por5 ; Se inicia conversin de binario a BCD
mov a,h ; Dgito ms significativo al A
sta temp ; Dgito ms significativo a memoria
call por5 ; Remanente se multiplica por 10 (x5)
dad h ; Resultado se multiplica x2
mov a,h ; Dgito siguiente al A
sta temp+1 ; Dgito siguiente a memoria
call por5 ; Nuevo residuo x10 (x5)
dad h ; Resultado x2
mov a,h ; Dgito menos significativo al A
sta temp+2 ; Dgito menos significativo a memoria
call visual ; Presentar resultado de la medida
jmp prpal ; Buscar muestra siguiente
end
;--------------------------------------------------------------------------------------------------------------

;--------------------------------------------------------------------------------------------------------------
;Rutina ADC
;--------------------------------------------------------------------------------------------------------------
public adc
extern pb_8255,pc_8255
defseg progr
seg progr
adc: lxi b,8000h ; Patrn de media escala en B, registro C a cero
mov a,b ; Salvar patrn de media escala.
Dispositivos de E/S Programables

523
prob: ora c ; Sumar valor anterior de prueba
out pb_8255 ; Valor de prueba al convertidor D/A
in pc_8255 ; Se lee salida del comparador. Tp-->0
ani 1 ; Se pone mscara
jz alto ; Saltar si valor de prueba es mayor que el
; desconocido
mov a,b ; Recuperar valor de prueba actual
ora c ; Formar el total hasta ahora
mov c,a ; Salvar total
alto: mov a,b ; Recuperar ltimo valor de prueba
rar ; Desplazar hacia prximo bit menos significativo
mov b,a ; Guardar nuevo patrn
jnc prob ; Si acarreo es 1, es el ltimo bit
mov a,c ; Valor de tensin al registro A
ret
end
;--------------------------------------------------------------------------------------------------------------

;--------------------------------------------------------------------------------------------------------------
; Rutina POR5
;--------------------------------------------------------------------------------------------------------------
public por5
defseg progr
seg progr
por5: mvi h,0 ; Byte alto de nultiplicando a cero
mov d,h ; Multiplicando a registro par DE
mov e,l
dad h ; Multiplicando x2
dad h ; Multiplicando x2
dad d ; Sumar multiplicando.
; mulx2 + mul x2 + mul = mulx5
ret
end
;--------------------------------------------------------------------------------------------------------------

;--------------------------------------------------------------------------------------------------------------
; Rutina VISUAL
;--------------------------------------------------------------------------------------------------------------
public visual
extern temp,pa_8255,num_dig
defseg progr
seg progr

visual: lxi d,327
rep: push d ; Salvar contador de 16 bits
mvi b,num_dig ; Nmero de dgitos al registro B
lxi h,temp ; Apuntar digito 1 en memoria
mvi c,40h ; Patrn de seleccin de LED 1
precib: mov a,m ; Dgito n en BCD (D0-D3) al acumulador
ora c ; Agregar al acumulador (D4-D6) patrn
; de seleccin de indicador
out pa_8255 ; Salida de cdigo BCD y seleccin de display
call f_mux ; Presentar durante 1/(3 x fmux)
mov a,c ; Patrn de seleccin actual al A
rar ; Rotar hacia la derecha
Dispositivos de E/S Programables

524
mov c,a ; Patrn de seleccin de dgito siguiente a C
inx h ; Apuntar direccin del caracter siguiente
dcr b ; Contador de dgitos -1
jnz precib ; No es el ltimo dgito, continuar
pop d ; ltimo dgito, recuperar contador
dcx d ; Contador menos uno
mov a,d ; Probar si alcanz cero
ora e
jnz rep ; No es cero, seguir presentando muestra
ret ; Es 0, retornar en bsqueda de muestra siguiente
;--------------------------------------------------------------------------------------------------------------
; Rutina de retardo
;--------------------------------------------------------------------------------------------------------------
f_mux: lxi d,80H
fmux: dcx d
mov a,d
ora e
jnz fmux
ret
end
;--------------------------------------------------------------------------------------------------------------



Fig. 9.17. Ventana principal de MICRO-IDE con el proyecto del ejemplo 9.4.

Los circuitos de la figuras 9.14 y 916 fueron construidos e interconectados al
C MPR85-PLUS. Los mdulos del proyecto fueron compilados y enlazados usando
la herramienta Micro-IDE. El programa ejecutable resultante fue descargado por el
Dispositivos de E/S Programables

525
puerto serie del PC en la memoria del MPR-85 PLUS. El diseo fue probado y funcio-
n en forma correcta, presentado en pantalla el valor del voltaje fijado en el potenci-
metro. Contrastando la lectura con la de un voltmetro comercial, no se aprecia error
alguno. Este ejemplo fue un ejercicio didctico donde se mostr como pueden usarse
circuitos integrados CDA de bajo costo para que, con apoyo de cdigo, puedan reali-
zarse funciones ms complejas como la conversin analgica digital. En la prctica los
voltmetros se construyen con CAD de doble pendiente, los cuales vienen integrados
en chips multifuncin. Por ejemplo, adems de la conversin proveen salidas en BCD e
incluso seales y temporizacin para la pantalla multiplexada.

El modo 0 del PPI 8255A tambin puede usarse para el control de perifricos
que requieran un protocolo de enlace sin uso de interrupciones. El ejemplo siguiente
ilustra el uso del PPI para la interconexin de un sistema 8085A a una impresora para-
lela.

Ejemplo 9.5

Realizar la interconexin de una impresora CENTRONICS a un P8085A
usando un 8255A funcionando en el modo cero. Escribir una rutina para enviar al
perifrico el carcter cuyo cdigo ASCII se encuentra en el registro B.

CENTRONICS es un estndar usado por muchos aos para enviar datos desde
un C hacia una impresora paralela. Su uso es tan extendido que la mayora de las
impresoras hasta hace dos aos usaban este protocolo. Las impresoras modernas ofre-
cen adems un puerto USB. EL puerto paralelo puede realizarse con un 8255A bajo el
control del programa de transferencia. La figura 9.18 muestra un diagrama de tiempos
de una transferencia CENTRONICS y en la figura 9.19 se indican las funciones de las
lneas del bus y su ubicacin en el conector CANON DB-25.




Fig. 9.18. Transferencia de un carcter a una impresora usando el protocolo de enlace CENTRONICS.
Dispositivos de E/S Programables

526


Terminal Seal E/S
1
Funcin

1

STB : DATASTROBE

S
Salida normalmente en nivel alto. Es
puesta a cero por el C durante 1 s para
notificar que se envi un dato.

2-9

DATA 0 DATA 7

S
Salidas de los ocho bits de datos. Deben
ser estables al menos 0.5 s antes y des-
pus del pulso STB .

10

ACK: E ACKNOWLEDG

E
Seal activa en bajo generada por la im-
presora cuando est lista para recibir un
nuevo carcter. Es generada cuando la
lnea BUSY va a nivel bajo.

11

BUSY

E
Entrada OCUPADA que indica la disponi-
bilidad de la impresora. Est en nivel alto
cuando sta no puede recibir datos.

12

PO: PAPER OUT

E
Entrada que cuando est en nivel alto
notifica que no hay papel en la bandeja de
la impresora.

13

SLCT: SELECT

E
Indica el estado de la impresora. Cuando
est en lnea, la seal conmuta a uno
lgico.

ON LINE:
Al energizar la impresora.
Cuando se aplica un RESET .
Al presionar el interruptor ON LINE.

OFF LINE:
Impresora sin papel.
Cubierta exterior abierta
La impresora es colocada en OFF LINE.

14

AFD : T AUTOFEED X

S
Salida que indica con un nivel bajo si a
cada comando de retorno de carro (CR) le
seguir uno de alimentacin de lnea (LF).

15

ERROR

E
Activa en bajo por la ocurrencia de un
error. Condiciones de error son:
Ausencia de papel en la bandeja.
Impresora en OFF LINE.
Estado de sobrecarga.
Cubierta exterior abierta
16
RESET
S En cero inicializa la impresora. Detiene el
equipo y borra el buffer de datos.

17

SL
S Cuando es cero se selecciona la impresora.
Si est en nivel alto la transferencia de
datos no es aceptada.
18-25 TIERRA

Fig. 9.19. Conector CANON DB25 hembra y descripcin de las seales del estndar CENTRONICS.

1
Entrada/Salida con respecto al microcomputador
Dispositivos de E/S Programables

527










Nota:
La tarjeta de impresora debe tener resistores conectados a +5V en todas las entradas.


Fig. 9.20 Puerto de impresora
Dispositivos de E/S Programables

528
El protocolo CENTRONICS trasmite en paralelo los datos a imprimir y ade-
ms presenta varias seales para que el P controle la transferencia, y un grupo de
lneas de salida desde la impresora indican en cualquier momento el estado del perif-
rico.

Como ilustra el diagrama de tiempos de la figura 9.18, el cdigo ASCII del ca-
rcter a imprimir es presentado por el P en las lneas de datos DATA
0-7
y entonces se
examina la entrada BUSY para verificar, si est en cero lgico, que la impresora est
disponible. En este caso, el procesador coloca en nivel bajo la salida STB durante al
menos 1 s, para sincronizar la transferencia del dato. La impresora lee el dato durante
el flanco positivo de STB . Si la lnea BUSY est en alto, porque la impresora est
ocupada, el P permanecer en espera hasta cuando BUSY retorne a cero. Cuando la
impresora ha aceptado un carcter, activa a cero durante 5 s la seal de reconocimien-
to ACK .

Debido a que ACK es disparada en el flanco posterior de BUSY, puede ser
tratada como una notificacin de lista para recibir un nuevo dato, al igual que BUSY.
Esto significa que durante la transferencia de datos a la impresora, ACK puede ser
ignorada y el programa slo tiene que examinar si la impresora est libre, colocar el
dato y generar la seal STB .

El puerto de conexin a la impresora se muestra en la figura 9.20 Los bits del
carcter a imprimir se entregan por el PA del 8255A, el cual debe ser configurado para
operacin en el modo 0. La salida BUSY de la impresora se aplica a la lnea PC0 del
puerto de entrada C, y por el terminal PC4 se genera la seal de sincronizacin STB .
Se utilizan buffers de colector abierto en todas las salidas del 8255A. Los resistores de
colector se encuentran en el circuito de entrada a la impresora.


;----------------------------------------------------------------------------------------------------------------
; Rutina SAL_IMPR de salida a impresora

; Imprime bloque a partir de direccin 2000h
; Carcter de escape
; NULL 0
;----------------------------------------------------------------------------------------------------------------
inic_blq equ 2000h ; Direccin de primer caracter a imprimir
pa_8255 equ 80h ; Puerto A
pc_8255 equ 82h ; Puerto C
pctrl_8255 equ 83h ; Registro de control
plbr_ctrl equ 83h ; Palabra de control. modo 0, PA:salida
; PCL:entrada, PCH:salida
stb_cero equ 8 ; Activar STB
stb_uno equ 9 ; Desactivar STB
escap equ 0 ; Caracter de escape.
;----------------------------------------------------------------------------------------------------------------
Dispositivos de E/S Programables

529
mvi a,plbr_ctrl
out pctrl_8255 ; Se programa 8255A
mvi a,stb_uno
out pctrl_8255 ; STB se pone a uno
lxi h, inic_blq ; Apuntar primer caracter a imprimir
prox: mov b,m ; Caracter de memoria a registro B
mov a,b ; Examinar caracter
cpi escap ; Es el byte de escape?
jz cont ; Si, continuar programa principal
call sal_impr ; No, Imprimir byte en registro B
inr l ; Apuntar siguiente caracter
jmp prox ; Continuar impresin
cont: ;.
;.
;.
sal_impr: in pc_8255 ; Leer estado de BUSY
ani 1 ; Poner mscara
jnz sal_impr ; Si BUSY es alto, esperar
mov a,b ; BUSY es cero
out pa_8255 ; Enviar caracter a impresora
mvi a,stb_cero
out pctrl_8255 ; Poner seal STB en cero
mvi a,stb_uno
out pctrl_8255 ; Desactivar lnea STB
ret
;----------------------------------------------------------------------------------------------------------------

El cdigo anterior imprime un bloque de memoria de una pgina mximo y
contina ejecutando el cdigo de usuario. El carcter NULL seala el final del bloque a
imprimir. La rutina de salida a impresora examina el estado de la lnea BUSY. Si est
en nivel alto, se mantiene la prueba hasta cuando BUSY retorne a cero. En este mo-
mento, conmuta a cero lgico la lnea STB , la cual se mantiene en bajo por un tiempo
superior a 1 s, instante cuando se retorna al programa principal.

Con el ejercicio 9.5 finalizan los ejemplos de operacin del 8255A en modo
cero. Lo presentado es una muestra pequea que en modo alguno agota las posibilida-
des del uso prctico del modo cero en combinacin con el programa para control de
perifricos. Este modo puede usarse para el control de motores por paso o servomoto-
res o para el control de de la potencia suministrada a cargas de corriente alterna.


Operacin en el modo 1

El ltimo ejemplo del modo 0, fue una muestra de una operacin de entrada y
salida con un perifrico que requiere un protocolo de enlace para realizar las transfe-
rencias. El modo 1 de operacin est especialmente diseado para la realizacin de
transmisiones y recepciones de informacin, usando seales de dialogo generadas por
el microprocesador y por el equipo de E/S. En este caso, la transferencia desde/hacia
Dispositivos de E/S Programables

530
los puertos A y B es controlado por un protocolo de enlace, realizado usando los termi-
nales del puerto C.

Como se expuso en pginas anteriores ambos grupos A y B pueden progra-
marse para funcionamiento en este modo, como se indica a continuacin:

Grupos A y B.

Cada grupo con un puerto de 8 bits de datos y puerto de 4 bits de control/datos.

Los puertos de 8 bits (PA y PB) pueden ser entradas o salidas, ambas con retencin.

El puerto de 4 bits (PCH y PCL) se usa para control/estado del puerto de datos de 8 bits.

Modo 1: Entrada

La figura 9.21muestra los formatos de la palabra de entrada para la configura-
cin de los grupos A y B para operacin en el modo 1. Observe que tanto el puerto A
como el B se programan como entradas, si ambos grupos operan en modo 1. Tres bits
de PC
H
o de PC
L
se usan para controlar la transferencia de datos desde el perifrico
hacia el sistema a travs de los puertos PA y PB, respectivamente. Las dos lneas res-
tantes, PC
6-7
, del puerto C quedan disponibles para ser usadas como lneas de E/S.




Fig. 9.21 Formatos de palabra de control para operacin en el modo 1 de entrada.
Dispositivos de E/S Programables

531
Aunque en este caso se considera que ambos grupos se configuran en el modo
1 de entrada, en la prctica pueden programarse una combinacin de modo 1, en cuyo
caso uno de los grupos se programa como entrada y el otro como salida. La funcin
de las seales de control y el diagrama de tiempo de una transferencia de entrada en
el modo 1 se muestra en la figura 9.22.


Strobe Input

Cuando se activa esta entrada el dato entregado por el perifrico es cargado en el
registro latch del puerto de entrada.


Input Buffer Full
Salida que notifica la presencia de un dato en el registro de entrada. Es una seal
de reconocimiento activada como respuesta a la entrada STB y es llevada a cero
cuando el P lee el puerto.


INTR Interrupt Request
Salida puesta a 1 cuando STB retorna a nivel alto, IBFes uno y el bit INTE est
en 1. Regresa a 0 cuando el puerto es ledo por el P. Este modo de operacin
permite que con solo cargar un dato en el puerto, un perifrico interrumpa al
CPU.

Las interrupciones deben estar habilitadas por:
INTE A: bit set/reset de PC4
INTE B: bit set/reset de PC2
PC
7
y PC
6
Lneas disponibles para E/S.



Fig. 9.22. Entrada en modo 1.

El modo 1 de operacin permite que el dato desde el perifrico se almacene en
el puerto A o en el puerto B hasta cuando el P pueda leerlo. Al inicio de la transfe-
rencia, el perifrico coloca el dato en los terminales del puerto de entrada y pone en
nivel bajo al lnea STB para cargar el byte en el registro de entrada. A continuacin,
una seal de reconocimiento IBF se pone en alto para indicar la presencia de un dato
en el latch de entrada. Al retornar STB a uno lgico, se dispara la seal INTR de so-
licitud de interrupcin, si las interrupciones estn habilitadas.

El P puede detectar cuando el perifrico transmite un dato, mediante un pro-
grama que examine el estado de IBF o al ser interrumpido por INTR. El flanco de
IBF
STB
Dispositivos de E/S Programables

532
subida de RDdesactiva la seal IBF, mientras que el flanco de cada de RD remue-
ve la solicitud de interrupcin. Observe que en el modo de interrupcin, la solicitud
es realizada con slo cargar el dato en el registro de entrada.

Ejemplo 9.6

Escriba una rutina para leer un dato desde un dispositivo de entrada. Cada vez
que el perifrico coloca un byte en las lneas del puerto de entrada, genera un pulso
negativo.

Esta situacin es apropiada para el uso del modo 1. Como ilustra el diagrama
simplificado de la figura 9.23, las salidas de datos se aplican al PB configurado como
entrada y la seal de sincronizacin LISTO DATO se conecta al terminal PC
2
o
B
STB .

Fig. 9.23 Entrada en modo 1.

Si el perifrico es un teclado, este entregar al puerto B el cdigo ASCII y una
seal de habilitacin a PC2 cada vez que una tecla es presionada. Los circuitos elec-
trnicos asociados al teclado, detectan la prsin de la tecla, la identifican, le asignan
el cdigo correspondiente, suprimen el efecto de los rebotes de contactos y protegen
contra la pulsacin simultnea de varios pulsadores. El siguiente programa carga el
dato D
0
-D
7
en el registro acumulador, cada vez que una tecla es activada.

;--------------------------------------------- ------------------------------------------------------------------
; Rutina de lectura de teclado
;--------------------------------------------- ------------------------------------------------------------------
pb_8255 equ 81h ; Puerto B
pc_8255 equ 82h ; Puerto C
pctrl_8255 equ 83h ; Registro de control
plbr_ctrl equ 10000110b ; Palabra de control. Modo 1, PB:entrada
;--------------------------------------------- ------------------------------------------------------------------
teclado: mvi a,86H ;Puerto B, Modo 1:Entrada
out pctrl_8255
exam_IBF: in pc_8255 ;Leer puerto C
ani 2 ;Examinar IBF
jz exam_IBF ;Si IBF=0, registro vaco
in pb_8255 ;Si IBF=1, leer el latch de PB
ret
;--------------------------------------------- ------------------------------------------------------------------
Dispositivos de E/S Programables

533
Modo 1: Salida


El puerto A o el B se configuran como salidas y tres seales del puerto PC
H
o
PC
L
, respectivamente, controlan la salida de datos hacia el perifrico. Al igual que el
el modo 1 de entrada, pueden usarse interrupciones durante la transferencia.

En la figura 9.24 se muestran las seales de control del puerto C para cada
grupo y el formato de la palabra de control para los grupos A y B.



Fig. 9.24. Formatos de palabra de control para operacin en el modo 1 de salida.

Las funciones de las seales de control y el diagrama de tiempo de la transfe-
rencia de datos en el modo 1 de salida, se muestran en la figura 9.25.

Observe que cada vez que el Procesador escribe un dato en el puerto A o en
el puerto B, la salida OBF respectiva, conmuta a nivel bajo para indicar existe un
dato disponible en el registro de salida. Esto ocurre durante el flanco de subida de
WR .

Cuando el perifrico acepta el dato, coloca en estado cero la seal de recono-
cimiento ACK , la cual desactiva la lnea OBF notificando que el dato fue recibido y
que el registro est vaco. La seal INTR puede usarse para interrumpir al P cuando
el perifrico ha ledo el dato enviado por la CPU. El terminal INTR es puesto a 1
Dispositivos de E/S Programables

534
cuando la salida de reconocimiento ACK , la lnea de indicacin de latch lleno OBF y
el bit INTE, son todas uno. Es llevada a cero, por el flanco de cada de WR .



OBF
Output Buffer Full
Salida en nivel bajo cuando el P escribe un dato en el puerto A o B. Es activada
por el flanco posterior de WR y desactivada por el flanco de bajada de la seal de
reconocimiento ACK generada por el perifrico.

ACK
Acknowledge Input

El dispositivo externo pone a nivel bajo est entrada para indicar al P que el dato
en el puerto A o B ha sido recibido.


INTR Interrupt Request
Salida activa cuando ACKconmuta a nivel alto, OBF es uno y el bit INTE est
en 1. Regresa a 0 cuando el el P escribe un dato en el puerto. Este modo de opera-
cin permite interrumpir al CPU cuando un perifrico acepta un dato transferido
por el P. Las interrupciones deben estar habilitadas por:
INTE A: bit set/reset de PC4
INTE B: bit set/reset de PC2
PC
4
y PC
5
Lneas disponibles para E/S.




Fig. 9.25. Formatos de palabra de control y diagrama de tiempos de salida en modo 1


Ejemplo 9.7

Usar el modo 1 de salida, para enviar un bloque de datos a una impresora pa-
ralela. Escribir la rutina de salida de datos a la impresora.

Como puede verse en la figura 9.26, para la interconexin a la impresora se
usa el grupo A, programado en el modo 1. La impresora recibe el cdigo ASCII del
carcter a imprimir por las 8 lneas del puerto A. Para la lnea de sincronizacin de
transmisin de datos STB del puerto CENTRONICS, se usa el bit PC5. Aunque la
seal OBF indica que existe un dato vlido en el registro de salida, sta no puede ser
Dispositivos de E/S Programables

535
usada comoSTB
,
porque se requiere un pulso para indicar a la impresora que hay un
dato listo. Por tal razn se usa PC5.

Una vez que la impresora acepta el dato genera la seal de reconocimiento
ACK para indicar que est lista para recibir otro dato. Esta salida se conecta a la en-
trada A
ACK o PC6 del 8255A y cuando se activa retorna a nivel alto a OBF .



Fig. 9.26. Salida a impresora en modo 1

El programa examinar OBF para detectar si la impresora est disponible.
Esto ocurre cuando la impresora acepta el dato y borra el registro de salida. Con la
impresora libre el P carga el dato en el registro de salida PA y genera por PC5 el
comando STB . El cdigo de la rutina se muestra a continuacin.

;----------------------------------------------------------------------------------------------------------------
; Rutina SAL_IMPR de salida a impresora

; Imprime bloque a partir de direccin 2000h
; Carcter de escape
; NULL 0
;----------------------------------------------------------------------------------------------------------------
inic_blq equ 2000h ; Direccin de primer caracter a imprimir
pa_8255 equ 80h ; Puerto A
pc_8255 equ 82h ; Puerto C
pctrl_8255 equ 83h ; Registro de control
plbr_ctrl equ 0A0h ; Palabra de control. modo 1, PA:salida
; PCH:salida
stb_cero equ 10 ; Activar STB
stb_uno equ 11 ; Desactivar STB
escap equ 0 ; Caracter de escape.
;----------------------------------------------------------------------------------------------------------------
mvi a,plbr_ctrl
out pctrl_8255 ; Se programa 8255A
mvi a,stb_uno
out pctrl_8255 ; STB se pone a uno
lxi h, inic_blq ; Apuntar primer caracter a imprimir
Dispositivos de E/S Programables

536
prox: mov b,m ; Caracter de memoria a registro B
mov a,b ; Examinar caracter
cpi escap ; Es el byte de escape?
jz cont ; Si, continuar programa principal
call sal_impr ; No, Imprimir byte en registro B
inr l ; Apuntar siguiente caracter
jmp prox ; Continuar impresin
cont: ;.
;.
;.
sal_impr: in pc_8255 ; Leer estado de OBF
ani 80h ; Poner mscara
jnz sal_impr ; Si OBF es bajo, esperar
mov a,b ; OBF es cero
out pa_8255 ; Enviar caracter a impresora
mvi a,stb_cero
out pctrl_8255 ; Poner seal STB en cero
mvi a,stb_uno
out pctrl_8255 ; Desactivar lnea STB
ret
;----------------------------------------------------------------------------------------------------------------



Operacin en el modo 2

Es el modo de transferencia bidireccional sobre los terminales del puerto A.
Ejemplos del uso de este modo de operacin es la interconexin con un controlador
de discos flexibles, transferencias paralelas con el estndar para instrumentacin de
propsito general GPIB (IEEE-448) y para la comunicacin entre computadores. En
la figura 9.27 se muestran las seales asociadas al modo 2 y la palabra de control para
operacin en ambas direcciones.


Fig. 9.27. Palabra de control y seales asociadas con el modo 2 de operacin.

Dispositivos de E/S Programables

537


OBF
Output Buffer Full
Salida en nivel bajo cuando el P escribe un dato en el puerto A
indicando que el latch de salida est lleno.

ACK
Acknowledge Input

Entrada que en cero lgico habilita los buffer de tres estados de
salida del puerto A. Si ACKest en alto, las salidas de PA perma-
necen en alta impedancia.


Strobe Input

Cuando se activa esta entrada el dato entregado por el perifrico es
cargado en el registro latch del puerto A-
IBF
Input Buffer Full
Un alto en esta salida indica que un dato ha sido cargado en el
registro de entrada.


INTR Interrupt Request
Salida activa que en nivel alto puede usarse para interrumpir al P
durante transferencias tanto de entrada como de salida.
INTE 1: Bit set/reset PC6
INTE 2: Bit set/reset PC4

PC
2,
PC
1
y PC
0
Lneas disponibles para E/S controladas por bit set/reset.




Fig. 9.28. Formatos de palabra de control y diagrama de tiempos para el modo 2

Debido a que la conexin de una unida de disquetes al sistema y la comunica-
cin interprocesador son aplicaciones fuera del alcance de este trabajo, el siguiente
ejemplo se limita a la presentacin de rutinas de transmisin y recepcin en el modo
de operacin 2.

STB
Dispositivos de E/S Programables

538
Ejemplo 9.8

1. Escribir un programa que transmita por las lneas bidireccionales del puerto
A el dato cargado en el registro acumulador.

2. Una rutina debe recibir por las lneas bidireccionales del puerto A el dato
enviado por un dispositivo externo.

Sin mayores comentarios se presenta el cdigo de transferencia en el modo 2
de operacin.

;-----------------------------------------------------------------------------------------------------------
; Ejemplo en modo 2
;-----------------------------------------------------------------------------------------------------------
pa_8255 equ 80h ; Puerto A
pc_8255 equ 82h ; Puerto C
pctrl_8255 equ 83h ; Registro de control
;-----------------------------------------------------------------------------------------------------------
; Programa principal

mvi a,plbr_ctrl
out pctrl_8255 ; Se programa 8255A
; .
; .
; .
;-----------------------------------------------------------------------------------------------------------
; Rutina TRASM. Transmite el dato en el registro B por las lneas del puerto A
;-----------------------------------------------------------------------------------------------------------
trasm: in pc_8255 ; Leer puert C
ani 80h ; Examinar OBF
jz trasm ; Si OBF es 0, registro de salida lleno
mov a,b ; Si OBF es 1. Prximo dato al acumulador
out pa_8255 ; Transmitir byte
ret
;-----------------------------------------------------------------------------------------------------------

; Rutina RECIB. Recibe el dato por las lneas del puerto A y lo retorna en el acumulador
;-----------------------------------------------------------------------------------------------------------
recib: in pc_8255 ; Leer puerto C
ani 20h ; Examinar IBF
jnz recib ; Si IBF es 0, registro de entrada vaco
in pa_8255 ; Si IBF es 1, leer dato
ret
;----------------------------------------------------------------------------------------------------


El lector debe haber notado que para detectar el estado de las seales de con-
trol, en los modos de operacin 1 y 2, basta con realizar una lectura convencional del
puerto C. La figura 9.29 muestra los formatos de la palabra de estado para los modos
1 y 2.

Dispositivos de E/S Programables

539


Fig. 9.29. Formatos de las palabras de estado para los modos 1 y 2.


9.2 DISPOSITIVO 8155: SRAM/PUERTOS DE E/S/TIMER


Es conocido por el lector, que el circuito integrado 8155/56 es un dispositivo
de funciones mltiples, diseado para compatibilidad pin a pin con el P 8085A. Es
fabricado por varias empresas, en incluso la compaa INTERSIL ofrece una versin
(HS-81C55RH) con alta resistente a la radiacin csmica, destinada al diseo de ins-
trumentos y controles que viajan al espacio.





Fig.9.30. El dispositivo multifuncin 8155.
Dispositivos de E/S Programables

540
Los recursos ofrecidos por el 8155/56 son:




Fig.9.31. Secciones del 8155/56


DEFINICIN FUNCIONAL DE LOS TERMINALES DEL 8155

V
CC

GND
+ 5 V

Tierra
CS
Un nivel bajo en este terminal permite la comunicacin entre el P y el 8155. Para el 8156 esta entrada
es activa en alto.
WR Esta entrada en cero con CS activado causa que el byte en el bus multiplexado sea escrito en la RAM
o en los puertos de E/S y registro comando/estado, dependiendo de la entrada M / IO .
RD Esta entrada en cero con CS activado habilita los buffers de salida AD0-AD7. Si el terminal
M / IO est en nivel bajo el contenido de la posicin de RWM seleccionada ser cargado en el bus de
datos/direcciones. En caso contrario el contenido de un puerto de E/S o del registro de estado ser
colocado en el bus multiplexado.
M IO/
Selecciona la RWM si es cero y los puertos de E/S y el registro comando/estado si est en alto.
AD
0
-AD
7
Es el bus de datos/direcciones bidireccional y tres estados por medio del cual se transfieren comandos
y/o datos entre el 8155 y el P. Los ocho bits bajos de las direcciones se cargan en el latch interno
durante el flanco de bajada de la seal ALE.

RESET
Un nivel alto en esta entrada durante al menos dos pulsos de reloj inicia el registro de control con todos
los puertos en el modo de entrada.
ALE

En el flaco de cada de esta entrada se carga dentro del chip el estado de las lneas de direccin AD0-
AD/, CS e M / IO .
PA
0
-PA
7
Puerto A: Ocho lneas de E/S de propsito general. La direccin es programada escribiendo en el
registro de comando.
PB
0
-PB
7
Puerto B: Ocho lneas de E/S de propsito general. La direccin es programada escribiendo en el
registro de comando.
PC
0
-PC
7
Puerto A: seis lneas de E/S de propsito general o pueden usarse como lneas de control para transfe-
rencia del pA y B en los modos ALT3 y ALT4. Los modos de operacin se programan escribiendo en
el registro de comando.
TIMER IN Entrada al temporizador contador. Usualmente se conecta el reloj del P aunque puede conectarse
cualquier seal digital con frecuencia menor o igual a f
clk

OUT TIMER
Salida de onda cuadrada o pulso segn el modo seleccionado para el temporiza-
dor..

2Kbits de memoria RWM estti-
ca arregladas como 256x8 bytes.
2 puertos programables de 8 bits
para E/S.
1 puerto programable de 6 bits
para E/S.
1 temporizador/contador binario
programable de 14 bits.
Registro latch interno controlado
por ALE para decodificar el by-
te bajo de direcciones.
Registro de comando/estado
Dispositivos de E/S Programables

541
El acceso a la zona de memoria RWM, con M / IO en nivel bajo, o a los puer-
tos de E/S, cuando M / IO conmuta a nivel alto, se realiza a travs del bus multiplexa-
do AD
0
-AD
7
,

bajo el control de las seales: ALE, la cual indica si el bus contiene
datos o direcciones, y WR y RD que sealan cuando el acceso corresponde a una
operacin de escritura o de lectura.
Como ilustra la figura 9.32, el dispositivo 8155 contiene una memoria RAM
esttica de 256 bytes y siete registros internos. Estos son: dos puertos de E/S: PA y
PB de 8 bits, un puerto PC de 6 bits, los registros de comando/estado (C/S) para la
programacin y examen del estado del dispositivo, y un contador/temporizador de 14
bits. El circuito integrado no requiere lgica externa para conectarse al P 8085, el
estado lgico de la seal M / IO distingue cuando la direccin presente en las lneas
AD
0
-AD
7
corresponde una posicin de la memoria SRAM o hace referencia a uno de
los registros internos del circuito.

La entrada ALE se aplica a un registro latch interno para demultiplexar el byte
de orden bajo A
0
-A
7
del bus de direcciones, una direccin vlida se presenta en las
lneas de direcciones en el flanco anterior de ALE, mientras que esta informacin, y
los estados de M / IO y CS se aplican a la lgica interna del chip durante el flanco
posterior de ALE.

9.2.1 Seccin de entrada y salida del 8155

Las direcciones asignadas a los registros internos del 8155 se muestran en la
tabla 9.3 y en el captulo 5 se expone todo lo relacionado con el diseo del decodifi-
cador de direcciones para el 8155/56.

Tabla. 9.3 Direcciones de los registros internos del 8155











El 8155/56 tiene tres puertos programables de E/S. Los puertos A y B son de 8
bits y pueden ser usados para transferencias de E/S controladas por programa segn el
modo programado en el circuito. Los 6 bits del puerto C pueden a su vez funcionar
como entradas o salidas de propsito general o como lneas de control y estado para
transferencias sobre el puerto A y B, de acuerdo con la configuracin del 8155.
Direccin del Puerto de E/S
AD
7
AD
6
AD
5
AD
4
AD
3
AD
2
AD
1
AD
0
x x x x x 0 0 0 Registro de Comando/Estado
x x x x x 0 0 1 Puerto A de E/S
x x x x x 0 1 0 Puerto B de E/S
x x x x x 0 1 1 Puerto C de E/S
x x x x x 1 0 0 8 bits de orden bajo del temporizador/contador
x x x x x 1 0 1 6 bits de orden alto del temporizdor/contador
y 2 bits del modo temporizador.
Registro seleccionado
Dispositivos de E/S Programables

542
Registro de comando

Los registros de comando y de estado tienen la misma direccin, pero son uni-
dades independientes. La informacin transferida al registro de comando durante una
operacin de escritura en puerto, permite programar las funciones de los puertos de
E/S, de acuerdo con el formato de palabra mostrado en la figura 9.32 Los bits 0 a 3
definen el modo de los puertos, los bits 4 y 5 habilitan o no las interrupciones desde
el puerto C cuando ste es usado como puerto de control y los dos bits ms a la dere-
cha son destinados para el control del temporizador.



Fig. 9.32 Formato de la palabra de control del 8155.


El puerto A puede ser usado como entrada o salida segn establezca el bit 0 de
registro C/S, y de acuerdo con las funcin seleccionada para el puerto C, puede fun-
cionar en el modo bsico de E/S o en el modo con protocolo de enlace. El puerto B
tiene las mismas caractersticas mencionadas para el puerto A. Su direccin la esta-
Dispositivos de E/S Programables

543
blece el estado del bit 1 del registro de C/S. Las seis lineas del puerto C pueden con-
figurarse como entradas o salidas convencionales (ALT1 Y ALT2) o como seales de
control de los puertos PA y PB (ALT3 y ALT4) de acuerdo con el estado de los bits 2
y 3 del registro de comando.

Los modos de funcionamiento del puerto C o ALTn (alternatives) se presentan
a continuacin.

Tabla. 9.4 Modos del puerto C
TERMINAL ALT1 ALT2 ALT3 ALT4
PC0 ENTRADA SALIDA INTR
A
INTR
A

PC1 ENTRADA SALIDA BF
A
BF
A

PC2 ENTRADA SALIDA
A
STB
A
STB
PC3 ENTRADA SALIDA SALIDA INTR
B

PC4 ENTRADA SALIDA SALIDA BF
B

PC5 ENTRADA SALIDA SALIDA
B
STB


INTR: Salida de SOLICITUD DE INTERRUPCIN del puerto A o B. Un alto en esta lnea
indica que el perifrico ha enviado un dato pero este an no ha sido ledo por el P o
que el dato escrito en el puerto por la CPU ha sido aceptado por el perifrico.

BF: Salida BUFFER LLENO que en nivel alto notifica que un dato ha sido cargado en
por el P/perifrico en el latch del puerto pero aun no ha sido transferido al perifri-
co/Procesador.

STB : Entrada STROBE que se activa en nivel bajo para indicar la disponibilidad de un
dato de entrada o la aceptacin de un dato de salida.

Los modos que usan el puerto C para controlar la transferencia a los puertos A
y B son ALT3 (solo puerto A) y ALT4 (puertos A y B). Cuando se usan estos modos
tres bits del puerto C se asignan a control del puerto A y los tres restantes al puerto B.
En el modo ALT3 donde solo se controla el puerto A, los bits PC
3-5
funcionan como
salidas. En las figuras 9.36 se muestran los diagramas de tiempos para transferencias
de E/S bajo control del puerto C.

Como se observa en los diagramas de tiempos de la figura 9.33, el funciona-
miento en los modos ALT3 y ALT4 es similar al modo 1 del 8255A. La nica diferen-
cia es en la nomenclatura de las seales. Por ejemplo, la seal de buffer lleno se de-
nomina BF tanto para entrada como para salida (OBF e IBF en el 8255A) y la seal
de reconocimiento en modo salida, llamada ACK en el 8255, se nombra STB para el
8155.

Dada la similitud en los modos de operacin de ambos dispositivos, se consi-
dera que los ejemplos presentados para el 8255, operando en los modos 0 y 1, pueden
adaptarse con facilidad al 8155.
Dispositivos de E/S Programables

544



Fig. 9.33 Formas de ondas para transferencias de entrada y salida bajo el control del puerto C.


Registro de estado

Una operacin de lectura al registro de estado de siete bits, entrega informa-
cin de estados de los puertos de E/S y el temporizador. El programa puede examinar
esta informacin en cualquier momento. El P no puede escribirse sobre este registro,
porque al compartir la misma direccin con el registro comando, la escritura sera a
este ltimo. El formato de la palabra de estado se muestra en la figura 9.34.

Una lectura del registro de estado puede indicar si en el latch de entrada o sa-
lida existe un dato aun no transferido al receptor, el estado de las lneas de interrup-
ciones y si stas estn habilitadas. Pudindose adems detectar cuando el temporiza-
Dispositivos de E/S Programables

545
dor contador llega a la cuenta final despus de haber sido iniciado. Esto ltimo se
logra detectando el estado del bit 6 del registro de estado.



Fig. 9.34. Formato de la palabra de estado del 8155.

Ejemplo 9.9

Se debe controlar la presentacin de informacin alfanumrica en una pantalla
de cristal lquido.




Fig. 9.35. Pantalla de cristal lquido conectada a un 8155.
Dispositivos de E/S Programables

546
1. Realizar la interconexin a un sistema 8085A, de un mdulo de cristal l-
quido de 16x2 caracteres (controlador HD44780U), basndose en el dia-
grama simplificado de la figura 9.35.

2. Escribir el programa de control de presentacin, e imprima la temperatura
en dos puntos de un proceso. Los valores de temperatura son de dos dgitos
y est almacenados a partir de la direccin de memoria MEM. El dgito
ms significativo en la posicin ms baja. El formato de presentacin es el
de la figura 9.36.



Fig. 9.36. Valores de temperatura y estado del proceso.

Solucin:

La pantalla LCD de la figura 9.36 es de 16x2 caracteres, lo cual significa que
puede presentar 2 lneas de 16 caracteres cada una. El carcter se construye en una
matriz de 5x7 puntos Existe un gran nmero de mdulos LCD producidos por dife-
rentes fabricantes y existe un estndar que facilita la interconexin entre el dispositi-
vo y un P o Ctrl, independientemente del modelo. Tal estndar se conoce como
HD44780U.

Este es un sistema microcontrolador y manejador de pantallas LCD, para pre-
sentacin de caracteres alfanumricos y smbolos. Esta unidad provee todas las fun-
ciones como memoria de presentacin, generador de caracteres y los manejadores de
cristal lquido necesarios para el control de una matriz de puntos, por lo cual se sim-
plifica la interconexin del LCD con el sistema procesador.

Como ilustra la figura 9.35, para comunicarse con el mdulo LCD se requie-
ren tres lneas de control: E, RS, W / R y ocho lneas para datos y comandos. El cdi-
go de la aplicacin puede programar al dispositivo para operacin con datos de 4 bits,
en cuyo caso slo sern necesarias siete lneas de interconexin. Las funciones y dis-
tribucin de los terminales del dispositivo LM032L se muestran en la figura 9.37.

El HD44780U tiene dos registros de 8 bits:

Registro de Datos (DR)

Contiene temporalmente los datos a ser ledos o escritos en la memoria RAM
de datos a presentar (DDRAM: Display Data RAM) y en la memoria RAM del


Dispositivos de E/S Programables

547



VDD: Alimentacin de 2.7 V a 5.5 V.
VSS: Tierra.
VEE: Regulacin de contraste de la pantalla (0-5 V)
RS: Selects registers.
Cuando es 0 se escriben comandos en el registro de instruccin (IR) o se leen desde IR el esta-
do de la bandera de ocupado y del contador de direcciones.
Cuando es 1 se escribe o lee desde el registro de datos (DR)
W R/ : Read/Write
Seleccin de operaciones de lectura y escritura.
0: Escritura.
1: Lectura.
E: Enable.
Inicia las operaciones de lectura y escritura.
D
4
-D
7
: Nibble mas significativo del bus de datos bidireccional. Comunica el P con el HD44780U. El
bit D
7
puede usarse como bandera de ocupado.
D
0
-D
3
: Nibble bajo del bus de datos bidireccional. Comunica el P con el HD44780U. Estas 4 lneas
no se usan durante el modo de operacin con transferencias de 4 bits.


Fig. 9.37. El dispositivo LM032L usa el estndar HD44780U.


generador de caracteres (CGRAM: Character Generador RAM). La CGRAM
contiene caracteres definidos por el usuario.

Cualquier informacin cargada en el DR por el P, es almacenada automti-
camente en la DDRAM o en la CGRAM. Cuando el P lee datos desde la
DDRAM o CGRAM, estos son transferidos al DR.

Registro de Instrucciones (IR)

Almacena los cdigos de las instrucciones, como por ejemplo: limpiar panta-
lla, ocultar cursor o desplazar cursor; y direcciones para la DDRAM o la
CGRAM. Cuando una direccin es escrita en el IR, un dato es ledo desde la
DDRAM o CGRAM y cargado en el DR para ser transferido al P. Una vez
que el P lee el dato, el contenido de la siguiente posicin de la memoria se
enva al DR para una prxima lectura por el sistema.

La lnea de control RS permite seleccionar uno de los registros como indica la
tabla 9.5.
Dispositivos de E/S Programables

548

Tabla. 9.5. Seleccin de registros.


Cuando el HD44780U est realizando una operacin interna, la bandera de
ocupado estar en alto y el controlador no aceptar transferencia alguna hasta cuando
BF retorne a nivel bajo. Como se expone en la tabla 9.5, el estado de BF y del conta-
dor de direcciones puede ser examinado por el programa.

El contador de direcciones (AC:Address Counter) es un apuntador de direc-
ciones para la DDRAM y la CGRAM. Cuando el P escribe la direccin de una ins-
truccin en el IR, sta es cargada en el AC. La propia instruccin especifica si el des-
tino es la DDRAM o la CGRAM. El AC es incrementado/disminuido en 1, por cada
operacin de escritura/lectura.

El diagrama de tiempos de una operacin de escritura al mdulo LCD se pre-
senta en la figura 9.39. Una escritura en el mdulo, puede tener dos propsitos: uno,
la presentacin de un caracter ASCII en la pantalla (Operacin de escritura al DR con
RS =1); el otro, la ejecucin de una instruccin (Borrar pantalla, por ejemplo. Opera-
cin de escritura en el IR con RS =0). El procedimiento implica: poner RS en el esta-
do correspondiente, llevar la lnea W / R a cero, poner la entrada E en alto, cargar el
dato en el bus D
0
-D
7
y retornar E a cero lgico. En la prctica est secuencia no es
crtica. Por ejemplo, se puede activar E, fijar el estado de RS y W / R , colocar el da-
to, y al final retornar a cero la lnea E. Es en realidad el flanco de cada de la seal E,
el evento que ejecuta las operaciones internas.

La memoria de datos a presentar o DDRAM contiene los cdigos de 8 bits de
los caracteres en pantalla. Su mxima capacidad son 80 caracteres. Todo texto escrito
en el HD44780U se almacena en esta memoria y el Ctrl a continuacin leer la
DDRAM y presentar el mensaje en el LCD. Para el dispositivo de 16x2 caracteres, la
DDRAM puede representarse con el siguiente mapa de memoria.



Fig. 9.38. Memoria DDRAM

RS W R/
OPERACIN
0 0 Escritura de instruccin o direccin en el IR
0 1
Lectura de la bandera de ocupado BF (D
7
) y del conta-
dor de direcciones (D
0
-D
6
).
1 0
Escritura en el DR (Dato desde el DR a la DDRAM o
CGRAM)
1 1
Lectura del DR (Dato desde DDRAM o CGRAM hacia
el DR)
Dispositivos de E/S Programables

549


Fig. 9.39. Ciclo de escritura en el HD44780U.


El rea ms oscura en la figura 9.38 corresponde a los caracteres visibles o
16x2 caracteres, y el nmero indica la direccin de la memoria que corresponde a
cada posicin en la pantalla. El primer caracter pertenece a la posicin 0, el segundo a
la 1 y as sucesivamente.

Si escribimos un carcter el la direccin 0FH, ste aparecer en la ultima posi-
cin de la lnea 1, el siguiente carcter enviado no aparecer al comienzo de la segun-
da lnea (direccin 40H) debido a que fue escrito en la direccin 10H. En este caso
antes de enviar el caracter debe ejecutarse un comando que desplace el cursor hacia la
primera posicin de la lnea 2. El rea que no se usa para presentar caracteres puede
usarse como RAM de propsito general. Los caracteres imprimibles se muestran en la
tabla de la figura 9.40.

Las instrucciones disponibles, sus cdigos y el nmero de ciclos de reloj in-
vertidos en la ejecucin de cada una, se muestran en la tabla 9.6.




Dispositivos de E/S Programables

550





Fig. 9.40. Patrones en la ROM del generador de caracteres.





Dispositivos de E/S Programables

551
Tabla. 9.6. Conjunto de instrucciones del mdulo LCD.



I/D: 1 = Avance del cursor.
0 = Retroceso del cursor.

S: 1 = Desplaza el contenido de la pantalla con cada nueva escritura de dato.
0 = Presentacin normal.

D: 1 = Pantalla activada.
0 = apagada.

C: 1 = Cursor est activo.
0 = Cursor oculto.

B: 1 = Cursor parpadea si est activo.
0 = Cursor normal.

S/C: 1 = Desplaza el contenido de la pantalla.
0 = Mueve el cursor.

R/L: 1 = Desplazamiento hacia la derecha.
0 = izquierda.

BF: 1 = Mdulo LCD est ocupado.
0 = Dispositivo libre para aceptar comandos o datos.

DL: 1 = Bus de 8 bits.
0 = Bus de 4 bits.

N: 1 = Presenta 2 lneas de caracteres.

0 = Muestra 1 lnea de caracteres.

F: 1 = Caracteres de 5 x 10 puntos.
0 = 5 x 7 puntos.




Dispositivos de E/S Programables

552
Configurando el mdulo LCD

Antes de usar la pantalla de cristal lquido, el HD44780U debe ser configura-
do por medio de una secuencia de instrucciones enviada al controlador del mdulo.
En principio, se usa la instruccin Function Set para especificar que se usa un ancho
de 8 bits para el bus de datos, 2 lneas de caracteres y una matriz de 5x7 puntos. Esto
se corresponde con el byte 38H=00001110
2
, como se deduce de la tabla 9.6.

La instruccin siguiente de la secuencia de inicio corresponde al comando
0EH=00001110
2
de la instruccin Display Control, la cual activa la pantalla y mues-
tra el cursor. Finalmente, un comando 06H=00000110
2
de la instruccin Entry Mode
Set, establece, que cada vez que se presente un nuevo carcter, la posicin del cursor
se mueva hacia la derecha.

Para borrar la pantalla en cualquier momento, se ejecuta Clear Display, cuyo
cdigo es 01H=00000001
2
. Esta orden limpia la pantalla y coloca al cursor en la po-
sicin del primer carcter de la primera lnea. Si se escribe en la lnea 1 y se desea
que el carcter que sigue se presente en la posicin 5 de la segunda lnea se usa la
funcin Set DDRAM Addr o C5H=11000101
2
(Direccin DDRAM= 45H).

El manual de usuario del HD44780U especifica que un circuito interno de
RESET inicia dispositivo, al aplicrsele energa. En este caso, se ejecuta una sucesin
de instrucciones que lleva al mdulo LCD, por defecto, a un estado inicial. Tambin
se indica, que si no se satisfacen las condiciones de la fuente de alimentacin para la
operacin del circuito de RESET interno, el programa de la aplicacin deber ejecutar
las instrucciones de configuracin del LCD. La secuencia de inicio por instrucciones,
sugerida por el fabricante, para el modo de 8 bits, es la siguiente:

Esperar 15 ms despus que V
CC
alcance 4.7 V.
Ejecutar la instruccin Function Set (30H: bus 8 bits).
Esperar al menos 4.1 ms.
Ejecutar la instruccin Function Set (30H: bus 8 bits).
Esperar al menos 100 s.
Ejecutar la instruccin Function Set
(* )
(30H: bus 8 bits).
Esperar al menos 40 s.
Ejecutar la instruccin Function Set (38H: bus 8 bits, 2 lneas matriz 5x7).
Esperar al menos 40 s.
Ejecutar la instruccin Display Control (08H: pantalla y cursor desactivados).
Esperar al menos 40 s.
Ejecutar la instruccin Clear Display (01H: borrar pantalla).
Esperar al menos 1.64 ms.
Ejecutar la instruccin Display Control (0EH: Activar pantalla y mostrar cursor).
Esperar al menos 40 s.
Ejecutar la instruccin Entry Mode set (06H:Auto incremento. Avanzar el cursor).
Esperar al menos 40 s.

* Antes de esta instruccin los tiempos de espera deben cumplirse. No basta con examinar la bandera de
ocupado BF para detectar cuando el mdulo est disponible. Los tiempos de espera despus de esta
instruccin se corresponden con el tiempo de ejecucin de la misma, por lo cual es suficiente con veri-
ficar a BF.
Dispositivos de E/S Programables

553
El programa desarrollado para establecer la comunicacin entre el P y el
HD44780U y presentar el texto de la figura 9.36 consta nueve mdulos, los cuales se
describen a continuacin:

LCD

Programa principal.

INIC_LCD

Rutina de inicio. Configura el mdulo LCD y lo deja listo para ser usado.

SAL_CMD

Escribe en el registro de intrucciones IR, el comando cuyo cdigo est cargado en el registro
acumulador. Antes de ejecutar una instruccin determinada se detecta si el dispositivo est
libre.

SAL_DATO

Escribe en el registro de datos DR el cdigo ASCII del carcter a presentar, el cual debe
cargarse en el acumulador. Antes de ejecutar la transferencia se verifica que el LCD est
disponible.

LCD_OCUP

Verifica el estado de la bandera de ocupado. Si BF est en uno, espera hasta cuando retorne
a cero para continuar la ejecucin del programa.

PULSO_E

Genera un pulso de nivel alto en la lnea de control ENABLE (E).

TEXTO1

Enva al LCD la cadena de caracteres cuyo primer elemento est almacenado en la posicin
con direccin de memoria apuntada por el registro par HL. El carcter de escape es NULL
(00H).

TEXTO2

Enva al LCD la cadena de caracteres BCD de longitud especificada por el contenido del re-
gistro C y cuyo primer elemento est almacenado en la direccin de memoria especificada
por el registro par HL.

ESP_5MS

Retardo de 5 ms (>4.1ms) para permitir satisfacer los tiempos especificados en la rutina de
inicio.

El programa consta de 9 mdulos ensamblados con el AVMAC85 y enlaza-
dos con el AVLINK. El archivo resultante en de formato hex se carg en el programa
8085SimulatorIde el cual emula un mdulo LCD. El resultado se presenta en la figura
9.41, la interconexin del LCD con el 8085A en la figura 9.42. Las instrucciones del
programa de control del mdulo LCD, se muestran a continuacin.
Dispositivos de E/S Programables

554

$title(Manejo LCD)
$subtitle(Mdulo LCD)
;---------------------------------------------------------------------------------------------------------------------
; Modulo de programa principal
;---------------------------------------------------------------------------------------------------------------------

public pa_8155,pc_8155,escrb_cmd,escrb_dat,E_alto,E_bajo,escap,bcd_ascii,leer_dato1
public func_set1,func_set2,dspy_ctrl1,dspy_ctrl2,clr_dspy,ent_mod_set,leer_dato2
extern inic_lcd,sal_cmd,texto1,texto2
;---------------------------------------------------------------------------------------------------------------------

; Definicin de etiquetas
;---------------------------------------------------------------------------------------------------------------------
i_stack equ 08F0H ; Inicio de la pila
i_rwm equ 0800H ; Direccin de inicio de RWM
func_set1 equ 30h ; Interconexin de 8 lneas
func_set2 equ 38h ; Interconexin de 8 bits, 2 lneas de 5x7 puntos
dspy_ctrl1 equ 8 ; Pantalla off y cursor oculto
dspy_ctrl2 equ 0EH ; Pantalla on y mostrar cursor
clr_dspy equ 1 ; Borrar pantalla cursor a la esquina izquierda
ent_mod_set equ 6 ; Autoincremento y avanzar cursor
escrb_cmd equ 0 ; Lneas de control para escribir comando
escrb_dat equ 2 ; Lneas de control para escribir dato
E_alto equ 4 ; Mscara para activar lnea enable
E_bajo equ 0fbh ; Mscara para llevar enable a cero
leer_dato1 equ 5 ; Lneas de contro (E=1) para leer LCD
leer_dato2 equ 1 ; Lneas de contro (E=0) para leer LCD
escap equ 0 ; Caracter de escape para texto1
bcd_ascii equ 30h ; Conversin BCD a ASCII
;---------------------------------------------------------------------------------------------------------------------
; Definicin de segmentos
;---------------------------------------------------------------------------------------------------------------------
defseg puertos,start=50h, class=iospace ; 8155 en direccin 50h
defseg stack, start=i_stack ; La pila reside en la RWM
defseg datos, class=data, start=i_rwm ; RWM a partir de 0800H
defseg progr, class=code, start=0 ; 2k de EPROM desde 0000H
;---------------------------------------------------------------------------------------------------------------------
; Puertos del 8155
;---------------------------------------------------------------------------------------------------------------------
seg puertos
pctrl_8155 ds 1 ; Puerto de control del 8155
pa_8155 ds 2 ; Lneas de datos del mdulo LCD
pc_8155 ds 1 ; PC0-->RW
; PC1-->RS
; PC2-->EN
;---------------------------------------------------------------------------------------------------------------------
; rea de la pila
;---------------------------------------------------------------------------------------------------------------------
seg stack
ds 10H
t_stack:equ $-1 ; Base de la pila
;---------------------------------------------------------------------------------------------------------------------

Dispositivos de E/S Programables

555




;---------------------------------------------------------------------------------------------------------------------

; rea de variables
;---------------------------------------------------------------------------------------------------------------------
seg datos
mem ds 4
temp ds 1
;---------------------------------------------------------------------------------------------------------------------

; Segmento de cdigo
;---------------------------------------------------------------------------------------------------------------------
seg progr
lxi sp,t_stack ; Se carga el apuntador de pila
mvi a,0dH ; Pa:salida Pc:salida
out pctrl_8155 ; Programar 8155
call inic_lcd ; Configuracin de inicio del mdulo LCD
lxi h,cad1 ; Apuntar mensaje 'T1='
call texto1 ; Presentar texto 'T1='
lxi h,mem ; Apuntar valor de temperatura 1
mvi c,2 ; Son dos dgitos BCD
call texto2 ; Presentar temperatura 1
lxi h,cad2 ; Apuntar 'grados centigrados'
call texto1 ; Presentar 'grados centigrados'
lxi h,cad3 ; Apuntar mensaje 'T2='
call texto1 ; Presentar texto 'T2='
lxi h,mem+2 ; Apuntar valor de temperatura 2
mvi c,2 ; Son dos dgitos BCD
call texto2 ; Presentar temperatura 2
lxi h,cad2 ; Apuntar 'grados centigrados'
call texto1 ; Presentar 'grados centigrados'
mvi a,0cdh ; Direccin de posicin 13 de lnea 2
call sal_cmd ; Mover cursor
lxi h,cad4 ; Apuntar mensaje '(-->)'
call texto1 ; Presentar '(-->)'
hlt
;---------------------------------------------------------------------------------------------------------------------

; rea de mensajes
;---------------------------------------------------------------------------------------------------------------------

cad1: db 'T1=',0
cad2: db 0dfH,'C ',0
cad3: db 'T2=',0
cad4: db '(',7eh,')',0
end
;---------------------------------------------------------------------------------------------------------------------





Dispositivos de E/S Programables

556
;----------------------------------------------------------------------------------------------------------------------
; Rutina INIC_LCD
;-----------------------------------------------------------------------------------------------------------------------
public inic_lcd
extern sal_cmd, func_set1,func_set2,dspy_ctrl1,dspy_ctrl2
extern clr_dspy,ent_mod_set,esp_5ms,lcd_ocup
defseg progr
seg progr
;----------------------------------------------------------------------------------------------------------------------
inic_lcd: call esp_5ms ; Esperar al menos 15 ms
call esp_5ms
call esp_5ms
mvi a,func_set1 ; Function set
call sal_cmd
call esp_5ms ; Esperar al menos 4.1 ms
mvi a,func_set1 ; Function set
call sal_cmd
call esp_5ms ; Esperar al menos 100 s
mvi a,func_set1 ; Function set
call sal_cmd
call lcd_ocup ; Esperar al menos 40 s
mvi a,func_set2 ; Function set
call sal_cmd
mvi a,dspy_ctrl1 ; Display Control
call sal_cmd
mvi a,clr_dspy ; Clear Display
call sal_cmd
mvi a,dspy_ctrl2 ; Display Control
call sal_cmd
mvi a,ent_mod_set ; Entry Mode Set
call sal_cmd
ret
end
;----------------------------------------------------------------------------------------------------------------------


;----------------------------------------------------------------------------------------------------------------------
; Rutina SAL_CMD
;----------------------------------------------------------------------------------------------------------------------
public sal_cmd
extern lcd_ocup,escrb_cmd,temp,pa_8155,pc_8155,pulso_E
defseg progr
seg progr
;----------------------------------------------------------------------------------------------------------------------
sal_cmd: mov b,a ; Salva cdigo de instruccin
call lcd_ocup ; Espera que el mdulo est libre
mvi a,escrb_cmd ; Lneas de control para inicio de ejecutar instruccin
sta temp ; Salvar estado de RS y RW
out pc_8155 ; E=0, RS=0, RW=0
mov a,b ; Recuperar cdigo de instruccin
out pa_8155 ; Cargar instruccin en bus de datos
call pulso_E ; Generar un pulso en E
ret
end
;----------------------------------------------------------------------------------------------------------------------
Dispositivos de E/S Programables

557
;----------------------------------------------------------------------------------------------------------------------
; Rutina SAL_DATO
;----------------------------------------------------------------------------------------------------------------------
public sal_dato
extern lcd_ocup,escrb_dat,temp,pa_8155,pc_8155,pulso_E
defseg progr
seg progr
;----------------------------------------------------------------------------------------------------------------------

sal_dato: mov b,a ; Salvar dato
call lcd_ocup ; Espera que el mdulo est libre
mvi a,escrb_dat ; Estado de lneas de control para inicio de enviar dato
sta temp ; Salvar estado de RS y RW
out pc_8155 ; E=0, RS=1, RW=0
mov a,b ; Recuperar dato
out pa_8155 ; Cargar dato en el bus
call pulso_E ; Generar un pulso en E
ret
end
;----------------------------------------------------------------------------------------------------------------------



;----------------------------------------------------------------------------------------------------------------------
; Rutina LCD_OCUP
;----------------------------------------------------------------------------------------------------------------------
public lcd_ocup
extern pa_8155,pc_8155,leer_dato1,leer_dato2
defseg progr
seg progr
;----------------------------------------------------------------------------------------------------------------------

lcd_ocup: mvi a,0cH ; Pa:entrada Pc:salida
out pctrl_8155 ; Programar 8155 para lectura
mvi a,leer_dato1 ; E=1, RS=0, RW=1
out pc_8155
nop ; Tiempo extra
in pa_8155 ; Leer estado de bandera de ocupado
mov e,a ; salvar BF en registro E
mvi a,leer_dato2 ; E=0, RS=0, RW=1
out pc_8155
mov a,e ; Recuperar BF
rlc ; BF a la bandera de acarreo
jc lcd_ocup ; Si BF es 1, esperar
mvi a,0dH ; Pa:salida Pc:salida
out pctrl_8155 ; Programar 8155 para escritura
ret
end
;-------------------------------------------------------------------------------------------------------






Dispositivos de E/S Programables

558
;----------------------------------------------------------------------------------------------------------------------
; Rutina PULSO_E
;----------------------------------------------------------------------------------------------------------------------
public pulso_E
extern temp,E_alto,E_bajo,pa_8155,pc_8155
defseg progr
seg progr
;----------------------------------------------------------------------------------------------------------------------
pulso_E: lda temp ; Recuperar estado de RS y R/W
ori E_alto ; Mscara con E = 1
out pc_8155 ; E=1, RS, RW
nop ; Tiempo adicional
ani E_bajo ; Mscara con E = 0
out pc_8155 ; E=0, RS, RW
ret
end
;----------------------------------------------------------------------------------------------------------------------


;----------------------------------------------------------------------------------------------------------------------
; Rutina TEXTO1
;----------------------------------------------------------------------------------------------------------------------
public texto1
extern escap,sal_dato
defseg progr
seg progr
;----------------------------------------------------------------------------------------------------------------------
texto1: mov a,m ; Caracter desde la memoria al acumulador
cpi escap ; Probar si es el ltimo caracter del mensaje
rz ; Retornar si fin de cadena
call sal_dato ; Presentar caractes
inx h ; Apuntar siguiente elemento de la cadena
jmp texto1 ; Continuar presentando
end
;----------------------------------------------------------------------------------------------------------------------


;----------------------------------------------------------------------------------------------------------------------
; Rutina TEXTO2
;----------------------------------------------------------------------------------------------------------------------
public texto2
extern escap,sal_dato,bcd_ascii
defseg progr
seg progr
;----------------------------------------------------------------------------------------------------------------------
texto2: mov a,m ; Dgito BCD desde memoria al acumulador
adi bcd_ascii ; Convertir a ASCII
call sal_dato ; Presentar dgito
inx h ; Apuntar dgito siguiente
dcr c ; Cuenta de valores presentados
jnz texto2 ; Si no es el ltimo valor, continuar presentando
ret ; Es el ltimo, retornar.
end
;----------------------------------------------------------------------------------------------------------------------

Dispositivos de E/S Programables

559

;----------------------------------------------------------------------------------------------------------------------
; Rutina ESP_5MS
;----------------------------------------------------------------------------------------------------------------------
public esp_5ms
defseg progr
seg progr
;----------------------------------------------------------------------------------------------------------------------
esp_5ms: push d
lxi d,281h
esp: dcx d
mov a,e
ora d
jnz esp
pop d
ret
end
;----------------------------------------------------------------------------------------------------------------------




Fig. 9.41. Mdulo LCD del programa 8085Simulator Ide.

Fig. 9.42. Puerto de conexin del mdulo LCD.
Dispositivos de E/S Programables

560
9.2.2 Seccin del temporizador-contador del 8155

Adems de 256 bytes de memoria RWM y de 3 puertos de E/S, el 8155 tiene
un temporizador contador programable que puede usarse en aplicaciones que requie-
ran control de tiempo. Las aplicaciones de un temporizador son diversas. Entre las
funciones bsicas del dispositivo se tienen:

Generar retardos y medir el tiempo transcurrido entre dos eventos.

Realizar la cuenta de eventos.

Generar velocidades de baudios para el canal de comunicacin serie.

En la prctica, el uso de un temporizador slo lo limita la imaginacin del di-
seador. Este puede usarse para generar sonido, medir variables fsicas como tempe-
ratura y humedad, convertir de voltaje a frecuencia, controlar servomotores; y en ge-
neral, est presente en toda aplicacin que involucre generacin y control de tiempo.
El uso de un circuito para generar, por ejemplo: tiempos de espera, libera al P de la
tarea de mantenerse en un lazo sin hacer nada por la duracin del retardo. La CPU
slo debe programar el modo de operacin, arrancar el temporizador y esperar que
ste le indique el final del retardo.

La seccin del timer del 8155 es un temporizador contador binario descenden-
te de 14 bits, el cual registra los pulsos de entrada y al culminar la cuenta, entrega a
su salida una onda cuadrada o un pulso, de acuerdo con el modo de operacin pre-
viamente programado. La figura 9.43 muestra las lneas de entrada y salida del tem-
porizador. Los terminales TIMER IN y OUT TIMER son externos. Al primero se
conectan los pulsos a contar y en el segundo se presenta la seal de salida.
















Fig. 9.43. Entradas y salidas de la seccin del timer del 8155.


Las entradas AD0-AD7 corresponden a los terminales del 8155 y permiten el
acceso a los registros. TH y TL son seales internas al 8155 y se usan para seleccio-
AD0-AD7

TH
TIMER-IN


OUT TIMER
Registro TH
Registro TL

TL
Dispositivos de E/S Programables

561
nar los registros del contador. Debido a que la programacin del temporizador se rea-
liza por programa, desde el punto de vista del hardware, este puede verse como un
componente con una entrada de reloj y una salida, como ilustra la figura 9.44.












Fig. 9.44. Entradas y salidas externas de la seccin del timer del 8155.


Programacin del temporizador-contador

Antes de ser puesto en operacin, el dispositivo debe ser programado para in-
dicarle el modo de operacin y la longitud de la cuenta. Esta configuracin se realiza
cargando palabras de control en los registros internos del contador, de acuerdo con el
formato mostrado en la figura 9.45. En el registro TL se cargan primero los ocho bits
menos significativos de la cuenta y en TH los seis bits restantes. Los dos bits altos de
TH, establecen el modo de operacin.



Fig. 9.45. Formato de los registros internos del timer.

Como se observa en la figura 9.32, los dos bits de orden alto (TM2-TM1) del
registro de comando se usan para funciones del contador. De modo que para arrancar
o parar el temporizador, basta con escribir la palabra de control adecuada en el regis-
tro de comandos. En la tabla 9.7 se especifican los cuatro comandos disponibles. De-
bido a que el programa puede iniciar o parar al timer en cualquier momento, debe

TIMER-IN


OUT TIMER
TEMPORIZADOR

Dispositivos de E/S Programables

562
cuidarse que tales acciones no modifiquen la configuracin de los puertos de E/S rea-
lizada al inicio del programa.

Tabla. 9.7. Comandos del timer.
TM2 TM1
0 0 No afecta al temporizador.
0 1 Detiene de inmediato la cuenta.
1 0 Para el contador una vez alcanzado el final de la cuenta.
1 1
Carga el modo y longitud de la cuenta. Si el timer est
corriendo se espera el final de la cuenta antes de cargar el
nuevo modo y longitud.

La longitud de la cuenta puede ser un valor entre 2 y 3FFFH. La salida
OUT TIMER est normalmente en nivel alto y se puede seleccionar uno entre
cuatro modos de operacin, como se especifica en la tabla 9.8.

Tabla. 9.8. Modos de operacin del temporizador.
M2 M1
0 0 Onda cuadrada. Pone la salida en cero durante la segunda
mitad de la cuenta.
0 1 Onda cuadrada con auto recarga. El periodo de la onda
cuadrada es igual a la longitud de la cuenta, la cual es
recargada automticamente al final del conteo.
1 0 Pulso nico en nivel bajo cuando se alcanza el final de la
cuenta.
1 1 Pulso en nivel bajo con auto recarga al final de la cuenta.

Como se observa en la figura 9.46, cuando el modo 0 es seleccionado, se pro-
duce a la salida un ciclo de onda cuadrada. Por ejemplo, si la longitud de la cuenta es
4, durante los primeros 2 ciclos de reloj la salida permanecer en alto y durante los
siguientes 2 pulsos se pondr en bajo. Para una longitud de 5, el tiempo en uno lgico
ser de 3 periodos de reloj y el tiempo en cero de dos ciclos de reloj. Para modo 1,


Fig. 9.46. Formas de ondas de salida segn el modo seleccionado..

se recarga la longitud y se repite el ciclo continuamente hasta cuando se pare el con-
tador. Para el modo 2, con una cuenta de 5, la salida permanecer en alto durante 4
Dispositivos de E/S Programables

563
periodos de reloj y en cero durante el quinto ciclo. En el modo 3 se recarga la longi-
tud generndose un tren de pulsos, con las caractersticas descritas.

Ejemplo 9.10

Se tiene un 8155 decodificado en la direccin 40H y se usar el temporizador
para generar una seal de reloj de frecuencia seleccionada por la posicin de tres in-
terruptores S
0-2
conectados a las lneas PA
0-2
del puerto A. Considere que la frecuen-
cia de oscilacin del cristal externo del P es de 6.144 MHz. La tabla 9.9 indica co-
mo se selecciona la frecuencia de salida y la figura 9.47 muestra el circuito de gene-
racin de seales.

Tabla. 9.9. Seleccin de la frecuencia de salida.
S
2
S
1
S
0
Frecuencia (Hz)
0 0 0 300
0 0 1 600
0 1 0 1200
0 1 1 2400
1 0 0 4800
1 0 1 9600
1 1 0 9600
1 1 1 9600





Fig. 9.47. Generador de reloj de frecuencia variable.
Dispositivos de E/S Programables

564
Solucin:

El temporizador funciona en el modo de onda cuadrada con auto recarga y de-
be generarse una tabla de valores para la longitud de la cuenta, en funcin del estado
de cada interruptor. Para una frecuencia f
x
la longitud de la cuenta se calcula con:

f
clk
lc
f
x
=


Para una frecuencia de 4800 Hz y un reloj externo de 6.144 Mz se tiene,

640
4800
10 072 . 3
lc
6
=

=

Usando la ecuacin se obtiene la siguiente tabla.


Tabla. 9.9. Frecuencia de salida en funcin
de la longitud de la cuenta.
Frecuencia
(Hz)
Longitud decimal
de la cuenta
300 10240
600 5120
1200 2560
2400 1280
4800 640
9600 320


La subrutina CLK lee los interruptores y encuentra en la tabla la longitud co-
rrespondiente. A continuacin se cargan los registros TL y TH y se arranca el tempo-
rizador.


; Generador de reloj
;---------------------------------------------------------------------------------------------------------------------------
; Definicin de etiquetas
;---------------------------------------------------------------------------------------------------------------------------
modo_timer equ 40h ; Onda cuadrada con autorecarga
inic_timer equ 0C0h ; Arrancar timer
palb_ctrl equ 2
tope_pila equ 200h
;---------------------------------------------------------------------------------------------------------------------------
; Definicin de segmentos
;---------------------------------------------------------------------------------------------------------------------------
defseg puertos,start=40h, class=iospace ; 8155 en direccin 40h
defseg progr, class=code, start=0 ; Segmento de cdigo
Dispositivos de E/S Programables

565
;---------------------------------------------------------------------------------------------------------------------------
; Puertos del 8155
;---------------------------------------------------------------------------------------------------------------------------
seg puertos
pctrl_8155 ds 1 ; Puerto de control del 8155
pa_8155 ds 3 ; Puerto de interruptores
timer_bajo ds 1 ; Registro bajo del contador
timer_alto ds 1 ; Registro alto del contador
;---------------------------------------------------------------------------------------------------------------------------
; Programa principal al inicio del segmento de cdigo
;---------------------------------------------------------------------------------------------------------------------------
seg progr
mvi a,palb_ctrl ; Pa:Entrada
out pctrl_8155 ; Programar 8155
lxi sp, tope_pila ; Inicio de apuntador de pila
call clk
; .
; .
; .
;---------------------------------------------------------------------------------------------------------------------------
; Rutina CLK
;---------------------------------------------------------------------------------------------------------------------------
clk: lxi h,tbl_long ; Apuntar tabla de longitudes de cuenta
in pa_8155 ; Leer estado de interruptores
call ret_20ms ; Suprimir efecto de rebote
in pa_8155 ; Releer interruptores
ani 7 ; Enmascarar
ral ; Multiplicar por dos
add l ; Sumar desplazamiento
mov l,a ; Apuntar byte bajo de la longitud
mov e,m ; Cargar en registro E
inx h ; Apuntar byte alto de la longitud
mov d,m ; Cargar en registro D
mvi a,e ; Byte bajo de longitud al acumulador
out timer_bajo ; Byte bajo de longitud a TL
mvi a,d ; Byte alto de longitud al acumulador
ori modo_timer ; Especificar modo
out timer_alto ; Modo y byte alto de longitud a TH
mvi a,inic_timer or palb_ctrl ; Comando de inicio del timer
out pctrl_8155
ret
;---------------------------------------------------------------------------------------------------------------------------
; Rutina de retardo
;---------------------------------------------------------------------------------------------------------------------------
;ret20ms:
; .
; .
; .
ret
;---------------------------------------------------------------------------------------------------------------------------
; Tabla de valores de longitud de la cuenta
;---------------------------------------------------------------------------------------------------------------------------
tbl_long: dw 10240,5120,2560,1280,640,320,320,320
end
;---------------------------------------------------------------------------------------------------------------------------
Dispositivos de E/S Programables

566
El temporizador puede ser usado para interrumpir al P en intervalos especfi-
cos para realizar una funcin determinada. En estos casos, la salida del temporizador
se conecta a una entrada de interrupcin de la CPU. Usando la entrada RST7.5, cada
vez que la salida se coloque en alto, se realizar al microprocesador una solicitud de
interrupcin.

Ejemplo 9.11

Una aplicacin requiere incrementar en uno, cada 32 s, un contador de 16
bits. El inicio de la cuenta lo marca el flanco posterior de un pulso generado por el P
en el bit PB
0
de un 8155. Esta seal afecta un circuito externo no mostrado. Transcu-
rrido un tiempo t
x
, la red coloca la entrada PA
0
en nivel lgico uno notificando el fi-
nal de la cuenta. En este instante, el contenido del registro DE, usado como contador,
debe almacenarse a partir de la direccin de memoria MEM.

Solucin:

Para resolver el problema, se usa el temporizador del 8155 con su salida co-
nectada a la entrada de interrupcin RST 7.5, como ilustra la figura 9.48. El timer es
configurado para entregar, cada 32 s, un pulso de salida con auto recarga. La rutina
de servicio de interrupcin deber incrementar en uno el registro par DE. Una vez
iniciada la cuenta, el programa se mantendr examinando la lnea PA
0
, en espera que
conmute a nivel alto para detener el timer y almacenar la cuenta final en memoria.




Fig. 9.48. Circuito para el ejemplo 9.11

Dispositivos de E/S Programables

567
El cdigo del programa se muestra a continuacin. El registro DE se usa como
contador y el resultado se almacena en la direccin de memoria 200H y siguiente. Al
final de la cuenta, el programa para el timer y entra en un estado de parada. La ins-
truccin HLT al final, se usa para detener la simulacin del programa y examinar el
valor final de la cuenta en memoria. En la prctica, el valor registrado puede conver-
tirse a BCD y presentarse en una pantalla y reiniciar el proceso con un nuevo ciclo de
medida.

; Ejemplo 9.11
;---------------------------------------------------------------------------------------------------------------------------
; Definicin de etiquetas
;---------------------------------------------------------------------------------------------------------------------------
modo_timer equ 0c0h ; Un pulso al final de la cuenta
inic_timer equ 0C0h ; Arrancar timer
parar_timer equ 40h ; Parar timer
palb_ctrl equ 2 ; PA:entrada PB:salida
mem equ 200h
long equ 100 ; Longitud de la cuenta
tope_pila equ 300h
;---------------------------------------------------------------------------------------------------------------------------
; Definicin de segmentos
;---------------------------------------------------------------------------------------------------------------------------
defseg int, start=3ch ; Vector de interrupcin
defseg puertos,start=50h, class=iospace ; 8155 en direccin 50h
defseg progr, class=code, start=100h ; Segmento de cdigo
;---------------------------------------------------------------------------------------------------------------------------
; Puertos del 8155
;---------------------------------------------------------------------------------------------------------------------------
seg puertos
pctrl_8155 ds 1 ; Puerto de control del 8155
pa_8155 ds 1 ; Puerto de entrada
pb_8155 ds 2 ; Puerto de salida
timer_bajo ds 1 ; Registro bajo del contador
timer_alto ds 1 ; Registro alto del contador
;---------------------------------------------------------------------------------------------------------------------------
; Rutina de servicio de interrupcin
;---------------------------------------------------------------------------------------------------------------------------
seg int
inx d ; Incrementar contador
ei ; Rehabilitar interrupciones
ret ; Retornar desde interrupcin
;---------------------------------------------------------------------------------------------------------------------------
; Programa principal
;---------------------------------------------------------------------------------------------------------------------------
seg progr
lxi sp,tope_pila ; Iniciar apuntador de pila
mvi a,palb_ctrl ; Cargar e A la palabra de control
out pctrl_8155 ; Programar ; PA:entrada PB:salida
ori 1
out pb_8155 ; Pulso de inicio a nivel alto
lxi d,0 ; Contador a cero
mvi a,long ; Byte bajo de Longitud de cuenta al acumulador
out timer_bajo ; Cargar byte bajo de cuenta en TL
Dispositivos de E/S Programables

568
mvi a, modo_timer ; Cargar modo en el acumulador
out timer_alto ; Cargar modo y byte alto de cuenta en TH
xra a ; Cero al acumulador
out pb_8155 ; Pulso de inicio a cero
mvi a,inic_timer or palb_ctrl
out pctrl_8155 ; Arrancar timer
mvi a,0bh ; Mscara de interrupcin
sim ; Desenmascarar entrada RST 7.5
ei ; Habilitar interrupciones
esp: in pa_8155 ; Leer Puerto A
rar ; Bit 0 a la bandera de acarreo
jnc esp ; Si es cero, esperar
mvi a,parar_timer or palb_ctrl
out pctrl_8155 ; Si es uno, parar timer
xchg ; Cuenta final al registro HL
shld mem ; Almacenar cuenta final en memoria
hlt
end
;---------------------------------------------------------------------------------------------------------------------------


Ejemplo 9.12
Se debe construir y programar un generador de forma de ondas usando el 8155
#2 del microcomputador MPR-85 PLUS. El instrumento debe tener dos entradas: la
primera es un pulsador para seleccin del tipo de seal de salida entre: seno, cuadra-
da, triangular o diente de sierra. Al aplicarse energa al circuito debe generarse una
onda seno. Las activaciones subsecuentes del pulsador seleccionarn una salida dife-
rente en el orden especificado. La segunda entrada es un arreglo de siete interruptores
lgicos que permite variar la frecuencia de la seal de salida. La figura 9.49 muestra
el circuito del generador.

Solucin:
Para el diseo del instrumento se utiliza el circuito integrado de E/S PPI 8155
#2 del MPR-85 PLUS, el cual es decodificado en la direccin 50H. Como se observa
en la figura 9.49, el puerto A (51H) se configura como salida con sus terminales co-
nectados a las entradas de convertidor anlogo digital DAC0808. Los interruptores
SW
1
-SW
7,
para variar la frecuencia de la salida, se acoplan a los siete bits bajos del
puerto de entrada 52H (Puerto B del 8155) y la salida de la red de supresin de rebo-
tes del pulsador S
1
de seleccin de forma de onda, es cableado a la lnea P52.7 del
mismo puerto.

Para generar una tensin analgica en V
S
basta con escribir el valor digital co-
rrespondiente en el puerto A del 8155. El circuito DAC0808 tiene una resolucin de 8
bits y es configurado para entregar una corriente de salida I
OUT
desde 0 hasta la co-
rriente de final de escala I
FS
. Las entradas A
1-8
toman valores entre 00 y FFH. La co-
rriente
OUT
I es complementaria de I
OUT
de modo que:
Dispositivos de E/S Programables

569


Fig. 9.49. Circuito para el generador de forma de onda
Dispositivos de E/S Programables

570

OUT OUT FS
I I I + = , para toda entrada.


La corriente de fin de escala viene dada por la ecuacin:


2
2
R
V
I
2
2
I I
5.6K
ref
R 5.0V
ref
V ,
n
1 n
ref
ref
FS
n
1 n
ref FS
= =

=
=



La intensidad de salida para cualquier valor de entrada es:

n
10 base
ref
ref
OUT
2
A
R
V
I =


El amplificador operacional a la salida del CAD entrega una tensin V
S
entre
0 y +I
FS
5.6K.

10 base
8
10 base
n
ref
S
OUT S
A
2
5
A
2
V
V
K 6 . 5 I V
= =
=


Para una entrada digital 10010111
2
= 151
10
la tensin de salida ser igual a:


V 95 . 2 151
256
5
V
S
+ = =

Debido a que se usa un paso para representar el voltaje cero, la tensin mxi-
ma de salida ser:

V 98 . 4 255
256
5
V
mx S
+ = =

De acuerdo con lo anterior, para generar un ciclo de una forma de onda trian-
gular de 2.5 V
pico
se debe escribir en el puerto de salida A una secuencia entre 00 y
7FH para la pendiente positiva y desde 7FH hasta cero para la pendiente negativa,
como puede observarse en la figura 9.50.
Dispositivos de E/S Programables

571


Fig. 9.50. Se genera una muestra cada t
x
.

El tiempo t
x
entre muestras lo fija el valor cargado en los registros del tempo-
rizador/contador, configurado para pulso nico con auto recarga. Los 7 bits de mayor
orden del registro TL corresponden al estado de los interruptores SW
7
-SW
1
y el bit
menos significativo de TL se pone a cero. Los 6 bits altos del contador se cargan con
ceros. Para detectar cuando se debe escribir la siguiente muestra, se puede conectar la
salida del timer a la entrada de interrupcin RST 7.5, para que se realice una solicitud
de interrupcin cada vez que el contador alcance el final de la cuenta. En este caso, se
usa la instruccin RIM para examinar si existen interrupciones pendientes. Otro mo-
do, el utilizado en este ejemplo, es examinar el estado del bit D
6
del registro de estado
del 8155 y producir la siguiente muestra cada vez que D
6
se coloque en uno.

Para seleccionar el tipo de onda, se usa un contador de mdulo 3 que registra
el orden en el cual es activado el pulsador. Al inicio el contador est en 0, indicando
salida seno. Las subsecuentes activaciones lo pone en 1 para onda cuadrada, en 2 para
triangular y en 3 para diente sierra. Al presionarse S
1
por cuarta vez el contador vuel-
ve a 0 reinicindose la secuencia con salida seno. Con el programa en ejecucin, se
lee el tipo de onda y su frecuencia y se genera un ciclo de la forma de onda deseada a
la frecuencia especificada. A continuacin se vuelve a leer el estado de los interrupto-
res SW
1-7
y S
1
para generar el siguiente periodo de la misma seal o el primer ciclo de
nueva onda de salida.

Para generar la onda seno se utiliza una tabla de valores. La k-sima muestra
N
k
se obtiene con la siguiente ecuacin, donde n es el nmero de muestras en un pe-
riodo:

Dispositivos de E/S Programables

572
Para que la frecuencia seleccionada sea la misma para todos los tipos de on-
das, es necesario generar el mismo nmero de muestras por ciclo y escribir una mues-
tra cada T/n, donde T es el periodo de la forma de onda. Se desea una amplitud de la
salida de 5.0 V (4.98 V) con 128 muestras por ciclo. Con la seal seno no hay pro-
blema en usar una tabla de 64 valores (medio ciclo) y con la onda cuadrada basta con
escribir 64 muestras en nivel bajo y otras 64 en alto. Pero en el caso de la forma de
onda triangular, para obtener la amplitud deseada, la seal debe variar entre 0 y FFH
cada medio ciclo, lo cual equivale a 512 muestras por ciclo.

Para ajustar el nmero de muestras a 128, se carga (para la pendiente positi-
va) en el DAC los valores 0,4,8,0CH,,FCH,0CH,8,4,0; lo cual representa 64
muestras en el semiciclo ascendente y 64 muestras en el descendente. Como resultado
la amplitud se reduce a 4.93 V. Para que toda salida tenga igual amplitud se ajusta la
tabla de valores de la onda seno y el valor de del nivel alto de la onda cuadrada. En el
caso de la seal diente de sierra se carga a la entrada del DAC la secuencia
0,2,4,5,8,0AH,,0FEH para 128 muestras por ciclo.

El cdigo del generador consta de un programa principal para detectar el tipo
y frecuencia de la onda y generar la seal correspondiente y una subrutina que escribe
el valor digital de la muestra en el puerto A, cada vez que el temporizador alcanza el
final de la cuenta.


$title(Generador de onda)
;---------------------------------------------------------------------------------------------------------------------------
i_stack equ 8FF0H ; Inicio de la pila
modo_timer equ 0C0h ; Pulso nico con autorecarga
inic_timer equ 0CDh ; Palabra de control para arrancar temporizador
;---------------------------------------------------------------------------------------------------------------------------
; Definicin de segmentos
defseg puertos,start=50h, class=iospace, absolute
defseg pila, start=i_stack
defseg progr, class=code, start=6002h
;---------------------------------------------------------------------------------------------------------------------------
; Puertos de entrada del sistema
seg puertos
pctrl_8155: ds 1 ; Registro de control del 8155.
pa_8155: ds 1 ; El CDA se conecta al puerto de salida A.
pb_8155: ds 2 ; Puerto B entrada para seleccin de tipo y frecuencia de la onda.
timer_bajo: ds 1 ; Modo del temporizador y 6 bits altos de longitud de la cuenta
timer_alto: ds 1 ; Byte menos semicl_2ificativo de longitud de la cuenta.
;---------------------------------------------------------------------------------------------------------------------------
; Los 16 bytes ltimos de RWM soportan el stack.
seg pila
ds 10H
;---------------------------------------------------------------------------------------------------------------------------
t_stack:equ $-1 ; Base de la pila
;---------------------------------------------------------------------------------------------------------------------------


Dispositivos de E/S Programables

573
;---------------------------------------------------------------------------------------------------------------------------
;Programa principal
;---------------------------------------------------------------------------------------------------------------------------
seg progr
lxi sp,i_stack ; Cargar apuntador de pila
mvi b,0 ; Se inicia contador de tipo de onda
inicio: in pb_8155 ; Leer frecuencia. Despus del reset, PB <-- entrada
rlc ; Desplazar a la izquierda
out timer_bajo ; Byte menor de la cuenta
mvi a,0C0h ; Modo:un pulso con autorecarga y 6 bits altos del
out timer_alto ; contador a cero
mvi a,0cdh ; Configura puertos. PA --> salida PB <-- entrada
out pctrl_8155 ; Arrancar timer
in pb_8155 ; Leer pulsador de seleccin de onda
ani 80h ; Enmascarar D7
jz gener ; Generar ciclo de onda si pulsador est desactivado
inr b ; Pulsador activado
esp: in pb_8155 ; Releer pulsador para esperar apertura.
ani 80h ; Enmascarar D7
jnz esp ; Esperar que pulsador se desactive
gener: mov a,b ; Estado del contador se carga en el acumulador
cpi 0 ; Comparar con cero
jz seno ; Onda es seno
cpi 1 ; Comparar con 1
jz cuad ; Onda es cuadrada
cpi 2 ; Comparar con 2
jz trian ; Onda es triangular
cpi 3 ; Comparar con 3
jz d_sierra ; Onda es diente de sierra
mvi b,0 ; Onda es seno. Contador a cero

; onda es seno
seno: lxi h,tabla ; Apuntar elemento 1 de la tabla.
semicl_1: inx h ; Saltar valor cero de la tabla.
mov a,m ; Probar si valor de la tabla es cero.
cpi 0 ; Si es cero
jz semicl_2 ; Se gener el primer semiciclo. Generar segundo medio ciclo.
call dac ; Si no es cero, continuar
jmp semicl_1 ; generando primer medio ciclo.
semicl_2: dcx h ; Saltar cero al finalde la tabla.
mov a,m ; Cargar valor de la tabla en el acumulador.
cpi 0 ; Probar si se alcanz el cero inicial de la tabla.
jz inicio ; Si es as es el fin de ciclo, examinar tipo y frecuencia de la onda.
mov c,a ; Si no, generar segundo medio ciclo
mvi a,0fch ; usando los valores de la tabla,
sub c
call dac ; Escribir a DAC.
jmp semicl_2 ; Continuar generando segundo medio ciclo.

; onda es diente de sierra
d_sierra: mvi a,0 ; Generar pendiente negativa desde FCH hasta 0
mvi c,0feh ; en pasos de 2.
jmp dcs
dct: mov a,c
dcs: call dac ; Escribir en DAC
dcr c
Dispositivos de E/S Programables

574
dcr c
jnz dct
jmp inicio ; Fin de ciclo. Saltar a examinar tipo y frecuencia de la onda.

; onda es triangular
trian: mvi c,0 ; Generar pendiente positiva desde 0 hasta FCH en pasos de 4.
proxs: mov a,c
call dac ; Escribir en DAC.
inr c ; Incrementar en 4 el registro C.
inr c
inr c
inr c
mov a,c
cpi 0fch ; Probar si se alcanz valor pico de la seal triangular.
jnz proxs ; Si no, seguir generando pendiente positiva.
proxb: mov a,c ; Si valor pico, generar pendiente negativa desde FCH hasta cero.
tri_baj: call dac ; Escribir en DAC.
dcr c ; Pasos de -4.
dcr c
dcr c
dcr c
jnz proxb ; Si valor distinto de cero continuar generando pendiente negativa.
jmp inicio ; Si es cero es fin de ciclo. Examinar tipo y frecuencia de la onda.

; onda es cuadrada
cuad: mvi c,2 ; Son dos semiciclos.
mvi d,0 ; Primer semiciclo consta de 64 muestras en nivel bajo.
semi: mvi e,64
prox: mov a,d ; El registro D tiene 0 en el semiciclo 1 y FCH en el semiciclo 2.
call dac ; Escribir a DCA.
dcr e ; Contador de muestras menos 1.
jnz prox ; Escribir hasta muestra 64.
mvi d, 0fch ; Cargar D con nivel alto.
dcr c ; Contador de semiciclos menos 1
jnz semi ; Generar semiciclo 2.
jmp inicio ; Fin de ciclos, saltar a examinar tipo y frecuencia de la onda.
;---------------------------------------------------------------------------------------------------------------------------
; Rutina DAC
;---------------------------------------------------------------------------------------------------------------------------
dac: out pa_8155
dac1: in pctrl_8155
ani 40h
jz dac1
ret
;---------------------------------------------------------------------------------------------------------------------------
; Tabla de valores para primer semiciclo de la onda seno.
;---------------------------------------------------------------------------------------------------------------------------
tabla: db 0,126,132,138,144,150,156,162,168,174,179,185,190
db 196,201,205,210,215,219,223,227,230,234,237,239
db 242,244,246,248,249,250,251,251,252,251,251,250
db 249,248,246,244,242,239,237,234,230,227,223,219
db 215,210,205,201,196,190,185,179,174,168,162,156
db 150,144,138,132,126,0
end
;---------------------------------------------------------------------------------------------------------------------------
Dispositivos de E/S Programables

575








Fig. 9.51. Formas de onda como se ven en un osciloscopio. 2 V/div, 5 ms/div.
Dispositivos de E/S Programables

576







Fig. 9.52. Forma de onda seno.
Dispositivos de E/S Programables

577






Fig. 9.53. Salida onda cuadrada.
Dispositivos de E/S Programables

578







Fig. 9.54. Seal triangular.
Dispositivos de E/S Programables

579





Fig. 9.55. Onda diente de sierra