CAPÍTULO 11 PROGRAMACIÓN DE PERIFÉRICOS

11.0 REVISIÓN DEL MCS65205 Y LAS OPERACIONES DE E/S


Cabe señalar que, en las siguientes discusiones, la principal diferencia entre la E/S del MCS6530 (RRIOT) y el registro principal del MCS6520 es que el bit extra en el registro de control no se usa en el MCS6530. Todos los registros en el MCS6530 son direccionables directamente.



En el Ejemplo 11.1 se muestra un formulario de programación para describir el PIA. El formulario de programación se utiliza en el Cross-Assembler y en el Resident Assembler con la familia de productos MCS650X. La notación "* =" se utiliza para definir cualquier posición. La notación significa que al contador de instrucción del ensamblador se le asigna el valor que viene a continuación, del signo igual. La expresión "* = * + 1" hace que el ensamblador reconozca un byte de memoria asociado al término; por lo tanto, podemos ver que la definición de los cuatro registros PIAD, PIAC, PIBD y PIBC son posiciones de memoria consecutivas que comienzan en alguna dirección base, con el primer byte direccionado como PIAD, el segundo como PIAC, el tercero como PIBD y el cuarto como PIBC. Esta es la forma normal en que se organiza la memoria en el MCS6520, y la forma en que debe configurarse el formulario de programación. La dirección base la toma un algoritmo descrito en el Manual de Hardware pero normalmente se trata de un valor entre 4004 y 4080 hexadecimal. Cada MCS6520 recibe una dirección base que funciona progresivamente a partir de 4004 Hex.
En el ejemplo 11.1 se muestran dos registros rodeados por líneas segmentadas. Esto se debe a que cada una de las partes A DATA (AD) y B DATA (BD) del MCS6520 son en realidad dos registros que tienen la misma dirección; el primero especifica la dirección de cada una de las rutas de entrada/salida (el Registro de Dirección de Datos), y el segundo corresponde a la conexión de las rutas de entrada/salida (el Registro de Datos). Debido a las limitaciones de los pines en el MCS6520, el microprocesador sólo puede dirigirse directamente a uno de estos registros a la vez. El bit 2 en el respectivo registro de control (AC y BC) indica a qué registro se está conectando el microprocesador. Si el bit 2 está desactivado, se está direccionando al Registro de Dirección de Datos; si está encendido, se está direccionado al Registro de Datos.
Durante la secuencia de inicialización, por lo tanto, el MCS6520 comienza con todos los registros iguales a cero. Esto significa que el microprocesador está direccionando al Registro de Dirección de Datos. La PIA se inicializa al escribir la dirección de los pines en el Registro de Dirección de Datos (AD, BD) y luego ajustando la bandera de control tal como se describe a continuación. Después eso, el programa se ocupará de los registros de datos como lo hace normalmente.


5 El circuito integrado MCS6520 es un PIA (Peripheral Interface Adapter – Adaptador de Interfaz Periférica) que permite la implementación de una interfaz paralela para sistemas basados en microprocesadores. En el Atari 400/800, por ejemplo, se usa el PIA para poder tener acceso hasta 4 puertos de joystick. (N. del. T.)


Ejemplo 11.2: Inicialización General de la PIA


              LDA # DIRECT          Dirección de Inicialización
              STA PIAD

              LDA # CONTR           Inicializar Control
              STA PIAC	

El ejemplo 11.2 ilustra una forma general de inicialización y puede completarse para el resto de los PIA que pueda haber en el sistema.

11.1 EL CONTROL DE LAS INTERRUPCIONES EN EL MCS6520


El MCS6520 tiene una capacidad de interrupción básica que se encuentra bajo el control del programador. Casi todos los dispositivos de E/S del MCS6500 que permiten interrupciones tienen un registro de control de interrupción que le permite al usuario deshabilitar la interrupción. Esto evita que las entradas que no están necesariamente activas causen interrupciones falsas que deban ser manejadas por el microprocesador. Ejemplos de esto son los bucles de cinta abiertos u otras señales que tienen entradas de alta impedancia sensibles al ruido, excepto cuando se conectan a algún tipo de medio de almacenamiento. En este tipo de aplicaciones, normalmente la interrupción es habilitada por alguna acción física realizada por parte de la persona que usa el dispositivo, acciones tales como cargar del casete, presionar el interruptor de encendido, etc. En el caso del MCS6520, hay dos condiciones que causan interrupciones para cada Registro de Control.
Cada una de estas interrupciones se relaciona con un pin de entrada. El Registro de Control permite al programador decidir si el pin es sensible a señales de borde positivo o negativo y si se producirá o no una interrupción cuando la transición seleccionada haya ocurrido.
Cabe señalar que, por lo tanto, es posible que una línea establezca en 1 un bit de estado sin causar una interrupción. El extenso programa de E/S en la Sección 11.5 usa esta combinación.


Ejemplo 11.3: Configuración del Modo de Interrupción


Bit 7 Bit de Estado :Bits 1 0Interrupción
Establecer en borde negativo0 0No
Establecer en borde negativo0 1
Establecer en borde positivo1 0No
Establecer en borde positivo1 1

Bit 6 Bit de Estado :Bits 4 3*Interrupción
Establecer en borde negativo0 0No
Establecer en borde negativo0 1
Establecer en borde positivo1 0No
Establecer en borde positivo1 1
  • Si el bit 5 es igual a cero

La combinación adecuada de bits generalmente se determina durante el diseño de la interconexión del MCS6520 y forman la constante que se carga en el Registro de Control. Ésta debe tener el bit 2 activado. Por ejemplo, si se desea que el bit 7 se active con señales negativas con habilitación de interrupción y el bit 6 se active con señales positivas con deshabilitación de interrupción, entonces el valor del control debe ser 15 Hex.
Con el bit 5 activado, el pin que controla al bit 6 se puede configurar como un pin de salida. El pin de salida es controlable por el microprocesador directamente. También actúa como un establecimiento de la comunicación (handshake) para reflejar el estado de las lecturas y escrituras del registro de datos. El funcionamiento de los pines de salida CA2, CB2 depende de cómo se programen los bits 5, 4 y 3, tal como se muestra en el ejemplo 11.4.


Ejemplo 11.4: Control de Salida CA2, CB2


Salida CA2 con :Bit 5 encendido Bit 4Bit 3
Bajo en lectura o escritura para un ciclo00
Bajo en lectura o escritura hasta que el bit 7 se active01
Siempre 010
Siempre 111

La decisión de usar o no el ciclo bajo hasta que el bit 7 se active es una decisión de hardware que depende del dispositivo que está conectado al pin.
El programador debe notar que el bit 6 controla los pines conocidos como CA2 o CB2, los que pueden considerarse salidas auxiliares controladas por el bit 3, asumiendo que el procesador ha sido inicializado de manera que los bits 5 y 4 hayan sido activados.
El ejemplo 11.5 muestra el uso de instrucciones AND y OR para controlar el bit 3; sin embargo, cabe señalar que esta técnica también se aplica a cualquier bit individual en el registro de dirección de datos del PIA:


Ejemplo 11.5: Rutina Para Cambiar CA2 o CB2 Usando el Bit de Control 3


            Establecer CA2
            LDA     PIAC
            ORA     #$08
            STA     PIAC

            Borrar CA2
            LDA     PIAC
            AND     #$F7
            STA     PIAC

            Nota: $ - Instrucción al Ensamblador para Notación Hexadecimal
                  # - Instrucción al Ensamblador para Operador de Producción	

Por medio de técnicas similares, se puede controlar cada pin de los microprocesadores MCS6520. Hay que recordar dos notas en particular:


1. En el MCS6520, si el bit 6 ha sido configurado como de entrada, tanto el bit 6 como el bit 7 se borran en cualquier lado al leer el registro de datos correspondiente. Esto significa que en las secuencias de sondeo (polling) para las instrucciones de E/S sólo deben leer los registros de estado y a continuación, los registros de datos, después de que se haya determinado el estado; de lo contrario, puede ocurrir un borrado falso de los datos de estado.


2. Aunque el establecimiento de la comunicación (handshake) para el pin CB2 está determinado por la escritura en el dato B, se debe realizar una lectura en el dato B para borrar el bit 7.

11.2 TRUCOS DE IMPLEMENTACIÓN PARA EL USO DE LA INTERFAZ DE PERIFÉRICOS MCS6520


11.2.1 Secuencias de Sondeo (Polling) de Acceso Directo


En la sección 9.7 se detallaron las técnicas para usar LOAD A para sondear las interrupciones. Sin embargo, los dispositivos de E/S en el MCS6520 pueden activar el bit 6 o el bit 7 para provocar una interrupción. Por lo tanto, se necesita utilizar una técnica diferente para analizar el MCS6520 y poder sondear una serie de 6520s, donde cada uno de ellos podría haber causado una interrupción. Para este propósito se cuenta con la instrucción BIT, la que puede comprobar tanto el bit 6 como el bit 7. A continuación, se muestra el código para un sondeo completo de un PIA:


Ejemplo 11.6: Sondeo del MCS6520


Vector de Interrupción  JMP STORE
                        LDA #C0         Configurar 6 y 7 en la Máscara 
                        BIT PIAAC       Comprobar que no sea ni 6 ni 7
                        BEQ NXTI
                        BMI SEVEN       Si es 7 , vaya a guardar --
                                        de lo contrario bórrelo
                  
                  Proceso del bit
                   6 de INTERRUPCIÓN
                   NXTI BIT PIABC
                        BEQ NXTZ
                           etc.	

Este programa aprovecha al máximo la instrucción BIT verificando que tanto el bit 7 como el 6 sean igual a cero. BMI a SEVEN sólo comprueba que la bandera Negativo esté activa dado que ésta tiene una prioridad más alta. Si el bit 6 es uno, la bandera de desbordamiento también se establecerá en 1, lo que permite la finalización del proceso de la rutina SEVEN para comprobar el desbordamiento y volver al código que procesa el bit 6.
El bit 6 y el bit 7 fueron comprobados con una única instrucción BIT. Se logró acelerar el proceso por medio de la carga de la máscara de sólo los bits 6 y 7, lo que permite a la instrucción BEQ determinar que ninguna de las dos banderas está encendida.


Esta rutina depende de que, en el MCS6520, si CA2 o CB2 han sido configurados como una salida, el bit 6 siempre es cero.


11.2.2 Organización de los Bits en el MCS6520


En el microprocesador, hay una preferencia posicional definida para la prueba de bits individuales. En el MCS6520 es posible seleccionar cualquier combinación de pines de entrada/salida por medio del patrón que se carga en el Registro de Sentido de los Datos (Data Direction Register). El bit uno corresponde a una salida y el bit cero corresponde a una entrada. La tendencia natural sería utilizar los ocho bits organizados en un byte. Hay relativamente poca ventaja al organizarlos de esta manera, a menos que el programa trate los ocho bits como un sólo byte. Este a menudo no es el caso. Normalmente los bits corresponden a una colección de interruptores, bobinas, luces, etc.


En tales combinaciones, debe aprovecharse el hecho de que el bit 7 es directamente comprobable, por lo que una combinación más útil de ocho pines en un registro del MCS6520 serían siete salidas y una entrada única en el bit 7. Esta organización permite al programador cargar y saltar a esa ubicación sin tener que realizar una instrucción de comprobación o de desplazamiento para aislar un bit particular.


Una capacidad similar para establecer un sólo bit implica la organización de los datos con siete entradas y una sola salida ubicada en el bit 0. Este bit puede establecerse o borrarse con una instrucción INC o DEC sin afectar al resto de bits en el registro, ya que los pines de entrada ignoran las señales escritas desde el microprocesador. Por lo tanto, el programador más hábil a menudo mezclará salidas individuales en el bit 0 y una sola entrada en el bit 7 con bits del tipo opuesto correspondiente.


11.2.3 Uso de las Instrucciones de Lectura/Modificación/Escritura para la Codificación del Teclado


Un uso bastante único de la memoria con las instrucciones READ/MODIFY/WRITE implica configurar el registro de datos con todos los bits en cero, y luego usar la salida de tres estados del lado B para muestrear un teclado. La Figura 11.1 muestra la conexión de un teclado de 64 teclas organizado en una matriz de 8 x 8:



El lado B está configurado para que actúe como un strobe6 de modo que cada una de las líneas de salida tendrá una conexión a tierra en lo que dura un ciclo de exploración del teclado. Luego, las ocho entradas de datos del lado A son muestreadas y decodificadas por el microprocesador, lo que nos otorga un teclado de 64 teclas directamente traducible a código. La figura 11.1 y el ejemplo 11.7 hacen uso de la capacidad del microprocesador para moverse un bit a través del registro del MCS6520. Este programa también utiliza la instrucción de comparación y la capacidad de detectar un acarreo durante un desplazamiento.


6 «strobe» se refiere al mecanismo de inhibición de la señal que se activa cuando el usuario presiona una segunda tecla antes de soltar la primera. (N. del T.)


Ejemplo 11.7: Codificación del «Strobe» en un Teclado de 8 x 8


La salida se indica con un uno en el Registro de Sentido de los Datos. Cualquier conexión se indica mediante un cero en el bit del registro.


       LDA #0
       STX PIABD    Inicializar registro de datos B
       LDA PIABC
       AND #FB      Inicializar registro de control para
       STA PIABC    direccionar el Registro de Sentido de los Datos 
       STX PIABC
       SEC          Activar el bit de extremo inferior
BUCLE  ROL PIABD    Desplazar para el "strobe"
       BCS HECHO
       LDA PIAAD    Si todo está muestreado, salir
       CMP #FF      Comprobar que no haya ceros
       BEQ BUCLE
HECHO   -------      Si hay ceros, entonces procéselos.	

A y PIABD ahora se pueden usar para averiguar qué tecla se presionó.


11.3 PROGRAMACIÓN DEL MCS65307


Aunque tienen direcciones separadas, los registros de Sentido de los Datos y los de entrada/salida funcionan igual que en el PIA MCS6520.
La programación del Temporizador de Intervalos tiene algunos problemas especiales. En primer lugar, la hora se encuentra efectivamente entre las direcciones XXX4 y la XXXF. Al seleccionar la dirección adecuada, el programador puede controlar la escala P para el tiempo de espera. La inicialización del Temporizador de Intervalos se realiza con un LOAD A seguido de un STORE A en el contador de tiempo. El valor almacenado en el contador de tiempo representa el número de estados hasta los que podrá contar el contador. La dirección utilizada para la carga determinará cuántas divisiones adicionales al ciclo de reloj básico se contarán.
Cuando el contador finalmente llega a cero, sigue contando más allá, a la velocidad del reloj de un ciclo para dar al usuario una oportunidad de comprobar el Registro de Estado, y luego volver y leer el Registro de Conteo para determinar cuánto tiempo ha pasado desde que ocurrió la interrupción.
Dar servicio a una interrupción es lo mismo para este Registro de Control que para cualquier otro registro de interrupción. El bit 7 se establece en 1 en el Registro de Estado para indicar que el Temporizador de Intervalos está en el estado de interrupción y el bit 7 se borra con la lectura del Contador.


7 El MCS6530 es un RRIOT (ROM-RAM-I/O-Timer), un circuito integrado con 1 KB de ROM pre-programada, 64 bytes de RAM estática, 2 puertos bidireccionales digitales de 8-bits para entrada/salida, y un Temporizador de Intervalos programable. (N. del T.)


11.3.1 Lectura del Registro Contador


Debido a la naturaleza de contar más allá de cero, el número en el Registro Contador está en forma de complemento a dos. Puede ser sumado directamente y utilizado para corregir el siguiente conteo en una secuencia de conteos o para la corrección de la exactitud de un ciclo.

11.4 CÓMO ORGANIZARSE PARA IMPLEMENTAR LA CODIFICACIÓN


Los detalles específicos de la organización a la hora de ensamblar el código son una función del software que se utiliza para la implementación del código. Actualmente se encuentran disponibles dos programas software para la familia MCS650X.
El Cross-Assembler está disponible en varios sistemas de tiempo compartido o para procesamiento por lotes. Su documentación está cubierta en el Manual del Cross-Assembler, número de publicación 6500–60. El Resident Assembler está disponible en la Terminal de Microcomputadoras de Desarrollo, así como a la venta en ROMs. Su documentación está cubierta en el Manual del Resident Assembler, número de publicación 6500–65.
La principal ventaja de usar un ensamblador es que éste toma los mnemónicos y etiquetas y calcula el código fijo. La tabla de OP CODEs en el apéndice de referencia muestra que la codificación en hexadecimal es bastante difícil ya que no hay un patrón ordenado en los códigos hexadecimales de las instrucciones.
Tanto el Cross-Assembler como el Resident Assembler permiten especificar en un listado documentado todas las entradas y salidas en forma simbólica. El direccionamiento simbólico es una técnica que tiene las siguientes ventajas sobre direccionamiento numérico:


1. Le permite al usuario posponer hasta el último momento la asignación real de una posición de memoria en un programa que está siendo desarrollando. En un microprocesador que tiene características orientadas a la memoria, tal como la Página Cero, la gestión de la Memoria es importante. Es deseable tener en la Página Cero tantos valores de lectura/escritura como sea posible. Sin embargo, hasta que se complete la codificación, la organización de la Página Cero puede estar en duda. Los valores que se asignan originalmente en la Página Cero pueden no ser tan valiosos luego de que un análisis del código indique que las aplicaciones de estos valores usan referencias indirectas o indexación por registro Y, lo que no permite que el programa aproveche realmente las ubicaciones de la Página Cero. Por otro lado, otro código, que puede no usarse con tanta frecuencia, podría implicar una reducción del mismo mediante el uso de la Página Cero. Si todos los campos están definidos simbólicamente, esta asignación se puede realizar en el montaje final sin ningún cambio en el código del usuario.


2. El uso de direcciones simbólicas para programar bifurcaciones (branches) conduce a un programa mejor documentado y, como se determina pronto, el cálculo de saltos relativos es difícil y está sujeto a modificaciones cada vez que se realiza un cambio en el código. Por ejemplo, si uno ha organizado un programa con un bucle en el que tres o cuatro saltos regresan al mismo punto y luego se descubre un error de programación que requiere que se agregue una sola instrucción entre el punto de retorno y los varios saltos, cada salto tendría que ser editado y recalculado. El ensamblador simbólico logra esto automáticamente en la siguiente pasada de ensamblaje.


11.4.1 Estándares de Etiquetas


Los ensambladores de la familia MCS650X han sido fabricados basándose en la reserva de palabras donde los distintos mnemotécnicos que hemos descrito siempre se consideran mnemotécnicos de OP CODEs. Si tres campos de tipo carácter coinciden exactamente con un mnemónico, entonces el ensamblador asume que el campo es un OP CODE y procede a evaluar el direccionamiento. Cualquier otra etiqueta podrá ubicarse de forma libre en cualquier parte del código. Esto significa que uno debe organizar sus etiquetas de manera que nunca tenga una etiqueta de tres caracteres que, sin darse cuenta, pueda considerarse un OP CODE. La forma más sencilla de lograrlo es seguir siempre un patrón en las etiquetas.
Las buenas prácticas de programación requieren que el usuario, antes de comenzar la codificación, desarrolle un diagrama de flujo del sistema para su propio programa y diagramas de flujo individuales para las subrutinas. Desde el momento en que se diagrama el flujo de la rutina, es muy fácil para el usuario asignar una etiqueta mnemotécnica a la subrutina básica.
En este texto se utilizan notaciones como LOOP, LOOP 1, etc. Para la instrucción ADD, entonces la etiqueta de su correspondiente bucle sería ADLP.
El ensamblador MCS650X permite seis espacios para las etiquetas. Es una buena práctica utilizar dos caracteres para identificar generalmente la subrutina, dos caracteres más con fines mnemotécnicos y luego un sistema de numeración que permita la correlación entre varias direcciones dentro de un LOOP en una subrutina. Al numerar estrictamente de manera que ADLP1 sea diferente de ADLP3, cada una de ellas pueden ser direcciones dentro del mismo LOOP.
Se asume que los PIA están conectados de manera normal: Dirección del Registro de Estado igual a Dirección del Registro de Datos + 1.
La siguiente tabla y diagrama de flujo definen el programa implementado en el ejemplo.


La tabla #1 contiene la dirección de todos los Registros de Estado del MCS6520.


La tabla #2 contiene la dirección de la ubicación de almacenamiento de los respectivos datos.



Usando etiquetas de seis caracteres, hay cien combinaciones de código que podrían usarse en una rutina o bucle determinado sin que el usuario tenga que pensar en el resto de la notación mnemotécnica. El uso de caracteres más un número para todas las referencias es una buena práctica de programación. La ventaja de utilizar esta técnica es que permite utilizar mnemotécnicos de tres caracteres sin interferir nunca con la palabra reservada de los mnemotécnicos OP CODE del microprocesador porque nunca tienen un número en el mnemotécnico.

11.5 PROGRAMA COMPLETO DE E/S


La figura 11.3 muestra el flujo del programa en apoyo al listado del Cross-Assembler (Ejemplo 11.9) de una rutina de tiempo compartido de un programa que ilustra el uso del direccionamiento Indirecto Indexado para realizar una búsqueda de ocho dispositivos que tienen señales activas para el servicio. La implementación de los ocho dispositivos se realiza con MCS6520s donde su estado corresponde a la bandera en el bit 7 del Registro de Control.



Ejemplo 11.8: Sondeo de la Señal Activa