Bmartindelbriosistemasmicroprocesadoresymicrocontroladores
Bmartindelbriosistemasmicroprocesadoresymicrocontroladores
Bmartindelbriosistemasmicroprocesadoresymicrocontroladores
Microprocesadores y
Microcontroladores
(6800 y 68HC11)
pastilla la mayor parte del sistema, y que está especialmente orientado a tareas de
instrumentación y control específicos.
Conjugando estas ideas hemos seleccionado un microprocesador y un
microcontrolador de la familia 68XX de 8 bits de Motorola. Esta familia, además
de ser la líder indiscutible del mercado mundial de los 8 bits, se ha distinguido
siempre por su pedagogía, gracias a su arquitectura sencilla y «lineal».
Así, emplearemos el clásico M6800 (antecesor del M68000) para ilustrar los
conceptos generales relativos al desarrollo de sistemas electrónicos basados en
microprocesadores. El 6800 (de la misma época que el 6502, Z80 o 8085), nos
permitirá estudiar todos los conceptos fundamentales relativos a la programación,
sistema de buses, conexión con periféricos, interrupciones, etc.; gracias a la
sencillez de su arquitectura, un alumno sin conocimientos previos de
microprocesadores podrá asimilarlo sin dificultad en el muy limitado espacio de
tiempo asignado a las actuales asignaturas universitarias cuatrimestrales.
Aunque el 6800 nos resultará de utilidad para aprender los conceptos
generales sobre microprocesadores, en la práctica el actual profesional de la
electrónica en la mayor parte de las ocasiones no construye sistemas basados en el
6800 (ni en el 8085 o el Z80), sino, más bien, en microcontroladores. Por ello,
introducidos los conceptos genéricos sobre sistemas microprocesadores, nos
centraremos en los microcontroladores. En este caso, emplearemos como
ilustración el M68HC11 de Motorola, un potente y bien conocido
microcontrolador de 8 bits, utilizado en infinidad de universidades de todo el
mundo para la enseñanza y desarrollo de proyectos. El núcleo interno del
68HC11 es un 6800 mejorado, por lo que todo lo aprendido para el 6800 se aplica
de forma directa al 68HC11 (en particular, el juego de instrucciones del HC11 es
una ampliación del del 6800), con lo que al alumno no le cuesta un esfuerzo
adicional su aprendizaje. Por lo tanto, el tándem 6800-68HC11 resulta
pedagógico y perfectamente representativo de los sistemas microprocesadores y
microcontroladores reales.
Además, el 68HC11 no sólo es un potente microcontrolador (de entre los más
empleados en el mundo); asimismo resulta una excelente herramienta educativa
que permite enseñar una enorme variedad de conceptos, gracias a los numerosos
periféricos que integra. Por otro lado, resulta extremadamente sencillo construir
un sistema mínimo basado en un 68HC11, y la grabación de un programa de
aplicación en su EEPROM interna desde un PC convencional resulta muy simple
y no requiere hardware adicional. Como su precio es relativamente asequible, el
alumno interesado puede experimentar con él con tan sólo un pequeño
desembolso económico (veáse el Apéndice C dedicado al «Kit del 68HC11»).
Prólogo IX
Conocimientos previos
Para poder seguir sin problemas este texto se requiere que el lector se
desenvuelva con soltura en el campo de la electrónica digital, resultando además
de utilidad conocimientos básicos de electrónica analógica. No es necesario
disponer de experiencia previa en programación.
Este libro representaría la continuación natural de un curso de electrónica
digital básica (como sucede en nuestra Escuela). En este sentido, nuestra obra
podría considerarse la segunda parte del libro de Tomás Pollán Santamaría
titulado Electrónica Digital [Pollán 94], al que en numerosas ocasiones haremos
referencia. En [Pollán 94] se introduce al alumno tanto en el diseño lógico como
en aspectos más electrónicos, tratándose al final las arquitecturas orientadas a bus,
memorias y conversión A/D y D/A; estos conocimientos se darán aquí por
Capítulo 1
Introducción y conceptos previos
transistores
100000000
10000000 Pentium
1000000 486
386
100000 80286
8085 8086
10000 8080
8008
1000
4004
100
1970 1975 1980 1985 1990 1995
año
FIGURA 1.1. Ilustración de la ley de Moore mediante la familia 80x86 de Intel. El eje de ordenadas
se representa en escala logarítmica, por lo que la recta que aparece como tendencia seguida indica
en realidad un crecimiento exponencial del número de transistores por chip.
Sensor
Procesamiento
Acondicionador Procesamiento
Digital Transmisión de
Acondicionador C. A/D Digital (mP) Acondicionador
datos
(µC, DSP)
Procesamiento
Proceso Procesamiento
Digital
(µP, µC, DSP,
Digital (mP)
computador)
Subsistema de Actuación
Actuador/ Actuación
Carga
Procesamiento
Acondicionador/ Procesamiento
Digital Transmisión de
Acondicionador
Potencia C. D/A Digital (mP) Acondicionador
datos
(µC, DSP)
Fuente de energía
FIGURA 1.6. Esquema de los grandes bloques que componen un procesador digital genérico.
12 Microprocesadores y microcontroladores
FIGURA 1.8. Estructura básica de una máquina de tratamiento de la información (tanto específica
como programable).
datos con los que opera su ALU. Así, se habla de µP de 4, 8, 16, 32 o 64 bits.
Generalmente, un mayor número de bits indica un µP más potente, pues es capaz
de procesar más cantidad de información a la vez, pero también resultará más
complejo y caro. Por ello, para cada aplicación particular debe elegirse el mP que
mejor se adapte a ella, es decir, con mejor relación prestaciones/precio.
Los µP también pueden clasificarse por el número de instrucciones que
incorporan en su repertorio. Así, se distingue entre microprocesadores CISC y
RISC:
a) CISC (Complex Instruction Set Computer). Computadores de extenso (amplio)
conjunto de instrucciones, es decir, aquellos µP que incluyen muchas
instrucciones diferentes (del orden de cien). El ejemplo clásico es la familia
Intel 80x86.
b) RISC (Reduced Instruction Set Computer). Son las máquinas de conjunto de
instrucciones reducido, es decir, incluyen relativamente pocas instrucciones en
su repertorio (del orden de treinta). Ejemplos de ello son las familias Alpha,
SPARC y PowerPC.
La distinción únicamente en cuanto al número de instrucciones que un µP
incorpora no permite apreciar a primera vista la gran trascendencia que conlleva,
que ha sido causa de una dura batalla en el estilo de diseño de µP en los últimos
años. Aunque uno pueda pensar que un microprocesador será más potente si
incorpora muchas más instrucciones, la tendencia actual parece mostrar lo
contrario. Profundizaremos en esta cuestión mucho más adelante en el curso.
piezas y pesa tres toneladas; para su confección se invirtieron nada menos que
600.000 dólares. Cabe señalar que, si la primera máquina de diferencias se
hubiese construido al completo, habría ocupado la superficie de un campo de
fútbol y debería haber sido impulsada mediante una máquina de vapor.
por otra parte, la figura de Ada está envuelta en un halo de misterio (quizás fruto
de la época romántica en la que vivió). Al parecer, buena parte de las
descripciones de la máquina analítica no proceden de Babbage sino de Ada, quien
pudo transcribir sus ideas.
FIGURA 1.13. Máquina de diferencias construida en 1991 por el Museo de Ciencias de Londres, en
la conmemoración del bicentenario del nacimiento de Babbage.
Ya en los años treinta del presente siglo el alemán Konrad Zuse, estudiante
de ingeniería, y al parecer sin disponer de conocimiento previo sobre los trabajos
de Babbage, construyó las primeras máquinas electromecánicas de cálculo
(haciendo amplio uso de relés). Buena parte de ellas fueron destruidas por el
bombardeo aliado sobre Berlín en 1944, y, aunque con posterioridad algunas
fueron instaladas en Europa, su trabajo no tuvo repercusión en el futuro, siendo
éste reconocido en sus justos términos muchos años después.
J. Astanasoff y C. Berry, físicos de la Universidad de Iowa, construyeron
también en los años treinta una máquina sorprendentemente avanzada para su
época, el ABC (Astanasoff-Berry Computer, 1939), en la que introdujeron
técnicas que serían implementadas en las computadoras posteriores, como el
empleo de aritmética binaria o un tipo de memoria basada en un tambor de
condensadores que debían ser refrescados periódicamente, precursores de las
actuales memorias dinámicas. El ABC permaneció en el olvido durante mucho
24 Microprocesadores y microcontroladores
tiempo, saliendo a la luz en los últimos años por un problema sobre la propiedad
de la patente original del computador. A raíz de ello, una sentencia judicial en
Estados Unidos estableció en los años setenta que el primer computador de las
historia con derecho a patente no es ENIAC (del que hablaremos más adelante),
como hasta entonces se daba por sentado, sino precisamente la máquina de
Astanasoff, de la que John Mauchley (uno de los autores de ENIAC) se comprobó
que tomó muchas ideas.
La última computadora mecánica a la que haremos referencia es el Mark I,
construida por Howard Aitken, la cual se concluyó en Harvard en 1944, siendo la
primera computadora de propósito general desarrollada en Estados Unidos.
Aitken construyó con relés lo que Babbage proyectó con ruedas dentadas,
alcanzando su máquina unas dimensiones finales de 17 metros de largo y 2,5 de
altura. Más adelante Aitken construyó la Mark II, pero cuando la concluyó las
computadoras electromecánicas eran ya obsoletas, pues había comenzado la era
de la electrónica.
Siglo La ingeniería eléctrica Faraday, Hertz, Edison, Ingeniería eléctrica: «paso de partículas
XIX Marconi cargadas a través de los metales».
El electrón (finales siglo S. XIX)
1885 Postulado del electrón H.A. Lorentz
Su descubrimiento J.J. Thonsom Descubrimiento experimental
Válvulas de vacío (principios S. XX)
1904 Diodo Fleming 1.ª válvula de vacío (det. señales inalámbr.)
1906 Triodo De Forest Como amplificador de señales
1920 KDKA Westinghouse 1.ª emisora de radiodifusión (Pittsburgh).
En 1924 hay ya 500 en EE.UU.
1930 TV en blanco y negro Radio y TV, impulsores de la electrónica
Transistores
1940 Bell labs. Tras el «amplificador de estado sólido»
1947 Prototipo de transistor Brattain, Bardeen, Shockley Inventan el transistor
1947 Transistor BJT Shockley Perfecciona el prototipo.
1951 Comercialización del BJT Bell, y otras La Bell no guarda en secreto la tecnología
El transistor FET Shockley Propuesta (todavía es pronto).
1954 Transistores de silicio Texas Instr.
1956 Premio Nobel de Física Brattain, Bardeen, Shockley 1.er Premio Nobel dispositivo ingeniería
Circuitos integrados SSI, MSI y LSI (1965-1977)
1958 El circuito integrado (CI) J. Kilby y R. Noyce Texas Instruments y Fairchild
1958 Primer transistor por Hoerni (Fairchild) Proceso planar y fotolitografía, se abren las
difusión moderno puertas a los MOSFET
1960 El primer MOSFET Kahng y Atalla Bell
1961 Comercialización del CI Texas Instruments, Fairchild Integración SSI (<100 transistores)
1964 Ley de Moore. CI lineales
1966 MSI (de 100 a 1.000)
1969 LSI (de 1.000 a 10.000)
1970 RAM Intel, Fairchild Comercialización de pastillas de RAM
1971 Microprocesadores Intel El i4004
Muy alta escala de integración (VLSI) (1977-hoy)
1977 VLSI (>10.000) µP de altas prestaciones, entre otros
1979 El PC
Electrónica e Informática Era de la información y comunicaciones
CPU (Microprocesador)
Unidad de Unidad de
Procesamiento Control Entradas/
Memoria Central
Salidas
Bus de Datos
Bus de Direcciones
Bus de Control
‘Z’ a conectarse de forma efectiva al bus de datos; el dato circulará por BDat en el
sentido indicado por una línea especial denominada de lectura/escritura (desde la
CPU hacia la memoria en caso de escritura, al revés en una lectura); esta última
línea y otras (como la de reloj) constituyen el bus de control, cuyo papel básico es
el de sincronizar la transferencia de la información.
El número de líneas del bus de datos determina la cantidad de información
(bits) que el microprocesador es capaz de mover en un solo paso. La CPU
contiene un bus de datos interno cuya anchura suele coincidir con el número de
bits de su ALU (unidad lógico-aritmética), cifra que se suele utilizar como
parámetro característico de la CPU (4, 8, 16, 32, 64 bits). Normalmente el bus de
datos externo, que constituye el bus del sistema, no es otra cosa que la
prolongación del interno, por lo que suelen tener la misma anchura; así, un
microprocesador de 8 bits suele tener un bus de datos externo de 8 bits (aunque en
algunos casos concretos ambos números no coinciden, p.e., el 8088 es un µP de
16 bits, pero su bus de datos externo posee tan sólo 8 líneas).
Por su parte, el bus de direcciones suele incluir un número más elevado de
líneas, p.e., en el caso de la mayoría de los µP de 8 bits este número es de 16, que
permiten acceder a 65536 registros de memoria (de 8 bits), es decir, 64 KB; en
general un BDir de n líneas puede acceder a 2n casillas de memoria. En
ocasiones, y para ahorrar patillas en el encapsulado del µP, las líneas de datos y
direcciones aparecen multiplexadas (p.e., en el 8085 o en el 68HC11), y
normalmente se demultiplexan mediante un registro de retención como el 74373.
En este sentido, se debe tener en cuenta que con frecuencia los buses que salen
directamente del microprocesador deben pasar por determinados circuitos
(registros, buffers, puertas lógicas) antes de configurar los buses del sistema (p.e.,
el bus del PC original no es el bus del 8088, sino que se deriva de él a partir de
circuitería); así, con una adecuada circuitería de conversión de buses, µP
diferentes pueden dar lugar a un mismo bus del sistema (un bus estándar).
Por último, las líneas del bus de control varían de un µP a otro. No obstante,
siempre habrá una o más líneas de reloj CLK o φ; una o más líneas de
lectura/escritura; y alguna línea de validación de direcciones VDIR y/o de datos
VDAT, que indican cuándo en el BDir existe una dirección válida, y cuándo en el
BDat existe un dato válido, respectivamente (todas estas líneas pueden recibir
denominaciones diferentes). En este sentido, existe un «estilo Intel» y un «estilo
Motorola» para los buses, claramente diferenciados.
Componentes del sistema microprocesador 37
FIGURA 2.2. Señales de bus estilo Intel y generación de las líneas del bus ISA.
Microprocesador Habilitación
(CPU) Decod. Habilitación
Direcc. Habilitación
R/W
VAL (lectura/ R/W R/W
(Validación) escritura)
Bus Datos
Bus Direcciones
Bus Control
FIGURA 2.4. Estructura de los buses de un sistema microprocesador; los bloques de memoria RAM,
ROM y entradas/salidas solamente se conectan al bus de datos cuando son habilitados por la línea
correspondiente del decodificador de direcciones (es decir, cuando en el bus de direcciones aparece
la dirección asignada a cada uno).
columna. En la fig. 2.5 (izda.) se muestra una celda básica de SRAM construida
en tecnología CMOS, compuesta por un biestable (los cuatro transistores más
internos), cuyas dos salidas Q y /Q (salida Q negada o invertida) se encuentran
conectadas a través de sendos transistores de paso a las líneas que enlazan con la
columna correspondiente: cuando se selecciona la fila en que se encuentra dicho
biestable, los transistores de paso conducen y conectan las dos salidas del
biestable con las líneas de columna, permitiendo una operación de lectura o de
escritura sobre él. Las SRAM se fabrican en chips de 2 KB, 8 KB y 32 KB, entre
otros formatos.
Para reducir el tamaño de la celda básica, y consiguientemente aumentar la
capacidad de almacenamiento de una pastilla, se integran memorias RAM
dinámicas o DRAM (Dynamic RAM, fig. 2.5, dcha.), en cuya celda básica el
biestable se sustituye por un condensador que almacena el valor booleano
(condensador cargado=estado ‘1’, descargado=‘0’). Estos condensadores
equivalen a la capacidad de puerta de los transistores MOS (unos 0,1 pF); debido
a pérdidas en el condensador, la conservación de la tensión por efecto capacitivo
no es indefinida, por lo que las memorias DRAM, aunque de elevada capacidad,
precisan de un refresco periódico (leer y volver a escribir) para no perder la
información almacenada en el condensador. En [Pollán 94, Slater 89] se describe
con mayor detalle los mecanismos de lectura y escritura en pastillas DRAM; aquí
simplemente haremos notar que la peculiar distribución de las pastillas de los
chips de memoria DRAM complica la construcción de circuitos. Por otro lado,
señalaremos que es común comercializar este tipo de memoria en forma de
módulos DRAM, que incluyen varias pastillas sobre una pequeña tarjeta dotada de
conectores estándar (se emplean en la memoria central de los computadores,
donde se necesita un gran volumen de memoria).
En resumen, la SRAM es una memoria rápida que no requiere refresco; por
contra, resulta cara debido a que requiere 6 transistores por celda básica. En
cambio, la DRAM es una memoria mucho más barata, que permite almacenar
grandes cantidades de memoria en un solo chip, pero requiere de refresco y su
manejo resulta bastante más complejo. Cuando se requieren cantidades grandes
de memoria RAM (como en los ordenadores) se emplea DRAM. Recientemente
se ha comercializado un tipo especial de memoria DRAM denominada DRAM
síncrona o SDRAM, que se emplea en los computadores; la SDRAM no debe
confundirse con la memoria SRAM, pues se trata de RAM dinámica cuyos
procesos de lectura y escritura se marcan por flancos de señales en vez de por
niveles (como es usual), con el fin de reducir los tiempos de acceso.
Componentes del sistema microprocesador 41
Vcc
/Q Q
Selección
de fila Selección de fila
FIGURA 2.5. Celda básica de una pastilla SRAM (izda.) y de una DRAM (dcha.).
Vcc
+Vcc o 0V +Vcc o 0V
FIGURA 2.6. Celda básica de un chip de memoria ROM (izda.), PROM (centro) y EPROM (dcha.).
fabricación del circuito integrado (lo cual sólo resulta rentable para una serie
elevada, de miles de circuitos). La densidad de almacenamiento de una ROM
programable por máscara es obviamente muy elevada y, cuando se fabrican por
miles de unidades, resulta muy barata.
Para permitir que un usuario cualquiera pudiera programarse sus propias
memorias ROM, se introdujeron las ROM programables o PROM (Programmable
ROM). En éstas la eliminación de un fusible (fig. 2.6, centro) mediante pulsos de
elevada corriente (suministrada mediante un aparato programador de memorias)
determina el estado ‘1’ o ‘0’ a almacenar. Obviamente, la programación de este
tipo de memorias tiene un carácter destructivo, de modo que solamente pueden
programarse una vez.
Las EPROM (Erasable PROM), por contra, son memorias PROM borrables
y, por tanto, programables repetidas veces. Éstas se basan en transistores MOS de
doble puerta (fig. 2.6, derecha), una de ellas flotante entre la convencional y el
substrato, la cual puede almacenar una carga cuando la puerta convencional es
sometida a una tensión relativamente elevada (unos 20 voltios). La operación de
borrado se basa en la pérdida de la carga almacenada en la puerta central al ser
irradiada por luz ultravioleta; para ello el encapsulado de las memorias EPROM
(que es cerámico) está dotado de una ventana de cristal de cuarzo. Así, una
EPROM convencional puede re-programarse unas 100 veces, aunque, por contra,
resulta bastante más cara que una PROM. Se comercializan chips EPROM de 2
KB, 4 KB, 8 KB, 16 KB, 32 KB y 64 KB.
Otro tipo de memoria no volátil es la EEPROM (Electricaly Erasable
PROM); se trata de PROM borrables y grabables eléctricamente, basadas en un
principio parecido a las EPROM, sólo que permiten también su borrado mediante
pulsos de tensión de signo contrario a los de programación. Aunque
funcionalmente la EEPROM se comporta como una RAM, pues resulta escribible
y borrable eléctricamente, en realidad sus tiempos de re-escritura o borrado son
mucho mayores que los de un chip RAM convencional (del orden de 10
milisegundos). Una EEPROM puede re-programarse unas 10.000 veces, y los
chips modernos integran también la circuitería necesaria para generar la tensión
de programación a partir de la alimentación de 5 voltios (bomba de carga). Se
comercializan chips EEPROM de 2 KB, 8 KB, y 32 KB, entre otros.
Recientemente se ha introducido un nuevo tipo de memoria ROM
denominada flash (o flash EEPROM), que cuenta con una creciente popularidad.
Al igual que los chips EEPROM tradicionales, resulta ser escribible y borrable
eléctricamente, pero su organización es más sencilla, por lo que puede integrarse
en cantidades mucho mayores (prácticamente, como la EPROM), aunque como
contrapartida su grabación no puede realizarse sobre bytes individuales, sino que
Componentes del sistema microprocesador 43
debe efectuarse por bloques de bytes (eso sí, en tiempos inferiores a los de la
EEPROM). Este tipo de memoria suele emplearse para almacenar programas de
tamaño grande, comercializándose incluso los denominados «discos flash», que
pueden contener cientos de KB de información, comportándose como un «disco
duro de silicio», y que resulta muy útil en el caso de los sistemas pequeños o
donde se requiera de una robustez mecánica que no ofrecen los discos duros
tradicionales.
Existen algunos tipos de memoria a caballo entre las volátiles y las no
volátiles. Por ejemplo, las pastillas RAM con batería de respaldo, o battery-
backed RAM, son circuitos integrados que incorporan una pequeña batería de litio
que asegura el mantenimiento de la información en ausencia de alimentación
externa durante unos 10 años. Esta memoria está dotada de un circuito que
cuando detecta la pérdida de tensión conmuta la alimentación de la memoria a la
batería de respaldo. Otro tipo son las denominadas RAM no volátiles o NVRAM,
que integran por cada celda RAM una de EEPROM de respaldo; normalmente se
trabaja con las celdas RAM, pero cuando se aprecia un principio de caída en la
tensión de alimentación se procede a guardar el contenido de la RAM en las
celdas EEPROM. La compañía Xicor está especializada en este tipo de
dispositivos de memoria (http://www.xicor.com).
En la fig. 2.7 se muestra el patillaje de algunas pastillas de memoria
comerciales. Hay que tener en cuenta que afortunadamente existe una
denominación y patillaje estándar para los diversos circuitos de memoria que
comercializan los distintos fabricantes. Por ejemplo, las pastillas EPROM suelen
comenzar con el código ‘27’, mientras que las de EEPROM empiezan por ‘28’.
FIGURA 2.8. Modelo de la estructura interna de una pastilla de memoria, y conexión a los buses del
sistema microprocesador.
Componentes del sistema microprocesador 45
Habilitación
Habilitación
Microprocesador Decod. Habilitación
(CPU) Direcc. Habilitación
R/W
VAL R/W R/W R/W
A11-A15
Bus Datos
A0-A15 A0-A10 A0-A10 A0-A10 A0-A10
Bus Direcciones
Bus Control
FIGURA 2.10. Decodificación del bus de direcciones y selección de las pastillas de memoria.
48 Microprocesadores y microcontroladores
Este proceso se lleva a cabo cuando R/W señala escritura y VAL (validación)
está activada. De los múltiples tiempos que pueden tomarse en consideración,
caracterizaremos la operación de escritura con el tiempo de acceso de escritura.
Como ya se ha comentado, la magnitud de los dos tiempos de acceso citados es
parecida, por lo que se suele dar un tiempo de acceso que caracteriza
genéricamente la memoria.
Placa CPU
Microprocesador
(CPU)
Módulo de Memoria
Memoria Masiva
Memoria Central (disco duro ...)
Memoria
Caché
Bus de Datos
FIGURA 2.13. Estructura simplificada de una UP de tres buses. El grupo de registros de propósito
general suele denominarse banco de registros.
Si con una ALU de este tipo se desea llevar a cabo una suma de tres
operandos, como la del caso anterior, ésta habría que «simularla» cargando en el
acumulador A el primer operando mediante una instrucción LDAA (LoaD
Accumulator A), sumando el segundo operando con ADDA y guardando el
Componentes del sistema microprocesador 57
a) b)
casilla de memoria
IR opcode y contenido
dirección
DR dato (8 bits)
14 1000
FIGURA 2.16. Esquema global del sistema microprocesador, e ilustración de la fase de carga del
código de operación (pasos (a) a (e)) descrita en el texto.
se encuentra justo a continuación del opcode, en las casillas 2001 y 2002, por lo
que deberá buscarla y traerla por el bus de datos. Como el BDat es de 8 bits y la
dirección es de 16, deberá traerla en dos pasos, primero la parte alta H (high) y
luego la baja L (low). Este proceso de búsqueda de la dirección se llevará a cabo
de la siguiente manera para la parte alta de la dirección (recordemos que el PC
apunta ya a la casilla 2001):
f) BDir←(PC)
g) MAR←(BDir)
h) MDR←((MAR))
i) BDat←(MDR) , PC←(PC)+1
j) ARH←(BDat) Carga 10 en la parte alta de AR (reg. aux. direc.)
y el mismo proceso para la parte baja de la dirección:
k) BDir←(PC)
l) MAR←(BDir)
m) MDR←((MAR))
n) BDat←(MDR) , PC←(PC)+1
ñ) ARL←(BDat) Carga 00 en la parte baja de AR (reg. aux. direc.)
En este preciso instante el secuenciador sabe ya que el dato se encuentra
almacenado en la casilla 1000 de memoria (contenido del registro auxiliar de
direcciones AR=ARH:ARL). Procedería entonces a ejecutar la instrucción,
tomando el contenido de la casilla 1000 de memoria y depositándolo en A, para lo
que ejecutará los siguientes pasos
o) BDir←(AR) Toma del AR la direc. donde está el dato (1000)
p) MAR←(BDir) Lectura de memoria
q) MDR←((MAR))
r) BDat←(MDR)
s) A←(BDat) Carga dato en casilla 1000 (14) en el registro A
o) PC←(AR)
2.6.3. Cuestiones finales (avanzadas)
En la literatura de organización de microprocesadores y computadores (ver,
p.e., [Aleksandridis 84, Stallings 97]) un acceso a memoria como los descritos se
denomina ciclo de bus o de máquina. Como hemos visto en el ejemplo anterior,
la ejecución de una instrucción implica varios ciclos de bus (accesos a memoria),
y cada uno de ellos comprende a su vez varios pasos más elementales, que se
denominan estados de la máquina. Un estado representa, visto desde fuera de la
CPU, la «unidad mínima de actividad de la máquina» (estados son «captura de
opcode», «acción de reset», «estado de interrupción», etc.), y todos tienen la
misma duración, un ciclo de reloj. Cada estado comprende a su vez la ejecución
de una o más microoperaciones, como las descritas en el apartado anterior.
Como hemos señalado, un ciclo de bus puede comprender uno o más estados,
por lo que distintos tipos de ciclos de bus («carga de instrucción», «lectura de
memoria», «lectura de un puerto de E/S», etc.) pueden tener una duración
diferente (uno o más ciclos de reloj, a menudo de 2 a 8). Por ejemplo, se tiene
que en el clásico 8086 un acceso a memoria comprende varios estados, cada uno
de un ciclo de reloj, con lo que cada acceso a bus requiere varios ciclos de reloj.
Por contra, en el caso del 6800 que estudiaremos a fondo a continuación (y
que ha inspirado la descripción realizada de la CPU genérica), ciclo de bus y
estado es lo mismo, por lo que un acceso a memoria se realiza en un solo ciclo de
reloj. En el 6800 se contemplan tan sólo tres tipos de ciclos de máquina: lectura
(la CPU toma un byte de memoria), escritura (la CPU lleva un byte a memoria) y
operación interrumpida (la CPU está ocupada y no accede a los buses).
66 Microprocesadores y microcontroladores
3.1. Introducción
Establecidos ya los conceptos generales de la estructura de un
microprocesador genérico de 8 bits y los elementos que componen el sistema, en
este capítulo trataremos el caso concreto del M6800, como ejemplo típico de un
microprocesador de 8 bits. Tras el 6800 estudiaremos el microcontrolador
M68HC11. Ambos microprocesadores son miembros de la famosa familia 68 (de
8 bits) de Motorola.
Antes de comenzar en materia nos gustaría realizar un comentario previo. En
la actualidad nunca se empleará un microprocesador de 8 bits como el 6800 (ni el
8085 o el Z80) para resolver una aplicación real; únicamente estudiaremos el
6800 por motivos pedagógicos, como medio de introducir al alumno en los
detalles del desarrollo de sistemas microprocesadores. En la práctica real se
empleará un microcontrolador como el 68HC11 (o el 6805, o el 8051, o un PIC),
mucho más moderno, potente y con memoria y periféricos integrados, que
simplifican enormemente el desarrollo de una aplicación relacionada con la
electrónica industrial o de consumo.
de datos que utiliza, sus registros internos deben ser refrescados periódicamente,
por lo que se exige que siempre opere a una frecuencia superior a 0,1 MHz. Otras
versiones permiten trabajar a frecuencias más altas, p.e., el MC68A00 puede
operar hasta a 1,5 MHz, y el MC68B00 alcanza los 2 MHz.
Estas frecuencias de reloj no deben llevar a engaño, pues, aunque algunos
microprocesadores de similares características, como el Z80 o los de Intel,
trabajan a frecuencias sensiblemente más altas (varios MHz), el 6800 lleva a cabo
un ciclo de bus (una lectura o escritura en memoria) en un solo ciclo de reloj,
mientras que, por ejemplo, el Z80 precisa de 3 o 4 ciclos de reloj, por lo que la
velocidad efectiva de un 6800 a 1 MHz es similar a la de un Z80 a 4 MHz.
El M6800 posee 8 líneas de datos y 16 líneas de direcciones, por lo que
puede direccionar un espacio de memoria de 64K bytes. Posee 7 modos de
direccionamiento y 72 instrucciones de diferentes longitudes, compuestas por lo
menos por un código de operación de 8 bits, pudiendo incluir a continuación un
dato o dirección de 8 o 16 bits (por lo tanto, una instrucción puede incluir en total
uno, dos o tres bytes). Opera en aritmética entera de 8 bits en complemento a dos
y, a diferencia de otros (como los de la familia Intel), el 6800 es un µP con pocos
registros, realizando muchas de las operaciones directamente sobre datos de
memoria, apoyándose en uno de sus dos registros acumuladores A y B.
SP
PC
CCR 1 1 H I N Z V C
FIGURA 3.2. Registros del M6800 accesibles al programador («modelo del programador»).
• φ1 y φ2, son las entradas del reloj. El M6800 precisa de un reloj de dos fases
no solapadas (fig. 3.4), que serán generadas por un circuito externo de reloj.
Una versión posterior denominada 6808 incorporaba CPU y circuito de reloj
(éste no debe confundirse con el moderno microcontrolador 68HC08).
• /HALT y BA (Bus Available), líneas de alto (entrada) y bus disponible (salida).
Son líneas de petición y confirmación de DMA, respectivamente. Cuando un
dispositivo externo quiere realizar una DMA, activa la línea /HALT
(/HALT=‘0’), el µP, al reconocer la solicitud de DMA, y una vez ha concluido
la ejecución de la instrucción en curso (por lo que puede demorarse varios
ciclos de reloj), pone en alta impedancia las líneas VMA y R/W, y activa la
línea de «bus disponible» BA (BA=‘1’), indicando al dispositivo solicitante
que puede tomar el control del bus del sistema.
• TSC (Tri-State Control) y DBE (Data Bus Enable), entradas de control tri-
estado y de habilitación del bus de datos. Cuando se activa TSC, las líneas de
direccionamiento y R/W se ponen en alta impedancia. DBE cumple el mismo
papel para el bus de datos, de modo que es necesario mantener DBE activa
para que las líneas de datos permanezcan habilitadas, por lo que en operación
normal debe mantenerse conectada a φ2. TSC y DBE también intervienen en
ciertas operaciones de DMA.
• /IRQ (Interrupt ReQuest) y /NMI (Non-Maskable Interrupt), líneas de solicitud
de interrupción enmascarable y no enmascarable (entradas). Cuando un
dispositivo periférico activa la interrupción enmascarable (/IRQ=‘0’), si I=‘0’,
se ejecuta su rutina de servicio. /NMI se suele reservar para responder a
condiciones de emergencia, como, por ejemplo, fallos en la alimentación.
/IRQ es sensible a niveles, /NMI a flancos.
• /RESET, entrada de reset. Sirve para arrancar o iniciar el microprocesador,
colocando a cero sus registros, y cargando en el PC los dos bytes almacenados
en las casillas $FFFE y $FFFF, los cuales representan la dirección donde se
encuentra la primera instrucción a ejecutar (en la nomenclatura empleada por
Motorola el símbolo ‘$’ indica que un número es hexadecimal, y ‘%’ binario).
• Vss (dos pines) y Vcc. Líneas de tierra y alimentación (+5 voltios).
• Existen dos patillas adicionales no conectadas (aparecen como N.C. en las
hojas de características).
Remitimos al lector interesado en más detalles a las hojas de características
del M6800 [Motorola 75, 76].
74 Microprocesadores y microcontroladores
FIGURA 3.4. Las dos fases de reloj (no solapadas) del M6800.
FIGURA 3.5. Circuito generador de reloj MC6870A de Motorola (dos fases de 2MHz; incluye cristal
de cuarzo y circuitería).
Normalmente, las n líneas más bajas del bus de direcciones se conectan a los
terminales A0 a A(n−1) de cada pastilla, y el resto servirán de entradas al
decodificador de direcciones del sistema, cuya salida se encargará de activar las
líneas de selección de cada chip solamente cuando en el bus de direcciones
aparezca alguna de las direcciones que han sido asignadas a la pastilla concreta.
Como es bien sabido, el decodificador de direcciones es un bloque
combinacional, que para el caso de sistemas con un pequeño número de elementos
(uno o dos) se suele construir haciendo uso de simples puertas lógicas, mientras
que, si se debe seleccionar un número mayor de elementos (por ejemplo, ocho),
suele emplearse un decodificador integrado, como los 74138, 74139 y 74154.
Por otro lado, algunas pastillas poseen varias líneas de selección /CS o /CE, que
pueden ser empleadas para la decodificación ahorrando puertas o incluso todo el
bloque decodificador. También para simplificar la circuitería suele realizarse una
decodificación parcial (sobre un número reducido de líneas de direcciones), como
se comentó ya en el capítulo anterior, aunque deberá tenerse en cuenta que en este
caso a cada registro le corresponderá más de una dirección en el mapa de memoria
(lo cual no tiene por qué causar problemas).
Aunque podía haberse realizado la decodificación directamente con puertas,
en el diagrama de la fig. 3.6 se ha empleado un esquema de decodificación parcial
basado en un 74138, para así ilustrar la situación más habitual. El 74138 dispone
de tres entradas de habilitación, G1, /G2A y /G2B (todas deben ser activadas), y
tres entradas, A, B y C, que permiten seleccionar uno de 8 dispositivos (salidas de
selección activas en bajo).
Para completar el cuadro debe tenerse presente que la selección de una
pastilla de memoria en un sistema microprocesador solamente debe hacerse
efectiva cuando tanto en el bus de direcciones como en el de datos las señales
presentes sean válidas. En el M6800 esta situación se corresponde con que la fase
φ2 del reloj esté activa (fase en la que se realizan los accesos al exterior) y que la
señal VMA (dirección de memoria válida) esté también en alto. Por lo tanto,
ambas líneas, φ2 y VMA, deben utilizarse también para seleccionar una pastilla de
memoria (o, en general, cualquier dispositivo conectado al bus, como pueda ser
un puerto de E/S), de modo que, si suponemos una única patilla de habilitación
/CS, la condición de selección de chip será la siguiente:
CS = VMA. φ 2. DIR
siendo DIR una hipotética línea de salida de un bloque decodificador de
direcciones, que valdrá ‘1’ cuando la dirección presente en el bus se corresponda
6800 y 68HC11 79
con alguna de las asignadas al chip en el mapa de memoria (en la práctica, los
decodificadores de direcciones suelen enviar señales activas en ‘0’).
Finalmente, obsérvese que en la fig. 3.6 la señal φ2 de tipo TTL que parte del
circuito generador de reloj se amplifica antes de ser llevada al resto de los
circuitos del sistema (φ2 amplificada suele denominarse reloj E). Por su gran
importancia, queremos remarcar que ésta es una práctica habitual para que la
señal de reloj, de papel fundamental en la sincronía de los elementos del sistema,
llegue con suficiente «fuerza» a todos los integrados, y que además impida la
posible transferencia de ruido, sobreoscilaciones o cualquier otra perturbación
desde el sistema al microprocesador.
Con todos los datos ya sobre la mesa, procedamos a la conexión de una
pastilla de 128 bytes de RAM (6810), otra de 2 K EPROM (2716) y un adaptador
paralelo PIA 6821 (que incluye cuatro registros, seleccionables con las líneas RS0
y RS1, es decir, equivale a efectos de decodificación a una pastilla de 4
direcciones de memoria). Por los motivos que estudiaremos algo más adelante, la
RAM de un sistema 68 usualmente se coloca en la parte baja del mapa de
memoria (a partir de la dirección 0, o $0000 en hexadecimal), la ROM/EPROM
en la parte alta (hasta la última casilla de memoria, la 65536 o $FFFF), y los
puertos de entrada/salida en zonas intermedias. Por lo tanto, podemos proponer el
siguiente mapa de memoria:
RAM 0000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
007F 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1
PIA 8000 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
8003 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
ROM F800 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
FFFF 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Para discriminar tres elementos (RAM, EPROM, PIA), bastan dos líneas de
direcciones; del esquema anterior seleccionamos A15 y A14, cuyas
combinaciones 00, 10 y 11 permiten distinguirlos (decodificación parcial). Estas
dos líneas, por lo tanto, serán las entradas del bloque decodificador. Si utilizamos
80 Microprocesadores y microcontroladores
Voltage); los valores concretos para cada señal del sistema pueden consultarse en
las hojas de características del MC6800. Valores intermedios a estas dos
tensiones se consideran no válidos.
Comienzo de ciclo.
6800 pone dirección,
VMA y R/W PC←(PC)+1
Fin de ciclo
Ciclo de bus (tciclo)
VIHMIN
V
φ1 ILMAX CPU prepara
acceso bus
Lectura/escritura
φ2 dato
FIGURA 3.8. Acciones que emprende la CPU en cada punto de las fases del reloj.
Cuando φ1 empieza a subir, se inicia el ciclo de bus; una vez alcanza VIHMIN,
el 6800 establece el valor de las líneas de direcciones A0-A15, pone R/W a ‘1’ o
‘0’ (según vaya a realizar una lectura o una escritura), y coloca VMA a ‘1’,
indicando que ya existe una dirección válida de memoria en el bus de direcciones.
El tiempo que transcurre entre el inicio de este proceso y la estabilización de los
valores en el bus constituye el denominado tiempo de retraso de la dirección, tAD
(Address Delay) (véanse los cronogramas de las figs. 3.9 y 3.10). Cuando φ1
comienza a descender, concluye esta primera fase; si procede, en este instante se
incrementa el valor del contador de programa PC.
A partir de aquí hay que distinguir entre lectura y escritura. Si el acceso es de
lectura (fig. 3.9), cuando φ2 (E) comienza a ascender, la transición de φ2 de ‘0’ a
‘1’ marca el inicio de la solicitud a la pastilla de memoria (o puerto) de colocar el
dato en el bus, ya que esta señal se emplea en la decodificación de memorias y
puertos, y del cronograma observamos que es la última en activarse (previamente
lo han hecho A0-A15, VMA y R/W). El tiempo de establecimiento de la
dirección, tAS (Address Setup Time), es el tiempo mínimo que las líneas A0-A15,
6800 y 68HC11 83
VMA y R/W deben permanecer estables antes de este hecho, y se permite que la
pastilla tarde un tiempo tDDR , retraso permitido a los datos (Allowable Data Delay
(Read)), en poner el dato en el bus (350 ns como máximo). El tiempo total que
transcurre entre la solicitud y la colocación efectiva del dato por la pastilla de
memoria (junto a su estabilización) se denomina tiempo de acceso, tacc (Access
Time), tacc= tAS+tDDR, que a lo máximo es de 540 ns en un 6800 a 1 MHz (por lo
tanto, no se requieren memorias rápidas).
Concluyendo con el proceso de lectura, en el momento en que φ2 retorna a
cero la CPU retiene el dato presente en el bus; el tiempo que dicho dato debe
mantenerse previamente estable para una lectura correcta se denomina tiempo de
establecimiento de datos en lectura, tDSR (Data Setup Time (Read)) (los datos
tienen que permanecer estables por lo menos durante 100 ns, tabla 3.1). Con ello
se da por concluido el ciclo de bus.
Por otro lado, en una escritura (fig. 3.10), en la transición de φ2 a ‘1’ el 6800
inicia el proceso de colocar el dato en el bus de datos; el período que transcurre
entre este hecho y el establecimiento del dato válido en el bus se denomina tiempo
de retraso de datos en escritura, tDDW (Data Delay Time (Write)).
De entre el resto de los tiempos que pueden considerarse [Motorola 76],
concluiremos explicando los tiempos de mantenimiento (hold). El tiempo de
mantenimiento de datos de entrada, tH (Input Data Hold Time) es el tiempo
mínimo que deben mantenerse los datos en el bus tras acabar la fase de lectura (φ2
retorna a ‘0’) para que sean leídos correctamente. Por otro lado, el tiempo de
mantenimiento de datos de salida, tH (Output Data Hold Time), es el tiempo que
el dato permanece válido en el bus una vez concluye la fase de escritura (φ2
retorna a ‘0’). Por último, el tiempo de mantenimiento de la dirección, R/W y
VMA, tAH (Address Hold Time) es el tiempo durante el cual estas señales
permanecen válidas una vez concluye el ciclo de bus (lectura o escritura).
En las figuras indicadas se presentan los cronogramas de los ciclos de lectura
(fig. 3.9) y escritura (fig. 3.10) en un 6800, cuyos tiempos vienen expuestos en la
tabla 3.1. Recordemos que las señales sólo son válidas por debajo de VILMAX o por
encima de VIHMIN.
84 Microprocesadores y microcontroladores
tciclo
φ1
tr
φ2
tAD
R/W
tAH
A0-A15
tAS tDDR
VMA
tDSR tH
tAD tacc
D0-D7
Datos
Válidos
FIGURA 3.9. Ciclo de lectura (1.000 ns de tiempo de ciclo). Notas: tr es el tiempo de subida (rise
time); normalmente E (φ2) se emplea en la decodificación de memorias y puertos, por lo que incluimos
los tiempos tAS y tDDR (tacc=tAS+tDDR) referidos al comienzo de E=‘1’.
tciclo
φ1
tr
φ2
tAD
R/W
tAH
A0-A15
VMA tDDW
tAD tH
D0-D7
(DBE=φ2)
Datos
Válidos
TABLA 3.1. Tiempos en las operaciones de lectura y escritura (en nanosegundos), operando a una
frecuencia de 1 MHz (solamente se muestran los más característicos [Motorola 76]).
+5 v. +5 v.
10 K 10 K
100
/RESET
/RESET
1 µF 1 µF
74HC14
por un lado para proteger al propio microprocesador del citado problema. Por
otro lado, en algunos microcontroladores, como es el caso del 68HC11, la patilla
de RESET es bidireccional y, si accidentalmente queda configurada como salida,
podría dañarse al ser conectada a una tensión fija.
TABLA 3.2. Mercado mundial de microcontroladores de 8 bits durante los años noventa en unidades
vendidas (fuente: Dataquest). Motorola domina claramente el mercado con su familia 68xx; resulta
también destacable la espectacular evolución de los PIC Microchip y el descenso de Intel.
siempre el líder y que Intel ha ido perdiendo posiciones hasta desaparecer del top
10).
de registros del HC11 incluye los del 6800, con las siguientes salvedades (fig.
3.12):
a) Puede trabajar con los acumuladores A y B independiente, o como si de un
único registro de 16 bits se tratase (denominado D).
b) Se incluye un nuevo registro índice, el Y, de similares características al X.
c) Algunos opcodes son de 8 bits y otros de 16, por lo que el IR es de 16 bits.
d) El CCR incluye dos nuevos indicadores (flags), el S y el X
A B
D
SP
PC
CCR SXHINZVC
FIGURA 3.13. Patillaje de dos de las versiones más usuales del M68HC11. En las versiones PLCC-
52 el puerto E tiene 8 pines, y en las DIP-48 tan sólo 4 (se pierden cuatro líneas).
94 Microprocesadores y microcontroladores
FIGURA 3.14. Bloques internos del 68HC11A8. Se muestra el papel de cada uno de sus patillas, en
modo normal y expandido (líneas entre corchetes).
Por otra parte, el registro CONFIG ($103F), que es de tipo EEPROM (por lo
que se graba de igual forma que la memoria EEPROM, y mantiene los datos al
retirar la alimentación), establece la configuración de partida del chip tras un
reset, según se indica en la fig. 3.17. Éste se comporta de igual modo para el A8 y
el E9, aunque difiere en el caso de la versión E2 (ver más adelante).
103F
1000 Reg. Conf. Bloque de 64 registros
de configuración (64 bytes)
(puede ser recolocado a partir de
cualquier posición múltiplo de 4K)
00FF
0000 RAM RAM de 256 bytes
(puede ser recolocada a partir de
cualquier posición múltiplo de 4K)
FIGURA 3.15. Mapa de memoria del MC68HC11A8 (en modos normales de operación).
$103D RAM3 RAM2 RAM1 RAM0 REG3 REG2 REG1 REG0 INIT
7 6 5 4 3 2 1 0
FIGURA 3.16. Registro INIT ($103D), de tipo EEPROM, cuyo contenido es solamente alterable en los
primeros 64 ciclos de reloj que siguen al reset.
98 Microprocesadores y microcontroladores
ROM/EPROM
COP ‘0’ no habilitada
Seguridad (opción ‘0’ habilitado ‘1’ habilitada
sólo de máscara) ‘1’ no habilitado
EEPROM
‘0’ habilitada
‘0’ no habilitada
‘1’ no habilitada
‘1’ habilitada
COP
Seguridad (opción ‘0’ habilitado
sólo de máscara) ‘1’ no habilitado
EEPROM
‘0’ habilitada
‘0’ no habilitada
‘1’ no habilitada
‘1’ habilitada
FIGURA 3.17. Registro CONFIG ($103F) de tipo EEPROM. El superior es el incluido en los HC11
convencionales (A8 y E9); el inferior es el del 68HC811E2, sin ROM y con 2 K EEPROM.
TABLA 3.4. Algunas versiones del MC68HC11. Todas incluyen los mismos bloques internos
(puertos, conversor...), aunque sus características concretas pueden variar en detalles.
FIGURA 3.18. Algunas versiones del MC68HC11. Los pines de la A1 y A0 coinciden con la A8
mostrada; la E9 no existe en versión DIP; finalmente, la versión PLCC de la E2 coincide con la E9.
6800 y 68HC11 101
habilitado cuando AS=‘1’, con lo que toma el valor bajo del bus de direcciones, y,
cuando AS retorna a ‘0’, este valor queda retenido).
Tras la demultiplexación, la única diferencia aparente entre los buses del
68HC11 y los del 6800 son las líneas de validación y de reloj, VMA, φ1 y φ2 en
el caso del 6800, y tan sólo el reloj E en el HC11. En el microcontrolador
68HC11 las fases φ1 y φ2 son internas, por lo que solamente presenta al exterior
la φ2 en la forma de reloj E, para sincronizar las operaciones del sistema de buses;
VMA no aparece en el HC11.
FIGURA 3.20. MC68HC11A8 configurado en modo expandido [Motorola 91]. Las ocho resistencias
de la parte superior mantienen las líneas de datos a ‘1’ para evitar que «floten» cuando el bus de
datos queda en alta impedancia.
104 Microprocesadores y microcontroladores
E=‘1’, acceso a
Incicio de ciclo memoria o periféricos
de bus tciclo=500 ns
Fin de ciclo
de bus
Reloj E
R/W
A8-A15
AD0-AD7
(Lectura) Dirección Dato
AD0-AD7
(Escritura) Dirección Dato
AS
FIGURA 3.21. Cronograma de lectura y escritura de los buses externos de un 68HC11 en modo
expandido a 2 MHz (500 ns de tiempo de ciclo).
E y R/W son señales válidas en todos los ciclos de bus, incluidos los accesos
a memoria interna. R/W indica el sentido de los datos (lectura o escritura) y E
habilita los dispositivos externos para recibir un dato o para que envíen un dato
(es E quien porta la información de sincronismo).
Por otro lado, cuando en modo expandido el HC11 direcciona memoria
interna, mantiene el bus de datos externo en alta impedancia, pero A0-A15, AS y
R/W sí son siempre significativos (puede apreciarse que en el cronograma nunca
aparecen en alta impedancia, excepto A0-A7, pero éstas, a su vez, son mantenidas
en valores correctos por el 74HC373). Por tal circunstancia, no es recomendable
el empleo de la técnica de decodificación parcial cuando se coloca memoria RAM
externa, pues al escribir en memoria interna podría producirse también la escritura
de datos erróneos en la RAM externa [Peatman 88]. Obsérvese que en la fig. 3.20
se lleva a cabo una decodificación parcial, pero en este caso tan sólo se ha
colocado externamente memoria EPROM, por lo que no puede darse una escritura
errónea sobre ella. En resumen, cuando se debe colocar RAM externa se
recomienda realizar el mapa de memoria completo del sistema, teniendo en cuenta
tanto los bloques de memoria internos como externos, y realizar externamente una
decodificación total sobre las líneas de direccioness.
V /RESET
5 v.
4.65 v.
Alimentación
FIGURA 3.23. Señal de /RESET generada por niveles; ésta se mantiene en bajo hasta que la tensión
de alimentación supera un umbral de 4,65 voltios.
6800 y 68HC11 107
FIGURA 3.24. Circuito de reset propuesto por Motorola para el HC11 [Motorola 91].
de los diferentes pines del HC11 hacen que cada tipo de entrada requiera una
terminación diferente (como siempre, remitimos al manual de referencia del HC11
[Motorola 91] a los interesados en aclarar o profundizar en detalles):
• Las entradas de /RESET, XTAL, MODA y MODB siempre deben conectarse
apropiadamente; no tiene ningún sentido dejarlas al aire.
• Las tensiones de referencia del conversor A/D, VrH y VrL, no necesitan ser
terminadas, pues estos pines no están conectados a ninguna puerta CMOS,
sino a un bloque analógico interno. No obstante, se recomienda su
polarización y estabilización mediante redes RC, tal y como sugiere el
fabricante (fig. 3.19).
• Los pines sólo de entrada no utilizados deben ser conectados a Vdd o a 0 V a
través de una resistencia de 4K7. Aunque una resistencia común para todos
puede ser suficiente, se recomienda el empleo de resistencias individuales para
facilitar posibles futuros cambios en el circuito.
• Los pines de E/S no utilizados, o bien se configuran en la rutina de arranque
como salidas o, mejor aún, pueden polarizarse de la misma forma que se indicó
para los pines sólo de entrada (aunque los configuremos como salidas en la
rutina de reset, durante breves instantes pueden ser entradas al aire).
• El puerto E es especial, al conectarse a un sistema analógico y, en general, no
requiere ser terminado (salvo en casos muy concretos).
Pin de E/S
Vdd Vdd
Vdd Vdd
FIGURA 3.25. Esquemas simplificados de los pines de entrada, salida y E/S del HC11 [Motorola 91].
Capítulo 4
Instrucciones y modos de direccionamiento
códigos de operación pueden tener uno o dos bytes, por lo que las instrucciones
del HC11 estarán formadas por un número de bytes comprendido entre 1 y 4 (fig.
4.1).
opcode operando/dirección
M6800
FIGURA 4.1. Tamaño y composición de las instrucciones en el 6800 (arriba) y 68HC11 (abajo).
opcode dirección
opcode
Por ejemplo, la instrucción CLC (CLear Carry) pone a cero el bit indicador de
acarreo C, C←0.
f) Modo acumulador. Es el empleado por aquellas instrucciones que pueden
operar con el acumulador A o con el B, indicando simplemente con cuál de los
dos se trabaja.
opcode
opcode desplazamiento
Por ejemplo, la instrucción de salto relativo BRA $03 (BRAnch) salta tres
casillas más allá de la posición actualmente indicada por el PC,
PC←(PC)+$03.
114 Microprocesadores y microcontroladores
FA00
1000 BRA
FA01 +3
FA02 LDAA PC (nueva posición
FA03 10 del PC)
FA04 32 +3
FA05 INCA
FIGURA 4.2. Ejecución de un salto relativo respecto de la nueva posición del PC.
Instrucciones y modos de direccionamiento 115
0000
PC 01 00
1
:
(PC ini)→ B6 LDAA IR AR
10 $1032 B6 10 32
2
32 (reg. instrucciones) (reg. direcciones)
(PC fin)→ :
A 54
4
B
: 3
1032 54 X
:
FFFF
0000
PC 00 04
1
:
(PC ini)→ 96 LDAA IR AR
18 $18 96 00 18
2
(PC fin)→ : (reg. instrucciones) (reg. direcciones)
:
A 54
4
B
: 3
0018 54 X
:
FFFF
0000
PC 01 00
1
:
(PC ini)→ A6 LDAA IR AR
20 $20,X A6 10 32
2
(PC fin)→ : (reg. instrucciones) (reg. direcciones)
:
A 54
4
B
: 3
1032 54 X 10 12
:
FFFF
0000
PC 01 00
1
:
(PC ini)→ 86 LDAA IR AR
A3 #$A3 86 ... ...
(PC fin)→ : 2 (reg. instrucciones) (reg. direcciones)
:
A A3
B
:
: X
:
FFFF
0
-1 0 +1
15 1
-2 0000 +2
14 1111 0001 2
-3 1110 0010 +3
13 3
1101 0011
-4 12 1100 0100 4 +4
1011 0101
11 5
-5 1010 0110 +5
1001 0111
10 6
-6 1000 +6
9 7
-7 8 +7
-8
Decimal → 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Hexadecimal → 0 1 2 3 4 5 6 7 8 9 A B C D E F
FIGURA 4.4. Números binarios de 4 bits y sus equivalentes decimales y complemento a dos (un
mismo código binario puede interpretarse de ambas formas, dependiendo del propósito).
Instrucciones y modos de direccionamiento 119
TABLA 4.3. Expresiones booleanas que emplea la CPU para actualizar los señalizadores tras una
suma y una resta de dos números X y M (el número presente tras cada letra indica el bit que
involucra; el símbolo ‘/’ indica negación lógica; ‘+’ y ‘.’ las operaciones OR y AND).
• Bit de resultado negativo N. No es otra cosa que el octavo bit del resultado,
que indica el signo del número (N=‘0’ si resultado positivo, N=‘1’ si
negativo). En general, será ignorado cuando se opere con números sin signo.
• Bit de resultado cero Z. Se activa o marca (Z=‘1’) cuando el resultado de una
operación es cero; Z=‘0’, cuando el resultado es diferente a ‘0’.
122 Microprocesadores y microcontroladores
Resolución:
a) Realizamos la primera suma en decimal (números sin signo), en hexadecimal,
en binario y en decimal (números con signo); obviamente, el resultado debe
ser el mismo en todos los casos. Hay que observar que en la suma en decimal
(números sin signo) es fácil apreciar si se ha producido acarreo comprobando
si el resultado supera 255; en la suma en decimal (números con signo) se
comprueba fácilmente si se ha producido desbordamiento observando si el
resultado es superior a +127 o inferior a −128. En la suma en binario ambos,
junto al acarreo a la mitad (H), son fácilmente deducibles: el acarreo C es
claramente el «me llevo una» del último bit (el 7); el desbordamiento se puede
calcular como la operación o-exclusivo (XOR) del acarreo que entra al último
bit con el acarreo que sale (el global, C); finalmente, y por definición, el flag H
es el acarreo entre los bits 3 y 4.
En la siguiente figura realizamos la operación correspondiente al apartado a)
del ejemplo, señalando todas las posibilidades. Se obtiene C=1, V=0, N=0 y
H=1; se tendrá Z=0, puesto que el resultado final es distinto a $00.
Instrucciones y modos de direccionamiento 123
2 $1 0 2 10000 0010
-64 -$ 4 0 - 0100 0000
-62 $C 2 01100 0010
C 2 (-62 en decimal)
El bit de signo
No hay desbordamiento V=0 es ‘1’⇒N=1
124 Microprocesadores y microcontroladores
Debe tenerse en cuenta que si bien nosotros empleamos diversas técnicas para
calcular el estado de los indicadores, en realidad el 6800 realiza las
operaciones lógicas indicadas en la tabla 4.3.
En resumen...
• Dato y opcode por sí solos no pueden distinguirse, sino que un dato binario
almacenado en un registro de memoria se interpreta en un sentido u otro en
función de cómo se utilice.
• El µP no entiende de números con signo o sin signo, solamente ve números
binarios y opera con ellos, actualizando C y V en función de determinadas
expresiones booleanas (tabla 4.3). La interpretación «con signo», «sin signo»,
«desbordamiento», etc., la realizamos nosotros.
• El bit de acarreo C solamente es significativo en el caso de números sin signo,
pudiéndose considerar un noveno bit del resultado.
• El bit de desbordamiento V solamente debe ser tenido en cuenta en el caso de
operaciones con números complemento a dos, indicando en este caso que
desde este punto de vista el resultado carece de sentido.
• El bit H (acarreo a la mitad) sólo es actualizado por las instrucciones de suma.
$0100 48 ‘H’
4F ‘O’
4C ‘L’
41 ‘A’
04 EOT
Dec Hex Ascii Dec Hex Ascii D. H. Ascii De. H. Ascii De. H. Ascii De. H. Ascii Dec Hex Ascii
0 00H NUL 20 14H DC4 40 28H ( 60 3CH < 80 50H P 100 64H d 120 78H x
1 01H SOH 21 15H NAK 41 29H ) 61 3DH = 81 51H Q 101 65H e 121 79H y
2 02H STX 22 16H SYN 42 2AH * 62 3EH > 82 52H R 102 66H f 122 7AH z
3 03H ETX 23 17H ETB 43 2BH + 63 3FH ? 83 53H S 103 67H g 123 7BH {
4 04H EOT 24 18H CAN 44 2CH ' 64 40H @ 84 54H T 104 68H h 124 7CH |
5 05H ENQ 25 19H EM 45 2DH - 65 41H A 85 56H U 105 69H i 125 7DH }
6 06H ACK 26 1AH SUB 46 2EH . 66 42H B 86 57H V 106 6AH j 126 7EH ~
7 07H BEL 27 1BH ESC 47 2FH / 67 43H C 87 58H W 107 6BH k 127 7FH DEL
8 08H BS 28 1CH FS 48 30H 0 68 44H D 88 58H X 108 6CH l
9 09H HT 29 1DH GS 49 31H 1 69 45H E 89 59H Y 109 6DH m
10 0AH LF 30 1EH RS 50 32H 2 70 46H F 90 5AH Z 110 6EH n
11 0BH VT 31 1FH US 51 33H 3 71 47H G 91 5BH [ 111 6FH o
12 0CH FF 32 20H SP 52 34H 4 72 48H H 92 5CH \ 112 70H p
13 0DH CR 33 21H ! 53 35H 5 73 49H I 93 5DH ] 113 71H q
14 0EH SO 34 22H " 54 36H 6 74 4AH J 94 5EH ^ 114 72H r
15 OFH SI 35 23H # 55 37H 7 75 4BH K 95 5FH _ 115 73H s
16 10H DLE 36 24H $ 56 38H 8 76 4CH L 96 60H ` 116 74H t
17 11H DC1 37 25H % 57 39H 9 77 4DH M 97 61H a 117 75H u
18 12H DC2 38 26H & 58 3AH : 78 4EH N 98 62H b 118 76H v
19 13H DC3 39 27H ' 59 3BH ; 79 4FH O 99 63H c 119 77H w
4.4.1. Introducción
En el 6800 el código de operación se compone de un byte, que define tanto el
tipo de instrucción como el modo de direccionamiento que emplea. Con 8 bits
podrían definirse hasta 256 opcodes diferentes, de los cuales el 6800 sólo
implementa 195. La instrucción puede completarse con uno o dos bytes
adicionales, que, como hemos visto, o bien proporcionan el propio operando, o
bien permiten calcular su dirección. Algunas instrucciones se componen
solamente del opcode, al actuar implícitamente sobre algún bit de estado o
registro. De esta manera, en el 6800 las instrucciones pueden ocupar de 1 a 3
bytes, y su ejecución emplea de 1 a 8 ciclos de reloj.
A modo de ejemplo ilustrativo de la forma de codificar las instrucciones en
memoria, en las hojas de características del 6800 podemos encontrar que el
opcode de la instrucción LDAA en modo inmediato es 86, por lo que, si la
instrucción LDAA #$3F se sitúa en la posición $FB00 de memoria, aparecerá
codificada como se muestra en la fig. 4.6, con la secuencia de bytes 86 3F. Por
128 Microprocesadores y microcontroladores
otra parte, la instrucción LDAA $10A6 opera en modo extendido, por lo que
tendrá B6 por opcode, y aparecerá codificada en memoria como la secuencia B6
10 A6 (fig. 4.6).
FB00
1000 86 LDAA #$3F
FB01 3F
FB02 B6 LDAA $10A6
FB03 10
FB04 A6
STX arg STore indeX (STore Stack pointer), almacena el valor del
STS arg registro X (S) en una casilla de memoria
Instrucciones y modos de direccionamiento 129
FB00
1000 CE LDX #$1234
FB01 12
FB02 34
FB03
FIGURA 4.7. Almacenamiento en memoria de una instrucción que opera con un número de 16 bits.
ASLB del contenido de A (B) (el bit 7 va al C, entra ‘0’ por dcha.)
ASL arg Arithmetic Shift Left, ídem sobre contenido casilla memoria
ASRA Arithmetic Shift Right A (B), despl. aritm. de A (B) a dcha.
ASRB (bit 7 se propaga a dcha., el 0 va a C; conserva signo dato)
ASR arg Arithmetic Shift Left, ídem sobre el contenido de una casilla
LSRA Logic Shift Right A (B), despl. lógico a la decha. de A (B)
LSRB (entra ‘0’ por el bit 7, el bit 0 va a C; no conserva el signo)
LSR arg Logic Shift Left, idem sobre el contenido de una casilla
ANDA arg AND A (B), AND lógica entre los bits individuales de A (B)
ANDB arg y dato o contenido de memoria, el resultado queda en A (B)
ORAA arg OR Accumulator A (B), OR entre los bits individuales de A
ORAB arg (B) y un dato o contenido de memoria, resultado en A (B)
EOAA arg Exclusive OR Accumulator A (B), XOR entre bits de A (B) y
EOAB arg
dato o contenido de memoria, el resultado queda en A (B)
NEGA
NEGate A (B), complemento a dos de A (B), −A (−B)
NEGB
NEG arg NEGate, complemento a dos del contenido casilla memoria
COMA COMplement A (B), invierte los bits individuales de A (B)
COMB (complemento a uno)
COM arg COMplement, ídem del contenido de una casilla de memoria
módulos que incluyen o llaman a otros módulos, siguiendo para ello una
metodología de diseño descendente.
Para el desarrollo de esta sección nos hemos inspirado en el texto de [Silva
82]. A dicho texto, y a otros como [Spasov 96, Peatman 88, Huang 96, Miller
93], remitimos al lector interesado en profundizar en estas cuestiones relativas a la
programación de microprocesadores.
Debe tenerse en cuenta que las etiquetas no pueden coincidir con ninguna
palabra reservada del lenguaje (ni instrucciones ni directivas). Recordemos
además que el símbolo ‘*’ indica que se va a incluir un comentario; cuando el
compilador encuentra un símbolo de este tipo ignora todo lo que viene a
continuación, pues sabe que no se trata de instrucciones de ensamblador. Es
importante incluir abundantes comentarios en los programas para mejorar su
legibilidad, lo que facilitará la introducción de modificaciones o su futura
adaptación. Si no se incluyen comentarios, un programa ensamblador leído unos
pocos días más tarde resulta absolutamente críptico e indescifrable.
realizan, bien su resta, bien operaciones lógicas AND bit a bit, en función de las
cuales quedan actualizados los indicadores del registro de estado, mientras que el
resultado en sí no queda almacenado en parte alguna. P.e., si se desea saber si
X=Y, se realizaría la resta X−Y, y si queda activado Z querrá decir que,
efectivamente, dicha condición es cierta. Las instrucciones de elaboración de la
condición son las siguientes:
• Comparación. CMPA (CoMPare A), CMPB (CoMPare B) y CBA (Compare
B y A), la última de direccionamiento implícito (no requiere operandos
adicionales). Estas instrucciones comparan dos números realizando la resta del
contenido de uno de los acumuladores menos otro dato, actualizando el estado
de los señalizadores sin almacenar el resultado. Por ejemplo, CMPA $1000
lleva a cabo la operación (A)−($1000), y actualiza C, V, Z y N según el
resultado. Por su parte, la instrucción CBA compara los acumuladores A y B,
realizando la operación (A)−(B).
• Comparación de números de 16 bits. La instrucción CPX (ComPare X)
permite comparar dos números de 16 bits, el primero de los cuales es el
almacenado en el registro X. Por ejemplo, CPX $1000 realiza las operaciones
(XH)−($1000) y (XL)−($1001), actualizando Z y alterando N y V de una
forma particular (consúltense las tablas del juego de instrucciones en el
apéndice A). Recordemos que XL indica parte baja (Low) de X, o menos
significativa, y XH parte alta (High), o más significativa.
• Test. Realizan la comparación de un dato dado con el valor $00 (es decir, son
un caso particular de las anteriores). Se tiene TSTA (TeST A), TSTB (TeST B)
y TST (TeST), las dos primeras implícitas. Estas instrucciones actualizan Z y
N, y ponen siempre V y C a cero.
• Comparación de bits. Comprueban el estado de bits individuales, para lo cual
realizan la operación AND lógica entre los bits individuales de un acumulador
con un determinado dato. Se tiene BITA y BITB. BITA $1000, por ejemplo,
realiza la operación (A)⋅($1000), que se interpreta como la operación AND
lógica realizada entre sus 8 bits individuales. Estas instrucciones actualizan Z
y N, y ponen V a cero.
TABLA 4.6. Instrucciones de salto condicional con elaboración previa de la condición en el 6800.
Estas instrucciones requieren de una instrucción previa que elabore la condición.
SI/ENTONCES (if/then).
La estructura SI/ENTONCES (if/then) presenta la siguiente forma, ya
mostrada previamente:
[2]
donde [1] y [2] son dos secuencias de instrucciones diferentes. Esta estructura se
realizaría en ensamblador de la siguiente manera:
Elaborar la condición (instrucción de comparación)
Saltar a SIGUE si condición falsa (salto condicional)
[1]
SIGUE [2]
En los siguientes ejemplos ilustraremos la codificación en ensamblador de la
estructura SI/ENTONCES. En el ejemplo 1 no se precisará de la elaboración
previa de la condición con instrucciones de comparación, pero sí en el ejemplo 2.
Ejemplo 1
En una planta embotelladora se controlará el número de botellas envasadas
mediante un 6800. Construye un contador software de 16 bits que permita
contabilizar hasta 65.535 botellas, haciendo uso de dos casillas de memoria
Instrucciones y modos de direccionamiento 141
Resolución:
Una posible codificación en ensamblador consiste en incrementar DATO2
(INC DATO2) y cuando DATO2 pase de $FF a $00 (se sobrepasa su capacidad
de contabilizar hasta 255) incrementar entonces DATO1; para ello habrá que
comprobar cuándo se cumple Z=1.
Como norma, a la hora de confeccionar un programa, siempre en primer lugar
debe proponerse el algoritmo que resuelve el problema, bien en diagrama de flujo,
bien en pseudocódigo (se denomina así a una manera esquemática de representar
un algoritmo mediante instrucciones que recuerdan las de los lenguajes de alto
nivel). En el caso que se plantea, p.e., se tiene el siguiente diagrama de flujo:
DATO1 DATO2
DATO2:=DATO2+1
Contador de 16 bits
No Si
¿Z=1? DATO1:=DATO1+1
Ejemplo 2
Escribir un programa que guarde en la dirección etiquetada por MAXTEM la
mayor de 3 temperaturas almacenadas en las direcciones TEM1, TEM2,
TEM3, considerando que se trata de binarios de 8 bits sin signo (temperaturas
entre 0 y 255 ºC). A continuación, resolver el mismo problema suponiendo
que se trata de números en complemento a dos (de −128 a +127 ºC).
Resolución:
Una solución al problema es la siguiente (haremos uso de pseudocódigo-
RTL):
Instrucciones y modos de direccionamiento 143
MAXIMA ←(TEM1)
SI (MAXIMA)<(TEM2) ENTONCES MAXIMA ←(TEM2)
SI (MAXIMA)<(TEM3) ENTONCES MAXIMA ←(TEM3)
MAXTEM ←(MAXIMA)
El siguiente paso consiste en codificar el algoritmo en ensamblador. Una
posible codificación para los dos casos solicitados (con y sin signo) es la
siguiente, donde codificamos la estructura SI/ENTONCES de la manera indicada:
De nuevo puede observarse que, si se desea implementar ‘Si X menor que Y’,
se hará uso de la instrucción que salta justo cuando se da lo contrario BCC (BHS),
o BGE para el caso de números complemento a dos, las cuales equivalen a
«mayor o igual».
En los programas se señalan las instrucciones que implementan la estructura
algorítmica SI/ENTONCES haciendo uso de una instrucción de elaboración de
condición, más un salto condicional. Conviene observar que en cada caso, con
signo o sin signo, se aplican las instrucciones de salto adecuadas. Por otra parte,
debe siempre tenerse en cuenta que la solución de un problema nunca es única,
sino que a cada cual se le pueden ocurrir diferentes soluciones, mejores o peores,
pero quizás perfectamente válidas.
144 Microprocesadores y microcontroladores
SI/ENTONCES/SINO (if/then/else)
La estructura SI/ENTONCES/SINO (if/then/else) presenta la siguiente forma
conocida:
[3]
HAZ/MIENTRAS (do/while)
La estructura HAZ/MIENTRAS es una condicional que permite realizar
iteraciones, en las que el conjunto de instrucciones que incluyen se ejecutan por lo
menos una vez, pues la condición se comprueba al final. Presenta la siguiente
forma:
HAZ [1]
[1]
MIENTRAS (condición cierta) Verdadera
¿condición?
[2]
Falsa
[2]
Instrucciones y modos de direccionamiento 145
contador +1
PARA contador=M HASTA N
[1]
Falso
FIN PARA ¿contador=fin? [1]
[2]
Verdadero
[2]
Ejemplo 3
Realizar una rutina para el 68HC11 que copie un bloque de 10 bytes que
comienza en la dirección $3000 a la $4000 (recordar que el 68HC11 incluye,
además del X, un segundo registro índice Y, por lo que, además de las
instrucciones LDX, STX, etc., se tendrán las LDY, STY, etc.).
Resolución:
El algoritmo sería:
FOR I=0 TO 9
$4000←($3000+I)
END FOR
y en RTL detallado tendríamos:
X←$3000 * dirección origen (puntero de datos de origen)
Y←$4000 * dirección destino (puntero de destino)
B←10 * número de casillas a copiar; B hace de contador
MIENTRAS (B>=0)
(Y)←((X))
X←(X) +1
Y←(Y) +1
B←(B)−1
FIN_MIENTRAS
(la estructura FOR habitual es un caso particular de la MIENTRAS QUE).
Codificamos en ensamblador:
LDX #$3000 * X es el puntero origen
LDY #$4000 * Y es el puntero destino
LDAB #10 * B es el contador
OTRA TSTB * (B)−0, compara contenido de B con 0...
BLO FIN * ... y si es menor (LOwer), se acabó
LDAA $00, X
STAA $00, Y
INX
INY
Instrucciones y modos de direccionamiento 147
(ORG, EQU, FCB, END), etiquetas que representan direcciones (dato1, dato2,
resul) y comentarios (seguidos por el símbolo ‘*’). Obsérvese el formateo del
texto, con las etiquetas pegadas al margen izquierdo y las instrucciones separadas
del margen mediante un tabulador.
* Programa de suma BCD. Marzo 1999.
resul EQU $0003 * definición de la etiqueta resul
FIGURA 4.8. Proceso de compilación del código fuente (en ensamblador y alto nivel).
Lenguaje ensamblador
Código máquina
No
¿condición?
Bloque de Si
instrucciones (proceso)
No
¿condición? A B
* ENCABEZAMIENTO
* Título del programa
* Nombre del autor, fecha, versión
* Microprocesador, mapa de memoria...
* DEFINICIÓN DE ETIQUETAS
EQU
* CONSTANTES
ORG $NN
FCB
* VARIABLES
ORG $MM
FCB
* PROGRAMA DE INICIALIZACIÓN (RESET)
ORG $XX
* PROGRAMA PRINCIPAL
ORG $YY
* SUBRUTINAS
ORG $ZZ
*FIN
END
4.7. Subprogramas
En el punto anterior hemos hablado de programar haciendo uso de una
metodología descendente, en la que se reduce la complejidad de un problema
descomponiéndolo en partes más fáciles de resolver. Ello nos conduce
directamente a dividir el programa en desarrollo en módulos o subprogramas más
simples. Existen diferentes tipos de subprogramas, como las subrutinas, las
interrupciones y las macros, que trataremos a continuación. Para el manejo de
Instrucciones y modos de direccionamiento 155
Dentro del repertorio, tanto del 6800 como del 68HC11, hay un conjunto de
instrucciones específicas para el manejo del registro SP. Así, LDS (LoaD SP) y
STS (Store SP) sirven respectivamente para cargar el contenido de dos casillas de
memoria consecutivas en SP (pues es de 16 bits) y para almacenar el valor de SP
en memoria. INS (Increment SP) y DES (Decrement SP) incrementan y
decrementan SP, respectivamente. Por último, TSX (Transfer SP to X) transfiere
el contenido de SP más uno al registro X, y TXS (Transfer X to SP) transfiere el
contenido de X menos uno a SP. Estas instrucciones permiten tanto el control del
tamaño y situación actual de la pila como el manejo de los datos almacenados.
De todas las anteriores LDS resulta particularmente importante, ya que carga
un determinado valor en SP, o, en definitiva, LDS establece el lugar de memoria
donde debe situarse la pila. Veremos que una de las primeras cosas que el
microprocesador debe realizar al conectar la alimentación del sistema es
precisamente asignar a la pila un lugar dentro del mapa de memoria que
corresponda a memoria RAM (lo suele hacer la rutina de reset). Por ejemplo,
LDS #$7F colocaría la cima de la pila (comienzo) en la dirección $7F.
0000 0000
FFFF FFFF
0000
...
EC00 JSR ←(viejo PC) (SP)→ CIMA (libre) (viejo SP)-2
EC01 FB $EC (PC High) (viejo SP)-1
EC02 00 (viejo SP)
$03 (PC Low)
EC03 ... ←(PC) :
:
Instrucción en memoria BASE
FFFF
FIGURA 4.13. Detalles de una llamada a subrutina y colocación del viejo PC en la pila.
Datos
Zona reservada
RAM
Datos (datos y pila)
Pila
Libre
Puertos Zona de
Coloca entradas/salidas
Accede datos Libre
a datos
Programa
Llamada Principal
ROM (programa,
Subrutina rutinas, vector interr.)
Subrutina
FFFF Vector interrupc.
FIGURA 4.14. Traspaso de datos mediante una zona de memoria RAM reservada.
Bus Datos
Adaptador 1 Periférico 1
Decodif.
Direcciones EN
Microprocesador
(CPU) Adaptador 2 Periférico 2
EN
EN
Adaptador 3 Periférico 3
Bus Datos
Bus Direcciones
FIGURA 5.1. Esquema de la conexión del subsistema de E/S al sistema microprocesador. Por
simplicidad, no se incluyen señales de control, excepto las de habilitación ‘EN’ (ENable).
170 Microprocesadores y microcontroladores
FIGURA 5.3. Esquema genérico de un interfaz o adaptador de entradas (AE), y construcción por
medio de un buffer triestado.
74LS244
FIGURA 5.4. Buffers triestado: 74241, 244, 367 y 541 (arriba), y diagrama del 74LS244 (abajo).
la práctica haciendo uso de buffers triestado convencionales (fig. 5.4), con las
entradas de habilitación cableadas de forma adecuada. Por ejemplo, el 74LS367
es un buffer triestado de seis líneas, con dos entradas de habilitación que actúan
sobre dos grupos de dos y cuatro buffers individuales, respectivamente. Los
integrados 74LS241 y 74LS244 son buffer triestado de 8 líneas de amplio uso
(ambos se diferencian levemente en sus líneas de habilitación). El 74LS541 es
una versión del 241, cuyas entradas y salidas están dispuestas «ordenadamente» a
ambos lados del encapsulado para facilitar la realización de montajes. Se suelen
emplear integrados pertenecientes a las familias lógicas LS y ALS, por su bajo
consumo y rapidez (la ALS, Advanced Low-Schottky, es una familia lógica más
moderna, de consumo inferior a la LS tradicional).
Debido a la elevada capacidad de manejo corriente que presentan estos
buffers, son también denominados drivers de bus, empleándose asimismo para
aumentar la capacidad de carga del bus de direcciones (para el caso del bus de
datos deberá emplearse un transceiver, buffer de tipo bidireccional).
Ejemplo
Conecta un grupo de 8 interruptores al bus de un sistema basado en un 6800.
Resolución:
La conexión se realiza por medio de un adaptador de entradas siguiendo el
esquema de la figura mostrada a continuación Este adaptador se construiría con
buffer triestado; la conexión concreta depende del modelo de buffer elegido. La
habilitación se produce cuando VMA, R/W y φ2 estén a ‘1’ y la dirección DIR
sea la correcta (línea que procede de un bloque decodificador). La salida de los
interruptores se mantiene a ‘1’ por medio de resistencias de polarización.
Entradas y salidas (I): aspectos básicos 175
FIGURA 5.5. Esquema genérico de un adaptador de salidas (AS), y realización mediante biestables
D síncronos.
FIGURA 5.6. Patillaje de los integrados 74175 (4 biestables D síncronos, con reset) y 377 (8 D
síncronos, con habilitación), empleados para realizar adaptadores de salida.
Ello nos sugiere que en el caso de los puertos de salida debe emplearse un
registro que retenga los datos cuando el µP prosiga con otras tareas (fig. 5.5), y
los mantenga ante las entradas del periférico (por ejemplo, el conjunto de LED).
Habitualmente para ello se hace uso de registros síncronos tipo D, por ejemplo, un
74LS175, que consta de 4 biestables D, o un 73LS377, que incluye 8 (fig. 5.6).
En este caso /EN no es una línea de habilitación propiamente dicha, sino una
entrada de reloj (activa por flanco) que se encarga de actualizar el estado del
registro cuando se dan las condiciones expuestas. También pueden emplearse
registros de retención (latch), con las líneas de habilitación convenientemente
conectadas (dejamos los detalles como ejercicio para el lector).
Ejemplo
Conecta un conjunto de 8 LED al bus de un sistema basado en un 6800.
Resolución:
La conexión se realiza por medio de un adaptador de salidas siguiendo el
esquema de la figura que sigue. Este adaptador se construiría con biestables; la
conexión concreta depende del modelo elegido. En la figura se ha supuesto que
se emplean biestables síncronos que actualizan sus salidas con una transición ‘0’ a
‘1’ en la línea de reloj (p.e., un 74175), que nosotros hemos denominado /EN para
que la notación coincida con los adaptadores de entrada; dicha transición se
producirá cuando VMA=1, R/W=‘0’, la dirección sea la correcta, y φ2 conmute
de ‘1’ a ‘0’ (lo que sucede al finalizar un proceso de escritura), momento en el que
el contenido del bus de datos pasa a las salidas. Los LED se han conectado de
modo que se iluminen cuando aparezca un ‘0’ en la salida del interface (los
circuitos TTL pueden absorber más intensidad que la que pueden proporcionar,
por lo que esta disposición permite que presenten mayor luminosidad).
Entradas y salidas (I): aspectos básicos 177
Selección de
ORA(B) (=1) o DDRA(B) (=0)
Señalizadores
de C1 y C2 Control de C2 Control de C1
7 6 5 4 3 2 1 0
CRA(B)
FIGURA 5.8. Registro de control de la PIA CRA(B) (por el momento sólo nos interesa el bit 2).
Ejemplo
Realiza una rutina que inicialice como entrada el puerto A de una PIA,
supuesto que está colocada a partir de la dirección $A000 del mapa de
memoria del sistema.
Entradas y salidas (I): aspectos básicos 181
Resolución:
Si la PIA está colocada a partir de la dirección $A000, ORA/DDRA ocupará
la dirección $A000, CRA la $A001, ORB/DDRB la $A002 y CRB la $A003.
Aplicando lo explicado:
* definición de etiquetas
ORA EQU $A000
DDRA EQU $A000
CRA EQU $A001
* rutina de inicialización
ORG $0100
* selección de DDRA (‘0’ en el bit 2 de CRA)
LDAA #$00
STAA CRA
* programa líneas como entradas cargando $00 en DDRA
STAA DDRA
* seleccionar ORA para trabajar con él: CRA<--0000 0100
LDAA #$04
STAA CRA
* fin inicialización puerto A PIA
......
El resto de las líneas de la PIA deben conectarse a los buses del sistema de la
siguiente manera (fig. 5.9): las líneas D0-D7 se conectan al bus de datos,
mediante ellas µP y adaptador intercambian datos. La patilla E (Enable) es la
entrada de habilitación de la PIA, que se conecta a la fase φ2 del reloj del sistema
(en el caso del 68HC11 y del 68000, esta línea se uniría directamente al reloj E
proporcionado por ellos). La línea de lectura/escritura R/W (en el caso de la PIA,
hace de entrada/salida de datos) se conecta obviamente a la línea R/W del sistema
microprocesador.
Aunque más adelante estudiaremos las interrupciones del 6800, indicaremos
que las dos líneas de interrupción /IRQA e /IRQB de la PIA son salidas drenaje
abierto, pudiéndose cablear entre sí y a la entrada IRQ del 6800 (fig. 5.10); para
mantenerlas desactivadas hay que conectarlas a +5 V mediante una resistencia de
4,7 KΩ. Finalmente, la entrada /RESET se conecta al reset general del sistema.
182 Microprocesadores y microcontroladores
FIGURA 5.10. Conexión de las dos salidas de interrupción de la PIA, /IRQA y /IRQB, a la línea de
interrupción no enmascarable /IRQ del 6800 .
con una instrucción como LDAA (es decir, leemos un puerto de salida), se
obtendrá el dato correcto que anteriormente se colocó en el puerto B, con
independencia de la carga externa que se haya conectado. Como A no incluye
buffer, si se programa el puerto A como salida y posteriormente se lee, no queda
garantizado que obtengamos el dato que inicialmente se grabó.
El buffer integrado en el puerto B resulta suficiente para excitar una carga
TTL estándar; como está capacitado para proporcionar 1mA de intensidad a 1,5
voltios, también permite excitar directamente la base de un par Darlington
operando como interruptor. No obstante, esta corriente resulta insuficiente para
excitar periféricos convencionales como diodos LED, visualizadores de siete
segmentos, etc., con lo que frecuentemente se deben conectar buffers externos
(como un 74LS241 o un 74LS541), o bien hacer uso de pares Darlington para
excitar periféricos (como veremos en el capítulo 6, el circuito ULN2803, pensado
para aplicaciones de este tipo, integra 8 transistores Darlington).
Como el puerto B permite manejar más corriente que el A, y debido al
comportamiento de las líneas de diálogo en ambas secciones (que se estudiará en
el capítulo 6), se tiene que habitualmente el puerto A se emplea para entrada de
datos y el B para salida. No obstante, recordemos que en todo caso la capacidad
de suministro de corriente es muy limitada, por lo que casi siempre habrá que
utilizar buffers externos para la excitación de periféricos mediante la PIA.
La PIA es un circuito adaptador muy versátil, cuya programación básica no
reviste demasiada complicación, no así la programación en detalle de sus cuatro
salidas de control, cuyo estudio dejamos pendiente para más adelante.
Como hemos dicho, tras alimentar el HC11 el DDRC queda a cero, por lo
que, si no se modifica el puerto C, se comporta como entrada; cargando $FF en
$1007 el puerto C se comporta como salida (como en la PIA, cada línea puede
programarse individualmente de una forma o de otra).
Existen además dos líneas de diálogo, STRA (entrada) y STRB (salida), cuyo
papel es similar al de las C1 y C2 de la PIA, y cuya acción se controla
programando adecuadamente los bits del registro de control del puerto C,
colocado en la dirección $1002 (denominado PIOC, Parallel Input/Output
Control), que equivaldría al registro CRA o CRB de la PIA. En el capítulo
siguiente estudiaremos más profundamente los puertos del 68HC11.
Ejercicio
Conecta 8 LED y un conjunto de 8 microinterruptores (incorporados en un
encapsulado DIP-16) a los puertos B y C del 68HC11.
Resolución:
El puerto B es de salida, el C es programable de E/; por lo tanto,
conectaremos los LED al puerto B y los interruptores al C. Por defecto el puerto
C es ya de entrada, por lo que, en general, no será necesario programarlo.
Como la capacidad del 68HC11 de suministrar corriente es muy pequeña
(algo más de 20 mA en total, según hojas de características [Motorola 91b]), y
como cada LED precisa de 10 a 20 mA para que se ilumine apreciablemente,
colocaremos a la salida del puerto B un buffer para aumentar la capacidad del
68HC11 para manejar corriente; en la figura se muestra el empleo de un 74LS541
permanentemente habilitado (también es usual el empleo de un driver ULN2803).
Por su parte, el conjunto de 8 interruptores incorporados en un encapsulado DIP-
16 puede conectarse directamente al puerto C.
186 Microprocesadores y microcontroladores
digital que deberá leer el µP. Por lo tanto, la CPU, tras solicitar la conversión,
deberá consultar el estado en el que se encuentra el periférico (leyendo el estado
de alguna línea o bit de control), hasta que éste le haga saber que ha concluido su
operación; en este caso se tiene una E/S por programa con diálogo.
No obstante, en ocasiones un periférico necesita urgente atención por parte
del µP (por ejemplo, puede ser el caso de un sensor de alarma), o simplemente la
CPU deja operar autónomamente (asíncronamente) a un periférico, y cuando éste
lo requiera él mismo tomará la iniciativa de la comunicación y solicitará atención
a la CPU (por ejemplo, una impresora que está imprimiendo y se queda sin papel).
En este caso se utiliza un tipo especial de E/S denominada por interrupciones.
Para ello, el µP dispone de unas líneas especiales, denominadas de interrupción, a
las cuales pueden estar conectados diversos periféricos; si uno de ellos activa una
línea de interrupción, la CPU deja de hacer la tarea que en ese momento estaba
realizando, y atiende al periférico que lo ha solicitado. Ésta es la manera más
eficiente de gestionar eventos asíncronos con la CPU, que resulta sumamente útil
sobre todo en el caso del control en tiempo real.
Por último, si se precisa el intercambio de cantidades masivas de datos entre
un periférico (p.e., un disco duro o un CD-ROM) y la memoria, si la CPU lo lleva
a cabo dato a dato (como hemos hecho hasta ahora), resultará extremadamente
lento. En este caso se suele hacer uso del acceso directo a memoria o DMA
(Direct Memory Access), consistente en abrir una vía directa de comunicación
entre periférico y memoria, llevándose a cabo el intercambio de datos sin
intervención de la CPU, gestionado por un chip controlador de DMA.
En lo que queda de capítulo estudiaremos todas estas técnicas de E/S.
FIGURA 5.11. Ejemplos de periféricos que admiten la técnica de E/S directa por programa.
FIGURA 5.12. E/S con diálogo: ejemplo de gestión de un conversor A/D. La CPU solicita inicio de
conversión con una lectura muda sobre la dirección que activa la salida del decodificador conectada a
INI; la CPU lee entonces el estado de FIN (conectada a BDat por un AE), y solamente procederá a
leer la salida de datos del conversor (D0-D7) cuando FIN=‘1’.
190 Microprocesadores y microcontroladores
Este diálogo, que consiste en consultar el estado del periférico, puede llevarse
a cabo en bucle de espera o por consulta periódica. En bucle de espera o modo
bloqueado la CPU comprueba continuamente el estado de algún tipo de línea que
indique «periférico preparado», y no prosigue con otras tareas hasta que logra
definitivamente la comunicación con el periférico (por ello, en ocasiones se
denomina también modo bloqueado). En el caso de la técnica de consulta
periódica, el µP sigue con sus tareas, y de vez en cuando consulta el estado de
disponibilidad del periférico.
Es fácil comprender que cada una de las dos técnicas descritas posee ventajas
e inconvenientes: el bucle de espera es un método sencillo y rápido, ya que, al
monitorizar permanentemente el estado del periférico, se podrá actuar en cuanto
esté listo, por contra, la CPU pierde mucho tiempo al tener que observar
continuamente el estado de un periférico (que puede ser extremadamente lento).
La técnica de consulta periódica, en cambio, es más eficiente, puesto que, al
consultar el estado del periférico solo de vez en cuando, la CPU puede dedicarse a
otras tareas mientras tanto; sin embargo, la implementación de esta técnica es algo
más compleja, y el periférico tardará en general más tiempo en ser atendido.
Este tipo de E/S con diálogo se emplea, por ejemplo, en las impresoras.
Cuando la CPU envía el texto a imprimir, la impresora lo recibe y almacena en su
buffer (memoria FIFO de almacenamiento temporal), y cuando dicho buffer se
llena, la impresora envía a la CPU una determinada señal de advertencia. Si la
CPU enviase datos a imprimir sin consultar el estado del buffer, se perderían
caracteres cuando éste se llenase, de modo que antes de enviar un dato la CPU
deberá consultar el estado de la impresora para comprobar si dispone de espacio
en el buffer, y cuando ya no disponga, deberá suspender el envío de datos hasta
que haya espacio.
En la fig. 5.12 desarrollamos un ejemplo de la aplicación de la técnica de
diálogo al caso de un conversor analógico a digital (A/D). Este tipo de circuito,
como es sabido, convierte la tensión analógica presente en su entrada a un valor
digital. La señal analógica de entrada debe situarse dentro del rango de tensiones
marcado por las dos patillas de referencia del conversor, VrL y VrH, que
adecuadamente conectadas a dos voltajes de referencia determinan las tensiones
mínima y máxima, respectivamente, que pueden ser convertidas.
Un conversor A/D se caracteriza, entre otras cosas, por el número de bits de
resolución que proporciona; así, un conversor A/D de 8 bits dará un valor binario
%0000 0000 cuando en su entrada analógica observe una tensión igual al valor
establecido para VrL, el valor %1111 1111 cuando sea igual a VrH, e intermedio
para tensiones dentro de este rango. Por ejemplo, si las tensiones de referencia
Entradas y salidas (I): aspectos básicos 191
pulsa una tecla del panel de mandos, el circuito que controla el teclado envía
una señal de interrupción al microprocesador, el cual pasa a ejecutar la rutina
de servicio del teclado cuyo objetivo es explorar el teclado y obtener el valor
ASCII de la tecla pulsada, actuando en consecuencia. Finalmente, la CPU
proseguirá con la ejecución del programa de control del osciloscopio.
/IRQ Periférico
Adaptador
Microprocesador
(CPU)
/INTA
Bus Datos
Programa Principal
Principal Rutina Servicio
: Interrupción
:
: Rutina Serv.
:
Interrupción
:
: :
: Retorno
:
FIGURA 5.13. Arriba, solicitud de interrupción a través de la línea IRQ y reconocimiento (aceptación)
de la misma por medio de INTA. Abajo, ejecución de la rutina de servicio.
Entradas y salidas (I): aspectos básicos 195
Por otro lado, hasta ahora pensamos en las interrupciones como un proceso
desencadenado por un periférico que activa determinada línea del µP; sin
embargo, en los microprocesadores se da también la posibilidad de desencadenar
Entradas y salidas (I): aspectos básicos 197
una interrupción desde el propio programa: son las interrupciones software. Por
lo tanto, también podemos considerar la siguiente clasificación alternativa:
a) Interrupciones hardware. Debidas a la activación de una línea de interrupción
del µP por parte de un periférico. Algunas líneas se activan por flanco (con
frecuencia descendentes) y otras por nivel lógico (a menudo, nivel bajo ‘0’).
b) Interrupciones software (en algunos µP, como el 68000, denominadas traps).
Suelen generarse mediante instrucciones software específicas, asemejándose
así a una subrutina; en otros casos pueden desencadenarse por situaciones
especiales, como una división por cero.
0000 0000
(SP)→ (SP)
CCR (SP)-1
B (SP)-2
A (SP)-3
XH (SP)-4
XL (SP)-5
PCH (SP)-6
(SP)→ PCL (SP)-7
FFFF FFFF
FIGURA 5.14. Estructura de la pila en el 6800, antes y después de servir una interrupción.
0000 0000
los viejos valores de los registros. Por lo tanto, en el 6800 la instrucción RTI
opera de forma similar a RTS (retorno de subrutina), pero ésta última solamente
recupera de la pila el viejo valor del PC, mientras que RTI recobra los valores de
todos los registros.
Obsérvese que al restaurar el contexto tras la instrucción RTI también se
recupera el antiguo valor del PC, con lo cual se obtiene de forma automática la
dirección del lugar desde el que el µP debe proseguir la ejecución del programa
anterior a la interrupción.
El M6800 dispone de cuatro tipos de interrupciones, tres hardware (IRQ,
NMI y RESET) y una software (SWI), que pasamos a describir:
1. Interrupción enmascarable IRQ (Interrupt ReQuest). Es la de menor prioridad
del sistema. Para su activación debe colocarse un nivel correspondiente a un
cero lógico en la línea /IRQ del 6800; pero, si el bit de estado I, máscara de la
interrupción IRQ (incluido en el registro de estado CCR) se encuentra a ‘1’,
esta interrupción se hallará en situación de enmascaramiento y no será atendida
(fig. 5.16). Es una línea de interrupción de propósito general, que suele ser
empleada por varios periféricos a la vez. Normalmente, la CPU enviará una
señal de aceptación al periférico indicando que su solicitud va a ser atendida
(reconocimiento), aunque el 6800 no lleva a cabo este proceso
automáticamente, sino que habrá que hacerlo por programa.
I CCR
M6800
/IRQ IRQ (interna)
(nivel)
clear
FIGURA 5.16. Tratamiento interno de las interrupciones IRQ (por nivel) y NMI (por flanco) por el 6800
[Cahill 93].
200 Microprocesadores y microcontroladores
/IRQ
¿Instrucción No /NMI
Concluida?
Si
SWI
/RESET
/RESET
Secuencia de
comienzo
FFFE, FFFF
Si
/HALT
Máquina
detenida (HALT) No
Si Si
/HALT /NMI
No No
Si
/IRQ
No
Si No
¿I=1?
permanecer en estado bajo durante por lo menos 8 ciclos de reloj. Tras una señal
de RESET válida, todos los registros se ponen a cero, excepto el PC, que se carga
con los contenidos de las direcciones $FFFE y $FFFF. Es decir, en un sistema
basado en un 68XX, en las casillas más altas del mapa de memoria debe colocarse
la dirección donde se situará la primera instrucción del programa. Por ejemplo, si
el programa de aplicación comienza en la dirección $E000, la casilla $FFFE
contendrá el valor $E0, y la $FFFF el $00.
Tras ello, la CPU comprueba el estado de la patilla /HALT (fig. 5.19), que de
encontrarse activa fuerza la parada de la máquina. En situación normal se tiene
/HALT=‘1’, con lo que la CPU a continuación comprueba si se ha solicitado una
interrupción NMI o una IRQ, por este orden de prioridad, para servirlas (fig.
5.19). Si es la IRQ la que se ha solicitado, además comprueba el estado del bit I
máscara de IRQ. Solamente si /HALT está inactiva y no se debe servir ninguna
interrupción, el 6800 proseguirá con la ejecución de la instrucción actualmente
apuntada por el PC, cargándola y ejecutándola.
El ciclo de trabajo del 68HC11 se basa en principios similares, aunque debido
a la cantidad de periféricos y fuentes de interrupción que integra resulta más
complejo; el lector interesado puede consultar los detalles concretos en su manual
de referencia [Motorola 91].
75]. Por otro lado, el biestable interno de /NMI es borrado tres ciclos de reloj
antes de ejecutarse la primera instrucción de la rutina de servicio; como ésta no es
enmascarada, si entonces ocurre un nuevo flanco descendente será interpretado
como una nueva solicitud de interrupción NMI (anidamiento).
Tiempo de respuesta (latencia). Se denomina latencia al tiempo que una
interrupción tarda en ser atendida. El M6800 tarda entre 13 y 23 ciclos de reloj en
empezar a ejecutar la primera instrucción de la rutina de servicio (depende de la
instrucción actualmente en curso y del ciclo en el que ésta se encuentra cuando
llega la señal de solicitud). La instrucción WAI (WAit for Interrupt), que
almacena los registros en la pila y detiene el funcionamiento de la CPU hasta que
se produzca una interrupción, puede ser empleada en ciertas situaciones para
disminuir la latencia, ya que tras la ejecución de esta instrucción la CPU precisa
únicamente de 4 ciclos de reloj para comenzar a ejecutar la rutina de servicio.
Subrutinas reentrantes. Según se estudió en el capítulo 4, aquellas subrutinas
susceptibles de ser utilizadas por una rutina de servicio de interrupción deberían
ser reentrantes, ya que pueden ser llamadas de nuevo antes de que acabe su
ejecución; por ejemplo, el programa principal llama a una subrutina de
visualización de dato en pantalla, y cuando la está ejecutando el µP acepta y sirve
una interrupción que hace uso de esta misma subrutina. Para que una subrutina
sea reentrante no puede hacer uso de direccionamiento directo ni extendido, ya
que en una segunda llamada se sobre-escribirían los datos parciales de la anterior;
por ello, en el almacenamiento de datos temporales debería emplear la pila.
Microprocesador
(CPU)
Adaptador 1 Adaptador 2 Adaptador N
/IRQ1
/IRQ2
/IRQ N
Microprocesador
(CPU)
Adaptador 1 Adaptador 2 Adaptador N
/IRQ1
/IRQ /IRQ2
/IRQ N
FIGURA 5.20. Gestión de múltiples interrupciones, por medio de varias líneas (arriba) o de una sola
(abajo).
línea de interrupción quién es el solicitante; éste va a ser uno de los aspectos que
estudiaremos en la presente sección.
Por otro lado, la interrupción no enmascarable NMI del 6800 actúa por
flancos, por lo que suele dedicarse en exclusiva a una sola fuente de interrupción,
como circuitos indicadores de fallo de alimentación, alarmas o cualquier otra
circunstancia grave [Lipovski 88, Motorola 91]. Ello no quiere decir que no
pueda emplearse con varias fuentes, sino que su gestión resultará mucho más
compleja y problemática que si actuase por niveles. Por ejemplo, si varios
periféricos han solicitado NMI por medio de un flanco descendente, al concluir la
rutina de servicio (instrucción RTI) los periféricos pendientes seguirán
manteniendo la línea /NMI a ‘0’, lo cual no sólo no desencadena una nueva NMI
(se precisa de un flanco), sino que además bloquea la posibilidad de que en el
futuro se genere otra. Este y otros problemas asociados a la gestión de múltiples
interrupciones a través de /NMI se describe en [Lipovski 88, Motorola 91].
Las interrupciones por flanco se dedican a situaciones extremas, por lo que en
principio debería actuar de forma instantánea, por lo que no resulta en general
conveniente que el µP pierda tiempo averiguando por alguna de las técnicas que
estudiaremos a continuación qué tipo de circunstancia concreta la ha producido.
Vcc Vcc
Rc (exterior)
exterior exterior
Salida TTL
Salida colector
abierto
FIGURA 5.21. Salidas TTL estándar y colector abierto. La salida se mantiene polarizada a Vcc (no
necesariamente de +5 V) por medio de una resistencia externa Rc. Varias salidas colector abierto
pueden unirse entre sí sobre la misma Rc, realizándose la operación AND cableada.
Operación AND
Salidas colector/
cableada
drenaje abierto
Vcc
3K3 M6800
/IRQ1
/IRQ2
/IRQ
/IRQ3
FIGURA 5.22. Varios dispositivos cuya salida de solicitud de interrupción sea colector abierto (o
drenaje abierto) pueden interrumpir al M6800 a través de la misma línea /IRQ.
210 Microprocesadores y microcontroladores
y, por ende, la entrada /IRQ del 6800 a su estado inactivo ‘1’. Dicha lectura o
escritura puede ser la misma que se ejecuta para tomar el dato que suministra el
periférico (entrada) o la correspondiente al dato que le enviamos (salida), o bien
puede tratarse de una lectura o escritura muda (de no importa qué dato).
activa
D Adapt. D D
/INTA1 /INTA2 /INTAn
CPU EN EN EN
(M6800) /IRQ
/IRQ1 /IRQ2 /IRQn
DIR1
Decod. DIR2
Direcc.
DIRn
Bus Datos
Bus Direcciones
D Q
/IRQ
‘0’
Interrupción procedente
de un periférico
D M6800
clk
set
Reconocimiento
Interrupción
16 BDir
DIR1
Decod. DIR2
Direcc.
DIRn
Bus Datos
Bus Direcciones
Periférico i
/INTA Periférico i+1
(entrada) /INTA
(salida)
(Consideramos que /INTA se
mantiene a ‘0’ tan solo un instante.)
Set D
CPU /IRQ
FIGURA 5.24. Arriba, gestión de múltiples interrupciones por encadenamiento (daisy chain). Abajo,
un posible esquema de la lógica del encadenamiento de interrupciones (D=‘0’ indica solicitada /IRQ).
EN EN EN
/IRQ PIC /IRQ1
/IRQ2
CPU
/IRQn
DIR1
Decod. DIR2
Direcc.
DIRn
Bus Datos
Bus Direcciones
FIGURA 5.25. Gestión de múltiples interrupciones por vectorización; hemos denominado PIC al
controlador de interrupciones. Cuando el PIC suministra el código del periférico y activa /INTA, la
CPU accede al periférico en cuestión colocando su dirección en el bus, activándose la
correspondiente línea DIR salida del decodificador de direcciones, la cual, además de habilitar la
conexión del periférico al bus, pondrá a ‘1’ (reposo) el biestable indicador de interrupción.
TABLA 5.4. tabla de vectores de interrupción del 68HC11. El orden en la tabla indica prioridad
creciente (la de mayor prioridad es RESET). Para cada interrupción se indica el bit del CCR que
puede enmascararla y el bit propio que permite enmascararla individualmente.
Entradas y salidas (I): aspectos básicos 217
68HC11
I CCR
Máscara global
Interrupción Interrupción
(externa) (interna)
Máscara particular
Flag indicador
solicitud
interrupción
FIGURA 5.26. Máscaras global y específicas en las interrupciones enmascarables del 68HC11.
Entradas y salidas (I): aspectos básicos 219
Canales de DMA
adicionales
DACK
Reconocimiento DMA Controlador de DMA Periférico con
Petición de dato capacidad DMA
BA/HOLDA Dir origen
DRQ
Dir destino Aceptación
HALT/HOLD
Tamaño bloque Al bus de
Solicitud DMA datos
Al bus de
direcciones
DACK
Controlador de Periférico con
Registro Memoria
DMA DRQ capacidad DMA
Direcciones
Direcciones Dato de la CPU
a memoria
Dato del periférico a la CPU
Bus Datos
Bus Direcciones
DACK
Controlador de Periférico con
Registro Memoria
DMA DRQ capacidad DMA
Direcciones
Direcciones
Bus Datos
Bus Direcciones
6.1. Introducción
Expuestos en el capítulo anterior los conceptos fundamentales sobre las
entradas/salidas (E/S), como son las técnicas disponibles y los aspectos más
básicos referentes a los circuitos adaptadores, en éste que comienza trataremos
de una forma amplia el tema de los periféricos y su control.
Así, hemos visto ya que un puerto de salida se construye en torno a un
registro que mantiene los datos enviados por la CPU hacia un periférico de
salida, mientras que un puerto de entrada se realiza a partir de buffers triestado
que en un instante dado se habilitan para permitir el paso de datos procedentes
de periféricos de entrada hacia bus interno. También hemos estudiado los
aspectos más básicos de los puertos programables de E/S, como la PIA 6821,
cuyas líneas pueden hacer el papel de entradas o salidas, dependiendo de cómo
sean programadas. Por motivos pedagógicos (para «dosificar» la información),
hemos dejado para el presente capítulo el estudio de los detalles más complejos
de la operación de un puerto paralelo como la PIA (los relacionados con sus
líneas de diálogo o control).
Por otro lado, en el capítulo anterior nos hemos centrado en el estudio de
los puertos paralelos, que envían o reciben varios bits a la vez (normalmente
ocho). Sin embargo, existe otra modalidad de intercambio de datos
denominada comunicación serie, consistente en enviar los bits que componen
un dato secuencialmente (uno tras otro) por una única línea. Para facilitar la
comunicación serie suele hacerse uso de circuitos adaptadores específicos,
como las UART (Universal Asynchronous Receiver Transmiter); en este
capítulo estudiaremos el ACIA 6850 de Motorola como ejemplo de UART.
Para concluir el estudio del subsistema de E/S, trataremos al final de este
capítulo los periféricos más habituales que suelen aparecer en los sistemas
microprocesadores, así como algunos de los sistemas de almacenamiento
masivo de la información más habituales. Asimismo, estudiaremos los bloques
(periféricos) que aparecen integrados en un microcontrolador típico como es el
68HC11; dada la complejidad del 68HC11, sería necesario dedicar varios
capítulos completos al estudio de los muchos periféricos que integra (conversor
224 Microprocesadores y microcontroladores
de modo que la CPU deberá consultar el estado del A/D y leer el dato
solamente cuando haya acabado de convertir.
1 DATO
2 DATO
Dato Recibido
(STRA, CA1)
3
CPU+puerto Periférico
(retira señales) (espera)
4
CPU+puerto Periférico
(fin (retira señal, fin)
transferencia)
FIGURA 6.1. Esquema de un proceso genérico de comunicación con diálogo (handshaking), con
iniciativa de la CPU (si la iniciativa fuese del periférico, en vez de ‘Dato recibido’, se tendría
‘Solicitud de dato’).
226 Microprocesadores y microcontroladores
Para indicar si cada una de las líneas de cada puerto A y B trabajan como
entradas o como salidas se hace uso de los registros de dirección de los datos,
DDRA y DDRB, que tienen asignada también una dirección dentro del mapa de
memoria (recordemos que comparten la misma dirección que ORA y ORB,
respectivamente). Un ‘0’ en un bit i de DDRA hace que la línea i asociada
haga de entrada, mientras que un ‘1’ programa dicha línea como salida.
La PIA dispone de dos registros adicionales (uno por puerto), los registros
de control CRA y CRB; de sus 8 bits hasta ahora solamente hemos estudiado el
papel del bit 2 de CRA(B) (como todo lo que comentemos para el puerto A
sirve para el B, para simplificar las explicaciones escribiremos el nombre de un
puerto o registro particularizado para A, y añadiremos la letra B entre
paréntesis). Puesto que DDRA(B) y ORA(B) tienen asignada una misma
dirección, la manera de distinguir si se va a operar sobre uno u otro es el estado
actual de dicho bit 2, CRA(B)[2] (denotaremos un bit particular de un registro
escribiendo su número entre corchetes): así, si CRA(B)[2]=‘0’ (léase «el bit 2
de los registros de control A o B vale ‘0’»), se estará realizando una acción de
lectura/escritura sobre DDRA(B), y, si CRA(B)[2]=‘1’, será sobre ORA(B).
Modo pulso:
Si CRA(B)[5]=‘1’, CRA(B)[4]=‘0’ y CRA(B)[3]=‘1’ ⇒
Como antes, sólo que el retorno de C2 (A o B ) a ‘1’ se produce
cuando fin de R/W, en flanco ‘1’ a ‘0’ del siguiente pulso E
FIGURA 6.3. Programación de los bits de los registros de control CRA y CRB de la PIA 6821.
230 Microprocesadores y microcontroladores
FIGURA 6.4. Control de un conversor A/D haciendo uso de las líneas de diálogo de la PIA.
232 Microprocesadores y microcontroladores
FIGURA 6.5. Puertos B y C del 68HC11, y registros y líneas involucradas en las E/S con diálogo.
PORTCL $1005 Registro de retención del valor de PORTC (PORT C Latched data).
PIOC STAF STAI CWOM HNDS OIN PLS EGA INVB $1002
FIGURA 6.6. Diagrama detallado de PIOC. STAF es un indicador (flag), el resto son biestables
sobre los que pueden escribirse las distintas opciones.
El periférico pone
dato y STRA a ‘1’ 68HC11
toma dato
Puerto C (entrada)
STRA (entrada)
Dato listo
b) Salida con validación por puerto B (strobed input port B). En este caso, al
escribir un dato en el puerto B (por ejemplo, STAA $1004), el HC11
automáticamente envía una señal por STRB de dos ciclos E de duración
(indicando así «dato disponible» o «dato válido»). En este caso es el bit
INVB el que define el nivel activo de la señal STRB (‘0’ para bajo, ‘1’ para
alto), dependiendo del periférico con el que se deba comunicar. El
periférico debe vigilar el estado de la salida STRB y tomar el dato presente
en las líneas del puerto B tan pronto observe un nivel activo.
68HC11
escribe dato
CPU escribe dato
E-clk
Dato disponible
STRB (salida)
En alto 2 clk
El periférico ya
puede tomar el dato
Entradas y salidas (II): control de periféricos 237
Lectura de PORTCL
‘Listo’
E-clk
Puerto C
(entrada)
238 Microprocesadores y microcontroladores
b) Salida por puerto C con diálogo (handshake output port B). En este modo,
cuando el programa que ejecuta el HC11 escribe un dato en PORTCL, éste
aparece en las líneas del puerto C y STRB es automáticamente activada
(«dato válido»); el periférico, al observar STRB activo, toma el dato y
activa (o envía un pulso por) STRA («dato recibido»); la activación de
STRA hace que STRB retorne automáticamente a reposo, poniéndose el
indicador STAF a ‘1’ («dato recibido»); el periférico, al observar que STRB
retorna a reposo, desactivará STRA (a no ser que operen con pulsos en vez
de niveles, en cuyo caso esto no es necesario), cerrando el ciclo. Por lo
tanto, el programa sobre el HC11 solamente deberá ocuparse de observar
STAF y escribir un nuevo dato en PORTCL cuando éste se active; el
protocolo de diálogo descrito se desarrolla automáticamente.
E-clk
STRA (entrada)
FIGURA 6.7. Comunicación simplex (arriba), semi-dúplex (en medio) y dúplex completa (abajo).
SPDR SPDR
(Reg. datos maestro) (Reg. datos esclavo)
MISO MISO
Data in
SCK SCK
Reloj de la CLK
transmisión /SS /SS
+5 V GND
FIGURA 6.8. Diagrama básico de dos dispositivos «maestro» (master) y «esclavo» (slave)
comunicándose mediante un esquema serie síncrono (SPI).
242 Microprocesadores y microcontroladores
Línea en reposo
0 1 1 0 0 1 0 1 0 0 1 1
Dato
TxD
(data out)
Registro 1 Registro 2
RxD
(data in)
CLK1 CLK2
Bus Datos Salida datos
GND
(del microprocesador) (al periférico)
FIGURA 6.10. Comunicación serie asíncrona entre dos adaptadores (ACIA, UART...). El primero
está conectado al bus del sistema, el segundo es el adaptador del periférico.
Para llevar a cabo las tareas descritas, así como el resto de las acciones
protocolarias que deben efectuarse en una transmisión de este tipo, existen
adaptadores específicos denominados adaptadores serie asíncronos, o circuitos
UART (Universal Asynchronous Receiver/Transmiter).
La comunicación serie asíncrona es habitual entre computadores,
computadores y pantallas de rayos catódicos (CRT), terminales de ordenador,
impresoras, teletipos, etc.; por ejemplo, el famoso estándar RS-232 es un caso
particular de esta modalidad de comunicación de datos serie (de él hablaremos
más adelante). La comunicación serie asíncrona también se emplea en la
comunicación de datos a larga distancia mediante redes de comunicación, a
través de la línea telefónica, etc. En este último caso se requiere de un circuito
adicional denominado módem (contracción de modulador-demodulador), el
cual codifica las señales serie tipo TTL (0-5 V) del sistema microprocesador
modulando una onda portadora, que es la que se envía por la línea telefónica.
La modulación puede realizarse en amplitud (ASK, Amplitude Shift Keying),
frecuencia (FSK, Frequency Shift Keying) o fase (PSK, Phase Shift Keying).
Al final de la presente sección concretaremos algunos de estos detalles.
En la comunicación serie asíncrona se definen dos tipos de dispositivos:
a) DTE (Data Terminal Equipment), o terminal de datos. Por ejemplo, un
ordenador PC, una terminal de computador (pantalla más teclado), etc.
b) DCE (Data Communications Equipment), o equipo de comunicaciones.
Normalmente se trata del módem, aunque podría ser cualquier otro equipo.
Entradas y salidas (II): control de periféricos 245
DTE DCE
TxD
TxD (out)
DCD (in) TxD (in)
DCD (out)
CPU Buses RxD (in) RxD (out)
RxD
Al 2.º sistema
Tierra de señal
microprocesador
Línea
telefónica
UART (ACIA) Módem
DTE DTE
TxD
DCD (in)
TxD (out) DCD(out)
TxD (out)
Buses
CPU (1) Buses RxD (in) RxD (in) CPU (2)
RxD
Tierra de señal
FIGURA 6.11. Arriba, conexión directa DTE-DCE; abajo, conexión cruzada o de módem nulo
DTE-DTE (aunque no se muestran en la figura, también deben cruzarse las líneas de control).
+5V
74HC4024 300
Q7
2,4576 MHz 600
Q6
1200
Q5
HC14 HC14
CLK 2400
Q4
4800
Q3
24 pF 0,1 9600 TxC
µF Q2 RxC
Reset
2K2 2K2 Q1
Gnd puente
FIGURA 6.12. Esquema del ACIA 6850 (arriba) y generación de los relojes TxC y RxC (abajo).
TxD
DCD
TxD (out)
(in) TxD (in)
DCD (out)
RxD
CPU Buses RxD (in) RxD (out)
DTE DCE
DCD
DCD (in) DCD (out)
RTS
RTS (out) RTS (in)
ACIA CTS Periférico
CTS (in) CTS (out)
(UART) (Módem)
FIGURA 6.13. Conexión ACIA-periférico. Originalmente, este tipo de conexión se ideó para
módem, pero en la actualidad se emplea en aplicaciones diversas.
248 Microprocesadores y microcontroladores
Control 7 6 5 4 3 2 1 0
Register
Formato de palabra
Control de transmisión (control de /RTS y 0 0 0: 7 bits, paridad par, 2 bit stop
generación de IRQ al vaciarse TDR) 0 0 1: 7 bits, impar, 2 bit stop
0 0: /RTS=‘0’ e IRQ transmi. deshabilitada 0 1 0: 7 bits, par, 1 bit stop
0 1: /RTS=‘0’ e IRQ transmisión habilitada 0 1 1: 7 bits, impar, 1 bit stop
1 0: /RTS=‘1’ e IRQ transmi. deshabilitada 1 0 0: 8 bits, sin paridad, 2 bit stop
1 1: /RTS=‘0’ y envía un break (0 continuo) 1 0 1: 8 bits, sin paridad, 1 bit stop
por salida TxD, IRQ transm. deshabilitada 1 1 0: 8 bits, par, 1 bit stop
1 1 1: 8 bits, impar, 1 bit stop
Parity Error
Detectado error de paridad Clear To Send
Indica estado de la línea /CTS
Interrupt Request (a ‘1’ si módem preparado)
Indica que se ha solicitado
interrupción (se borra al Data Carrier Detected
leer RDR o escribr TDR) Indica estado de la línea /DCD
A ‘1’ si portadora no presente
(si línea /DCD=‘1’)
modo que ocupan la misma casilla de memoria; es el tipo de acceso el que los
discrimina: una lectura de datos sobre él supone que se trata de leer un dato
recibido, por lo que se toma el contenido de RDR; una escritura sobre esta
dirección supone que deseamos enviar un dato, por lo que se escribe sobre
TDR. Lo mismo sucede con los registros de control CR y estado SR (RS=‘0’).
Como en el caso de la PIA 6821, las líneas D0-D7 se conectan al bus de
datos, E al reloj del sistema y R/W indica lectura o escritura. La salida /IRQ
(drenaje abierto) se conectará a la entrada de interrupción /IRQ del µP.
En el ACIA 6850 la velocidad de comunicación se obtiene a partir de la
frecuencia base que proporciona un oscilador externo (que se conectará a las
líneas RxC y TxC, fig. 6.12), la cual puede ser dividida por 16 o 64 en función
de los bit 0 y 1 del registro de control (fig. 6.14). Dicho oscilador (que no se
debe confundir con el generador de reloj del sistema) suele construirse con un
cristal de cuarzo de 2,4576 MHz, cuya frecuencia se divide mediante un
contador [Huang 96, Motorola 88] (fig. 6.12, abajo). Para ello suele emplearse
un 74HC4024, contador de 7 bits por propagación que presenta al exterior el
estado Q de sus 7 biestables, dividiendo cada uno la frecuencia del anterior por
2; por ejemplo, Q2 proporcionará 2,4576 MHz dividido por 4, y si se programa
el ACIA para dividir por 64, se obtendrá una velocidad de comunicación de
2,4576 MHz/4/64=9.600 bits/seg. Tomando otras salidas, pueden obtenerse así
frecuencias entre 300 y 9.600 bits por segundo (fig. 6.12, abajo).
A la hora de utilizar el ACIA 6850 deben tenerse en cuenta las siguientes
cuestiones prácticas:
• Como habrá observado el lector atento, el ACIA no tiene patilla de RESET.
Su inicialización debe realizarse por programa, poniendo a uno los bits 0 y 1
del registro de control; la ejecución por programa del RESET del ACIA
tiene que ser la primera acción a ejecutar al proceder a su programación
(normalmente en la rutina de reset del sistema). La segunda acción
consistirá en programar el registro de control, para configurar la modalidad
de transmisión (paridad, velocidad, etc.); en particular, deberá establecerse
el valor de la señal /RST programando los bit 5 y 6.
• El ACIA puede solicitar interrupciones a la CPU. Si el bit 5 del registro de
control vale ‘1’ y el 6 ‘0’, se habilita la interrupción de transmisión, es
decir, se solicitará IRQ cuando el ACIA haya concluido de transmitir un
dato (indicando que el ACIA está preparada para transmitir un nuevo dato).
Por contra, la interrupción de recepción se habilita cuando el bit 7 del
registro de control está a ‘1’, solicitándose IRQ cuando el ACIA ha recibido
un nuevo dato (RDR lleno). Recordemos que el bit 7 del registro de estado
Entradas y salidas (II): control de periféricos 251
FIGURA 6.15. Generación de niveles RS-232 mediante el MAX232, y conexión al puerto serie de
un PC (para poder trabajar tan sólo con las líneas TxD y RxD se requiere puentear las líneas de
diálogo, tal y como puede apreciarse en el conector DB-25 de la derecha). El MAX232 convierte
los niveles de hasta dos canales serie.
incorpora líneas de diálogo, como las /DCD, /RTS y /CTS del ACIA. Estas
tres señales que se emplean en el diálogo ACIA-módem intervienen también en
protocolos de comunicación serie, como el conocido RS-232 (además de otras
líneas adicionales que no aparecen en el ACIA); de ahí que un conector típico
RS-232 esté compuesto de 9 o 25 pines (denominados DB-9 o DB-25). No
obstante, se debe tener en cuenta que cuando se trata de comunicar dos
dispositivos, por ejemplo, dos sistemas microprocesadores, para reducir el
número de cables necesarios a menudo se emplea únicamente TxD, RxD y la
tierra de la señal. Cuando haya que conectar un dispositivo que sólo trabaja
con estas tres señales (por ejemplo, el bloque SCI del 68HC11) a un equipo que
implementa la RS-232 completa (por ejemplo, un PC), entonces deben
puentearse algunas de estas señales, tal y como se muestra en la Figura 6.15 (de
esta manera, cuando el PC indica que está dispuesto a comunicarse le
engañamos devolviéndole su propia señal, deduciendo entonces el PC que
nosotros también estamos listos).
El SCI incorpora una serie de registros para programar y controlar su
funcionamiento, de cometido similar al de control y estado del ACIA. En
particular, permiten programar la velocidad de transmisión, teniendo en cuenta
que en este caso la frecuencia de transmisión se deriva del propio oscilador
interno del 68HC11. Con el SCI también resulta sencillo implementar una red
de área local, para que varios 68HC11 puedan intercambiar datos: a cada
68HC11 de la red puede asociarse una dirección, de forma que antes de enviar
un dato se envía en serie la dirección del microcontrolador al que el dato va
destinado, y aquel 68HC11 cuya dirección coincide con la enviada captura el
dato que llegará tras la dirección.
Como siempre, remitimos al lector interesado en el manejo del SCI al
manual de referencia del 68HC11 [Motorola 91], o a los libros sobre el
68HC11 que figuran en la bibliografía que aparece al final del libro.
Conociendo los principios de la comunicación serie descritos aquí, y ayudado
por los ejemplos que proporciona Motorola, no deberá tener el lector ningún
problema en comprender el funcionamiento detallado del SCI.
6.4. Periféricos
En esta sección estudiaremos algunos de los periféricos de uso más
habitual en los sistemas microprocesadores y microcontroladores, y
proporcionaremos diversos ejemplos de su control.
instrucción STAA $1004 (dirección del puerto B), observaremos que los 8
LED se iluminan (ya que los integrados suelen ser capaces de absorber más
corriente que la que pueden proporcionar, no es raro encontrarse con los LED
conectados justo al revés que en la figura, con sus cátodos conectados a la
salida del puerto o del amplificador; en este caso, para iluminar un LED habría
que colocar un ‘0’ en la línea de puerto.)
Pensando en periféricos que requieren una corriente importante se fabrican
buffers específicos. Por ejemplo, el ULN2003 y ULN2803 son conjuntos de 7 y
8 transistores Darlington respectivamente (Darlington transistor arrays),
integrados en un único chip, junto a un número similar de diodos de protección
contra sobretensiones causadas por cargas inductivas. Estos buffers pueden
suministrar de forma continuada hasta 500 mA de corriente, soportar picos de
600 mA y operar con tensiones de entrada de hasta 30 V y de salida de hasta 50
V, de modo que permiten iluminar directamente no sólo conjuntos de diodos
LED sino también pequeñas lámparas incandescentes, activar relés, motores
paso a paso, etc. Además, pueden interconectarse directamente con la mayoría
de las familias lógicas. En el apartado dedicado al manejo de dispositivos de
potencia presentaremos sus esquemas y mostraremos ejemplos de su empleo.
Por último, conviene tener presente que algunos microcontroladores
integran buffers para dotar a algunas de sus líneas de puertos de una capacidad
de manejo de corriente importante, de modo que permiten la conexión directa
de diodos LED u otro tipo de dispositivos sin necesidad de buffers externos.
Por ello, antes de realizar ningún tipo de montaje con microcontrolador deberán
consultarse detenidamente sus hojas de datos para averiguar las características
eléctricas que garantiza el fabricante.
FIGURA 6.17. Arriba: conexión de un pulsador a un 68HC11 y rebotes generados. Abajo: filtrado
de los mismos por hardware para un pulsador (izda.) y un conmutador (dcha.).
6.4.3.2. Interruptores
Otro de los periféricos habituales son los interruptores. Muy a menudo los
encontramos agrupados de 4 en 4 o de 8 en 8 en encapsulados DIP (de similar
tamaño a un circuito integrado). Se suelen emplear para indicar la
configuración actual del sistema (cantidad de memoria incluida, periféricos,
etc.) o el modo de funcionamiento de determinado equipo.
En la Figura 6.16 (dcha.) se muestra la conexión de un conjunto de 8
interruptores al puerto C del 68HC11 (configurado como puerto de entrada).
Cuando un interruptor se encuentra cerrado, la línea correspondiente queda
conectada a tierra, con lo que se leería ‘0’; si permanece abierto, la polarización
de su línea de salida mediante una resistencia de 10 K a +5 V hace que se lea
por la línea correspondiente un ‘1’. Con una instrucción LDAA $1003
(dirección del puerto C) el valor de los 8 interruptores quedaría guardado en el
acumulador A.
260 Microprocesadores y microcontroladores
6.4.3.3. Pulsadores
En la Figura 6.17 se muestra la conexión de un pulsador a la línea 7 del
puerto C del HC11. Si se mantiene pulsado, se apreciará un ‘0’ por dicha línea;
si no se pulsa, se tendrá un ‘1’. Es importante tener en cuenta que al accionar
un pulsador aparecen siempre rebotes, que pueden presentar el aspecto de la
fig. 6.17 (arriba). La duración de los rebotes será mayor o menor según la
calidad de los contactos del pulsador; para uno de calidad normal éstos pueden
manifestarse durante unos 10 ms al accionarlo y al soltarlo.
Por lo tanto, si un flanco del pulsador debe desencadenar cierta acción
sobre el microcontrolador (por ejemplo, incrementar un contador o ejecutar una
interrupción), se hace necesaria la eliminación o filtrado de dichos rebotes. En
ocasiones este filtrado puede hacerse por software, por ejemplo, esperando
unos 10 o 20 ms antes de responder a la acción del pulsador («dejando pasar»
todos los rebotes), o bien leyendo el estado del pulsador y no actuando hasta
que observemos que durante unas cinco veces consecutivas su valor no ha
cambiado. Combinando ambas acciones se tiene una solución muy robusta.
En ocasiones la solución software no es factible y hay que recurrir al
filtrado por hardware. Existen varias formas de filtrar estos rebotes, por
ejemplo, mediante una red RC más un inversor Schmitt (con histéresis), como
se muestra en la fig. 6.17. Existen circuitos comerciales, como el MC14490 de
Motorola, que integran esquemas de este tipo en una sola pastilla (en particular,
dicho circuito permite filtrar hasta 6 pulsadores).
Si en vez de un pulsador (dos terminales) se dispone de un conmutador
(tres terminales), se puede emplear para el filtrado un biestable RS, bien como
circuito integrado, bien configurado mediante dos puertas NAND o dos
inversores (fig. 6.17).
Otra solución es que un mismo puerto paralelo sea compartido por varios
periféricos, multiplexando la información. En el caso de los 6 visualizadores
podrían emplearse 4 líneas para enviar el dígito BCD, y otras 6 para indicar el
visualizador que lo debe mostrar; en total se requerirían 10 líneas con esta
técnica, frente a las 24 si se conectan de forma directa. Todavía se pueden
ahorrar más líneas si se emplea un decodificador 3 a 8, pues un código de 3 bits
basta para determinar uno de los 6 visualizadores; en este ejemplo tan sólo se
precisarían 7 líneas haciendo uso de esta técnica.
Un ejemplo simplificado que permite visualizar un número BCD de dos
cifras (entre 00 y 99) se muestra en la fig. 6.20. Para ello podemos llevar a
cabo el siguiente procedimiento: poniendo a tierra el colector común del
primer visualizador, sacaremos por el Puerto B del HC11 la cifra de las
decenas, a continuación pondremos a tierra el colector común del segundo (y a
5V la del otro) y colocaremos la cifra de unidades (fig. 6.20). Así, cargando el
valor %0001dcba y ejecutando STAA $1004, el dígito BCD de valor %dcba
aparecería en el visualizador de la izquierda (decenas); repitiendo la operación
con %0010hgfe, %hgfe aparecería en el de la derecha (unidades). Si el proceso
se realiza una y otra vez a suficiente frecuencia (más de 20 veces por segundo),
conseguiremos «engañar» al ojo, que apreciará los dos dígitos encendidos,
representando dos números diferentes. Esta técnica se denomina también
visualización dinámica, puesto que los datos no permanecen estáticos en el
puerto, sino que varían muchas veces por segundo.
teclado, el hardware resultará más caro (un integrado de este tipo cuesta varios
cientos de pesetas), pero la programación se reducirá enormemente (por lo
tanto, se empleará codificación hardware o software dependiendo de los
requisitos concretos de la aplicación en desarrollo).
FIGURA 6.22. Exploración de teclado por filas y lectura de columnas (tabla: fila-columna→ASCII).
266 Microprocesadores y microcontroladores
mediante determinadas rutinas (p.e., las kbhit() o getch() del lenguaje C). A
grandes rasgos, ésta es la solución adoptada en los teclados de los PC. Una
alternativa es que la pulsación de una tecla genere directamente una
interrupción, que indique al microprocesador que se ha pulsado una nueva tecla
y que debe leer su código.
Vidrio
Electrodos
Cristal líquido
Filtro polarizador
(horizontal)
Fondo reflectante
FIGURA 6.24. Esquema de las capas que componen una pantalla LCD (izda.) y nueva orientación
de las moléculas del cristal líquido situadas entre dos electrodos sometidos a un campo eléctrico
(dcha.).
Entradas y salidas (II): control de periféricos 269
los ASCII estándar (letras, ‘,’, ‘.’, espacio, etc.), pero además en el generador
de caracteres en ROM se incluyen algunos adicionales, como, por ejemplo,
símbolos del japonés, o la letra ‘ñ’. Existe también la posibilidad de que el
usuario genere algunos caracteres propios.
El módulo LCD está diseñado para que resulte sencilla su conexión a los
buses de un sistema microprocesador o al puerto paralelo de un
microcontrolador. Dispone de tres líneas de alimentación, tierra y contraste de
la pantalla, tres de control y 8 de datos:
1. Vcc: Alimentación (+ 5 v.).
2. Gnd: masa (0 v.)
3. Vo: control del contraste de pantalla (Vcc-Vo≈4,4 V a 25 ºC; depende de la
temperatura y del ángulo de visión, por lo que se incluye potenciómetro de
ajuste).
4. RS: Selección de Registro. RS=‘0’ si envío de instrucciones, RS=‘1’ datos.
5. R/W: Lectura (‘1’)/Escritura (‘0’).
6. E: habilitación. En reposo E=‘1’, cuando E=↓ se ejecuta instrucción o
visualiza dato.
7 a 14. DB0-7. Líneas de datos, permanecen en alta impedancia cuando E=‘0’.
Las posibilidades del módulo LCD son numerosas; el interesado deberá
acudir a sus hojas de características para conocer todos los detalles. A
continuación ilustraremos su empleo en un caso particular.
Ejemplo: Modo 8 bits, 16 caracteres y 1 línea. Los pasos a seguir para
programar el módulo de forma que opere en de modo son los siguientes:
1) Conexión de la alimentación. Módulo LCD en situación de reset (power-on
reset).
2) Establecimiento de modo 8 bits, 1 línea: RS=‘0’, DB0-7=%001100xx ($30).
(cada acción se ejecuta cuando E=↓, por lo que hay que hacer por programa
E=‘1’, a continuación E=‘0’, y esperar a que el módulo LCD concluya).
3) Activación del visualizador y del cursor: RS=‘0’, DB0-7=%$0000 1110
($0E).
4) Modo auto-incremento: RS=‘0’, DB0-7=%$0000 0110 ($06)
272 Microprocesadores y microcontroladores
FIGURA 6.25. Ejemplo de conexión del módulo LCD de Hitachi al 68HC11 (solamente se enviarán
datos, por lo que el puerto C se configura como salida y R/W se ha conectado a tierra).
(cada vez que se envíe un nuevo dato el cursor se moverá una posición a la
derecha).
5) Borrado de la pantalla: RS=‘0’, DB0-7=%$0000 0001 ($01). Fin de la
inicialización.
6) Escribir en DR los ASCII de los caracteres a representar: RS=‘1’, DB0-
7=código ASCII.
Otras instrucciones habituales son las siguientes: desplazamiento de
imagen a la izquierda al escribir un carácter ($07), mover el cursor a la
izquierda ($10), retorno del cursor al inicio ($02), borrado ($01), etc.
ULN 2003
Salida
16 Común
Común
Entrada
(TTL)
GND
1 GND (común)
V (12V)
V (20V)
ULN 2003 ULN 2003
Entradas TTL
Entrada TTL
test de
lámparas
FIGURA 6.26. Arriba, esquema del ULN2003 (izda.) y circuito equivalente del buffer inversor
(dcha.) Abajo, ejemplo del empleo de su empleo para alimentar lámparas (izda.) y una carga
inductiva (dcha.).
274 Microprocesadores y microcontroladores
FIGURA 6.27. Diagrama de bloques del 68HC11E9. Se incluyen todas las líneas del
microcontrolador, y se señalan todas sus posibles funciones. La tensión VPPE de programación
(que comparte pin con XIRQ) se aplica solamente a las versiones con EPROM (HC711).
Canal seleccionado,
Conversion Complete Flag
CD a CA
A ‘1’ cuando termina de convertir
7 6 5 4 3 2 1 0
FIGURA 6.28. ADCTL ($1030): registro de control del módulo de conversión A/D del 68HC11.
FIGURA 6.30. ADCTL ($1030): registro de control del módulo de conversión A/D del 68HC11.
7 6 5 4 3 2 1 0
$100E TCNT
Timer Count (16 bits)
$100F (registro de sólo lectura)
PA6/OC2
flag
OC2F
IRQ
OC2I
$1018 TOC2
Timer Output Compare
$1019 Register (16 bits)
7 6 5 4 3 2 1 0
Flag de OC2
Se activa (‘1’) cada vez que el contador
coincide con el valor del registro TOC2
Se borra (‘0’) escribiendo un ‘1’ sobre él
PA6/OC2
+
100 µF
74LS04
8Ω
FIGURA 6.32. Generación de sonidos por altavoz. El integrado 74LS04 genera la corriente
necesaria, y el condensador protege la circuitería digital.
Capítulo 7
Desarrollo de sistemas microprocesadores
7.1. Introducción
Hasta el momento se han estudiado los conceptos fundamentales sobre diseño
de sistemas basados en microprocesadores, tanto a nivel de hardware como de
software; en el presente capítulo abordaremos algunas cuestiones más prácticas,
por ejemplo, hablaremos de los campos de aplicación de los microprocesadores,
de las fases típicas del desarrollo de un sistema, de las herramientas más
habituales, y expondremos también algunas consideraciones que se deben tener en
cuenta en la elección del microprocesador más adecuado para cada aplicación.
Además, existe cierta tendencia a pensar en un sistema microprocesador
como sistema lógico (digital) que debe programarse, pero en el fondo se trata de
un sistema electrónico de elevada complejidad; por ello, a los aspectos más
obvios relacionados con el diseño digital y del software habrá que añadir los
eléctricos/electrónicos y de consumo. Así, resultará importante tener en cuenta
las características eléctricas y temporales de las señales, buses, conexiones,
circuitería, etc., pues, de otra manera, en el desarrollo de un sistema
microprocesador pueden aparecer problemas imprevistos que impidan su correcto
funcionamiento (retrasos en las señales, capacidad de carga de los buses, ruido,
etc.). Algunas consideraciones de este tipo, importantes a la hora de desarrollar
un sistema basado en microprocesador, serán expuestas también en este capítulo.
Desde hace unos años es creciente la tendencia de incorporar cierta cantidad
de electrónica en productos y equipos manufacturados, desde aparatos de
consumo hasta electrodomésticos, pasando por el automóvil, el hogar, las
máquinas industriales, etc. Este «ingrediente» electrónico tiene como fin
introducir cierto componente de «inteligencia» en el equipo, que permita mayores
prestaciones, ahorro de energía, facilidad de uso, etc. Casi todos estos circuitos
electrónicos incluyen uno o más microprocesadores (microcontroladores), por
consideraciones diversas, como simplicidad de diseño, precio y tamaño reducidos,
fiabilidad, reprogramabilidad, etc.
Por lo tanto, sin ser conscientes de ello, estamos rodeados de
microprocesadores tanto en la calle como en casa, en el trabajo y en el ocio. Por
ejemplo, un microcontrolador de ocho bits gestiona el horno microondas, o
controla el contador de la luz; muchos sensores de temperatura inteligentes
292 Microprocesadores y microcontroladores
Sensor
Acondicionador
Acondicionador C. A/D
Proceso RAM/ º
µP/µC/DSP
ROM
Actuador/
Carga
Acondicionador/
Acondicionador
Potencia
Fuente de energía
FIGURA 7.2. Cada problema viene caracterizado por su magnitud y velocidad requerida. En el
gráfico se muestra la solución óptima para cada situación (aunque faltaría incorporar en el gráfico un
tercer parámetro muy importante: el precio de cada alternativa).
Así, en cuanto a tamaño del sistema se refiere, el nicho ocupado por los
microprocesadores se solapa en ocasiones con el de otros dispositivos, como PLD
y ASIC. Sin embargo, otro parámetro importante a tener en cuenta es el
rendimiento (o velocidad de proceso), que resulta ser una restricción importante
en el uso de microprocesadores en determinadas aplicaciones. El
microprocesador funciona a frecuencias de reloj de varios megahertzios, con lo
que puede ejecutar una instrucción en el orden del microsegundo. En general, un
microprocesador deberá ejecutar varias instrucciones para realizar determinada
tarea, por lo que los tiempos que involucran serán en realidad superiores. Por lo
tanto, si la aplicación en curso requiere respuesta lenta (imaginemos una máquina
expendedora de refrescos) un microprocesador puede ser una buena solución,
mientras que si requiere elevada velocidad deberá recurrirse a otros medios.
Esto último sucede, por ejemplo, en telecomunicaciones o en multimedia,
campos en los que deben ejecutarse complejos algoritmos matemáticos en tiempo
real; como un microprocesador convencional no proporciona suficiente velocidad
para estos casos, se ha desarrollado un tipo especial de microprocesador de
elevadas prestaciones denominado procesador digital de señal (DSP) (a veces se
integra un módulo DSP junto con el µP de propósito general). Si aun así no se
obtiene la velocidad requerida, deberá construirse un circuito electrónico
296 Microprocesadores y microcontroladores
Conexión
COMIENZO alimentación COMIENZO
INICIALIZAR RESET
Programa
monitor o :
sistema :
operativo : :
: :
:
:
FIN
A) B)
FIGURA 7.4. A) Software en lazo abierto (en RAM); B) en lazo cerrado (en ROM).
COMIENZO
Rutina RESET
RESET (inicialización) Rutina Servicio
Interrupción (i)
Principal
IRQ Rutina IRQ (i)
Programa
Principal :
: :
: RTI (retorno)
:
:
apéndice que hace referencia al denominado «Kit del 68HC11», al final del libro).
El 68HC811E2 es la versión que más EEPROM incluye, 2 KB, permitiendo
almacenar un programa de tamaño respetable.
En la actualidad existe una evidente tendencia en el sentido de integrar en
microcontroladores el nuevo tipo de memoria denominada flash. Recordemos
que la memoria flash, como la EEPROM, puede escribirse y borrarse
eléctricamente, con la salvedad de que no puede hacerse byte a byte, sino por
bloques, aunque la memoria flash cuenta con la enorme ventaja de basarse en una
celda mucho más simple que la EEPROM, permitiendo así integrar grandes
cantidades. Los microcontroladores de las familias más modernas, como la
68HC08 (evolución del 68HC05) y la 68HC12 (evolución del 68HC11) integran
ya memoria flash; lo mismo sucede con algunas versiones del 68HC16 (el
68HC916X1 integra 50 KB de memoria flash).
Al parecer, poco a poco se tenderá a sustituir la memoria EPROM por flash,
ya que, contando con densidades de almacenamiento similares, la flash puede ser
reprogramada sin necesidad de incorporar ventana en el encapsulado, permitiendo
además el borrado y re-programación del dispositivo sin necesidad de retirarlo de
la placa donde se encuentre (ello permitiría llevar a cabo actualizaciones del
software, depurar errores, etc., lo cual podría hacerse a distancia, sin más que
mantener el microcontrolador de una aplicación conectado a una red de datos).
bits (no todos), o los de 16 y 32 bits, pero puede no resultar viable en el caso de
los menos potentes de 8 bits o de 4 bits, debido a que los recursos limitados que
poseen (pequeño número de registros, tamaño de pila y capacidad de memoria
reducidos) pueden no ser idóneos para el empleo de lenguajes de alto nivel.
Aunque hace ya algunos años se desarrollaron compiladores de Pascal o
BASIC para microprocesadores de 8 bits, realmente el empleo de lenguajes de
alto nivel para microprocesadores y microcontroladores pequeños se ha extendido
solamente desde hace unos cuantos años, sobre todo el del lenguaje C. Una de las
razones quizás sea que C se ha convertido casi en un estándar de los lenguajes de
programación (es sin duda el lenguaje más empleado en todo el mundo), y C
cuenta con la particularidad de poseer instrucciones más próximas a lo que sería
un lenguaje ensamblador típico que el resto de los lenguajes de alto nivel (de
hecho, se suele afirmar que C es un lenguaje de nivel intermedio).
Son fundamentalmente tres las ventajas de programar un microcontrolador de
8 bits (como el 6805, 68HC11 u 8051) en lenguaje C [Gray 95]:
a) Ahorro en tiempo de programación. Un lenguaje de alto nivel resulta más
próximo a la manera de pensar del programador.
b) Portabilidad del código generado. Si se desarrolla una aplicación para un
68HC11 y posteriormente se decide emplear un 8051, buena parte del código
escrito en C sería aprovechable.
c) Mantenimiento del código. El código desarrollado en C será más fácil de leer
y mantener (en el sentido de introducir mejoras o modificaciones en el futuro),
al resultar mucho más legible que el ensamblador.
Por otro lado, las desventajas del empleo de un lenguaje de alto nivel como
es C para la programación de microcontroladores de tipo medio y bajo son las
siguientes:
a) El código generado tiende a ser más extenso que el desarrollado en
ensamblador (una instrucción C equivale a varias ensamblador).
b) Será más lento (debido al punto a) ).
c) Necesita más memoria ROM para guardar el programa (debido al punto a) ).
d) Necesita mucha más memoria RAM, debido al amplio uso de la pila que C (y
otros lenguajes de programación) realiza.
308 Microprocesadores y microcontroladores
Integración hard/soft
Depuración global
Programación EPROM/EEPROM
Prototipo final
decenas de miles de ellos en versión ROM el precio puede descender hacia las
cien pesetas.
El precio de los DSP resulta también muy variado, aunque, en general, es
bastante más elevado que el de los microcontroladores. Los de gama más alta
superan las 20.000 ptas., pero los más modestos vienen a costar por debajo de
10.000. Últimamente ha descendido de forma importante el precio de ciertos DSP
de bajas prestaciones (16 bits y punto fijo) cuando se adquieren en grandes
cantidades (Texas y Analog Devices venden los más sencillos por unas 1.000
ptas. si se adquieren 100.000 ejemplares), por lo que se están empezando a utilizar
DSP en aplicaciones antes totalmente vedadas, como las relacionadas con
productos de consumo e industriales (por ejemplo, el control de motores eléctricos
mediante complejos algoritmos matemáticos).
Por último, el precio de los potentes microprocesadores empleados en
aplicaciones de computación resulta obviamente bastante más elevado que el de
los anteriormente expuestos: varias decenas de miles de pesetas para los más
modestos, y superando ampliamente la barrera de las 100.000 ptas. para el caso de
los más modernos y potentes.
En la tabla 3.2 (capítulo 3), se mostraba la posición de cada compañía en el
mercado en cuento a número de microcontroladores vendidos en los últimos años.
La conclusión que extraíamos era que así como Intel es líder indiscutible de
ventas de microprocesadores, Motorola lo es de microcontroladores (y con gran
diferencia respecto de sus competidores). Ya desde mitad de los años setenta
Motorola se distinguió por sus contratos con grandes empresas (como las
automovilísticas), a las que suministra millones de ejemplares de µC cada año.
En resumen, en cada aplicación debe seleccionarse el µP que más se ajuste
por sus características y precio. La ventaja del microcontrolador sobre el
microprocesador en aplicaciones específicas es clara: reducido tamaño del
sistema resultante, menor consumo y precio, mayor fiabilidad y menor tiempo de
diseño. El DSP, destinado en origen al campo de las telecomunicaciones y
multimedia, coincidiendo con la bajada de precios de las versiones más sencillas
ha comenzado a emplearse ya en aplicaciones de consumo e industriales.
baratas que las EPROM sin ventana (OTP), y que las más caras de todas son
las EPROM con ventana.
e) Elementos integrados (memoria, líneas de entrada/salida, temporizador,
UART, SPI, conversor A/D, etc.).
f) Capacidad de memoria y velocidad. Debe evaluarse la cantidad y tipo de
memoria integrada (ROM, EPROM, EEPROM, flash). Por otra parte, debe
tenerse en cuenta que la velocidad no la mide solamente la frecuencia de reloj,
pues algunos microprocesadores que operan a más MHz precisan muchos más
ciclos de reloj por instrucción.
g) Consumo. Los microprocesadores clásicos se alimentan a 5 voltios, mientras
que muchos de los modernos lo hacen a 3,3, 2,4 o 1,8 voltios. Su interés
dependerá de la aplicación en desarrollo (resultará crítico en las aplicaciones
portátiles).
h) Soporte software y sistemas de desarrollo, tanto a nivel de disponibilidad,
como de prestaciones y precio.
i) Soporte lenguajes de alto nivel (lenguaje C, lógica borrosa o fuzzy).
j) Soporte técnico (página web, libros de datos y CD ROM, apoyo telefónico por
ingenieros de la casa, etc.).
7.5.3. Encapsulado
Existen multitud de encapsulados diferentes, unos de plástico y otros
cerámicos. Las denominadas series comerciales, más baratas, emplean
encapsulado plástico, soportando temperaturas de 0 a 70 ºC. Las denominadas
series militares emplean encapsulado cerámico, de mayor fiabilidad, soportando
temperaturas de −55 a +125 ºC, pero de un precio más elevado (debe tenerse en
cuenta que siempre se hace referencia a la temperatura del integrado, que
normalmente es superior a la del ambiente que lo rodea).
Los tipos de encapsulados que se emplean en microprocesadores y
microcontroladores son similares a los del resto de los circuitos integrados, sólo
que el número de pines en determinados casos puede resultar enorme. El
encapsulado más clásico es el DIP (Dual In-line Package), a veces también
denominado DIL, siendo comunes los integrados DIP de 16, 20, 24, 28, 40 y 48
patillas. El DIP ha sido utilizado en los microprocesadores más clásicos y se
emplea todavía en los microcontroladores de menos prestaciones, que suelen
poseer un número de patillas relativamente reducido.
Sin embargo, cuando el número de pines se eleva por encima de 40, el
encapsulado DIP ocupa un espacio excesivo, por lo que la industria ha ido
introduciendo nuevos tipos conforme aumentaba el número de pines requerido.
324 Microprocesadores y microcontroladores
TABLA 7.2. Retrasos tolerables (tiempo de propagación inferior a un 20% del período de reloj) para
diversas frecuencias de reloj típicas de un sistema microprocesador.
FIGURA 7.9. Familias lógicas. Obsérvese que la línea dominante es lograr circuitos más veloces y/o
de menor consumo.
Hablando en términos generales, las series más empleadas hasta hace unos
años eran la LS y la HC, empleándose cada vez más la HC por su bajo consumo.
En la actualidad cada vez es menor el empleo de la LS, y probablemente
disminuya el de la HC; ambas familias tenderán a ser suplantadas por las más
avanzadas ALS y AC, respectivamente. Si se requiere bajo consumo, la familia
CMOS denominada LV (Low Voltage), que opera con 3 V, es más indicada.
corrientes de entrada muchísimo más elevadas que los MOS; por lo tanto,
serán los integrados TTL conectados al bus los que fundamentalmente
determinen las características de carga estática.
b) Carga Dinámica (AC) o capacitiva. Viene determinada por la capacidad
eléctrica de entrada de los circuitos conectados a las líneas del bus, que al
ocasionar retrasos en la propagación de las señales limitará la velocidad de
operación del bus. La capacidad de entrada de los circuitos MOS es muy
superior a la de los TTL; por lo tanto, serán los integrados MOS los que
fundamentalmente determinen las características de carga dinámica del bus.
En definitiva, la capacidad de carga de un bus limita el número de integrados
TTL y MOS que pueden conectarse directamente. En el caso de los sistemas
compuestos por una única tarjeta resulta más difícil que pueda presentarse este
tipo de problemas, al ser el número de circuitos integrados conectados reducido
en general (no obstante, conviene comprobarlo). Sin embargo, en el caso de los
sistemas multitarjeta, como norma deben introducirse amplificadores de bus
(buffers), unidireccionales o drivers para los buses de direcciones y control, y
bidireccionales o transceivers para el de datos. Estos buffers deben conectarse
siempre tan próximos como resulte posible a los conectores de las tarjetas.
Trataremos a continuación los dos parámetros que deberán estudiarse para
determinar si en la operación del sistema en desarrollo en un momento dado
puede verse superada la capacidad de carga de sus buses. El primero de ellos
estará relacionado con la carga estática (intensidades), mientras que el segundo
hará referencia a la carga dinámica (capacidades eléctricas). Buena parte de los
datos que se proporcionan a continuación proceden de [Pollán 94].
En relación a la carga estática, para ambos niveles lógicos (alto y bajo) por
separado debe asegurarse que la suma de las corrientes requeridas por las entradas
de los integrados habilitados, más las corrientes de fuga (leaky currents) de los no
habilitados, sea inferior a la intensidad que puede suministrar el circuito driver de
bus más débil (excitadores o drivers de bus son aquellos circuitos que aportan
datos al bus, como el microprocesador, pastillas de memoria, puertos de entrada,
etc.). Para los integrados MOS las intensidades de entrada Ii son ínfimas, del
orden de los 10 µA, por lo que son los TTL los que determinan este parámetro.
Así, una línea de bus típica suele ser capaz de suministrar menos de 10 mA.
La intensidad que requiere una entrada en estado bajo es del orden de 1 mA para
la TTL estándar, 0,2 mA para la familia LS, 0,1 para la ALS y unos 0,6 para la
FAST. Para el caso de los CMOS es de unos 10 pA, es decir, absolutamente
despreciable. Por ello, el número de integrados TTL que pueden conectarse
directamente a una línea de bus no es muy elevado (por ejemplo, el 6800 puede
330 Microprocesadores y microcontroladores
suministrar alrededor de 2 mA, por lo que solamente puede alimentar una carga
TTL estándar).
Quizás sean los problemas relacionados con las cargas capacitas los más
habituales. La capacidad eléctrica de entrada de un integrado TTL resulta
despreciable frente a la de los integrados MOS, por lo que serán éstos los que
determinen dicho parámetro. Un circuito MOS suele presentar entre 1 y 20 pF de
capacidad de entrada, mientras que los dispositivos excitadores de bus
(microprocesador, memorias, etc.) suelen ser capaces de cargar capacidades entre
100 y 150 pF. Además, debe tenerse presente que las pistas del circuito impreso
contribuyen a la capacidad con alrededor de 1 pF por centímetro, por lo que
deberá procurarse que sean de mínima longitud.
Cada entrada MOS equivale a un condensador, que hay que cargar o
descargar en cada transición (incluso si el integrado se halla deshabilitado);
consideramos que su capacidad típica es de 3 pF. La carga y descarga de
múltiples entradas capacitivas que soporta una línea de bus supone el aumento del
tiempo de conmutación, lo que se traduce en un retraso en la propagación de las
señales. Así, si el fan-out de una línea es n, supuesta un intensidad de 10 mA, y
considerando una capacidad típica de 3 pF, se tendría el siguiente retraso:
nCi ∆V n ⋅ 3 pF ⋅ 5V
∆Q = nCi ∆V ⇒ I ⋅ t = nCi ∆V ⇒ t = = = 1,5 ⋅ n ns
I 10mA
es decir, de aproximadamente 1,5 ns por integrado MOS conectado a la línea, lo
que para n=10 representa unos 15 ns, y para n=100, unos 150 ns, que resulta
sumamente alto.
Por lo tanto, cuando deben conectarse a un bus numerosos integrados, sean
TTL o MOS, hay que emplear circuitos adaptadores o amplificadores de bus
(drivers o transceivers), de tipo triestado y de alta intensidad de salida, que
aumentan la capacidad de carga del bus (es decir, la intensidad suministrable por
sus líneas). Los adaptadores 74244 y 74245 son típicos bus drivers y
transceivers, respectivamente. Por ejemplo, para el caso de la hoy en día muy
habitual serie ALS, la intensidad de salida en estado bajo IOL es de 24 mA en
ambos circuitos, y 15 mA en estado alto IOH. El 74ALS244 presenta tiempos de
propagación menores de 10 ns y el 74ALS245 menores de 20 ns. Otro
amplificador de bus unidireccional típico es el 74241, que solamente se diferencia
del 244 en sus líneas de habilitación.
Desarrollo de sistemas microprocesadores 331
FIGURA 7.10. Esquema lógico del driver 74244 y del transceiver 74245.
FIGURA 7.11. Patillas de los drivers 74241, 74244 y 74541, y del transceiver 74245.
TABLA 7.4. Corriente de fuga (suministrada por el integrado que haga de driver de bus) y capacidad
eléctrica de las líneas de buses (datos, dirección, RIW) que presentan los integrados típicos de un
sistema basado en el 6800 cuando se sitúan en alta impedancia.
Desarrollo de sistemas microprocesadores 333
FIGURA 7.12. Señal lógica ideal y señal real (con ruido). Si la «espiga» en la señal real tuviese
suficiente anchura, algún circuito podría considerarla como un estado lógico alto.
FIGURA 7.13. Distribución en forma de rejilla de las líneas de alimentación y tierra, con
condensadores de filtrado de alimentación (global de 10 µF, y distribuidos de 10 nF).
FIGURA 7.14. Caída de tensión de alimentación (espiga) ocasionada por un consumo instantáneo
elevado. Dicha caída es suavizada por un condensador de desacoplo.
a)
b)
FIGURA 7.15. a) Ruido cruzado. b) Protección mediante líneas de tierra entre líneas de señal.
Desarrollo de sistemas microprocesadores 337
7.7.1. Consumo
El consumo es un aspecto muy importante en todo circuito electrónico de
mediana complejidad, como son los basados en microprocesadores y
microcontroladores (p.e., un «sencillo» 68HC11A8 integra ya más de 100.000
transistores, y un Pentium varios millones), y resulta crítico en las denominadas
aplicaciones portátiles, con alimentación a baterías. Es bien sabido que el
consumo de los circuitos bipolares es superior al de los MOS, y que dentro de los
MOS las familias CMOS son de bajo consumo, existiendo algunas específicas,
como las LV, de muy bajo consumo. También sabemos en el caso de las familias
CMOS que el consumo aumenta al incrementarse la frecuencia de reloj del
sistema.
Un microprocesador antiguo como el 6800, de tecnología NMOS, pese a su
sencillez y baja frecuencia de reloj, presenta un consumo relativamente
importante, de unos 240 mA a 5 V, pudiendo disipar a lo máximo 1,2 W de
potencia. En el caso de los microprocesadores más modernos y potentes (como el
Pentium), de tecnologías CMOS o BiCMOS, al operar a frecuencias de reloj
elevadas e integrar millones de transistores, el consumo puede resultar muy
elevado, por lo que una tendencia actual es reducir la tensión de alimentación (por
debajo de 3 e incluso 2 voltios).
Estudiaremos con más detenimiento el caso del microcontrolador M68HC11,
como ejemplo de cómo se manejan los aspectos relativos al consumo en un
microcontrolador típico actual. El 68HC11 es un microcontrolador diseñado con
la idea de limitar de una manera importante el consumo. Por un lado, al realizarse
en tecnología HCMOS, su consumo ya es en sí mucho más reducido que el de un
microprocesador NMOS como el 6800. Por otro lado, se trata de un diseño
completamente «estático» (no emplea ningún tipo de almacenamiento dinámico
en registros DRAM, como sucedía en el 6800), por lo que, si en una aplicación no
se requieren velocidades de operación importantes, puede reducirse su frecuencia
de reloj. Para aplicaciones de bajo consumo existen dentro de la familia versiones
L (Low Voltage), que pueden trabajar con tan sólo 3 voltios de alimentación,
como, por ejemplo, la M68L11E9.
Además, todos los ejemplares de 6811 incorporan dos instrucciones, WAI y
STOP, que permiten colocarlo en sendos modos de bajo consumo en los períodos
en los que no se requiera del servicio del microcontrolador (p.e., una calculadora
electrónica olvidada encendida en un cajón, o un mando a distancia que no se
acciona). La instrucción WAI almacena los registros en la pila y coloca al HC11
en una situación de «espera interrupción» (WAit for Interrupt), reduciendo su
340 Microprocesadores y microcontroladores
TABLA 7.5. Consumo del MC68HC11E9 a 2MHz y alimentado a 5,0 V [Motorola 95]: corriente
máxima de alimentación (aportada por la fuente) que soporta el circuito integrado. Si el circuito se
alimenta a 3,0 V, o si se limita la frecuencia a 1 MHz, el consumo se reduce prácticamente a la mitad
en todos los casos (y a la cuarta parte si se reducen ambos).
Desarrollo de sistemas microprocesadores 341
INTEL MOTOROLA
4004
8008
MOS Tech.
8080 Rockwell
Zilog 6800
8048 Z80
6502
8085
6802
una versión derivada del 8086, de similar estructura y funcionamiento (por ello, a
menudo hablaremos del 8086/88), pero con bus externo de 8 bits, lo que permitía
su compatibilidad con los periféricos desarrollados para la familia anterior
8080/8085 (equiparables al 6800).
Es importante establecer ya desde el principio que precisamente la
compatibilidad es a la vez la mayor ventaja y desventaja de los µP de Intel. Esta
compañía se ha distinguido siempre por tratar de mantener la compatibilidad del
software al comercializar nuevas versiones de µP, para poder así aprovechar el
código previamente desarrollado. La gran desventaja de esta tendencia es no
poder sacar el máximo partido de las posibilidades que una nueva tecnología de
integración puede ofrecer, pues los nuevos desarrollos quedan «encorsetados» o
«lastrados» por el peso de la historia (compatibilidad).
Para comprender el porqué de la importancia del microprocesador 8086/88
retrocedamos a 1971. En esta fecha la joven compañía Intel (situada en el Valle
del Silicio en California), entonces especializada en la fabricación de chips de
memoria, inventa el microprocesador, de modo que sus primeros diseños (4004,
8008) no contaban con competencia alguna a principios de los años setenta.
Sin embargo, por la época en la que Intel saca al mercado el 8080 (1974)
multitud de compañías trabajan ya en sus propios diseños (como Motorola en su
6800). A mitad de década los microprocesadores más populares son, sin duda, el
6502 de la compañía MOS y el Z80 de Zilog; por otra parte, Motorola
comercializa el 6809 (la evolución del 6800), que se considera el microprocesador
de 8 bits más potente nunca construido. Intel, consciente de su pérdida de
mercado dentro de un campo que ellos mismos han inventado, trata de recuperar
el terreno perdido fabricando el primer microprocesador de 16 bits, el 8086, pero
Motorola en seguida comercializa el 68000, de 16/32 bits, en opinión de muchos,
más «racional», «elegante» y potente que el 8086.
Dada su delicada situación, Intel emprende una intensa campaña de
marketing tratando de vender su 8086 a diversas empresas (una de las claves del
éxito de Intel ha sido siempre su capacidad de marketing [Malone 96]).
Recordemos que por esta época los microprocesadores se empleaban casi
exclusivamente en tareas de control, sustituyendo lógica digital convencional
(dentro de calculadoras, terminales, etc.). Sin embargo, por entonces se empiezan
a comercializar ya los primeros microordenadores, pequeños computadores
basados en µP de 8 bits como el 6502, Z80, 8080 o 6800, de limitada capacidad
de cálculo, pero de gran atractivo para un amplio sector de aficionados. Avanzada
la década de los setenta una joven compañía denominada Apple alcanza un
enorme éxito con sus microordenadores basados en un 6502.
350 Microprocesadores y microcontroladores
AH AL
BDir (20)
BH BL
Cálculo
CH CL dirección
Registros
DH DL efectiva Σ
propósito
SP general
BP
BDat (16)
DI
SI
CS
BDat ALU (16) DS
SS
ES Control
IP de los
buses Buses
Registros Auxiliares Registros Auxiliares
8086/
8088
Sistema
de
Control
Cola de instrucciones
ALU
Bus Q (8)
1 2 3 4 5 6
Indicadores
:::::::
EU (Execution Unit) BIU (Bus Interface Unit)
FIGURA 8.2. Organización interna del 8086 (en el 8088 la cola es de 4 bytes).
15 87 0
AX AH AL Acumulador
BX BH BL Base
CX CH CL Contador
DX DH DL Dato
0 C Acarreo (Carry)
15 0
SP Puntero de pila
P Paridad (Parity)
BP Puntero base
SI Puntero origen
A Auxiliar (Auxiliary Carry)
DI Puntero destino
Z Cero (Zero)
CS Segmento de código
S Signo (Sign)
DS Segmento de datos
T Trampa (Trap)
SS Segmento de pila
I Máscara de int. (Int. Mask)
ES Segmento extra
D Dirección (Direction)
O Desbordamiento (Overflow)
IP Puntero de instrucciones
(contador de programa)
:::::::::: Registro
Indicadores
de estado
(flags)
(flags)
15
memoria y unidad de interfase con el bus, y puede operar en modos real (8086
ultra-rápido) y protegido. Opera a frecuencias de 25 y 33 MHz.
f) 80486 (1989, 32 bits), integra en una misma pastilla un 80386, FPU
(coprocesador matemático de 80 bits), 8 KB de caché. Incluye un pipeline de
5 etapas (sección 8.3) y opera a 50 y 66 MHz.
g) Pentium (1993, 32 bits, 64 de bus externo), es superescalar, con una gran
pipeline; incluye un núcleo procesador similar a un RISC, pero que resulta
transparente para el programador, dado que las instrucciones x86 clásicas
(CISC) son internamente convertidas a instrucciones de tipo RISC, que
realmente ejecuta. Se realiza en tecnología BiCMOS. Los primeros
ejemplares comercializados defraudaron, pues operaban a tan sólo 75 MHz,
pero las versiones posteriores trabajan a 100, 133, 166 y 200 MHz. En 1996
se introducen los Pentium MMX (MultiMedia eXtensión), que integran además
una unidad de tipo SIMD (capaz de ejecutar una instrucción sobre varios datos
a la vez), que se programa con 57 nuevas instrucciones y que permite acelerar
la ejecución de aplicaciones multimedia (166, 200 y 233 MHz).
h) Pentium Pro (1995, hasta 200 MHz, 64 líneas de direcciones que permiten
direccionar 64 GB), posee una gran caché de nivel 2 (L2), incorporada en el
mismo encapsulado que el procesador (pero integrada en un dado de silicio
distinto). Se emplea en servidores que trabajan bajo Windows NT y que
pueden contener hasta 4 CPU operando en paralelo.
i) Pentium II, Celeron, Pentium III, etc., se estudiarán en el siguiente apartado.
TABLA 8.1. Familia clásica 80x86 (MIPS= Millones de instrucciones ejecutadas por segundo).
arquitectura IA-32, pues está trabajando ya para que en el año 2001 (cuando ya se
habrá comercializado Merced) haya disponibles microprocesadores IA-32 a 1
GHz y bus a 200 MHz, con una tecnología de 0,13 micras.
Toda la información expuesta en esta sección ha sido extraída de revistas
como Electronic Design y Byte, así como de los catálogos, CD-ROM
(Developers’ CD-ROM) y página web de Intel (http://www.intel.com).
FIGURA 8.4. Diagrama de patillas del 8086 y 8088, en modo mínimo (se indican entre paréntesis las
señales en modo máximo).
360 Microprocesadores y microcontroladores
TABLA 8.2. Función de las líneas del 8086 en modo máximo y mínimo.
Microprocesadores de altas prestaciones 361
OSC
8284A CLK
(generador RESET
del reloj)
Cristal
14.31818MHZ
CLK RESET
MN/MX 74LS373 (3 X)
A19-A16 (registros de A0-A19
AD15-AD8 retención)
/OE LE
AD7-AD0 74LS245
(transceiver, D0-D7
i8088 bus datos)
DIR /OE
/S0-S2 ALE
8288
/MEMR
(controlador
/MEMW
del bus)
/IOR
/IOW
AEN
NMI /IO CH CKK
INTR READY /IO CM RDY
IRQ2-IRQ7
8259A
(controlador
de interrupciones)
DRQ1-DRQ3
8237A
/DACK0-3
(controlador
de DMA) T/C
±5V, ±12V
GND
FIGURA 8.5. Esquema simplificado de un 8088 configurado en modo máximo (izda), con los circuitos
de soporte que configuran las líneas del bus del PC original (dcha).
e) Bus local PCI. Para mantener la compatibilidad con los periféricos y tarjetas
desarrollados a lo largo de muchos años, la velocidad de los buses anteriores
era limitada. Los denominados buses locales, como VESA o PCI, surgen para
permitir comunicaciones mucho más rápidas entre el procesador y los nuevos
periféricos modernos de alta velocidad (tarjetas de vídeo, red, etc.). Por
ejemplo, el famoso PCI permite transferencias de datos de 32 o 64 bits a una
frecuencia máxima de 33 MHz (132 MB/s para datos de 32 bits). Estos
nuevos buses son incompatibles con los anteriores, por lo que en la tarjeta base
se incluyen controladores denominados puentes (bridges), que «traducen» las
señales del bus local a las de otros, como el EISA (fig. 8.7), para permitir que
en algunas de sus ranuras de expansión pueden conectarse las tarjetas ISA o
EISA de toda la vida.
f) USB (Universal Serial Bus). En los últimos años se han desarrollado unos
cuantos buses de tipo serie de gran velocidad (más rápidos que RS-232, pero
más lentos que los paralelos ISA o PCI). El más extendido es USB, por el cual
han apostado todos los fabricantes de PC (los actuales suelen incluir ya dos
puertos USB). Se trata de un bus que permite conectar múltiples periféricos al
PC (teclados, ratones, impresoras, tarjetas de adquisición de datos, etc.) en
configuración de cadena (daisy chain), siguiendo la filosofía Plug&Play y
evitando siempre tener que abrir la caja de la CPU del ordenador. USB
permite la conexión de hasta 127 dispositivos, con una velocidad de
comunicación de hasta 12 Mbits por segundo, con un único cable de hasta 5
metros (hasta a 30 metros del PC), que porta tanto datos como alimentación y
al cual los periféricos pueden conectarse sin desconectar la alimentación
(conexión en caliente o hot-swap).
g) FireWire (IEEE 1334). Es el otro bus serie que se está imponiendo, mucho
más rápido que USB (hasta 400 Mbits por segundo), y orientado a periféricos
(hasta 63) que intercambian masivamente datos (impresoras o discos duros),
aunque en origen está pensado sobre todo para permitir una conexión sencilla
al PC de equipos de audio y vídeo (por ejemplo, cámaras de vídeo). Es un bus
propuesto por Apple y estandarizado como IEEE 1394, que hace uso del
mismo conector de seis pines que las GameBoy de Nintendo, y que ha sido ya
adoptado por numerosos fabricantes.
Es importante tener en cuenta que buena parte del enorme éxito del PC se
debe a que se trata de una arquitectura abierta, en contraposición a otras más
cerradas, como la MacIntosh de Apple. IBM, al desarrollar el PC, recurrió a casas
externas (microprocesador de Intel, software de Microsoft) y no patentó la
arquitectura PC. Por este motivo, y cuando se comprobó el éxito comercial del
PC, poco a poco aparecieron fabricantes de PC clónicos (compatibles PC) y casas
364 Microprocesadores y microcontroladores
Tarjeta PC y
PC/XT
Tarjeta bus AT (o
ISA)
FIGURA 8.6. Esquema de los conectores de tarjetas para buses PC y PC/XT (arriba), y PC/AT,
también denominado ISA (abajo).
Microprocesadores de altas prestaciones 365
486/ Controlador de
Pentium memoria
Caché Memoria
Principal
Controlador del
bus PCI (puente)
periféricos µC
integrados DSP
µP
potencia de cálculo
FIGURA 8.8. En los µC los avances tecnológicos se emplean para aumentar el número de periféricos
y memoria integrados, mientras que en µP y DSP se trata de obtener elevados rendimientos en el
procesamiento de datos.
368 Microprocesadores y microcontroladores
Fase ejecución → 1 2 3 4 5 6 7 8 9 10
Instrucción I1 CyD EXE
Instrucción I2 CyD EXE
Instrucción I3 CyD EXE
Instrucción I4 CyD EXE
Instrucción I5 CyD EXE
Fase ejecución → 1 2 3 4 5 6 7 8 9 10
Instrucción I1 CyD EXE
Instrucción I2 CyD EXE
Instrucción I3 CyD EXE
Instrucción I4 CyD EXE
Instrucción I5 CyD EXE
TABLA 8.3. Arriba, CPU sin pipeline; abajo, CPU con pipeline de dos etapas. (CyD≡Carga y
Decodificación, EXE≡ejecución).
Microprocesadores de altas prestaciones 371
Ciclo reloj 1 2 3 4 5 6 7 8
Instrucción 1 CI DI EXE AM RR
Instrucción 2 CI DI EXE AM RR
Instrucción 3 CI DI EXE AM RR
Instrucción 4 CI DI EXE AM RR
TABLA 8.4. Ejecución de instrucciones por una unidad segmentada de una CPU RISC.
Registros intermedios
CI DI EXE AM RR
Entrada de Salida de
instrucciones instrucciones
Por otro lado, se denomina latencia el tiempo que le toma a una instrucción
atravesar todas las etapas. Mientras que en una unidad no segmentada la latencia
es el inverso del rendimiento (throughput), en una segmentada se logra un
rendimiento mucho más elevado. Aunque una instrucción pueda requerir, p.e.,
cinco ciclos de reloj para su ejecución (latencia), la unidad de procesamiento
segmentada globalmente puede estar ejecutando instrucciones a un ritmo de una
por ciclo de reloj.
No obstante, el lector atento habrá reparado en el hecho de que cuando se
tenga una instrucción de salto condicional, hasta que no se acabe de ejecutar la
instrucción que elabora la condición, no se sabrá si se debe saltar o no, con lo que
no se sabe qué instrucción se ejecutará a continuación; en estos casos la unidad
segmentada puede comenzar a ejecutar las instrucciones siguientes a la de salto,
pero puede resultar que en realidad tenga que ejecutar un conjunto de
instrucciones más alejadas, y, por lo tanto, deberá desechar las últimas
operaciones. Tanto en este caso como en otros (por ejemplo, cuando se solicita y
acepta una interrupción), se reduce el ritmo efectivo de ejecución de
instrucciones. Por ello, una unidad segmentada en realidad nunca alcanzará su
ritmo máximo teórico de operación (una instrucción por ciclo), aunque en
promedio se aproximará a él.
Finalmente, señalaremos que los microprocesadores de tipo RISC que
estudiaremos a continuación, debido a las características propias de sus
instrucciones, resultan más idóneos que los CISC a la hora de implementar y
aprovechar un procesamiento segmentado.
Microprocesadores de altas prestaciones 373
una unidad de tratamiento de datos enteros (ALU para enteros), una unidad de
punto flotante y otra de cálculo de saltos de programa. Un bloque del
microprocesador se encarga de encaminar las instrucciones del programa hacia la
unidad adecuada, intentando mantener en lo posible todas ellas ocupadas. En
arquitecturas de este tipo, como la del PowerPC (fig. 8.10), la CPU puede llegar a
ejecutar tres instrucciones a la vez (una instrucción de operación entera, otra de
punto flotante y otra de salto); como además las unidades son segmentadas,
permitiendo la ejecución de una instrucción por ciclo de reloj, en una estructura
superescalar de este tipo pueden ejecutarse hasta tres instrucciones en un único
ciclo de reloj (y más si integran un mayor número de unidades funcionales).
Para realizar un mejor aprovechamiento de este paralelismo interno de
operación, algunas arquitecturas (como MIPS, PA-RISC, PowerPC o Pentium)
implementan la ejecución fuera de orden, es decir, pueden ejecutar instrucciones
en un orden distinto al orden en que aparecen almacenadas en memoria, para
realizar un mejor aprovechamiento de las distintas unidades funcionales
integradas en el chip. El orden de ejecución lo determina un bloque hardware
incluido en el microprocesador, analizando «on-line» las posibles dependencias
entre las instrucciones que componen el código.
Instrucciones
Cola de :
instrucciones :
Unidad de Unidad de
Unidad de
Punto ejecución de
Enteros
Flotante saltos
FIGURA 8.10. Ejemplo de microprocesador superescalar, que integra tres unidades de funcionales
de procesamiento (PowerPC).
378 Microprocesadores y microcontroladores
Por otro lado, una técnica que puede resultar importante en un futuro muy
próximo, la cual trata de aprovechar al máximo la superescalaridad, son los
procesadores denominados de gran tamaño de instrucción o VLIW (Very Long
Instruction Word) [Valera 96], que, como se comentó, implementará la próxima
generación de procesadores de Intel y HP (Merced, arquitectura IA-64). La
filosofía de VLIW (o EPIC, como prefieren denominarla HP e Intel) consiste en
que sea el propio compilador el que, sabiendo las unidades funcionales integradas
en el microprocesador superescalar sobre el que se ejecutará el código, realiza
transformaciones agresivas sobre el programa ensamblador, agrupando las
instrucciones (moviéndolas de sitio si es necesario) en paquetes, o instrucciones
de gran tamaño, compuestas por diversas instrucciones simples que pueden ser
ejecutadas en paralelo por cada una de las diferentes unidades funcionales. A
diferencia de las arquitecturas superescalares clásicas, en las VLIW el análisis de
las instrucciones lo realiza el compilador, en vez del propio microprocesador, con
la ventaja de poder destinar ese espacio de silicio a otros bloques, pero con el
inconveniente de tener que recompilar todo el código cuando se trata de ejecutar
sobre otro procesador diferente (aunque sea de la misma familia).
Finalmente, comentaremos para el lector interesado que en el artículo de
[Valera 96] se lleva a cabo un interesante análisis de la evolución histórica y
perspectivas de los conceptos brevemente expuestos en estas secciones.
Memoria de
Unidad de Programa
Control
DSP
Bus de Instrucciones
Bus de Datos
ULA Memoria
de Datos
FIGURA 8.11. Arquitectura Harvard de los DSP, con espacios diferenciados para memoria y datos
(con buses y memoria específicos para cada uno).
Microprocesadores de altas prestaciones 381
el coste (por ejemplo, para controlar motores sin escobillas). También los DSP
permiten implementar controles adaptativos.
Algunos tipos de DSP se han desarrollado ya pensando en este tipo de
aplicaciones relacionadas con el control de motores eléctricos, para lo cual
incorporan, como los microcontroladores, memoria, puertos y periféricos (PWM,
A/D). Por ejemplo, Texas comercializa el TMS320C24X, de 20 MIPS, diseñado
especialmente para el control de motores. Por otro lado, el ADSP-21XX de
Analog Devices (16 bits punto fijo) resulta lo suficientemente barato para este
tipo de aplicaciones (por ejemplo, se emplea en el control de motores síncronos);
Analog ha desarrollado especialmente pensando en el control motor el
ADMC328, con únicamente 28 pines y a tan sólo $2.95 cuando se adquiere en
grandes cantidades. El lector interesado en este tema puede consultar los
catálogos y páginas web de estos fabricantes (http://www.ti.com y
http://www.analog.com).
Debido a la creciente importancia del procesamiento digital de señal,
principalmente gracias a las aplicaciones relacionadas con multimedia y
telecomunicaciones, fabricantes tradicionales de microprocesadores y
microcontroladores están reforzando sus diseños integrando en la misma pastilla
módulos y funciones típicos de los DSP, como instrucciones MAC, compresores
MPEG, etc. Por ejemplo, el 68HC16 de Motorola es un microcontrolador de 16
bits que implementa la operación MAC; los µC SuperH de Hitachi son RISC de
32 bits que incorporan también extensiones DSP; los microprocesadores pensados
para computadores también están siendo reforzados con este tipo de funciones,
como el Pentium y su bloque MMX (MultiMedia eXtension). En este sentido,
compañías importantes, como Hitachi, defienden la idea de que es preferible
reforzar los procesadores convencionales con funciones de procesamiento de
señal que desarrollar chips específicos DSP, que suelen ser más complejos y
difíciles de programar.
En la fig. 8.12 se muestra un ejemplo de aplicación real, un teléfono móvil,
en la que un DSP y un µC trabajan juntos. Esta situación es bastante habitual: el
DSP se encarga de las tareas de tratamiento de señal, más complejas y costosas, y
el µC de la coordinación del sistema y diálogo con el usuario (gestión de la
pantalla, teclado, zumbador, etc.). Por este motivo, algunas casas están
comercializando chips que integran en una única pastilla un microcontrolador y
un DSP, como el 68356 de Motorola, que contiene un microcontrolador 68302, y
un DSP de 24 bits en punto fijo a modo de coprocesador.
384 Microprocesadores y microcontroladores
SECCIÓN ANALÓGICA
SECCIÓN DIGITAL
Codifica/decodifica Voz
Corrige errores
Ecualiza
Demodula
Encripta Transmisor/
Receptor RF
Altavoz Micrófono
Antena
Microcontrolador
Tarjeta SIM
FIGURA 8.12. Ejemplo de teléfono móvil GSM de Nokia (esquema proporcionado por Texas
Instruments).
FLUJO DE DATOS
Simple Múltiple
Simple SISD SIMD
(von Neumann) (vector, array)
FLUJO DE
INSTRUCCIONES Múltiple MISD MIMD
(¿pipeline?) (múltiples CPU)
Entradas
x1 sinapsis NEURONA i
Soma w i1 cuerpo celular
x2 w i2
Axón
. axón
xj
.
.
w ij
Σ f() yi
.
w in S alida
.
. Οi
xn y i = f( Σ w ijx j - θ i )
-1
Dendritas dendritas umbral
FIGURA 8.13. Neurona biológica y modelo de neurona artificial (extraído de [Martín del Brío 97b]). La
neurona artificial i captura datos de un conjunto de entradas xj (procedentes de sensores), cada
entrada es ponderada con un peso sináptico wij, y a la suma ponderada resultante se le aplica una
función de transferencia f(.) de tipo no lineal para obtener la salida yi. En el entrenamiento la neurona
ajusta los pesos wij hasta que para cada conjunto de entradas se obtiene la salida deseada.
388 Microprocesadores y microcontroladores
Información
Capa de salida
Capa oculta
Capa de entrada (procesamiento)
(sensorial)
FIGURA 8.14. Ejemplo de red neuronal organizada en capas (extraído de [Martín del Brío 97b]):
capa de entradas (sensores), capa oculta (de procesamiento) y capa de salida (actuadores).
El sistema borroso final desarrollado para una aplicación de este tipo suele
ser tan sencillo, y los recursos de cálculo necesarios tan reducidos, que puede
incorporarse en un pequeño y barato sistema µP. De esta manera, la lógica
borrosa permite incorporar de forma relativamente sencilla y directa el
conocimiento de un «experto» (o, simplemente, conocimientos intuitivos) en un
determinado campo, y aplicarlas ejecutando un razonamiento aproximado a partir
de la información que suministra el entorno. El sistema experto borroso así
desarrollado permite incorporar «inteligencia» en dispositivos de tamaño
reducido, como p.e., electrodomésticos.
En la actualidad diversas casas comercializan microprocesadores «borrosos»
(Siemens, Omrom, etc.), y algunas otras incorporan «instrucciones de lógica
borrosa» en sus nuevos microprocesadores (por ejemplo, el muy reciente 68HC12
de Motorola, hermano mayor del 68HC11). No obstante, puede programarse un
sistema borroso sin demasiados problemas en microprocesadores y
microcontroladores convencionales.
FLC
Borrosificador Desborrosificador
X Base de reglas Y
Dispositivo de
inferencia borrosa
FIGURA A.1. Instrucciones del M6800 [Motorola 76] (significado de los símbolos en fig. A.4 y 5).
Juegos de instrucciones 393
FIGURA A.2. Instrucciones del 6800 basadas en los registros X y S (pila) [Motorola 76].
FIGURA A.4. Arriba, instrucciones que acceden a los bits del CCR. Abajo, tabla de las condiciones
que deben cumplirse para que se active un determinado flag (los números se corresponden con los
dígitos que aparecen rodeados por círculos en las fig. A.1-4) [Motorola 76].
FIGURA A.5. Significado de los símbolos utilizados en las tablas del 6800 [Motorola 76].
Juegos de instrucciones 395
FIGURA A.7. Símbolos empleados en las tablas correspondientes al juego de instrucciones del
M68HC11 [Motorola 91b].
Juegos de instrucciones 401
FIGURA A.8. Detalles de la ejecución de las instrucciones de salto, acceso a subrutina e interrupción
del M68HC11 [Motorola 91b].
402 Microprocesadores y microcontroladores
Apéndice B
Introducción a los ensambladores AS0 y AS11
emplearse un editor que introduzca códigos de control, como pueda ser MS-
WORD). Todo fichero ensamblador para AS0 y AS11 puede contener los
siguientes elementos:
• Nmónicos: Acepta las instrucciones del juego del 6800 y del 68HC11,
respectivamente.
• Etiquetas: Constantes alfanuméricas a las que el compilador asigna un valor.
• Constantes: Datos (o direcciones) que no varían a lo largo del programa, cuyo
tipo puede especificarse mediante los siguientes símbolos: «$» indica número
hexadecimal, «@» octal, «%» binario, «’» indica carácter y «”» demarca una
cadena de caracteres. Si no se coloca ningún signo delante de un dato, éste se
supondrá de tipo decimal (base 10).
• Comentarios: Indicados por los caracteres «*» o «;», colocados al principio de
una línea (pegados al margen izquierdo), o bien a continuación de una
instrucción.
Estos compiladores requieren que las líneas que constituyen el programa
fuente (ensamblador) posean un formato concreto. Cada línea está organizada en
cuatro campos: etiqueta (debe comenzar adosada al margen izquierdo),
instrucción (separada del margen izquierdo, por ejemplo, mediante un tabulador),
operando (a continuación de la instrucción), y comentario; la etiqueta y el
comentario son opcionales:
[Etiqueta] Instrucción Operando [Comentario]
Ejemplo: OTRA INC DATO1 ; incrementamos el dato
En el ejemplo anterior OTRA es una etiqueta que representa la dirección donde
comienza la instrucción, INC es el mnemónico de la instrucción, y DATO1 es una
etiqueta que representa la dirección donde se halla el dato que se desea
incrementar; a continuación se ha añadido un comentario.
Es importante remarcar que el campo correspondiente a las etiquetas es
opcional (puede ponerse o no ponerse); eso sí, toda etiqueta debe comenzar
pegada al margen izquierdo del fichero (sin ningún espacio entre la etiqueta y el
margen). Si en una línea no se incluye etiqueta la instrucción o directiva no debe
estar nunca apoyada en el margen izquierdo (se recomienda situar la instrucción o
directiva a un tabulador de distancia del margen). Finalmente, los comentarios
pueden comenzar por el carácter «*» o por «;».
A continuación presentamos algunas de las directivas (pseudoinstrucciones)
más importantes del ensamblador:
Ensambladores AS0 y AS11 405
PRÓLOGO........................................................................................................VII
BIBLIOGRAFÍA ..............................................................................................413