Microcontroladores MCS51 y MCS251 (Recovered 1)
Microcontroladores MCS51 y MCS251 (Recovered 1)
Microcontroladores MCS51 y MCS251 (Recovered 1)
EDICIONS UPC
POLITEXT
EDICIONS UPC
La presente obra fue galardonada en el sptimo concurso "Ajuts a l'elaboraci de material docent" convocado por la UPC.
Los autores, 2001 Edicions UPC, 2001 Edicions de la Universitat Politcnica de Catalunya, SL Jordi Girona Salgado 31, 08034 Barcelona Tel.: 934 016 883 Fax: 934 015 885 Edicions Virtuals: www.edicionsupc.es E-mail: [email protected]
Produccin:
A Gemma y Alex, a mi familia, a mis amigos ms prximos, a mis compaeros de la EUPVG, y a la memoria de mi padre.
Jos Matas
Rafael Ramos
ndice
ndice
1
1.1 1.2 1.2.1 1.2.2 1.2.3 1.3 1.4
2
2.1 2.2 2.3 2.4 2.5 2.5.1 2.5.2 2.5.3 2.5.4
3
3.1 3.1.1 3.1.2 3.2 3.2.1 3.2.2 3.2.3 3.3 3.3.1 3.3.2 3.4 3.4.1 3.4.2 3.4.3
10
3.4.4 Compatibilidad con la arquitectura de la familia MCS-51 ... . .. .. ... .. .. .. .. .. ... .. .. . 57 3.5 Configuracin de la serie 8XC251Sx . .. .. .. ... .. .. .. .. ... .. .. .. .. .. .. ... .. .. .. .. .. . 58 3.5.1 Configuracin del acceso a la memoria externa .. .. .. .. .... . .. .. .. ... .. .. .. .. .. ... .. . 58
4
4.1 4.2 4.2.1 4.2.2 4.2.3 4.2.4 4.2.5 4.2.6 4.2.7 4.3 4.3.1 4.3.2 4.3.3 4.3.4 4.3.5 4.3.6 4.3.7 4.3.8
El modelo de programacin
Creacin y consulta a tablas .. .. .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. ... . . Transferencia de bloques de datos .... .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. . Funciones booleanas .. ... ... . .. .. .. ... .. .. .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. . Retardos de tiempo ... ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .... . . ... .. .. Suma y resta de datos .... .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. Contador en BCD .. .. .. .. ... . ... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. .. ... .. .. .. .. . Multiplicacin y divisin de datos de 16 bits .... .. .. .. ... .. .. .. ... .. .. .. .. .. .. ... .. Suma y resta de datos con signo . .. .. .. ... .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... . Multiplicacin y divisin de 16 bits con signo . .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. Ejemplos de aplicacin ... ... . .. .. .. ... .. .. .. .. ... .. .. ... . .. .. ... .. .. .. .. .. ... .. . Generacin de una seal cuadrada ... .. .. ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. .. Conexin de teclas al microcontrolador ..... .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. . Conexin de un dgito de siete segmentos .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. Conexin de un teclado matricial de 4 x 4 teclas .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. Conexin de varios dgitos de siete segmentos, aplicacin de Su turno .. .. .. .. ... .. . Contador de piezas .... .. .. ... .. .. .. .. .. ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. .. Control de un ascensor ... ... .. .. .. .. .. .. ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. .. Control de un calefactor ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. Control de una cinta elevadora .... .. ... .. .. .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. . Control de la temperatura de un horno de coccin ... .. .. ... .. .. .. .. .. .... . .. .. .... . 97 98 99 100 101 103 105 109 109 113 113 115 117 118 121 125 127 129 131 134
5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.10.1 5.10.2 5.10.3 5.10.4 5.10.5 5.10.6 5.10.7 5.10.8 5.10.9 5.10.10
ndice
11
6
6.1 6.2 6.2.1 6.2.2 6.2.3 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6
Las interrupciones
Introduccin .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. . Las interrupciones en la familia MCS-51 . .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. Vectorizacin de interrupciones en la MCS-51 .. .. ... . .. ... .. .. .. .. .. .. ... .. .. .. .. . Habilitacin de interrupciones y establecimiento de prioridades en la MCS-51 .. . .. .. .. Tiempos de respuesta del proceso de interrupcin ... .. .. ... .. .. .. .. .. ... .. .. .. .. .. . El sistema de interrupciones en la familia MCS-251 .. .. .. .. .. .. ... .. .. .. .. .. ... .. .. Habilitacin de las interrupciones . .. .. .. .. .. .. ... .. .. .. ... . ... .. .. .. .. .. ... .. .. .. . Niveles de prioridad de las interrupciones .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. Interrupciones externas /INT0 e /INT1 ..... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... Interrupcin de los Timers ... . .. .. ... .. .. .. .. .. ... .. .. ... . .. ... .. .. .. .. .. ... .. .. . Interrupcin del array de contadores programables (PCA) .. .. ... .. .. .. .. .. ... .. .. .. Interrupcin del puerto serie ... .. .. .. .. .. ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. .. 137 139 142 143 145 152 155 156 158
163
164
165
7
7.1 7.2 7.2.1 7.2.2 7.2.3 7.3 7.4 7.4.1 7.4.2 7.5 7.5.1 7.5.2 7.5.3 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4
8
8.1 8.2 8.3 8.4
Memoria externa
Introduccin .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. . Memorias semiconductoras .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. Estructura externa de las memorias .. .. .. .. ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. Ciclos de fetch, de lectura y de escritura .. .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. 221 221 223 224
12
Conexin entre la MCS-51 y la memoria externa . .. ... .. ... . .. .. ... .. .. .. .. .. ... .. . Diagramas de tiempo para la MCS-51 . ... .. .. ... . .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. Ejemplos de conexin para la MCS-51 .. .. .. .. .. ... .. .. ... . .. ... .. .. .. .. .. ... .. .. . Conexin con la memoria externa para la familia MCS-251 .. .. .. .. .. .. ... .. .. .. .. .. Configuraciones de acceso a la memoria externa . ... .. .. ... . .. ... .. .. .. .. .. ... .. .. . 18 bits de bus de direcciones (RD1, RD0 = 00) ..... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. 17 bits de bus de direcciones (RD1, RD0 = 01) ..... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. 16 bits de bus de direcciones (RD1, RD0 = 10) ..... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. 16 bits de bus de direcciones (RD1, RD0 = 11) ..... .. .. .. .. ... .. .. .. .. .. ... .. .. .. ..
9
9.1 9.2 9.3 9.3.1 9.3.2 9.3.3 9.4 9.5 9.6 9.6.1 9.6.2 9.7 9.8 9.9 9.9.1 9.9.2
ndice
13
Apndice Juego de instrucciones de la familia MCS-51 y MCS-251 .. . .. .. ... .. .. .. .. 331 Bibliografa .... .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. .. 337
Bibliofrafa
337
Bibliografa
BERNARD ODANT; Microcontroladores 8051 y 8052. Paraninfo, 1995. GONZLEZ VAZQUEZ, J.A; Introduccin a los microcontroladores 8X52, 8X51. Mc Graw Hill, 1992. ANGULO, J.M; Microprocesadores y Microcontroladores 8085, MCS-51 y ST6. Paraninfo, 1992. Embedded Microcontroller Users Manual. 8XC251SA, 8XC251SB, 8XC251SP, 8XC251SQ. SENCER YERALAN Y ASHUSTOSH AHLUWALIA; Programming and interfacing the 8051 Microcontroller. Addison-Wesley, 1995. JAMES W. STEWART; The 8051 Microcontrollers, Hardware, Software and interfacing. PrenticeHall, 1993. THOMAS W. SHULTZ; C and the 8051. Programming and Multitasking. Prentice-Hall, 1993. JOHN UFFENBECK; Microcomputers and Microprocessors. The 8080, 8085, and Z-80. PrenticeHall, 1991. BARRY B. BREY; Los microprocesadores de INTEL. Arquitectura. Programacin e interfaces. Prentice-Hall, 1994. RICHARD J. PRESTOPNIK; The Microprocessor Peripheral IC Reference Manual. Prentice-Hall, 1989. MATAS, Jos, et al ; Entorno de desarrollo para la placa evaluadora EV80C51FX. Revista Espaola de Electrnica, pg. 52-55, Abril 1995. ANDREW TANENBAUM; Structured computer organization. Prentice-Hall, 1990. DOUGLAS V. HALL; Microprocessors and Interfacing, Programming and Hardware. Mc-Graw Hill, 1992. A.C. DOWNTON; Computadores y Microprocesadores. Addison-Wesley, 1993
15
Salidas
Un sistema procesador puede ser de programa fijo, como es el caso de las calculadoras de bolsillo no programables, o de lgica programable, como es el caso de los microprocesadores, microcontroladores, procesadores digitales de seal (DSP), etc. Los sistemas procesadores tambin pueden trabajar en paralelo, aumentando la velocidad de ejecucin de los programas.
16
Memoria (M)
Bus de direcciones
Bus de datos
Fig. 1.2 Diagrama de bloques de la estructura bsica de un sistema microprocesador
La CPU est formada principalmente por dos bloques funcionales: la unidad de control y la unidad de proceso. La unidad de control se encarga de buscar, interpretar y ejecutar las instrucciones almacenadas en la memoria. La unidad de proceso se encarga de realizar una serie de operaciones aritmticas, lgicas, de transferencia de datos, etc. La memoria est destinada a almacenar las instrucciones y los datos del programa y los resultados obtenidos en su ejecucin. Sobre la memoria opera la CPU, leyendo instrucciones y escribiendo o leyendo datos. Existen dos tipos bsicos de memoria: la memoria ROM de slo lectura y la memoria RAM de lectura/escritura. Para acceder a la memoria se deben realizar una seleccin previa de sta, ms un direccionamiento de la posicin concreta a que se desea acceder para la lectura o la escritura. El mdulo de entradas/salidas, E/S o I/O, permite la comunicacin del sistema microprocesador con el exterior, haciendo que este sea un sistema abierto, es decir, accesible por dispositivos externos. Los buses son el conjunto de lneas fsicas que permiten la transferencia de informacin entre todos los bloques que constituyen el sistema microprocesador. Los buses se pueden clasificar, en funcin del tipo de informacin que transportan, en tres tipos: el bus de direcciones, el bus de datos y el bus de control. El bus de direcciones determina la direccin de memoria a que se va a acceder por la CPU y, tambin, se utiliza para seleccionar, dentro de un rango de direcciones, distintos tipos de memoria, de la misma forma que para seleccionar distintos tipos de perifricos a travs del mdulo de E/S.
1.2.1 Unidad central de proceso (CPU) La CPU est formada por la unidad de control y por la unidad de proceso. La unidad de control gestiona el funcionamiento completo de la CPU y del resto de los bloques del sistema
17
microprocesador, encargndose de buscar, decodificar, ejecutar las instrucciones y de generar las seales de control adecuadas para ello. La unidad de proceso est formada por la unidad aritmtico-lgica, ALU, y por los registros del sistema microprocesador. La ALU se encarga de realizar las operaciones aritmticas y lgicas del sistema, como pueden ser la suma, resta, multiplicacin, funcin AND lgica, funcin OR lgica, etc. En los registros se almacenan datos que son el origen o el destino de las operaciones de la ALU, y el origen o destino de la transferencia de datos entre la CPU (figura 1.2) y la memoria del sistema. La unidad de control tiene tambin el registro PC (Program Counter), o contador de programa, que es un registro especial encargado de enviar, por medio del bus de direcciones, la posicin de memoria que corresponde a la siguiente instruccin que se debe ejecutar. El contador de programa, PC, se actualiza automticamente cuando se ejecuta una instruccin, de manera que siempre apunta a la siguiente instruccin que se debe ejecutar en el programa. El conjunto de bloques formado por la unidad de control y la unidad de proceso constituye la CPU, que se caracteriza por el repertorio de instrucciones que es capaz de ejecutar.
ALU
Control
de control (UC)
De la figura 1.3 cabe destacar al acumulador como un registro de suma importancia, pues siempre suele recibir uno de los operandos que intervienen en una operacin aritmtica, o suele ser, en la CPU, el registro destinatario del resultado obtenido en la operacin. Otro registro que se debe destacar es el registro de estado, debido a que contiene bits que actan como indicadores o alarmas de ciertos sucesos acontecidos en las operaciones aritmticas. Uno de los bits que suele llevar es el bit C de acarreo, que se activa en operaciones de suma y resta; o el bit P de paridad, que indica la paridad par o impar del nmero contenido en el acumulador.
18
1.2.2 Mdulo de entradas/salidas (E/S) El sistema microprocesador necesita de dispositivos de entrada/salida para gobernar y comunicarse con el entorno de la aplicacin, con la funcin principal de hacer de interfaz entre el sistema y los perifricos externos asociados a ste.
Bus de direcciones
Mdulo
Bus de control
de E/S
Bus de datos
Las operaciones de E/S se hacen sobre una amplia gama de perifricos conectados al sistema microprocesador (impresoras, teclados, monitores, convertidores A/D y D/A, sensores, actuadores, etc.), y con los que se suelen intercambiar seales de control y de datos. En estas operaciones se debe coordinar el trfico entre los recursos internos del sistema microprocesador y los perifricos, pues a menudo la velocidad de transferencia de datos de los perifricos es ms lenta, o necesitan un determinado sincronismo. El mdulo de E/S se puede realizar por medio de instrucciones especficas que lo conforman y que residen en el programa del sistema microprocesador; se puede hacer mediante interrupciones, donde los perifricos pueden activar lneas de interrupcin de la CPU, que detienen la ejecucin del programa y pasan a ejecutar un programa especfico pensado para atender al perifrico que ha causado la interrupcin; se puede hacer tratando las entradas/salidas como posiciones de memoria, donde se seleccionan los perifricos mediante ciertos rangos de direcciones y se envan y reciben datos que gestionan al perifrico. Tambin se ofrecen en el mercado numerosos circuitos integrados de soporte al sistema microprocesador, que suelen ser configurables mediante software y son capaces de adaptar al sistema todo tipo de perifricos.
1.2.3 Buses del sistema Un bus es el medio por el cual se transmite informacin por los distintos mdulos que componen un sistema microprocesador. Un bus puede ser unidireccional o bidireccional, es decir, puede transmitir la informacin en una nica direccin, del emisor al receptor, o en ambas direcciones, del emisor al receptor, y viceversa. Cuando hay varios dispositivos conectados a un mismo bus, como ocurre, por ejemplo, con el bus de datos, stos disponen de la caracterstica triestado, que consiste en un estado de alta impedancia en las lneas del dispositivo conectados al bus, de forma que permite que quede desconectado elctricamente del bus, y que as la CPU pueda acceder a uno de los distintos dispositivos conectados al mismo.
19
Un dispositivo triestado tiene una seal de control que determina si el estado ser de alta impedancia, o no. El estado en alta impedancia hace que el dispositivo se desconecte elctricamente de la lnea en cuestin (figuras 1.5 y 1.6).
Buffer
Entradas . . . . . . . . . . . . . . . . . . . . .
Salidas
Fig. 1.5 Conexin de dos buffers triestados a una misma lnea de bus
Control
Fig. 1.6 Estructura de un buffer triestado
La figura 1.5 muestra la conexin de dos buffers de salida a una misma lnea de un bus. En esta figura se observa el caso en que, para evitar colisiones entre los estados lgicos de la salida de ambos buffers, el buffer a permanece en estado de alta impedancia mientras el buffer b est transmitiendo informacin por la lnea del bus. El bus de direcciones tiene la tarea de llevar la direccin de la posicin de memoria, o del mdulo de E/S, a la que la CPU desea acceder. El contenido del bus es unidireccional y siempre lo proporciona la CPU a travs de la unidad de control. El nmero de lneas del bus de direcciones est relacionado con la capacidad de direccionamiento de la CPU. Por ejemplo, si se desea direccionar una memoria de 64kbytes, es decir, con 216 posiciones de memoria, sern necesarias 16 lneas de direccin para formar el bus de direcciones. El bus de datos debe soportar el traspaso de informacin entre la CPU, la memoria y los mdulos de E/S. El bus de datos es bidireccional y triestado, pues est compartido por todos los bloques del sistema microprocesador. El bus de control est formado por las lneas destinadas a llevar las seales que gobiernan y sincronizan todo el sistema microprocesador, como son las seales del tipo /RD, /WR, ALE, reset, lneas de interrupcin, etc. Con estas seales se llevan a cabo distintas operaciones como, por ejemplo, la seleccin, lectura y escritura en las memorias externas, o en los perifricos externos. Uno de los problemas que se debe considerar en un bus es la carga que puede soportar, es decir, el nmero de dispositivos o de puertas lgicas que se pueden conectar a una misma lnea. En general, cada nuevo dispositivo receptor que se conecta a una lnea supone un incremento en la corriente que
20
debe suministrar el emisor cuando est a nivel alto, VOH (1 lgico), y en la corriente que debe absorber cuando est a nivel bajo, VOL (0 lgico), tal y como se indica en las figuras 1.7 y 1.8, respectivamente. Las especificaciones de VOH, VOL, IOH, IOL, IIH y IIL, se dan para el peor de los casos y dependen de la tecnologa o de la familia lgica utilizada. La tabla 1.1 muestra el valor de estos parmetros para circuitos integrados TTL, CMOS y LSTTL (Low-Power Schottky TTL). En esta tabla las corrientes negativas indican que la corriente se suministra por el transmisor. Con esta tabla se puede determinar el nmero mximo de receptores que puede soportar un emisor especfico. Receptores Receptores
Emisor
I OH V=VOH I H1
I H2 I H3
I H4
Emisor
I OL V=VOL I L1
I L2 I L3
I L4
I OH [ I H1 I H 2 I H 3 I H 4
I OL [ I L1 I L 2 I L3 I L 4
Fig. 1.7 Corriente que suministra el emisor cuando su salida est a nivel alto, VOH (1 lgico)
Fig. 1.8 Corriente que absorbe el emisor cuando su salida est a nivel bajo, VOL (0 lgico)
Tabla 1.1 Especificaciones de nivel lgico para las familias lgicas TTL, LSTTL y CMOS (esta ltima dada para la familia GS CD4000 serie B con una tensin de alimentacin de VDD=5V)
Otro problema que es comn a los buses es el de las reflexiones que se pueden producir en las lneas, debido a que un pulso situado en una lnea de un bus se comporta de manera parecida a una seal de radio frecuencia en una lnea de transmisin. Este fenmeno afecta sobre todo a las lneas de larga longitud, haciendo que aparezcan sobreoscilaciones y transitorios repentinos en la recepcin de los pulsos transmitidos por las lneas, que distorsionan los niveles lgicos transmitidos. Las reflexiones producidas en las lneas (figura 1.9) son debidas a la falta de adaptacin de impedancias entre el emisor y el receptor, de forma que el receptor no absorbe toda la energa transmitida y parte de esta energa se refleja hacia el emisor.
21
Emisin
Pulso corto
Recepcin
Pulso largo
Para que no se produzcan reflexiones la impedancia de entrada de los receptores debe ser idntica a la impedancia que presenta la lnea conectada a stos. La impedancia de una lnea trazada en un circuito impreso suele tener un valor comprendido entre los 100 y 200, por lo que la adaptacin se puede conseguir conectando una resistencia de adaptacin de 180 220 entre la entrada del receptor y masa, lo que se denomina terminacin pasiva. Terminacin pasiva 220 Receptor
Emisor
Fig. 1.10 Terminaciones pasiva y activa de una lnea de un bus para eliminar o reducir las reflexiones en lneas de larga longitud
La terminacin pasiva, no obstante, presenta el problema de que la resistencia de adaptacin es una carga ms para el transmisor, por lo que reduce el nmero de receptores que se le pueden conectar. Esta situacin se puede mejorar utilizando un divisor de tensin que sita la lnea a la mitad del margen de tensin para la familia TTL, y que, adems, adapta el receptor a la impedancia caracterstica de la lnea (figura 1.10). Esta solucin se denomina terminacin activa. Con la terminacin activa se asegura que, al menos, la amplitud del pulso reflejado ser siempre menor que el valor del pulso transmitido, eliminando las reflexiones de forma paulatina.
22
programas y datos, los dispositivos de comunicacin asncrona con otros sistemas, los dispositivos de entrada y visualizacin de informacin, como mediante teclados y visualizadores, etc. La figura 1.11 muestra la estructura general de un sistema basado en microprocesador, considerando una buena parte de los dispositivos necesarios para desarrollar satisfactoriamente cualquier aplicacin, sin llegar a especificar el tipo de microprocesador, los dispositivos y los perifricos empleados.
Memorias
RAM EPROM EEPROM
Timers
Puerto serie
CPU
Puertos de E/S
E/S analgicas
En la figura 1.11 se pueden distinguir puertos de E/S, memorias, temporizadores, puerto serie de comunicacin, etc. Cada uno de estos bloques suele estar implementado por un circuito integrado, CI, que proporcionan los fabricantes como soporte de sus microprocesadores o microcontroladores, y que facilitan la tarea del diseo y mejoran las prestaciones del sistema. Las memorias son uno de los elementos de los que hay mayor variedad y oferta en el mercado, donde se pueden encontrar memorias SRAM, DRAM, PROM, EPROM, EEPROM, FLASH, NOVRAM, etc. Es imprescindible en todo sistema que exista una memoria no voltil, como la PROM, la FLASH y la EPROM, para albergar el programa del sistema, como una memoria voltil, como la SRAM o DRAM, para albergar los datos generados y utilizados por el programa. En los sistemas basados en microcontrolador las memorias ms ampliamente utilizadas son del tipo EPROM y SRAM, aunque tambin se usan otro tipo de memorias como la OTPROM (One time programmable), la NOVRAM (Non-volatile RAM) y memorias del tipo serie que envan y reciben los datos va serie con la CPU. Por otra parte, existen circuitos integrados que proporcionan 2, 3 4 puertos de E/S, programables por el usuario y de propsito general. Estos circuitos integrados se utilizan en los microprocesadores/ microcontroladores, para disponer de E/S o para ampliar el nmero de E/S. A travs de los puertos de E/S se puede hacer el control de los perifricos, la transmisin y recepcin de datos entre la CPU y los perifricos, la activacin de actuadores, la lectura del estado de sensores, teclas, finales de carrera, etc. Un ejemplo de puerto de E/S es el 8255 de Intel Corporation que soporta hasta tres puertos de E/S de
Otros dispositivos
23
8 lneas cada uno, y el PI/T MC68230 de Motorola, que es una interfaz paralela, bidireccional o unidireccional, de 8 16 bits, con un temporizador programable de 24 bits. En aplicaciones que requieran de la generacin y del sincronismo de seales, o de la temporizacin de determinados sucesos, se necesitan circuitos integrados Timers, que son temporizadores/contadores capaces de contabilizar y temporizar seales de acuerdo con una seal de reloj de entrada. Adems, tambin hay circuitos integrados especficos para la generacin de varias seales de reloj y el sincronismo de sistemas basados en microprocesador. En este sentido, por ejemplo, se pueden encontrar el 8253 y 8254 de Intel, o el MFP MC68901 de Motorola. Este ltimo es un circuito multifuncin, con cuatro temporizadores programables, un controlador de hasta 16 fuentes de interrupcin, un puerto de E/S programable y un canal USART de comunicacin serie asncrona. Otro elemento importante es el puerto serie que proporciona el soporte al sistema microprocesador para poder comunicarse, va serie, con otros sistemas, empleando estndares del tipo RS-232C, RS422, etc. En este sentido existen en el mercado circuitos integrados que soportan la comunicacin serie asncrona, haciendo de puerto serie para el sistema microprocesador. Como CI integrado de este tipo, por ejemplo, se puede encontrar al 8250 de Intel que soporta un puerto serie para la comunicacin con otros sistemas, o el SIO MC68564 de Motorola que soporta la comunicacin serie sncrona y asncrona con otros sistemas. La variedad de circuitos integrados especficos que se ofrecen para el soporte de los sistemas basados en microprocesador es amplia. Prcticamente, se encuentran disponibles en el mercado circuitos integrados de todo tipo, como controladores del acceso directo a memoria (DMA), circuitos integrados capaces de leer un teclado matricial y de gestionar, al mismo tiempo, un visualizador compuesto por un nmero determinado de dgitos, circuitos integrados para el arbitraje y la gestin de los buses del sistema microprocesador, circuitos integrados para la gestin de interrupciones, circuitos integrados para el control y acceso de una unidad lectora de disquetes, circuitos integrados para detectar las cadas de tensin de la red elctrica, etc. El nmero de circuitos integrados de soporte a un sistema basado en microcontrolador es considerable y est sometido a un proceso continuo de mejora y renovacin, por lo que se debe procurar tener un buen conocimiento de estos dispositivos y estar al tanto de las nuevas propuestas que surgen de forma peridica en el mercado.
24
voz en telfonos mviles y el filtrado de seales de televisin; aunque tambin se emplean en el control de motores y en tareas de control, en general, donde las seales son de rpida variacin.
CI Microcontrolador Memorias
RAM EPROM EEPROM
Timers
Puerto serie
CPU
Puertos de E/S
E/S analgicas
Fig. 1.12 Concepcin de un microcontrolador basada en la inclusin de la CPU y otros elementos de un sistema microprocesador en un nico circuito integrado
En cuanto al concepto de microcontrolador, ste se concibe como la inclusin de algunos de los dispositivos que aparecen en la figura 1.11 dentro del mismo circuito integrado. En consecuencia, segn la figura 1.12, un microcontrolador est formado por una CPU, ms los elementos imprescindibles para interactuar con el exterior y para solucionar y simplificar una buena parte de las aplicaciones que hasta el momento se venan realizando con los sistemas basados en microprocesador. En la actualidad los microcontroladores suelen incorporar, adems de la CPU, puertos de E/S, memoria ROM, EPROM, OTPROM o FLASH para albergar el programa realizado, memoria RAM, registros de propsito general que facilitan la tarea del programador, temporizadores y contadores para contabilizar y temporizar eventos, puerto serie con el que implementar estndares del tipo RS-232C, etc, convertidor analgico/digital para la lectura de seales analgicas, salidas con modulacin de pulsos, etc. En este momento, en el mercado existen multitud de fabricantes de microcontroladores que, adems, ofrecen una amplia gama de versiones, capaces de ajustarse a distintos tipos de aplicaciones. En consecuencia, el diseador debe tener muy claros los criterios de eleccin, en funcin de las prestaciones y los costos de las herramientas de desarrollo que se deben adquirir, como son los emuladores, las tarjetas de evaluacin y los programas de software para el desarrollo de la aplicacin.
Otros dispositivos
25
Versin bsica Versin con ROM Versin con EPROM Memoria RAM interna Memoria EPROM/ROM Temporizadores Fuentes de interrupcin Lneas de E/S
Microcontroladores 8035AHL 8039AHL 8048AH 8049AH 8748H 8749H Caractersticas 64 128 1k bytes 2k bytes 1 1 2 2 27 27
26
- Espacio de memoria para programas de hasta 64k. - Espacio de memoria para datos de hasta 64k. - Hasta 3 temporizadores de 16 bits cada uno. - Comunicacin serie asncrona (UART full-duplex). - De 5 a 6 fuentes de interrupcin con 2 niveles de prioridad. - 2 modos especiales de bajo consumo (Power Down y Idle). - Juego de instrucciones con capacidad de procesamiento booleano.
Tabla 2.2 Microcontroladores de la MCS-51 Versin 8031AH 8751BH 8032AH 8752BH 80C31BH 87C51 87C52 87C54 87C58 87L52 87L54 87L58 80C51FA 87C51FA 87C51FB 87C51FC 87L51FA 87L51FB 87L51FC 80C51GB 87C51GB 80C152JA 80C152JB
80C51SL-BG 87C51SLAH OTROM/ EPROM
bytes 4K EPROM
8K EPROM
4K EPROM 8K EPROM 16K EPROM 32K EPROM 8K OTPROM 16K OTPROM 32K OTPROM 8K EPROM 16K EPROM 32K EPROM 8K OTPROM 16K OTPROM 32K OTPROM 8K EPROM 16K EPROM
Mem. Lneas N de Lneas de N Modos Veloc. A/D RAM de E/S canales bajo reloj Timers interrup. PCA Bytes consumo Mhz 128 32 2 5 0 0 12 128 32 2 5 0 0 12 256 32 3 6 0 0 12 256 32 3 6 0 0 12 128 32 2 5 0 0 12,16 128 32 2 5 0 0 12,16,20,24 12,16,20,24 256 32 3 6 0 0 12,16,20,24 256 32 3 6 0 0 12,16,20,24 256 32 3 6 0 0 12,16,20 256 32 3 6 0 0 12,16,20 256 32 3 6 0 0 12,16,20 256 32 3 6 0 0 256 32 3 7 5 0 12,16 12,16,20,24 256 32 3 7 5 0 256 32 3 7 5 0 12,16,20,24 12,16,20,24 256 32 3 7 5 0 12,16,20 256 32 3 7 5 0 12,16,20 256 32 3 7 5 0 12,16,20 256 32 3 7 5 0 256 48 3 15 10 8 12,16 256 48 3 15 10 8 12,16 256 40 2 11 0 0 16.5 256 56 2 11 0 0 16.5 16 256 24 2 10 0 4 16 256 24 2 10 0 4
27
- Espacio de memoria para programas de hasta 64k. - Espacio de memoria para datos de hasta 64k. - Memoria interna ROM/OTPROM de 8 16k bytes. - Memoria RAM interna de hasta 256 bytes. - Hasta 3 temporizadores de 16 bits cada uno. - 32 lneas de entrada/salida (E/S). - 7 fuentes de interrupcin con 4 niveles de prioridad. - Batera o array de contadores programable (PCA). - Salidas con modulacin de anchura de pulsos (PWM). - Temporizador de watchdog. - Comunicacin serie asncrona (UART full-duplex). - Terminal WAIT de estados de espera para memorias. - Modos no paginado y paginado de acceso a la memoria externa. - Modos especiales de bajo consumo (Power Down y Idle).
Tabla 2.3 Microcontroladores de la familia MCS-151
ROM/OTPROM 8K bytes ROM 16K bytes ROM 8K bytes OTPROM 16K bytes OTPROM
RAM interna 256 bytes 256 bytes 256 bytes 256 bytes 256 bytes
28
- Puntero de la pila (registro Stack Pointer) de 16 bits, que permite acceder a una memoria de pila de hasta 64 kbytes. - Tiempo mnimo de ejecucin de una instruccin de 2 periodos de reloj. - Memoria interna ROM/OTPROM de 8 16k bytes. - Memoria RAM interna de hasta 1024 bytes. - Hasta 3 temporizadores de 16 bits cada uno. - 32 lneas de entrada/salida (E/S). - 7 fuentes de interrupcin con 4 niveles de prioridad. - Batera o array de contadores programable (PCA). - Salidas con modulacin de anchura de pulsos (PWM). - Temporizador de watchdog. - Comunicacin serie asncrona (UART full-duplex). - Terminal WAIT de estados de espera para memorias. - Modos no paginado y paginado de acceso a la memoria externa. - Modos especiales de bajo consumo (Power Down y Idle).
Tabla 2.4 Microcontroladores de la familia MCS-251
Versin 80C251SB 80C251SQ 83C251SA 83C251SB 83C251SP 83C251SQ 87C251SA 87C251SB 87C251SP 87C251SQ
RAM (bytes) 1024 512 1024 1024 512 512 1024 1024 512 512
Estas caractersticas proporcionan importantes mejoras con respecto a la familia MCS-51, como son el incremento de la velocidad de ejecucin para una misma frecuencia de reloj, el incremento de la eficiencia en los programas escritos en lenguaje C, debido al acceso en los tipos Word y Double Word, y la capacidad de procesar programas de mayor tamao.
29
watchdog, array de contadores programable PCA, convertidores A/D de 8 y 10 bits, funcionamiento en baja tensin, etc. La tabla 2.5 muestra los principales componentes de esta familia.
Tabla 2.5 Microcontroladores de Philips Semiconductors
Lneas E/S (I/O) OTP o FLASH Interrupciones Carctersticas especiales A/D (canales) Proteccin programa RAM (bytes) Int. externas Max. freq. (MHz) A/D (bits) Watchdog
Versin
Timers
UART -
PWM
ROM
PCA
80C31/80C32 128-256 3 8xC51/8xC52 8k 8k 128-256 3 8xC54/8xC58 16-32k 16-32k 256 3 89C5x 4-32k 128-256 3 8xC51Fx 8-32k 8-32k 256 4 8xC51Rx+ 16-64k 16-64k 512-1024 4 89C51Rx+ 32-64k 512-1024 4 87LPC762 2k 128 2 87LPC764 87LPC767 87LPC768 87LPC769 8xC591 89C51Rx2 89C66x 8xC554 80/83C557E4 89C557E4 80C557E6 83C557E6 8xC557E8 8xC524 8xC528 80/83/87C552 80/83/87C652 8xC750 8xC748 8xC751 8xC575 8xC576 8xC749 8xC752 8xC591 8xC592 8xCE598 4k 128 2
4k 128 2 4k 128 2 4k 128 2 16k 16k 512 3 16-64k 512-1024 4 16-64k 1k-2k 4 16k 32k 48k 64k 16k 32k 8k 8k 1k 2k 2k 8k 8k 2k 2k 16k 16k 32k 16k 32k 48k 64k 16k 32k 8-16k 8-16k 1k 2k 2k 2k 2k 16k 16k 32k 512 1024 1536 2048 512 512 512 256 64 64 256 256 256 64 64 512 512 512 3 3 3 3 3 3 3 2 1 2 1 3 3 2 1 3 3 3
32 32 32 32 32 32 32
6 6 6 6 7 7 7
2 2 2 2 2 2 2 3 3 3 3 3 2 2 2 2
8 8 8 10 10 10 10 10
4 4 4 6 8 8 8 8 8 6 5 5 6 8 8
18 12 18 12 18 18 18 32 32 32 12 12 12 15 7 8
48 15 48 48 48 2 2 2
32 8 32 8 48 15 32 7 19 2 19 2 19 2 32 2 32 2 21 2 21 2 32 15 48 6 48 6
2 2 2 2
2 2 2
10 10 8 8 10 10 10
I2C -
2.7-5.5V,Low-power 33 2.7-5.5V,Low-power 33 2.7-5.5V,Low-power 33 MTP Flash 33 2.7-5.5V 33 2.7-5.5V 33 Flash-12V ISP 33 BOD,PUR,Keypad 20 interrupt.Low-power BOD,PUR,Keypad 20 interrupt.Low-power 51LPC con A/D 20 A/D y PWM 20 A/D y D/A 20 CAN 2.0B/PeliCAN 16 Flash,5V,ISP/IAP 33 Flash,5V,ISP/IAP 20/33 2.7-5.5V,Capture/ 16 compare Low EMI, 2 PWM 16 Capture/compare Low EMI, 2 PWM 16 Capture/compare Low EMI, 2 PWM 16 Capture/compare 24 16 24 24 16 16 16 16 16 16 16 CAN 2.0B/PeliCAN 16 CAN bus controller 16 CAN bus controller 16
Las versiones que tienen bus serie I2C se pueden conectar por medio de este bus a distintos perifricos y microcontroladores. El bus I2C utiliza tan slo dos terminales del microcontrolador, uno como lnea de datos y otro como lnea de reloj, y es capaz de operar en un sistema con multi-msters y de soportar multitud de perifricos en el mismo bus. Las versiones con un bus del tipo CAN (Control Area Network) se pueden utilizar en aplicaciones
30
para la industria del automvil y en sistemas de manufactura automatizada, pues inicialmente este bus fue concebido para reducir el nmero elevado de cables en un automvil. El bus CAN es un bus serie de alta velocidad formado por dos hilos, que puede llegar a distancias de hasta 40 metros y con el que se pueden realizar estructuras de bus con hasta 30 nodos de comunicacin.
2.5.2 Microcontroladores de Siemens Siemens es un fabricante que tiene una amplia gama de productos en multitud de sectores distintos. En el ramo de semiconductores tiene la familia C500 de microcontroladores, compatibles tanto a nivel de hardware como de software con la MCS-51. La tabla 2.6 muestra los principales componentes de esta familia. Los microcontroladores de Siemens pueden funcionar a altas frecuencias de reloj, pueden tener memoria ROM o OTPROM, puerto serie full-duplex, modos especiales de bajo consumo, varios registros de punteros de datos DPTR, etc.
Tabla 2.6 Microcontroladores de Siemens
N Interrupciones Punteros de datos DPTR (16 bits) 1 1 1 1 1 1 1 8 8 8 8 8 1 1 8 8 8 8 1 1 1 1 8 8 8 8
ROM Protegida
C501G-L/-1R C501G-E C504-L/-2R C504-2E C513-1R C513A-L/-R/-2R C513A-2E C505L-4E C505-L/-2R C505C-L/-2R C505A-4E C505CA-4E C515-L/-1R C515A-L/-4R C515C-L/-8R C515C-8E C517A-L/4R C509-L SAB 80C515 SAB 80C535 SAB 80C515A SAB 83C515A-5 SAB 80C517 SAB 80C537 SAB 80C517A SAB 83C517A-5
-/8k 8k OTP -/16k 16k OTP 8k -/12k/16k 16k OTP 32k OTP -/16k -/16k 32k OTP 32k OTP -/8k -/32k -/64k 64k OTP -/32k 8k 32k 8k 32k
256 256 512 512 256 512 512 512 512 512 1280 1280 256 1280 2304 2304 2304 3328 256 256 1280 1280 256 256 2304 2304
32 32 32 32 32 32 32 46 34 34 34 34 56 56 57 57 68 64 56 56 56 56 68 68 68 68
10 10 10 8 8 10 10 8 10 10 10 10 10 8 8 10 10 8 8 10 10
8 8 8 8 8 8 8 8 8 8 8 12 15 8 8 8 8 12 12 12 12
3 3 4 4 3 3 3 3 3 3 3 3 3 3 3 3 4 5 3 3 3 3 3 4 4 4
6 6 12 12 7 7 7 12 12 12 12 12 12 12 15 15 17 19 12 12 12 12 12 14 17 17
USART USART USART USART USART+SSC USART+SSC USART+SSC USART USART USART USART USART USART USART USART+SSC USART+SSC USART+UART USART+UART USART USART USART USART USART+UART USART+UART USART+UART USART+UART
6 6 4 4 4 4 4 4 4 4 4 21 29 4 4 4 4 21 21 21 21
Las versiones SAB80C517, SAB80C517A, SAB80C517A-5, SAB80C537, C517A-L/4R y C509-L tienen una unidad de multiplicacin y divisin por hardware, MDU, que es capaz de realizar divisiones de datos de 32 bits y multiplicaciones de datos 16 bits. Las versiones C505-L, C505-2R, C505CA-4E, C515C-L, C515-8R y C515C-8E soportan el bus serie FCAN 2.0B.
PWM (canales)
A/D (Canales)
RAM (bytes)
Puerto serie
Lneas E/S
A/D (bits)
Watchdog
Versin
ROM
MDU
31
2.5.3 Microcontroladores de Atmel El fabricante Atmel Corporation tiene una familia de microcontroladores de 8 bits basados en la arquitectura de la MCS-51. Una de las caractersticas ms relevantes de los microcontroladores de este fabricante es que todos ellos tienen memoria interna flash. Estos microcontroladores tienen un precio ms reducido que los microcontroladores con memoria interna EPROM. La tabla 2.7 muestra los microcontroladores con memoria flash de Atmel y las distintas caractersticas de cada uno. Las caractersticas generales de estos microcontroladores son: - Memoria interna flash para programas. - Memoria RAM interna. - Patillas bidireccionales de I/O accesibles bit a bit. - Varios temporizadores/ contadores de 16 bits. - UART Full-Duplex. - Mltiples fuentes de interrupcin. - La versin AT89S tiene 2K de memoria EEPROM interna, una interfaz SPI de bus serie y un temporizador de Watchdog.
Tabla 2.7 Caractersticas de los microcontroladores flash de Atmel
Caractersticas Memoria flash (bytes) Memoria RAM (bytes) Mem. EEPROM interna Interfaz serie SPI Proframacin In-system N de Timers N de bits de seguridad (Lock bits) Watchdog timer UART serie Salida de Power Down mediante interrupcin Comparador analgico Terminales de I/O Fuentes de interrupcin Bus externo de datos/ direcciones Modos Power Down y Idle Alimentacin Vcc Frecuencia Clock Patillas del encapsulado I/O Current Sink (por patilla) Corriente total mxima de I/O (mA) AT89C1051 AT89C2051 AT89C51 AT89LV51 AT89C52 AT89LV52 AT89C55 AT89S8252 1K 64 0
1 2 -
2K 128 0 SI 2 2
4K 128 0 SI 2 3
4K 256 0 SI 3 3
8K 256 0 SI 3 3
8K 256 0 SI 3 3
20K 256 0 SI 4 3 -
8K 256 2K
3 3
SI 15 3
SI 15 6
32 6
32 6
32 8
32 8
32 8
32 9
2.5.4 Microcontroladores de Dallas Semiconductor Dallas Semiconductor tiene un par de familias de microcontroladores compatibles con la MCS-51. Una de las familias de este fabricante se centra en la seguridad anticopia del programa, con encriptacin en tiempo real, y en utilizar memoria del tipo NOVRAM para almacenar el programa, en
32
lugar de ROM o EPROM. La segunda familia que oferta es de alta velocidad, capaz de ejecutar las instrucciones hasta tres veces ms rpidamente que la familia MCS-51. La primera familia est formada por los microcontroladores DS5000 y DS5002T, cuyas principales caractersticas son: - 100% compatible en hardware y software con la MCS-51. - NOVRAM de 8k 32kbytes. - Zona particionada para cdigo y para datos. - Cuatro puertos de E/S. - Memoria RAM de 128 bytes. - Dos temporizadores/contadores de 16 bits. - Una puerto UART serie. - Watchdog Timer. - Seguridad anticopia para el cdigo. - Generador aleatorio de nmero. - Interrupcin por fallo de tensin. La familia de alta velocidad est formada por los microcontroladores DS80C310, DS80C320, DS80C323, DSC390, DS83C520, DS83C530, DS87C520, DS87C530 y DS87C550. Las caractersticas comunes a estos microcontroladores son: - 100% compatible en hardware y software con la MCS-51. - Dos puertos serie UART de alta velocidad. - Tres temporizadores de 16 bits. - Deteccin de fallo de tensin. - Dos punteros de datos, DPTR, para acceder a memoria externa. - Temporizador de watchdog. - Memoria RAM interna de 256 bytes. La versin DS80C320 tiene 13 fuentes de interrupcin, de las que 6 corresponden a fuentes externas. Las versiones DS87C520 y DS87C530 tienen 13 y 14 fuentes de interrupcin, respectivamente, 1kbyte de memoria SRAM interna accesible con la instruccin MOVX y 16kbytes de memoria EPROM. La versin DS87C550 tiene estas mismas caractersticas y, adems, incluye un convertidor A/D de 10 bits y con 8 canales multiplexados, 8kbytes de memoria EPROM y 4 canales de PWM con una precisin de 8 bits. La versin DS80C310 es un modelo reducido de la DS80C320, pensada para las aplicaciones donde el coste es un factor importante. La versin DS80C323 es un modelo de bajo consumo y baja tensin de la DS80C320; tiene una frecuencia mxima de reloj de 18MHz, consume tan slo 10mA y puede alimentarse entre 2.7V y 5.5V. La versin DSC390 incorpora un bus serie CAN dual de alta velocidad, formado por dos interfaces CAN 2.0B. Esta versin tambin incorpora 4kbytes de memoria SRAM interna. Por ltimo, las versiones DS83C520 y la DS83C530 tienen 16kbytes de memoria ROM interna, al ser ideadas para grandes series de fabricacin.
33
VCC
Puerto 0
Registro de direcc. RAM
Puerto 2
Memoria
RAM
interna
Latch
Latch
VSS
Puerto 2
Puerto 0
ACC
TMP1 TMP2
Stack Pointer
SP
Registro de direcciones programa
ALU
TCON TMOD TH0 TL0 SCON T2CON* TH1 TL1 SBUF RCAP2L* TH2* TL2* PCON RCAP2H* IE IP Interrupciones. Puerto serie. Temporizadores. PCA
BUFFER
Incrementador
PC PC DPTR
Latch
Latch
Puerto 3
XTAL2
XTAL1
temporizadores
34
El ncleo del microcontrolador est formado por la unidad de control, la unidad aritmtico-lgica (ALU), el registro de estado (PSW), el acumulador y el contador de programa (PC). Este ltimo es un registro de 16 bits que se utiliza como puntero hacia la memoria de programas y su valor apunta siempre a la direccin de memoria que contiene la instruccin a ejecutar. Cabe destacar, en esta figura, la importancia del acumulador, puesto que interviene en la mayor parte de las instrucciones, sobre todo en las instrucciones aritmticas. La familia MCS-51 tiene cuatro puertos: P0, P1, P2 y P3. Los puertos son de 8 bits, y cada bit puede ser configurado de forma individual como entrada o como salida (E/S), siendo transparente para el programador. La MCS-51 tiene versiones con memoria interna de programas EPROM, OTPROM o ROM; no obstante, en caso de necesitar memoria externa, los puertos P0 y P2 soportan un bus de direcciones de 16 bits y un bus de datos de 8 bits para acceder a sta. En este caso, el byte bajo del bus de direcciones y el bus de datos comparten el mismo puerto, P0, mediante una multiplexacin temporal entre ambos buses. En cuanto al byte alto del bus de direcciones, ste queda ntegramente soportado por el puerto P2. La multiplexacin temporal realizada en el puerto P0 es una manera hbil de optimizar el nmero de terminales del microcontrolador, minimizando el tamao de su encapsulado. En la figura 3.1 aparecen, adems, un bloque que representa la memoria RAM interna, con la cual opera el puntero de la pila (SP, Stack Pointer), el rea de registros especiales (SFR) y el puerto P3, que soporta las siguientes funciones alternativas: puerto de comunicacin serie asncrona, interrupciones externas, el control de lectura y escritura de la memoria externa de datos y las entradas de los temporizadores/contadores de la familia. El puerto P1 en las versiones 8X51C51FX soporta las entradas y salidas del array de contadores programable PCA. 3.1.1 Relacin de terminales La disposicin de los terminales de esta familia se muestra en la figura 3.2. En concreto se muestra el encapsulado de los microcontroladores 87C51BH en formato DIP y PLCC.
P1.4 P1.3
(/WR)/P3.6 (/RD)/P3.7
T2/P1.0 T2EX/P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 RESET RXD/P3.0 TXD/P3.1 (/INT0)/P3.2 (/INT1)/P3.3 T0/P3.4 T1/P3.5 (/WR)/P3.6 (/RD)/P3.7 XTAL2 XTAL1 VSS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21
8 7 5 1 B H
VCC P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 (/EA)/(VPP) ALE/(/PROG) /PSEN P2.7/A15 P2.6/A14 P2.5/A13 P2.4/A12 P2.3/A11 P2.2/A10 P2.1/A9 P2.0/A80
P1.5 P1.6 P1.7 RESET RXD/P3.0 NC TXD/P3.1 (/INT0)/P3.2 (/INT1)/P3.3 T0/P3.4 T1/P3.5
7 8 9 10 11 12 13 14 15 16
44 43 42 41 40 39 38 37 36 35
P0.0/AD0 P0.1/AD1
NC VCC
P0.2/AD2
P0.3/AD3
P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 (/EA)/(VPP) NC ALE/(/PROG) /PSEN P2.7/A15 P2.6/A14 P2.5/A13
8751BH
34 33 32 31 30
17 29 18 19 20 21 22 23 24 25 26 27 28
NC
A11/P2.3
A12/P2.4
35
La relacin de terminales que aparecen en la figura es la siguiente: - VCC: tensin de alimentacin: +5V. - VSS: terminal de masa. - P0.0, P0.1 P0.7: puerto bidireccional bit a bit de E/S P0. P0 puede soportar el byte bajo del bus de direcciones y el bus de datos mediante una multiplexacin temporal en el caso de tener que utilizar memoria externa (AD0,, AD7). - P2.0, P2.1 P2.7: puerto bidireccional bit a bit de E/S P2. P2 puede soportar el byte alto del bus de direcciones (A8,, A15) en el caso de tener que utilizar memoria externa. - P1.0, P1.1 P1.7: puerto bidireccional bit a bit de E/S P1. P1 es un puerto de propsito general, aunque para aquellas versiones que tienen 3 temporizadores, los terminales P1.0 y P1.1 realizan las funciones alternativas T2 y T2EX del temporizador Timer2, respectivamente. El puerto en las versiones con array de contadores programable PCA soporta las entradas y salidas de sta. Los terminales P1.3, P1.4, P1.5, P1.6, P1.7 son las entradas/salidas, CEX0, CEX1, CEX2, CEX3 y CEX4, de la PCA, respectivamente (tabla 3.1). Estos terminales actan como entradas de los mdulos 0, 1, 2, 3 y 4 de la PCA cuando trabaja en modo captura, respectivamente, y como salidas de los mismos mdulos cuando la PCA trabaja en modo comparacin y en modulacin de anchura de pulsos (PWM). - P3.0, P3.1 P3.7: puerto bidireccional bit a bit de E/S P3. P3 es un puerto de propsito general; no obstante soporta las funciones especiales ms importantes de la familia MCS-51, como las seales TXD y RXD del puerto de comunicacin serie, las entradas de interrupcin /INT0 y /INT1, las entradas externas T0 y T1 de los temporizadores y las seales de lectura y escritura en memoria externa de datos /RD y /WR, respectivamente (tabla 3.1). - ALE/(/PROG): este terminal (ALE, Addres Latch Enable) permite deshacer la multiplexacin temporal entre el byte bajo del bus de direcciones y el bus de datos, realizada en el puerto P0. La seal ALE suele conectarse a la seal de reloj de un latch de 8 bits, como por ejemplo el 74373, que permite deshacer la multiplexacin. En las versiones de la familia con memoria de programa interna EPROM o OTPROM, este terminal se emplea en modo /PROG en la fase de programacin de la memoria. -/PSEN: este terminal (/PSEN, Program Store Enable) se activa a 0 lgico cuando el microcontrolador accede a la memoria externa de programas y se pone a 1 lgico en caso contrario. - (/EA)/VPP: este terminal (/EA, External Acces) colocado a 1 lgico (Vcc) hace que el microcontrolador ejecute el cdigo almacenado en la EPROM, OTPROM o ROM internas. Si se coloca a 0 (masa), el microcontrolador ejecuta el cdigo de programa de la memoria externa de programas, y activa el bus de direcciones, el bus de datos y las seales de control. Como VPP, el terminal se utiliza para proporcionar la tensin de programacin necesaria de la memoria EPROM o OTPROM interna. - RESET: este terminal cuando se pone a 1 reinicializa el microcontrolador, poniendo el contador de programa (PC) a 0000H, el puntero de la pila (SP) a 07H, todos los puertos (P0 a P3) a FFH y la mayora de los registros a cero.
36
-XTAL1, XTAL2: estos terminales son la entrada de la seal de reloj del microcontrolador. Puede utilizarse un resonador cermico o un cristal de cuarzo (figura 3.3); aunque, tambin se puede utilizar una seal de reloj externa.
XTAL2
C MCS-51 C
XTAL1 VSS
Fig. 3.3 Oscilador con cristal de cuarzo o resonador cermico para la MCS-51. C=30pF10pF para cristales de cuarzo. C=40pF10pF para resonadores cermicos Tabla 3.1 Funciones alternativas de los puertos P1 y P3
Nombre P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7
Funcin alternativa T2* T2EX* ECI CEX0 CEX1 CEX2 CEX3 CEX4 RXD TXD /INT0 /INT1 T0 T1 /WR /RD
Descripcin de la funcin alternativa Entrada o salida de reloj del Timer 2. Entrada externa del Timer 2. Entrada externa de reloj del PCA. Entrada/salida del mdulo 0 del PCA. Entrada/salida del mdulo 1 del PCA. Entrada/salida del mdulo 2 del PCA. Entrada/salida del mdulo 3 del PCA. Entrada/salida del mdulo 4 del PCA. Recepcin del puerto de comunicacin serie. Transmisin del puerto de comunicacin serie. Interrupcin externa 0. Interrupcin externa 1. Entrada externa del Timer 0. Entrada externa del Timer 1. Habilitacin de escritura en memoria externa. Habilitacin de lectura de memoria externa.
* En todas las versiones con 3 temporizadores En las versiones con PCA (8XC51FX y 8XL51FX)
3.1.2 Puertos de entrada/salida La constitucin interna de cada uno de los puertos se muestra en la figura 3.4. En el caso del puerto P0, cualquier de sus terminales, al disponer de un par de transistores NMOS conectados a P0.X, puede tener tres estados diferentes: 1 lgico (Vcc) si el transistor NMOS1 est en conduccin y el transistor NMOS2 en corte, 0 lgico (tierra) si el transistor NMOS1 est en corte y el transistor NMOS2 en conduccin, y alta impedancia cuando ambos transistores estn en corte, por lo que el terminal queda flotante desconectado de Vcc y de masa.
37
El resto de los terminales que pertenecen a los puertos P1, P2 y P3, (figura 3.4), tienen una resistencia de Pull-up y un transistor NMOS conectado a tierra, por lo que tan slo pueden tener dos estados: 1 lgico si el transistor NMOS est en corte y 0 lgico si el transistor est en conduccin.
BIT DEL PUERTO 0 (P0)
DIREC/DATO LEE LATCH B1 P0.X BUS INT. ESCRIBE EN LATCH D Q LATCH Q CL
1
VCC
CONTROL N1
CONTROL
MUX
MUX
B2
Segn la figura 3.4, todos los terminales de los puertos tienen una bscula D interna que se emplea para almacenar la informacin que se desea leer o escribir en cada terminal, de manera que basta con que una instruccin ponga un estado determinado en un terminal, para que este estado se mantenga estable hasta que sea cambiado por otra instruccin del programa. Por ejemplo la instruccin SETB P1.1 pone a 1 lgico el terminal P1.1: para ello se almacena un 1 lgico en la bscula D, lo que pone al transistor asociado en corte, pues la puerta NAND fuerza un 0 lgico en su base. Los puertos P0 y P2 tienen adems un multiplexor, MUX, y una lgica adicional, que permite al microcontrolador utilizar estos puertos como tales o como bus de direcciones y de datos. En este ltimo caso, el microcontrolador emplea las seales DIREC, DATO y CONTROL para establecer los estados adecuados en los terminales de estos puertos. Los puertos P1 y P3 tienen la misma estructura, pues deben realizar distintas funciones alternativas, como son las entradas y salidas de la PCA, en las versiones 8XC51FX, y las entradas de interrupciones /INT0 e /INT1, las entradas T0 y T1 para los temporizadores internos, etc. Estas funciones alternativas se introducen mediante la puerta NAND que aparece en la figura 3.4.
Pull-up es el trmino anglosajn empleado para definir a una resistencia conectada a la tensin de alimentacin del circuito, Vcc. Esta resistencia asegura que el terminal est a la tensin Vcc cuando en transistor NMOS est en corte.
38
Todos los puertos tienen al menos un buffer conectado al pin de entrada (B1), y un buffer conectado a la salida de la bscula D (B2), que intervienen en el proceso de lectura de los puertos. El buffer B1 est gobernado por la seal Read Latch, mientras que el buffer B2 est gobernado por la seal Read Pin. En el juego de instrucciones de la MCS-51, existen instrucciones que leen el estado lgico procedente del buffer B2 y instrucciones que leen el estado lgico procedente del buffer B1. Estas ltimas son instrucciones que leen el estado lgico de la bscula D, modifican este estado y escriben el resultado obtenido en la bscula D. A este tipo de instrucciones se les denomina de lecturamodificacin- escritura y, en concreto, son las instrucciones: ANL, ORL, XRL, JBC, CPL, INC, DEC, DJNZ, (MOV PX.Y,C), CLR PX.Y y SETB PX.Y, siempre que operen con uno de los puertos. Estas instrucciones leen el estado de la bscula para evitar un posible error producido por una mala interpretacin del nivel lgico en la entrada del terminal de un puerto. En cuanto a la conexin de dispositivos externos, los puertos P1, P2 y P3 pueden soportar una corriente de entrada mxima en un terminal de 1.6mA en estado lgico cero, transistor NMOS en conduccin. En cambio, el puerto P0 puede soportar hasta una corriente de 3.2mA a cero lgico.
Notar que /PSEN es una seal de lectura que slo acta sobre la memoria externa de programas.
3
Hay versiones con 4k, 8k, 16k o 32kbytes de memoria interna de programas.
39
a)
b)
c)
PSEN RD RD128k
EA = 0
Mem. RAM interna 8032/8052 128 bytes FFH (80H-FFH) FFH rea de registros especiales SFR 80H 7FH Mem. RAM interna 128 bytes 00H
Mem. externa
RD
0000H
EA = 1
0000H
WR
El microcontrolador activa diferentes seales en funcin del tipo de bloque de memoria al que accede. Si va a realizar una lectura del cdigo de programa, sita la direccin que desea leer en el bus de direcciones, A0-A15, y activa la seal /PSEN . Por contra, si va a realizar una lectura o escritura en la memoria de datos, sita la direccin correspondiente en A0-A15 y activa la seal /RD o /WR, segn vaya a leer o a escribir un dato, respectivamente. La CPU comienza a ejecutar el programa, tras un reset o al conectar la alimentacin, por la direccin 0000H, puesto que el contador de programa (PC) se inicializa con este valor. En las versiones con memoria interna de programa los microcontroladores pueden ir a buscar el cdigo de programa a la memoria interna o a la memoria externa , y para aclarar cul es el tipo de memoria del que debe leer el cdigo, dispone de la seal /EA. Si /EA est a 0 lgico, el microcontrolador ejecuta el cdigo almacenado en la memoria externa, y si /EA est a 1 lgico, ejecuta el cdigo almacenado en la memoria interna. En esta ltima situacin, el microcontrolador no activa la seal /PSEN ni los buses de direcciones y datos, puesto que no son necesarios. No obstante, el fabricante contempla la particularidad de que el cdigo de programa pueda estar almacenado en ambos tipos de memoria, parte en la memoria interna y el resto en la memoria externa. En este caso, el microcontrolador ejecuta primero el cdigo de programa de la memoria interna y, luego, pasa a ejecutar el cdigo almacenado en la memoria externa; activa entonces la seal /PSEN y los buses de direcciones y datos. Cabe destacar que esta particularidad carece de sentido, puesto que los microcontroladores con memoria EPROM o OTPROM tienen un coste ms elevado que el del resto, y su utilizacin slo se justifica por el mayor nmero de puertos tiles y por la reduccin del rea de circuito impreso que posibilitan. La memoria de programas y la memoria de datos pueden combinarse, si se desea, en un nico bloque de memoria de 128kbytes: para ello se deben combinar las seales /RD y /PSEN para que formen una
6 5 4
Debido a que los puertos P0 y P2 no deben formar el bus de direcciones y el bus de datos.
40
nica seal de lectura, lo que se consigue mediante una puerta AND lgica (figura 3.5c). 3.2.2 rea de memoria interna y de registros de propsito general Segn la figura 3.6, la familia MCS-51 tiene 128 bytes de memoria interna -posiciones de la 00H a la 7FH- y un rea para los registros de funcin especial (SFR) de 128 bytes -posiciones de la 80H a la FFH-. El rea de memoria interna est estructurada en tres partes: a) rea de registros de propsito general formado por cuatro bancos con ocho registros cada uno, b) rea accesible bit a bit y c) rea de memoria RAM general. a) Mem. Int
FFH * Slo 80H 7FH
7FH
Memoria RAM general 80 bytes rea direcc. bit a bit. 16 bytes, 128 bits Bancos de registros 32 bytes
2FH
8 0
80H
18H 10H
00H
* Slo en 8032/8052
08H 00H
Fig. 3.6 a) Memoria interna de la MCS-51. b) Organizacin de los primeros 128 bytes de esta memoria
a) rea de registros de propsito general El rea de registros de propsito general -posiciones de la 00H a la 1FH (figura 3.6b)- est formada por cuatro bancos de registros con ocho registros cada uno, lo que hace un total de 32 registros disponibles. De estos cuatro bancos de registros, slo uno puede estar activo en un instante determinado, mediante una seleccin previa con los bits RS0 y RS1 del registro de estado (PSW Program Status Word, -tabla 3.2-). Luego, en realidad tan slo se pueden usar los ocho registros correspondientes al banco de registros seleccionado. A los ocho registros de cada banco de registros se les denomina R0, R1, R2, R3, R4, R5, R6 y R7, respectivamente. Estos registros, en realidad, ocupan las mismas posiciones de memoria que abarca cada uno de los bancos: por ejemplo, para el banco 0, el registro R0 est ubicado en la posicin 00H de la memoria interna, el registro R1 en la posicin 01H, el registro R2 en la posicin 02H, y as sucesivamente hasta el registro R7, que est en la posicin 07H de la memoria interna; siguiendo este orden el registro R0 del banco 1 ocupa la posicin 08H de la memoria interna, el registro R0 del banco 2 est en la posicin 10H de la memoria interna y el registro R0 del banco 3 ocupa la posicin 18H de la memoria interna.
Tabla 3.2 Seleccin del banco de registros
RS1 (PSW) 0 0 1 1
RS0 (PSW) 0 1 0 1
41
b) Posiciones direccionables bit a bit En la memoria interna de la MCS-51 existen 16 bytes posiciones entre 20H y 2FH (figura 3.7)- que son accesibles a nivel de bit, por lo que se dispone de 128 bits accesibles de manera individual.
Memoria RAM interna
2FH 7
21H 7 20H 7
6 6
5 5
4 4
3 3
2 2
1 1
0 0
21H 0FH 0EH D0H 0CH 0BH 0AH 09H 08H 20H 07H 06H 05H 04H 03H 02H 01H 00H
Fig. 3.7 Posiciones de la memoria interna que son direccionables bit a bit
Existen dos formas de acceder a cada bit de esta zona: la primera consiste es indicar el bit mediante un punto que lo define como bit de un byte. Por ejemplo, al bit 5 del byte 20H se puede acceder como 20H.5. La otra forma consiste en utilizar una direccin para cada uno de los bits de esta zona, donde hay un total de 128 bits; por tanto, el primer bit, el 20H.0, tiene asignada la direccin 00H y el ltimo bit, el 2FH.7, tiene asignada la direccin 7FH 127 en base decimal. c) rea de memoria RAM general El rea de memoria RAM general es una zona de 80 bytes comprendida entre las posiciones 30H y 7FH de la memoria interna (figura 3.6b). En las versiones 8032AH, 8052AH y 8752BH esta zona se ampla en 128 bytes ms, y est situada entre las direcciones 80H y FFH. 3.2.3 rea de registros especiales (SFR) El rea de registros especiales SFR (tabla 3.3) est ubicada entre las direcciones 80H y FFH de la memoria interna y contiene los registros que determinan el modo de funcionamiento y la configuracin de los recursos internos de la familia MCS-51. La tabla 3.3 muestra la situacin de los registros del SFR dentro del espacio de memoria y el valor que toman tras la realizacin de un reset. Los registros con el superndice * aparecen en todas las versiones con 3 temporizadores y los registros con el superndice aparecen en las versiones 8XC51FX. Las zonas en blanco de la tabla 3.3 no estn implementadas fsicamente, y quedan reservadas para futuras ampliaciones de registros que desee hacer el fabricante. La tabla 3.4 muestra el listado de los registros del SFR, una pequea descripcin de stos y la direccin que corresponde a cada registro. Se debe destacar que todos los registros de la tabla 3.3 que aparecen en la primera columna son accesibles bit a bit, mientras que el resto de registros no lo son. Los registros de la primera columna son aquellos que tienen una direccin que acaba en 0 8, es decir: 80H, 88H, 90H, 98H, A0H, etc. Por tanto, al bit 3 del acumulador se puede acceder como ACC.3, al bit 2 del registro B se puede acceder como B.2, etc.
42
Tabla 3.3 Situacin de los registros del SFR de la MCS-51 y su valor tras un reset F8 F0 E8 E0 D8 D0 C8 C0 B8 B0 A8 A0 98 90 88 80 ACC
00000000
CH B
00000000
CCAP0H
CCAP1H
CCAP2H
CCAP3H
CCAP4H
FF F7
00000000
CL
CCAP0H
CCAP1H
CCAP2H
CCAP3H
CCAP4H
EF E7
00000000
CCON PSW
CMOD
CCAPM0
CCAPM1
CCAPM2
CCAPM3
CCAPM4
DF D7
00X00000 00000000
00XXX000
X0000000
X0000000
X0000000
X0000000
X0000000
T2CON
T2MOD
RCAP2L
RCAP2H
TL2
TH2
CF C7 BF IPH
00000000
00000000
00000000
IP
X0000000
SADEN
00000000
P3
11111111
B7 AF A7
X0000000
IE
00000000
SADDR
00000000
P2
11111111
SCON
00000000
SBUF
XXXXXXXX
9F 97
P1
11111111
TCON
00000000
TMOD
00000000
TL0
00000000
TL1
00000000
TH0
00000000
TH1
00000000
8F PCON
00XX0000
P0
11111111
X=Estado indefinido
SP
00000111
DPL
00000000
DPH
00000000
87
* En todas las versiones con 3 temporizadores En las versiones con PCA (8XC51FX y 8XL51FX)
Las versiones con 256 bytes de memoria interna tienen los 128 bytes altos situados entre las posiciones 80H y FFH. En consecuencia, comparten las mismas direcciones que el SFR (80H-FFH), por lo que se produce un solapamiento en cuanto a asignacin de direcciones. Para resolver este conflicto y poder acceder a ambas zonas de la memoria interna, se utiliza el modo de direccionamiento de las instrucciones de la familia; en concreto, si el direccionamiento se realiza de forma directa (direccionamiento directo), se accede al rea de SFR; y si, por contra, el direccionamiento se realiza
8 7
de una forma indirecta (direccionamiento indirecto), se accede al rea ampliada de memoria. Los distintos modos de direccionamiento se tratarn en el captulo siguiente.
En el direccionamiento directo, la direccin es de forma directa un operando de la instruccin. Ej. MOV 90H, #3BH; Escribe 3BH en la localizacin 90H=P1 (Puerto P1) del SFR.
8
En el direccionamiento indirecto, la direccin est contenida en un registro del microcontrolador. Para un 8052: Ej. MOV R0, #90H; MOV @R0, #3BH; Escribe 3BH en la posicin de memoria interna 90H. Nota: # indica el nmero es un dato numrico y @ es el indicativo del direccionamiento indirecto.
43
Tabla 3.4 Registros del rea de SFR para la MCS-51 Smbolo P0 P1 P2 P3 SP DPL DPH PCON TCON TMOD TL0 TH0 TL1 TH1 SCON SBUF IE SADDR IPH IP SADEN T2CON* RCAP2L* RCAP2H* TL2* TH2* PSW CCON CMOD CCAPM0 CCAPM1 CCAPM2 CCAPM3 CCAPM4 ACC CL CCAP0L CCAP1L CCAP2L CCAP3L CCAP4L B CH CCAP0H CCAP1H CCAP2H CCAP3H CCAP4H Nombre Puerto 0. Puerto 1. Puerto 2. Puerto 3. Puntero de la Pila (Stack Pointer). Byte bajo del puntero de datos DPTR. Byte alto del puntero de datos DPTR. Control del consumo de energa (Power Control). Control de los temporizadores (Timer Control). Configuracin de los temporizadores (Timer Mode). Byte bajo del temporizador 0. Byte alto del temporizador 0. Byte bajo del temporizador 1. Byte alto del temporizador 1. Control de la comunicacin serie (Serial Control). Buffer de datos de la comunicacin serie (Serial Buffer). Habilitacin de interrupciones (Interrupt Enable). Direccin esclavo (Slave Address). Byte alto del registro de prioridad de interrupciones. Registro de prioridad (Interrupt Priority). Mscara de direcciones esclavo (Slave Address Mask). Control del temporizador 2. Byte bajo del registro de captura del temporizador 2. Byte alto del registro de captura del temporizador 2. Byte bajo del temporizador 2. Byte alto del temporizador 2. Registro de estado (Program Status Word). Registro de control del Timer/Counter del PCA. Registro de modo del Timer/Counter del PCA. Registro modo 0 del Timer/Counter del PCA. Registro modo 1 del Timer/Counter del PCA. Registro modo 2 del Timer/Counter del PCA. Registro modo 3 del Timer/Counter del PCA. Registro modo 4 del Timer/Counter del PCA. Acumulador. Byte bajo del Timer/Counter del PCA. Byte bajo del mdulo 0 de comparacin/captura del PCA. Byte bajo del mdulo 1 de comparacin/captura del PCA. Byte bajo del mdulo 2 de comparacin/captura del PCA. Byte bajo del mdulo 3 de comparacin/captura del PCA. Byte bajo del mdulo 4 de comparacin/captura del PCA. Registro B. Byte alto del Timer/Counter del PCA. Byte alto del mdulo 0 de comparacin/captura del PCA. Byte alto del mdulo 1 de comparacin/captura del PCA. Byte alto del mdulo 2 de comparacin/captura del PCA. Byte alto del mdulo 3 de comparacin/captura del PCA. Byte alto del mdulo 4 de comparacin/captura del PCA.
Direccin 80H 90H A0H B0H 81H 82H 83H 87H 88H 89H 8AH 8CH 8BH 8DH 98H 99H A8H A9H B7H B8H B9H C8H CAH CBH CCH CDH D0H D8H D9H DAH DBH DCH DDH DEH E0H E9H EAH EBH ECH EDH EEH F0H F9H FAH FBH FCH FDH FEH
* En todas las versiones con 3 temporizadores En las versiones con PCA (8XC51FX y 8XL51FX)
44
Puertos de entrada/salida y busesde acceso a memoria P2.7:0 P0.7:0 Cdigo OTPROM/ROM 8Kbytes 16Kbytes
Puerto 0 drivers
Puerto 2 drivers
Puerto 1 drivers
Puerto 3 drivers
Control de interrupciones
Bus IB
PCA
SRC1 (8)
SRC2 (8)
Clock y reset
Puerto Serie
ALU
Perifricos
Microcontroladores 8XC251SA/SB/SP/SQ Fig. 3.8 Diagrama funcional de la arquitectura interna de la familia MCS-251
45
La familia MCS-251 tiene una serie de innovaciones y mejoras con respecto a la MCS-51, sin dejar de ser compatible con sta en cuanto a encapsulado y juego de instrucciones. A pesar de esta compatibilidad, el juego de instrucciones en la MCS-251 ha sido considerablemente ampliado, e incluye instrucciones que operan con datos de 8, 16 y 32 bits y que facilitan el desarrollo de programas en lenguajes de alto nivel como el lenguaje C. Para mantener al mismo tiempo la compatibilidad con la MCS-51 y la ampliacin y mejora del juego de instrucciones, se han definido los modos de trabajo fuente source y binario binary. En el modo fuente se puede emplear las nuevas instrucciones y los tipos de direccionamientos ideados para la MCS-251, por lo que el cdigo de programa generado suele ser ms compacto y eficiente. En el modo binario se programa de la misma manera que con la MCS-51 y por tanto es completamente compatible con sta. Con este modo la MCS-251 puede sustituir a la MCS-51 de forma directa, en aplicaciones ya desarrolladas, y sin necesidad de tener que generar nuevos programas. El espacio de memoria que es capaz de direccionar la familia MCS-251 es de 16Mbytes tanto para cdigo de programa como para datos, puesto que el contador de programa es de 24 bits, pero en realidad el espacio de memoria real es de 256kbytes de memoria externa, ya que como bus de direcciones se dispone de los puertos P0 y P2, y las lneas A16 y A17, que son funciones alternativas de los puertos P3 y P1, respectivamente. La MCS-251 incorpora tambin cierta cantidad de memoria interna de programa y datos, as como un controlador de interrupciones y distintos perifricos como un temporizador Watchdog, tres temporizadores/contadores, un array de contadores programable (PCA) y un puerto de comunicacin serie. Una de las caractersticas de la MCS-51 consiste en que multiplexa temporalmente el byte bajo del bus de direcciones (A0-A7) y el bus de datos (D0-D7) en el puerto P0. Esta multiplexacin se mantiene para la MCS-251 y se denomina modo no paginado. Sin embargo, para la MCS-251 la multiplexacin temporal tambin se puede hacer entre el byte alto del bus de direcciones (A8-A15) y el bus de datos (D0-D7) en el puerto P2, pues de esta manera y como se explicar ms adelante el acceso a la memoria externa es ms eficiente, el puerto P0 en este caso permanecera estable con la direccin correspondiente al byte bajo del bus de direcciones (A0-A7). Esta manera de realizar la multiplexacin temporal en el puerto P2 se denomina modo paginado. La familia tambin incorpora dos modos de funcionamiento de bajo consumo denominados Idle y Power Down, que son adecuados para aplicaciones alimentadas con bateras. El modo Idle para la seal de reloj de la CPU, detiene la ejecucin del programa y ello hace que el consumo de energa sea un 40% menor, pero mantiene la seal de reloj en los perifricos, y permite que sigan en funcionamiento. El modo Power Down detiene las seales de reloj de la CPU y de los perifricos, con lo que consigue una reduccin en el consumo de energa de hasta un 60%.
3.3.1 Relacin de terminales La figura 3.9 muestra el encapsulado en formato DIP y PLCC, y la disposicin de terminales de la MCS-251.
46
8XC251Sx
P1.0/T2 P1.1/T2EX P1.2/ECI P1.3/CEX0 P1.4/CEX1 P1.5/CEX2 P1.6/CEX3/WAIT P1.7/CEX4/A17/WCLK RST P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD/A16 XTAL1 XTAL2 VSS 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 VCC AD0/P0.0 AD1/P0.1 AD2/P0.2 AD3/P0.3 AD4/P0.4 AD5/P0.5 AD6/P0.6 AD7/P0.7 EA/VP ALE/PROG /PSEN A15/P2.7 A14/P2.6 A13/P2.5 A12/P2.4 A11/P2.3 A10/P2.2 A9/P2.1 A8/P2.0
P1.5/CEX2 P1.6/CEX3/WAIT P1.7/CEX4/A17/WCLK RST P3.0/RXD VCC2 P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1
6 5 4 3 2 1 44 43 42 41 40
P1.4/CEX1 P1.3/CEX0 P1.2/ECI P1.1/T2EX P1.0/T2 VSS1 VCC AD0/P0.0 AD1/P0.1 AD2/P0.2 AD3/P0.3
7 8 9 10 11 12 13 14 15 16 17
8XC251Sx
39 38 37 36 35 34 33 32 31 30 29
AD4/P0.4 AD5/P0.5 AD6/P0.6 AD7/P0.7 EA/VP VSS2 ALE/PROG PSEN A15/P2.7 A14/P2.6 A13/P2.5
La relacin de terminales de los microcontroladores de la familia MCS-251 es la siguiente: - VCC, VCC2: entradas de alimentacin. Vcc y VCC2 se deben poner a +5V. VCC2 permite reducir el ruido que puede haber en la lnea de alimentacin. - VSS, VSS1, VSS2: terminales de masa del microcontrolador. - P0.0, P0.1 P0.7: puerto bidireccional bit a bit de E/S P0. P0 puede soportar el byte bajo del bus de direcciones y el bus de datos mediante una multiplexacin temporal en el modo no paginado, en el caso de tener que utilizar memoria externa (AD0,, AD7). En las versiones con memoria interna de programa, el cdigo de programa se introduce a travs de este puerto, en la fase de programacin y verificacin. - P2.0, P2.1 P2.7: puerto bidireccional bit a bit de E/S P2. P2 puede soportar el byte alto del bus de direcciones y el bus de datos mediante una multiplexacin temporal, en el modo paginado (A8,, A15) de acceder a la memoria externa. - P1.0, P1.1 P1.7: puerto bidireccional bit a bit de E/S P1. P1 es un puerto de propsito general, no obstante soporta varias funciones especiales de la familia MCS-51 (tabla 3.5), que estn relacionadas con el temporizador Timer 2, con el array de contadores programable PCA, la seal WAIT que controla los estados de espera en los ciclos de acceso a la memoria externa, la lnea A17 del bus de direcciones y la seal WCLK que es la salida de reloj para estados de espera en el acceso de memoria externa. Los terminales P1.3, P1.4, P1.5, P1.6, P1.7 son entradas/salidas CEX0, CEX1, CEX2, CEX3, CEX4 de la PCA, respectivamente. Estos terminales actan como entradas de los mdulos 0, 1, 2, 3 y 4 de la PCA cuando trabaja en modo captura, respectivamente, y como salidas de los mismos mdulos cuando la PCA trabaja en modo comparacin y en modulacin de anchura de pulsos (PWM). La funcin alternativa de P1.7 se determina mediante RD1 y RD0 del registro de configuracin UCONFIG0. Si RD1=RD0= 0, su funcin es la lnea A17 del bus de direcciones. No obstante, si el bit WCON.1 est 1, en P1.7 se genera una seal cuadrada de frecuencia que es la mitad de la seal de reloj del microcontrolador.
P3.6/WR P3.7/RD/A16 XTAL2 XTAL1 VSS VSS2 A8/P2.0 A9/P2.1 A10/P2.2 A11/P2.3 A12/P2.4
18 19 20 21 22 23 24 25 26 27 28
47
- P3.0, P3.1 P3.7: puerto bidireccional bit a bit de E/S P3. P3 es un puerto de propsito general que soporta diversas funciones especiales de la familia MCS-51 al igual que el puerto P1 (tabla 3.5). Las funciones que soporta este puerto son las seales TXD y RXD del puerto de comunicacin serie, las entradas de interrupcin /INT0 y /INT1, las entradas externas T0 y T1 de los temporizadores, las seales de lectura y escritura en memoria externa /RD y /WR, y la lnea A16 del bus de direcciones. La funcin alternativa de P3.7 tambin depende del estado de los bits RD1 y RD0 de UCONFIG0. Si RD1=RD0= 1, su funcin alternativa es /RD y si RD1= 0 y, RD0 = 1 o RD1= 0 y RD0=0, su funcin alternativa es la lnea A16 del bus de direcciones.
Tabla 3.5 Descripciones de las funciones de los pines de los puertos de entrada/salida
Nombre Nombre del pin con Descripcin de la funcin alternativa del pin funcin alternativa P1.0 T2 Entrada/salida de reloj del Timer 2. P1.1 T2EX Entrada externa del Timer 2. P1.2 ECI Entrada externa de reloj del PCA. P1.3 CEX0 Entrada/salida del mdulo 0 del PCA. P1.4 CEX1 Entrada/salida del mdulo 1 del PCA. P1.5 CEX2 Entrada/salida del mdulo 2 del PCA. P1.6 CEX3 Entrada/salida del mdulo 3 del PCA. P1.7 CEX4, A17, WCLK E/S del mdulo 4 del PCA o A17 del bus de direcciones. P3.0 RXD Entrada de datos del puerto serie. P3.1 TXD Salida de datos del puerto serie. P3.2 /INT0 Entrada interrupcin externa 0. P3.3 /INT1 Entrada interrupcin externa 1. P3.4 T0 Entrada Timer 0. P3.5 T1 Entrada Timer 1. P3.6 /WR Habilitacin de escritura en memoria externa. P3.7 /RD, A16 Habilitacin de lectura en mem. externa o A16 del bus de direcciones - /PSEN: este terminal se activa cuando el microcontrolador realiza operaciones de lectura en la memoria externa en determinados rangos de direcciones, dependiendo del valor de los bits de configuracin RD1 y RD0. - (/EA)/VP: este terminal puesto a 1 hace que el microcontrolador ejecute el cdigo almacenado en las EPROM, OTPROM o ROM internas. Si se coloca a 0, el microcontrolador ejecuta el cdigo de programa de la memoria externa de programas, activa el bus de direcciones, el bus de datos y las seales de control. VP se utiliza para proporcionar la tensin de programacin necesaria de la memoria EPROM o OTPROM interna. - XTAL1, XTAL2: estos terminales son la entrada de la seal de reloj del microcontrolador. Puede utilizarse un resonador cermico o un cristal de cuarzo. Tambin se puede utilizar una seal externa de reloj. El esquema circuital es el mismo que el de la figura 3.3 para la MCS-51. - RST: entrada de reset del microcontrolador. Se debe colocar a nivel alto durante al menos 64 perodos de reloj para realizar la operacin de reset.
48
3.3.2 Estructura interna de los puertos de entrada/salida La estructura interna de los puertos de E/S es la misma que la descrita para la MCS-51, salvo alguna diferencia como el hecho de que el puerto P1 tenga funciones alternativas y se introduzcan los modos paginado y no paginado de direccionar la memoria. Debido a ello, en el puerto P2 se introduce la seal DATO para determinar los estados lgicos del puerto, puesto que en el modo paginado el puerto pasa a soportar el bus de datos adems del byte alto del bus de direcciones; y los puertos P1 y P3 pasan a tener la misma estructura interna (figura 3.10). La estructura interna de los puertos de la MCS-251 es prcticamente idntica a la estructura de la MCS-51, por lo que la explicacin de su funcionamiento se ha realizado en el apartado 3.1.2.
BIT DEL PUERTO 0 (P0)
DIRECC/DATO LEE LATCH B1 P0.X BUS INT. ESCRIBE EN LATCH D Q LATCH Q CL
1
VCC
CONTROL N1
DIRECC/DATO CONTROL
MUX
MUX
B2 LEE PIN
B2
LEE PIN
LEE PIN
Fig. 3.10 Latchs de los bits de los puertos y buffers de entrada/salida para la MCS-251
49
resultados finales relacionados con dicho programa. Este espacio tiene un tamao de 16Mbytes de posiciones de memoria distribuidas en 256 regiones de 64kbytes cada una, numeradas de la 00: a la FF:. La familia MCS-251 est diseada para tener hasta un mximo de 64kbytes de memoria interna no voltil, ubicada en la regin FF:. La memoria RAM interna est ubicada en la regin 00:, comenzando a partir de la direccin 00:0020H. La dimensin de la memoria interna depende de la versin de microcontrolador. El rea de registros de propsito general contiene 64 registros de 8 bits numerados decimalmente del 0 al 63. Estos registros tienen la funcin de guardar los datos y resultados que intervienen con ms frecuencia en el programa. El espacio SFR puede tener hasta 512 registros de 8 bits de funcin especfica que estn, en la mayora de los casos, relacionados con la programacin de los perifricos que incorpora el microcontrolador. Las direcciones de los registros de este rea van de la S:000H a la S:1FFH. En la direccin de un registro del rea SFR se utiliza el prefijo S: para diferenciarla de una direccin de memoria.
rea de memoria 16 Mbytes
FF:FFFFH
S:000H
3.4.1 rea de memoria En la figura 3.12 se muestra el rea de memoria de los microcontroladores 8XC251Sx. De los 16Mbytes de memoria tericamente tiles, tan slo se pueden usar 8 regiones de 64 kbytes, en concreto la 00:, 01:, 02:, 03:, FC:, FD:, FE: y FF:, donde se pueden almacenar indistintamente cdigo de programa o datos. El resto de regiones de memoria, de la 04: a la FB:, estn reservadas y no pueden ser utilizadas por el usuario. El nmero de lneas de direcciones de los microcontroladores de la serie 8XC251Sx es configurable por el usuario: el valor mximo es 18, lo que limita el nmero mximo de posiciones de memoria externa que se pueden direccionar de forma directa a 256kbytes. Las 8 posiciones de memoria que van de la direccin FF:FFF8H a la FF:FFFFH estn reservadas para la configuracin del dispositivo. En concreto, en la versin 8XC251Sx se utilizan slo los bytes
50
FF:FFF8H y FF:FFF9H para realizar la configuracin, el resto se reservan para la configuracin de futuras versiones de este microcontrolador. En la regin 00: se ubica la memoria RAM interna, en concreto entre la direccin 00:0020H y la 00:021FH, para aquellas versiones que disponen de 512 bytes de memoria RAM interna, o bien entre la direccin 00:0020H y la 00:041FH para aquellas versiones que disponen de 1Kbyte de posiciones de memoria RAM interna. La memoria RAM interna est destinada exclusivamente a guardar datos ya que no se puede ejecutar instrucciones almacenadas en ella. Los primeros 32 bytes de memoria, de la direccin 00:0000H a la 00:001FH, estn asociados al rea de registros. Por otra parte, las posiciones de memoria comprendidas entre la 00:0020H y la 00:007FH son accesibles a nivel de bit.
rea de memoria 16 Mbytes
FF:FFFFH
Regin FF:
Bytes de configuracin FF:FFF8H - FF:FFFFH FF:FFF7H
FF:0000H FE:FFFFH
Memoria externa
FF:2000H/FF:4000H
Memoria externa
FE:0000H FD:FFFFH
OTPROM/ROM interna
SB, SQ:16 Kbytes (FF:0000H - FF:3FFFH) SA, SP: 8 Kbytes (FF:0000H - FF:1FFFH)
Memoria externa
FD:0000H FC:FFFFH
Memoria externa
FC:0000H Regiones reservadas 04: a FB: 03:FFFFH
Memoria externa
03:0000H 02:FFFFH
Regin 00:
00:FFFFH
Memoria externa
02:0000H 01:FFFFH
Memoria externa
00:0220H/00:0420H
Memoria externa
01:0000H 00:FFFFH
RAM interna
SB, SQ: 1 Kbytes (00:0020H - 00:041FH) SA, SP: 512 bytes (00:0020H - 00:021FH) 32 bytes de registros de trabajo 00:0000H - 00:001FH
00:0000H
Fig. 3.12 Implementacin hardware del rea de memoria de los microcontroladores 8XC251SA, SB, SP y SQ
La memoria interna de lectura est ubicada en la direccin FF:. Las diferentes versiones del microcontrolador 8XC251Sx disponen de 0, 8 16kbytes de memoria interna del tipo ROM (83C251Sx) o OTPROM/EPROM (87C251Sx). En la figura 3.12 las zonas sombreadas se corresponden con la memoria interna, mientras que el resto de zonas se deben implementar, en caso que se utilicen, mediante de integrados de memoria externos.
51
3.4.2 rea de registros de propsito genrico El rea de registros de propsito general de la familia MCS-251 dispone de 64 registros numerados desde el 0 al 63, aunque los registros que estn ubicados entre las posiciones 32 y 55 estn reservados para futuras versiones, lo que reduce el nmero total de registros disponibles a 40, como se muestra en la figura 3.13. rea de registros 56 57 58 59 60 61 62 63
Los registros situados entre la posicin 0 y 7 estn implementadas fsicamente en las direcciones 00:0000H a 00:001FH. Estas 32 posiciones de memoria constituyen un rea dentro del espacio de memoria denominada banco de registros, similar a la que poseen los microcontroladores de la familia MCS-51. Hay en total 4 bancos de registros de 8 posiciones cada uno, que aparecen representados en la figura 3.14.
rea de registros 63
rea de memoria
FF:FFFFH
8 0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
Bancos de registros
52
Al igual que ocurre en la familia MCS-51, slo uno de los cuatro bancos es accesible a travs de los registros. El banco accesible o activo se selecciona a travs de los bits RS0 y RS1 del registro de estado PSW (tabla 3.6).
Tabla 3.6 Seleccin del banco de registros
Despus de hacer un reset del microcontrolador, el banco activo por defecto es el banco cero, ya que los bits RS1 y RS0 se ponen a cero. Para cambiar de banco de registro se debe modificar el valor de los bits RS1 y RS0 mediante la instruccin adecuada. El rea de registros tiene la particularidad de que permite acceder a la informacin contenida en ella a nivel de byte, 16 bits (Word) y 32 bits (Dword), lo cual facilita la tarea de los compiladores de C para esta familia. No todos los registros del rea de registros son accesibles de las tres formas indicadas: las localizaciones que son accesibles a nivel de byte son las que van de la cero a la 15. Para identificar un registro al cual se accede a nivel de byte, se utiliza la letra R seguida del nmero de la localizacin correspondiente (figura 3.16). Por ejemplo, si se desea escribir el byte 5BH en la localizacin 9 se debe utilizar el nombre R9 para hacer referencia a esta localizacin: MOV R9,#5BH Slo el rango de localizaciones de la 0 a la 31 es accesible a nivel de Word. Un registro tipo Word est formado por dos localizaciones y se identifica con las letras WR seguido del nmero de la localizacin de menor peso que interviene en dicho registro. Por ejemplo, el registro WR2 est formado por las localizaciones 2 y 3. En la figura 3.16 estn indicados todos los registros Word disponibles. Todas las localizaciones del rea de registros son accesibles a nivel de Dword. Un Dword est formado por cuatro localizaciones y se identifica con las letras DR y el nmero de la localizacin de menor peso que interviene en el registro Dword. Por ejemplo, el registro DR28 est formado por las localizaciones 28, 29, 30 y 31. En la figura 3.16 se indican todos los registros Dwords posibles. Existen 4 registros del rea de registros que por motivos de compatibilidad con los microcontroladores de la familia MCS-51 poseen una funcin especfica. Estos registros son: - R10 es el registro B. - R11 es el registro acumulador (ACC o A). - DR56 es el registro puntero de datos extendido, DPX. - DR60 es el registro puntero de pila extendido, SPX. Los registros R10, R11, y algunas localizaciones de los registros DR56 y DR60, son accesibles tambin a travs del rea de registros de funcin especfica (SFR).
53
Una de las mejoras que tiene la familia MCS-251 respecto a la MCS-51, es que cualquiera de sus registros de tipo byte, del R0 al R15, puede realizar la funcin del acumulador en las instrucciones aritmticas y lgicas, lo que evita el cuello de botella que el acumulador supone para la MCS-51. En las instrucciones de la familia MCS-51 el registro acumulador era el principal registro en transferencias y operaciones aritmticas y lgicas. En cambio en la familia MCS-251 cualquier registro, del R0 al R15, puede realizar la tarea de acumulador. Por lo tanto, el acumulador no tiene, en esta familia, la importancia que posee en la familia MCS-51. El puntero de datos extendido DPX est ubicado en el registro DR56 (figura 3.16). Los tres bytes de menor peso del DPX (DPL, DPH y DPXL) son accesibles tambin a travs del rea SFR. Los registros DPL y DPH forman el puntero de datos DPTR de 16 bits. En la familia MCS-51 este registro se emplea de forma nica para acceder a la memoria externa de datos; sin embargo, para la familia MCS251 el acceso a la memoria externa o interna se puede hacer mediante cualquier registro de tipo Word o Dword. El registro DPXL ubicado en la localizacin 57 del rea de registros, permite seleccionar la regin de memoria (00:-FF:) a la que se desea acceder a travs del puntero de datos extendido. Registro byte
Registro word
Registro dword DR56 DR60 0 1 2 3 4 5 6 7 Bancos de registros DR24 DR16 DR8 DR0 DR28 DR20 DR12 DR4
El registro Dword DR60 es el puntero de datos extendido, SPX (figura 3.17). El byte de la localizacin 63 es el puntero de pila, SP, de la familia MCS-51. EL byte de la localizacin 62 es la parte alta del puntero de pila, SPH. Estos dos bytes controlan el funcionamiento de la pila, que en la familia MCS-251 puede tener una dimensin mxima de 64 kbytes correspondientes a la regin 00: de memoria.
54
rea de registros
Parte alta del puntero de pila
Area SFR
S:BEH S:81H
DR60 = Puntero extendido de pila, SPX Parte baja del puntero extendido de datos DPXL Parte alta del puntero de pila DPH Parte baja del puntero de datos DPXL 56 57 DPH 58 DPL 59 DPL S:83H S:82H S:84H
3.4.3 rea de registros de funcin especfica SFR La mayora de los registros del rea de registros de funcin especfica (SFR) estn vinculados a la programacin de los perifricos de la familia MCS-251. En la tabla 3.7 aparecen los registros del rea SFR junto con el valor que adquieren cuando se realiza un reset del microcontrolador. Las direcciones del rea SFR que no estn ocupadas por registros (zonas sombreadas en la tabla 3.7) no estn implementadas, por lo que no se pueden utilizar. Al rea SFR slo se puede acceder a nivel de bit o byte, pero no a nivel de Word o Dword. En la tabla 3.8 se indican los distintos registros del rea SFR, junto con la direccin y una pequea descripcin de la funcin que realizan.
55
5/D
6/E
Tabla 3.8 Registros del rea SFR Mnemnico Registros ACC B PSW PSW1 SP SPH DPTR DPL DPH DPXL PCON IE0 IPH0 IPL0 Nombre bsicos Acumulador Registro B Registro de estado (Program Status Word) Registro de estado 1 Parte baja del puntero de pila (Stack Pointer) Parte alta del puntero de pila Puntero de datos (Data Pointer) Parte baja del DPTR Parte alta del DPTR Parte baja del puntero extendido de datos Registro de control de potencia (Power Control) Registro de habilitacin de interrupciones Parte alta del registro de prioridad de interrupciones Parte baja del registro de prioridad de interrupciones Direccin S:E0H S:F0H S:D0H S:D1H S:81H S:BEH -S:82H S:83H S:84H S:87H S:A8H S:B7H S:B8H
56 Tabla 3.8 Registros del rea SFR (continuacin) Mnemnico Registros P0 P1 P2 P3 Puerto SCON SBUF SADEN SADDR Registros TL0 TH0 TL1 TL2 TL2 TH2 TCON TMOD T2CON T2MOD RCAP2L RCAP2H WDTRST Registros CCON CMOD CCAPM0 CCAPM1 CCAPM2 CCAPM3 CCAPM4 CL CH CCAP0L CCAP1L CCAP2L CCAP3L CCAP4L CCAP0H CCAP1H CCAP2H CCAP3H CCAP4H
Nombre de los puertos de entrada/salida Puerto 0 Puerto 1 Puerto 2 Puerto 3 de comunicacin serie Registro de control del puerto serie Registro buffer del puerto serie Mscara de direcciones esclavo (Slave Address Mask) Direccin esclavo (Slave Address) del Watchdog y de los Timer/Counter 0, 1 y 2 Parte baja del Timer/Counter 0 Parte alta del Timer/Counter 0 Parte baja del Timer/Counter 1 Parte alta del Timer/Counter 1 Parte baja del Timer/Counter 2 Parte alta del Timer/Counter 2 Registro de control de los Timer/Counter 0 y 1 Registro de control de modo de los Timer/Counter 0 y 1 Registro de control del Timer/Counter 2 Registro de control de modo del Timer/Counter 2 Byte bajo de captura del Timer/Counter 2 Byte alto de captura del Timer/Counter 2 Registro Watchdog del array de controladores programables (PCA) Registro de control del Timer/Counter PCA Registro de modo del Timer/Counter PCA Registro modo 0 del Timer/Counter PCA Registro modo 1 del Timer/Counter PCA Registro modo 2 del Timer/Counter PCA Registro modo 3 del Timer/Counter PCA Registro modo 4 del Timer/Counter PCA Byte bajo del Timer/Counter del PCA Byte alto del Timer/Counter del PCA Byte bajo del mdulo 0 de comparacin/captura del PCA Byte bajo del mdulo 1 de comparacin/captura del PCA Byte bajo del mdulo 2 de comparacin/captura del PCA Byte bajo del mdulo 3 de comparacin/captura del PCA Byte bajo del mdulo 4 de comparacin/captura del PCA Byte alto del mdulo 0 de comparacin/captura del PCA Byte alto del mdulo 1 de comparacin/captura del PCA Byte alto del mdulo 2 de comparacin/captura del PCA Byte alto del mdulo 3 de comparacin/captura del PCA Byte alto del mdulo 4 de comparacin/captura del PCA
Direccin S:80H S:90H S:A0H S:B0H S:98H S:99H S:B9H S:A9H S:8AH S:8CH S:8BH S:8DH S:CCH S:CDH S:88H S:89H S:C8H S:C9H S:CAH S:CBH S:A6H S:D8H S:D9H S:DAH S:DBH S:DCH S:DDH S:DEH S:E9H S:F9H S:EAH S:EBH S:ECH S:EDH S:EEH S:FAH S:FBH S:FCH S:FDH S:FEH
57
3.4.4 Compatibilidad con la arquitectura de la familia MCS-51 Las reas de memoria y los registros de la arquitectura MCS-51 estn contenidos dentro de los espacios de direcciones de la familia MCS-251, lo que posibilita la compatibilidad con los programas diseados para la familia MCS-51. En la figura 3.18 se muestra cmo quedan ubicados los espacios de direcciones de la familia MCS-51 dentro de la arquitectura de la familia MCS-251. Los 64kbytes de memoria de programa de la familia MCS-51 se corresponden con la regin FF: del rea de memoria de la familia MCS-251.
SFRs MCS-51
FFH S:07FH
02:0000H FFFFH
8 FFH
Reg. MCS-51
0
Los 64kbytes de la memoria de datos externa se ubican en la regin de memoria especificada por el registro DPXL. Se puede acceder a este registro a travs de la localizacin 57 o a travs de la direccin S:084H del rea SFR. El valor que adquiere por defecto este registro despus de hacer un reset es el 01:, como se muestra en la figura 3.18, por lo que inicialmente la memoria externa de datos est ubicada en la regin 01:. La memoria externa de datos se puede reubicar en otra regin programando adecuadamente el registro DPXL. Los 256 bytes de memoria RAM interna de la familia MCS-51 estn ubicados en las direcciones del rea de memoria 00:0000H-00:00FFH. Los 128 bytes del rea SFR de la familia MCS-51 estn ubicados dentro de los 512 bytes del rea SFR de la familia MCS-251 a partir de la direccin S:080H, como se muestra en la figura 3.18, para mantener la compatibilidad con la familia MCS-251. Los registros de trabajo R0-R7 de la familia MCS-51, estn ubicados en los 32 primeros bytes del rea de memoria de la familia MCS-251 para mantener la compatibilidad.
58
Reubicacin de los 8kbytes de memoria de lectura interna en la regin 00: para aquellas versiones que disponen de 16kbytes de memoria interna de tipo ROM/OTPROM/EPROM. Los bytes utilizados para configurar los microcontroladores de la serie 8XC251Sx son el UCONFIG0, en la direccin FF:FFF8H, y el UCONFIG1, en la direccin FF:FFF9H (figura 3.19).
UCONFIG0
---/WSA1 /WSA0 /XALE RD1 RD0 /PAGE SRC
/WSA1,0 : Control de insercin de estados de espera para memoria externa /XALE : Activacin de la seal ALE extendida RD1,0 : Seleccin del nmero de lneas del bus externo de direcciones /PAGE : Seleccin de modo paginado o no paginado SRC : Seleccin de modo fuente o modo binario
UCONFIG1
---------INTR WSB /WSB1 /WSB0 /EMAP
INTR : Seleccin de bytes almacenados en la pila por una interrupcin WSB : Activacin de estado de espera en accesos a memoria externa /WSB1,0 : Control de insercin de estados de espera para memoria externa /EMAP : Reubicacin de la memoria de lectura interna en la regin 00:
Fig. 3.19 Bytes de configuracin UCONFIG0 y UCONFIG1
Para los dispositivos que incorporan memoria ROM/OTPROM/EPROM interna, la informacin sobre la configuracin se almacena en memoria no volatil en estas direcciones. Para aquellas versiones de microcontrolador que no disponen de memoria ROM/OTPROM/EPROM interna la configuracin se almacena en memoria externa en las direcciones indicadas.
3.5.1 Configuracin del acceso a la memoria externa Existen distintas opciones que permiten configurar el acceso a la memoria externa de forma ms adecuada a la aplicacin que se est diseando:
59
1. 2. 3. 4.
La ubicacin del bus de datos en el puerto cero (modo no paginado) o el puerto 2 (modo paginado). El nmero de lneas del bus de direcciones externo (16, 17 o 18). Las regiones de memoria asignadas a las seales de control de lectura /RD y /PSEN. Los estados de espera en el acceso a la memoria externa (0, 1, 2 3 estados de espera).
3.5.1.1 Modos paginado y no paginado Con respecto a la ubicacin del bus de datos, se puede elegir entre dos posibilidades: modo paginado o modo no paginado, utilizando el bit /PAGE (bit 1 de la localizacin UCONFIG0). En el modo no paginado (/PAGE = 1) el bus de datos est ubicado en el puerto cero, al igual que en los microcontroladores de la familia MCS-51. Por tanto, este modo es el adecuado para aplicaciones donde se requiera compatibilidad a nivel de hardware con la familia MCS-51. En el modo paginado (/PAGE = 0) el bus de datos est ubicado en el puerto dos, lo que permite, bajo ciertas condiciones, reducir el tiempo de acceso a la memoria externa. En este modo se puede leer un cdigo de operacin en tan slo 2 ciclos de reloj, en lugar de los cuatro ciclos necesarios en el modo no paginado.
3.5.1.2 Nmero de lneas del bus de direcciones Los bits RD y RD1 (bits 2 y 3 de la localizacin UCONFIG0) permiten seleccionar el nmero de lneas de bus de direcciones externas y el rango de direcciones controlado por las seales de lectura /RD y /PSEN y la seal de escritura /WR. En la tabla 3.9 se muestran las distintas posibilidades de configuracin con respecto a los bits RD0 y RD1. RD1:0 = 00 (18 lneas de bus de direcciones) Si se programan los bits RD1 y RD0 a cero lgico se obtiene una configuracin de 18 lneas de bus externo de direcciones, lo que permite direccionar un total de 256kbytes de posiciones de memoria externas, que es la mxima cantidad de memoria que pueden direccionar los microcontroladores de la serie 8XC251Sx. Las 16 primeras lneas del bus de direcciones (de la A0 a la A15) estn soportadas por los puertos P0 y P2, la lnea A16 del bus de direcciones est ubicada en el canal P3.7 y la lnea de mayor peso, A17, en el canal P1.7. Con esta configuracin se utilizan dos seales para controlar el acceso ala memoria externa: [ /PSEN: controla las operaciones de lectura de la memoria externa para cualquier direccin (de la 00:0000H a la FF:FFFFH). [ /WR: controla las operaciones de escritura de la memoria externa para cualquier direccin (de la 00:0000H a la FF:FFFFH).
60
RD1:0 = 01 (17 lneas de bus de direcciones) Si se programan los bits RD1 y RD0 con los valores 0 y 1 respectivamente, se obtiene 17 lneas de bus externo de direcciones: las 16 primeras lneas, A0-A15, implementadas mediante los puertos P0 y P2, y la lnea A16 implementada con el canal P3.7. Con esta configuracin se pueden direccionar hasta 128kbytes de memoria externa. Las seales que controlan la lectura y escritura en la memoria externa son las mismas que para la configuracin RD1:0 = 00. RD1:0 = 10 (16 lneas de bus de direcciones) La configuracin RD1 =1 RD0 = 0 permite tener un total de 16 lneas de bus de direcciones, de la A0 a la A15, implementadas con los puertos P0 y P2. Esta configuracin permite direccionar hasta 64kbytes de memoria externa. Las seales de control de lectura y escritura son las mismas que en las dos configuraciones anteriores. RD1:0 = 11 (16 lneas de bus de direcciones) Con esta configuracin se tienen slo 16 lneas de bus externo de direcciones, implementadas en los puertos P0 y P2. Esta es la nica configuracin que mantiene la compatibilidad con la familia MCS-51 y para ello dispone de tres seales de control de acceso a la memoria externa (como en la familia MCS-51): [ /PSEN: seal de control de lectura en la memoria externa para las regiones FC:, FD:, FE: y FF:. [ /RD: seal de control de lectura en la memoria externa para las regiones 00:, 01:, 02: y 03:. [ /WR: seal de control de escritura en la memoria externa para las regiones 00:, 01:, 02: y 03:.
Tabla 3.9 Seleccin de seales de control para los posibles valores de RD1, RD0
RD1 RD0 P1.7/CEX/A17 P3.7/RD/A16 00 01 10 11 A17 P1.7/CEX4 P1.7/CEX4 P1.7/CEX4 A16 A16 P3.7 /RD
Direcciones asociadas a las seales de control PSEN RD WR Todas A16 Todas Todas A16 Todas Todas P3.7 Todas ] 80:0000H 7F:FFFFH 7F:FFFFH
3.5.1.3 Estados de espera en el acceso a la memoria externa Los estados de espera permiten alargar los ciclos de acceso a la memoria externa. Esto es necesario cuando la memoria externa a la que accede el microcontrolador no es suficientemente rpida. Cada estado de espera alarga la duracin del ciclo 2 perodos de reloj y es posible incluir hasta un mximo de 3 estados de espera. Se puede especificar la insercin de estados de espera de forma independiente en la regin 01:, lo cual permite ubicar una memoria lenta en esa regin manteniendo, sin embargo, un acceso rpido en el resto de regiones. Existen 4 bits para especificar los estados de espera: los bits WSA0 y WSA1 (bits 5 y 6 de la localizacin UCONFIG0), que permiten definir estados de espera para todas las regiones excepto la 01:, y los bits WSB0 y WSB1 (bits 1 y 2 de la localizacin UCONFIG1), que permiten definir estados
61
de espera en la regin 01:. En la tabla 3.10 se muestran los estados de espera que se introducen en funcin de los valores que adquieren los bits antes indicados.
Tabla 3.10 Configuracin de los estados de espera
01:
Estados de espera 3 2 1 0 3 2 1 0
Por otra parte poniendo a cero el bit /XALE (bit 4 de la localizacin UCONFIG0) se alarga el tiempo durante el cual la seal ALE est activa. 3.5.1.4 Configuracin del cdigo de operacin Con respecto a los modos de asignacin de cdigos de operacin a las instrucciones, el usuario puede seleccionar dos posibles modos: el modo binario que genera un cdigo de operacin compatible con los microcontroladores de la familia MCS-51, y el modo fuente, que es especfico de la familia MCS251. Cuando se configura el microcontrolador se debe elegir necesariamente uno de los dos modos. Se debe elegir aquel modo que permita obtener el cdigo ms eficiente. En principio los microcontroladores de la familia MCS-251 tienen dos tipos de instrucciones: [ [ Instrucciones originales de la familia MCS-51. Instrucciones exclusivas de la familia MCS-251.
En general, las instrucciones originales de la familia MCS-51 generan un cdigo ms eficiente en modo binario; en cambio las instrucciones exclusivas de la familia MCS-251 generan un cdigo ms eficiente en modo fuente. A modo de ejemplo se presenta en la tabla 3.11 varias instrucciones (de la familia MCS-51 y MCS251) con sus correspondientes cdigos de operacin obtenidos en los dos modos.
Tabla 3.11 Ejemplos de cdigos de operacin en modo binario y modo fuente
Cdigo de operacin Modo binario Modo fuente 14H 14H 9CH A5 9CH A5 9CH 9CH
62
3.5.1.5 Reubicacin de memoria de programa en la regin 00: Para las versiones del microcontrolador 8XC251Sx con 16kbytes de memoria interna, el usuario tiene la posibilidad de reubicar 8kbytes en la regin 00:, lo cual permite un acceso ms rpido a tablas de constantes almacenadas en esta memoria usando direccionamiento directo. Para poder realizar esta reubicacin ser necesario poner a cero el bit /EMAP (bit 0 de la localizacin UCONFIG1). Con este bit a cero, los 8kbytes de memoria de programa interna que van de la direccin FF:2000H a la direccin FF:3FFFH quedan reubicados en las direcciones 00:E000H-00:FFFFH (figura 3.20).
Regin FF:
FF:FFFFH EMAP = 0 FF:4000H FF:3FFFH 8 Kbytes FF:2000H FF:1FFFH 8 Kbytes FF:0000H 00:E000H
Regin 00:
00:FFFFH 8 Kbytes
00:DFFFH
3.5.1.6 Bytes cargados en la pila por una interrupcin En cuanto a los bytes que se cargan en la pila por una interrupcin, el usuario puede elegir entre dos opciones: una de ellas permite cargar en la pila los dos primeros bytes del contador de programa (PC); la otra opcin carga los tres bytes del contador de programa y el registro de estado PSW1. El bit INTR (bit 4 de la localizacin UCONFIG1) configura una de las dos opciones. Si se pone este bit a cero se almacenan en la pila slo dos bytes del contador de programa. Si se pone a 1 se almacena todo el contador de programa ms el registro de estado.
63
64
xito el programa que soluciona una aplicacin. Entre estas tcnicas se encuentran las siguientes: operaciones aritmticas con ms de un byte, operaciones aritmticas con signo, tratamiento de tablas, conversin de datos en diferentes formatos (hexadecimal-BCD, hexadecimal-siete segmentos, BCDhexadecimal, etc.), realizacin de rutinas de interrupcin, etc. La exposicin de estas tcnicas de programacin, junto con los ejemplos y ejercicios propuestos, son el tema central del siguiente captulo. Por tanto, este captulo, junto con el siguiente, constituye el ncleo fundamental que todo programador que desee trabajar con las familias de microcontroladores MCS-51 y MCS-251 debe considerar y conocer.
Descripcin Direccin directa de 8 bits. Posiciones de memoria interna o rea de SFR. Direccin 16 bits de memoria empleada en direccionamientos directos. Direccin de 11 bits. Constante de 8 bits. Constante de 16 bits. Registro de tipo byte, R0 a R7. Direccionamiento indirecto a travs de R0 R1. Se accede a las posiciones (00HFFH) de la memoria interna. Bit de la memoria RAM interna o de un registro del rea de SFR accesible bit a bit. Direccin de salto. Puede ser un salto incondicional, condicional o de llamada a subrutina.
A lo largo de este captulo se emplear una notacin especfica que es til para realizar la descripcin del direccionamiento y de las instrucciones de las familias de microcontroladores. La tabla 4.1 muestra la notacin utilizada para la familia MCS-51 mientras que la tabla 4.2 muestra la notacin empleada para la familia MCS-251. Esta notacin tambin es vlida para la familia MCS-251. No obstante, como en la MCS-251 se
65
pueden emplear operandos del tipo byte Word y double word, la notacin para esta familia aumenta en cantidad, lo que se muestra en las tablas 4.2 y 4.3. En estas tablas se indica si la notacin es propia de las instrucciones de la familia MCS-51, de las nuevas instrucciones que incorpora la familia MCS-251 o de ambas.
Tabla 4.2 Notacin especfica utilizada en las instrucciones de la familia MCS-251
Descripcin
Registro tipo byte de R0 a R15. Registro fuente. Registro destino. Registro de tipo Word WR0, WR2, ., WR30. Registro destino. Registro fuente. Direccin de memoria (00:0000H-00:FFFFH) direccionada indirectamente por un registro de tipo Word (WR0-WR30) mas un valor de desplazamiento de 16 bits. Registro de tipo DR (Double Word) DR0, DR4, , DR28 DR56, DR60. DRk, Registro de destino. DRkd Registro fuente. DRks Direccin de memoria (00:0000H-00:FFFFH) direccionada indirectamente por un @DRk+dis24 registro de doble palabra (DR0, DR4, , DR56, DR60) ms un valor de desplazamiento de 24 bits. Dato inmediato Descripcin #0dato16 Constante de 32 bits que se direcciona de forma inmediata en una instruccin. Los #1dato16 16 bits de mayor peso del dato deben ser 0 (#0dato16) 1 (#1dato16). #short Constante igual a 1, 2 4, direccionada de forma inmediata en una instruccin. Direcciones Descripcin rel Direccin relativa de 8 bits expresada en complemento a 2. addr11 Direccin de 11 bits. addr16 Direccin de 16 bits. addr24 Direccin de 24 bits. Permite acceder a cualquier direccin de los 16Mbyte del espacio de memoria de la familia MCS-251.
4.2.1 Direccionamiento inmediato En el direccionamiento inmediato el operando de la instruccin es una constante que est definida dentro de la propia instruccin. Este tipo de direccionamiento es comn para las familias MCS-51 y MCS-251. Para la familia MCS-51 el tamao de la constante est limitado a 8 bits (1 byte), mientras que para la familia MCS-251 la constante puede ser de 8 bits (byte), 16 bits (Word) o 32 bits (Double word). En la familia MCS-51, por ejemplo, la instruccin MOV A, #09H pone el dato 09H mediante direccionamiento inmediato en el acumulador. Esta instruccin est formada por un cdigo mquina de 2 bytes: 74H y 09H. El byte 09H es el operando mientras que el byte 74H es el cdigo de operacin de la instruccin. El dato 09H est dentro de la propia instruccin; por tanto, es un
66
operando que la CPU coloca de forma directa en el acumulador, sin necesidad de obtenerlo de la memoria o de algn registro del microcontrolador. Este tipo de instruccin se usa de manera frecuente a lo largo de los programas y, especialmente, en la inicializacin de stos, puesto que se hace preciso asignar valores iniciales a las variables definidas por el programador. El direccionamiento inmediato tambin se emplea en aquellas instrucciones que operan nicamente con algn registro determinado del rea SFR, como puede ser el acumulador o el registro DPTR. Un ejemplo de ello es la instruccin INC A que incrementa en una unidad el acumulador. El cdigo mquina de esta instruccin est formado solamente por el byte 04H; luego en este mismo byte de cdigo est contenida la direccin del acumulador dentro del rea SFR como operando. Para la familia MCS-251 las constantes de 32 bits (Dword) deben tener todos los 16 bits de mayor peso a cero (indicado como #0dato16), o bien, todos a uno (indicado como #1dato16). Las instrucciones de incremento o decremento de esta familia, adems, incorporan un dato inmediato, que especifica el valor del tamao del incremento o decremento. Este valor puede ser 1, 2 4. Como ejemplo, las siguientes instrucciones de la familia MCS-51 utilizan el direccionamiento inmediato: INC A MOV A, #255; MOV A, #0FFH MOV A, #11111111b MOV DPTR, #1969H
1
;Incrementa el contenido del acumulador ;Coloca el nmero 255 en el acumulador ;Coloca 0FFH en el acumulador ;Coloca 0FFH (en binario) en el acumulador ;Coloca 1969H en el DPTR
Anlogamente, para la familia MCS-251 las siguientes instrucciones utilizan direccionamiento inmediato: INC WR0,#02H MOV DR4,#FFFF2350H 4.2.2 Direccionamiento directo En el direccionamiento directo la ubicacin del operando se especifica de forma directa mediante una direccin de ocho bits. Para la familia MCS-51, con este direccionamiento, es posible leer y escribir sobre cualquier direccin especificada, que puede corresponder con un byte de la memoria RAM interna (00H-7FH) o con un registro del rea SFR. Ejemplo: ADD A, 3BH ; Suma el contenido del acumulador (A) con el contenido de la posicin de ; memoria 3BH. El resultado se deja en el acumulador (A): ; A (A) + (3BH) ; Transfiere el contenido del puerto P0 (posicin 80H en el rea de SFR) al ; acumulador: A (80H) ;Incrementa el registro WR0 en dos unidades ;Carga el dato FFFF2350H en el registro DR4
MOV A, 80H
H indica que el nmero es hexadecimal y b que es uno binario. Cuando no lleva indicativo es un nmero decimal.
67
Para la familia MCS-251, el direccionamiento directo puede utilizar direcciones de 8 bits o de 16 bits. Con las direcciones de 8 bits se puede acceder a la memoria RAM interna (00H-7FH), para leer o escribir un byte o un Word, y tambin se puede acceder al rea de registros de funcin especfica SFR (S:080H-S:1FFH), para leer o escribir un byte nicamente. Con las direcciones de 16 bits se pueden realizar accesos de tipo byte o Word en memoria (00:0000H-00:FFFFH). Ejemplo: MOV R7,S:090H MOV R0,1200H ; Carga en el registro R7 el contenido del puerto P2 (direccin S:090H ; del rea SFR): R7 (S:090H) ; Transfiere el contenido de la direccin de memoria 1200H en el 2 ; registro R0: R0 (1200H)
4.2.3 Direccionamiento por registro En el direccionamiento por registro el dato que maneja la instruccin est incluido en uno de los registros del microcontrolador. En el direccionamiento por registro de la familia MCS-51 se utilizan los registros de propsito general, R0-R7, para almacenar el operando de la instruccin. A cada uno de estos registros se puede acceder mediante su nombre (direccionamiento por registro), o mediante su direccin (direccionamiento directo). Cuando una instruccin incluye un registro por su nombre, ste se codifica dentro de la propia instruccin mediante 3 bits, lo que permite compactar el cdigo generado por la instruccin. Por el contrario, cuando se accede al registro mediante su direccin, la instruccin debe contener la direccin del registro, por lo que el tamao de la instruccin se incrementa en 1 byte, que corresponde con la direccin dada para el registro. En consecuencia, es conveniente, en la medida de lo posible, utilizar los registros por su nombre, debido a que se obtiene as un cdigo ms compacto y eficiente. En el siguiente ejemplo las instrucciones de la familia MCS-51 transfieren el contenido del acumulador al registro R0, y luego el contenido del registro R7 al acumulador. Mediante los bits RS0 y RS1 del registro PSW se selecciona, de forma previa, el banco 2 de registros, por lo que los registros empleados, R0 y R7, se corresponden con las posiciones 10H y 17H de la memoria interna, respectivamente. Ejemplo: MOV PSW,#10H MOV R0, A ADD A, R7 ; Se selecciona el banco 2 de registros ; Transfiere el contenido del acumulador (A) al registro R0 ; R0 (A) ; Suma el contenido del registro R7 con el acumulador. ; A (A) + (R7)
Cuando un registro o una direccin se encuentra entre parntesis se refiere al contenido. (A) es el contenido del acumulador. (3B) es el contenido de la posicin de memoria 3BH. Las operaciones que se deben realizar se muestran a la derecha de la flecha (), y a la izquierda se indica sobre qu elemento se deja el resultado.
68
En cuanto a los registros del rea de registros de funcin especfica (SFR), existen algunas instrucciones que son propias de registros especficos, como es el caso del acumulador. Se puede acceder al acumulador de forma directa o mediante su direccin en el SFR (posicin E0H), de manera que las siguientes instrucciones son equivalentes: MOV A, #10H MOV 0E0H, #10H ; Almacena la constante 10H en el acumulador ; Almacena la constante 10H en la posicin E0H del SFR
La primera instruccin tiene un cdigo mquina de 2 bytes, 74H y 10H, mientras que la segunda tiene un cdigo mquina de 3 bytes, 75H, E0H y 10H. En la primera instruccin la direccin del acumulador est incluida en el cdigo de operacin, mientras que en la segunda instruccin para acceder al acumulador se debe especificar su direccin, incrementando, por tanto, en un byte el tamao de sta. Debe resaltarse que la familia de microcontroladores MCS-51 optimiza el tiempo de ejecucin y el tamao de cdigo de las instrucciones que utilizan de forma inmediata el acumulador A, el registro B y los registros del banco de registros seleccionado. En las instrucciones de la familia MCS-251 que soportan direccionamiento por registro, el operando puede estar ubicado en un registro tipo byte (del R0 al R15), en un registro tipo Word (WR0, WR2,, WR30), o en un registro tipo Dword (DR0, DR4, , DR28, DR56, DR60). Ejemplo: MOV R4, R8 MOV WR4,WR6 ; Transfiere el contenido del registro R8 al registro R4 ; R4 R8 ; Transfiere el contenido del registro WR6 al registro WR4 ; WR4 WR6
4.2.4 Direccionamiento indirecto En el direccionamiento indirecto la direccin del operando viene especificada por el contenido de un registro del microcontrolador. La familia MCS-51 utiliza el direccionamiento indirecto mediante los registros R0, R1, SP (puntero de la pila o Stack Pointer) y DPTR (puntero externo de datos o Data Pointer de 16 bits). De esta manera, se puede acceder tanto a la memoria interna como a la memoria externa de datos del microcontrolador. Debe notarse que como identificador de este tipo de direccionamiento se emplea el smbolo @, que debe ir delante del registro. A la memoria interna de datos (00H-FFH), se accede nicamente con los registros R0 y R1, aunque tambin se puede acceder mediante el puntero de la pila SP o Stack Pointer. Para acceder a la memoria externa de datos se pueden emplear los registros DPTR, R0 y R1. Los microcontroladores de la familia MCS-251 soportan el mismo modo de direccionamiento indirecto que el que se ha descrito para la familia MCS-51, pero, adems, tambin pueden emplear registros de tipo Word y Dword. Mediante los registros del tipo Word (@WRj, j=0, 2, 4, , 30) se puede acceder a las direcciones de memoria comprendidas en el margen (00:0000H-00:FFFFH). Mediante los registros del tipo Dword (@DRk, k = 0, 4, 8, , 28, 56 y 60) se puede acceder a los 16Mbytes del espacio de memoria; para ello se debe cargar previamente en los 24 bits de menor peso del registro la direccin a la que se desea acceder, teniendo a cero los 8 bits de mayor peso.
69
Ejemplo: MOV R0, #30H ADD A, @R0 ; Suma el contenido del acumulador (A) con el contenido de la posicin ; de memoria apuntada por el registro R0. Si (R0)=30H, la operacin es: ; A (A) + 30H MOV R1, #30H ; Pone 70H en la posicin de memoria interna 30H MOV @R1, #70H ; (30H) #70H MOV DPTR, #1000H ; Transfiere el contenido de la posicin de memoria apuntada por DPTR MOVX A, @DPTR ; al acumulador (A). Con MOVX se accede a la memoria externa de ; datos, activando un ciclo de lectura de dato en la memoria externa: ; A (1000H) MOV WR0, #2000H ;Carga en el registro R15 el contenido de la posicin de memoria ADD R15, @WR0 ; apuntada por el registro WR0. Si (WR0)=2000H, la operacin es: ; R15 (2000H) MOV DR4, #15000H ;Almacena el valor A0H en la posicin de memoria MOV R4,#00H ; FF:5000H #A0H MOV @DR4, #A0H
4.2.5 Direccionamiento por desplazamiento o indexado En el direccionamiento por desplazamiento o indexado el operando se obtiene mediante una direccin, cuyo valor es el resultado de la suma de una direccin base con un valor relativo de desplazamiento respecto de esta direccin base. El direccionamiento indexado est especialmente concebido para facilitar la lectura y el movimiento de tablas de datos en un programa. Para la familia MCS-51, en este direccionamiento se utilizan los registros DPTR y PC (contador de programa) como punteros que apuntan a la direccin inicial o base de la tabla de datos a tratar. La posicin concreta del dato dentro de la tabla, se obtiene mediante la suma del contenido del acumulador con la direccin base de la tabla; de esta forma el acumulador contiene la posicin relativa del dato dentro de la tabla. Se debe destacar que las nicas instrucciones que tienen este tipo de direccionamiento son la instruccin MOVC y la instruccin JMP, por lo que su uso est limitado a la lectura de tablas fijas en la memoria de cdigo de programas (MOVC) y a realizar saltos indexados de ejecucin del programa. Como ejemplo se plantea la lectura de una tabla de datos situada en la posicin 1000H de la memoria de programas, que se utiliza para realizar la conversin de datos expresados en formato BCD al formato siete segmentos, necesario para la posterior visualizacin en un dgito de siete segmentos. Ejemplo: MOV DPTR, #1000H MOV A, #05H MOVC A, @A+DPTR
; Pone en el DPTR la direccin de la tabla ; Pone en A el dato numrico 5, para realizar ; la conversin a siete segmentos
En este ejemplo el registro DPTR toma el valor 1000H y el acumulador el valor 05H, luego la instruccin MOVC realiza una lectura de un byte en la posicin 1005H de la memoria de programas, que resulta de sumar el DPTR con el acumulador (1000H + 05H). La tabla existente en la memoria de programas tiene la siguiente forma:
70
Direccin 1001H 1000H 1002H 1003H 1004H 1005H 1006H 1007H 1008H 1009H
Memoria C0H F9H A4H B0H 99H 92H 82H F8H 80H 90H A=0 A=1 A=2 A=3 A=4 A=5 A=6 A=7 A=8 A=9
En la familia MCS-251 se utiliza este tipo de direccionamiento para realizar transferencias de datos entre el rea de registros y la memoria. El desplazamiento puede ser un valor de 16 bits que, sumado al contenido de un registro tipo Word (@WRj+dis16), dar como resultado la direccin de memoria a que se debe acceder. De esta forma se puede acceder a los primeros 64kbytes del espacio de memoria. El valor del desplazamiento puede ser positivo o negativo y se representa en complemento a 2 (-32768 < dis16 < 32767). Si el resultado de la suma excede los 16 bits slo se toman los 16 primeros para determinar la direccin de acceso. El desplazamiento puede ser tambin un valor de 24 bits (@DRk+dis24); en este caso el registro base debe ser un registro Dword (DR0, DR4, DR8, , DR28, DR56 o DR60). Con este tipo de desplazamiento es posible acceder de forma indirecta a los 16Mbytes del espacio de memoria de la MCS-251. Ejemplo: MOV WR0, #3000H ADD R4, @WR0+0030H MOV DR8, #02000H MOV R0, @DR8+0080H ; Carga en el registro R4 el contenido de la posicin de memoria ; apuntada por el registro WR0+30H. Si (WR0)=3000H, la ; operacin es: R4 (3030H) ; Almacena en el registro R0 el contenido de la posicin de ; memoria apuntada por el registro DR8+80H. Si (DR8)=2000H, ; la operacin es: R0 (2080H)
A modo de resumen, en las tablas 4.3 y 4.4 se presentan las distintas posibilidades de direccionamiento inmediato, directo, por registro, indirecto e indexado de las familias MCS-51 y MCS-251 respectivamente.
4.2.6 Direccionamiento de bit Este tipo de direccionamiento se caracteriza por permitir direccionar bits individualmente. El direccionamiento de bit tan slo se puede emplear en algunos registros del rea SFR o en las posiciones de la memoria RAM interna a que puede accederse bit a bit. La tabla 4.5 muestra, para las familias MCS-51 y MCS-251, las posiciones de la RAM interna y del rea del SFR a las que puede accederse de esta manera.
4 Programacin de las familias MCS-51 y MCS-251 Tabla 4.3 Direccionamiento por registro, inmediato, directo e indirecto para la MCS-51
71
Notacin
Comentarios
Indirecto
00H - 1FH R0-R7 (Banco seleccionado con PSW). El operando est en la #dato=#00-#FFH instruccin 00H - 7FH dir8=00H-7FH RAM interna. SFRs dir8=80H-FFH o nombre de un registro Direcciones del rea SFR. del SFR. 00H - FFH @R0, @R1 RAM interna o memoria de datos externa (MOVX). 0000H - FFFFH @DPTR, @A+DPTR Acceso a la memoria externa de datos (MOVX). 0000H - FFFFH @A+DPTR, @A+PC Acceso a la memoria de programa (MOVC).
Tabla 4.4 Direccionamiento por registro, inmediato, directo, indirecto y por desplazamiento para la MCS-251
Modo de direccionamiento
Registro
Notacin
Comentarios
R0-R7, WR0-WR6, DR0 y DR6 estn ubicados en el banco de registros seleccionado por RS0 y RS1. Se utiliza slo en instrucciones de incremento y decremento.
#dato8=#00H-#FFH #dato16=#0000H#FFFFH Directo 00:0000H-00:007FH dir8=00:0000HRAM interna 00:007FH direcciones de 8 bits SFRs dir8=S:080H-S:1FFH Direcciones del rea SFRs. o el nombre del registro Directo direcciones 00:0000H-00:FFFFH dir16=00:0000Hde 16 bits 00:FFFFH Indirecto direcciones 00:0000H-00:FFFFH @WR0-@WR30 de 16 bits Indirecto direcciones 00:0000H@DR0-@DR30, Los 8 bits de mayor peso del registro de 24 bits FF:FFFFH @DR56, @DR60 DRk deben ser 00H. El desplazamiento se expresa en Desplazamiento con 00:0000H-00:FFFFH @WRj+dis16 = complemento a 2. @WR0+0H hasta direcciones de 16 @WR30+FFFFH bits El desplazamiento se expresa en @DRk+dis24 = Desplazamiento con 00:0000Hcomplemento a 2. Los 8 bits de mayor @DR0+0H hasta direcciones de 24 FF:FFFFH peso del registro DRk debe ser 00H. @DR56+FFFFH, bits @DR56+(0H-FFFFH), @DR60+(0H-FFFFH) (1) Estos registros estn implementados en el espacio de memoria
Localizaciones de bit SFR Registros SFR cuya direccin acaba con 0 8: 80H, 88H, 90H, 98H, ,F8H. Todos los registros SFR definidos.
Tal y como se observa en esta tabla, el rango de bits que se puede direccionar a nivel de bit en la familia MCS-251 es mucho mayor que en la familia MCS-51. Para la familia MCS-51 existen dos maneras de direccionar los bits de la memoria RAM interna: i) Especificando la direccin donde est ubicado el bit junto con la posicin del bit dentro del byte que lo soporta. ii) Especificando la direccin propia del bit perteneciente al rango 00H-7FH. La figura 4.1 muestra de forma grfica estas dos posibles formas. Por ejemplo, el bit nmero 3 de la posicin de memoria 21H se puede referir como 21H.3, o bien como 0BH.
2FH 7
2FH
21H 7 20H 7
6 6
5 5
4 4
3 3
2 2
1 1
0 0
21H 20H
0FH 0EH D0H 0CH 0BH 0AH 09H 08H 07H 06H 05H 04H 03H 02H 01H 00H
La familia MCS-51 dispone tambin de dos formas de direccionar, a nivel de bit, los bits del rea SFR: i) Especificando la direccin o nombre del registro donde est ubicado el bit junto con la posicin del bit dentro del byte que lo soporta. ii) Especificando la direccin propia del bit perteneciente al rango 80H-FFH. Por ejemplo, la direccin del bit 3 del acumulador se puede escribir como ACC.3, E0H.3 o E3H. En la familia MCS-251, la direccin de un bit se indica mediante la direccin donde est ubicado el bit y la posicin que ocupa dentro del byte que lo contiene. Para el caso de bits ubicados en el rea SFR, en lugar de la direccin se puede indicar, si se desea, el nombre del registro.
73
Area SFR
F8H F0H E8H E0H D8H D0H C8H C0H B8H B0H A8H A0H 98H 90H 88H 80H B ACC PSW T2CON IP P3 IE P2 SCON P1 TCON P0 FFH B F7H EFH ACC E7H DFH PSW D7H T2CON CFH C7H IP BFH P3 B7H IE AFH P2 A7H SCON 9FH P1 97H TCON 8FH P0 87H FEH F6H EEH E6H DEH D6H CEH C6H BEH B6H AEH A6H 9EH 96H 8EH 86H
Area SFR
FDH F5H EDH E5H DDH D5H CDH C5H BDH B5H ADH A5H 9DH 95H 8DH 85H FCH F4H ECH E4H DCH D4H CCH C4H BCH B4H ACH A4H 9CH 94H 8CH 84H FBH F3H EBH E3H DBH D3H CBH C3H BBH B3H ABH A3H 9BH 93H 8BH 83H FAH F2H EAH E2H DAH D2H CAH C2H BAH B2H AAH A2H 9AH 92H 8AH 82H F9H F1H E9H E1H D9H D1H C9H C1H B9H B1H A9H A1H 99H 91H 89H 81H F8H F0H E8H E0H D8H D0H C8H C0H B8H B0H A8H A0H 98H 90H 88H 80H
4.2.7 Direccionamiento relativo El direccionamiento relativo est vinculado a las instrucciones de salto. En este tipo de direccionamiento la instruccin incluye un valor que indica la magnitud del salto a realizar. El valor es de 8 bits y est expresado en complemento a 2, de forma que la magnitud del salto es de -128 posiciones de memoria hacia atrs o de 127 posiciones de memoria hacia delante, empezando a contar a partir de la direccin donde est ubicado el primer byte de la siguiente instruccin. Ejemplo: SJMP rel JC rel ;Realiza un salto incondicional cuya magnitud se indica con el valor de 8 bits rel ;Realiza un salto condicional donde la condicin de salto es CY=1
74
negacin, con datos de 8 bits. Tambin se pueden ejecutar instrucciones de intercambio de bytes, de salto, etc. Esta familia, adems, est concebida para poder operar a nivel de bit, por lo que puede realizar operaciones lgicas y de movimiento con bits. El conjunto de instrucciones de la familia de microcontroladores MCS-251 incorpora nuevas instrucciones que aprovechan las ventajas de la arquitectura de este microcontrolador manteniendo la compatibilidad con el conjunto de instrucciones de la familia MCS-51. Muchas de las nuevas instrucciones pueden operar con datos de 8 bits, 16 bits o 32 bits. Esta capacidad incrementa la eficiencia y facilidad de programacin de los microcontroladores de la familia MCS-251 en un lenguaje de alto nivel como el C. El conjunto de instrucciones que ejecutan las familias de microcontroladores MCS-51 y MCS-251 se dividen en tres grupos: instrucciones que operan con datos de 8 bits y con datos de 16 y 32 bits (slo para la familia MCS-251), instrucciones que operan con bits e instrucciones de control que permiten realizar saltos en la ejecucin del programa. Para poder comprender de forma correcta tanto el conjunto de instrucciones como los ejemplos empleados a lo largo de este captulo, es preciso explicar previamente el formato de las instrucciones, algunas directivas comunes del programa ensamblador y la definicin y uso de etiquetas dentro de un programa.
4.3.1 Formato de una instruccin En lenguaje ensamblador una instruccin puede esta formada por cuatro partes diferentes: una etiqueta, un mnemnico o palabra clave que identifica el tipo de instruccin, un operando fuente, y un operando destino. En las instrucciones las etiquetas son opcionales y son definidas por el programador. Las etiquetas se utilizan para distinguir una instruccin dentro del programa realizado, y para que la instruccin a la que se adjunta una etiqueta se pueda referenciar en cualquier instruccin de salto del programa. Para ello, cuando el programa ensamblador detecta una etiqueta le asigna, de manera automtica, la direccin de la instruccin a la que hace referencia. De esta forma, cualquier instruccin que contenga una direccin de salto puede emplear cualquier etiqueta definida dentro del programa. A modo de ejemplo se proponen las siguientes instrucciones: Etiqueta Retardo: Suma: Mnemnico MOV ADD MOV INC DJNZ SJMP PUSH 1er Operando R0 A 20H A R2 Salir A , Bucle , , , , 2 Operando #70H 70H @R0
75
Por ejemplo, en el caso de una etiqueta, la instruccin DJNZ R2, Bucle decrementa en una unidad el registro R2 y, si R2 es distinto de cero, realiza un salto a la direccin donde se halla la etiqueta Bucle; es decir, si se cumple la condicin R2 [ 0, se coloca la direccin asignada a Bucle en el contador de programa PC, de forma que la CPU pasa a ejecutar el programa por la direccin que representa la etiqueta. Las etiquetas tambin se emplean para referenciar el inicio de una subrutina. Las etiquetas pueden definirse tan slo una vez dentro de un mismo programa, sin embargo, pueden usarse tantas veces como sea necesario cuando se referencian por otra instruccin. El programador tiene libertad de emplear cualquier conjunto de caracteres para definir una etiqueta, salvo las limitaciones propias del programa ensamblador, por lo que se debe evitar la duplicacin de etiquetas con el mismo nombre dentro de un mismo programa. Las etiquetas se deben colocar en el extremo izquierdo de cada lnea de programa, y se debe guardar al menos un espacio entre la etiqueta y el resto de la instruccin. La etiqueta debe terminarse con dos puntos o sin ninguna puntuacin, dependiendo del programa ensamblador que se utilice. En este libro se emplean dos puntos al final de cada etiqueta a lo largo de toda la obra. El mnemnico de una instruccin es una palabra abreviada que indica la funcin que realiza la instruccin, como MOV, ADD, INC, JMP, etc. La familia MCS-51 dispone de 111 instrucciones en total y la familia MCS-251 de 213 instrucciones. Los operandos pueden ser registros, constantes o posiciones de memoria accedidas mediante los distintos tipos de direccionamientos que soporta el microcontrolador. Un operando tambin puede ser una direccin de salto en el caso de instrucciones de salto condicional o incondicional. En el caso de que una instruccin contenga dos operandos, se introduce una coma para hacer de separacin entre ambos. Las instrucciones operan de varias maneras diferentes sobre los operandos. Existen instrucciones con un nico operando donde ste constituye el origen y el destino de la operacin, como INC A, que primero lee el contenido del acumulador, lo incrementa en una unidad y deja el resultado en el mismo acumulador. Otras instrucciones operan con ambos operandos, dejando el resultado de la operacin en el primer operando: por ejemplo, la instruccin ADD A, #70H suma el contenido del acumulador con la constante 70H, dejando el resultado en el mismo acumulador. Por ltimo, si el programador quiere poner comentarios en una instruccin, basta con que aada un punto y coma al final de la instruccin, colocando el comentario a continuacin. Por ejemplo: MOV R0, A ; Salva el contenido del acumulador en R0
4.3.2 Directivas de ensamblador En la realizacin de un programa en lenguaje ensamblador, es habitual utilizar una serie de directivas que no generan cdigo mquina y que ayudan al programa ensamblador a dirigir y controlar el proceso de ensamblado. De todas las directivas existentes en lenguaje ensamblador se describirn slo las que se suelen emplear con mayor frecuencia. Las directivas principales son: ORG, EQU, DB y END.
76
La directiva ORG es una abreviacin de la palabra inglesa origin y permite especificar el valor de la direccin de memoria donde va a ser cargada la prxima instruccin o dato a ensamblar, o sea, inicializa el contador de programa con el valor que acompaa a la directiva. La sintaxis de esta directiva es la siguiente: ORG <direccin>
Esta directiva pone en el contador de programa, PC, la direccin indicada por <direccin>, de manera que la primera instruccin en ejecutarse es la primera que aparece tras esta directiva. La directiva ORG puede aparecer en cualquier parte del programa y el programador puede colocar tantas como crea conveniente. Esta directiva se puede utilizar para asignar una direccin concreta a una subrutina, para definir una posicin determinada de salto o para asignar una direccin a una tabla de datos. Ejemplo: ORG 0100H Inicio: MOV R0,#09H ADD A, R0 ;Determina la direccin 0100H ;Pone 09H en R0 ;Suma el acumulador con el valor 09H
A la etiqueta Inicio, al ir precedida de la directiva ORG, el ensamblador le asignar el valor de 0100H, de forma que las dos instrucciones del programa irn almacenadas en memoria a partir de la direccin 0100H. Si se desea asignar una direccin determinada a una subrutina basta con emplear la directiva ORG al inicio de la misma. Por ejemplo, si se desea que la subrutina de conversin de nmeros binarios a nmeros en formato ASCII comience en la direccin 2400H, se debe incluir la siguiente directiva: ORG 2400H Bin_ASCII: MOV A, R0 ........ RET
La directiva EQU se utiliza para asignar a un smbolo alfanumrico un valor numrico o un string (cadena de caracteres). Es importante resaltar que esta directiva no reserva espacio en memoria, por lo que los valores que se definan mediante EQU los mantiene el ensamblador y los emplea en el proceso de ensamblado. La sintaxis de la directiva EQU es la siguiente: <smbolo> Ejemplo: num rea reg EQU 20H EQU num*num EQU A ; Asigna el valor 20H al smbolo num ; rea de un cuadrado ; Asigna al smbolo reg el nombre de un registro EQU <expresin>
77
La directiva DB reserva espacios de memoria de 8 bits (1 byte) a partir de la ubicacin de dicha directiva. El espacio reservado se llena con el valor, la lista de datos o la expresin que acompaa a la directiva. Si el dato que acompaa a la directiva va entre comillas se interpreta como constantes alfanumricas (caracteres), y el espacio reservado se carga con el cdigo ASCII asociado a dichas constantes. Si el dato no va entrecomillado se interpreta como valor numrico. Los caracteres numricos deben ir acompaados por comas. La sintaxis de esta directiva es: DB [[<espacio de datos>]] <dato> [ [[<espacio reservado>]]<dato>] Ejemplo: DB Ensamblador ; Reserva e inicializa 11 bytes con los valores de cdigo ASCII ; correspondientes a los caracteres de la palabra ensamblador DB 1,2 ; Reserva 2 bytes. Al primer byte le asigna el nmero 1 y al segundo el 2 DB [10]1,[10]2 ; Reserva 20 bytes. Los 10 primeros se ponen a 1 y los 10 restantes a 2 La directiva END indica el final del programa, por tanto, siempre es la ltima sentencia de un programa. El ensamblador termina el proceso de ensamblado cuando se encuentra con esta directiva.
4.3.3 Los registros de estado PSW y PSW1 La funcin de los registros de estado en las familias de microcontroladores MCS-51 y MCS-251 es diversa: incorporan bits o flags (banderas) que proporcionan informacin acerca del resultado de las operaciones aritmticas y lgicas realizadas por el microcontrolador, incorporan los bits de seleccin del banco de registros e incorporan bits cuya funcin es definible por el usuario. Los microcontroladores de la familia MCS-51 disponen de un nico registro de estado: el Program Status Word (PWS), mientras que los microcontroladores de la familia MCS-251 disponen de este mismo registro ms otro registro de estado adicional: el PSW1. Los registros PSW y PSW1 contienen cuatro tipos diferentes de bits: - Los bits CY, AC, OV, N y Z, que son indicadores que se ponen a 1 lgico automticamente como respuesta al resultado de una operacin. - El bit P que indica la paridad del acumulador. - Los bits RS0 y RS1, cuyo estado determina la seleccin del banco de registros activo que ubica los registros R0-R7. - Los bits F0 y UD, que son bits de propsito general definibles por el usuario. En las tablas 4.6 y 4.7 estn representados el contenido de los bits de los registros de estado PSW y PSW1. Hay que indicar que cinco bits del registro PSW estn repetidos en el registro PSW1. En estos casos la funcin de estos bits es la misma. En la tabla 4.8 se muestran las instrucciones cuya ejecucin afecta al valor de los bits CY, AC, OV, N y Z.
Nmero Mnemnico Funcin de bit 7 CY o C Bit de acarreo. CY se pone a 1 lgico si en las instrucciones de suma o resta se produce acarreo en el bit sptimo. CY tambin est afectado por las instrucciones RRC, RLC, MUL, DA, JBC y CJNE. 6 AC Bit de acarreo auxiliar. AC se activa si en las instrucciones de suma o resta se produce acarreo en el bit tercero. 5 F0 Bit F0. Este bit es de propsito general y definible por el usuario. 4:3 RS1:0 Estos dos bits permiten seleccionar el banco de registros que soportan los registros R0-R7. RS1 RS0 Banco Direcciones 0 0 0 00H - 07H 0 1 1 08H - 0FH 1 0 2 10H - 17H 1 1 3 18H - 1FH 2 OV Bit de rebasamiento o overflow. Este bit se pone a 1 lgico cuando se produce un error de overflow en operaciones de suma o resta. OV tambin se pone a 1 cuando el resultado de una multiplicacin es mayor de un byte, o cuando se realiza una divisin por cero. 1 UD Bit UD. Este bit es de propsito general y definible por el usuario. 0 P Bit de paridad. Indica la paridad del acumulador. Se pone a 1 cuando el nmero de unos de A es impar, y a 0 cuando es par.
Tabla 4.7 Registro PSW1
Nmero Mnemnico Funcin de bit 7 CY o C Bit de acarreo. Su funcin es idntica a la del bit CY del PSW. 6 AC Bit de acarreo auxiliar. Funcin idntica a la del bit AC del PSW. 5 N Bit negativo. Este indicador se pone a 1 cuando el resultado de la ltima operacin aritmtica o lgica es negativo, o sea, cuando el bit de mayor peso del resultado est a 1. En caso contrario se pone a cero. 4:3 RS1:0 Tienen la misma funcin que en el registro PSW. 2 OV Bit de rebasamiento. Tiene la misma funcin que en el registro PSW. 1 Z Bit de cero. Se pone a 1 cuando el resultado de la ltima operacin aritmtica o lgica es cero. En caso contrario, el bit Z se pone a cero. 0 Bit reservado.
4 Programacin de las familias MCS-51 y MCS-251 Tabla 4.8 Activacin de los bits de los registros PSW y PSW1
79
Instruccin ADD, ADDC, SUB, SUBB, CMP INC, DEC MUL, DIV DA ANL, ORL, XRL, CLR A, CPL A, RL, RRL, SWAP RLC, RRC, SRL, SLL, SRA CJNE DJNE CY X 0 X X X
Bits afectados OV AC N X X X X X X X X X X X
Z X X X X X X X X
4.3.4 Instrucciones aritmticas Las instrucciones aritmticas de la familia MCS-51, se pueden diferenciar en tres tipos distintos: a) instrucciones de suma y resta, b) instrucciones de incremento y decremento, y c) instrucciones de multiplicacin y divisin. La familia MCS-251 tiene los mismo tipos de instrucciones aritmticas que la MCS-51, y un tipo ms: la instruccin de comparacin. La tabla 4.9 muestra el conjunto de instrucciones aritmticas que posee la familia MCS-51, donde se realiza una breve descripcin de cada instruccin, mientras que la tabla 4.10 muestra las instrucciones aritmticas para la MCS-251. Se debe tener en cuenta que todas las instrucciones de la MCS-51 tambin se pueden ejecutar en la familia MCS-251, puesto que es compatible, en modo binario, con la MCS-51.
Tabla 4.9 Instrucciones aritmticas comunes a las familias MCS-51 y MCS-251
Mnemnico
ADD
<dest>,<src>
A, Rn A, dir8 A, @Ri A, #dato A, Rn A, dir8 A, @Ri A, #dato A Rn dir8 @Ri DPTR AB AB A
Descripcin
A=A+ Rn A=A+ (dir8) A=A+ (@Ri ) A=A+ dato A=A ] Rn A=A ] (dir8) ] C A=A ] (@Ri ) ] C A=A ] dato ] C A=A ] 1 Rn=Rn ] 1 (dir8) = (dir8) ] 1 (@Ri ) = (@Ri ) ] 1 DPTR = DPTR +1 Multiplica A por B. Deja el byte alto del resultado en B y el byte bajo en A Divide A por B Deja el cociente en A y el resto en B Ajuste decimal del acumulador
ADDC SUBB
CMP
<dest>,<src> Rmd,Rms WRjd,WRjs DRkd,DRks Rm,#dato WRj,#dato16 DRk,#0dato16 Rm,dir8 WRj,dir8 Rm,dir16 WRj,dir16 Rm,@WRj Rm,@DRk Rmd,Rms WRjd,WRjs DRkd,DRks Rm,#dato WRj,#dato16 DRk,#0dato16 DRk,#1dato16 Rm,dir8 WRj,dir8 Rm,dir16 WRj,dir16 Rm,@WRj Rm,@DRk Rm,#short WRj,#short DRj,#short Rmd,Rms WRjd,WRjs Rmd,Rms WRjd,WRjs
Descripcin Rmd = Rmd Rms WRjd = WRjd WRjs DRkd = DRkd DRks Rm = Rm dato WRj = WRj dato16 DRk = DRk 0dato16 Rm = Rm (dir8) WRj = WRj (dir8, dir8+1) Rm = Rm (dir16) WRj = WRj (dir16,dir16+1) Rm = Rm (@WRj) Rm = Rm (@DRk) Rmd - Rms WRjd - WRjs DRkd - DRks Rm - #dato WRj - #dato16 DRk - #0dato16 DRk - #1dato16 Rm - (dir8) WRj - (dir8, dir8+1) Rm - (dir16) WRj - (dir16,dir16+1) Rm - (@WRj) Rm - (@DRk) Rn = Rn #short WRj = Wrj #short DRj = DRj #short Multiplica Rmd y Rms Multiplica WRjd y WRjs Divide Rmd por Rms Divide WRjd por WRjs
4.3.4.1 Instrucciones de suma y de resta En la familia MCS-51, para realizar la suma de dos bytes se pueden emplear dos instrucciones: ADD y ADDC. La ejecucin de estas instrucciones afecta a los bits de acarreo (CY), de acarreo auxiliar (AC) y de rebasamiento (OV), que son tiles para detectar determinadas situaciones. Las instrucciones de suma ponen a 1 lgico el bit CY cuando el resultado de la suma es mayor que FFH; en caso contrario permanece a 0. En cuanto al bit de acarreo auxiliar, AC, se pone a 1 si en la suma se produce un acarreo entre el nibble bajo y el nibble alto, es decir, si se produce acarreo entre el bit 3 y el bit 4.
81
El bit de rebasamiento, OV, es un indicador til cuando se realiza la suma de dos nmeros enteros con signo en formato de complemento a dos. En este caso, el bit OV se pone a 1 en los siguientes supuestos: a) Si la suma de dos nmeros positivos en complemento a dos genera un resultado negativo. En este caso, el resultado de la suma debe estar comprendido entre 80H y FFH, de forma que el bit de signo sea igual a 1. b) Si la suma de dos nmeros negativos en complemento a dos genera un resultado positivo. En este caso, el resultado de la suma debe estar comprendido entre 00H y 7FH, de forma que el bit de signo sea igual a 0. En ambos supuestos el resultado de la suma es errneo, de manera que el bit de OV se pone a 1 para que el programador pueda considerar este error. En el siguiente ejemplo se suman dos nmeros positivos y dos nmeros negativos, de manera que se cumplen los supuestos a) y b).
Bit de signo 59H + 3AH 93H 0 101 1001 0 011 1010 1 001 0011 - 59H -3AH 1 010 0111 (A7H en compl. a 2) 1 100 0110 (C6H en compl. a 2)
C 0
En este ejemplo se observa cmo en ambos casos el bit de signo del resultado no coincide con el bit de signo de los operandos, y el bit OV se pone a 1. Esta situacin se da cuando en la suma se produce un acarreo entre los bits 6 y 7 de los operandos, pero no se produce entre el bit 7 y el bit C. Lo mismo ocurre cuando el acarreo se da entre el bit 7 y el bit C, pero no entre el bit 6 y el bit 7. La instruccin ADDC es idntica a la instruccin ADD, salvo que, adems, suma el bit C al resultado. Con esta instruccin se pueden sumar nmeros enteros con un tamao mayor que 1 byte (precisin mltiple). Los ejemplos que utilizan esta instruccin se tratarn en el captulo siguiente. La resta de dos nmeros se realiza mediante la instruccin SUBB. Esta instruccin incluye el bit C en la resta. El bit de acarreo C se pone a 1 cuando se produce un desbordamiento, de manera que se puede emplear para realizar la resta con precisin mltiple. El bit de acarreo auxiliar, AC, se pone a 1 al producirse un acarreo entre el nibble bajo y el nibble alto (entre el bit 3 y el bit 4). El bit OV realiza la misma funcin que en las instrucciones de suma cuando se opera con nmeros en complemento a dos, de manera que se pone a 1 en los supuestos mencionados anteriormente. En la familia MCS-251 las instrucciones ADD y SUB permiten sumar y restar operandos de 8, 16 y 32 bits. El resultado de la suma se guarda en la ubicacin del operando destino. La instruccin ADDC es idntica a la instruccin ADD, salvo que, adems, suma el bit C al resultado. La instruccin SUBB resta los dos operandos que se especifican en la propia instruccin y, adems, resta el bit de acarreo C. La ejecucin de las instrucciones de suma y resta afecta, de la misma forma que la indicada para la familia MCS-51, a los bits del registro de estado CY, OV y AC; no obstante, tambin afecta a los bits Z y N del registro PSW1.
82
Ejemplo: ADD A,#3AH ; Suma del contenido del acumulador con el dato 34H
C 0
En esta suma el bit de cero Z se pone a cero, puesto que el resultado es distinto de cero, mientras que el bit de signo N se pone a uno, para indicar con ello que el bit de mayor peso del resultado es 1.
4.3.4.2 Instrucciones de multiplicacin y de divisin Las instrucciones de multiplicacin (MUL) y divisin (DIV) permiten multiplicar y dividir dos operandos sin signo. En la familia MCS-51 slo es posible multiplicar o dividir el contenido del registro A por el contenido del registro B. La instruccin MUL AB realiza la multiplicacin sin signo del contenido del acumulador con el contenido del registro B, depositando el byte alto del resultado en el registro B y el byte bajo en el acumulador. El bit de acarreo C se pone siempre a 0 y el bit OV se pone a 1 slo cuando el resultado es superior a FFH; se pone a 0 en caso contrario. La instruccin DIV AB realiza la divisin sin signo entre el acumulador y el registro B. Tras la ejecucin de la instruccin el acumulador contiene el cociente de la divisin y el registro B contiene el resto de la divisin. El bit de acarreo C se pone siempre a 0. El bit de rebasamiento se activa cuando se ha producido una divisin por cero. Tras una divisin por cero el valor del cociente y del resto de la divisin resulta indeterminado. Para la familia MCS-251 las instrucciones de multiplicacin y de divisin permiten multiplicar o dividir cualquier par de registros tipo byte o Word. En multiplicaciones de registros de 8 bits el resultado de 16 bits se guarda en el registro tipo Word que contiene al registro destino. Por ejemplo, el producto de la instruccin MUL R3,R8 se guardara en el registro Word que contiene al registro R3, o sea, se guardara en WR2. En el caso de productos entre datos de 16 bits el resultado de 32 bits se guardara en el registro Dword que contiene al registro Word destino. Por ejemplo, el producto de la instruccin MUL WR6,WR14 se guardara en el registro DR4 que contiene al registro WR6. En divisiones de datos de 8 bits el resultado se guarda en el registro Word que contiene al registro destino. El cociente se guarda en el byte bajo mientras que el resto se guarda en el byte alto. Por ejemplo, el resultado de la instruccin DIV R5,R0 se guardara en el registro WR4. Concretamente en R4 se guardara el resto y en R5 el cociente. En divisiones de 16 bits el resultado se guarda en el registro Dword que contiene al registro Word destino. Por ejemplo, el resultado de la instruccin DIV WR8,WR16 se guardara en el registro DR8 (en la parte alta el resto y en la parte baja el cociente).
83
4.3.4.3 Instrucciones de incremento y decremento En la familia MCS-51 las instrucciones de incremento y de decremento son INC y DEC, respectivamente. Estas instrucciones tienen como funcin incrementar o decrementar en una unidad el operando indicado en la instruccin. Es importante observar cmo el registro DPTR se puede incrementar directamente mediante la instruccin INC, mientras que no se puede decrementar de la misma manera, puesto que la instruccin DEC no opera con este registro. La instruccin INC DPTR es de gran utilidad para la lectura de tablas en memoria externa. Las instrucciones de incremento y de decremento de la familia MCS-251 permiten, adems, incrementar o decrementar el contenido de registros tipo byte, Word o Dword en 1, 2 o 4 unidades. 4.3.4.4 Instruccin de comparacin La instruccin de comparacin CMP es exclusiva de la familia MCS-251 y calcula la diferencia entre dos operandos. El resultado generado por esta diferencia no se almacena pero s que se activan los flags CY, OV, AC, N y Z en los registros PSW y PSW1. La utilidad de la instruccin CMP est relaciona con las instrucciones de salto condicional.
4.3.4.5 Instruccin de ajuste decimal La instruccin de ajuste decimal, DA A, es til cuando se realizan sumas de nmeros en formato BCD con el registro acumulador como destino. En el formato BCD cada nibble de un byte representa un nmero decimal en base 10, por lo que su valor est comprendido entre 0 y 9. Cuando se desean sumar dos nmeros en formato BCD mediante las instrucciones ADD y ADDC, la suma que realizan es binaria, de manera que el resultado de sta puede no estar en formato BCD. Por tanto, en el caso de sumar nmeros en formato BCD, se debe emplear la instruccin DA A, que convierte el resultado de la suma al formato BCD. Por ejemplo, si se suman los nmeros BCD 19H y 22H mediante la instruccin ADD, el resultado es 3BH, mientras que el resultado esperado en BCD es 41H. La instruccin DA A realiza las siguientes operaciones: - Si los 4 bits bajos del acumulador (nibble bajo) tienen un valor mayor que 9 o si el bit AC est a 1, le suma el valor 6 a este nibble para hacer la conversin a BCD. - Si los 4 bits altos del acumulador tienen un valor mayor que 9 o si el bit C est a 1, le suma el valor 6 a estos bits para hacer la conversin a BCD. Por tanto, en la suma de los nmeros 19H y 22H en BCD, la instruccin DA suma 06H al acumulador, dando lugar al resultado de 41H en BCD. La suma de 85H y 25H en BCD, da como resultado el valor AAH; para ajustar este valor la instruccin DA le suma 66H, por lo que el valor en el acumulador es de 10H y el bit C est a 1; el resultado final es 110H.
4.3.5 Instrucciones lgicas La tabla 4.11 muestra la lista de instrucciones lgicas de la familia MCS-51 y la tabla 4.12 muestra las instrucciones lgicas de la familia MCS-251. Las operaciones lgicas que pueden realizar las familias MCS-51 y MCS-251 son: AND, OR, XOR y NOT.
84
Descripcin A = A AND OR XOR Rn A = A AND OR XOR (dir8) A = A AND OR XOR (@Ri) A = A AND OR XOR #dato (dir8) = (dir8) AND OR XOR A (dir8) = (dir8) AND OR XOR #dato A=0 Complementa el acumulador. Rotacin a la izquierda del acumulador. Rotacin a la izquierda con acarreo del acumulador. Rotacin a la derecha del acumulador. Rotacin a la derecha con acarreo del acumulador. Intercambia los nibbles del acumulador.
<dest>,<src> Rmd,Rms WRjd,WRjs Rm,#dato WRj,#dato16 Rm,dir8 WRj,dir8 Rm,dir16 WRj,dir16 Rm,@WRj Rm,@DRk Rm WRj Rm WRj Rm WRj
Descripcin Rmd = Rmd AND OR XOR Rms WRjd = WRjd AND OR XOR WRjs Rm = Rm AND OR XOR #dato WRj = WRj AND OR XOR #dato16 Rm = Rm AND OR XOR (dir8) WRj = WRj AND OR XOR (dir8, dir8+1) Rm = Rm AND OR XOR (dir16) WRj = WRj AND OR XOR (dir16, dir16+1) Rm = Rm AND OR XOR (@WRj) Rm = Rm AND OR XOR (@DRk) Desplazamiento lgico a la izquierda de Rm. Desplazamiento lgico a la izquierda de WRj. Desplazamiento aritmtico a la derecha de Rm. Desplazamiento aritmtico a la derecha de WRj. Desplazamiento lgico a la derecha de Rm. Desplazamiento lgico a la derecha de WRj.
4.3.5.1 Instrucciones ANL, ORL, XRL y CLP Las instrucciones lgicas ANL y ORL se pueden utilizar para realizar mscaras, cambiando el estado de bits especficos de algn registro. Por ejemplo, si se desea forzar a cero, de forma simultnea, los bits de acarreo CY y de acarreo auxiliar AC del registro de estado PSW, se puede realizar de la siguiente forma: ANL A, #00111111b As slo se afecta a los bits mencionados mientras que se respeta el estado de los restantes bits del registro. En caso de querer forzar los mismos bits a 1 lgico se debe utilizar la instruccin ORL: ORL A, #11000000b
85
La instruccin XRL se puede emplear para realizar la comparacin de un registro con una constante determinada. Por ejemplo, la siguiente instruccin: XRL A, #19H pone a cero el acumulador si ste es igual a 19H; en caso contrario el acumulador tendr un valor distinto de cero. De esta forma es posible realizar comparaciones con constantes numricas, utilizando el acumulador como indicador de la comparacin. Por ltimo, la instruccin CPL realiza el complemento de cada uno de los bits del acumulador. Si el acumulador tiene por valor 35H, la ejecucin de CPL A pone el acumulador al valor CAH. Las instrucciones adicionales que posee la familia MCS-251 permiten realizar operaciones lgicas entre cualquier par de registros tipo byte o Word, o bien entre el contenido de un registro tipo byte o Word y un operando almacenado en la memoria. 4.3.5.2 Instrucciones de rotacin Las instrucciones de rotacin RL, RR, RLC y RRC desplazan el acumulador 1 bit hacia la izquierda o hacia la derecha. La instruccin RL A rota el acumulador un bit hacia la izquierda, por lo que el bit ms significativo (MSB) queda en la posicin del bit menos significativo (LSB). La instruccin RR A rota el acumulador un bit hacia la derecha; por tanto, el bit menos significativo (LSB) queda en la posicin del bit ms significativo (MSB). Las instrucciones RLC A y RRC A, efectan el mismo tipo de rotacin que el descrito, pero incluyendo el valor del bit de acarreo C. La figura 4.3 ilustra de manera clara el efecto de las rotaciones. a)
Carry Acumulador
bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
b)
Carry
Acumulador
bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
c)
Carry
Acumulador
bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
d)
Carry
Acumulador
bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
C
Fig. 4.3
a) RL A, b) RR A, c) RLC A, d) RRC A
La familia MCS-251 incorpora, adems, tres instrucciones de desplazamiento que operan con registros tipo byte y Word. La instruccin de desplazamiento lgico a la izquierda (SLL) desplaza un bit a la izquierda el contenido del registro indicado en la instruccin reemplazando el bit de menor peso del registro por un cero. La instruccin de desplazamiento lgico a la derecha (SRL) desplaza un bit a la derecha el contenido del registro indicado en la instruccin reemplazando el bit de mayor peso del registro por un cero. El desplazamiento aritmtico a la derecha es similar a la instruccin SRL con la nica diferencia de que el bit de mayor peso no cambia de valor (figura 4.4).
86
Carry
Rm
bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
a)
0
Carry
Rm
b)
bit 7
bit 6
bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
C
Carry
c)
bit 7 bit 6 bit 5
Rm
bit 4 bit 3 bit 2 bit 1 bit 0
Fig. 4.4
4.3.5.3 Instrucciones SWAP y CLR La instruccin SWAP A intercambia el valor de los nibbles alto y bajo del acumulador. Por ejemplo, si el acumulador vale 35H, tras la ejecucin de SWAP A pasa a valer 53H. La instruccin CLR A pone a cero el contenido del acumulador y ocupa un byte de cdigo.
4.3.6 Instrucciones de transferencia de datos Las instrucciones de transferencia de datos tienen como funcin copiar un dato de un registro o posicin de memoria a otro registro o posicin de memoria. Este conjunto de instrucciones incluye la instruccin MOV, las instrucciones de intercambio y las instrucciones de carga y descarga de la pila.
Tabla 4.13 Instrucciones de transferencia de datos comunes a las familias MCS-51 y MCS-251 Mnemnico MOV <dest>,<src> A,Rn A,dir8 A,@Ri A,#dato Rn,A Rn,dir8 Rn,#dato dir8,A dir8,Rn dir8,dir8 dir8,@Ri dir8,#dato @Ri,A @Ri,dir8 @Ri,#dato DPTR,#dato16 Descripcin A = Rn A = (dir8) A = (@Ri) A = #dato Rn = A Rn = (dir8) Rn = #dato (dir8) = A (dir8) = Rn (dir8) = (dir8) (dir8) = (@Ri) (dir8) = #dato (@Ri) = A (@Ri) = (dir8) (@Ri) = #dato DPTR = #dato16
87
4.3.6.1 La instruccin MOV La instruccin MOV, Move, (tablas 4.13 y 4.14) es la instruccin ms verstil para realizar transferencia de datos por los diferentes tipos de direccionamiento que soporta. En la familia MCS-51 las instrucciones MOV transfieren datos de tipo byte entre dos registros o bien entre un registro y una posicin de memoria (tabla 4.17), mientras que la familia MCS-251 incorpora nuevas instrucciones MOV que le permiten realizar transferencias de bytes, Words o Dwords entre registros o bien entre posiciones de memoria y registros (tabla 4.18).
Tabla 4.14 Instrucciones de transferencia de datos de la familia MCS-251 Mnemnico MOV <dest>,<src> Rmd,Rms WRjd,WRjs DRkd,DRks Rm,#dato WRj,#dato16 DRk,#0dato16 DRk,#1dato16 DRk,dir8 DRk,dir16 Rm,dir8 WRj,dir8 Rm,dir16 WRj,dir16 Rm,@WRj Rm,@DRk WRjd,@WRjs WRj,@DRk dir8,Rm dir8,WRj dir16,Rm dir16,WRj @WRj,Rm @DRk,Rm @WRjd,WRjs @DRk,WRj dir8,DRk dir16,DRk Rm,@WRj+dis16 WRj,@WRj+dis16 Rm,@DRk+dis24 WRj,@DRk+dis24 @WRj+dis16,Rm @WRj+dis16,WRj @DRk+dis24,Rm @DRk+dis24,WRj Descripcin Rmd = Rms WRjd = WRjs DRkd = DRks Rm = #dato WRj = #dato16 DRk = #0dato16 DRk = #1dato16 DRk = (dir8, dir8+1, dir8+2, dir8+3) DRk = (dir16, dir16+1, dir16+2, dir16+3) Rm = dir8 Wrj = (dir8, dir8+1) Rm = (dir16) Wrj = (dir16, dir16+1) Rm = (@WRj) Rm = (@DRk) WRjd = (@WRjs, @WRjs+1) WRj = (@DRk, @DRk+1) (dir8) = Rm (dir8, dir8+1) = WRj (dir16) = Rm (dir16, dir16+1) = WRj (@WRj) = Rm (@DRk) = Rm (@WRjd , @WRjd +1) = Wrjs (@DRk, @Drk+1) = WRj (dir8, dir8+1, dir8+2, dir8+3) = DRk (dir16, dir16+1, dir16+2, dir16+3) = DRk Rm = (@WRj+dis16) WRj = (@WRj+dis16, @WRj+dis16+1) Rm = (@DRk+dis24) WRj = (@Drk+dis24, @DRk+dis24+1) (@WRj+dis16) = Rm (@WRj+dis16, @WRj+dis16+1) = Rm (@DRk+dis24) = Rm (@DRk+dis24, @DRk+dis24+1) = Rm
4.3.6.2 Instrucciones MOVH, MOVS y MOVZ Las instrucciones MOVH, MOVS y MOVZ (tabla 4.15) son instrucciones propias de la familia MCS251. La instruccin MOVH, Move to High Word, carga en la parte alta del registro DRk, e indica en la instruccin el valor de 16 bits que acompaa a la instruccin. La instruccin MOVS, Move with Sign
88
Extension, carga en la parte baja del registro Word destino el valor almacenado en el registro Rm fuente, conservando el signo del valor transferido.
Tabla 4.15 Instrucciones de transferencia de datos de la familia MCS-251
Descripcin Carga el dato #dato16 en la parte alta de DRk. Carga el dato de Rm en WRj conservando el signo. Carga el dato de Rm en WRj con signo positivo.
MOVS WR0, R3
; Con R3 = 49H
El valor 49H es positivo por ser cero su bit de mayor peso; por tanto, despus de ejecutarse la instruccin queda WR0 = 0049H. MOVS WR0, R5 ; Con R5 = 95H El valor 95H es negativo ya que su bit de mayor peso es uno. Para conservar en este caso el signo del valor transferido se cargar en la parte alta de WR0 el valor FFH. Por tanto, al ejecutarse la instruccin queda WR0 = FF95H. La instruccin MOVZ, Move with Zero Extension, transfiere el contenido de un registro tipo byte a la parte baja de un registro tipo Word, y se carga en la parte alta el valor 00H. 4.3.6.3 Instrucciones MOVX y MOVC La familia MCS-51 dispone de instrucciones MOVX, Move External, y MOVC, Move Code, especficas para direccionar la memoria de datos externa (tabla 4.16).
Tabla 4.16 Instrucciones de transferencia de datos comunes a las familias MCS-51 y MCS-251
Mnemnico MOVX
MOVC
En la instruccin MOVX siempre interviene el acumulador, ya sea como fuente o como destino. Con esta instruccin slo puede usarse direccionamiento indirecto a travs del registro Ri (@Ri, con i = 0 1), o a travs del registro DPTR. Mediante el registro @Ri slo se puede acceder a direcciones de 8 bits, mientras que con el DPTR se puede acceder a cualquier posicin del espacio de memoria externa de datos de la familia MCS-51. En los microcontroladores de la familia MCS-251 la instruccin MOVX tambin direcciona la memoria externa en la regin especificada por el registro DPXL, que se inicializa con el valor 01H despus de hacer un reset del microcontrolador.
89
La instruccin MOVC permite leer datos en la memoria de programa mediante el direccionamiento indexado y el registro acumulador como destino del dato transferido. El registro DPTR o el registro PC se emplean como direccin base de la instruccin, mientras que el acumulador se utiliza como valor aadido, offset, para situarse en una determinada posicin respecto de la direccin base. La utilidad principal de la instruccin MOVC es para leer el contenido de tablas almacenadas en la memoria de programa de los microcontroladores de la familia MCS-51. En este caso los registros DPTR y PC almacenan la direccin de inicio de las tablas. Ejemplo: MOV A, #03H CALL TABLA; ; Pone en A el nmero 03H para leer el DATO_3 de la tabla
La subrutina tabla tendra el siguiente aspecto y estara situada en cualquier parte del programa: TABLA: MOVC A, @A+PC ; Al ejecutarse pone en A el dato DATO_3 RET ; PC apunta a la direccin de la instruccin RET en memoria DB DATO_1 ; Este dato se obtiene para A = 1 DB DATO_2 ; Este dato se obtiene para A = 2 DB DATO_3 ; Este dato se obtiene para A = 3 DB DATO_4 ; Este dato se obtiene para A = 4 ........ ........ DB DATO_n ; Este dato se obtienen para A = n+1 En este ejemplo, la base de la tabla es el contador de programa PC, pero al no ser ste accesible de forma directa por el programador, se toma como base la instruccin de retorno de la subrutina, RET. Luego, en el momento en que se ejecuta la instruccin MOVC, el PC contiene la direccin de la siguiente instruccin a ejecutar, por lo que lee uno de los datos que estn por debajo de la instruccin RET, dependiendo del valor del acumulador en el momento de ejecutar la instruccin MOVC. Este tipo de tablas puede tener un mximo de 255 elementos (mxima capacidad del acumulador, puesto que es un registro de 8 bits). En la instruccin MOVC el acumulador no puede ser igual a 0, ya que durante la ejecucin de MOVC el PC contiene la direccin de la instruccin RET, por lo que se devolvera el cdigo de la instruccin RET. En la familia MCS-251 la instruccin MOVC permite leer posiciones de memoria de la regin FF:.
4.3.6.4 Instrucciones PUSH y POP Las instrucciones PUSH y POP se utilizan para introducir y extraer datos de la pila. El control de la pila se realiza a travs del registro SP, Stack Pointer, en la familia MCS-51 (tabla 4.17), y a travs del registro SPX, Extended Stack Pointer, en la familia MCS-251 (tabla 4.18). La instruccin PUSH incrementa el Stack Pointer en una unidad (SP=SP+1) y copia el byte indicado en la pila. La instruccin POP realiza el proceso inverso, extrayendo, de la posicin apuntada por SP, un byte de la pila, para luego decrementar en una unidad el Stack Pointer (SP=SP-1).
90
Tabla 4.17 Instrucciones de transferencia de datos en la pila comunes a las familias MCS-51 y MCS-251
Mnemnico PUSH
POP
Descripcin Mete el dato #dato en la pila. Mete el dato #dato16 en la pila. Mete el contenido de Rm en la pila. Mete el contenido de WRj en la pila. Mete el contenido de DRk en la pila. Mete en Rm un dato de la pila. Mete en WRj un Word de la pila. Mete en DRk un Dword de la pila.
Con los microcontroladores de la familia MCS-51, que disponen de slo 128 posiciones de memoria RAM interna, se debe procurar que el puntero SP no sobrepase los 128 bytes, puesto que los datos introducidos por encima de esta posicin se perderan al no estar esta zona implementada fsicamente en el microcontrolador. La ejecucin de la instruccin POP con el SP apuntando a una direccin de memoria RAM interna no implementada, obtiene un valor indeterminado. Para las versiones de la MCS-51 con 256 bytes de memoria RAM interna, el SP puede llegar hasta el valor FFH. En todos los dispositivos de la familia MCS-51 la memoria reservada para la pila reside en la RAM interna. En la familia MCS-251 la pila est ubicada en la regin 00. 4.3.6.5 Las instrucciones de intercambio XCH y XCHD Las instrucciones de intercambio XCH, Exchange, producen un intercambio de datos entre el acumulador y el contenido de un registro o posicin de memoria. La instruccin XCHD A, @Ri es similar a la anterior, pero slo se intercambia el nibble bajo del acumulador con el de una posicin de memoria. Estas instrucciones son de gran utilidad en el desplazamiento de dgitos en formato BCD. En la tabla 4.19 estn indicadas las instrucciones de intercambio.
Tabla 4.19 Instrucciones de intercambio comunes a las familias MCS-51 y MCS-251
Mnemnico XCH
XCHD
Descripcin Intercambia A y Rn. Intercambia A y (dir8). Intercambia A y (@Ri). Intercambia el nibble bajo de A y (@Ri ).
4.3.7 Instrucciones booleanas Las instrucciones booleanas procesan la informacin a nivel de bit. Los bits que pueden direccionar estas instrucciones estn ubicados en la memoria RAM interna y en el rea SFR. Las familias MCS-51
91
y MCS-251 comparten el mismo conjunto de instrucciones booleanas, con la nica diferencia de que sus reas de direccionamiento a nivel de bit son diferentes. Las instrucciones booleanas (tabla 4.20) se pueden agrupar dentro de cuatro categoras: - Instrucciones que fuerzan un bit a 1 0 lgico. - Instrucciones lgicas. - Instrucciones de transferencia de bits. - Instrucciones de salto condicional.
Tabla 4.20 Instrucciones booleanas
<dest>,<src> CY bit CY bit CY bit CY, bit CY, /bit CY, bit CY,/bit CY, bit bit, CY bit, rel bit, rel bit, rel
Descripcin Pone a cero el bit de acarreo. Pone a cero el bit direccionado. Pone a uno el bit de acarreo. Pone a uno el bit direccionado. Complementa el bit de acarreo. Complementa el bit direccionado. CY = CY AND (bit) CY = CY AND (/bit) CY = CY OR (bit) CY = CY AND (/bit) CY = bit bit = CY Salta si (bit) es 1. Salta si (bit) no es 1. Salta si (bit) es 1 y borra el bit.
Las instrucciones que fuerzan un bit a 1 o a 0 lgico son la instruccin SETB y la instruccin CLR. La instruccin SETB, Set bit, pone a 1 lgico el bit direccionado, mientras que la instruccin CLR, Clear bit, pone a cero el bit direccionado. Las instrucciones lgicas estn formadas por las instrucciones ANL, ORL y CPL. La instruccin ANL realiza la funcin and lgica, la instruccin ORL realiza la funcin or lgica y la instruccin CPL realiza la funcin de negacin lgica. En las instrucciones ANL y ORL tambin es posible tomar el bit direccionado de forma complementada, utilizando para ello la notacin /bit. A nivel de transferencia de bits se utiliza la instruccin MOV. Esta instruccin se transfiere el valor de cualquier bit (de las reas direccionables a nivel de bit) hacia el bit de acarreo o viceversa. Por ejemplo, el estado del bit 20H.0 de la memoria interna se puede poner en la patilla 0 de puerto P1, mediante las siguientes instrucciones: MOV MOV CY, 20H.0 P1.0,CY ;20H.0 es el bit 0 de la direccin 20H ;Coloca el bit de acarreo en P1.0
En este ejemplo, el bit de acarreo realiza las funciones de acumulador, pues contiene uno de los operandos que intervienen en la instruccin y guarda el resultado.
92
Las instrucciones de salto condicional ejecutan un salto de tipo relativo si el bit especificado en la instruccin tiene un determinado estado. En la instruccin JB, Jump on bit, efecta el salto si el bit direccionado vale uno, mientras que la instruccin JNB, Jump on not bit, realiza el salto si el bit direccionado vale cero. Con la instruccin JBC, Jump on bit then clear it, se produce el salto si el bit vale uno y, tras el salto, el bit direccionado se fuerza a cero. Se debe destacar que las instrucciones lgicas no incluyen la operacin XRL (or exclusiva). Una forma de realizar esta instruccin mediante software es la siguiente, donde se hace la funcin or exclusiva entre los bits 1 y 5 del puerto P1: MOV CY, P1.1 JNB P1.5, continua CPL CY continua: MOV
4.3.8 Instrucciones de control Las instrucciones de control permiten cambiar la secuencia de ejecucin de un programa y se pueden agrupar en instrucciones de salto incondicional, instrucciones de salto condicional e instrucciones de llamada y retorno de subrutina. Las instrucciones de control proporcionan al microcontrolador la direccin de la siguiente instruccin a ejecutar. Esta direccin puede ser proporcionada de forma explcita en la propia instruccin, o bien de forma implcita, como es el caso de la instruccin de retorno de subrutina.
4.3.8.1 Instrucciones de salto incondicional En la familia MCS-51 existen cinco tipos de salto incondicional: AJMP, LJMP, JMP @A+DPTR, NOP y SJMP. La familia MCS-251 tiene estos cinco tipos de salto y, adems, incorpora un tipo ms: EJMP. El conjunto de instrucciones de salto incondicional se muestra en la tabla 4.21, para la MCS51, y en la tabla 4.22, para la MCS-251. Las instrucciones AJMP, LJMP, EJMP y JMP @A+DPTR realizan un salto a la direccin indicada en la propia instruccin, mientras que en las instrucciones NOP y SJMP el salto que realizan es relativo al valor del contador de programa.
Tabla 4.21 Instrucciones de salto incondicional comunes a las familias MCS-51 y MCS-251
Descripcin Salto absoluto. Salto largo. Salto relativo. Salto indirecto a la direccin A + DPTR. Salto a la siguiente instruccin.
4 Programacin de las familias MCS-51 y MCS-251 Tabla 4.22 Instrucciones de salto incondicional de la familias MCS-251
93
La instruccin AJMP, Absolute Jump, cambia los 11 bits de menor peso del contador de programa por la direccin de 11 bits especificada en la instruccin (de forma directa o a travs de un registro). De esta manera se puede saltar a cualquier direccin dentro del bloque de 2kbytes de memoria, donde est ubicada la instruccin de salto. La instruccin LJMP, Long Jump, para la familia MCS-51, cambia los 16 bits del contador de programa por la direccin que acompaa a la instruccin, mientras que para la familia MCS-251, cambia los 16 bits de menor peso del contador de programa por la direccin que acompaa a la instruccin. El rango del salto en este caso abarca los 64kbytes de la regin donde est ubicada la instruccin. La instruccin EJMP, Extended Jump, cambia los 24 bits del contador de programa por la direccin que acompaa a la instruccin. Esta instruccin permite saltar a cualquier direccin del espacio de memoria de la familia MCS-251. La instruccin JMP @A+DPTR realiza un salto a la direccin obtenida de la suma del contenido del acumulador con el contenido del registro DPTR. Ejemplo: MOV DPTR, #TABLA ; Pone en DPTR la direccin de comienzo de una tabla de saltos MOV A, INDICE ; Pone acumulador el valor del CASO al que se desea saltar RL A ; Se multiplica por dos el contenido del Acc JMP @A+DPTR ; Salta a la tabla de saltos TABLA: AJMP CASO_0 ; Si INDICE = 0 salta a CASO_0 AJMP CASO_1 ; Si INDICE = 1 salta a CASO_1 AJMP CASO_2 ; Si INDICE = 2 salta a CASO_2 AJMP CASO_3 ; Si INDICE = 3 salta a CASO_3 AJMP CASO_4 ; Si INDICE = 4 salta a CASO_4 4.3.8.2 Instrucciones de salto condicional Todas las instrucciones de salto condicional son instrucciones de salto relativo. La tabla 4.23 muestra el conjunto de instrucciones de salto condicional comunes a las familias MCS-51 y MCS-251, mientras que la tabla 4.24 muestra las instrucciones de salto condicional que incorpora exclusivamente la familia MCS-251. En las instrucciones JC y JNC la condicin de salto hace referencia al valor del bit de acarreo, y en las instrucciones JZ y JNZ la condicin de salto est relacionada con el contenido del acumulador. La instruccin CJNE, Compare and jump if not equal, realiza la comparacin de los dos operandos indicados en la instruccin y salta si no son iguales. El salto es de tipo relativo.
94
La instruccin DJNZ, Decrement and jump if not zero, decrementa el registro o posicin de memoria indicado en la instruccin y salta si el resultado no es cero. La instruccin DJNZ es muy til en el control de bucles. Para ejecutar un bucle N veces, se carga un contador con el valor N y se termina el bucle con la instruccin DJNZ. El siguiente ejemplo ejecuta cuatro veces el bucle marcado con la etiqueta INICIO.
Tabla 4.23 Instrucciones de salto condicional comunes a las familias MCS-51 y MCS-251
DJNZ
<dest>,<src> rel rel rel rel A, dir8, rel A, #dato, rel Rn, #dato, rel @Ri, #dato, rel Rn,rel dir8,rel
Descripcin Salta si el bit de acarreo es 1. Salta si el bit de acarreo es 0. Salta si el acumulador es 0. Salta si el acumulador es distinto de 0. Compara A con el dato (dir8) y salta si no son iguales. Compara A con #dato y salta si no son iguales. Compara Rn con #dato y salta si no son iguales. Compara (@Ri) con #dato y salta si no son iguales. Decrementa Rn y salta si no es 0. Decrementa (dir8) y salta si no es 0.
Descripcin Salta si es igual (si Z=1). Salta si no es igual (si Z=0). Salta si es mayor que (si CY=Z=0). Salta si es menor o igual que (si Z=1 o CY=1). Salta si es menor que (con signo). (si N[OV). Salta si es menor o igual que (con signo). (si Z=1 si N[OV. Salta si es mayor que (con signo). (si Z=0 y N=OV). Salta si es mayor o igual que (con signo). (si N=OV).
MOV R4,#04H ; Registro que determina el nmero de veces que se va a ejecutar el bucle INICIO: MOV ; Direccin de comienzo del bucle ........ ; Instrucciones del bucle DJNZ R4,INICIO ; Si R4[0 salta a INICIO MOV ;Si R4=0 contina con la instruccin siguiente. El bucle se ejecuta 4 veces Las condiciones de salto de las instrucciones JE, JNE, JG, JLE, JSL, JSLE, JSG y JSGE, son exclusivas de la familia MCS-251, y estn relacionadas con el valor que toman los indicadores de los registros de estado despus de ejecutar una instruccin de comparacin (CMP). Los bits de los registros de estado que intervienen son el bit de acarreo, el bit de cero y el bit de signo. Cuando se ejecuta una instruccin de comparacin CMP <des>,<src> de dos nmeros positivos se puede obtener diversos resultados: - Si <des> = <src> entonces el bit Z = 1 - Si <des> [ <src> entonces el bit Z = 0
95
- Si <des> > <src> entonces Z = 0 y CY = 0 - Si <des> <src> entonces Z = 1 o CY = 1 Cuando los nmeros comparados tienen signo (son positivos o negativos) se deben analizar los bits de estado Z, N y OV para determinar la relacin existente entre los operandos: - Si <des> < <src> entonces el bit N [ OV - Si <des> <src> entonces el bit Z = 1 o N [ OV - Si <des> > <src> entonces Z = 0 y N = OV - Si <des> <src> entonces N = OV Existen instrucciones de salto condicional cuya condicin de salto se corresponde con el valor que adquieren los bits del registro de estado en los casos anteriormente considerados. En la tabla 4.25 se indica la relacin entre las instrucciones de salto condicional y el resultado de la comparacin de dos operandos.
Tabla 4.25 Instrucciones de salto condicional
= JE
JNE
JGE JSGE
JLE JSLE
4.3.8.3 Instrucciones de llamada y de retorno a subrutina En la tabla 4.26 se muestran las instrucciones de salto y retorno de subrutinas para las familias MCS51 y MCS-251. Las instrucciones que son exclusivas de la familia MCS-251 se muestran en la tabla 4.27.
Tabla 4.26 Instrucciones de llamada y retorno de subrutina, comunes a las familias MCS-51 y MCS-251
Descripcin Llamada a subrutina de tipo absoluto. Llamada a subrutina tipo long. Retorno de subrutina. Retorno de la rutina de servicio a la interrupcin.
Descripcin Llamada a subrutina tipo long. Llamada a subrutina tipo extendido. Retorno extendido de subrutina.
La instruccin ACALL, Absolute call, utiliza 11 bits para indicar la direccin de comienzo de la subrutina. Mediante ACALL la subrutina debe comenzar dentro del mismo bloque de memoria de 2kbytes donde est ubicada la instruccin de llamada.
96
La instruccin LCALL, Long call, hace una llamada a subrutina con una direccin de 16 bits: la subrutina puede encontrarse en cualquier lugar dentro del espacio de 64kbytes de memoria de programa en la familia MCS-51 y dentro de la misma regin de memoria para la familia MCS-251. La instruccin ECALL, Extended Call, es exclusiva de la familia MCS-251 y permite realizar saltos a subrutinas ubicadas en cualquier posicin del espacio de memoria. Al ejecutarse una instruccin de llamada a subrutina se guarda, de forma automtica, en la pila la denominada direccin de retorno, que es la direccin donde se encuentra ubicada la siguiente instruccin del programa principal. El nombre de pila se le asigna a la zona de memoria donde el microcontrolador almacenar la direccin de retorno. Para la MCS-51 la memoria de la pila es la zona de memoria que est por encima del puntero de la pila SP. Por defecto el SP est inicializado a 07H, por lo que, tras un reset, la zona de la pila es la zona de la memoria interna situada a partir de la posicin 07H (de la 08H a la 7FH, o de la 08H a la FFH). Sin embargo, el valor de SP se puede modificar en cualquier momento mediante una instruccin MOV, y se puede definir cul va a ser la zona de la memoria interna que se utilizar como pila. En el caso de las instrucciones ACALL y LCALL, para la familia MCS-51, la direccin de retorno es de 2 bytes, correspondientes al registro PC, Program Counter; en el caso de la MCS-251, los dos bytes que se guardan son los de menor peso del PC. Con la instruccin ECALL se guardan en la pila los tres bytes del PC de la familia MCS-251. Con las instrucciones ACALL y LCALL, para almacenar la direccin de retorno en la memoria de la pila la CPU, se efecta el siguiente proceso: 1. Interpreta el cdigo de instruccin y se actualiza el valor de PC. PC=PC+3. 2. Incrementa el puntero de la pila, SP=SP+1, y se guarda el byte bajo de PC, PCLOW, en la posicin de memoria interna apuntada por SP. 3. Incrementa el puntero de la pila, SP=SP+1, y se guarda el byte alto de PC, PCHIGH, en la posicin de memoria interna apuntada por SP. 4. Pone en el contador de programa la direccin de salto de la subrutina. PC=Dir. subrutina. Las subrutinas deben finalizar con la instruccin RET, Return, que recupera el valor de la direccin de retorno guardada en la pila. Si el salto a la subrutina se ha realizado con la instruccin ECALL, ser necesario acabar la subrutina con la instruccin ERET, que permite recuperar los tres bytes del contador de programa almacenados en la pila. Con la instruccin RET la CPU efecta el siguiente proceso: 1. Lee la posicin de memoria que es apuntada por SP y pone el dato ledo en el byte alto de PC, PCHIGH. 2. Decrementa el puntero de la pila, SP=SP-1. 3. Lee la posicin de memoria que es apuntada por SP y pone el dato ledo en el byte bajo de PC, PCLOW. 4. Salta a la direccin que apunta el contador de programa PC. La instruccin RETI se utiliza para retornar desde una rutina de servicio de interrupcin. La nica diferencia entre RET y RETI, consiste en que RETI comunica al sistema de control de interrupciones que la interrupcin en curso ha finalizado. Por lo dems, RETI acta igual que la instruccin RET.
5 El modelo de programacin
97
5 El modelo de programacin
Bajo la definicin de modelo de programacin se agrupa el uso combinado de las instrucciones y del conocimiento de la arquitectura interna del microcontrolador para formar rutinas de programa que den solucin a problemas que son comunes en la mayor parte de los diseos, como son la transferencia de bloques de datos en la memoria externa de datos, la realizacin y consulta de tablas de datos, la conversin de datos entre distintos formatos, rutinas aritmticas, etc. En este captulo se expondrn varias rutinas en lenguaje ensamblador que dan solucin a distintos problemas; pero debido al tratamiento simultneo de las dos familias de microcontroladores que se hace en esta obra, en primer lugar se expondrn las rutinas para la familia MCS-51, y en segundo lugar se expondrn las rutinas derivadas para la MCS-251, considerando, para ello, los nuevos tipos de direccionamiento y la flexibilidad en el acceso a los registros que tiene esta ltima familia.
;******************************************************* ;Subrutina Bin_ASCII ;Convierte un n hexadecimal en ASCII ;Entrada y salida: A ;******************************************************* Bin_ASCII: INC A MOVC A,@A+PC RET DB 30H, 31H, 32H, 33H, 34H, 35H, 36H, 37H DB 38H, 39H, 41H, 42H, 43H, 44H, 45H, 46H
98
El ncleo de esta subrutina es la instruccin MOVC A, @A+PC. Cuando se ejecuta esta instruccin el contador de programa se actualiza para apuntar a la instruccin siguiente, RET, pues la tabla de datos est situada a continuacin de la instruccin RET. El acumulador es un ndice que apunta al dato en concreto dentro de la tabla. Si A vale 0H, la subrutina retornar el dato 30H, puesto que en primer lugar se ha incrementado en una unidad (instruccin INC A) y, por tanto, la suma del puntero indexado, A+PC, apunta al primer dato de la tabla; si A vale 01H la subrutina retorna 31H, si vale 02H retorna 32H, etc.
La transferencia de datos, segn el ejemplo mostrado, est limitada a una misma pgina, es decir, a todas aquellas direcciones de 16 bits que tienen el mismo valor del byte alto de direccin, pues en el puerto P2 se mantiene este valor mientras se ejecuta la rutina. Si en esta rutina el primer byte a transferir del origen tiene como byte bajo de direccin el valor 00H, entonces el tamao mximo de datos que se pueden transferir es de 256 bytes; en caso contrario el tamao mximo que se puede transferir vendr delimitado por el inicio de la pgina siguiente.
5 El modelo de programacin
99
A continuacin se muestra la misma rutina de transferencia solucionada con instrucciones de la familia MCS-251. En este caso se ha utilizado un nico registro tipo Word que combinado con instrucciones de direccionamiento indexado permite acceder a las direcciones origen y destino. Se puede observar cmo esta rutina es ms compacta y funcional que la anterior.
;***************************************************** ;Rutina TRANS para la familia MCS-251 ;Puntero: WR0 ;Tamao: R7 ;Modifica: WR0, R3 y R7 ;***************************************************** TRANS: MOV WR0,#1200H ;Direccin origen MOV R7,#50 ;Nmero de datos a transferir B_TR: MOV R3,@WR0 ;Lee dato en origen MOV @WR0+2300H,R3 ;Escribe en destino INC WR0 ;Incrementa el puntero DJNZ R7,B_TR ;Bucle R7 veces RET
x0 x1 x3 y0 y1
Funciones lgicas
x0 x1 x3 y0
y1
100
El bucle interno formado por el registro R6 est dentro del bucle externo formado por el registro R7; luego a cada vuelta del bucle externo le corresponden 100 ejecuciones del bucle interno. De esta manera, sabiendo que para la MCS-51 el tiempo de ejecucin de las instrucciones MOV y DJNZ es de uno y dos ciclos mquina, respectivamente, y que un ciclo mquina equivale a 1s con una frecuencia de reloj de 12MHz, se puede determinar el tiempo exacto que tardar en ejecutarse la subrutina de retardo. La figura 5.2 muestra el diagrama de tiempos de la subrutina e indica tambin el cmputo del tiempo resultante -eq. (5.1).
MOV (1 s)
MOV (1 s)
tR 1 [ 1 2 R 6 2] R 7 2 2.033s
(5.1)
DJNZ (2 s)
R6 veces
R7 veces
tR
1 s 3
1 3 s
(R 6 1) s
1 s 2
1 s R7 2 4 .
(5.2)
DJNZ (2 s)
(R 7 1) s
1 s 1.009,16 s
RET (2 s)
5 El modelo de programacin
101
Para la familia MCS-251 el clculo del tiempo realizado es diferente (eq. (5.2)), puesto que trabajando en el modo fuente, la instruccin MOV Rn,#data tarda cuatro perodos de reloj en ejecutarse, la instruccin DJNZ Rn,rel posee dos tiempos de ejecucin distintos: 12 perodos de reloj si se cumple la condicin de salto y 6 perodos en caso contrario; y, por ltimo, el microcontrolador invierte 12 perodos de reloj en ejecutar la instruccin RET. El tiempo mximo que se puede obtener con una rutina de dos bucles anidados es de 130.818s para la MCS-51, que equivale a unos 0.13 segundos, y de 65.238,33s para la MCS-251, poniendo a FFH los registros R6 y R7. Si se desean obtener tiempos mayores es necesario realizar ms anidamientos. Una alternativa a la rutina anterior consiste en la siguiente rutina:
;************************************************ ;Subrutina RETARDO2 ;Registros afectados: R7, R6 ;************************************************ RETARDO2: MOV R7,#0 MOV R6,#0 L1: DJNZ R6,L1 ;Bucle interno DJNZ R7,L1 ;Bucle externo RET
A primera vista da la impresin de que los bucles de esta rutina dan cero vueltas, pues R6 y R7 valen cero. Pero si se observa en detalle la ejecucin de la instruccin DJNZ, resulta que esta instruccin primero decrementa el registro indicado, y luego examina la condicin de salto. Por tanto, si el registro vale cero, al decrementarse pasa a valer FFH, (00H-01H=FFH), y se ejecuta el bucle FFH+1 o 256 veces. Realizando el diagrama de tiempos para esta rutina, el tiempo que se obtiene es de 13.1588s para la MCS-51 y de 65.665,16s para la MCS-251, para una frecuencia de reloj de 12MHz.
3 Suma
2 Suma
1 Suma
102
Para resolver este problema se realiza una subrutina que es capaz de sumar datos de cualquier tamao en bytes, aunque, para este caso, ser suficiente con que sume datos de 3 bytes de tamao. Los datos que se debern sumar son X=2DAB99H y Y=5E2C69H en formato hexadecimal y estn almacenados a partir de las posiciones de la memoria interna 60H y 70H, respectivamente; es decir, el byte de menor peso del dato X (99H) estar ubicado en la direccin 60H, su byte intermedio (ABH) en la 61H y su byte ms significativo (2DH) en la 62H; lo mismo se hace con el dato Y a partir de la direccin 70H de la memoria interna. Para ejecutar esta subrutina se tienen primero que poner las direcciones 60H y 70H en los registros R0 y R1; ello se debe efectuar antes de llamar a la subrutina, por ejemplo
MOV MOV MOV LCALL R0,#60H R1,#70H R7,#3 SUMA_N ;Pone direccin de X en R0 ;Pone direccin de Y en R1 ;Pone tamao del dato en R7 ;Llama a la subrutina
La manera de operar de la subrutina se muestra claramente en la figura 5.3. La subrutina hace tres sumas consecutivas y obtiene los datos en cada una de ellas a travs de los punteros @R0 y @R1, que se actualizan con la instruccin INC. Esta subrutina es capaz de sumar datos de 4, 8 16 bytes, con la condicin previa de situar los datos en la memoria interna y poner en R0, R1 y R7 los valores adecuados. La razn de que el resultado generado en las operaciones sustituya a uno de los operandos, estriba en que para la MCS-51 tan slo se dispone de los punteros @R0 y @R1; se carece de un tercer puntero necesario para dejar el resultado en otras direcciones. El resto de los registros no pueden ser empleados como punteros, pero s como variables intermedias, pasando su contenido a R0 o R1, y conseguir, as, que hagan de punteros por medio de estos registros. Cabe resaltar que para la MCS-251 este tipo de problemas no existe, pues cualquiera de sus registros puede hacer de puntero. Las instrucciones de la familia MCS-251 permiten ejecutar la rutina de suma con un mayor rango de direcciones y guardar el resultado en direcciones distintas a las de ubicacin de los operandos. El ejemplo anterior de suma de dos datos de 3 bytes se puede resolver empleando las instrucciones de la familia MCS-251 que pueden sumar datos de hasta 4 bytes:
;***************************************************************** ;Rutina SUM_4 (Suma de datos de 4 bytes para la familia MCS-251) ;Puntero: WR8 ;Datos: DR0 y DR4 ;***************************************************************** SUM_4: MOV WR0,@WR8 ;Carga el dato en el registro DR0 MOV WR2,@WR8+2H B_TR: MOV WR4,@WR8+10d ;Carga el otro dato en el registro DR4 MOV WR6,@WR8+12d ADC DR0,DR4 ;Suma los dos datos MOV @WR8+20d,WR0 ;Carga el resultado en memoria MOV @WR8+22d,WR2 RET
El anterior programa suma dos datos de 4 bytes almacenados en las direcciones 60H y 70H a las que se accede con el registro WR8 utilizando el direccionamiento indexado. El mismo registro permitir
5 El modelo de programacin
103
guardar el resultado de la suma a partir de la direccin 80H. Para ejecutar esta subrutina previamente se debe colocar la direccin inicial del dato en WR8.
MOV WR8,#0060H LCALL SUM_4bytes ;Carga el puntero con la direccin inicial del dato ;Llamada a la subrutina de suma de 4 bytes
Si el formato de los nmeros que se quiere sumar es BCD, basta con aadir la instruccin de ajuste decimal, DA A, tras la instruccin de suma ADDC, para obtener el resultado tambin en formato BCD, lo que se muestra en la siguiente subrutina. En este caso, si X=1969H y Y=1050H dar por resultado Z=0919H.
;************************************************ ;Subrutina SUMA_N (Para datos en formato BCD) ;Entrada: Punteros: R0 a X, R1 a Y. R7: Tamao ;Salida: El resultado sustituye al operando X ;Modifica: A, R0, R1, R7, C ;************************************************ SUMA_N: CLR C ;Borra Carry BUC_SN: MOV A,@R0 ;Lee dato X ADDC A,@R1 ;Suma X con Y DA A MOV @R0,A ;Resultado sustituye a X INC R0 ;Incrementa punteros INC R1 DJNZ R7,BUC_SN ;Repite R7 veces RET
En cuanto a la resta de datos de longitud mayor que un byte, se puede realizar una subrutina con este propsito simplemente reemplazando la instruccin de suma por la instruccin de resta, SUBB, en las subrutinas anteriores.
Un visualizador numrico suele estar formado por varios dgitos tipo LED de 7 segmentos o de 16 segmentos, o por una pantalla de cristal de cuarzo (LCD).
104
;************************************************ ;Subrutina CONTA ;Registros afectados: R0, R1, R2 ;************************************************ CONTA: CJNE R0,#9,UNIDAD ;Compara unidad CJNE R1,#9,DECENA ;Compara decena CJNE R2,#9,CENTENA ;Compara centena MOV R0,#0 ;Al ser 999 pone a 000 MOV R1,#0 MOV R2,#0 RET UNIDAD: INC R0 ;Incrementa unidades RET DECENA:MOV R0,#0 ;Pone a 0 las unidades INC R1 ;Incrementa decenas RET CENTENA: MOV R0,#0 ;Pone a 0 unidades y decenas MOV R1,#0 INC R2 ;Incrementa centenas RET
CONTA
R0=9
NO
SI
R1=9
NO
SI
R2=9
NO
SI
R0=R0+1
R0=0 R1=R1+1
RET
El flujograma de la subrutina CONTA (figura 5.4), se observa cmo primero se comprueba si las unidades han llegado a 9; de no ser as se incrementa R0. En caso afirmativo, se incrementan las decenas y las unidades se ponen a cero. Procediendo de esta manera con el resto de dgitos, se completa la subrutina del contador, que se puede extender fcilmente a un mayor nmero de dgitos. A la hora de hacer una subrutina para descontar, el proceso es idntico al mostrado en la figura 5.4, pero cambiando la condicin existente por la de comprobar si las unidades, decenas y centenas son iguales a cero; los registros, en lugar de ponerse a cero, se ponen a 9, tal y como se indica en la figura 5.5. A continuacin se muestra la subrutina para descontar:
;************************************************ ;Subrutina DECRE ;Registros afectados: R0, R1, R2 ;************************************************ DECRE: CJNE R0,#0,D_UNI ;Compara unidad CJNE R1,#0,D_DECE ;Compara decena CJNE R2,#0,D_CENT ;Compara centena MOV R0,#9; ;Al ser 000 pone a 999 MOV R1,#9 MOV R2,#9 RET D_UNI: DEC R0 ;Decrementa unidad RET D_DECE: MOV R0,#9 ;Pone a 9 unidad DEC R1 ;Decrementa decena RET D_CENT: MOV R0,#9 ;Pone a 9 unidad MOV R1,#9 ;Pone a 9 decena DEC R2 ;Decrementa centena RET
DECRE
R0=0
NO
SI
R1=0
NO
SI
R2=0
NO
SI
R0=R0-1
R0=9 R1=R1-1
RET
En el caso de producirse un rebasamiento de los valores mximo y mnimo en las subrutinas CONTA y DECRE, respectivamente, se ha optado por actualizar el valor de todos los registros al valor inicial 000 y 999, respectivamente. Otra manera de realizar un contador en formato BCD, consiste en emplear de manera hbil la
5 El modelo de programacin
105
instruccin de ajuste decimal DA A. Para ello, supngase que se desea realizar un contador de cuatro cifras en formato BCD, y que las posiciones de memoria interna 40H y 41H harn de contador; los cuatro bits bajos de 40H sern las unidades y sus cuatro bits altos, las decenas, los cuatro bits bajos de 41H sern las centenas y sus cuatro bits altos la unidad de millar del contador. Con un contador de cuatro cifras en las posiciones 40H y 41H, se puede llegar hasta un valor de 9999, es decir, ambas posiciones contienen el valor 99H. A continuacin se muestra la rutina CONTA que hace esta funcin:
;******************************************************** ;Subrutina CONTA ;Registros afectados: A, R0, R7, C, (40H), (41H) ;******************************************************** CONTA: MOV R7,#2 ;R7 controla el bucle MOV R0,#40H ;Pone direccin en puntero SETB C ;Pone C=1 BUC_CT: MOV A,@R0 ;Lee ADDC A,#0 ;Suma con acarreo DA A ;Ajuste decimal MOV @R0,A ;Guarda INC R0 ;Incrementa puntero DJNZ R7,BUC_CT ;Repite R7 veces RET
Esta rutina incrementa en una unidad el valor de las posiciones 40H y 41H. La rutina, al principio, incrementa 40H de 00H a 01H, de 01H a 02H, y as sucesivamente hasta llegar a 09H, pues la instruccin de ajuste decimal no modifica el valor del acumulador tras la instruccin de suma. En el siguiente incremento el valor de 40H pasa de 09H a 0AH, por lo que la instruccin DA A transforma este dato en 10H, al ser el nibble bajo mayor que 9. En los siguientes incrementos la instruccin DA A no modificar el acumulador, al menos hasta que llegue al valor de 1AH, momento en el cual lo transformar en 20H. As, la instruccin de ajuste decimal acta en los instantes en que el acumulador vale 1AH, 2AH, 3AH, , 9AH; este ltimo caso lo transforma en 00H y pone el bit de acarreo a uno, C=1, de manera que incrementa en una unidad el contenido de la posicin de 41H, pasando el contador a valer 0100H. La rutina CONTA basada en la instruccin de ajuste decimal tiene un menor tamao que la anterior y, adems, permite extender el mximo valor del contador a cualquier tamao; basta, para ello, con aumentar el nmero de bytes del contador, aumentado el nmero de posiciones de memoria que ocupa. Por el contrario, no es posible realizar del mismo modo una rutina que decremente el valor del contador, debido a que la instruccin de ajuste decimal no puede ir asociada a la instruccin SUBB de resta.
2
106
por YH-YL y ZM2-ZM0 al multiplicar XH por YH-YL. Estos resultados intermedios se suman para obtener un resultado final de 32 bits (ZS3-ZS0)(figura 5.6b). En consecuencia, la multiplicacin de dos nmeros de 16 bits estar basada en una subrutina, MUL8_16, que multiplica un nmero de 8 bits con un nmero de 16 bits. La subrutina MUL8_16 tiene un primer operando XL de 8 bits almacenado en R1 y un segundo operando de 16 bits; el byte alto est almacenado en R2 y el byte bajo en R3. La subrutina genera un resultado de 24 bits que se sita en los registros R5, R6 y R7, donde se almacenan los resultados ZT2, ZT1 y ZT0, respectivamente.
;********************************************** ;Subrutina MUL8_16 (8bits x 16 bits, XL x YH-YL) ;Entrada: R1=XL, R2=YH, R3=YL. ;Salida: 24 bits. R7=ZT0, R6=ZT1 y R5=ZT2. ;Modifica: A, B, C ;********************************************** MUL8_16: MOV A,R1 ;Lee XL MOV A,R3 ;Lee YL MUL AB ;(XL x YL) MOV R7,A ;Salva ZT0 MOV R6,B ;Salva ZN1 MOV A,R1 ;Lee XL MOV B,R2 ;Lee YH MUL AB ;(XL x YH) ADD A,R6 ;(ZM0+ZN1) MOV R6,A ;Salva ZT1 CLR A ;Borra A ADDC A,B ;(ZM1+acarreo) MOV R5,A ;Salva ZT2 RET
b)
YH YL (x) XH XL ZN2 ZN1 ZN0 (+) ZM2 ZM1 ZM0 ZS3 ZS2 ZS1 ZS0
Fig. 5.6 a) Multiplicacin de un dato de 8 bits (XL) por otro de 16 bits (YH-YL). b) Multiplicacin de dos datos de 16bits (XH-XL y YH-YL)
La subrutina MUL16 multiplica dos datos de 16 bits cada uno. El primer y el segundo operando deben estar ubicados en los registros R0, R1, R2 y R3, donde se sitan XH, XL, YH e YL, respectivamente. La subrutina genera un resultado de 32 bits, ZS0, ZS1, ZS2 y ZS3, que se coloca en los registros R7, R6 , R5 y R4, respectivamente.
;************************************************ ;Subrutina MUL16 (16bits x 16 bit, YH-YL x XH-XL) ;Entrada: R0=XH, R1=XL, R2=YH, R3=YL ;Salida: 32 bits. R7=ZS0, R6=ZS1, R5=ZS2, R4=ZS3 ;Modifica: A, B, Registros R7 a R1 del banco 1 ;************************************************ MUL16: LCALL MUL8_16 ;(XL x YH-YL) SETB RS0 ;Cambia al banco 1 MOV R1,00H ;Lee XH MOV R2,02H ;Lee YH MOV R3,03H ;Lee YL LCALL MUL8_16 ;(XH x YH-YL) CLR C ;Borra acarreo CLR RS0 ;Cambia a banco 0 MOV A,R6 ;Lee ZN1 ADD A,0FH ;(ZN1+ZM0) MOV R6,A ;Salva ZS1 MOV A,R5 ;Lee ZN2 ADDC A,0EH ;(ZN2+ZM1+C) MOV R5,A ;Salva ZS2 CLR A ;Borra A ADDC A,0DH ;(ZM2+C) MOV R4,A ;Salva ZS3 RET
5 El modelo de programacin
107
La subrutina MUL16 utiliza el banco 0 y el banco 1 de registros para almacenar los resultados intermedios de la subrutina MUL8_16. La primera multiplicacin, XL x YH-YL, utiliza el banco 0 de registros y la segunda multiplicacin, XH x YH-YL, utiliza el banco 1 de registros. Se cambia de banco de registros con el bit RS0 del registro de estado PSW. Al final de la subrutina MUL16 se trabaja con los registros del banco 0 y se accede a los registros del banco 1 mediante direccionamiento directo. Para usar la subrutina MUL16 se debe inicializar el puntero de la pila, SP, al menos con una direccin superior a la direccin ms alta del banco 1 de registros, ya que las instrucciones CALL, PUSH y POP escriben en las posiciones apuntadas por este puntero. Se trata de evitar, en consecuencia, que las instrucciones mencionadas escriban accidentalmente sobre el banco 1. El valor del SP se puede modificar fcilmente con la siguiente instruccin: MOV SP,#0FH. La familia MCS-251 dispone de instrucciones de multiplicacin de datos de 2 bytes, de forma que la subrutina MUL16 queda reducida, en la MCS-251, a una simple instruccin: MUL WR0,WR2
Esta instruccin multiplica el contenido de los registros R1 y R0 por el contenido de los registros R3 y R2, y guarda el resultado de 32 bits en los registros R3, R2, R1 y R0. De la misma forma que la expuesta, se pueden realizar subrutinas de multiplicacin de 24x16 bits, 24x24 bits, 32x16 bits y 32x32 bits, dependiendo de las necesidades de la aplicacin que se quiera realizar. La divisin de datos numricos sin signo de 16 bits de longitud se puede efectuar mediante un proceso iterativo en el cual de debe multiplicar el dividendo por 2-i, donde i est comprendido entre 0 y 15, y se debe restar el resultado del divisor (figura 5.7). La primera multiplicacin se realiza para i=15, por lo que desplazan XH y XL 16 bits hacia la derecha, -inicialmente XH est en R0 y XL en R1; luego se copia XH en R2 y XL en R3, y se pone R0 y R1 a cero, con lo que el dividendo pasa a estar formado por los registros R0, R1, R2 y R3, 32 bit en total, o sea, es una multiplicacin por 2-16 -, y se rota el dividendo obtenido una posicin hacia la izquierda, consiguiendo que la multiplicacin sea por 2-15. Posteriormente, se restan los 16 bits altos del dividendo, R0 y R1, con el divisor, es decir:
(dividendo x 2 -i )16 bits altos divisor (dividendo x 2 -i )16 bits altos divisor
En el primer caso se complementa el bit de acarreo y se introduce en el cociente, CH y CL, mediante una rotacin con acarreo hacia la izquierda. En el segundo caso se sustituye XH y XL por el resultado de la resta, en ZH y ZL, se complementa el bit de acarreo y se introduce ste en los registros del cociente.
108
Este proceso se itera 16 veces hasta que i=0, entonces el resto de la divisin, que se halla situado en los mismos registros XH y XL, se coloca en los registros R2 y R3, respectivamente, y el cociente de la divisin (registros CH y CL), se coloca en los registros R0 y R1, respectivamente.
;****************************************************** ;Subrutina DIV16 Divisin de 16 bits (XH-XL)/(YH-YL) ;Entrada: Dividendo: XH=R0 y XL =R1. Divisor: YH=R4 y YL=R5. ;Salida: Cociente: CH=R0 y CL=R1. Resto: ZH=R2 y ZL=R3 ;Modifica: A, R0, R1, R2, R3, R7. Direcc. 08H, 09H, 0AH y 0BH. ;****************************************************** ;Variables temporales: XL EQU 01H ;XL en R1 (dir. directo) XH EQU 00H ;XH en R0 YL EQU 05H ;YL en R5 YH EQU 04H ;YH en R4 CL EQU 09H CH EQU 08H ZL EQU 0BH ZH EQU 0AH DIV16: MOV A,YL ;Lee dividendo ORL A,YH ;Comprueba si ste es cero JNZ DIV_ON ;Si es cero retorna SETB OV ;Pone ante bit OV a 1 RET DIV_ON: MOV R3,XL ; -(XH-XL) x 2-16 MOV R2,XH MOV XL,#0 ;XH=XL=00H MOV XH,#0 MOV CL,#0 ;Cociente MOV CH,#0 ;CH=CL=00H MOV ZL,#0 ;Resto MOV ZH,#0 ;ZH=ZL=00H MOV R7,#16 ;Itera 16 veces BUC_DIV: CLR C LCALL ROTA ;Rota 1 pos. izquierda (2-i ) LCALL SUB16 ;(dividendo x 2-i)16 bits - divisor JC XmenorqY ;si (dividendo x 2-i)16 bits < divisor MOV XL,ZL ;En caso contrario MOV XH,ZH ;XH=ZH, XL=ZL XmenorqY: LCALL ROTAC DJNZ R7,BUC_DIV ;Hasta 16 veces MOV R3,XL ;Divisin finalizada MOV R2,XH ;Pone Resto en R2 y R3. MOV R0,CH ;Pone cociente en R0 y R1. MOV R1,CL CLR OV RET ;****************************************************** ; ROTAC ;****************************************************** ROTAC: CPL C ;Complementa acarreo MOV A,CL ;Rota cociente 1 bit RLC A ;hacia la izquierda MOV CL,A MOV A,CH RLC A MOV CH,A RET
DIV16
divisor=0 NO
SI
OV=1 RET
NO
XH=ZH XL=ZL
SI
Rota Cociente 1 pos. izquierda
R7=0 SI
RET
NO
R7=R7-1
5 El modelo de programacin ;****************************************************************** ;SUB16 -Resta de 16 bits (XH-XL)-(YH-YL) ;Entrada: XH=R0, XL=R1, YH=R2, YL=R3. ;Salida: ZH en 0AH y ZL en 0BH ;****************************************************************** SUB16: CLR C ;Subrutina de resta MOV A,XL ;(XH-XL) - (YH-YL) SUBB A,YL ;Resultado en ZH y ZL MOV ZL,A MOV A,XH SUBB A,YH MOV ZH,A RET ;****************************************************** ; ROTA ;****************************************************** ROTA: MOV A,R3 ;Subrutina de rotacin del RLC A ;dividendo 1 bit hacia la derecha MOV R3,A MOV A,R2 RLC A MOV R2,A MOV A,XL RLC A MOV XL,A MOV A,XH RLC A MOV XH,A RET
109
La familia MCS-251 puede realizar una divisin de 16 bits tan slo con una instruccin: DIV WR0,WR4. Esta instruccin divide el contenido de WR0 por el contenido de WR4, poniendo el cociente resultante en WR2 y el resto en WR0.
110
Luego, si el formato de los datos est en complemento a dos, stos se deben pasar al formato mdulosigno, se debe realizar la multiplicacin o divisin de los operandos y pasar el resultado a complemento a dos. Al considerar el bit de signo de los operandos se observa que el resultado binario de la multiplicacin coincide con la funcin booleana XOR (figura 5.8). La funcin XOR a nivel de bit no existe en las familias MCS-51 y MCS-251; no obstante, esta funcin se puede realizar sencillamente teniendo en cuenta que si a las entradas de la funcin XOR se las denomina a y b, y z a su salida, z es igual a b, z=b, si a es cero y z es igual a b negado, z=/b, si a vale 1 lgico. Multiplicaci n de signos ++ = + +- = -+ = -- = + Multiplicaci n binaria de signos 00 = 0 01 = 1 10 = 1 11 = 0
Fig. 5.8 Multiplicacin binaria de signos
A continuacin se muestra la subrutina MUL16S que realiza la multiplicacin de dos nmeros de 16 bits con signo. Esta subrutina utiliza la subrutina anterior MUL16 para multiplicar en valor absoluto los dos operandos, por lo que MUL16S tendr los mismo registros de entrada y de salida que MUL16. Para determinar el bit de signo resultante de la multiplicacin se utilizan los bits de propsito general F0 y UD del registro de estado PSW, es decir, los bits PSW.5 y PSW.1, que son definibles por el usuario.
;***************************************************** ;Subrutina MUL16S ;Multiplica 16bitsx16bits con signo, (YH-YL)x(XH-XL) ;Entrada: R0=XH, R1=XL, R2=YH, R3=YL. ;Salida: 32 bits. R7=ZS0, R6=ZS1, R5=ZS2, R4=ZS3. ;Modifica: A, B, Registros R7 a R1 del banco 1. ;***************************************************** MUL16S: MOV A,R0 ;Lee XH RLC A ;Rota MOV PSW.5,C ;Guarda bit de signo de X MOV A,R2 ;Lee YH RLC A ;Rota MOV PSW.1,C ;Guarda bit de signo de Y JNB PSW.5,MOD_Y ;X es negativo? CLR C ;Borra acarreo CLR A ;Borra A SUBB A,R1 ;Complemento a 2 XL MOV R1,A ;Guarda XL CLR A ;Borra A SUBB A,R0 ;Complemento a 2 XH MOV R0,A ;Guarda XH MOD_Y: JNB PSW.1,M_ABS ;Y es negativo? CLR C ;Borra acarreo CLR A ;Borra A SUBB A,R3 ;Compl. a 2 de YL MOV R3,A ;Guarda YL CLR A ;Borra A SUBB A,R2 ;Compl. a 2 de YH MOV R2,A ;Guarda YH
5 El modelo de programacin M_ABS: LCALL MOV JNB CPL ES_0: JC RET CPL4: MOV SETB MOV LCALL CLR RET MUL16 C,PSW.5 PSW.1,ES_0 C CPL4 08H,#07 RS0 R7,#4 COMPL2_N RS0 ;Multiplica en valor absoluto ;Funcin XOR de los signos
111
;Resultado negativo ;Carga direcc. ZS0 ;Cambia a banco 1 ;N de bytes de ZS ;Compl. a 2 de ZS ;Cambia a banco 0
La subrutina MUL16S hace uso adems de la subrutina COMPL2_N que realiza el complemento a dos del resultado ZS de 4 bytes, generado por la multiplicacin. Esta subrutina es genrica y utiliza la direccin del operando (puntero @R0) y el tamao del operando (R7) como datos de entrada.
;********************************************** ;Subrutina COMPL2_N ;Realiza el complemento a 2 de un nmero de N bytes ;Entrada: R0 (Puntero a X), R7 (Tamao) ;Salida: Resultado sustituye al operando X ;Modifica: C, A, R0, R7 ;********************************************** COMPL2_N: CLR C BUC_CP: CLR A SUBB A,@R0 MOV @R0,A DEC R0 DJNZ R7,BUC_CP RET
Para la familia MCS-251 la subrutina MUL16S puede ser ms compacta. En este caso, los operandos se sitan dentro de la zona accesible bit a bit, de la 20H a la 2FH de la memoria RAM interna, para poder as acceder fcilmente a los bits de signo de los operandos.
;******************************************************************************** ;Subrutina MUL16S para la familia MCS-251 ;Entrada: XH en 20H, XL en 21H.YH en 22H, YL en 23H. ;Salida: 32 bits. R7=ZS0, R6=ZS1, R5=ZS2, R4=ZS3. Modifica: A, B, Reg. R7 a R1 del banco 1. ;********************************************************************************* MUL16S: JNB 20H.7,SAL1 SUB WR0,20H JMP SIGUE0 SAL1: MOV WR0,20H SIGUE0: JNB 22H.7,SAL2 SUB WR2,22H CPL 20H.7 SAL2: JMP SIGUE1 MOV WR2,22H SIGUE1: MUL WR0,WR2 JNB 20H.7,SIGUE2 SUB DR4,DR0 RET SIGUE2: MOV DR4,DR0 RET
La subrutina siguiente DIV16s realiza divisin con signo de dos nmeros de 16 bits, utilizando para ello la subrutina DIV16; por tanto, tiene los mismos parmetros de entrada y de salida que esta subrutina. En cuanto al resultado, en el caso que el dividendo sea positivo y el divisor sea negativo, y
112
viceversa, el cociente deber ser negativo; si ambos, dividendo y divisor, son positivos o negativos, entonces el cociente debe ser positivo. En cualquier caso, el resto se deja siempre positivo.
;************************************************************** ;Subrutina DIV16S Divisin de 16 bits con signo (XH-XL)/(YH-YL) ;Entrada: Dividendo: XH=R0 y XL =R1. Divisor: YH=R4 y YL=R5 ;Salida: Cociente: CH=R0 y CL=R1. Resto: ZH=R2 y ZL=R3 ;Modifica: A, R0, R1, R2, R3, R7. Direcc. 08H, 09H, 0AH, 0BH, 20H y 21H ;************************************************************** DIV16S: MOV 20H,R0 ;Pone XH en 20H MOV 21H,R4 ;Pone YH en 21H JNB 20H.7,MOD_Y ;X es negativo? SETB RS0 ;Cambio a banco 1 MOV R0,#01H ;Carga dir. XL en puntero R0 MOV R7,#2 ;N de bytes LCALL COMPL2_N ;Complementa a 2 MOD_Y: JNB 21H.7,M_ABS ;Y es negativo? MOV R0,#03H ;Carga dir. YL en puntero R0 MOV R7,#2 ;N de bytes CLR RS0 ;Cambio a banco 0 M_ABS: LCALL DIV16 ;Divisin en valor absoluto JB OV,SALIR JB 20H.7,DIVDN ;Si dato X es negativo JB 21H.7,CPLDIV ;Si dato Y es negativo SALIR: RET ;Dato X y dato Y son positivos DIVDN: JNB 21H.7,CPLDIV ;Si dato Y es positivo RET ;Dato X y dato Y son negativos CPLDIV: SETB RS0 ;Cambio a banco 1 MOV R0,#01H ;Carga dir. cociente MOV R7,#2 ;N de bytes LCALL COMPL2_N ;Complementa a 2 CLR RS0 ;Cambio a banco 0 RET
5 El modelo de programacin
113
5.10.1 Generacin de una seal cuadrada En un sistema es frecuente tener que generar una seal peridica de frecuencia determinada y lo ms simtrica posible. En este ejemplo, se propone la creacin de una seal cuadrada de 5kHz de frecuencia, que se extraer por la patilla P1.0 de un microcontrolador 8031 (figura 5.9). Para generar una frecuencia de 5kHz se precisa de un periodo de 200 s y, por tanto, cambiar el estado de la patilla P1.0 cada 100s. Para cambiar el estado de P1.0 se utilizar la instruccin CPL de complemento de un bit, y para generar un retardo de 100 s se utilizar una rutina de retardo como la descrita en el apartado 5.4. 8031
;*************************************************** ; Programa de generacin de una seal cuadrada ;*************************************************** ORG 0H LJMP Principal ;*************************************************** ; Rutina Principal ;*************************************************** ORG 0100H Principal: CPL P1.0 ;Complementa el estado lgico de P1.0 CALL Retardo ;Llama a la rutina de retardo SJMP Principal ;Bucle infinito a principal Retardo: MOV R7, #46 ;Pone 46 en R7 L1: DJNZ R7, L1 ;Bucle sobre L1 RET ;Retorno de subrutina
P1.0
T/2
T (200S)
Fig. 5.9 Generacin de una seal cuadrada con el microcontrolador
Para que la instruccin CPL se ejecute cada 100 s, se debe determinar de forma precisa el valor de carga del registro R7 de la subrutina de retardo. Para ello, si se considera que la frecuencia de reloj del microcontrolador es de 12MHz y que, entonces, un ciclo mquina tarda en efectuarse 1 s, y que la
114
instruccin CPL se ejecuta en 1 ciclo mquina, indicado como CM, la instruccin CALL se ejecuta en 2 CM, SJMP en 2 CM, MOV R7, #46 en 1CM, DJNZ en 2CM y RET en 2 CM. El tiempo de ejecucin de la rutina de retardo viene dado por:
t Re t 1 2 R 7 2 CM
Y el tiempo total en que se ejecuta la instruccin CPL a cada vuelta del bucle principal es: t CPL 1 2 2 t Re t 100CM 100s Se deduce que tRet debe valer 95 s, y que el registro R7 debe valer 46. El programa realizado se puede modificar para efectuar el parpadeo de un diodo led conectado por medio de un transistor al microcontrolador (fig 5.10). La resistencia R1 debe calcularse para limitar la corriente del diodo led a unos 20mA, valor ms que suficiente para mantener al diodo encendido de manera adecuada.
Vcc R1
80C31
VTH R2 P1.0 VCE LED
La resistencia R2 se debe determinar para que el transistor entre en saturacin cuando la salida de P1.0 est a 1 lgico. La rutina modificada se muestra a continuacin:
;***************************************** ; Programa de parpadeo de un diodo led ;***************************************** ORG 0H LJMP Principal ;***************************************** ; Rutina Principal ;***************************************** ORG 0100H Principal: CPL P1.0 MOV R6, #0 MOV R7, #0 Retardo: DJNZ R6, Retardo DJNZ R7, Retardo SJMP Principal
El tiempo que tarda en ejecutarse la rutina de retardo, bucle formado por L1, deber ser suficiente para que el parpadeo del led sea perceptible. Este tiempo es: t L1 [2 (255 1) 2] (255 1) 131584s 0,13s La frecuencia de la seal cuadrada ser en este caso de 3,8Hz, aproximadamente.
5 El modelo de programacin
115
5.10.2 Conexin de teclas al microcontrolador Las teclas o pulsadores son elementos que aparecen en la mayor parte de los sistemas basados en un microcontrolador, por lo que en este ejemplo se propone la conexin de teclas a cada uno de los puertos del microcontrolador, tal y como indica la figura 5.11.
Vcc
87C31
T1 T2 T3 T4 T5 P1.0 P1.1 P2.0 P2.1 P3.0 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 P0.0
R T6
74LS05/06
Vcc R
LED
Vcc
VCE
En la figura 5.11 se emplea el circuito integrado 74LS05, o el 74LS06, que contiene hasta 6 puertas inversoras en colector abierto. El terminal de salida de la puerta inversora es el colector de un transistor interno, cuyo emisor est conectado a masa, tal y como se ve en el detalle de esta figura. La puerta inversora puede soportar una corriente mxima de 25mA, para el 74LS05, y de 30mA a 40mA, para el 74LS06, valores ms que suficientes para encender de manera adecuada el diodo led que tiene conectado. La resistencia R se debe calcular de forma adecuada para que, considerando el valor de Vcc, de la tensin umbral del diodo led, VTH, y de la tensin colector-emisor del transistor en saturacin, VCE, la corriente i est limitada a unos 20mA, valor ms que suficiente para iluminar adecuadamente el diodo led. El valor de la resistencia R se puede determinar a partir de la siguiente ecuacin: R VCC VTH VCE i (5.1)
Los puertos P1, P2 y P3 (figura 3.4 del captulo 3) tienen una resistencia interna de pull-up conectada a cada una de las salidas, por lo que una tecla se puede conectar directamente a la patilla de uno de estos puertos. Debido a la resistencia de pull-up, el estado de una tecla no pulsada ser de 1 lgico y el estado de una tecla pulsada ser de 0 lgico (conexin directa a masa -fig. 5.12-), por lo que basta con leer el estado lgico del terminal del puerto para saber si la tecla est siendo pulsada o no. El puerto P0 de la MCS-51 no tiene resistencia interna de pull-up y en su lugar hay un transistor NMOS, debido a que este puerto debe tener la caracterstica de triestado. Por ello, para conectar una
116
tecla se debe poner una resistencia externa de pull-up, que proporcione un estado 1 lgico, cuando no se pulsa la tecla, y un estado 0 lgico, cuando se pulsa la tecla.
Puertos P1, P2 y P3
Vcc Pull-up
Vcc
Puerto P0
VDD
El programa deber leer el estado de las teclas y encender un diodo led asociado a la tecla, en el caso de que se pulse. El diodo led se mantendr encendido mientras la tecla permanezca pulsada. Las instrucciones CLR que se utilizan para borrar los leds pueden sustituirse por una nica instruccin que escriba en todo el puerto P1. Para ello, se debe tener en cuenta que hay dos teclas conectadas a P1.0 y P1.1, respectivamente; deben ponerse estos terminales a 1 lgico, de forma que sea posible leer si la tecla ha sido pulsada o no.
;****************************************************************** ; Programa para la lectura de la teclas del circuito de la figura 5.11 ;****************************************************************** ORG 0H MOV P1, #0000 0011b ;Leds apagados. P1.0 y P1.1 como entradas LJMP Principal ;****************************************************************** ; Rutina Principal (Testeo de teclas y encendido/ apagado de leds) ;****************************************************************** ORG 0100H Principal: JNB P1.0, Tecla_T1 ;Comprueba si se ha pulsado T1 JNB P1.1, Tecla_T2 ;Comprueba si se ha pulsado T2 JNB P2.0, Tecla_T3 ;Comprueba si se ha pulsado T3 JNB P2.1, Tecla_T4 ;Comprueba si se ha pulsado T4 JNB P3.0, Tecla_T5 ;Comprueba si se ha pulsado T5 JNB P0.0, Tecla_T6 ;Comprueba si se ha pulsado T6 CLR P1.2 ;Apaga led conectado a P1.2 CLR P1.3 ;Apaga led conectado a P1.3 CLR P1.4 ;Apaga led conectado a P1.4 CLR P1.5 ;Apaga led conectado a P1.5 CLR P1.6 ;Apaga led conectado a P1.6 CLR P1.7 ;Apaga led conectado a P1.7 SJMP Principal Tecla_T1: MOV P1, #0000 0111b ;Enciende led de P1.2 y apaga el resto SJMP Principal ;Regresa a Principal Tecla_T2: MOV P1, #0000 1011b ;Enciende led de P1.3 y apaga el resto SJMP Principal ;Regresa a Principal Tecla_T3: MOV P1, #0001 0011b ;Enciende led de P1.4 y apaga el resto SJMP Principal ;Regresa a Principal Tecla_T4: MOV P1, #0010 0011b ;Enciende led de P1.5 y apaga el resto SJMP Principal ;Regresa a Principal Tecla_T5: MOV P1, #0100 0011b ;Enciende led de P1.6 y apaga el resto SJMP Principal ;Regresa a Principal
5 El modelo de programacin Tecla_T6: MOV P1, #1000 0011b SJMP Principal ;Enciende led de P1.7 y apaga el resto ;Regresa a Principal
117
Se puede escribir sobre todo el puerto P1, sustituyendo a las instrucciones CLR P1.X, con la siguiente instruccin MOV:
MOV P1, #0000 0011b ;Bits P1.0 y P1.1 a 1 lgico
La rutina principal lee el estado de cada tecla y apaga los leds conectados al puerto P1. Si se pulsa una tecla, se enciende el diodo led asociado y se salta a la etiqueta Principal, de forma que el led se mantiene encendido mientras se pulse la tecla. Al dejar de pulsar la tecla el programa apaga todos los leds. 5.10.3 Conexin de un dgito de 7 segmentos Los dgitos de visualizacin se usan de manera frecuente para indicar al usuario una determinada informacin. Los dgitos suelen estar formados por 7 segmentos o por 16 segmentos (hexadecimales), aunque existen en el mercado una gran variedad y gama de dgitos a disposicin del diseador. Los dgitos de 7 segmentos son adecuados para visualizar nmeros y algunas letras y smbolos, estos ltimos con poca definicin (figura 5.13). Los dgitos hexadecimales estn formados por 16 diodos led, por lo que tienen una mejor definicin para nmeros, letras y smbolos.
7 segmentos
a f g e c d DP a b c d e f g
DP
16 segmentos
nodo comn
Ctodo comn
DP
En este ejemplo se conectan tres teclas y un dgito de 7 segmentos al microcontrolador (figura 5.14). El programa debera leer el estado de las teclas y poner en el dgito la letra A si se pulsa la tecla T1, la letra b si se pulsa la tecla T2, y la letra C si se pulsa la tecla T3.
87C31
T1 T2 T3 P1.0 P1.1 P1.2 e P2.7
DP
74LS05/06
a b
P2.0 P2.1
Vcc VTH
Vcc i b c LED R
En la conexin se utiliza, del mismo modo que el ejemplo anterior, un par de circuitos integrados 74LS05 74LS06 que contienen hasta 6 puertas inversoras en colector abierto. El dgito utilizado es
118
de nodo comn, el nodo est conectado a la tensin de alimentacin, Vcc, y cada diodo a una resistencia y a un colector del circuito integrado. La resistencia se debe calcular para que limite la corriente a un valor mximo de 20mA. El programa de este ejemplo se muestra a continuacin:
;******************************************************** ; Programa para la conexin de un dgito de 7-segmentos ;******************************************************** ORG 0H MOV P2, #0 ;Apaga todos los leds del dgito LJMP Principal ;******************************************************* ; Rutina Principal ;******************************************************* ORG 0100H Principal: JNB P1.0, Tecla_T1 ;Comprueba si se ha pulsado T1 JNB P1.1, Tecla_T2 ;Comprueba si se ha pulsado T2 JNB P2.0, Tecla_T3 ;Comprueba si se ha pulsado T3 MOV P2, #0 ;Borra el dgito SJMP Principal Tecla_T1: MOV P2, #0111 0111b ;Pone letra A en el dgito SJMP Principal ;Regresa a Principal Tecla_T2: MOV P2, #0111 1100b ;Pone la letra b en el dgito SJMP Principal ;Regresa a Principal Tecla_T3: MOV P2, #0011 1001b ;Pone la letra C en el dgito SJMP Principal ;Regresa a Principal
5.10.4 Conexin de un teclado matricial de 4 x 4 teclas Los teclados son un elemento imprescindible en un sistema debido a que posibilitan la relacin entre ste y el usuario al permitir la introduccin de datos y la seleccin de diferentes modos de operacin del programa, cuando la aplicacin es compleja. La figura 5.15 muestra la conexin de un teclado matricial de 4x4 teclas al puerto P1 de un 87C31. Existe una enorme variedad y diferentes tipos de teclados en el mercado; no obstante la disposicin de las teclas en stos suele ser matricial, disposicin del tipo fila/columna, de manera que una serie de teclas comparten una misma columna y otra serie de teclas comparte la misma fila (figura 5.15).
87C31 P1.0 P1.1 P1.2 P1.3 R
DP
P2.0
Vcc
1 4 7 A
2 5 8 0
3 6 9 B
C D E F
P1.4 P1.5 P1.6 P1.7
P2.7
5 El modelo de programacin
119
La conexin del teclado con el microcontrolador resulta sencilla, pues utiliza los cuatro bits bajos de P1 como salidas conectadas a las columnas del teclado, y los cuatro bits altos como entradas conectadas a las filas del teclado. En este ejemplo se conecta un dgito de 7 segmentos para que se muestre un carcter determinado, correspondiente a la tecla pulsada. El programa deber efectuar la lectura del teclado matricial de manera continua. Cuando se pulse una tecla, se mostrar el carcter que tiene asociado la tecla en el dgito de 7 segmentos. En el dgito siempre se mostrar el cdigo de la ltima tecla pulsada. La deteccin de una tecla pulsada en el teclado matricial se realizar columna a columna, de forma secuencial, es decir, se pondr un dato en las columnas del teclado (patillas P1.0, P1.1, P1.2 y P1.3), que habilite slo una de las columnas, y se leer a continuacin el estado lgico de las filas del teclado (patillas P1.4, P1.5, P1.6 y P1.7), de manera que si se ha pulsado una tecla se detectar mediante el dato ledo en la filas. Tras haberse comprobado la columna, sta se inhabilitar y se proceder a habilitar la siguiente columna; este proceso se repetir hasta que se hayan testeado todas las columnas del teclado. Este procedimiento se debe repetir de forma continuada, comprobando cada una de las columnas del teclado matricial. Tal y como se ha conectado el teclado matricial al microcontrolador, la habilitacin de una columna se hace poniendo un 0 lgico en una de las patillas de salida de P1, o sea, P1.0, P1.1, P1.2 P1.3, y se inhabilita poniendo un 1 lgico. Luego, una columna estar habilitada, mientras el resto no. Si se pulsa una tecla de la columna habilitada, el estado lgico de la columna, 0 lgico, pasar a una de las filas, dependiendo de cul haya sido la tecla pulsada. En cambio, si no se pulsa ninguna tecla, el estado lgico que se lee es un 1 lgico, puesto que los terminales P1.4, P1.5, P1.6 y P1.7 estn configurados como entradas, es decir, su transistor NMOS (figura 3.4 del captulo 3) est en corte y el estado lgico que se lee corresponde al que proporciona la resistencia interna de pull-up. Sin embargo, en esta situacin, si se pulsa una tecla correspondiente de una columna inhabilitada, en la fila correspondiente se lee un 1 lgico, debido a que el estado de la columna es 1 lgico por estar inhabilitada. En definitiva, para habilitar la primera columna (teclas 1, 4, 7 y A) y inhabilitar el resto de columnas, se debe escribir en el puerto el dato 1111 1110b y configurar, adems, las patillas conectadas a las filas como entradas (estado 1 lgico, transistor NMOS en corte). Para habilitar la segunda columna, (teclas 2, 5, 8 y 0) e inhabilitar el resto, se debe poner 1111 1101b en P1. Para habilitar la tercera columna (teclas 3, 6, 9 y B) e inhabilitar el resto, se debe poner 1111 1011b en P1. Y, por ltimo, para habilitar la cuarta columna (teclas C, D, E y F) e inhabilitar el resto, se debe poner 1111 0111b en P1. El programa deber llevar a cabo la secuencia descrita de testeo por medio de un bucle infinito. Adems, tambin se utilizar una tabla para hacer la conversin a 7 segmentos del carcter que se quiere visualizar.
;****************************************************************** ; Programa de lectura de teclado matricial ;****************************************************************** ORG 0H MOV P2, #0 ;Apaga todos los leds del dgito MOV B, #0 ;Borra registro B LJMP Principal
120
Microcontroladores MCS-51 y MCS-251 ;****************************************************************** ; Rutina Principal ;****************************************************************** ORG 0100H Principal: MOV P1, #1111 1110b ;Habilita la primera columna CALL Det_tecla ;Subrutina de deteccin de tecla pulsada JNZ A, Colum_1 ;A 0 si se pulsa tecla MOV P1, #1111 1101b ;Habilita la segunda columna CALL Det_tecla JNZ A, Colum_2 ; A 0 si se pulsa tecla MOV P1, #1111 1011b ;Habilita la tercera columna CALL Det_tecla JNZ A, Colum_3 ; A 0 si se pulsa tecla MOV P1, #1111 0111b ;Habilita la cuarta columna CALL Det_tecla JNZ A, Colum_4 ; A 0 si se pulsa tecla Prin2: CALL Display MOV B, #0 ;Borra el registro B SJMP Principal ;Bucle infinito Colum_1: JNB P1.4, Tecla_1 ;Se ha pulsado la tecla 1? JNB P1.5, Tecla_4 ;Se ha pulsado la tecla 4? JNB P1.6, Tecla_7 ;Se ha pulsado la tecla 7? SJMP Tecla_A ;Si no es ninguna de la anteriores, es la tecla A Colum_2: JNB P1.4, Tecla_2 ;Se ha pulsado la tecla 2? JNB P1.5, Tecla_5 ;Se ha pulsado la tecla 5? JNB P1.6, Tecla_8 ;Se ha pulsado la tecla 8? SJMP Tecla_0 ;Si no es ninguna de la anteriores, es la tecla 0 Colum_3: JNB P1.4, Tecla_3 ;Se ha pulsado la tecla 3? JNB P1.5, Tecla_6 ;Se ha pulsado la tecla 6? JNB P1.6, Tecla_9 ;Se ha pulsado la tecla 9? SJMP Tecla_B ;Si no es ninguna de la anteriores, es la tecla B Colum_4: JNB P1.4, Tecla_C ;Se ha pulsado la tecla C? JNB P1.5, Tecla_D ;Se ha pulsado la tecla D? JNB P1.6, Tecla_E ;Se ha pulsado la tecla E? SJMP Tecla_F ;Si no es ninguna de la anteriores, es la tecla F Tecla_0: MOV B, #1 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_1: MOV B, #2 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_2: MOV B, #3 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_3: MOV B, #4 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_4: MOV B, #5 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_5: MOV B, #6 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_6: MOV B, #7 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_7: MOV B, #8 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_8: MOV B, #9 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_9: MOV B, #10 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_A: MOV B, #11 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_B: MOV B, #12 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_C: MOV B, #13 ;Pone en B cdigo para la lectura de tabla LJMP Prin2
121
MOV B, #14 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_E: MOV B, #15 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 Tecla_F: MOV B, #16 ;Pone en B cdigo para la lectura de tabla LJMP Prin2 ;********************************************************************** ; Subrutina para la detecccin de una tecla pulsada ; Lee el puerto P1 y retorna A=0 si no se pulsa una tecla y A 0 si se pulsa ;********************************************************************** Det_tecla: MOV A, P1 ;Lee puerto P1 (filas) ORL A, #0FH ;Fuerza 4 bits bajos a 1 lgico CPL A ;Complementa acumulador RET ;Si no se pulsan teclas A=0, A=1 en caso contrario ;********************************************************************** ; Subrutina de visualizacin de un caracter en el dgito de 7-segmentos ;********************************************************************** Display: MOV A, B ;Lee registro B CALL Vis_7seg ;Llama a la subrutina que pone el carcter de 7 segmentos MOV P2, A ;Pone el en P2, visualiza RET Vis_7seg: INC A ;Incrementa acumulador MOVC A, @A+PC ;Lectura de tabla de conversin RET DB 0000 0000b ;(A=1) dgito apagado. DB 0011 1111b ;(A=2) leds a, b, c, d, e y f encendidos, caracter 0 DB 0000 0110b ;(A=3) leds a y b encendidos, caracter 1. DB 0101 1011b ;(A=4) leds a, b, d, e y g encendidos, caracter 2. DB 0100 1111b ;(A=5) leds a, b, c, d y g encendidos, caracter 3 (A=0). DB 0110 0110b ;(A=6) leds b, c, f y g encendidos, caracter 4. DB 0110 1101b ;(A=7) leds a, c, d, f, y g encendidos, caracter 5. DB 0111 1101b ;(A=8) leds a, c, d, e, f y g encendidos, caracter 6. DB 0000 0111b ;(A=9) leds a, b y c encendidos, caracter 7. DB 0111 1111b ;(A=10) leds a, b, c, d, e, f, y g encendidos, caracter 8. DB 0110 0111b ;(A=11) leds a, b, c, f y g encendidos, caracter 9. DB 0111 0111b ;(A=12) leds a, b, c, e, f y g encendidos, caracter A. DB 0111 1100b ;(A=13) leds c, d, e, f y g encendidos, caracter b. DB 0011 1001b ;(A=14) leds a, d, e y f encendidos, caracter C DB 0101 1110b ;(A=15) leds b, c, d, e y g encendidos, caracter d DB 0111 1001b ;(A=16) leds a, d, e, f y g encendidos, caracter E DB 0111 0001b ;(A=17) leds a, e, f y g encendidos, caracter F.
5.10.5 Conexin de varios dgitos de 7 segmentos, aplicacin de Su turno La figura 5.16 muestra la forma de conectar varios dgitos de 7 segmentos a un 87C51 para una aplicacin donde se desea controlar el turno de atencin a un cliente, que es tan comn en tiendas y locales comerciales. Debido al tipo de aplicacin donde se ha de visualizar el nmero de orden del cliente, los dgitos se pueden controlar mediante el circuito integrado 4511, que es un conversor de formato BCD a 7 segmentos, de forma que colocando el nmero en BCD a la entrada del 4511, A0A3, ste activa los leds necesarios (salidas a, b, c, d, e, f, g y dp) para que el nmero aparezca en el dgito. El 4511 es capaz de suministrar hasta 25mA de corriente, valor ms que suficiente para tener un diodo led encendido de forma adecuada. Este circuito integrado tiene un latch interno que le permite almacenar el valor del ltimo nmero almacenado. El latch est gobernado por la entrada /EL, de manera que cuando /EL est a 0 lgico habilita el 4511 y activa los leds correspondientes al nmero
122
de entrada (A0-A3), y cuando en /EL se produce un flanco positivo (paso de 0 a 1 lgico), el latch almacena el ltimo dato presente en la entrada y mantiene encendidos los leds correspondientes.
87C51
Cuenta
T1
Ctodo comn
Centenas a Decenas Unidades
R
dp
Tr1 Rb Rb
Tr2
Tr3
Reset
T2
El 4511 dispone de dos entradas de control adicionales, /ILT y /IB. La entrada /ILT enciende todos los leds del dgito conectado, para hacer as un chequeo del estado de los leds. La entrada /IB borra todos los leds del dgito conectado. En esta aplicacin se usar un microcontrolador 8751, el 4511, tres dgitos de 7 segmentos y tres transistores para controlar el encendido de cada uno de los dgitos. Por sencillez, las entradas /ILT y /IB del 4511 no se usarn, y la entrada /EL se conectar directamente a tierra, de forma que est siempre habilitado. El circuito formado por el 4511, un dgito conectado a ste (centenas) y el transistor de control de encendido del dgito, Tr1, se muestran en la figura 5.17. El 4511 tiene un transistor bipolar de salida, Tr0, conectado a la tensin de alimentacin Vcc. El 4511 enciende un diodo led, por ejemplo el led a de la figura 5.17, cuando el transistor bipolar Tr0 est en saturacin, de forma que la corriente circula a travs de la resistencia R, del diodo led a y del transistor Tr1. El diodo se encender siempre y cuando el transistor Tr1 est en saturacin.
Vcc 4511 (BCD-7seg)
A0 A1 A2 a b
Tr0 R
a Centenas
ia
R a b
A3
/EL
dp
R
dp
ib ia
Tr1 Tr1
Rb P1.4
Fig. 5.17 Detalle del circuito para la activacin del diodo led a
5 El modelo de programacin
123
Las salidas del 4511 estn conectadas a los diodos de cada segmento, es decir, la salida que activa el diodo led a del dgito de las centenas, tambin est conectada al led a del dgito de las decenas y del dgito de las unidades. De esta forma, se simplifica el circuito y se reduce el nmero de terminales necesarios para los tres dgitos. En cuanto al consumo, debe considerarse que un dgito puede llegar a consumir hasta 160mA (8 diodos led y 20mA por diodo), por tanto, con tres dgitos se puede llegar a un consumo de 480mA, y si el nmero de dgitos es mayor el consumo de corriente se dispara considerablemente. Para evitar el consumo excesivo por parte de los dgitos y para utilizar el circuito realizado, los dgitos se deben encender de manera secuenciada, es decir, primero se enciende el dgito de las centenas, luego el dgito de las decenas y, por ltimo, el dgito de las unidades. Esta secuencia se puede llevar a cabo por medio de la activacin de los transistores conectados al ctodo comn de cada dgito (transistores Tr1, Tr2 y Tr3, respectivamente -fig. 5.18-). Esta secuencia se debe repetir con una frecuencia de 25Hz, como mnimo, para que el parpadeo no sea perceptible por una persona y que la imagen se visualice de manera correcta.
Dgito 1 Dgito 2 T/3 Dgito 2 Dgito 2 T/3 Dgito 3
P1.4
T/3
P1.5
T/3
Dgito 3
P1.6
T
T/3
T/3
Fig. 5.18 Secuencia de encendido de los dgitos del circuito de la figura 5.16
Los transistores TR1, Tr2 y Tr3 pueden ser cualquier tipo de transistor capaz de soportar como mnimo 200mA. Para el caso de un nmero elevado de dgitos se pueden emplear arrays de transistores drlintongs como los disponibles en los circuitos integrados de las series ULN2800A y ULN2980A, capaces de soportar corrientes de 350mA y 500mA. Las funciones bsicas que deber realizar el programa son: 1. 2. Controlar hasta un mximo de 199 peticiones. Cuando la cuenta exceda esta cantidad se deber poner a 000. Se tienen 2 pulsadores, uno de cuenta y otro de reset (de puesta a cero). El pulsador de cuenta siempre incrementar en uno el turno actual. El pulsador de reset pondr a 000 el valor de la cuenta.
La manera ms sencilla de hacer este programa consiste en realizar una rutina de cuenta en formato BCD, como la rutina CONTA descrita en el apartado 5.6. En esta rutina intervienen los registros R0, R1 y R2. El registro R0 se emplea para las unidades, R1 para las decenas y R2 para las centenas. El flujograma del programa se muestra en la figura 5.19.
124
;********************************************* ; Programa para la gestin del turno de espera ;********************************************* ORG 0H MOV P1, #0 ;Pone a cero la entrada del 4511 SUTURNO MOV R0, #0 ;Pone en corte Tr1, Tr2 y Tr3 MOV R1, #0 MOV R2, #0 Inicializaci n ;********************************************** ; Rutina Principal ;********************************************** Principal: JNB P2.0, Cuenta Rutina SI JNB P2.1, PaCero P2.0=0 contador Prin2: CALL Display SJMP Principal NO Cuenta: CALL CONTA SJMP Prin2 SI PaCero: MOV R0, #0 Rutina P2.1=0 MOV R1, #0 puesta a cero MOV R2, #0 NO SJMP Prin2 ;************************************************ ;Subrutina CONTA Refresca ;Registros afectados: R0, R1, R2 dgitos ;************************************************ Fig. 5.19 CONTA: CJNE R0, #9, UNIDAD ;Compara unidad CJNE R1, #9, DECENA ;Compara decena CJNE R2, #1, CENTENA ;Compara centena MOV R0, #0 ;Al ser 199 pone a 000 ;*********************************** MOV R1, #0 ;Subrutina de retardo RETA MOV R2, #0 ;(Retardo de 2+(2*256+2)*12+2= 6172 s) RET ;*********************************** UNIDAD: INC R0 ;Incrementa unidades RETA: MOV R7, #12 RET Buc2: MOV R6, #0 DECENA: MOV R0, #0 ;Pone a 0 las unidades Buc1: DJNZ R6, Buc1 INC R1 ;Incrementa decenas DJNZ R7, Buc2 RET RET CENTENA: MOV R0, #0 ;Pone a 0 unidades y decenas MOV R1, #0 INC R2 ;Incrementa centenas RET ;************************************************************************** ;Subrutina Display (Muestra en los dgitos el valor de la cuenta ;Registros afectados: R0, R1, R2 ;************************************************************************** Display: MOV P1, R2 ;Pone centenas en P1 (4 bits altos de R2 son cero) SETB P1.4 ;Enciende dgito centenas. Tr1 en conduccin CALL RETA ;Realiza un retardo (tiempo de encendido de dgito) CLR P1.4 ;Apaga dgito centenas. Tr1 en corte MOV P1, R1 ;Pone decenas en P1 (4 bits altos de R1 son cero) SETB P1.5 ;Enciende dgito decenas. Tr2 en conduccin CALL RETA ;Realiza un retardo (tiempo de encendido de dgito) CLR P1.5 ;Apaga dgito decenas. Tr2 en corte MOV P1, R0 ;Pone unidades en P1 (4 bits altos de R0 son cero) SETB P1.6 ;Enciende dgito unidades. Tr3 en conduccin CALL RETA ;Realiza un retardo (tiempo de encendido de dgito) CLR P1.6 ;Apaga dgito unidades. Tr3 en corte RET
Cada uno de los dgitos se enciende durante un tiempo de 6172s, aproximadamente (suponiendo un reloj de 12MHz). Por tanto, el nmero se muestra cada 6172*3s, lo que supone una frecuencia de
5 El modelo de programacin
125
refresco del nmero visualizado de 54Hz, aproximadamente. Esta frecuencia puede ser superior, puesto que se tiene una limitacin de frecuencia mnima, pero no en cuanto a frecuencia mxima. Luego, la frecuencia de refresco de todos los dgitos puede ser de 100Hz o de 1kHz, con la nica limitacin del ancho de banda de los transistores Tr1, Tr2 o Tr3 y del 4511. 5.10.6 Contador de piezas Con una pequea modificacin del circuito y del programa anterior se puede realizar un contador de piezas para una mquina en un proceso industrial (figura 5.20). En esta aplicacin se dispone de dos sensores que se simbolizan por una caja con un conmutador. Un sensor indica cundo se ha producido una pieza y el otro indica cundo el proceso posterior de control de calidad descarta una pieza defectuosa. Por tanto, el contador muestra siempre el nmero neto de piezas fabricadas.
Vcc Sensor Cuenta
87C51
P1.0 P2.0 P1.1 P1.2
Ctodo comn
Millares a Centenas Decenas Unidades
Vcc
P1.3
R
dp
Alarma P2.4
P1.7
Al circuito anterior se le ha aadido un dgito ms, por lo que la cuenta puede llegar hasta 9999 piezas. Si el nmero de piezas llega a su mximo valor y se rebasa ste, por un pulso ms recibido, el contador debe mostrar el nmero mximo de 9999 y activar la seal de alarma conectada a la patilla P2.4 del microcontrolador. Si el contador est a 0000 y recibe un pulso del sensor de descuenta, se activar tambin la seal de alarma conectada a P2.4, para indicar un mal funcionamiento del sensor o al error en el proceso de control de calidad.
;********************************************************************** ; Programa para el contador de piezas ;********************************************************************** ORG 0H MOV P1, #0 ;Pone a cero la entrada del 4511. Pone en corte Tr1, Tr2, Tr3 y Tr4 MOV R0, #0 ;Pone a cero los registros de cada dgito MOV R1, #0 MOV R2, #0 MOV R3, #0 CLR P2.4 ;Pone P2.4 a cero, para no activar la alarma ;********************************************************************** ; Rutina Principal ;********************************************************************** Principal: JNB P2.0, Cuenta JNB P2.1, Descuenta JNB P2.2, PaCero Prin2: CALL Display SJMP Principal
126
Cuenta:
Microcontroladores MCS-51 y MCS-251 CALL CONTA SJMP Prin2 Descuenta: CALL DECRE SJMP Prin2 ;*********************************************************** ;Rutina PaCero ;*********************************************************** MOV R0, #0 ;Borra unidades MOV R1, #0 ;Borra decenas MOV R2, #0 ;Borra centenas MOV R3, #0 ;Borra millares CLR P2.4 ;Borra alarma SJMP Prin2 ;*********************************************************** ;Rutina CONTA ;Registros afectados: R0, R1, R2, R3 ;*********************************************************** CONTA: CJNE R0, #9, Unidad ;Compara unidad CJNE R1, #9, Decena ;Compara decena CJNE R2, #9, Centena ;Compara centena CJNE R3, #9, Millar ;Compara millar SETB P2.4 ;Activa la alarma RET Unidad: INC R0 ;Incrementa unidades RET Decena: MOV R0, #0 ;Pone a 0 las unidades INC R1 ;Incrementa decenas RET Centena: MOV R0, #0 ;Pone a 0 unidades y decenas MOV R1, #0 INC R2 ;Incrementa centenas RET Millar: MOV R0, #0 ;Pone a 0 unidades, decenas y centenas MOV R1, #0 MOV R2, #0 INC R3 ;Incrementa millares RET ;********************************************************** ;Rutina DECRE ;Registros afectados: R0, R1, R2 y R3 ;********************************************************** DECRE: CJNE R0, #0, D_uni ;Compara unidad CJNE R1, #0, D_dece ;Compara decena CJNE R2, #0, D_cent ;Compara centena CJNE R3, #0, D_mill ;Compara millar SETB P2.4 ;Activa la alarma RET D_uni: DEC R0 ;Decrementa unidad RET D_dece: MOV R0, #9 ;Pone a 9 unidad DEC R1 ;Decrementa decena RET D_cent: MOV R0, #9 ;Pone a 9 unidad MOV R1,#9 ;Pone a 9 decena DEC R2 ;Decrementa centena RET D_mill: MOV R0, #9 ;Pone a 9 unidad MOV R1,#9 ;Pone a 9 decena MOV R2,#9 ;Pone a 9 centena DEC R3 ;Decrementa millar RET
5 El modelo de programacin ;******************************************************************* ;Subrutina Display (Muestra en los dgitos el valor de la cuenta ;Registros afectados: R0, R1, R2 y R3 ;******************************************************************* Display: MOV P1, R3 ;Pone millares en P1 (4 bits altos de R3 son cero) SETB P1.4 ;Enciende dgito millares. Tr1 en conduccin CALL RETA ;Realiza un retardo (tiempo de encendido de dgito) CLR P1.4 ;Apaga dgito millares. Tr1 en corte MOV P1, R2 ;Pone centenas en P1 (4 bits altos de R2 son cero) SETB P1.5 ;Enciende dgito centenas. Tr2 en conduccin CALL RETA ;Realiza un retardo (tiempo de encendido de dgito) CLR P1.5 ;Apaga dgito centenas. Tr2 en corte MOV P1, R1 ;Pone decenas en P1 (4 bits altos de R1 son cero) SETB P1.6 ;Enciende dgito decenas. Tr3 en conduccin CALL RETA ;Realiza un retardo (tiempo de encendido de dgito) CLR P1.6 ;Apaga dgito decenas. Tr3 en corte MOV P1, R0 ;Pone unidades en P1 (4 bits altos de R0 son cero) SETB P1.7 ;Enciende dgito unidades. Tr4 en conduccin CALL RETA ;Realiza un retardo (tiempo de encendido de dgito) CLR P1.7 ;Apaga dgito unidades. Tr4 en corte RET ;************************************************************* ;Subrutina de retardo RETA (Retardo de 1+2*123+2= 251 s) ;************************************************************* RETA: MOV R7,#125 Buc1: DJNZ R7, Buc1 RET
127
En este caso cada dgito se enciende durante 251s, aproximadamente, lo que supone una frecuencia de refresco del nmero visualizado de 996Hz. Las rutinas Conta y Decre son una modificacin de las subrutinas iniciales explicadas en este captulo.
5.10.7 Control de un ascensor Esta aplicacin consiste en el diseo del sistema de control, basado en el C 8XC251, de un ascensor de carga de una mina de carbn. La tarea del ascensor consiste en elevar hasta la superficie las vagonetas cargadas de carbn. El ascensor se pone en funcionamiento cuando se coloca en su interior una vagoneta, a continuacin asciende hasta que llega a la superficie, donde descarga de forma automtica la vagoneta, y baja otra vez al interior de la mina con la vagoneta vaca (figura 5.21).
8XC251
P1.2 P0.0 P0.1 P1.3 P1.1
S2
M1
M0
Ascensor
Motor
S1
S3
128
Una vez que el ascensor llega abajo se detiene y los operarios sacan la vagoneta del ascensor, la llenan de carbn y la vuelven a colocar dentro del ascensor; se repite de nuevo la secuencia. El sistema de control del ascensor incorpora tres sensores, S1, S2 y S3, activos a nivel alto, cuyo funcionamiento se describe a continuacin: S1: Este sensor est colocado dentro del ascensor y detecta la presencia de la vagoneta, en cuyo caso se pone a 1 lgico. Si no hay vagoneta, el sensor se pone a 0 lgico. S2: Este sensor est colocado en la exterior de la mina y detecta que el ascensor ha llegado hasta la superficie. S3: Este sensor est colocado en el interior de la mina y detecta que el ascensor ha llegado al fondo de la mina. Por otra parte, el sistema dispone de un motor que permite elevar o descender el ascensor. El motor est controlado mediante dos seales binarias, M1 y M0, que funcionan tal y como se indica en la tabla 5.2. En la figura 5.21 se detalla la conexin entre los sensores, los actuadores y el microcontrolador 8XC251.
INICIO SE INHIBEN LAS SALIDAS SE INICIALIZAN LAS ENTRADAS A 1 LOGICO
;************************************************************ ; Control del ascensor ;************************************************************ ORG FF:0000H ; El programa est almacenado a partir de la ; direccin FF:0000H de la memoria
VAGONETA EN EL ASCENSOR? SI
NO
;Inicializacin de los puertos ; Se inicializan P0.0 y P0.1 del puerto a 1 ; con lo que el motor estar detenido ; Los pines que trabajan como entrada, deben ; inicializarse a 1 lgico ; Programa de control SIGUE: JNB P1.1,SIGUE ; Detecta si coloca la vagoneta en el ascensor CLR P0.1 ; El ascensor sube SIGUE1: JNB P1.2,SIGUE2 ; Detecta si el ascensor llega a la superficie SETB P0.1 ; El ascensor baja CLR P0.0 ; SIGUE2: JNB P1.3,SIGUE3 ; Se detecta que el ascensor llega abajo SETB P0.0 ; El ascensor se detiene SIGUE4: JB P1.1,SIGUE4 ; Detecta si sacan la vagoneta del ascensor JMP SIGUE ; El programa vuelve al inicio SETB P0.0 SETB P0.1 MOV P1,#FFH
EL ASCENSOR SUBE
NO
NO
EL ASCENSOR SE PARA
NO
NO SI VAGONETA EN EL ASCENSOR?
SI
5 El modelo de programacin
129
M1 M0
0 0 1 1 0 1 0 1
El programa que controla la secuencia de funcionamiento del ascensor debe detectar, mediante instrucciones de salto condicional, que se coloca una vagoneta en el interior del ascensor para, a continuacin, activar el motor con el fin de subir el ascensor. Mientras el ascensor sube, el programa debe detectar cundo llega a la superficie, testeando para ello el valor lgico de la entrada conectada al sensor S2. Cuando S2 se activa, se debe colocar en las salidas M0 y M1 el valor lgico 0 y 1, respectivamente, para que el ascensor baje. A continuacin, se debe detectar que el ascensor ha llegado abajo, testeando el sensor S3 con una instruccin de salto condicional. Por ltimo se detecta que se saca la vagoneta del ascensor, para seguidamente retornar al inicio del programa. En la figura 5.22 se muestra el diagrama de flujo del programa de control y el listado del programa.
5.10.8 Control de un calefactor Esta aplicacin trata del diseo de un sistema de control de un calefactor, basado en el microcontrolador 8XC251. Para controlar el calefactor se disponen de 3 sensores de temperatura activos a nivel alto: T1, T2 y T3; de un selector de temperatura ambiente S y de un actuador M que enciende o apaga el calefactor. El funcionamiento de los sensores de temperatura se describe a continuacin: T1: se activa a 1 lgico cuando la temperatura es igual o mayor que 20C. T2: se activa a 1 lgico cuando la temperatura es igual o mayor que 25C. T3: se activa a 1 lgico cuando la temperatura es igual o mayor que 30C. El selector de temperatura S es una entrada binaria que permite seleccionar entre dos rangos de temperatura ambiente: cuando S es igual a 0 lgico, la temperatura debe mantenerse entre 20 y 25C. Cuando S es igual a 1 lgico, la temperatura debe mantenerse entre 25 y 30C. El microcontrolador 8XC251 encender el calefactor y pondr la salida M a 1 lgico, cuando la temperatura sea inferior al valor mnimo del rango seleccionado con S. El calefactor debe permanecer encendido hasta que la temperatura supere el valor mximo del rango seleccionado, en cuyo caso, se debe apagar hasta que la temperatura sea de nuevo inferior al valor mnimo del rango seleccionado. En la figura 5.23 se detalla la conexin de los sensores y actuadores al microcontrolador 8XC251.
8XC251 P1.0 P1.1 P1.2 P1.3 P1.4 T1 T2 T3 CALEFACTOR S M
130
El programa de control del calefactor debe detectar, en primer lugar, qu rango de temperatura est seleccionado. Esto se realiza testeando el valor lgico del pin P3.1. Si este bit est a 0 lgico, se salta a la rutina que mantiene la temperatura entre 20 y 25C, y si vale 1 lgico se ejecuta a la rutina que mantiene la temperatura entre 25 y 30C.
INICIO
SI RANGO = 25/30C ?
SI
NO SE ENCIENDE EL CALEFACTOR
RANGO = 20/25C ?
NO SE ENCIENDE EL CALEFACTOR
SI RANGO = 25/30C ?
NO TEMPERATURA > 25 C ?
SI RANGO = 20/25C ?
NO
NO TEMPERATURA > 30 C ? SI
SI SE APAGA EL CALEFACTOR
NO
SI RANGO = 25/30C ?
SE APAGA EL CALEFACTOR
NO
SI RANGO = 20/25C ?
NO
TEMPERATURA < 20 C ? SI SI
NO
TEMPERATURA < 25 C ? SI SI
NO
Comprobando el valor lgico de los distintos sensores de temperatura y teniendo en cuenta el rango de temperatura seleccionado se decide si el calefactor debe estar activo o no. En la figura 5.24 se presenta el flujograma de esta aplicacin; a continuacin se presenta el listado del programa.
;*********************************************************************** ; Control del calefactor ;*********************************************************************** ORG FF:0000H ; El programa est almacenado en memoria a partir de la ; direccin FF:0000H MOV C,P1.3 ; En primer lugar se lee el valor del selector S para conocer en ; que rango de temperatura debe mantenerse la habitacin JC T25_30 ; Si S es igual a 1 lgico se salta a la direccin T25_30
5 El modelo de programacin
131
En el caso de que S sea igual a 0 lgico, se enciende el calefactor hasta que se activa el sensor T2, lo cual quiere decir que la temperatura ha superado los 25C, en cuyo caso se desactiva el calefactor. El calefactor permanece apagado hasta que se desactiva T1; entonces se vuelve a encender. En todo momento se comprueba la entrada S para saltar a la direccin T25_30 en el caso que valga 1 lgico.
;************************************************************************ ; Rutina del rango 20-25C ;************************************************************************ T20_25: SETB P1.4 ; Se activa el calefactor SIGUE1: JB P1.3,T25_30 ; Se comprueba si est seleccionado el rango 20/25C JNB P1.1,SIGUE1 ; Si la temperatura es menor que 25C, el calefactor ; seguir encendido CLR P1.4 ; Se apaga el calefactor SIGUE2: JB P1.3,T25_30 ; Se comprueba si est seleccionado el rango 20/25C JB P1.0,SIGUE2 ; Si la temperatura es mayor que 20C, el calefactor ; seguir apagado JMP T20_25 ; Se vuelve al comienzo de la rutina
Cuando S es igual a 1 lgico, la temperatura de la habitacin debe mantenerse entre 25 y 30C. En este caso se debe encender el calefactor, y apagarse cuando se active el sensor T3. El calefactor permanecer apagado hasta que se desactive T2, repitindose nuevamente la secuencia. Como en el caso anterior, en todo momento se sensa la variable S para saltar a la rutina T20_25 en el caso que valga 0 lgico.
;***************************************************************************** ; Rutina del rango 25-30C ;***************************************************************************** T25_30: SETB P1.4 ; Se activa el calefactor SIGUE3: JNB P1.3,T20_25 ; Se comprueba si est seleccionado el rango 25/30C JNB P1.2,SIGUE3 ; Si la temperatura es menor que 30C, el calefactor ; seguir encendido CLR P1.4 ; Se apaga el calefactor SIGUE4: JNB P1.3,T20_25 ; Se comprueba si est seleccionado el rango 25/30C. JB P1.1,T25_30 ; Si la temperatura es mayor que 20C, el calefactor ; seguir apagado JMP T25_30 ; Se vuelve al comienzo de la rutina
5.10.9 Control de una cinta elevadora En esta aplicacin se debe disear un sistema de control de un elevador de una cinta transportadora basado en el microcontrolador 8XC251. La tarea del elevador es la llevar una caja de un determinado producto, que llega por la cinta A, hasta la cinta B o C. El sistema incorpora los siguientes detectores (figura 5.25): D1: Este detector est colocado junto a la cinta A. Cuando llega una caja a la plataforma elevadora, este sensor decide si hay que llevarla a la cinta B o a la cinta C. Si D1 es igual a 0 lgico, hay que llevar el producto a la cinta B, fig. 5.26, y si D1 es igual a 1 lgico, a la cinta C (figura 5.27). D2: Este sensor se activa (1 lgico) cuando la plataforma est a la altura de la cinta A. D3: Este sensor se activa (1 lgico) cuando llega un producto a la plataforma elevadora. D4: Este sensor se activa (1 lgico) cuando la plataforma elevadora ha llegado a la cinta B. D5: Este sensor se activa (1 lgico) cuando la plataforma elevadora ha llegado a la cinta C.
132
D4
Cinta B
CAJA Cinta A
D1 D2 D3
P1.4
8XC251
D5
Cinta C
Motor
Cinta A D1=0
Cinta A D1=1
CAJA
Cinta C
Cinta C
Motor
Por otra parte, el sistema dispone de un motor que permite ascender o descender la plataforma elevadora. El motor est controlado mediante dos seales binarias, M1 y M0, que funcionan tal y como se indica en la tabla 5.3.
Tabla 5.3 Condiciones de funcionamiento del motor.
M1 M0
0 0 1 1 0 1 0 1
El programa que controla el funcionamiento de la plataforma elevadora debe cumplir las siguientes indicaciones: cuando llegue un producto a la plataforma elevadora (D3 igual a 1 lgico) la plataforma deber subir hasta la cinta B o bajar hasta la cinta C, dependiendo del valor que adquiera el detector D1. Una vez que la plataforma ha llegado a la cinta B o C, debe volver a la posicin original, junto a la cinta A, para esperar a que llegue un nuevo producto; entonces se vuelve a repetir el proceso. Inicialmente la plataforma elevadora se encuentra a la altura de la cinta A.
5 El modelo de programacin
133
En una primera parte del programa se deben inicializar los puertos con el valor lgico adecuado. Los pines de los puertos que actan como entradas de datos, han de estar inicializados a 1 lgico y los pines que trabajan como salida han de inicializarse por defecto con el nivel inactivo. En la figura 5.28 se presenta el diagrama de flujo del programa de control de la plataforma elevadora y a continuacin se detalla el listado.
INICIO SE INHIBEN LAS SALIDAS SE INICIALIZAN LAS ENTRADAS A 1 LOGICO
PRODUCTO NO EN LA PLATAFORMA?
SI SI D1 = 1?
LA PLATAFORMA BAJA
NO LA PLATAFORMA SUBE
PLATAFORMA EN CINTA C? SI SI
NO
NO
LA PLATAFORMA SUBE
NO
NO
134
SAL3: JNB P1.4,SAL3 CLR P3.0 SETB P3.1 SAL4: JNB P1.2,SAL4 CLR P3.1 SAL2: CLR P3.0 SETB P3.1 SAL5: JNB P1.5,SAL5 CLR P3.1 SETB P3.0 SAL6: JNB P1.1,SAL6 CLR P3.0 JMP SAL1
Microcontroladores MCS-51 y MCS-251 ; Se espera a que la plataforma llegue arriba ; La plataforma baja ; ; Se espera a que la plataforma llegue a la cinta A ; Paramos el motor ; La plataforma baja ; ; Se espera a que la plataforma baje hasta la altura de la cinta C ; La plataforma sube ; ; Se espera a que la plataforma llegue a la cinta A ; Se para el motor ; Vuelta al inicio
5.10.10 Control de la temperatura de un horno de coccin Se plantea, en este caso, una aplicacin donde se controla la temperatura de un horno de coccin, mediante un microcontrolador 8XC251Sx. Para poder controlar la temperatura del horno de coccin, el microcontrolador debe recibir la informacin del estado del sistema que le llega a travs de los puertos, procesar esa informacin mediante el algoritmo de control correspondiente y actuar sobre el sistema, tambin a travs de los puertos, para que el comportamiento del horno se mantenga dentro de los lmites fijados. En concreto, la accin de control a la que se somete el horno, tiene como objetivo mantener su temperatura dentro del margen comprendido entre los 275C y los 300C. El horno de coccin, cuyo esquema est representado en la figura 5.29, contiene los siguientes elementos: Un tanque de fuel-oil, que almacena el combustible que alimenta el quemador. Una bomba P, que impulsa el fuel-oil hacia el quemador B1 instalado en el horno, o bien hacia el tanque. Dos electrovlvulas V1 y V2. La electrovlvula V1 se encarga de controlar el paso del fuel-oil al quemador B1. La electrovlvula V2 se encarga de controlar el retorno del fuel-oil al tanque. Un horno de coccin, calentado por el quemador B1, que incorpora dos sensores de temperatura.
V2
Tanque Horno V1 P B1
T2 T1 Sensores de temperatura
Para realizar el control del sistema se dispone de una serie de sensores y actuadores electromecnicos que permiten obtener informacin sobre el estado del sistema y actuar convenientemente sobre l. Todos los sensores y actuadores son activos a 1 lgico y presentan el siguiente funcionamiento:
5 El modelo de programacin
135
1.
Sensores T1: Detector de temperatura del horno que se activa cuando la temperatura del horno aumenta por encima de 275C. T2: Detector de temperatura del horno que se activa cuando la temperatura del horno aumenta por encima de 300C. NL: Detector de nivel del tanque, que se activa cuando el nivel del tanque disminuye por debajo de un valor determinado.
2.
Actuadores PP: Accionador de la bomba P. Cuando se activa este actuador, la bomba P se pone en funcionamiento. XV1, XV2: Son los actuadores que abren o cierran las electrovlvulas V1 y V2, respectivamente. Cuando se activan, la vlvula correspondiente se abre y permite el paso del fuel-oil al quemador o al tanque. LR: Adems de los detectores y activadores antes descritos, el sistema dispone de un indicador rojo cuya activacin, a 1 lgico, indica que el horno se halla fuera de servicio.
La estrategia de control, que debe implementar el sistema de control del horno, se puede resumir en tres puntos: 1. Si el nivel del tanque disminuye por debajo del nivel indicado por el sensor NL, se debe parar la bomba, abrir la electrovlvula V2, cerrar V1 y sealizar que el sistema est fuera de servicio activando el indicador rojo. Si la temperatura del horno desciende por debajo de 275C, debe alimentarse el quemador con combustible abrindose la electrovlvula V1, cerrndose la electrovlvula V2, y activndose la bomba. Si la temperatura del horno supera el valor de 300C, se debe suspender la alimentacin del quemador cerrndose la electrovlvula V1, abrindose la electrovlvula V2 y activndose la bomba.
2.
3.
En la figura 5.30 est representado el esquema elctrico de la conexin del microcontrolador 8XC251Sx con los diferentes sensores y actuadores que intervienen en esta aplicacin.
8XC251Sx
P1.3 T1 T2 NL P0.0 P0.1 P0.2 P1.2 P1.1 P1.0 LR PP XV2 XV1
En la figura 5.31 est representado el diagrama de flujo de esta aplicacin. Estn reflejadas las tres opciones posibles, planteadas por la estrategia de control y la actuacin que se debe llevar a cabo en cada caso.
136
INICIO
NL = 1? NO
SI
T1 = 0? NO
SI
T2 = 1? NO
SI
Las primeras instrucciones del programa de control deben colocar, por motivos de seguridad, todos los pines de salida a su nivel inactivo, ya que las salidas slo se deben activar despus de procesar los datos de entrada, mediante el programa de control correspondiente. De igual modo, todos los pines de entrada debern ponerse a 1 lgico para evitar la destruccin del driver de salida correspondiente. A continuacin se detalla el listado del programa resultante.
;****************************************************************** ; Control del horno ;****************************************************************** ORG FF:0000H ; Direccin de inicio del programa MOV P1,#00H ; Se inicializan todas las salidas a su nivel inactivo SETB P0.0 ; Se inicializan todos los pines de entrada a 1 lgico SETB P0.1 ; SETB P0.2 ; INICIO: JNB P0.2,SALT1 ; Si el nivel del depsito est por debajo del valor CLR P1.2 ; permitido se para la bomba, CLR P1.0 ; se cierra la electrovlvula V1, SETB P1.1 ; se abre la electrovlvula V2, SETB P1.3 ; y se enciende la luz roja JMP INICIO ; Salto al INICIO SALT1: JB P0.0,SALT2 ; Si el sensor T1 est inactivo: SETB P1.0 ; se abre la electrovlvula V1, SETB P1.2 ; se activa la bomba, CLR P1.1 ; se cierra la electrovlvula V2, CLR P1.3 ; y se apaga la luz roja JMP INICIO ; Salto al INICIO SALT2: JNB P0.1,INICIO ; Si el sensor T2 est activo: CLR P1.0 ; Se cierra la electrovlvula V1, SETB P1.2 ; se activa la bomba, SETB P1.1 ; se abre la electrovlvula V2, CLR P1.3 ; y se apaga la luz roja JMP INICIO ; Salto al INICIO
6 Las interrupciones
137
6 Las interrupciones
6.1 Introduccin
Las interrupciones juegan un papel de suma importancia dentro de cualquier sistema basado en microprocesador o microcontrolador, pues estos deben habitualmente gestionar y controlar distintos perifricos asociados que, de forma continua, requieren la dedicacin de la CPU para llevar a buen trmino las tareas que tienen asignadas. Una interrupcin la realiza de forma asncrona un perifrico o un dispositivo conectado fsicamente al microcontrolador (figura 6.1), cuando requiere a la CPU el desvo del flujo de ejecucin del programa para gestionar y controlar los diversos sucesos que no se encuentran bajo su supervisin directa. De esta manera se mejora la eficiencia de la CPU, ya que sta no tiene que estar continuamente pendiente de si acontece o no un suceso en un instante de tiempo determinado, y puede realizar otras tareas de mayor inters, atendiendo a los sucesos tan slo cuando stos se producen. Los sucesos acontecidos pueden ser externos al sistema, como la activacin de un nivel lgico o un flanco en un terminal del microcontrolador, por parte de un perifrico, o bien internos, como el desbordamiento de un temporizador interno del microcontrolador al llegar ste a su mxima capacidad de cuenta.
Sensores y actuadores C Terminal de vdeo
1
Mdems
Teclado y visualizador
Discos magnticos
Impresora
Cuando se produce una interrupcin el microcontrolador ejecuta un proceso de atencin a la interrupcin (figura 6.2). En este proceso la CPU deja de ejecutar la secuencia de instrucciones en la que se encuentra y pasa a ejecutar la rutina de servicio a la interrupcin (RSI), que se encarga de efectuar la gestin del perifrico. Una vez terminada esta rutina, la CPU regresa a la secuencia donde se produjo la interrupcin, y sigue con el rumbo que tena. En el proceso de atencin a la interrupcin
Un perifrico es un dispositivo conectado al microcontrolador con una funcin especfica. Un perifrico puede ser una impresora, un mdem, un teclado alfanumrico, un terminal de vdeo, un sensor, un actuador, etc.
138
se realizan los siguientes pasos: 1. Termina de ejecutar la instruccin en curso. 2. Salva el valor del contador de programa, PC, en la pila, de manera que la CPU, al terminar el proceso, pueda seguir ejecutando el programa a partir de la instruccin siguiente a la ltima ejecutada. 3. La CPU salta a la direccin donde est almacenada la rutina de servicio de interrupcin (RSI) y ejecuta esta rutina, que tiene como finalidad atender al perifrico o dispositivo que ha generado la interrupcin. 4. La rutina RSI debe terminar con una instruccin de retorno de interrupcin, RETI. La CPU al ejecutar esta instruccin lee la direccin almacenada en la pila y la asigna al contador de programa, de manera que la CPU reanuda la ejecucin del programa a partir de la instruccin siguiente a la instruccin donde se produjo la interrupcin.
Programa principal RSI
Interrupcin
RETI
A la direccin de salto a partir de la cual se almacena la rutina de RSI se la denomina vector de interrupcin. Segn el tipo de microcontrolador o microprocesador, las direcciones del vector de interrupcin pueden ser fijas, es decir, especificadas por el fabricante, o bien pueden ser definidas por el programador. Los vectores de interrupcin de las familias MCS-51 y MCS-251 son fijos y su valor viene predeterminado por el fabricante. Otro factor importante que se debe considerar en el proceso de interrupciones consiste en la habilitacin de mscaras y en el establecimiento de prioridades. Una mscara no es ms que un indicador de tipo bit que gobierna el estado de una puerta de transmisin conectada entre la entrada en interrupcin y la CPU. Al bit que realiza la funcin de mscara se le denomina bit de habilitacin
3
Se debe considerar que el microcontrolador puede tener varias fuentes de interrupcin, por lo que a cada fuente de interrupcin le corresponde una rutina especifica de RSI.
3
Una puerta de transmisin se realiza con puertas lgicas o bien con transistores bipolares o MOS. Tiene una entrada, una salida y una lnea de control. La activacin de la lnea de control deja pasar el estado lgico presente en su entrada a su salida; su desactivacin hace que la puerta est desconectada para evitar que el estado lgico de la entrada pase a la salida.
6 Las interrupciones
139
de interrupcin. La activacin de un bit de habilitacin de interrupcin permite que la interrupcin pase de la lnea de entrada hacia la CPU, mientras que la desactivacin de este bit hace que la interrupcin no pueda pasar hacia la CPU, e inhiba la interrupcin; es decir, la interrupcin no es atendida a menos que su bit de habilitacin correspondiente est activado. Los bits de habilitacin de interrupciones permiten, pues, que el programador pueda activar o desactivar ciertas interrupciones, en las circunstancias que sean de su consideracin. Generalmente todas las entradas de interrupcin suelen tener un bit de habilitacin de interrupcin asociado; no obstante, puede haber alguna entrada de interrupcin que adolezca de este bit, lo que se denomina interrupcin no mascarable, en cuyo caso el programador no tiene control sobre la interrupcin y la CPU est obligada siempre a atenderla. Las interrupciones no mascarables se reservan para aquellos perifricos o sucesos de suma importancia, como, por ejemplo, la cada de tensin de la red elctrica, en que la CPU dispone de los pocos milisegundos en los que los condensadores de la fuente de alimentacin son capaces de sostener la tensin de alimentacin para salvar los registros que se consideren imprescindibles en una memoria estable, como una memoria E2PROM o una memoria RAM con una batera externa. El establecimiento de prioridades dentro del proceso de interrupcin se considera cuando existe la posibilidad de que varias interrupciones se produzcan de manera simultnea, por lo que es necesario estipular un orden de atencin a las interrupciones producidas. Para ello, las entradas de interrupcin suelen tener uno o varios bits asociados con los que el programador puede establecer un orden de prioridad en la atencin de las interrupciones.
140
interrupcin tiene asociado un bit de habilitacin de interrupcin, bits ECF y ECCFn de los registros CMOD, PCA Counter Mode Register y CCAPMn, PCA Compare/Capture Modules. El Timer 2 tiene un bit adicional de interrupcin, EXF2, que realiza una peticin de interrupcin si se detecta un flanco de bajada en el terminal T2 del microcontrolador. Tal y como muestra la figura 6.3, las interrupciones externas /INT0 y /INT1 se pueden activar tanto por nivel lgico (cero lgico), como por flanco descendente, mediante la programacin de los bits IT0 y IT1 del registro TCON, Timer Control (tabla 6.2), respectivamente. Poner uno de estos bits a cero lgico hace que la interrupcin se active por nivel lgico, mientras que a uno lgico se activa por flanco descendente.
Registro IE 0 INT0 IT0 1 IE0 EX0
ET0 TF0
EX1
ES
EA Inhibici n global
* En las versiones con 3 temporizadores En las versiones con PCA
6 Las interrupciones
141
Al producirse una interrupcin en una de las entradas externas de interrupcin, /INT0 o /INT1, ya sea por nivel lgico o por flanco descendente, el bit correspondiente, IE0 o IE1 del registro TCON, se activa a uno lgico, indicando de esta manera que se ha realizado una peticin de interrupcin, y la CPU pone en marcha el proceso de atencin a la interrupcin, siempre y cuando la interrupcin est habilitada de antemano. En este proceso, los bits IE0 e IE1 se ponen a cero lgico de forma automtica cuando la interrupcin se ha activado por flanco descendente. Sin embargo, si la interrupcin se ha activado por nivel lgico, los bits IE0 y IE1 se deben borrar por software dentro de la rutina de RSI. El estado de las interrupciones externas /INT0 e /INT1 se comprueba una vez cada ciclo mquina, de forma que la entrada de interrupcin, para el caso de que est activada por flanco descendente, se debe sostener a nivel lgico alto al menos un ciclo mquina, y sostener a nivel lgico bajo al menos otro ciclo mquina ms, para que el flanco descendente sea detectado y se active el bit IE0 o IE1, correspondiente. En el caso de que la interrupcin est activada por nivel lgico, la entrada de interrupcin se debe sostener a nivel lgico bajo al menos durante 1 ciclo mquina, para que la interrupcin sea detectada por la CPU. En las interrupciones internas producidas por los temporizadores Timer 0 o Timer 1, se activan los bits TF0 o TF1, segn corresponda, del registro TCON a uno lgico, al realizar la peticin de interrupcin. Estos bits se mantienen en este estado hasta que la CPU atiende la peticin, momento en el cual los pone a cero lgico de forma automtica. El temporizador Timer 2 puede producir una interrupcin a travs de la activacin a uno lgico de los bits TF2 o EXF2. Estos bits no se ponen a cero lgico de manera automtica, sino que los debe poner el programador por software. Las interrupciones producidas por el puerto serie activan a uno lgico los bits TI o RI del registro SCON, cuando el microcontrolador transmite un dato o cuando recibe un dato, respectivamente. Estos bits los debe poner a cero lgico el programador mediante software. La tabla 6.1 muestra los bits de peticin de interrupcin asociados a cada una de las fuentes de interrupcin.
Tabla 6.1 Fuentes de interrupcin, bits activados y tabla de vectores de salto para la MCS-51 Fuente de interrupcin /INT0 Timer 0 /INT1 Timer 1 Puerto serie Timer 2 PCA Bit que activa IE0 TF0 IE1 TF1 RI, TI TF2, EXF2 CF, CCFn Borrado por hardware No, por nivel. Si, por flanco. Si. No, por nivel. Si, por flanco. Si. No. No. No. n=0, 1, 2, 3, 4. Registro TCON TCON TCON TCON SCON T2CON CCON Vector de salto 0003H 000BH 0013H 001BH 0023H 002BH 0033H
(LSB) IT0
Bit
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
Comentario
Bit de rebasamiento del Timer 1. Se pone a 1 por hardware en el rebasamiento. La CPU lo pone a 0 cuando procesa la interrupcin y salta a la rutina de RSI. Bit de marcha/paro del Timer 1. Se pone a 1 0 por software para poner en marcha o parar el Timer 1 Bit de rebasamiento del Timer 0. Se pone a 1 por hardware en el rebasamiento. La CPU lo pone a 0 cuando procesa la interrupcin y salta a la rutina de RSI. Bit de marcha/paro del Timer 1. Se pone a 1 0 por software para poner en marcha o parar el Timer 1 Bit de interrupcin del terminal /INT1. Se pone a 1 en una peticin de interrupcin, se pone a 0 por hardware si /INT1 est activada por flanco descendente. Bit de seleccin de interrupcin por nivel o por flanco descendente de /INT1. A 0 la interrupcin se activa por nivel, a 1 se activa por flanco descendente. Bit de interrupcin del terminal /INT0. Se pone a 1 en una peticin de interrupcin, se pone a 0 por hardware si /INT0 est activada por flanco descendente. Bit de seleccin de interrupcin por nivel o por flanco descendente de /INT0. A 0 la interrupcin se activa por nivel, a 1 se activa por flanco descendente.
6.2.1 Vectorizacin de interrupciones en la MCS-51 Cuando se produce una interrupcin la CPU desva el flujo de ejecucin de instrucciones hacia las rutinas de atencin de interrupciones, RSI, definidas por el programador. En la MCS-51 las direcciones de salto hacia las rutinas de RSI son fijas y estn predefinidas por el fabricante en lo que se denomina tabla de vectores de salto (tabla 6.1). En esta tabla, se observa cmo la interrupcin /INT0 provoca un salto a la direccin 03H de la memoria de programas, la TIMER0 a la 0BH, la /INT1 a la 013H, etc. A partir de estas direcciones debe situarse la rutina de RSI que corresponda. En la tabla 6.1 tambin se observa que el espacio existente entre los vectores de interrupcin es de tan slo 8 bytes. Este espacio suele ser insuficiente para albergar una rutina de RSI, por lo que, en estas posiciones, se suele insertar una instruccin de salto, LJMP, AJMP o SJMP, hacia la rutina de RSI que atienda a la interrupcin; as, se puede situar esta rutina en cualquier zona del espacio de memoria disponible por el microcontrolador. El retorno de una rutina de RSI se debe realizar con la instruccin RETI, para que la CPU diferencie este retorno, del retorno de subrutina (instruccin RET).
;************************************************************** ;Vectorizacin de interrupciones ;************************************************************** ORG 03H ;Posiciona la instruccin siguiente en 03H LJMP RSI_INT0 ;Salto a la rutina de RSI ORG 0BH ;Posiciona instruccin siguiente en 0BH LJMP RSI_TIMER0 ;Salto a la rutina de RSI ORG 013H ;Posiciona instruccin siguiente en 013H LJMP RSI_INT1 ;Salto a la rutina de RSI RSI_INT0: MOV ..... ;Rutina de RSI para /INT0 : RETI RSI_TIMER0: MOV ..... ;Rutina de RSI para TIMER0 : RETI
6 Las interrupciones RSI_INT1: MOV ..... : RETI ;Rutina de RSI para INT1
143
La estructura del programa cuando se utilizan interrupciones estar formada por una rutina de vectorizacin, como la mostrada en este apartado. El registro PC se inicializa a 0000H tras un reset o la puesta en marcha del microcontrolador, por lo que la primera instruccin que se ejecuta es la contenida en la direccin 0000H. La estructura de un programa, tambin, en general contempla una rutina Inicio, donde se determinan los valores de las variables que se van a utilizar y el modo de operar del microcontrolador, y una rutina Principal, donde se llevan a cabo la mayor parte de las tareas que debe gestionar la CPU, aunque, parte de estas tareas puedan solventarse mediante interrupciones. En conclusin, la rutina de vectorizacin anterior debe, adems, incluir en la direccin 0000H una instruccin de salto hacia la rutina Inicio, tal y como se muestra en la rutina siguiente:
;**************************************************** ;Vectorizacin de interrupciones ;**************************************************** ORG 0H LJMP Inicio ;Salto a la rutina Inicio ORG 03H LJMP RSI_INT0 ORG 0BH LJMP RSI_TIMER0 ORG 013H LJMP RSI_INT1
6.2.2 Habilitacin de interrupciones y establecimiento de prioridades en la MCS-51 Cada una de las fuentes de interrupcin de la MCS-51 dispone de un bit de habilitacin/deshabilitacin en el registro IE, Interrupt Enable, del rea de SFR (tabla 6.3). En el registro IE el bit de mayor peso, IE.7 o tambin EA, es el bit de inhibicin global y afecta de forma directa a todos los bits de habilitacin de interrupciones establecidos dentro del mismo registro IE. Poniendo el bit EA a cero lgico se inhabilitan todas las interrupciones del microcontrolador, aunque existan bits de habilitacin de interrupcin activados; por contra, poniendo el bit EA a uno lgico, se habilitan slo las interrupciones que tienen su bit de habilitacin activado. La mayor parte de los componentes de la MCS-51 tienen dos niveles de prioridad, con excepcin de las versiones 8XC51Fx y 8XC52/54/58, que tienen hasta cuatro niveles de prioridad. El nivel de prioridad se determina con el registro de prioridades IP, Interrupt Priority, del rea de SFR (tabla 6.4). Poniendo un bit de este registro a uno lgico se fija la prioridad a nivel alto y a cero lgico se fija a nivel bajo. Para el caso de que dos o ms interrupciones tengan el mismo nivel de prioridad y se produzca una peticin simultnea de interrupcin, el fabricante asigna un nivel de prioridad por defecto a cada una de las fuentes de interrupcin del microcontrolador (tabla 6.5), de forma que en una peticin simultnea de interrupcin, la CPU atienda primero a la interrupcin con mayor prioridad segn la tabla 6.5.
(LSB) EX0
COMENTARIO EX0 = 1 habilita la interrupcin en INT0. EX0 = 0 la inhabilita ET0 = 1 habilita la interrupcin del Timer 0. ET0 = 0 la inhabilita. EX1 = 1 habilita la interrupcin en INT1. EX1 = 0 la inhabilita. ET1 = 1 habilita la interrupcin del Timer 1. ET1 = 0 la inhabilita. ES = 1 habilita la interrupcin del puerto serie. ES = 0 la inhabilita. ET2 = 1 habilita la interrupcin del Timer 2. ET2 = 0 la inhabilita. EC =1 habilita la interrupcin de la PCA. EC = 0 la inhabilita. EA = 1 permite todas las habilitaciones o inhabilitaciones anteriores. EA = 0 no reconoce ninguna interrupcin.
* En las versiones con 3 temporizadores En las versiones con PCA
COMENTARIO Bit de prioridad de /INT0. Bit de prioridad del Timer 0. Bit de prioridad de /INT1. Bit de prioridad del Timer 1 Bit de prioridad del puerto serie. Bit de prioridad del Timer 2. Bit de prioridad de la PCA. Bit reservado.
* En las versiones con 3 temporizadores En las versiones con PCA
Tabla 6.5 Nivel de prioridad asignado por defecto en la MCS-51 Prioridad (ms alta).......1 2 3 4 5 6 (ms baja).......7 Fuente /INT0 Timer 0 /INT1 Timer 1 PCA Puerto Serie Timer 2*
* En las versiones con 3 temporizadores En las versiones con PCA
Las versiones 8XC51Fx y 8XC52/54/58 tienen cuatro niveles de prioridad que se determinan por medio de los registros IP y IPH (tabla 6.6). En la tabla 6.7 se indica el nivel de prioridad segn el estado de los bits correspondientes a cada una de las fuentes de interrupcin.
6 Las interrupciones
145
Tabla 6.6 Registro de prioridades IPH para las versiones 8XX52/54/58 y 8XC51Fx de la MCS-51
(MSB)
PPCH PT2H*
(LSB)
COMENTARIO Bit alto de prioridad de /INT0. Bit alto de prioridad del Timer 0. Bit alto de prioridad de /INT1. Bit alto de prioridad del Timer 1. Bit alto de prioridad del puerto serie. Bit alto de prioridad del Timer 2. Bit alto de prioridad de la PCA. Bit reservado.
Tabla 6.7 Niveles de prioridad para las versiones 8XX52/54/58 y 8XC51Fx de la MCS-51 Bits de prioridad IPH.x IP.x 0 0 0 1 1 0 1 1 Nivel de prioridad Nivel 0 Nivel 1 Nivel 2 Nivel 3 (Menor)
(Mayor)
6.2.3 Tiempos de respuesta del proceso de interrupcin Las fuentes de interrupcin en la MCS-51 se comprueban en la fase 2 del estado 5 de cada ciclo mquina, denominado S5P2 (figura 6.4), y se evala su estado en el siguiente ciclo mquina del microcontrolador. En consecuencia, si la CPU encuentra que una de las fuentes est activa, entonces genera un salto automtico hacia la rutina de RSI correspondiente. Aunque, este salto puede ser abortado por cualquiera de las condiciones siguientes: 1. 2. Se halla en proceso una interrupcin de mayor o igual prioridad. El ciclo mquina en el que se ha producido la interrupcin no es el ltimo de la instruccin en curso de ejecucin por parte de la CPU, por lo que debe esperar a que se termine de ejecutar la instruccin. La instruccin actual en curso es una instruccin RETI o cualquier otra que escriba en los registros IE o IP.
3.
La lectura de las peticiones de interrupcin realizadas por el microcontrolador carece de memoria, por lo que si una peticin de interrupcin resulta abortada por una de las condiciones anteriores, en un ciclo mquina determinado, y esta peticin no se sostiene por parte del perifrico de manera que vuelva a detectarse en el ciclo maquina siguiente, entonces la interrupcin no es atendida; es decir, en caso de rechazo de la interrupcin, sta debe ser sostenida por el perifrico el tiempo necesario hasta que la CPU la atienda. La CPU reconoce la peticin de una interrupcin cuando vectoriza la interrupcin, es decir, cuando salta a la rutina de RSI correspondiente. Segn el tipo de interrupcin, la CPU, adems, borra el bit
146
activado en la peticin de interrupcin (tabla 6.1), como es el caso de los bits TF0 y TF1, o de los bits IE0 e IE1, slo cuando la interrupcin ha sido activada por flanco descendente. En otros casos el bit activado por la interrupcin se debe borrar por software.
Ciclo C1 Ciclo C2 Ciclo C3 Ciclo C4 Ciclo C5
S5P2
S6
Comprobaci n de interrupciones
Rutina de RSI
Fig. 6.4 Diagrama de tiempos del salto a la rutina de RSI en el proceso de interrupciones
La CPU guarda en la memoria interna de la pila el contenido del registro PC (dos bytes) y, luego, salta a la rutina RSI correspondiente. La CPU ejecuta la rutina de RSI hasta que encuentra una instruccin RETI, que le indica que se ha llegado al final del proceso de interrupcin; recupera entonces los dos bytes almacenados en la pila y los asigna al registro PC, por lo que la ejecucin del programa regresa al punto de partida donde se inici la interrupcin. El tiempo transcurrido (figura 6.4), desde que se produce la interrupcin (S5P2 del ciclo C1), hasta que la CPU comienza a ejecutar la rutina de RSI (ciclo C5), es de como mnimo tres ciclos mquina. El tiempo de respuesta es mayor si el salto resulta abortado por una de las condiciones mencionadas. En el primer caso, si una interrupcin de mayor o igual prioridad est en proceso, el tiempo de espera depender de la rutina de RSI en ejecucin. En el segundo caso, cuando la CPU debe esperar a que se finalice la ejecucin de la instruccin actual, el tiempo de espera, en el peor caso , no puede ser superior a tres ciclos mquina. En el tercer caso, si una instruccin RETI, o la escritura del registro IE o IP, est en progreso, el tiempo adicional de espera no puede ser superior a cinco ciclos mquina. En definitiva, el tiempo de respuesta de una interrupcin estar comprendido entre tres y nueve ciclos mquina. Ejemplo 6.1 Conexin de teclas al microcontrolador Se conectan cuatro teclas al puerto P1 de un microcontrolador 80C31 (figura 6.5). Las entradas del puerto P1 tienen una resistencia interna de pull-up (figura 3.4), por lo que un terminal del puerto, por ejemplo P1.0, estar en el estado 1 lgico (Vcc) cuando no se pulsa la tecla T1, y a 0 lgico (masa) cuando se pulsa T1. Luego, la deteccin de si una tecla ha sido pulsada o no, consiste en leer el estado lgico del puerto P1, y ver si hay algn cero en una de sus patillas. En la figura 6.5 cada una de las teclas est conectada a una puerta AND, de manera que la pulsacin de cualquiera de las cuatro teclas causar un 0 lgico en la entrada de interrupcin /INT0, y provocar una interrupcin en el caso de que est habilitada.
4
El peor caso corresponde a las instrucciones MUL y DIV que tardan en ejecutarse cuatro ciclos mquina.
6 Las interrupciones
147
T1 T2 T3 T4
80C31
/INT0
En este ejemplo se debe habilitar la interrupcin /INT0 y crear una rutina RSI capaz de detectar la tecla que ha sido pulsada. Para ello, se utilizar el registro B como registro indicador de la pulsacin de una tecla, y se le asignar el valor 00H cuando no se haya pulsado ninguna tecla, y los valores 01H, 02H, 03H y 04H, cuando se pulsen las teclas T1, T2, T3 y T4, respectivamente. La interrupcin /INT0, en este ejemplo, se establecer por nivel lgico (bit IT0 del registro TCON a 0 lgico). Se debe tener en cuenta que todos los bits accesibles de los registros TCON, IE y IP quedan a 0 lgico tras un reset del microcontrolador.
;********************************************************************** ; Rutina de vectorizacin (ejemplo 6.1) ;********************************************************************** ORG 0H LJMP Inicio ORG 03H LJMP RSI_INT0 ;********************************************************************** ; Rutina de Inicio. (Se habilita las interrupciones y /INT0 por flanco descendente) ;********************************************************************** Inicio: SETB PX0 ;Prioridad alta para la interrupcin /INT0 (Registro IP) SETB EX0 ;Activa el bit de habilitacin de /INT0 (Registro IE) SETB EA ;Activa el bit de habilitacin general (Registro IE) LJMP Principal ;********************************************************************** ; Programa Principal ;********************************************************************** ORG 0300H Principal: SJMP Principal ;Bucle infinito sin propsito definido ;********************************************************************** ; Rutina de RSI de /INT0 ;********************************************************************** RSI_INT0: JNB P1.0, Tecla_1 ;Es la tecla T1? JNB P1.1, Tecla_2 ;Es la tecla T2? JNB P1.2, Tecla_3 ;Es la tecla T3? SJMP Tecla_4 ;Si no es ninguna de las anteriores, es la tecla T4 Tecla_1: MOV B, #01H ;Pone 01H en el registro B SJMP Salir ;Ir a Salir Tecla_2: MOV B, #02H ;Pone 02H en el registro B SJMP Salir ;Ir a Salir Tecla_3: MOV B, #03H ;Pone 03H en el registro B SJMP Salir ;Ir a Salir Tecla_4: MOV B, #04H ;Pone 04H en el registro B Salir: CLR IE0 ;Se pone a cero para que /INT0 pueda interrumpir de nuevo. RETI ;Final de interrupcin
148
La ejecucin de las instrucciones del programa empieza por la direccin 0H, pues, en la puesta en marcha del microcontrolador, se ejecuta un reset interno que sita el registro PC a 00H. La primera instruccin, entonces, es una instruccin de salto a la rutina Inicio, donde se configura la forma de operar de la interrupcin /INT0, mediante los registros TCON, IE y IP. De esta rutina, la CPU pasa a ejecutar la rutina Principal, que slo consiste en un bucle infinito, sin ningn objetivo especfico. Esto es as, por el funcionamiento casi exclusivo del programa mediante interrupciones, de manera que la CPU est siempre ejecutando instrucciones de la rutina Principal, a la espera de que las interrupciones se produzcan, lo que causa el salto automtico hacia las rutinas de RSI. En el momento que se pulsa una tecla, se provoca la interrupcin /INT0 y se ejecuta la rutina RSI_INT0. Esta rutina comprueba de forma secuencial, mediante la instruccin JNB, cul ha sido la tecla pulsada, colocando en el registro B el valor adecuado, segn los objetivos marcados en este ejemplo. Al final de la rutina, el bit IE0, debido a que la interrupcin /INT0 se ha habilitado por nivel lgico, se borrar por software para que se produzca una nueva interrupcin en /INT0. La lectura de las teclas, en el programa realizado, se hace de manera secuencial, por lo que el programa es incapaz de detectar una pulsacin simultnea de varias teclas, y da por vlida la tecla que lee primero; es decir, en el caso de pulsarse las teclas conectadas T1 y T2, en el registro B se colocara el cdigo correspondiente a la tecla T1. Este problema se solventa en el siguiente ejemplo que consiste en una modificacin del actual.
Ejemplo 6.2 Conexin de teclas y de un dgito de siete segmentos Este ejemplo se basa en el anterior, con las siguientes modificaciones: Se incorporan un dgito de siete segmentos conectado al puerto P2 y una tecla adicional, T5, conectada a la entrada de interrupcin /INT1 (figura 6.6). El microcontrolador empleado es el 87C51 y utiliza exclusivamente su memoria de programa interna. El programa debe ser capaz de detectar la pulsacin de varias teclas al mismo tiempo, e indica esta situacin a travs del encendido de todos los leds del dgito conectado. La pulsacin de una tecla, T1, T2, T3 o T4, se indicar poniendo el nmero 1, 2, 3 o 4, en el dgito, respectivamente. En el dgito siempre se mostrar la ltima tecla pulsada. La pulsacin de T5 apagar todos los leds del dgito T5.
En la figura 6.6 se emplea el circuito integrado 7405 que contiene hasta 6 puertas inversoras en colector abierto. La puerta inversora est formada por un nico transistor, del cual se dispone de su colector, tal y como se ve en el detalle de la figura. La puerta inversora puede soportar una corriente mxima de 25mA, valor ms que suficiente para encender de manera adecuada el diodo LED que tiene asociado.
6 Las interrupciones
149
87C51
T1 T2 T3 T4 P1.0 P1.1 P1.2 P1.3 P2.7 P2.0 P2.1
74LS05/06
a b
nodo comn a f g e c d DP b
Vcc
DP
/INT0 T5
/INT1
La resistencia R se debe calcular de forma que, considerando el valor de Vcc, de la tensin umbral del diodo LED, VTH, y la tensin colector-emisor del transistor en saturacin, VCE, la corriente est limitada a unos 20mA. Su valor se puede determinar a partir de la siguiente ecuacin: R] VCC [ VTH [ VCE i
La interrupcin /INT1 se habilita por flanco descendente, mientras que la interrupcin /INT0 se habilita por nivel lgico, de manera que en la rutina RSI de /INT0 se debe borrar el bit IE0. Sin embargo, en la rutina RSI de /INT1 el bit IE1 se borra de forma automtica.
;************************************************************************ ;Rutina de vectorizacin (ejemplo 6.2) ;************************************************************************ ORG 0H LJMP Inicio ORG 03H LJMP RSI_INT0 ORG 013H LJMP RSI_INT1 ;************************************************************************ ; Rutina de Inicio ; Se habilita las interrupciones y /INT0 por flanco descendente ;************************************************************************ Inicio: SETB IT1 ;Interrupcin /INT1 activa por flanco descendente SETB PX1 ;Prioridad alta para /INT1 SETB EX0 ;Activa el bit de habilitacin de /INT0 SETB EX1 ;Activa el bit de habilitacin /INT1 SETB EA ;Activa el bit de habilitacin general ;************************************************************************ ; Programa Principal ;************************************************************************ Principal: MOV A, B ;Lee el registro B CALL Siete_seg ;Codifica en 7 segmentos para mostrar en dgito MOV P2, A ;Carga en dgito SJMP Principal ;Bucle infinito a Principal
150
Siete_seg:
Microcontroladores MCS-51 y MCS-251 INC A MOVC A, @A+PC RET DB 0000 0000b ;Todos los leds apagados DB 0000 0110b ;leds b y c encendidos, caracter 1, tecla T1 DB 0101 1011b ;leds a, b, d, e y g encendidos, caracter 2, tecla T2 DB 0100 1111b ;leds a, b, c, d y g encendidos, caracter 3, tecla T3 DB 0110 0110b ;leds b, c, f y g encendidos, caracter 4, tecla T4 DB 1111 1111b ;Todos los leds encendidos, varias teclas pulsadas ;************************************************************************ ; Rutina de RSI de /INT0 ;************************************************************************ RSI_INT0: MOV A,P1 ;Lee el puerto P1 ORL A,#F0H ;Mscara, fuerza los 4 bits altos de P1 a 1 lgico CJNE A, #11111110b, Dif_1 ;Es tecla T1? MOV B, #01H ;Pone 01H en el registro B SJMP Salir ;Ir a Salir Dif_1: CJNE A, #11111101b, Dif_2 MOV B, #02H ;Pone 02H en el registro B SJMP Salir ;Ir a Salir Dif_2: CJNE A, #11111011b, Dif_3 MOV B, #03H ;Pone 03H en el registro B SJMP Salir ;Ir a Salir Dif_3: CJNE A, #11110111b, Varias_tec MOV B, #04H ;Pone 04H en el registro B SJMP Salir ;Ir a Salir Varias_tec: MOV B, #05H ;Pone 05H en el registro B Salir: CLR IE0 ;Se pone a cero para que /INT0 pueda interrumpir de nuevo. RETI ;Final de interrupcin ;************************************************************************ ; Rutina de RSI de /INT1 ;************************************************************************ RSI_INT1: MOV B, #0 ;Borra el registro B RETI ;No es necesario borrar el bit IE1, ya que es por flanco
La rutina Principal de este ejemplo se encarga de leer el contenido del registro B y de poner en el dgito el carcter correspondiente segn sea el valor de B. El registro B puede valer 00H al principio, si no se ha pulsado ninguna tecla, o tras pulsar la tecla T5; puede valer 01H, 02H, 03H o 04H, al pulsar las teclas T1, T2, T3 o T4, respectivamente; y puede valer 05H en el caso de que se pulsen varias teclas al mismo tiempo. Con el valor del registro B se lee la tabla Siete_seg, que proporciona el cdigo en siete segmentos, correspondiente al carcter que se quiere mostrar en el dgito del ejemplo. De todas formas, la tabla Siete_seg se puede suprimir colocando en el registro B, directamente, el cdigo del carcter que deber mostrar en el dgito, segn sea el caso.
Ejemplo 6.3 Conexin de teclas al microcontrolador mediante el 74LS148 El 74LS148 es un circuito integrado codificador con prioridad que se puede emplear para conectar varios perifricos a una misma lnea de interrupcin, o bien, como en este caso, a la conexin de hasta 8 teclas al microcontrolador, empleando para ello el sistema de interrupciones.
6 Las interrupciones
151
Segn el circuito de la figura 6.7, el codificador con prioridad codifica en binario la tecla pulsada, sacando el cdigo por las tres lneas de salida: A1, A2 y A3. Con el 74LS148, si se pulsan varias teclas a la vez, aparece a su salida el cdigo correspondiente a la entrada con mayor prioridad (la entrada 7 es la de mayor prioridad, y la entrada 0 la de menor prioridad). Cuando se pulsa una tecla la lnea de salida /GS del codificador se pone a cero lgico, de manera que puede generar una interrupcin conectndola a la entrada /INT0 del microcontrolador. La entrada /EI del 74LS148 es de habilitacin del circuito integrado. /EI se conecta directamente a masa para que el codificador est siempre habilitado. La tabla de verdad del codificador se puede ver en la tabla 6.15.
T1 T2 T3 T4 T5 T6 T7 T8
74LS148
0 1 2 3 4 5 6 7 /EI /GS A1 A2 A3
87C51
P1.0 P1.1 P1.2 T9 P1.4 P2.7 P2.0 P2.1
7405
a b
nodo comn a f g e c d DP b
Vcc
DP
/INT0
El programa que se debe realizar en este ejemplo ha de mostrar el nmero de la ltima tecla pulsada en el dgito de siete segmentos, mientras que la pulsacin de la tecla T9 debe borrar el dgito. La interrupcin /INT0 se debe activar por nivel lgico.
;************************************************************************ ;Rutina de vectorizacin (ejemplo 6.3) ;************************************************************************ ORG 0H LJMP Inicio ORG 03H LJMP RSI_INT0 ;************************************************************************ ; Rutina de Inicio (Habilitacin de interrup., /INT0 por nivel) ;************************************************************************ ORG 0200H Inicio: SETB PX0 ;Prioridad alta para /INT0 SETB EX0 ;Activa el bit de habilitacin de /INT0 SETB EA ;Activa el bit de habilitacin general LJMP Principal ;************************************************************************ ; Programa Principal ;************************************************************************ ORG 0300H Principal: JB P1.4, Rut_ok ;Salta a Rut_ok si no se pulsa T9 MOV B,#0 ;Borra B (por tanto dgito) si se pulsa T9 Rut_ok: MOV A, B ;Lee el registro B MOV P2, A ;Carga en dgito SJMP Principal ;Bucle infinito a Principal
152
Microcontroladores MCS-51 y MCS-251 ;************************************************************************ ; Rutina de RSI de /INT0 ;************************************************************************ ORG 0400H RSI_INT0: MOV A,P1 ;Lee el puerto P1 ANL A,#07H ;Mscara, fuerza P1 a 0, excepto P1.0, P1.1 y P1.2 CALL Tecla_in ;Ejecuta subrutina Tecla_in MOV B,A ;Guarda cdigo en B CLR A ;Borra A CLR IE0 ;Borra bit IE0, para una posterior interrupcin RETI ;Retorno de interrupcin Tecla_in: INC A MOVC A,@A+PC RET DB 0111 1111b ;leds a, b, c, d, e, f y g encendidos, caracter 8, tecla T8 DB 0000 0111b ;leds a, b y c encendidos, caracter 7, tecla T7 DB 0111 1101b ;leds a, c, d, e, f y g encendidos, caracter 6, tecla T6 DB 0110 1101b ;leds a, c, d, f, y g encendidos, caracter 5, tecla T5 DB 0110 0110b ;leds b, c, f y g encendidos, caracter 4, tecla T4 DB 0100 1111b ;leds a, b, c, d y g encendidos, caracter 3, tecla T3 DB 0101 1011b ;leds a, b, d, e y g encendidos, caracter 2, tecla T2 DB 0000 0110b ;leds b y c encendidos, caracter 1, tecla T1
La rutina de RSI de /INT0 lee directamente el valor del puerto P1, aplica una mscara al valor ledo, puesto que slo interesa el valor de las patillas P1.0, P1.1 y P1.2 del puerto, y pone el cdigo del carcter en siete segmentos, correspondiente a la tecla pulsada, en el registro B. La rutina Principal comprueba el estado de la tecla T9 con la instruccin JB P1.4, Rut_ok, y sita el valor del registro B, procedente de la rutina RSI_INT0, en el puerto P2, para su visualizacin. El registro B se pone a cero cuando se pulsa la tecla T9.
153
8XC251Sx
Timer 0
PCA
Una fuente de interrupcin activa su flag de interrupcin cuando desea realizar una peticin de interrupcin a la CPU. En la tabla 6.8 se muestran los flags de interrupcin asociados a cada una de las fuentes de interrupcin, y su ubicacin. Para algunas interrupciones el flag se borra por hardware cuando la CPU atiende a la interrupcin. Los flags de interrupcin tambin pueden ser borrados por programa, mediante una instruccin, por ejemplo, del tipo CLR bit.
Tabla 6.8 Flags de peticin de interrupcin
Fuente de interrupcin
/INT0 Timer 0 /INT1 Timer 1 Puerto Serie Timer 2 PCA
X=0,.., 4
En lneas generales, el proceso de interrupcin de los microcontroladores de la familia MCS-251 sigue las pautas comentadas en el apartado de introduccin. Este proceso comienza cuando el circuito gestionador de interrupciones recibe una peticin de interrupcin. La CPU termina de ejecutar la instruccin en curso y almacena en la pila el contador de programa (PC) para, a continuacin, realizar un salto a la RSI de la interrupcin activa (figura 6.9).
Tiempo de respuesta
Oscilador Estados Peticin interrupcin externa
Push PC
Call ISR
RSI
154
Existen dos causas que pueden bloquear el salto a la RSI: 1. Se est ejecutando una interrupcin de igual o mayor nivel de prioridad. En este caso el sistema de interrupcin deber esperar a que finalice la ejecucin de la RSI de la interrupcin ms prioritaria. 2. La instruccin que se est ejecutando en ese momento es la instruccin RETI o se est escribiendo en los registros IE0, IPH0 o IPL0. En este caso se deber ejecutar, al menos, una instruccin ms antes de que el sistema salte a la RSI. El nmero de bytes almacenados en la pila depende del valor del bit INTR ubicado en el byte de configuracin, CONFIG1. Si este bit est a uno lgico, se guardarn en la pila cuatro bytes, los tres bytes del contador de programa y el registro de estado PSW1. Si el bit INTR est a cero, se guardan en la pila, nicamente, los dos bytes de menor peso del contador de programa. Cada una de las fuentes de interrupcin de la familia MCS-251 tiene asociada una direccin diferente de comienzo de la RSI, denominada vector de interrupcin. En la tabla 6.9 estn indicados los vectores de interrupcin para cada una de las fuentes de interrupcin.
Tabla 6.9 Vectores de interrupcin
La rutina de servicio a la interrupcin finaliza con la instruccin RETI. La funcin de esta instruccin es la de indicar a la CPU que ha sido completada la ejecucin de la RSI y extraer de la pila la direccin de retorno y colocarla en el PC. Cabe destacar, segn la tabla 6.8, que entre la direccin de comienzo de la RSI de una fuente de interrupcin y la siguiente hay tan slo ocho posiciones de memoria, que en la mayora de los casos es insuficiente para albergar la RSI. Por este motivo, si se utilizan interrupciones consecutivas, por ejemplo /INT0 y Timer 0, la RSI deber comenzar con un salto incondicional hacia una direccin de memoria situada en una zona del espacio de memoria disponible para almacenar las instrucciones de la RSI. A continuacin se presenta, a modo de ejemplo, un listado de instrucciones cuya funcin es reubicar la localizacin de las RSI de las fuentes de interrupcin del Timer 0, Timer 1 y PCA.
;****************************************************************************************** ; REUBICACION DE LAS RSI DE LAS FUENTES DE INTERRUPCION Timer 0, Timer 1 y PCA ;****************************************************************************************** RSI _TIMER0 EQU 2000H ; Direccin de comienzo de la RSI del Timer 0 RSI _TIMER1 EQU 2200H ; Direccin de comienzo de la RSI del Timer 1 RSI _PCA EQU 2400H ; Direccin de comienzo de la RSI del PCA ORG FF:000BH ; Vector de interrupcin del Timer 0 JMP RSI_TIMER0
6 Las interrupciones ORG FF:001BH JMP RSI_TIMER1 ORG FF:0033H JMP RSI_PCA RSI_TIMER0: ..... RETI RSI_TIMER1: ..... RETI RSI_PCA: ..... RETI ; Cdigo de la RSI del PCA ; Cdigo de la RSI del Timer 1 ; Vector de interrupcin del Timer 1 ; Vector de interrupcin del PCA ; Cdigo de la RSI del Timer 0
155
b4 ES
b0 EX0
6 5 4 3 2 1 0
Bit de habilitacin general de interrupciones: poniendo a uno lgico este bit se habilitan todas las interrupciones que estn individualmente habilitadas por los bits 0-6. Poniendo a cero este bit se inhiben todas las interrupciones excepto la interrupcin TRAP, que no puede inhibirse. Bit de habilitacin de la interrupcin del PCA: poniendo a uno lgico este bit se habilita la interrupcin del PCA. Bit de habilitacin de la interrupcin del Timer 2: poniendo a uno lgico este bit se habilita la interrupcin del Timer 2. Bit de habilitacin de la interrupcin del puerto serie : poniendo a uno lgico este bit se habilita la interrupcin del puerto serie. Bit de habilitacin de la interrupcin del Timer 1: poniendo a uno lgico este bit se habilita la interrupcin del Timer 1. Bit de habilitacin de la interrupcin externa 1: poniendo a uno lgico este bit se habilita la interrupcin externa 1. Bit de habilitacin de la interrupcin del Timer 0: poniendo a uno lgico este bit se habilita la interrupcin del Timer 0. Bit de habilitacin de la interrupcin externa 0: poniendo a uno lgico este bit se habilita la interrupcin externa 0.
156
b4 IPH0.4
b0 IPH0.0
Reservado. Bit alto de prioridad de interrupcin del PCA. Bit alto de prioridad de interrupcin del Timer 2. Bit alto de prioridad de interrupcin del puerto serie. Bit alto de prioridad de interrupcin del Timer 1. Bit alto de prioridad de la interrupcin externa 1, /INT1. Bit alto de prioridad de interrupcin del Timer 0. Bit alto de prioridad de la interrupcin externa 0, /INT0.
b4 IPL0.4
b0 IPL0.0
Reservado. Bit bajo de prioridad de interrupcin del PCA. Bit bajo de prioridad de interrupcin del Timer 2. Bit bajo de prioridad de interrupcin del Puerto Serie. Bit bajo de prioridad de interrupcin del Timer 1. Bit bajo de prioridad de la interrupcin externa 1, /INT1. Bit bajo de prioridad de interrupcin del Timer 0. Bit bajo de prioridad de la interrupcin externa 0, /INT0.
6 Las interrupciones
157
IPH0.X (MSB)
0 0 1 1
IPL0.X (LSB)
0 1 0 1
Nivel de prioridad
0 Menor prioridad 1 2 3 Mayor prioridad
El funcionamiento del mecanismo de niveles de prioridad est sujeto a unas reglas muy sencillas: 1. Una interrupcin programada en un nivel bajo puede ser interrumpida por una interrupcin programada en un nivel de prioridad mayor, pero no por una interrupcin de nivel igual o menor. Si una interrupcin est programada en el nivel tres no podr ser interrumpida por ninguna fuente de interrupcin. Si dos o ms interrupciones se activan al mismo tiempo la CPU atender en primer lugar a la interrupcin de mayor nivel de prioridad. Una vez ejecutada la rutina de la interrupcin ms prioritaria, la CPU atender al resto de fuentes de interrupcin siguiendo un orden decreciente de prioridades. Si se reciben peticiones de interrupcin simultneas correspondientes a fuentes programadas en un mismo nivel de prioridad, el orden de respuesta seguir una secuencia preestablecida indicada en la tabla 6.14.
2. 3.
4.
Prioridad
1 (Prioridad mayor) 2 3 4 5 6 7 (Prioridad menor)
Fuente de interrupcin
/INT0 Timer 0 /INT1 Timer 1 Puerto serie Timer 2 PCA
Ejemplo 6.4 Atencin a mltiples interrupciones Seguidamente se plantea un caso prctico de programacin de varias fuentes de interrupcin en distintos niveles de prioridad. En concreto se consideran cuatro fuentes de interrupcin programadas en los siguientes niveles: Timer 0 en nivel 3, /INT1 en nivel 2, puerto serie en nivel 2 y PCA en nivel 1. Para realizar esta asignacin de niveles de prioridad se deben programar los registros de prioridad de interrupcin con los siguientes valores: IPH0 = 16H (0001 0110), IPL0 = 42H (0100 0010). Si en estas condiciones se produce en primer lugar una peticin de interrupcin del PCA, la CPU pasar a ejecutar la RSI del PCA. Si mientras se ejecuta la RSI del PCA, ocurre una peticin simultnea de interrupcin de las fuentes /INT1 y puerto serie, la CPU dejar de
158
ejecutar la RSI del PCA para ejecutar las RSI de las interrupciones que se han activado, dado que poseen un nivel de prioridad mayor. Las interrupciones /INT1 y puerto serie poseen el mismo nivel de prioridad pero, teniendo en cuenta el orden establecido en la tabla 6.14, se ejecutar primero la RSI de la interrupcin /INT1 y, a continuacin, la RSI del puerto serie. Si, por ejemplo, se activa la interrupcin Timer 0 mientras se est ejecutando la RSI del puerto serie, la CPU pasa a ejecutar la RSI del Timer 0, porque posee un nivel de prioridad mayor que el puerto serie. Una vez ejecutada la RSI del Timer 0, la CPU finalizar la ejecucin de la RSI del puerto serie y, a continuacin, acabar de ejecutar la RSI del PCA para, finalmente, continuar ejecutando el programa Principal. En la figura 6.10 se representa, de forma esquemtica, la secuencia que sigue la CPU en la atencin a las distintas fuentes de interrupcin de este ejemplo.
PROGRAMA PRINCIPAL
RSI_/INT1
RSI_PCA
Int. PCA
Int. /INT1 y PS
RETI
Int. T0
RETI
RETI
Fig. 6.10 Esquema de la secuencia de atencin a las interrupciones del ejemplo 6.4
6 Las interrupciones
159
El perifrico externo interrumpe al C y activa la entrada de interrupcin. El C responder saltando a la direccin de comienzo de la RSI asociada a la interrupcin activada. Las interrupciones externas /INT0 e /INT1 se pueden programar para ser activas por flanco descendente o por nivel bajo, dependiendo del valor de los bits IT0 e IT1 del registro TCON. Con el bit IT0 a cero lgico, la interrupcin /INT0 se activa por nivel, mientras que con IT0 a uno lgico, la interrupcin /INT0 se activa por flanco descendente. La misma relacin se produce entre el bit IT1 y la interrupcin /INT1. Cuando se genera una interrupcin externa del tipo /INT0 o /INT1, se activa el correspondiente flag de peticin de interrupcin, bits IE0 o IE1, del registro TCON (tabla 6.15). Si la interrupcin se ha activado por flanco descendente, los flags de peticin de interrupcin se borran por hardware cuando la CPU salta a la rutina de atencin a la interrupcin para proceder a su ejecucin. Si la interrupcin se activa por nivel, el flag de interrupcin se deber borrar mediante una instruccin dentro de la RSI. Para este caso, la causa que ha generado la interrupcin externa /INT0 o /INT1 debe desactivarse antes de que acabe la RSI o se generar una nueva peticin de interrupcin.
8XC251
Perifrico 1 INT0 (P3.2) INT
Fig. 6.11 Conexin de perifricos externos a las entradas de interrupcin del C 8XC251Sx
Para detectar la peticin de interrupcin, la CPU lee el estado de los pines asociados a las interrupciones externas /INT0 e /INT1 una vez cada ocho perodos de reloj. Tanto si la interrupcin externa est programada por nivel como por flanco, ser necesario mantener un nivel bajo durante al menos diez perodos para garantizar la deteccin de la interrupcin.
Tabla 6.15 Interrupciones externas
Fuente de interrupcin Flag Bit de configuracin por flanco o nivel Vector de interrupcin
/INT0 /INT1 IE0 IE1 IT0 IT1 FF:0003H FF:0013H
Si la aplicacin diseada requiere el control de ms de dos perifricos externos, se deber incluir en el diseo algn sistema, hardware y/o software, que permita determinar qu perifrico o perifricos han interrumpido, y en el caso que haya interrumpido ms de uno, en qu orden se deben atender. El establecimiento del orden de prioridad se puede hacer externamente, utilizando un controlador de prioridad de interrupciones (PIC), o bien, mediante software, programando en la RSI el orden de atencin a los distintos perifricos.
160
Ejemplo 6.5 Control de mltiples perifricos externos mediante un codificador de prioridad A continuacin se presenta un ejemplo de sistema de gestin de mltiples fuentes de interrupcin externas mediante un codificador de prioridad 74LS148 (figura 6.12), cuyo funcionamiento se detalla en la tabla 6.16. En este ejemplo, se han considerado 8 perifricos cuyas salidas de interrupcin estn conectadas a las entradas del codificador de prioridad. Las salidas de datos A2, A1 y A0 del codificador de prioridad estn a su vez conectadas a las tres lneas de menor peso del puerto P1 del microcontrolador 8XC251Sx.
Perifrico 7 Perifrico 6 Perifrico 5 Perifrico 4 Perifrico 3 Perifrico 2 Perifrico 1 Perifrico 0 INT INT INT INT INT INT INT INT
74LS148
7 6 5 4 3 2 1 0 E1 GS EO
8XC251
A1 A2 A3
Fig. 6.12 Establecimiento de prioridades mediante el codificador de prioridad 74LS148 Tabla 6.16 Tabla de verdad del codificador de prioridad 74LS148 EI
H L L L L L L L L L
0
X H X X X X X X X L
1
X H X X X X X X L H
ENTRADAS 2 3 4
X H X X X X X L H H X H X X X X L H H H X H X X X L H H H H
5
X H X X L H H H H H
6
X H X L H H H H H H
7
X H L H H H H H H H
A2
H H L L L L H H H H
A1
H H L L H H L L H H
SALIDAS A0 /GS
H H L H L H L H L H H H L L L L L L L L
/EO
H L H H H H H H H H
Si uno o varios perifricos activan las entradas del codificador 74LS148, ste pondr a cero su salida /GS, y se realizar una peticin de interrupcin al C 8XC251Sx a travs de la entrada /INT0. Al mismo tiempo, en las salidas de datos A2, A1 y A0, aparece la combinacin binaria correspondiente a la entrada activa de mayor peso. Por tanto, la prioridad en la atencin a los perifricos se establece mediante el orden en que se conectan stos a las entradas del codificador, de forma que el perifrico que est conectado a la entrada siete es el de mayor prioridad, y el que est conectado a la entrada cero el de menor prioridad. En la rutina de servicio a la interrupcin /INT0, se deber determinar cul de los perifricos ha interrumpido, mediante la lectura del puerto P1, y saltar a la rutina especfica que lo atiende.
6 Las interrupciones
161
Por otro lado, se debe establecer una tabla de vectores de salto, donde se adjudique una direccin de comienzo de la RSI de cada uno de los perifricos (tabla 6.17). Lgicamente, las rutinas de atencin a los perifricos se deben colocar en zonas de memoria que no se utilicen para otro fin.
Tabla 6.17 Direcciones de comienzo de las rutinas de atencin a los perifricos
Perifrico
7 6 5 4 3 2 1 0
Valor de P1
00 H 01 H 02 H 03H 04H 05H 06 H 07H
;*********************************************************************************** ; RUTINA DE SERVICIO A LA INTERRUPCION INT0 ;*********************************************************************************** ORG FF:0003H JMP SRI_INT0 ; La RSI comienza en la direccin FF:1000H para tener ms espacio de memoria. ORG FF:1000H SRI_INT0: MOV A,P1 ; Se lee la combinacin binaria que proporciona el codificador. ANL A,#07H ; Unicamente se toman los 3 bits significativos de P1. RL A ; Se multiplica por dos. MOV DPTR,#JMP_TBL ; En funcin de la combinacin leda se salta a la rutina JMP @A+DPTR ; que atiende al perifrico que ha interrumpido. JMP_TBL: AJMP RUT7 ; Salto a la rutina que atiende al perifrico siete. AJMP RUT6 ; Salto a la rutina que atiende al perifrico seis. AJMP RUT5 ; Salto a la rutina que atiende al perifrico cinco. AJMP RUT4 ; Salto a la rutina que atiende al perifrico cuatro. AJMP RUT3 ; Salto a la rutina que atiende al perifrico tres. AJMP RUT2 ; Salto a la rutina que atiende al perifrico dos. AJMP RUT1 ; Salto a la rutina que atiende al perifrico uno. AJMP RUT0 ; Salto a la rutina que atiende al perifrico cero. ORG FF:1100H RUT7: ; Instrucciones de la rutina que atiende al perifrico siete. ........ RETI ORG FF:1180H RUT6: ; Instrucciones de la rutina que atiende al perifrico seis. ........ RETI ORG FF:1200H RUT5: ; Instrucciones de la rutina que atiende al perifrico cinco. ........ RETI ORG FF:1280H RUT4: ; Instrucciones de la rutina que atiende al perifrico cuatro. ........ RETI ORG FF:1300H RUT3: ; Instrucciones de la rutina que atiende al perifrico tres. ........ RETI
162
ORG FF:1380H RUT2: ........ RETI ORG FF:1400H RUT1: ........ RETI ORG FF:1480H RUT0: ........ RETI
Ejemplo 6.6 Control de mltiples perifricos externos mediante chequeo En este ejemplo se utiliza una secuencia de chequeo para determinar la prioridad de atencin a ocho perifricos externos conectados a la entrada de interrupcin /INT0 (figura 6.13). Las salidas de interrupcin de cada perifrico se han conectado a la entrada /INT0 a travs de un driver de salida en colector abierto. Basta que un perifrico active su salida de interrupcin para que la entrada de interrupcin /INT0 pase a cero lgico. El perifrico que interrumpe activa al mismo tiempo un bit del puerto P1. Cuando ocurre una interrupcin, la RSI se encarga de leer el puerto P1 y averiguar por chequeo qu perifrico o perifricos han interrumpido y atenderlos siguiendo un orden establecido en la propia RSI. En la figura 6.14 est representado el flujograma correspondiente a este ejemplo. La prioridad de cada perifrico se establece con el orden de chequeo de los bits del puerto P1. En este ejemplo, se verifica en primer lugar el bit P1.7, de forma que es el perifrico 7 el ms prioritario. El perifrico 0 es el menos prioritario porque se verifica en ltimo lugar.
Perifrico 7 Perifrico 6 Perifrico 5 Perifrico 4 Perifrico 3 Perifrico 2 Perifrico 1 Perifrico 0 INT INT INT INT INT INT INT INT
8XC251
P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0
6 Las interrupciones ;***************************************************************** ; RUTINA DE SERVICIO A LA INTERRUPCION INT0 ;***************************************************************** ORG FF:0003H JMP SRI_INT0 ; La rutina comienza en la direccin FF:1000H ORG FF:1000H ; para tener ms espacio de memoria SRI_INT0: JB P1.7,SIG6 ; Si P1.7 (bit MSB) es cero salta a la CALL SRI_7 ; rutina de atencin del perifrico 7 SIG6: JB P1.6,SIG5 ; Si P1.6 es cero salta a la rutina CALL SRI_6 ; de atencin del perifrico 6 SIG5: JB P1.5,SIG4 ; Si P1.5 es cero salta a la rutina CALL SRI_5 ; de atencin del perifrico 5 SIG4: JB P1.4,SIG3 ; Si P1.4 es cero salta a la rutina CALL SRI_4 ; de atencin del perifrico 4 SIG3: JB P1.3,SIG2 ; Si P1.3 es cero salta a la rutina CALL SRI_3 ; de atencin del perifrico 3 SIG2: JB P1.2,SIG1 ; Si P1.2 es cero salta a la rutinala rutina CALL SRI_2 ; de atencin del perifrico 2 SIG1: JB P1.1,SIG0 ; Si P1.1 es cero salta a la rutina CALL SRI_1 ; de atencin del perifrico 1 SIG0: JB P1.0,FIN ; Si P1.0 es cero salta a la rutina CALL SRI_0 ; de atencin del perifrico 0 FIN: RETI SRI_7: ; Instrucciones de la rutina de atencin del perifrico 7 ....... RET SRI_6: ; Instrucciones de la rutina de atencin del perifrico 6 ....... RET SRI_5: ; Instrucciones de la rutina de atencin del perifrico 5 ....... RET SRI_4: ; Instrucciones de la rutina de atencin del perifrico 4 ....... RET SRI_3: ; Instrucciones de la rutina de atencin del perifrico 3 ....... RET SRI_2: ; Instrucciones de la rutina de atencin del perifrico 2 ....... RET SRI_1: ; Instrucciones de la rutina de atencin del perifrico 1 ....... RET SRI_0: ; Instrucciones de la rutina de atencin del perifrico 0 ....... RET
163
RSI /INT0 LEER EL PUERTO P1
P1.7 = 0?
NO
SI
P1.6 = 0?
NO
SI
P1.5 = 0?
NO
SI
P1.4 = 0?
NO
SI
P1.3 = 0?
NO
SI
P1.2 = 0?
NO
SI
P1.1 = 0?
NO
SI
P1.0 = 0?
NO
SI
RETI
164
El Timer 2 posee dos flags de interrupcin, TF2 y EXF2, ubicados en el registro T2CON (tabla 6.7). La activacin de cualquiera de estos bits genera una peticin de interrupcin a la CPU y su borrado debe realizarse por software. Por tanto, la rutina de servicio a la interrupcin deber determinar cul de los dos bits ha generado la interrupcin y borrarlo. A continuacuin se presenta el flujograma (figura 6.15) y el listado de un ejemplo de RSI del Timer 2. Este programa incorpora las instrucciones que permiten detectar cul de los dos flags de interrupcin del Timer 2 se ha activado, y actuar en consecuencia, de forma que si el flag activo es TF2, se ejecuta la rutina RUTINA_TF2, y si el flag activo es EXF2, se ejecuta la rutina RUTINA_EXF2.
;**************************************************************** ; RUTINA DE SERVICIO A LA INTERRUPCION TIMER 2 ;**************************************************************** ORG FF:002BH ; Direccin de comienzo de la RSI del Timer 2 como origen del programa JMP FF:0300H ;Salto a la direccin FF:0300H donde comienza la rutina del Timer 2 ORG FF:0300H ; Programa de inicio de la RSI del Timer 2 JBC TF2, RUTINA_TF2 ;Si el flag activo es TF2 se pone a 0 lgico y se salta a ;la rutina que debe ejecutarse en caso de activacin del flag TF2 CLR EXF2 ; Si el flag TF2 no esta activo se borra el flag EXF2 y se ; ejecuta la rutina RUTINA_EXF2 ;Instrucciones de la rutina RUTINA_EXF2 ...... RETI ;Instrucciones de la rutina RUTINA_TF2 RUTINA_TF2: . . . . . . . RETI
RSI Timer 2
SI TF2=1? NO
EXF2=0 RUTINA_EXF2
TF2=0 RUTINA_TF2
RETI
6 Las interrupciones ;************************************************************* ; RUTINA DE SERVICIO A LA INTERRUPCION DEL PCA ;************************************************************* PCA EQU FF:0400H ;Etiqueta a la direccin de la RSI del PCA ORG FF:0033H ;Direccin vector de interrupcin del PCA JMP PCA ;Salto a la rutina de la RSI del PCA ORG FF:0400H ;Programa de RSI del PCA JBC CF, RUTINA_CF ;Salta si CF=1 y borra el flag. POL_CCF0: JBC CCF0,RUTINA_CCF0 ;Salta si CCF0=1 y borra el flag POL_CCF1: JBC CCF1,RUTINA_CCF1 ;Salta si CCF1=1 y borra el flag POL_CCF2: JBC CCF2,RUTINA_CCF2 ;Salta si CCF2=1 y borra el flag POL_CCF3: JBC CCF3,RUTINA_CCF3 ;Salta si CCF3=1 y borra el flag POL_CCF4: JBC CCF4,RUTINA_CCF4 ;Salta si CCF4=1 y borra el flag ; ;Instrucciones de la RUTINA_CF ...... JMP POL_CCF0 ; Cuando termina la ejecucin de RUTINA_CF ; salto a comprobar el siguiente bit ; Instrucciones de la RUTINA_CCF0 ....... JMP POL_CCF1 ;Cuando termina la ejecucin de RUTINA_CCF0 ; salto a comprobar el siguiente bit ....... ; Instrucciones de la RUTINA_CCF4 ....... RETI ; Cuando termina la ejecucin de RUTINA_CCF4 ; termina la ejecucin de la RSI.
165
RSI PCA
CF=1?
NO
SI
RUTINA_CF
CCF0=1?
NO
SI
RUTINA_CCF0
CCF1=1?
NO
SI
RUTINA_CCF1
CCF2=1?
NO
SI
RUTINA_CCF2
CCF3=1?
NO
SI
RUTINA_CCF3
CCF4=1?
NO
SI
RUTINA_CCF4
RETI
166
;****************************************************************** ; RUTINA DE SERVICIO A LA INTERRUPCION TIMER 2 ;****************************************************************** ORG FF:0023H ; Direccin de comienzo de la RSI del puerto serie JMP FF:0400H ; Salto a la direccin de la rutina del puerto serie ORG FF:0400H ; Programa de inicio de la RSI del Timer 2 JBC TF2, RUT_TI ; Si el flag activo es TI se pone a 0 lgico y ; salta a la rutina correspondiente CLR RI ; Si el flag TI no est activo se borra el flag RI y ; se ejecuta la rutina RUT_RI ;Instrucciones de la RUT_RI ...... RETI ;Instrucciones de la RUT_TI RUT_TI: ....... RETI
SI TI = 1? NO
RI = 0 RUT_RI
TI = 0 RUT_TI
RETI
Ejemplo 6.7 Control del ndice de acidez (pH) del agua de un depsito Se plantea a continuacin, como ejemplo ilustrativo de la utilizacin del sistema de interrupciones del microcontrolador 8XC251Sx, un caso prctico de control de una planta de tratamiento de aguas residuales. El objetivo de este ejemplo es mostrar el funcionamiento de las interrupciones por lo que respecta a la habilitacin, los niveles de prioridad, el manejo de los flags de interrupcin, etc. La planta que se debe controlar dispone de un sistema que neutraliza la acidez de las aguas residuales provenientes de una planta de fabricacin de papel (figura 6.18). El sistema posee un depsito donde se mezcla el agua residual con la cantidad adecuada del componente neutralizador, cuya funcin es disminuir la acidez del agua, de forma que el agua de salida del depsito posea un pH superior a 5.5. El sistema de control incorpora dos sensores activos a nivel alto: Un detector de rebosamiento, S1, que se activa cuando el agua contenida en el depsito supera la altura mxima permitida. Un detector de pH, M, que se activa cuando el pH del agua es inferior a 5.5. El sistema de control dispone adems de dos actuadores V1 y V2, activos a nivel alto, cuya funcin es realizar la apertura de dos vlvulas. Cuando se activa el actuador V1 se abre la vlvula que permite la entrada de las aguas residuales al depsito. Cuando se activa el actuador V2 se abre la vlvula que permite el vertido de neutralizador en el depsito. Por ltimo, existen dos indicadores luminosos, A1 y A2, activos a nivel alto, cuya funcin es la de monitorizar la apertura de las vlvulas V1 y V2.
6 Las interrupciones
167
Neutralizador
A1 Sistema de control A2
V1
V2 S1 M Medidor pH Descarga
En la figura 6.19 est representado el esquema elctrico donde se detalla la conexin del C 8XC251Sx con los diferentes sensores y actuadores que intervienen en esta aplicacin. Cabe destacar que los sensores S1 y M estn conectados a las entradas de interrupcin /INT0 e /INT1 a travs de sendas puertas inversoras, debido a que las interrupciones externas se activan a nivel bajo, mientras que estos sensores son activos a nivel alto.
8XC251
P1.2 P1.3 S1 M INT0 INT1 P1.0 P1.1 A1 A2 V1 V2
La estrategia que debe llevar a cabo el sistema de control para gestionar el funcionamiento de la planta de tratamiento de aguas residuales se puede resumir en dos puntos: La vlvula V1 debe permanecer abierta hasta que el sensor S1 se active; entonces se cerrar durante treinta segundos. Si una vez pasado este tiempo el sensor S1 sigue activo, se repetir la operacin de cierre de la vlvula V1. Mientras V1 est abierta, el indicador A1 permanecer encendido; en caso contrario el indicador parpadear. La vlvula V2 debe estar cerrada hasta que se active el sensor M y entonces abrirse durante cinco segundos. Una vez transcurrido ese tiempo, si el sensor M continua activo, se repetir la operacin de apertura de la vlvula V2. El indicador A2 se activa cuando la vlvula V2 est abierta y parpadea cuando est cerrada.
Los recursos utilizados para resolver esta aplicacin son cuatro: La interrupcin externa /INT0, que se encarga de detectar la activacin del sensor S1. La interrupcin se activa por nivel para que pueda ser atendida por la CPU mientras el sensor S1 se encuentre a uno lgico. La interrupcin externa /INT1, cuya funcin es detectar la activacin del medidor de pH. Esta interrupcin tambin se programa por nivel por el mismo motivo que la /INT0.
168
El Timer 0, que se encarga de temporizar el intervalo de 30 s, tiempo que debe permanecer abierta la vlvula V1 cuando se active S1. El Timer 1, que se encarga de temporizar los 5 s de apertura de la vlvula V2. El programa esta compuesto de una rutina principal y de cuatro rutinas de atencin a la interrupcin, una por cada fuente de interrupcin utilizada en la aplicacin. La funcin del programa principal ser bsicamente la de habilitar y programar los niveles de prioridad de las diversas fuentes de interrupcin utilizadas, as como la de ejecutar la secuencia de parpadeo de los indicadores luminosos A1 y A2. Para habilitar las cuatro fuentes de interrupcin se ponen a uno lgico los bits correspondientes del registro habilitador de interrupciones IE0: EX0, ET0, EX1 y ET1. Esto se consigue cargando en el registro IE0 el valor 8FH (10001111b). Por otra parte, se deben poner a uno lgico los bits IT0 e IT1 del registro TCON, con el objetivo de que las interrupciones externas /INT0 e /INT1 se activen por nivel. Esto se consigue almacenando en el registro TCON el valor 0AH (0000 1010b). A continuacin se debe establecer la prioridad de las interrupciones. En principio se adjudica a las interrupciones /INT0 y Timer 0 una prioridad mayor que a las interrupciones /INT1 y Timer 1, dado que la situacin de rebasamiento requiere una actuacin ms urgente que la superacin del nivel de pH. Las fuentes /INT0 y Timer 0 se programan con nivel de prioridad tres, mientras que las fuentes de interrupcin /INT1 y Timer 1 se programan con un nivel de prioridad menor, por ejemplo con nivel cero. Por tanto, los registros de nivel de prioridad IPH0 e IPL0 quedan: IPH0 = 03H y IPL0 = 03H. Por ltimo, se debe poner el bit INTR del byte de configuracin CONFIG1 a uno lgico. De esta forma, cuando la CPU ejecute una interrupcin, se cargarn en la pila, automticamente, los tres bytes del contador de programa, PC, y el registro de estado, PSW1. En cuanto a la rutina de retardo, que se utiliza para temporizar el parpadeo de los indicadores luminosos, estar compuesta de dos bucles anidados, basados en decrementar los registros R0 y R1. Modificando el valor de los registros R0 y R1 se puede variar el tiempo de ejecucin de la rutina y, por tanto, la frecuencia de parpadeo. Para calcular el tiempo de retardo hay que determinar el nmero de veces que se ejecuta cada instruccin, as como el tiempo que tarda en ejecutarse cada una de ellas. En la figura 6.20 se muestran los flujogramas correspondientes al programa principal y a la rutina de retardo. En la figura 6.21 se muestran los flujogramas de las rutinas de atencin a las interrupciones /INT0 y Timer 0. Las tareas que debe realizar la rutina de atencin a la interrupcin /INT0 son: Cerrar la vlvula V1. Inicializar el Timer 0 para que temporice 30 s. Inhibir la interrupcin /INT0 para impedir que se ejecute de forma repetida la RSI de la /INT0 mientras el sensor S1 se encuentra activo y no ha finalizado la temporizacin de 30s.
6 Las interrupciones
169
Si consideramos que la frecuencia de reloj es de 1.2 MHz, se puede determinar, mediante un clculo sencillo, que el Timer 0 debe rebasar varias veces para temporizar 30 s. En la RSI del Timer 0 se debe contar el nmero de rebasamientos que sufre este temporizador. Cuando el Timer 0 rebasa un nmero de veces equivalente a 30 s se abre la vlvula V1, se detiene el funcionamiento del Timer 0 y se habilita de nuevo la interrupcin /INT0, de forma que si el sensor S1 contina activo se repite de nuevo la secuencia de cierre de V1.
PRINCIPAL RETARDO
R0 = 10H
R1 = FFH
P1.2 = 1 P1.3 = 1
DECREMENTA R1
RETARDO
R1 = 0?
SI
NO
P1.2 = 0 P1.3 = 0
DECREMENTA R0
RETARDO
R0 = 0?
SI
NO
RET
CERRAR VLVULA V1
T = 30s? SI PARAR T0
NO
INICIALIZAR T0
ACTIVACIN T0 ABRIR VLVULA V2 INHIBIR INT0 BORRAR IE0 RETI HABILITAR INT0
RETI
Fig. 6.21 Flujogramas de las rutinas de servicio a las interrupciones /INT0 y Timer 0
170
Las rutinas de atencin a las interrupciones /INT1 y Timer 1 tienen funciones similares a las interrupciones /INT0 y Timer 0. En la figura 6.22 se presentan los flujogramas correspondientes a ambas rutinas.
INT1 T1
ABRIR VLVULA V2
T = 5s? SI PARAR T1
NO
INICIALIZAR T1
ACTIVACIN T1 CERRAR VLVULA V2 INHIBIR INT1 BORRAR IE1 RETI HABILITAR INT1
RETI
Fig. 6.22 Flujogramas de las rutinas de servicio a las interrupciones /INT1 y Timer1
6 Las interrupciones ;************************************************************************ ; RUTINA DE RETARDO ;************************************************************************* ORG FF:0200H RETARDO: MOV R0,#10H ; R0 = 10H SALT2: MOV R1,#FFH ; R1 = FFH SALT1: DJNZ R1,SALT1 ; Decrementa R1 y si es distinto de 0 salta a SALT1 DJNZ R0,SALT2 ; Decrementa R2 y si es distinto de 0 salta a SALT2 RET ;************************************************************************ ; RUTINA DE SERVICIO A LA INTERRUPCION INT0 ;************************************************************************* ORG FF:0300H RSI_INT0: CLR P1.0 ; Se cierra la vlvula V1 SETB TMOD.0 ; Se programa el Timer 0 en modo 1 MOV TH0,#3CH ; Se inicializa el Timer 0 para temporizar 0.5 s MOV TL0,#AFH ; MOV R3,#00H ; El registro R3 contar los rebasamientos del Timer 0 SETB TR0 ; Puesta en marcha del Timer 0 CLR EX0 ; Se inhibe la interrupcin /INT0 RETI
171
Clculo del valor inicial del Timer 0 Para temporizar los treinta segundos se inicia el Timer 0 para que tarde 0.5 s en rebasar (de forma que se deben contabilizar 60 rebasamientos en la RSI del Timer 0 para abrir de nuevo la vlvula V1). Para temporizar 0.5 s, con una frecuencia de reloj de 1.2 MHz, el Timer 0 debe incrementarse 50.000 veces (C350H); luego se ha de cargar dicho Timer con la combinacin resultante de restar a FFFFH el valor C350H: FFFFH - C350H = 3CAFH
;************************************************************************** ; RUTINA DE SERVICIO A LA INTERRUPCION TIMER 0 ;*************************************************************************** ORG FF:0400H RSI_T0: INC R3 ; Se incrementa el contador de rebasamientos CMP R3,59d ; Se compara el nmero de rebasamientos con 59 JNC SIGUE ; Si el nmero de rebasamientos es menor o igual que 59 continua temporizando CLR TR0 ; En caso contrario se detiene el Timer 0 y CLR P1.0 ; se abre la vlvula V1 SETB EX0 ; Se habilita de nuevo la interrupcin /INT0 CLR IE0 ; Se borra el flag de la interrupcin /INT0 SIGUE: RETI ; Retorno al programa principal ;**************************************************************************** ; RUTINA DE SERVICIO A LA INTERRUPCION INT1 ;***************************************************************************** ORG FF:0500H RSI_INT1: SETB P1.1 ; Se abre la vlvula V2. SETB TMOD.4 ; Se programa el Timer 1 en modo 1 MOV TH1,#3CH ; Se inicializa el Timer 1 para temporizar 0.5 s MOV TL1,#AFH ; MOV R4,#00H ; El registro R4 contar los rebasamientos del Timer 1 SETB TR1 ; Puesta en marcha del Timer 1 CLR EX1 ; Se inhibe la interrupcin /INT1 RETI
172
;************************************************************************** ; RUTINA DE SERVICIO A LA INTERRUPCION TIMER 1 ;************************************************************************** ORG FF:0600H RSI_T1: INC R4 ; Se incrementa el contador de rebasamientos CMP R4,09d ; Se compara el nmero de rebasamientos con 9 JNC SIGUE1 ; Si el nmero de rebasamientos es menor o igual que 9 continua temporizando. CLR TR1 ; Se detiene el Timer 1 SETB P1.1 ; Se abre la vlvula V2 SETB EX1 ; Se habilita la interrupcin /INT1 CLR IE1 ; Se borra el flag de la interrupcin /INT1 SIGUE1: RETI ; Retorno al programa principal
173
174
Puerta de transmisin
THx
(8 bits)
TF x
* Modo
Fig. 7.1 Esquema funcional para los Timers 0 y 1 en los modos 0 y 1 de funcionamiento
El bloque de seleccin de temporizador/contador, mediante el bit C / T del registro TMOD, Timer Mode, selecciona la fuente de entrada de pulsos del Timer, que puede provenir directamente de la seal de reloj del microcontrolador dividida por 12, para C / T a 0 lgico, o de una entrada de pulsos externa a travs del terminal Tx del microcontrolador, para C / T a 1 lgico. El bloque de lgica de control utiliza una puerta de transmisin para dejar pasar, o no, los pulsos de reloj hacia el contador (figura 7.1). En este bloque intervienen el bit TRx, Timer Run, del registro TCON, el bit GATE del registro TMOD y el terminal de entrada /INTx, con el propsito de controlar el paso de pulsos de reloj hacia el contador, lo que a partir de este momento se definir como puesta en marcha o parada del contador. Con los bits TRx y GATE se puede poner en marcha o parar el Timer de forma directa, por software, o bien, por medio del estado lgico del terminal /INTx, por hardware.
175
Observando el circuito de la lgica de control, se deduce que si el bit GATE se pone a 0 lgico, en la entrada de la puerta OR (figura 7.1), habr un 1 lgico y, por tanto, un 0 lgico en la entrada de la puerta AND; en esta situacin queda claro que la puerta est gobernada por el estado lgico del bit TRx. Entonces, si TRx vale 0 lgico, la puerta queda abierta y el Timer parado, y si TRx vale 1 lgico, la puerta queda cerrada y el Timer en marcha, y se incrementa a cada pulso de entrada. En esta situacin, con el bit GATE a 0 lgico, la puesta en marcha o la parada del Timer depende del estado del bit TRx, y queda, en consecuencia, gobernado por software. Si GATE se pone a 1 lgico, a la entrada de la puerta OR, tras la puerta inversora (figura 7.1), habr un 0 lgico; luego, el estado lgico de la puerta OR depender directamente del estado lgico del terminal /INTx. Si al mismo tiempo, el bit TRx se pone a 1 lgico, queda claro que el gobierno de la puerta de transmisin depender del terminal /INTx, que pondr en marcha el Timer cuando /INTx est a 1 lgico, y parar el Timer cuando /INTx est a 0 lgico, lo que se mencionar, a partir de ahora, como puesta en marcha o parada del contador por hardware, es decir, por el estado lgico de /INTx. La determinacin del modo de funcionamiento del Timer 0 y del Timer 1 se realiza con los bits M0 y M1 del registro TMOD: existen, en efecto, en este registro un par de bits para cada Timer (tabla 7.1). El contenido del registro TCON se muestra en la tabla 6.2.
Tabla 7.1 Registro TMOD
(MSB) GATE C/T M1 Registro TMOD M0 GATE C/T M1 (LSB) M0
Timer 1
Timer 0
Bit GATE
Comentario GATE a 0 lgico hace que el Timer se gobierne mediante TRx, con TRx a 1 lgico se pone en macha el Timerx y con TRx a 0 lgico se detiene (x=0 1). GATE a 1 lgico, junto con TRx a 1, hace que el Timer se gobierne por hardware, mediante el estado lgico de la entrada /INTx. Selecciona entre pulsos de la seal de reloj o pulsos del terminal Tx. Si C/T est a 0 se toman los pulsos de la seal de reloj y si C/T est a 1 se toman de Tx. Seleccin del modo de trabajo Modo 0. Temporizador/contador de 13 bits. Modo 1. Temporizador/contador de 16 bits. Modo 2. Temporizador/contador de 8 bits con autorrecarga. Modo 3. Varios contadores.
C/T M1 M0 0 0 0 1 1 0 1 1
7.2.1.1 Modo 0. Temporizador/contador de 13 bits En el modo 0, el Timer 0 y el Timer 1 operan como temporizadores/contadores de 13 bits (figura 7.1), empleando, en realidad, el registro TLx como un divisor previo de 5 bits, que puede dividir la frecuencia de la seal de entrada de los Timers hasta por 32; y el registro THx como un contador de 8 bits conectado a la salida de TLx. Los tres bits altos de TLx estn en un estado indeterminado, que debe ser ignorado.
176
El sentido del contador es siempre ascendente y se incrementa con cada pulso de entrada. El rebasamiento del Timer se produce cuando pasa de tener todos los bits de uno lgico a cero lgico; entonces se activa el bit correspondiente de rebasamiento, TFx, y se genera una interrupcin a la CPU.
7.2.1.2 Modo 1. Temporizador/contador de 16 bits En el modo 1 el Timer 0 y el Timer 1 operan como un temporizador/contador de 16 bits (figura 7.1). En este modo los registros TLx y THx son dos contadores de 8 bits que estn conectados en cascada para formar el contador de 16 bits. Al igual que en el modo 0, en el modo1 el sentido del contador es ascendente, y el rebasamiento se produce al pasar el contenido de los registros TLx y THx de todos los bits de uno lgico a cero lgico. El rebasamiento entonces activa el bit TFx y genera una interrupcin a la CPU.
7.2.1.3 Modo 2. Temporizador/contador de 8 bits con autorrecarga En el modo 2 el Timer 0 y el Timer 1 funcionan como un temporizador/contador de 8 bits con autorrecarga (figura 7.2). El contador est formado por el registro TLx, mientras que el registro THx hace la funcin de registro de recarga. En este modo de trabajo, cuando se produce un desbordamiento en el contador, el bit TFx se activa de manera automtica, causa una interrupcin a la CPU y hace, al mismo tiempo, que el contenido de THx se cargue en el registro TLx, por lo que el contador comienza a contar pulsos a partir del valor cargado. Este proceso de recarga no modifica el valor del registro THx, mediante el cual se pueden generar perodos de tiempo precisos a partir del valor situado en THx.
XTAL1 12 0 Tx C/T TR x TH x GATE INT x x=01 TL x 1 TF x Interrupcin
Ejemplo 7.1 Generacin de una seal peridica Es habitual en un sistema tener que generar seales peridicas: en el caso de la MCS-51 se pueden llevar a cabo empleando uno o varios de sus temporizadores. En este ejemplo se usa el Timer 0 en el modo 2 de 8 bits con autorrecarga, para generar una seal binaria de 5kHz de frecuencia. Para determinar el perodo de la seal se emplear el registro TH0 del Timer 0. La seal generada se extraer a travs de la patilla P1.0 del microcontrolador (figura 7.3).
7 Temporizadores/contadores internos y watchdog ;*************************************************************** ; Generacin de una seal peridica ; Rutina de Vectorizacin ;*************************************************************** ORG 0H LJMP Inicio ORG 0BH LJMP RSI_Timer0 ;*************************************************************** ; Rutina de Inicio ;*************************************************************** Inicio: SETB PT0 ;Asigna prioridad alta al Timer 0 SETB ET0 ;Habilita interrupcin del Timer 0 SETB EA ;Habilita bit de interrupcin general MOV TMOD,#02H ;M1=1 y M0=0 (Modo 2), ; GATE=0 y C/T=0 del Timer 0 MOV TL0, #156 ;Pone valor 156 en TL0 (256-100) MOV TH0, #156 ;Pone valor de recarga en TH0 (256-100) SETB TR0 ;Pone marcha el contador ;*************************************************************** ; Rutina de Principal ;*************************************************************** Principal: SJMP Principal ;Bucle infinito sin una tarea concreta ;*************************************************************** ; Rutina de servicio del Timer0 ;*************************************************************** RSI_Timer0:CPL P1.0 ;Complementa P1.0. Pasa de 1 a 0, y de 0 a 1 RETI ;Fin de rutina. El bit TF0 se borra automticamente
177
MCS-51
P1.0
En el programa realizado se habilita la interrupcin del Timer 0 (ET0=1, EA=1), se le da prioridad alta a la interrupcin del Timer 0 (PT0=1), y se configura el Timer 0 en el modo 2 de 8 bits con autorrecarga (M1=1 y M0=0, registro TMOD). La puesta en marcha del Timer 0 es por software (GATE=0, registro TMOD), el Timer 0 cuenta pulsos procedentes del reloj del microcontrolador (C/T=0, registro TMOD), y, al final de la rutina Inicio, se pone en marcha el Timer (TR0=1). El Timer 0 est gestionado completamente por interrupciones, de manera que cada vez que llega a desbordamiento se activa el bit TF0, TF0=1, se produce una interrupcin a la CPU y se recarga el valor del registro TH0 en el registro TL0. En la rutina de atencin a la interrupcin del Timer 0, RSI_Timer0, basta con complementar el estado lgico de la patilla P1.0, para generar la frecuencia requerida. Con esta instruccin el microcontrolador lee el estado de la patilla, lo complementa (pasa de 0 lgico a 1 lgico, y viceversa) y escribe el nuevo estado en la patilla. El bit de rebasamiento se activa con la peticin de interrupcin y se borra, de forma automtica, cuando la CPU atiende a la interrupcin ejecutando la rutina RSI_Timer0. Para determinar el valor de recarga del registro TH0, se debe considerar que el perodo necesario para generar frecuencia de 5 kHz es de 200 [s, por lo que la patilla P1.0 se debe complementar cada 100 [s, es decir, la mitad del perodo. Adems, desde que se produce la interrupcin (estado S5P2 del ciclo mquina), hasta que se vectoriza la interrupcin del Timer 0, transcurren tres ciclos mquina en el mejor de los casos, y la instruccin CPL P1.0 se ejecuta
178
en un ciclo mquina. Por tanto, el estado lgico de la patilla P1.0 cambiar, al menos, cuatro ciclos mquina despus de que se halla activado el bit TF0. El valor de recarga de TH0 debe ser de 156, es decir, el valor de la diferencia entre 256 (valor de rebasamiento) y el tiempo deseado, 100 [s. Se debe tener en cuenta que para un reloj de 12MHz, el Timer 0 se incrementa cada microsegundo y que un ciclo mquina tiene la duracin de 1 [s. Ejemplo 7.2 Generacin de diversas frecuencias En este ejemplo se generarn distintas frecuencias por la patillas P1.6 y P1.7 del microcontrolador, en funcin del estado de las teclas T1, T2, T3, T4, T5 y T6. Las cuatro primeras teclas estn conectadas a la entrada de interrupcin /INT0 mediante puertas AND lgico, de forma que su pulsacin causar una interrupcin a la CPU.
T1 T2 T3 T4 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 T5 T6
80C31
P1.6 /INT0 P1.7
f1 f2
En este ejemplo el microcontrolador debe generar en la patilla P1.6 una frecuencia de 4kHz, 5kHz, 10kHz y 20kHz, si se pulsan las teclas T1, T2, T3 o T4, respectivamente. Las teclas T5 y T6 afectarn a la frecuencia de la patilla P1.7. Al pulsar T5 se generar en P1.7 una frecuencia de 25kHz; al pulsar T6 la frecuencia ser de 50kHz. Inicialmente, por defecto, en P1.6 y en P1.7 se generar una frecuencia de 2kHz. Cuando se pulse una tecla se generar la frecuencia correspondiente, y cuando no se pulse ninguna se volver a generar la frecuencia inicial de 2kHz.
;******************************************************************** ; Generacin de una seal peridica ;******************************************************************** ORG 0H ; Vectorizacin de interrupciones LJMP Inicio ORG 03H LJMP RSI_Int0 ORG 0BH LJMP RSI_Timer0 ORG 01BH LJMP RSI_Timer1 ;******************************************************************** ; Rutina de Inicio ;******************************************************************** Inicio: SETB IT0 ;Interrupcin /INT0 activa por flanco descendente SETB PT0 ;Asigna prioridad alta al Timer 0
7 Temporizadores/contadores internos y watchdog SETB PT1 ;Asigna prioridad alta al Timer 1 SETB EX0 ;Habilita interrupcin de /INT0 SETB ET0 ;Habilita interrupcin del Timer 0 SETB ET1 ;Habilita interrupcin del Timer 1 SETB EA ;Habilita bit de interrupcin general MOV TMOD, #22H ;Timer 0 y 1 en Modo 2, con GATE=0 y C/T=0 MOV TL0, #6 ;(256-250) carga valor inicial para frec. de 2kHz MOV TH0, #6 ;carga valor inicial para frec. de 2kHz MOV TL1, #6 ;carga valor inicial para frec. de 2kHz MOV TH1, #6 ;carga valor inicial para frec. de 2kHz SETB TR0 ;Pone marcha el Timer 0 SETB TR1 ;Pone marcha el Timer 1 LJMP Principal ;Ir hacia rutina principal ;******************************************************************** ; Rutina de servicio de /INT0 ;******************************************************************** RSI_Int0: JNB P1.0, Tecla_T1 ;Ha pulsado la tecla T1? JNB P1.1, Tecla_T2 ;Ha pulsado la tecla T2? JNB P1.1, Tecla_T3 ;Ha pulsado la tecla T3? SJMP Tecla_T4 ;Tiene que ser la tecla T4 Tecla_T1: MOV TH0, #131 ;(256-125) valor de recarga para 4kHz RETI Tecla_T2: MOV TH0, #156 ;(256-100) valor de recarga para 5kHz RETI Tecla_T3: MOV TH0, #206 ;(256-50) valor de recarga para 10kHz RETI Tecla_T4: MOV TH0, #231 ;(256-25) valor de recarga para 20kHz RETI ;******************************************************************** ; Rutina de servicio del Timer0 ;******************************************************************** RSI_Timer0:CPL P1.6 ;Complementa P1.6 RETI ;Fin de subrutina. El bit TF0 se borra automticamente ;******************************************************************** ; Rutina de servicio del Timer1 ;******************************************************************** RSI_Timer1:CPL P1.7 ;Complementa P1.7 RETI ;Fin de subrutina. El bit TF0 se borra automticamente ;******************************************************************** ; Rutina de Principal ;******************************************************************** Principal: JNB P1.4, Tecla_T5 JNB P1.5, Tecla_T6 MOV TH0, #6 ;frecuencia por defecto de 2kHz en Timer 0 MOV TH1, #6 ;frecuencia por defecto de 2kHz en Timer 1 SJMP Principal ;Bucle infinito Tecla_T5: MOV TH1, #236 ;(256-20) valor de recarga para 25kHz SJMP Principal Tecla_T6: MOV TH1, #246 ;(256-10) valor de recarga para 50kHz SJMP Principal
179
En la rutina de inicio se ha activado la interrupcin /INT0 por flanco descendente, por lo que la interrupcin slo se producir una vez, cuando se pulse una tecla, al detectar la CPU un flanco de bajada. En la rutina de inicio se le asigna prioridad alta al Timer 0 y al Timer 1, por ser el ncleo de este ejemplo. El Timer 0 y el Timer 1 se configuran en el modo 2 de autorrecarga contando pulsos del reloj.
180
Para determinar el valor de los registros TH0 y TH1, de acuerdo con la frecuencia especificada, se debe tener en cuenta que la frecuencia se genera a travs de la instruccin CPL en la rutina de RSI de cada Timer. La instruccin CPL complementa el valor del terminal del puerto cada vez que un temporizador llega a rebasamiento, por lo que para generar una frecuencia se debe emplear la mitad del perodo de sta. Con una frecuencia de reloj de 12 MHz, el perodo de cada pulso de reloj es de 1 [s, los temporizadores, pues, se incrementan cada microsegundo. Luego, para generar una frecuencia determinada en el Timer 0 1, el valor del registro TH0 o TH1 debe ser: TH 0,1 ] Valor de rebasamiento Perodo reloj 2
En este ejemplo, para generar una frecuencia de 2 kHz el valor de TH0 es de 236, para 4 kHz el valor es de 131, etc. El Timer 0 llega a rebasamiento cuando TL0 pasa de FFH a 00H, por lo que el valor de rebasamiento, es decir, el valor mximo del Timer, es de 256 o FFH+1. La pulsacin de las teclas T5 y T6 se detecta mediante software en la rutina principal, donde continuamente se lee el estado de estas teclas, y se asigna al registro TH1 el valor de 236 para generar una frecuencia de 25 kHz, o el valor 246 para generar una frecuencia de 50 kHz.
7.2.1.4 Modo 3. Varios contadores En el modo 3 los registros TL0 y TH0 del Timer 0 trabajan como dos contadores independientes de 8 bits cada uno (figura 7.5); de manera que se emplear en aquellas aplicaciones que requieren de un temporizador o contador de 8 bits adicional. En el modo 3 el contador formado por TL0 utiliza todos los bits de control propios del Timer 0, para llevar a cabo el mismo tipo de funcionamiento que el descrito para los otros modos; o sea, usa los bits C/T, GATE, TR0 y /INT0. No obstante, para el contador formado por el registro TH0 slo se dispone del bit de control TR1, por lo que este contador tiene su funcionamiento restringido: slo puede ponerse en marcha y pararse mediante el bit TR1. El contador TH0, adems, slo puede contar pulsos procedentes del reloj del microcontrolador. A nivel de desbordamiento, el contador formado por TL0 afecta al bit TF0, mientras que el contador formado por TH0 afecta al bit TF1, que en los otros modos pertenece al Timer 1. En cuanto al Timer 1, para el modo 3, es obvio que no puede utilizar los bits TR1 y TF1 en su funcionamiento usual, lo que significa que, cuando el Timer 1 se desborde, no se activar el bit TF1, y que tampoco se podr usar el bit TR1 para activar o para parar el Timer. La forma de arrancar y parar el Timer 1 consiste en entrar y salir de su propio modo 3; es decir, entrando en el modo 3 se pone en marcha el Timer 1, y saliendo del modo 3 se detiene el Timer 1. De todos modos, el Timer 1 puede ser utilizado por el puerto serie como base para la generacin de la velocidad de transmisin en baudios o en cualquier otra aplicacin en donde no se necesite producir una interrupcin.
181
XTAL1
12 0
7.2.2 Timer 2 El Timer 2 es un contador de 16 bits que est formado a partir de los registros TL2 y TH2, de 8 bits cada uno, conectados en cascada. Este Timer est presente en todas las versiones de la MCS-51 con tres temporizadores internos, y puede trabajar hasta con cuatro modos distintos de funcionamiento: modo autorrecarga, modo captura, modo Baud Rate y modo Clock-out. La forma de trabajar con el Timer 2 se determina a partir de los registros T2MOD y T2CON, (tablas 7.2 y 7.3, respectivamente). Estos registros permiten determinar el modo de funcionamiento del Timer 2, controlar su puesta en marcha, programar su modo de operacin (contador o temporizador) y detectar el desbordamiento. En la tabla 7.4 se indican los cuatro modos de operacin en los que puede funcionar el Timer 2, dependiendo del estado de los bits RCLK, TCLK, CP/RL2 y T2OE.
Comentario Bit reservado. Bit de habilitacin del Timer 2. En el modo Clock-out, T2OE conecta la salida de desbordamiento con el terminal T2. Bit de sentido de cuenta. DECEN=0 hace que el sentido de la cuenta sea ascendente. DCEN=1 hace que el sentido pueda ser ascendente o descendente.
Registro T2CON
EXF2 RCLK TCLK EXEN2 TR2
(LSB)
C/T2 CP/RL2
Comentario Bit de desbordamiento. TF2=1 al producirse un desbordamiento. Este bit no se activa si RCLK=1 o TCLK=1. Debe borrarse por software. Bit de entrada externa. EXF2 se pone a 1 lgico al producirse un flanco descendente en el terminal T2EX, siempre y cuando EXEN2 est habilitado. Bit de reloj en recepcin. RCLK se pone a 1 lgico cuando se produce un desbordamiento en el Timer 0. Bit de reloj en transmisin Bit de habilitacin de entrada externa. En general, si EXEN2=1 permite la activacin de EXF2 con un flanco de descendente en T2EX. Tambin realiza funciones especficas en todos los modos de funcionamiento del Timer. Bit de puesta en marcha y parada. TR2=1 pone en marcha el Timer 2. TR2=0 detiene el Timer 2. Bit de seleccin de temporizador/contador. Con C/T2=0 el Timer cuenta pulsos de reloj (12). Con C/T2=1 el Timer cuenta pulsos de la entrada T2. Bit de captura/recarga. Con CP/RL2=1 se produce una captura al aplicar un flanco negativo en T2EX, si EXEN2=1. Con CP/RL2=0 se produce una recarga al aplicar un flanco negativo en T2EX, si EXEN2=1. Si RCLK=1 o TCLK=1 se ignora CP/RL2 y se fuerza la recarga del Timer 2 al producirse un desbordamiento en su valor.
Modo Modo autorrecarga Modo captura Modo Baud Rate Modo Clock-out
RCLK o TCLK 0 0 1 X
X= Estado indeterminado
CP/RL2 0 1 X 0
T2OE 0 0 X 1
7.2.2.1 Modo captura El Timer 2 en el modo captura funciona como un temporizador o contador de 16 bits (figura 7.6). Cuando se produce un desbordamiento, al pasar todos los bits de TL2 y TH2 de uno a cero lgico, se activa el bit de rebasamiento TF2 del registro T2CON y se genera una interrupcin automtica. En este modo, si el bit EXEN2 del registro T2CON se pone a 1 lgico y se produce un flanco de bajada en el terminal T2EX del microcontrolador, el valor actual de los registros TH2 y TL2 se copia en los registros RCAP2H y RCAP2L del rea de SFR, hecho al que se le denomina captura. Al mismo tiempo, el flanco de bajada producido hace que el bit EXF2 del registro T2CON se ponga a 1 lgico y se genera una interrupcin automtica. As pues, en este modo las fuentes de interrupcin hacia la CPU pueden ser por medio del bit de rebasamiento TF2, o bien por medio del bit EXF2. En este ltimo caso, se puede considerar al terminal T2EX como una nueva fuente de interrupcin externa, al igual que /INT0 y /INT1. En el caso de que produzca una interrupcin, la rutina de RSI que se ejecuta
183
es la misma, tanto para el bit TF2, como para el bit EXF2, de forma que la rutina de RSI debe comprobar cul de las dos posibles interrupciones se ha activado. La puesta en marcha y la parada del Timer 2 se realiza con el bit TR2 del registro T2CON. Con TR2 a 1 lgico se pone en marcha el Timer, que queda habilitado para contar pulsos; con TR2 a 0 lgico se detiene el Timer.
XTAL1 12 0 T2 C/T2 TL2 1 TR2 Interrupcin TH2 TF2
T2EX
7.2.2.2 Modo autorrecarga El modo autorrecarga configura al Timer 2 como un temporizador o contador de 16 bits, con recarga automtica del valor contenido en los registros RCAP2L y RACP2H hacia los registros TL2 y TH2, respectivamente (figuras 7.7 y 7.8). En este modo de funcionamiento, el Timer 2 puede operar de dos formas diferentes: como un contador ascendente, o bien como un contador ascendente descendente, segn sea el valor del bit DCEN, Down counter enable bit del registro T2MOD. Para este ltimo caso, si DCEN est a 0 lgico el sentido de la cuenta es ascendente, y si DCEN est a 1 lgico el sentido de la cuenta es descendente. Se debe tener en cuenta que el bit DCEN por defecto, tras un reset o al iniciar el microcontrolador, se pone a 0 lgico.
a) Contador ascendente (DCEN=0) Cuando DCEN se pone a 0 lgico, el Timer 2 opera como un contador ascendente de 16 bits (figura 7.7). En este caso, la recarga del Timer 2, es decir, la copia de los registros RCAP2H y RCAP2L en los registros TH2 y TL2, respectivamente, se puede hacer por el desbordamiento del Timer, al activarse el bit TF2, o bien, al producirse un flanco de bajada en el terminal T2EX, siempre y cuando el estado del bit EXEN2 lo permita. En este ltimo caso, el flanco de bajada tambin puede causar la activacin del bit EXF2 y provocar una interrupcin. El bit DCEN, tras un reset del microcontrolador, se pone a 0 lgico, as que, por defecto el Timer 2 en el modo autorrecarga funciona como un contador ascendente de 16 bits.
184
XTAL1
T2 C/T2
TR2
RCAP2H RCAP2L
Interrupcin
T2EX EXEN2
EXF2
b) Contador ascendente/descendente (DCEN=1) Cuando DCEN se pone a 1 lgico, el Timer 2 opera como un contador ascendente/descendente (figura 7.8), donde el sentido de la cuenta se determina mediante el estado lgico aplicado del terminal T2EX del microcontrolador. Cuando T2EX est a 1 lgico, el Timer 2 cuenta de forma ascendente, en cuyo caso, el Timer puede llegar a desbordamiento; se activa entonces el bit TF2, se produce una recarga del valor de los registros RCAP2H y RCAP2L hacia TH2 y TL2, respectivamente, y se genera una interrupcin automtica siempre y cuando se haya habilitado de forma previa. Cuando T2EX est a 0 lgico, el Timer 2 cuenta en sentido descendente, es decir, se decrementa su valor con cada pulso de entrada. En este sentido de la cuenta, el Timer 2 tambin puede llegar a un rebasamiento, que se produce cuando el contenido de los registros TH2 y TL2 llega a ser igual al valor almacenado en los registros RCAP2H y RCAP2L, respectivamente. En este caso, se activa el bit TF2, y se produce una peticin de interrupcin y una recarga del valor FFH en cada uno de los registros, TH2 y TL2. Al mismo tiempo, cuando se produce cualquiera de los dos tipos de desbordamiento mencionados, el bit EXF2 complementa su valor; es decir, si EXF2 est a 1 lgico, cambia su valor a 0 lgico, y viceversa. El bit EXF2 no genera peticin de interrupcin al microcontrolador, y se puede utilizar como el bit 17 del contador, es decir, se contempla el contador como un Timer de 17 bits (donde EXF2 es el bit 17).
185
Valor de recarga para la cuenta hacia abajo FFH FFH Complemento EXF2
XTAL1
12 0
TH2 TL2 TF2 Interrupcin
1 T2 C/T2
RCAP2H RCAP2L Valor de recarga para la cuenta hacia arriba
TR2
Sentido de la cuenta 1 = ascendente T2EX 0 = descendente
7.2.2.3 Modo generador de baudios para el puerto serie (Baud Rate Generator Mode) En este modo, el Timer 2 queda configurado como generador de baudios para fijar la velocidad de transmisin del puerto de comunicacin serie del microcontrolador. Este modo se selecciona al activar los bits RCLK y/o TCLK de registro T2CON (tabla 7.4).
7.2.2.4 Modo Clock-out En el modo Clock-out el Timer 2 genera una seal de reloj por el terminal T2 del microcontrolador de frecuencia variable y simtrica (figura 7.9). El Timer 2 se incrementa con una frecuencia de valor FOSC/2 (la mitad de la frecuencia de reloj del microcontrolador), hasta que sufre un desbordamiento, y causa la recarga automtica de los registros TH2 y TL2 con el valor contenido en los registros RCAP2H y RCAP2L, respectivamente. En este modo el desbordamiento del Timer no genera peticin de interrupcin, como ocurre con los otros modos. La interrupcin, sin embargo, s que se genera al detectar un flanco de bajada en la entrada T2EX, siempre y cuando el bit EXEN2 est activado (figura 7.9). La frecuencia de la seal de reloj generada se establece modificando el valor de los registros RCAP2H y RCAP2L, segn la siguiente ecuacin: Frec _ reloj ] FOSC 4(65535RCAP 2H,RCAP 2L
El rango de frecuencias que se puede generar est comprendido entre los 61Hz y los 4MHz, para una frecuencia de reloj de 16MHz. A modo de resumen, para que el Timer 2 trabaje en modo Clock-out, el bit T2OE del registro T2MOD se debe poner a 1 lgico, el bit C/T2 del registro T2CON se debe poner a 0 lgico, y el bit TR2 debe estar a 1 lgico.
186
El Timer 2 se puede usar como generador de baudios para el puerto serie y, tambin de forma simultnea, como generador de reloj, aunque las frecuencias generadas no se pueden determinar de forma independiente, pues comparten los mismos registros de recarga.
XTAL1 12 0 TH2 1 TR2 C/T2 T2 TL2
RCAP2H RCAP2L
187
4511 (BCD-7seg) A0 a A1 A2 A3 /EL dp b
7405
87C51
P2.0 P0.0 P0.1 P0.2
Vcc R
a Millares
Unidades
R
nodo comn
dp
P2.7
P0.3
R
dp
Vcc
Tr1
Tr2
Tr3
Tr4
Vcc
P0.7
Up
P1.0 P1.1
Right
Enter
F1
Down
Left
Clear
F2
Fig. 7.10 Circuito del contador de piezas con teclado matricial del ejemplo 7.3
Los cuatro dgitos de la figura 7.10 se deben encender de manera secuenciada para que el nmero se distinga correctamente, tal y como se explicaba en el apartado 5.10.6. Al mismo tiempo, la lectura del teclado matricial tambin precisa de una secuencia de escrutinio, en la cual se comprueba, columna a columna, si se han pulsado las teclas asociadas. En consecuencia, en el circuito de la figura 7.10, se desea utilizar la secuencia de refresco de los cuatro dgitos de siete segmentos, para efectuar, a la vez, la secuencia de escrutinio de las columnas del teclado matricial. Esta secuencia se llevar a cabo automticamente mediante las interrupciones del Timer 2. Las filas del teclado matricial pueden activar la entrada de interrupcin /INT1 mediante la puerta AND de la figura 7.10. La secuencia situar un 0 lgico en la patilla P0.7, mientras las patillas P0.4, P0.5 y P0.6 permanecen a 1 lgico, pondr el transistor Tr4 en saturacin y encender el dgito correspondiente a las unidades. Si en este momento se pulsan las teclas F1 o F2, se provocar una interrupcin en /INT1. Transcurrido un tiempo determinado, el 0 lgico se sita en el terminal P0.5, mientras los otros terminales estn a 1 lgico; se pone, as, el transistor Tr3 en saturacin y se enciende el dgito de las decenas. De esta manera se procede hasta que se pone un 0 lgico en la patilla P0.7 y se enciende el dgito correspondiente a los millares. En este caso, la secuencia se repetir con una frecuencia de 1 kHz, que establecern las interrupciones del Timer 2. Cada vez que llega un pulso de cuenta se debe incrementar el valor del contador, y cuando se activa el sensor de descuenta se debe decrementar el contador. Si el valor del contador sobrepasa el valor 9999, ste no se incrementar, y si llega un pulso de descuenta cuando el valor es de 0000, el contador no se decrementar. La tecla reset activa la interrupcin /INT0 y pone a cero el valor del contador.
188
Cuando se detecte que una tecla ha sido pulsada se mostrar un carcter determinado que indique, en el dgito conectado al puerto P2, la tecla pulsada. Para la tecla Up se mostrar el carcter U, para la tecla Rigth se mostrar el carcter r, para Enter el carcter E, para F1 el carcter 1., para Down el carcter d, para Left el carcter L, para Clear el carcter C y para F2 el carcter 2.. El dgito conectado al puerto P2 mostrar siempre el carcter correspondiente a la ltima tecla pulsada.
;********************************************************************** ; Refresco de 4 dgito de siete segmentos y de teclado matricial ;********************************************************************** ORG 0H ; Vectorizacin de interrupciones LJMP Inicio ORG 03H LJMP RSI_Int0 ORG 013H LJMP RSI_Int1 ORG 02BH LJMP RSI_Timer2 ;********************************************************************** ; Rutina de Inicio ;********************************************************************** Inicio: MOV P2, #0 ;Apaga el dgito conectado a P2 SETB IT0 ;Interrupcin /INT0 activa por flanco descendente SETB IT1 ;Interrupcin /INT1 activa por flanco descendente SETB PX1 ;Asigna prioridad alta a /INT1 SETB EX0 ;Habilita interrupcin de /INT0 SETB EX1 ;Habilita interrupcin de /INT1 SETB ET2 ;Habilita interrupcin del Timer 2 MOV T2CON, #0 ;Timer 2 funcionando en 16 bits con autorrecarga MOV T2MOD, #0 ;Timer 2 (DCEN=0) MOV RCAP2L, #05H ;Carga recarga para interrumpir cada 250 [s MOV RCAP2H, #0FFH ; en RCAP2L y RCAP2H MOV TL2, #05H MOV TH2, #0FFH SETB EA ;Habilita bit de interrupcin general SETB TR2 ;Pone en marcha el Timer 2 ;********************************************************************** ; Rutina Principal ;********************************************************************** Principal: JNB P1.2, Conta ;Comprueba si se ha pulsado Cuenta JNB P1.3, Decre ;Comprueba si se ha pulsado Descuenta MOV P2, B ;Carga B en P2, para mostrar en dgito SJMP Principal ;Bucle infinito ;********************************************************************** ; Rutina de servicio de /INT0 ;********************************************************************** RSI_Int0: MOV R0, #0 ;Borra unidades MOV R1, #0 ;Borra decenas MOV R2, #0 ;Borra centena. MOV R3, #0 ;Borra millares MOV P2, #0 ;Apaga dgito conectado a P2 MOV B, #0 ;Borra registro B RETI ;********************************************************************** ; Rutina de servicio de /INT1 ;********************************************************************** RSI_Int1: JNB P1.0, Fila_0 ;Ha pulsado una tecla de la fila 0? SJMP Fila_1 ;Si no, debe ser la fila 1
7 Temporizadores/contadores internos y watchdog JNB P0.4, Tec_Up JNB P0.5, Tec_Rigth JNB P0.6, Tec_Enter SJMP Tec_F1 Fila_1: JNB P0.4, Tec_Down JNB P0.5, Tec_Left JNB P0.6, Tec_Clear SJMP Tec_F2 Tec_Up: MOV B, #0011 1110b ;Leds b, c, d, e y f encendidos, carcter U RETI Tec_Rigth: MOV B, #0101 0000b ;Leds e y g encendidos, carcter r RETI Tec_Enter: MOV B,#0111 1001b ;Leds a, d, e, f y g encendidos, carcter E RETI Tec_F1: MOV B, #1000 0110b ;Leds b, c y dp encendidos, carcter 1. RETI Tec_Down: MOV B, #0101 1110b ;Leds b, c, d, e y g encendidos, carcter d RETI Tec_Left: MOV B, #0011 1000b ;Leds d, e y f encendidos, carcter L RETI Tec_Clear: MOV B, #0011 1001b ;Leds b, c, d, e y f encendidos, carcter U RETI Tec_F2: MOV B, #1101 1011b ;Leds a, b, d, e, g y dp encendidos, carcter 2. RETI ;********************************************************************** ; Rutina de servicio del Timer 2 ;********************************************************************** RSI_Timer2:ORL P0, #0F0H ;Apaga todos los dgitos T_Uni: CJNE R5, #0, T_Dece INC R5 SJMP T2_Uni T_Dece: CJNE R5, #1, T_Cent INC R5 SJMP T2_Dec T_Cent: CJNE R5, #2, T_Millar INC R5 SJMP T2_Cent T_Millar: MOV R5, #0 SJMP T2_Millar T2_Uni: MOV A, R0 ;Carga en A ORL A, #0F0H ;Fuerza los 4 bits altos a 1 lgico MOV P0, A ;Pone unidades en P0 (4 bits altos de R0 son cero) CLR P0.7 ;Enciende dgito unidades. Tr4 en saturacin SJMP T2_Salir T2_Dec: MOV A, R1 ;Carga en A ORL A, #0F0H ;Fuerza los 4 bits altos a 1 lgico MOV P0, A ;Pone decenas en P0 (4 bits altos de R0 son cero) CLR P0.6 ;Enciende dgito decenas. Tr3 en saturacin SJMP T2_Salir T2_Cent: MOV A, R2 ;Carga en A ORL A, #0F0H ;Fuerza los 4 bits altos a 1 lgico MOV P0, A ;Pone centenas en P0 (4 bits altos de R0 son cero) CLR P0.5 ;Enciende dgito centenas. Tr2 en saturacin SJMP T2_Salir T2_Millar: MOV A, R3 ;Carga en A ORL A, #0F0H ;Fuerza los 4 bits altos a 1 lgico MOV P0, A ;Pone millares en P0 (4 bits altos de R0 son cero) CLR P0.4 ;Enciende dgito millares. Tr1 en saturacin T2_Salir: CLR TF2 ;Borra TF2 RETI Fila_0:
189
190
Microcontroladores MCS-51 y MCS-251 ;********************************************************************** ;Rutina Conta ;********************************************************************** Conta: CJNE R0, #9, Unidad ;Compara unidad CJNE R1, #9, Decena ;Compara decena CJNE R2, #9, Centena ;Compara centena CJNE R3, #9, Millar ;Compara millar SJMP Principal Unidad: INC R0 ;Incrementa unidades SJMP Principal Decena: MOV R0, #0 ;Pone a 0 las unidades INC R1 ;Incrementa decenas SJMP Principal Centena: MOV R0, #0 ;Pone a 0 unidades y decenas MOV R1, #0 INC R2 ;Incrementa centenas SJMP Principal Millar: MOV R0, #0 ;Pone a 0 unidades, decenas y centenas MOV R1, #0 MOV R2, #0 INC R3 ;Incrementa millares SJMP Principal ;********************************************************************** ;Rutina Decre ;********************************************************************** Decre: CJNE R0, #0, D_uni ;Compara unidad CJNE R1, #0, D_dece ;Compara decena CJNE R2, #0, D_cent ;Compara centena CJNE R3, #0, D_mill ;Compara millar LJMP Principal D_uni: DEC R0 ;Decrementa unidad LJMP Principal D_dece: MOV R0, #9 ;Pone a 9 unidad DEC R1 ;Decrementa decena LJMP Principal D_cent: MOV R0, #9 ;Pone a 9 unidad MOV R1, #9 ;Pone a 9 decena DEC R2 ;Decrementa centena LJMP Principal D_mill: MOV R0, #9 ;Pone a 9 unidad MOV R1, #9 ;Pone a 9 decena MOV R2, #9 ;Pone a 9 centena DEC R3 ;Decrementa millar LJMP Principal
En la rutina de Inicio el puerto P2 se pone a cero, debido a que inicialmente est a FFH (o sea, todos sus terminales a 1 lgico); por tanto, debe ponerse a cero para que ninguno de los leds del dgito est encendido. En la rutina, las entradas /INT0 y /INT1 se configuran activas por flanco descendente y se habilitan las interrupciones de /INT0, de /INT1 y del Timer 2. El Timer 2 se configura para que funcione como un temporizador de 16 bits con autorrecarga; para ello se colocan los bits RCLK, TCLK y CP/RL2, del registro T2CON, a 0 lgico. El Timer cuenta pulsos internos del reloj del microcontrolador, por lo que el bit C/T2 del registro T2CON se pone a 0 lgico. En el Timer 2 es necesario inhibir las interrupciones procedentes del terminal T2EX (figura 7.7); por tanto, el bit EXEN2 tambin se pone a 0 lgico. Por ltimo, para que el temporizador funcione slo en sentido ascendente, el bit DCEN del registro T2MOD se pone a 0 lgico.
191
Para que la secuencia de refresco de los dgitos sea de 1kHz, el valor de recarga del Timer ha de ser de FF05H, pues el perodo de la secuencia es de 1ms y, al haber cuatro dgitos, el tiempo que debe permanecer encendido cada dgito es de 0.250 ms. FF05H es el resultado de restar 250 (o FAH) de 64k (o FFFFH). El puerto P0 inicialmente tambin tiene todos sus terminales en estado 1 lgico, lo que no supone ningn inconveniente, pues las puertas inversoras conectadas a los transistores Tr1, Tr2, Tr3 y Tr4, aseguran que los transistores estn en corte y los dgitos permanezcan apagados. La rutina de RSI del Timer 2 utiliza el registro R5 como contador en base 3, y determina el dgito que se va a encender, segn sea el valor de R5. Si vale cero se enciende el dgito correspondiente a las unidades, si vale 1 se enciende el dgito de las decenas, si vale 2 se enciende el dgito de las centenas y si vale 3 se enciende el dgito de los millares. El valor de R5 se actualiza con la instruccin INC, de forma que cada vez que la rutina de RSI se ejecuta, el registro se incrementa en una unidad, excepto cuando vale 3, que se pone a cero. El contenido de los registros R0, R1, R2 o R3 se carga en el acumulador y se fuerzan sus cuatro bits altos a 1 lgico mediante una instruccin ORL, de manera que todos los dgitos estn apagados y se encienda el dgito que corresponda con la instruccin CLR. La rutina principal est formada por un bucle infinito en el cual se comprueba el estado de los sensores cuenta y descuenta, y donde se pone, en el dgito conectado a P2, el carcter de la tecla pulsada en el teclado matricial.
192
Los registros de programacin para el Timer 2 son: T2MOD, registro de control de modo del Timer 2, y T2CON, registro de control del Timer 2.
Tabla 7.5 Registros asociados a los Timers 0, 1 y 2 y al timer watchdog de la familia MCS-251
Mnemnico
TL0 TH0 TL1 TH1 TL2 TH2 TCON TMOD T2CON T2MOD RCAP2L RCAP2H WDTRST
Descripcin
Registros del Timer 0 Registros del Timer 1 Registros del Timer 2 Registro de control de los Timers 0 y 1 Registro de control de modo de los Timers 0 y 1 Registro de control del Timer 2 Registro de control de modo del Timer 2 Registros de recarga y captura del Timer 2 Registro de Timer watchdog
Direccin
S:08AH S:08CH S:08BH S:08DH S:0CCH S:0CDH S:088H S:089H S:0C8H S:0C9H S:0CAH S:0CBH S:0A6H
Los Timers pueden ser programados para que trabajen como temporizador o como contador, mediante el bit C/Tx, con x = 0, 1 2, dependiendo del Timer de que se trate. En la tabla 7.6 se indica la ubicacin de cada uno de estos bits.
Tabla 7.6 Ubicacin de los bits C/Tx
Bit
C/T0 C/T1 C/T2
Ubicacin
TMOD.2 TMOD.6 T2CON.1
193
7.4.1 Funcionamiento como temporizador Cuando se pone el bit C/Tx a cero, el Timer correspondiente trabaja como temporizador. En este caso, el Timer se incrementa en una unidad cada doce perodos de seal de reloj o, lo que es lo mismo, cada 6 estados. Las nicas excepciones a este comportamiento estn en dos modos de funcionamiento del Timer 2, Baud Rate y Clock-out, donde el incremento es cada dos perodos de reloj. Este modo de operacin se utiliza bsicamente para medir intervalos temporales de forma relativamente fcil. Ejemplo 7.4 Diseo de una rutina de retardo con el Timer 0 Se desea disear una rutina de retardo de 1 ms de duracin utilizando el Timer 0, con una frecuencia de reloj de 12MHz. En este caso el Timer se incrementa en una unidad cada microsegundo, luego, para temporizar 1ms, el Timer 0 se deber incrementar 1.000 veces. De esta forma, controlando el nmero de incrementos que sufre el Timer se obtiene la rutina de retardo deseada.
;**************************************************************************** ; RUTINA DE RETARDO ;**************************************************************************** ORG FF:0000H ; ... CALL RETARDO ; ORG FF:0100H ; La rutina de retardo empieza en la direccin FF:1000H RETARDO: MOV R0,TH0 ; Se carga el valor del Timer en el registro WR0 MOV R1,TL0 ; MOV WR2,#1000D ; Se carga en el registro WR2 el valor 1.000 decimal CMP WR2,WR0 ; Se compara el contenido del Timer 0 con 1.000 JG RETARDO ; Si el contenido del Timer 0 es menor o igual a 1.000 ; continuamos en la rutina de retardo RET ; En el momento que el contenido del Timer 0 sea mayor a 1.000 se termina la rutina de retardo
7.4.2 Funcionamiento como contador Para que un Timer funcione como contador se debe programar su bit C/Tx a 1 lgico. En este caso, el Timer se incrementa en una unidad cada vez que se aplica un flanco de bajada en un pin determinado. En la tabla 7.7 se especifica el pin asociado a cada Timer.
Tabla 7.7 Entradas externas de cuenta de los Timers 0, 1 y 2
Pin
T0 T1 T2
Tipo
I I I/O
Descripcin
Entrada externa de reloj del Timer 0. Entrada externa de reloj del Timer 1. Entrada/salida externa de reloj del Timer 2.
Ubicacin
P3.4 P3.5 P1.0
1
La CPU comprueba el estado de las entradas externas de los Timers en cada ciclo de perifrico , en concreto en el segundo perodo del estado 5. Cuando la CPU detecta un 1 lgico en un ciclo y un cero lgico en el siguiente ciclo, el Timer correspondiente se incrementa en una unidad (figura 7.12). El
1
Un ciclo de perifrico equivale a 12 perodos de reloj agrupados en 6 estados, cada uno de ellos compuesto por dos perodos.
194
valor del Timer se actualiza en el primer perodo del estado 3 del ciclo de perifrico que viene despus de detectar el flanco de bajada.
Ciclo de perifrico S5P5 1 T2, T1, T0 0 Ciclo de perifrico S5P5
Teniendo en cuenta que un ciclo de perifrico tiene una duracin de 12 perodos de reloj, se necesitan, como mnimo, 24 perodos de reloj para reconocer un flanco de bajada, por lo que la mxima velocidad de cuenta es de fclock/24.
195
b4 M01
b0 M00
6 5, 4
2 1, 0
Bit GATE del Timer 1. Con GATE1 = 0, el Timer 1 se pone en marcha si TR1=1. Si GATE1 = 1 y TR1 = 1, el Timer 1 se pone en marcha colocando un 1 lgico en el pin /INT1 (P3.3). C/T1 Seleccin de temporizador/contador del Timer 1. C/T1 = 0: el Timer 1 funciona como temporizador. C/T1 = 1: el Timer 1 funciona como contador. M11, M01 Selector de modo del Timer 0. M11 M01 0 0 Modo 0: El Timer 0 funciona como un Timer de 13 bits. 0 1 Modo 1: El Timer 0 funciona como un Timer de 16 bits. 1 0 Modo 2: El Timer 0 funciona como un Timer de 8 bits (TL0) y se recarga con el valor que hay en TH0 cuando sufre desbordamiento. 1 1 Modo 3: El Timer se para. GATE0 Bit GATE del Timer 0 Cuando GATE0 = 0, el Timer 1 se pone en marcha con TR0=1. Si GATE0 = 1 y TR0 = 1, el Timer 0 se pone en marcha colocando un 1 lgico en el pin /INT0 (P3.2). C/T0 Seleccin de temporizador/contador del Timer 0. C/T0 = 0: el Timer 0 funciona como temporizador. C/T0 = 0: el Timer 0 funciona como contador. M10, M00 Selector de modo del Timer 0. M10 M00 0 0 Modo 0: El Timer 0 funciona como un Timer de 13 bits. 0 1 Modo 1: El Timer 0 funciona como un Timer de 16 bits. 1 0 Modo 2: El Timer 0 funciona como un Timer de 8 bits (TL0) y se recarga con el valor que hay en TH0 cuando sufre desbordamiento. 1 1 Modo 3: El Timer 0 funciona como dos Timers de 8 bits: TL0 y TH0.
TCON b7 TF1
b4 TR0
b0 IT0
6 5
TR1 TF0
TR0
Flag de desbordamiento del Timer 1. Se pone a 1 cuando el Timer 1 sufre desbordamiento, o sea cuando pasa de la combinacin todo unos a la combinacin todo ceros. Flag de puesta en marcha del Timer 1. Cuando est a 1 lgico el Timer 1 est habilitado para funcionar, en caso contrario esta parado. Flag de desbordamiento del Timer 0. Se pone a 1 cuando el Timer 0 sufre desbordamiento, o sea cuando pasa de la combinacin todo unos a la combinacin todo ceros. Flag de puesta en marcha del Timer 0. Cuando est a 1 lgico el Timer 0 est habilitado para funcionar; en caso contrario esta parado.
196
Dependiendo de las caractersticas de la aplicacin que se quiera desarrollar, se debe realizar un control del Timer por software, o bien por hardware. Ejemplo 7.5 Control por hardware del Timer 0 En este ejemplo se trata de realizar con el microcontrolador 8XC251Sx una de las pruebas del control de calidad de una produccin de bateras de plomo-cido para coches. Esta prueba consiste en someter a la batera a una descarga de alta intensidad, al mismo tiempo que se mide el tiempo durante el cual la batera es capaz de suministrar ms de 400A manteniendo una tensin superior a 12 voltios. Si este tiempo est entre los 20ms y los 30ms, la batera se considera en buen estado; en caso contrario, se considera defectuosa. Este tiempo se puede medir utilizando uno de los Timers del microcontrolador, por ejemplo el Timer 0. Para realizar esta medida se monta el dispositivo mostrado en la figura 7.13 que incorpora un sensor de corriente, un sensor de tensin y una puerta AND cuya salida se ha conectado al pin P3.2, /INT0, para poder controlar mediante hardware el Timer 0. El sensor de corriente se activa cuando la corriente es mayor o igual a 400A. Por otra parte, el sensor de tensin se activa para una tensin mayor o igual a 12V. El nivel activo de ambos sensores es 1 lgico, de forma que, cuando los dos estn activos, la salida de la puerta AND es 1 lgico. La prueba del control de calidad exige medir el tiempo en que ambos detectores estn activos en una situacin de descarga brusca. Esta aplicacin requiere un control por hardware del Timer 0, de forma que se incremente durante todo el tiempo que los dos sensores permanezcan simultneamente activos, o sea, durante todo el tiempo que la entrada P3.2 est a 1 lgico.
8XC251
P3.2, INT0
P3.2
+ 12V
Cuando alguno de los dos sensores pase a cero lgico, la salida de la puerta AND pasar a cero y el Timer 0 detendr su funcionamiento. A partir del nmero de incrementos que ha sufrido el Timer 0 durante el tiempo que ha estado funcionando, se puede determinar si la batera es vlida, o si, por el contrario, est defectuosa. En concreto, el intervalo temporal que se desea medir est comprendido entre 20ms y 30ms. Si, por ejemplo, la frecuencia de la seal de reloj es de 12MHz, el temporizador se incrementa una vez cada 1s. Por tanto, 20ms se corresponden con 20.000 incrementos y 30ms se corresponden con 30.000 incrementos. La batera pasar de forma positiva el control de calidad siempre que el nmero de incrementos que haya sufrido el Timer 0, durante el tiempo en que los dos sensores estn activos, est comprendido entre 20.000 y 30.000. En la figura 7.14 est representado el diagrama de flujo del programa que controla el
197
funcionamiento de esta aplicacin. Bsicamente, el programa comienza con instrucciones que inicializan a cero los registros del Timer 0, TH0 y TL0. A continuacin se programan adecuadamente los registros TMOD y TCON para que el Timer 0 trabaje en modo 1, como temporizador, y controlado por hardware (figura 7.15). El programa contina con un par de instrucciones de salto condicional que tienen como objetivo detectar el intervalo de activacin simultnea de los dos sensores. Una vez que ha finalizado la prueba, se compara el contenido de los registros del Timer 0, TH0 y TL0, con los valores 20.000 y 30.000, para determinar si el estado de la batera es correcto.
INICIO
TMOD
TIMER 0 TEMPORIZADOR CONTROL HARDWARE GATE1 C/T1 0 0 M11 0 M10 GATE0 C/T0 0 1 0 M10 0 M00 1
P3.2=0? NO
SI
Habilitacin del funcionamiento del Timer 0 por hardware Timer 0 programado como temporizador Timer 0 programado en modo 1
P3.2=1? NO
SI
TCON
TF1 SI TR1 TF0 TR0 IE1 IT1 IE0 IT0
Habilitacin del funcionamiento del Timer 0 Puesta a cero del flag de interrupcin del Timer 0
198
JLE CORRECTA DEFEC: SETB P0.0 CORRECTA: NOP
Microcontroladores MCS-51 y MCS-251 ; Salta si es menor o igual que 30.000. ; Si la batera est defectuosa se pone a 1 el pin P0.0.
Por otra parte, un ejemplo clsico de control del Timer mediante programa es la realizacin de rutinas de retardo como la explicada en el apartado 7.4.1. 7.5.2 Desbordamiento de los Timers 0 y 1 Los Timers 0 y 1 se incrementan desde el valor inicial que se ha cargado en sus registros, THx y TLx, hasta que se produce un desbordamiento de los mismos. El desbordamiento tiene lugar cuando el contenido de los registros THx y TLx llega al valor mximo posible, combinacin todo unos, y se incrementa una vez ms. El desbordamiento de un Timer se detecta fcilmente mediante los flags de desbordamiento del registro TCON, TF0 para el Timer 0 y TF1 para el Timer 1 (tabla 7.9). Detectar el desbordamiento de los Timers es muy importante para que la aplicacin funcione correctamente. Ejemplo 7.6 Temporizacin de 0.1s mediante el Timer 1 En este ejemplo se debe temporizar 0.1s utilizando el Timer 1 de un microcontrolador 8XC251Sx que funciona con un reloj de 12MHz. Con esta frecuencia de reloj el Timer 1 se incrementa en una unidad cada microsegundo. Por tanto, para temporizar 0.1s el Timer 1 debe incrementarse 100.000 veces. Si el Timer se programa en modo 1 y se ha cargado con el valor inicial cero, sufre desbordamiento cuando se incrementa 216 = 65.536 veces. Una vez sufrido desbordamiento, el Timer 1 se debe incrementar 34.464 veces ms para llegar a contabilizar los 100.000 incrementos necesarios. En la figura 7.16 est representado el diagrama de flujo del programa que controla esta temporizacin. El programa comienza con instrucciones que inicializan a cero los registros del Timer 1, TH1 y TL1. A continuacin se programa adecuadamente el registro TMOD para que el Timer 1 trabaje en modo 1, como temporizador y controlado por software (figura 7.17). Tambin se programa el registro TCON para poner a cero el flag de desbordamiento del Timer 1, TF1, y para habilitar su funcionamiento. Una vez puesto en marcha el Timer, se debe detectar el momento en el que ste sufre desbordamiento. Esto se consigue fcilmente mediante una instruccin de salto condicional: la condicin de salto debe ser el valor del flag de desbordamiento TF1. Mientras este flag est a cero el programa ejecuta el salto de forma continuada. Cuando el Timer 1 rebasa, el flag se pone a 1, la condicin de salto ya no se cumple y por lo tanto no se efecta dicho salto. Llegados a este punto el Timer 1 deber incrementarse 34.464 veces ms para contabilizar los 100.000 incrementos correspondientes a un intervalo de 0.1s. Las siguientes instrucciones del programa colocan a cero el flag de desbordamiento, detienen el funcionamiento del Timer 1 e inicializan su contenido con el valor adecuado para que al incrementarse 34.464 veces llegue a desbordamiento. Este valor es 216 34.464 =31.072d = 7960H.
199
INICIO
TMOD
GATE1 C/T1 M11 M10 GATE0 C/T0 M10 M00
0
TIMER 1 TEMPORIZADOR CONTROL SOFTWARE
Timer 1 programado en modo 1 Timer 1 programado como temporizador Habilitacin del funcionamiento del Timer 1 por software
TF1=0?
SI
TCON
TF1=0? SI
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
NO
;****************************************************************************** ; PROGRAMA DE TEMPORIZACIN DE 0.1s ;****************************************************************************** ORG FF:0000H ; El programa comienza en la direccin FF:0000H MOV TH1,#00H ; Se inicializa los registros del Timer 1 a cero. MOV TL1,#00H ; MOV TMOD,#10H ; Se programa el Timer 1 en modo 1 como temporizador y MOV TCON,#40H ; controlado por hardware. SALT1: JNB TF1, SALT1 ; Se espera la activacin del flag de desbordamiento TF1. CLR TF1 ; Se pone a cero el flag TF1. MOV TH0,#79H ; Se inicializan los registros del Timer 1 con el valor MOV TL0,#60H ; adecuado para que rebase al incrementarse 34.464 veces. SALT1: JNB TF1, SALT1 ; Se espera la activacin del flag de desbordamiento TF1. NOP ; Ha finalizado la temporizacin de 0.1s.
7.5.3 Modos de funcionamiento de los Timers 0 y 1 Los Timers 0 y 1 pueden funcionar en cuatro modos de trabajo distintos, que se seleccionan programando adecuadamente los bits M00 y M10 para el Timer 0, y los bits M01 y M11 para el Timer 1 del registro TCON (tabla 7.8). a) Modo 0: Temporizador/contador de 13 bits En este modo de trabajo los Timers 0 y 1 funcionan como un contador de 13 bits, implementado mediante los 8 bits del registro THx y los 5 bits de menor peso del registro TLx. En este modo de trabajo se ignoran los tres bits de mayor peso del registro TLx. En la figura 7.18 se presenta el esquema de funcionamiento de los Timers 0 y 1 para los modos de funcionamiento 0 y 1.
200
XTAL1 12
Desbordamiento 0 1 Tx C/Tx TRx GATEx INTx THx (8 bits) TLx (8 bits) TFx
Peticin de interrupcin
Ejemplo 7.7 Generacin de una seal cuadrada En este ejemplo se trata de generar una seal cuadrada utilizando el Timer 0 programado en modo cero, con una frecuencia de la seal de reloj de 12MHz. La funcin del Timer, en esta aplicacin, ser la de controlar la duracin del perodo de la onda cuadrada. La idea es inicializar el Timer con el valor cero, ponerlo en funcionamiento y, cada vez que rebase, complementar el valor lgico del pin P0.0, de forma que, con los sucesivos desbordamientos del Timer 0, se genere la onda cuadrada en el pin P0.0 (figura 7.19).
8XC251
P0.0
Si la frecuencia de reloj es de 12MHz, el Timer 0 se incrementa una vez cada microsegundo, por lo que tarda en rebasar 213s, o sea, 8.192ms. Esto significa que cada semiperiodo de la onda cuadrada tiene una duracin aproximada de 8.2ms. En la figura 7.20 est representado el diagrama de flujo del programa que controla la generacin de la onda cuadrada. El programa comienza con instrucciones que inicializan a cero los registros del Timer 0, TH0 y TL0. Seguidamente se programa adecuadamente el registro TMOD para que el Timer 0 trabaje en modo 0, como temporizador y controlado por software. Tambin se programa el registro TCON para poner a cero el flag de desbordamiento del Timer 0, TF0, y para habilitar el funcionamiento del Timer 0. Una vez puesto en marcha el Timer, se debe detectar el momento en el que sufre desbordamiento. Esto se consigue fcilmente mediante una instruccin de salto condicional, donde la condicin de salto es el valor del flag de desbordamiento TF0. Mientras este flag est a cero, el programa ejecuta el salto de forma continuada. Cuando el Timer 0 rebasa, el flag se pone a 1, la condicin de salto ya no se cumple y, por tanto, el programa contina su ejecucin por la siguiente instruccin.
201
INICIO
TF0=0? NO
SI
COMPLEMENTAR P0.0
A continuacin se debe complementar el pin P0.0, poner a cero el flag de desbordamiento y saltar de nuevo al inicio para repetir la secuencia de forma indefinida.
;****************************************************************************** ; PROGRAMA DE TEMPORIZACIN DE GENERACIN DE ONDA CUADRADA ;****************************************************************************** ORG FF:0000H ; El programa comienza en la direccin FF:0000H MOV TH0,#00H ; Se inicializa los registros del Timer 0 a cero . MOV TL0,#00H ; MOV TMOD,#00H ; Se programa el Timer 0 en modo 0 como temporizador y MOV TCON,#10H ; controlado por software. SALT1: JNB TF0, SALT1 ; Se espera la activacin del flag de desbordamiento TF0. CPL P0.0 ; Se complementa el pin P0.0 CLR TF0 ; Se pone a cero el flag TF0. JMP SALT1 ; Se salta al inicio para repetir la secuencia.
b) Modo 1: Temporizador/contador de 16 bits Cuando los Timers 0 o 1 estn programados en modo 1, actan como un Timer de 16 bits implementado por los registros THx y TLx. Ejemplo 7.8 Generador de onda cuadrada con el Timer 1 controlado por interrupciones En el ejemplo 7.7 se utiliza el Timer 0 controlado mediante la tcnica de testeo para temporizar el perodo de la onda generada. En este ejemplo se va a desarrollar la misma aplicacin pero con el Timer 1 controlado mediante interrupciones, para poder comparar qu diferencias, a nivel de diseo del programa, supone el control de perifricos por interrupciones con respecto al control por testeo. El programa deber constar de dos partes: ) Un programa principal que incluya las instrucciones necesarias para habilitar las fuentes de interrupcin utilizadas en la aplicacin, as como las instrucciones de programacin e inicializacin de los perifricos.
202
) Una rutina de servicio a la interrupcin del Timer 1 que deber incluir las instrucciones necesarias para atender a este Timer 1 cuando interrumpa. El programa principal deber incluir una instruccin que habilite la fuente de interrupcin del Timer 1, poniendo a 1 lgico los bits adecuados del registro IE0 (figura 7.21). Asimismo, se incluirnyen instrucciones para programar el Timer 1 como temporizador en modo 1, para inicializar los registros TH1 y TL1 a cero, y para habilitar su funcionamiento (figura 7.22).
IE0
EA 1 EC 0 ET2 0 ES 0 ET1 EX1 ET0 EX0 1 0 0 0
TCON
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
0
Timer 1 programado en modo 1
Timer 1 programado como temporizador Habilitacin del funcionamiento del Timer 1 por programa
Habilitacin del funcionamiento del Timer 1 Puesta a cero del flag de interrupcin del Timer 1
;************************************************************************ ; PROGRAMA PRINCIPAL ;************************************************************************ ORG FF:0000H ; El programa principal se ubica a partir de JMP PRINCIP ; la direccin FF:0100H. ORG FF:0100H PRINCIP: MOV IE0,#88H ; Habilitacin de la fuente de interrupcin Timer 1. MOV TMOD,#20H ; Configuracin del Timer 1 en modo 1 como ; temporizador. MOV TH1,#00H ; Inicializacin del Timer 1 a cero lgico. MOV TL1,#00H MOV TCON,#40H ; Habilitacin del funcionamiento del Timer 1 y ; borrado del flag de interrupcin.
Una vez habilitado el Timer 1, ste se incrementa automticamente cada 12 perodos de reloj. Cuando el Timer sufre rebasamiento, se activa el flag de interrupcin TF1 y el microcontrolador salta a ejecutar la rutina de servicio de la interrupcin que est ubicada a partir de la direccin FF:001BH. En la rutina se debe incluir una instruccin que complemente el pin P0.0. Seguidamente se presenta el listado de la RSI del Timer 1.
7 Temporizadores/contadores internos y watchdog ;******************************************************************************* ; RUTINA DE SERVICIO A LA INTERRUPCION TIMER 1 ;******************************************************************************* ORG FF:001BH CPL P0.0 ; Se complementa el pin P0.0. RETI ; Retorno de RSI.
203
Para mejorar el diseo del ejemplo 7.8 se puede aadir un pulsador externo que controle el funcionamiento del generador, de forma que cuando se active el pulsador, el microcontrolador detenga la generacin de la onda cuadrada, inhiba la interrupcin del Timer 1 y ponga a cero el pin P0.0. Si se aprieta de nuevo el pulsador, el microcontrolador vuelve a generar la onda cuadrada. Si el pulsador se conecta a la entrada de interrupcin /INT0, permite controlar su activacin mediante el mecanismo de interrupcin (figura 7.24).
Tp
8XC251
+5V 10 k 1k
4.[F Fig. 7.24 Esquema elctrico de la conexin del pulsador al microcontrolador 8XC251
P0.0 INT0
Para poder llevar a cabo esta mejora del diseo es necesario modificar algunas instrucciones del programa principal y disear una rutina de atencin a la interrupcin /INT0. En concreto, se debe modificar el contenido del registro IE0 para habilitar la fuente de interrupcin /INT0, y el registro TCON para programar la interrupcin /INT0 por flanco de bajada (figura 7.25).
IE0
EA 1 EC 0 ET2 0 ES 0 ET1 1 EX1 0 ET0 EX0 0 1
TF1 TR1 TF0
TCON
TR0 IE1 IT1 IE0 IT0
Habilitacin del funcionamiento del Timer 1 Puesta a cero del flag de interrupcin del Timer 1
IPH0
b7 b6 b5 b4 b3 b2 b1 b0 --0 0 0 0 0 0 0
IPL0
--0 0 0 0 0 0 1 Bits de prioridad de la interrupcin PCA Bits de prioridad de la interrupcin Timer 2 Bits de prioridad de la interrupcin puerto serie Bits de prioridad de la interrupcin Timer 1 Bits de prioridad de la interrupcin INT1 Bits de prioridad de la interrupcin Timer 0 Bits de prioridad de la interrupcin INT0
204
Por otra parte, se puede considerar que la fuente de interrupcin /INT0 es ms prioritaria que la interrupcin Timer 1, puesto que su activacin habilita o inhibe la interrupcin del Timer 1. Por este motivo, se programa la interrupcin /INT0 con un nivel de prioridad mayor que la interrupcin Timer 1. Por ejemplo, se puede programar la interrupcin /INT0 con el nivel 1 y la interrupcin Timer 1 con el nivel 0. Teniendo en cuenta estas modificaciones, el listado del programa principal quedar de la siguiente manera:
;******************************************************************************* ; PROGRAMA PRINCIPAL ;******************************************************************************* ORG FF:0000H JMP PRINCIP ORG FF:0100H ; El programa principal se ubica a partir de la direccin FF:0100H. PRINCIP: MOV IE0,#89H ; Habilitacin de las fuentes de interrupcin Timer 1 y /INT0. MOV TMOD,#20H ; Programacin del Timer 1 en modo 1 como temporizador. MOV TH0,#00H ; Inicializacin del Timer 1 a cero lgico. MOV TL0,#00H MOV TCON,#41H ; Habilitacin del Timer 1 y borrado del flag de interrupcin ; Programacin de la interrupcin /INT0 activa por flanco de bajada. MOV IPH0,#00H ; Se programa la interrupcin /INT0 con nivel 1 y la MOV IPL0,#01H ; interrupcin Timer 1 con nivel 0.
Por otra parte, la RSI de la interrupcin /INT0 debe incluir instrucciones que controlen la habilitacin de la interrupcin del Timer 1 y pongan a cero el pin P0.0 si es necesario. En la figura 7.26 est representado el flujograma de la RSI de la interrupcin /INT0.
RSI /INT0
;******************************************************** ; RUTINA DE SERVICIO A LA INTERRUPCION INT0 ;******************************************************** ORG FF:0003H JNB ET1,HAB ; Si la int. del Timer 1 est inhibida se habilita. CLR ET1 ; Si la int. del Timer 1 est activa se inhibe. CLR P0.0 ; Se pone a cero el pin P0.0. RETI ; Retorno de RSI. HAB: SETB ET1 ; Se habilita la interrupcin Timer 1. RETI ; Retorno de RSI.
NO
RETI
Ejemplo 7.9 Control del ndice de acidez (pH) del agua de un depsito Se plantea a continuacin, como ejemplo ilustrativo de la utilizacin del sistema de interrupciones del microcontrolador 8XC251Sx, un caso prctico de control de una planta de tratamiento de aguas residuales. El objetivo de este ejemplo es mostrar el funcionamiento de las interrupciones en lo que respecta a la habilitacin, los niveles de prioridad, el manejo de los flags de interrupcin, etc.
205
La planta que se debe controlar dispone de un sistema que neutraliza la acidez de las aguas residuales provenientes de una planta de fabricacin de papel (figura 7.27). El sistema posee un depsito donde se mezcla el agua residual con la cantidad adecuada del componente neutralizador, cuya funcin es disminuir la acidez del agua, de forma que el agua de salida del depsito posea un pH superior a 5.5. El sistema de control incorpora dos sensores activos a nivel alto: ) Un detector de rebosamiento, S1, que se activa cuando el agua contenida en el depsito supera la altura mxima permitida. ) Un detector de pH, M, que se activa cuando el pH del agua es inferior a 5.5. El sistema de control dispone adems de dos actuadores, V1 y V2, activos a nivel alto, cuya funcin es realizar la apertura de dos vlvulas. Cuando se activa el actuador V1 se abre la vlvula que permite la entrada de las aguas residuales al depsito. Cuando se activa el actuador V2 se abre la vlvula que permite el vertido de neutralizador en el depsito. Por ltimo, existen dos indicadores luminosos, A1 y A2, activos a nivel alto, cuya funcin es la de monitorizar la apertura de las vlvulas V1 y V2.
Neutralizador
A1 Sistema de control A2
V1
V2 S1 M Medidor pH Descarga
En la figura 7.28 est representado el esquema elctrico en que se detalla la conexin del C 8XC251Sx con los diferentes sensores y actuadores que intervienen en esta aplicacin. Cabe destacar que los sensores S1 y M estn conectados a las entradas de interrupcin /INT0 e /INT1 a travs de sendas puertas inversoras, debido a que las interrupciones externas se activan a nivel bajo, mientras que estos sensores son activos a nivel alto.
8XC251
P1.2 P1.3 S1 M INT0 INT1 P1.0 P1.1 A1 A2 V1 V2
206
La estrategia que debe llevar a cabo el sistema de control para gestionar el funcionamiento de la planta de tratamiento de aguas residuales se puede resumir en dos puntos: ) La vlvula V1 debe permanecer abierta hasta que el sensor S1 se active, en cuyo caso se cerrar durante treinta segundos. Si una vez pasado este tiempo el sensor S1 sigue activo, se repetir la operacin de cierre de la vlvula V1. Mientras V1 est abierta, el indicador A1 permanecer encendido; en caso contrario el indicador parpadear. ) La vlvula V2 debe estar cerrada hasta que se active el sensor M, en cuyo caso se abrir durante cinco segundos. Una vez transcurrido ese tiempo, si el sensor M contina activo, se repetir la operacin de apertura de la vlvula V2. El indicador A2 se activa cuando la vlvula V2 est abierta y parpadea cuando est cerrada. Los recursos utilizados para resolver esta aplicacin son cuatro: ) La interrupcin externa /INT0, que se encarga de detectar la activacin del sensor S1. La interrupcin se activa por nivel para que pueda ser atendida por la CPU mientras el sensor S1 se encuentre a uno lgico. ) La interrupcin externa /INT1, cuya funcin es detectar la activacin del medidor de pH. Esta interrupcin tambin se programa por nivel por el mismo motivo que la /INT0. ) El Timer 0, que se encarga de temporizar el intervalo de 30s, tiempo que debe permanecer abierta la vlvula V1 cuando se active S1. ) El Timer 1, que se encarga de temporizar los 5s de apertura de la vlvula V2. ) El programa est compuesto de una rutina principal y de cuatro rutinas de atencin a la interrupcin, una para cada fuente de interrupcin utilizada en la aplicacin. La funcin del programa principal ser bsicamente la de habilitar y programar los niveles de prioridad de las diversas fuentes de interrupcin utilizadas, as como la de ejecutar la secuencia de parpadeo de los indicadores luminosos A1 y A2. Para habilitar las cuatro fuentes de interrupcin utilizadas, se ponen a uno lgico los bits correspondientes del registro habilitador de interrupciones IE0: EX0, ET0, EX1 y ET1. Esto se consigue cargando en el registro IE0 el valor 8FH (10001111b). Por otra parte, se deben poner a uno lgico los bits IT0 e IT1 del registro TCON, con el objetivo de que las interrupciones externas /INT0 e /INT1 se activen por nivel. Esto se consigue almacenando en el registro TCON el valor 0AH (0000 1010b). A continuacin se debe establecer la prioridad de las interrupciones. En principio se adjudica a las interrupciones /INT0 y Timer 0 una prioridad mayor que a las interrupciones /INT1 y Timer 1, dado que la situacin de rebasamiento requiere una actuacin ms urgente que la superacin del nivel de pH. Las fuentes /INT0 y Timer 0 se programan con nivel de prioridad tres, mientras que las fuentes de interrupcin /INT1 y Timer 1 se programan con un nivel de prioridad menor, por ejemplo con nivel cero. Por tanto, los registros de nivel de prioridad IPH0 e IPL0 quedan: IPH0 = 03H y IPL0 = 03H. Por ltimo, se debe poner el bit INTR del byte de configuracin CONFIG1 a uno lgico. De esta forma, cuando la CPU ejecute una interrupcin, se cargarn en la pila, automticamente,
207
los tres bytes del contador de programa, PC, y el registro de estado, PSW1. En cuanto a la rutina de retardo, que se utiliza para temporizar el parpadeo de los indicadores luminosos, estar compuesta de dos bucles anidados basados en decrementar los registros R0 y R1. Modificando el valor de los registros R0 y R1 se puede variar el tiempo de ejecucin de la rutina y, por tanto, la frecuencia de parpadeo. Para calcular el tiempo de retardo hay que determinar el nmero de veces que se ejecuta cada instruccin, as como el tiempo que tarda en ejecutarse cada una de ellas. En la figura 7.29 se muestran los flujogramas correspondientes al programa principal y a la rutina de retardo. En la figura 7.30 se muestran los flujogramas de las rutinas de atencin a las interrupciones /INT0 y Timer 0. Las tareas que debe realizar la rutina de atencin a la interrupcin /INT0 son: ) Cerrar la vlvula V1. ) Inicializar el Timer 0 para que temporice 30s. ) Inhibir la interrupcin /INT0 para impedir que se ejecute de forma repetida la RSI de la /INT0 mientras el sensor S1 se encuentra activo y no ha finalizado la temporizacin de 30s. Si consideramos que la frecuencia de reloj es de 1.2MHz, se puede determinar, mediante un clculo sencillo, que el Timer 0 debe rebasar varias veces para temporizar 30s.
PRINCIPAL RETARDO
R0 = 10H
R1 = FFH
P1.2 = 1 P1.3 = 1
DECREMENTA R1
RETARDO
R1 = 0?
SI
NO
P1.2 = 0 P1.3 = 0
DECREMENTA R0
RETARDO
R0 = 0?
SI
NO
RET
En la RSI del Timer 0 se debe contar el nmero de rebasamientos que sufre este temporizador. Cuando el Timer 0 rebase un nmero de veces equivalente a 30s se abrir la vlvula V1, se detendr el
208
funcionamiento del Timer 0 y se habilitar de nuevo la interrupcin /INT0, de forma que si el sensor S1 contina activo se repetir de nuevo la secuencia de cierre de V1.
INT0 T0
CERRAR VLVULA V1
T = 30s? SI PARAR T0
NO
INICIALIZAR T0
ACTIVACIN T0 ABRIR VLVULA V2 INHIBIR INT0 BORRAR IE0 RETI HABILITAR INT0
RETI
Fig. 7.30 Flujogramas de las rutinas de servicio a las interrupciones /INT0 y Timer 0
Las rutinas de atencin a las interrupciones /INT1 y Timer 1 tienen funciones similares a las interrupciones /INT0 y Timer 0. En la figura 7.31 se presentan los flujogramas correspondientes a ambas rutinas.
INT1 T1
ABRIR VLVULA V2
T = 5s? SI PARAR T1
NO
INICIALIZAR T1
ACTIVACIN T1 CERRAR VLVULA V2 INHIBIR INT1 BORRAR IE1 RETI HABILITAR INT1
RETI
Fig. 7.31 Flujogramas de las rutinas de servicio a las interrupciones /INT1 y Timer 1.
7 Temporizadores/contadores internos y watchdog ORG FF:0013H ; Vector de interrupcin de /INT1. JMP RSI_INT1 ORG FF:001BH ; Vector de interrupcin del Timer 1. JMP RSI_T1 ;****************************************************************************** ; PROGRAMA PRINCIPAL ;****************************************************************************** ORG FF:0000H JMP PRINCIP ORG FF:0100H ; Programacin del nivel de prioridad de las interrupciones externas 0 y 1 PRINCIP: MOV IE0,#8FH ; Habilitacin de las interrupciones MOV TCON,#0AH ; Se programa /INT0 e /INT1 por nivel MOV IPL0,#03H ; Programacin de los niveles de prioridad MOV IPH0,#03H SETB INTR ; Cuando la CPU vectorice una interrupcin cargar en la pila ; los 3 bytes del PC y el registro de estado PSW1. ;Secuencia de parpadeo de los indicadores luminosos A1 y A2 SALTO0: SETB P1.2 SETB P1.3 CALL RETARDO CLR P1.2 CLR P1.3 CALL RETARDO JMP SALTO0 ;************************************************************************ ; RUTINA DE RETARDO ;************************************************************************* ORG FF:0200H RETARDO: MOV R0,#10H ; R0 = 10H. SALT2: MOV R1,#FFH ; R1 = FFH. SALT1: DJNZ R1,SALT1 ; Decrementa R1 y si es distinto de 0 salta a SALT1. DJNZ R0,SALT2 ; Decrementa R2 y si es distinto de 0 salta a SALT2. RET ;************************************************************************ ; RUTINA DE SERVICIO A LA INTERRUPCION INT0 ;************************************************************************* ORG FF:0300H RSI_INT0: CLR P1.0 ; Se cierra la vlvula V1. SETB TMOD.0 ; Se programa el Timer 0 en modo 1. MOV TH0,#3CH ; Se inicializa el Timer 0 para temporizar 0.5 s. MOV TL0,#AFH ; MOV R3,#00H ; El registro R3 contar los rebasamientos del Timer 0. SETB TR0 ; Puesta en marcha del Timer 0. CLR EX0 ; Se inhibe la interrupcin /INT0. RETI
209
Clculo del valor inicial del Timer 0 Para temporizar los treinta segundos se inicia el Timer 0 para que tarde 0.5s en rebasar, de forma que se deben contabilizar 60 rebasamientos en la RSI del Timer 0 para abrir de nuevo la vlvula V1. Para temporizar 0.5s, con una frecuencia de reloj de 1.2MHz, el Timer 0 debe incrementarse 50.000 veces (C350H); luego se ha de cargar dicho Timer con la combinacin resultante de restar a FFFFH el valor C350H: FFFFH - C350H = 3CAFH
210
;***************************************************************************** ; RUTINA DE SERVICIO A LA INTERRUPCION TIMER 0 ;***************************************************************************** ORG FF:0400H RSI_T0: INC R3 ; Se incrementa el contador de rebasamientos. CMP R3,59d ; Se compara el nmero de rebasamientos con 59. JNC SIGUE ; Si el nmero de rebasamientos es menor o igual que 59 contina temporizando. CLR TR0 ; En caso contrario se detiene el Timer 0 y CLR P1.0 ; se abre la vlvula V1. SETB EX0 ; Se habilita de nuevo la interrupcin /INT0. CLR IE0 ; Se borra el flag de la interrupcin /INT0. SIGUE: RETI ; Retorno al programa principal. ;**************************************************************************** ; RUTINA DE SERVICIO A LA INTERRUPCION INT1 ;***************************************************************************** ORG FF:0500H RSI_INT1: SETB P1.1 ; Se abre la vlvula V2. SETB TMOD.4 ; Se programa el Timer 1 en modo 1. MOV TH1,#3CH ; Se inicializa el Timer 1 para temporizar 0.5 s. MOV TL1,#AFH MOV R4,#00H ; El registro R4 contar los rebasamientos del Timer 1. SETB TR1 ; Puesta en marcha del Timer 1. CLR EX1 ; Se inhibe la interrupcin /INT1 RETI ;************************************************************************** ; RUTINA DE SERVICIO A LA INTERRUPCION TIMER 1 ;************************************************************************** ORG FF:0600H RSI_T1: INC R4 ; Se incrementa el contador de rebasamientos CMP R4,09d ; Se compara el nmero de rebasamientos con 9 JNC SIGUE1 ; Si el nmero de rebasamientos es menor o igual que 9 ; continua temporizando. CLR TR1 ; Se detiene el Timer 1 SETB P1.1 ; Se abre la vlvula V2 SETB EX1 ; Se habilita la interrupcin /INT1 CLR IE1 ; Se borra el flag de la interrupcin /INT1 SIGUE1: RETI ; Retorno al programa principal
c) Modo 2: Temporizador/contador de 8 bits con autorrecarga El modo 2 configura a los Timers 0 o 1 como temporizador/contador de 8 bits, implementado con el registro TLx (con x = 0 1).
XTAL1 12 0 1 Tx C/Tx Recarga TRx GATEx INTx THx (8 bits) x=01 TLx (8 bits) Desbordamiento TFx Peticin de interrupcin
211
En este modo de trabajo cuando el Timer sufre desbordamiento se activa el flag TFx y automticamente se carga el contenido del registro THx en el registro TLx, de forma que el Timer comienza a contar a partir del valor cargado en el registro THx. El proceso de recarga no modifica el contenido del registro THx. En la figura 7.32 est representado el esquema del Timer 0 o de Timer 1 funcionando en modo 2. Ejemplo 7.10 Contador mdulo 12 con el Timer 1 Este ejemplo consiste en la realizacin de un contador mdulo 12 con el Timer 1 programado en modo 2. El contador cuenta desde el valor inicial 3 hasta el 15. En la figura 7.33 se muestra el esquema general de un contador mdulo 12, que incluye las salidas de cuenta, una entrada de reloj y una entrada de habilitacin del contador.
Contador de 4 bits Seal de habilitacin Habilitador del contador Entrada de cuenta
Seal de reloj
En la figura 7.34 se muestra cmo se puede realizar este contador utilizando el microcontrolador 8XC251Sx. Basta con conectar la seal de reloj a la entrada de cuenta del Timer 1 (pin P3.5), conectan la seal de habilitacin del contador a la entrada de control por hardware del Timer 1 (pin P3.3); las salidas del contador pueden tomarse de los cuatro bits de menor peso del puerto 0. 8XC251
+5V INT1 P0.0 P0.1 P0.2 Entrada de cuenta P0.3 T1
El programa comienza configurando el Timer 1 como contador en modo 2 y controlado por hardware. Seguidamente se deben inicializar los registros TH1 y TL1 con el valor adecuado para esta aplicacin. A continuacin se vuelca el contenido del registro TL0 sobre el puerto P0 de forma continuada, con el objetivo de visualizar sobre este puerto los incrementos que sufre el contador a medida que va recibiendo los pulsos aplicados en la entrada de cuenta. El valor elegido para inicializar los registros del Timer 1 es el F3H, de forma que al volcar este contenido sobre el puerto P0, en los cuatro bits de menor peso aparece el valor 3H (valor inicial de cuenta). A medida que el Timer 1 se incrementa se puede seguir el incremento a travs del puerto P0. Cuando se llega al valor FH (15d) y se recibe un nuevo pulso se produce desbordamiento y el registro TL1 se carga de nuevo con F3H (figura 7.35).
212
Desbordamiento
F3H
F4H
F5H
FEH
FFH
TL0
P0:3=3H
P0:3=4H
P0:3=5H
P0:3=EH
P0:3=FH
P0
En la figura 7.36 est representado el diagrama de flujo del programa que controla el funcionamiento del contador mdulo 12.
INICIO
CARGAR TL1 EN P0
d) Modo 3: Timer 0: dos temporizadores/contadores de 8 bits; Timer 1: parado Cuando el Timer 0 se programa en modo 3, los registros TL0 y TH0 operan como dos temporizadores independientes de 8 bits (figura 7.37). Este modo se utiliza en aquellas aplicaciones que requieren un temporizador o contador adicional. En este modo de funcionamiento, el registro TL0 utiliza todos los bits de control del Timer 0 para su funcionamiento normal: C/T0, GATE0, TR0 y TF0. En cambio, las prestaciones de funcionamiento del registro TH0 se ven muy reducidas debido a que los nicos flags que controlan su funcionamiento son el TR1 y el TF1. El flag TR1 permite habilitar el funcionamiento del registro TH0 y el flag TF1 se activa cuando este registro sufre desbordamiento.
213
Por otra parte, el registro TH0 slo puede operar como temporizador y no como contador (figura 7.37).
XTAL1 12 0 1 T0 C/T0 TR0 GATE0 1/12 Fosc INT0 TR1 Desbordamiento TH0 (8 bits) TF1 Peticin de interrupcin 1/12 Fosc Desbordamiento TL0 (8 bits) TF0
Peticin de interrupcin
Por este motivo, cuando el Timer 0 est programado en modo 3, el Timer 1 no puede utilizar los flags TR1 y TF1 para su normal funcionamiento. Esto significa que cuando el Timer 1 desborde no se activar el flag TF1; igualmente, no se puede utilizar el bit TR1 para habilitar el funcionamiento de este Timer. Por otra parte, cuando el Timer 1 se programa en modo 3 se detiene su funcionamiento. Este modo puede utilizarse para detener el Timer 1 cuando el Timer 0 est programado en modo 3 y el bit TR1 no est disponible.
7.6 Timer 2
El Timer 2 es un temporizador/contador de 16 bits implementado mediante dos registros de 8 bits conectados en cascada: TH2 y TL2. Para controlar su funcionamiento se dispone de 2 registros: T2MOD y T2CON (tablas 7.10 y 7.11).
Tabla 7.10 Registro de control de modo del Timer 2
b4 --
b0 DCEN
DCEN
Reservado. Estos bits estn reservados para futuras aplicaciones y no se pueden utilizar. Bit de habilitacin del Timer 2. Cuando el Timer 2 trabaja en modo Clock-out, este bit conecta la salida de reloj con el pin T2. Bit de cuenta atrs. Este bit configura al Timer 2 como un contador ascendente o descendente.
b4 TCLK
b0 CP/RL2
EXF2
RCLK
4 3
TCLK EXEN2
TR2
C/T2
CP/RL2
Flag de desbordamiento del Timer 2. Este flag se pone a 1 cuando el Timer 2 sufre desbordamiento, o sea, cuando pasa de la combinacin todo unos a la combinacin todo ceros. Este bit no se activa si RCLK=1 o TCLK=1. Flag externo del Timer 2. Este flag se pone a 1 cuando se produce un flanco negativo en el pin T2EX con el flag EXEN2=1. Bit de reloj en recepcin. Este flag se pone a 1 cuando el Timer 0 sufre desbordamiento, o sea cuando pasa de la combinacin todo unos a la combinacin todo ceros. Bit de reloj en transmisin. Bit de habilitacin externa del Timer 2. Cuando este bit est a 1 y se produce una transicin negativa en el pin T2EX, se produce una recarga o captura, a menos que el Timer 2 se utilice como generador de Baud Rate del puerto de comunicacin serie. Si el bit EXEN2 est a cero se ignoran las transiciones en el pin T2EX. Bit de puesta en marcha del Timer 2. Cuando est a 1 lgico el Timer 2 est habilitado para funcionar; en caso contrario esta parado. Bit de seleccin de contador/temporizador: C/T2 = 0: el Timer 2 funciona como temporizador. C/T2 = 1: el Timer 2 funciona como contador. Bit de captura/recarga. Cuando este bit est a 1 se produce una captura al aplicar un flanco negativo en la entrada T2EX con EXEN2=1. Cuando este bit est a cero se produce un recarga al aplicar un flanco negativo en la entrada T2EX con EXEN2=1. Si RCLK=1 o TCLK=1, se ignora el bit CP/RL2 y se fuerza la recarga del Timer 2 cuando sufre desbordamiento.
Los bits de los registros T2MOD y T2CON permiten programar el modo de funcionamiento de los Timers, controlar su puesta en marcha, programar su modo de operacin (contador o temporizador) y detectar el desbordamiento. En la tabla 7.12 se indican los cuatro modos de operacin en los que puede funcionar el Timer 2.
Tabla 7.12 Modos de operacin del Timer 2
Modo
Modo autorrecarga Modo captura Modo Baud Rate Clock-out programable
RCLK o TCLK
0 0 1 X
CP/RL2
0 1 X 0
T2OE
0 0 X 1
215
7.6.1 Modo captura En el modo captura, el Timer 2 funciona como un temporizador o contador de 16 bits (figura 7.38). Cuando el Timer 2 sufre desbordamiento se activa el flag TF2, con lo que se genera una peticin de interrupcin al microcontrolador. Si el bit EXEN2 est a 1 lgico, un flanco de bajada en el pin T2EX captura el valor actual de los registros del Timer 2, TH2 y TL2, en los registros RCAP2H y RCAP2L respectivamente. Al mismo tiempo, el flanco de bajada en el pin T2EX produce la activacin del bit EXF2, lo cual genera una peticin de interrupcin al microcontrolador.
XTAL1 12 Desbordamiento 0 1 T2 C/T2 Peticin de interrupcin RCAP2H RCAP2L T2EX EXF2 TR2 TH2 (8 bits) TL2 (8 bits) TF2
EXEN2
7.6.2 Modo autorrecarga El modo autorrecarga configura al Timer 2 como un temporizador o contador de 16 bits con recarga automtica. En este modo de funcionamiento el Timer opera como un contador ascendente o ascendente/descendente, segn sea el valor del bit DCEN (Down Counter Enable Bit). Cuando se realiza un reset del microcontrolador, el bit DCEN se pone automticamente a cero, de forma que si se programa el Timer 2 en modo autorrecarga, ste funcionar como contador ascendente.
a) Contador ascendente (DCEN=0) Cuando DCEN=0, el Timer 2 opera como un contador ascendente (figura 7.39). El valor del bit EXEN2 permite dos posibilidades de funcionamiento dentro de este modo. Si EXEN2=0, el Timer 2 cuenta hacia arriba hasta el valor FFFFH y activa el flag TF2 cuando sufre desbordamiento. Con el desbordamiento se recarga, en los registros del Timer 2, TH2 y TL2, el valor contenido en los registros de recarga/captura, RCAP2H y RCAP2L, respectivamente. Si EXEN2=1, los registros del Timer se recargan por dos motivos distintos: cuando se produce desbordamiento y cuando se aplica un flanco de bajada en el pin T2EX. El flanco de bajada en T2EX tambin activa el bit EXF2, que realiza una peticin de interrupcin al microcontrolador.
216
XTAL1
12
0 1
TL2 (8 bits)
Desbordamiento
T2 C/T2
Recarga
RCAP2H RCAP2L
Peticin de interrupcin
b) Contador ascendente/descendente (DCEN=1) Cuando DCEN=1, el Timer 2 opera como un contador ascendente/descendente (figura 7.40). La direccin de cuenta se puede controlar mediante el valor lgico aplicado al pin T2EX. Cuando este pin est a nivel alto, 1 lgico, el Timer 2 cuenta de forma ascendente. En este caso, cuando el Timer llega a FFFFH y se incrementa otra vez, se produce desbordamiento y se activa el flag TF2, lo que genera una peticin de interrupcin al microcontrolador. El desbordamiento tambin produce la recarga automtica de los registros del Timer 2, TH2 y TL2, con el valor almacenado en los registros de recarga/captura, RCAP2H y RCAP2L, respectivamente.
Valor de recarga para cuenta hacia abajo FFH FFH Complemento XTAL1 12 EXF2 Peticin de interrupcin TF2
0 T2 C/T2 1 TR2
TH2 (8 bits)
TL2 (8 bits)
Desbordamiento
Direccin de cuenta 1 = ascendente T2EX 0 = descendente RCAP2H RCAP2L Valor de recarga para cuenta hacia arriba
217
Cuando T2EX vale 0 lgico, el Timer 2 cuenta hacia abajo. El desbordamiento del Timer 2 ocurre, en este caso, cuando el contenido de los registros TH2 y TL2 es igual al valor cargado en los registros RCAP2H y RCAP2L, respectivamente. El desbordamiento provoca la activacin del flag TF2 y recarga los registros del Timer con el valor FFFFH. Por otra parte, cuando el Timer sufre desbordamiento, en la cuenta ascendente o descendente, el bit EXF2 cambia de valor. En este modo de funcionamiento el bit EXF2 no genera ninguna peticin de interrupcin al microcontrolador y puede utilizarse como bit 17 del Timer 2.
7.6.3 Modo de generador de baudios (Baud Rate Generator Mode) En este modo el Timer 2 queda configurado como generador de baudios para fijar la velocidad de transmisin del puerto de comunicacin serie. Para seleccionar este modo es necesario activar los bits RCLK y/o TCLK de registro T2CON (tabla 7.12).
7.6.4 Modo Clock-out En este modo de funcionamiento, el Timer 2 funciona como un reloj de frecuencia variable con un ciclo de trabajo del 50% (figura 7.41) y se incrementa con una frecuencia FOSC/2 hasta que sufre desbordamiento; entonces se recarga automticamente los registros TH2 y TL2 con el valor contenido en los registros RCAP2H y RCAP2L, respectivamente. En el modo Clock-out, el desbordamiento del Timer 2 no genera peticin de interrupcin.
XTAL1 2 0 1 T2 C/T2 TR2 Desbordamiento
TH2 (8 bits)
TL2 (8 bits)
EXEN2
La frecuencia de la seal de reloj que se genera con este modo se puede programar adecuadamente fijando el valor de los registros RCAP2H y RCAP2L:
218
Frecuencia reloj ]
(7.1)
Si el microcontrolador funciona con un reloj de 16MHz, se podr programar un rango de frecuencias de 61Hz a 4MHz. La seal de reloj, generada en este modo, est disponible en el pin T2. Para programar el Timer 2 en el modo Clock-out se debe poner a 1 lgico el bit T2OE del registro T2MOD. Tambin se debe poner a cero lgico el bit C/T2, para que el Timer 2 funcione como temporizador y para habilitar al mismo tiempo el pin T2 como salida de reloj. Los registros RCAP2H y RCAP2L se inicializan adecuadamente, segn la expresin 7.1, para fijar la frecuencia de la seal generada. Por otra parte, los registros TH2 y TL2 se cargan con el mismo valor, o con otro distinto, dependiendo de la aplicacin. Finalmente, se activa el bit TR2 para poner en marcha el Timer 2. Es posible utilizar el Timer 2 como generador de baudios y como generador de reloj de forma simultnea. Ejemplo 7.11 Control de llenado de un garaje Esta aplicacin consiste en contar el nmero de coches que hay en un garaje mediante el microcontrolador 8XC251Sx. La cuenta est controlada por el Timer 2, que debe trabajar como contador bidireccional: incrementndose cada vez que entra un coche y decrementndose cuando sale. Por tanto, se debe programar el Timer 2 en modo autorrecarga con DCEN=1. Para detectar la presencia de vehculos y su direccin, entrada o salida, se dispone de tres sensores de presencia, S1, S2 y S3, activos a nivel alto (figura 7.42).
G AR A JE
S1
S3
S2
Sistema de control
Para realizar esta aplicacin se conecta el sensor S3 a la entrada de cuenta del Timer 2: T2. Cada vez que un coche entra o sale del garaje, el sensor S3 genera un pulso en esta entrada, de forma que el Timer se incrementa o decrementa, dependiendo del valor lgico aplicado en el pin T2EX (figura 7.43). Los sensores S1 y S2 controlan la direccin de cuenta a travs de la bscula RS conectada a la entrada T2EX. Si el vehculo entra en el garaje se activa, en primer lugar, el sensor S2 y, por tanto, se aplica un pulso a la entrada S de la bscula RS. Como resultado, la salida Q de la bscula se pone a 1, T2EX=1, lo que permite al Timer 2 incrementarse cuando el vehculo genera un pulso en la entrada T2. Igualmente, si el vehculo sale del garaje, se activa el sensor S1 que pone a cero la bscula RS, y el Timer 2 se decrementa al activarse el sensor S3.
219
8XC251
S1 S2 S3
R S T2 Q T2EX
R 0 0 1 1
S 0 1 0 1
Q+ Q 1 0 X
Fig. 7.43 Conexin de los sensores al [C 8XC251Sx y tabla de funcionamiento de una bscula RS
En esta aplicacin, el Timer 2 debe trabajar como contador bidireccional; se deber programar, por tanto, en modo autorrecarga con DCEN=1. Para ello se deben inicializar los siguientes bits: RCLK = TCLK = 0, CP/RL2 = 0, T2OE = 0 y el bit DCEN = 1. Los bits RCLK, TCLK y CP/RL2 estn ubicados en el registro T2CON, mientras que el bit T2OE y DCEN estn ubicados en el registro T2MOD. Seguidamente se deben inicializar los registros del Timer 2 a cero, y ponerlo en marcha.
;******************************************************************************** ; PROGRAMA DE CONTROL DEL GARAJE ;******************************************************************************** ORG FF:0000H ; El programa est almacenado a partir de la direccin de memoria FF:0000H CLR RCLK ; Se pone a cero el bit RCLK del registro T2CON. CLR TCLK ; Se pone a cero el bit TCLK del registro T2CON. CLR CP/RL2 ; Se pone a cero el bit CP/RL2 del registro T2CON. CLR T2OE ; Se pone a cero el bit T2OE del registro T2MOD. SETB C/T2 ; Se programa el Timer 2 como contador. SETB DCEN ; El Timer 2 trabaja como contador Up/Down SETB TR2 ; Se habilita el funcionamiento del Timer 2. MOV TL2,#00H ; Se inicializa el contador a cero. MOV TH2,#00H ;
7.7.1 Descripcin de funcionamiento El WDT es un Timer de 14 bits que se incrementa automticamente cada ciclo de perifrico, o sea, cada 12 perodos de reloj, y su funcionamiento est controlado por el registro WDTRST, ubicado en la direccin S:0A6H del rea de registros de funcin especfica. El Timer WDT se gestiona bsicamente a travs de dos operaciones: ) ) Un reset del microcontrolador borra e inhibe el funcionamiento del Timer WDT. Escribiendo una secuencia especfica de dos bytes en el registro WDTRST se borra y habilita el Timer WDT.
220
Una vez habilitado para funcionar, el Timer WDT se incrementa cada 12 perodos de seal de reloj y, si no se borra, sufre desbordamiento cuando llega a la combinacin 3FFFH+1; entonces genera, adems, un reset al microcontrolador 8XC251Sx. Si, por ejemplo, la frecuencia de reloj del microcontrolador es de 16MHz, el ciclo de perifrico es de 750ns y el Timer WDT desborda en 750ns x 16384 = 12,288ms.
7.7.2 Utilizacin del Timer WDT Se puede utilizar el Timer WDT para que, en caso de funcionamiento errneo del programa, se realice un reset del microcontrolador. La idea es que desde el programa de la aplicacin se borre peridicamente el Timer WDT, antes de que desborde. Si el programa entra en secuencia de funcionamiento errnea, el Timer WDT no se borrar y cuando sufra desbordamiento se efectuar el reset el Timer WDT quedar automticamente inhibido. Para borrar el Timer WDT se debe escribir en el registro WDTRST una secuencia de dos bytes: 1EH y 1EH. Esta operacin habilita y borra el Timer WDT, de forma que comienza de nuevo a incrementarse a partir del valor inicial 0000H. A lo largo del programa se deber escribir la secuencia de dos bytes para borrar y habilitar de nuevo el Timer WDT antes de que desborde.
7.7.3 Timer WDT durante el modo Idle El Timer WDT contina su funcionamiento mientras el microcontrolador est en modo de operacin Idle. Esto significa que el usuario debe controlar el funcionamiento de este Timer durante el modo Idle. Por ejemplo, se puede utilizar el Timer 0 programado convenientemente para desbordar antes que el Timer WDT. Cuando el Timer 0 desborda, genera una interrupcin al microcontrolador. En la rutina de interrupcin del Timer 0 se pone a cero el Timer WDT, se inicializa el Timer 0 y se coloca de nuevo el microcontrolador en modo Idle.
7.7.4 Timer WDT durante Power Down Cuando el microcontrolador est en el modo Power Down se paran todos los relojes del microcontrolador. Esto detiene automticamente el funcionamiento del Timer WDT y mantiene su valor de cuenta. Cuando el microcontrolador sale de este modo de funcionamiento, mediante la activacin de las entradas /INT0 o /INT1, el Timer WDT contina su cuenta por donde la dej. Para asegurarse de que el Timer WDT no llega a desbordamiento en un tiempo corto despus de que el microcontrolador sale del modo Power Down, se debe inicializar justo antes de entrar en dicho modo de funcionamiento.
8 Memoria externa
221
8 Memoria externa
8.1 Introduccin
Muchas aplicaciones realizadas con microcontroladores de las familias MCS-51 y MCS-251 se pueden resolver con versiones que disponen de memoria interna de programa, por lo que no es necesario, en estas versiones, el uso de circuito integrados de memoria adicionales. Las versiones con memoria interna EPROM son tiles para elaborar prototipos, pero ms an son viables las versiones con memoria EPROM del tipo OTP, One-Time Programmable, y las versiones con memoria EEPROM tipo flash de Atmel, ya que las primeras carecen de la ventana de cuarzo para borrar las memorias EPROM, lo que simplifica su encapsulado y reduce considerablemente su coste, y las segundas disponen de una tecnologa que permite un coste reducido. De toda maneras, segn la aplicacin, puede ser necesario ampliar la capacidad de memoria de los microcontroladores, o emplear versiones que carezcan de memoria interna; en estos casos resulta imprescindible usar circuitos integrados de memoria externa para resolver la aplicacin. Entonces, es importante conocer correctamente la forma de conectar los circuitos de memoria al microcontrolador y saber determinar si las memorias son compatibles a nivel temporal con el microcontrolador.
222
-EPROM, Erasable Programmable ROM: esta memoria emplea un transistor MOS de puerta flotante como elemento bsico de cada una de sus celdas. Puede grabarse elctricamente y borrarse mediante su exposicin a una fuente de rayos ultravioleta, para lo cual dispone de un encapsulado especial cermico con una ventana de cristal de cuarzo que encarece su coste. Esta memoria es adecuada para realizar prototipos y para series cortas de fabricacin, aunque, en su versin OTP, One Time Programmable, se reduce considerablemente su costo debido a que se elimina la ventana de cuarzo del encapsulado, por lo que slo puede programarse una vez y no se puede borrar. -EEPROM o E2PROM, Electrically Erasable and Programmable ROM: esta memoria utiliza el mismo transistor MOS de puerta flotante que la memoria EPROM, pero con una modificacin tecnolgica que permite grabar y borrar el transistor MOS elctricamente mediante efecto tnel . La memoria EEPROM no tiene ventana de cuarzo, por lo que tiene un coste ms reducido que la memoria EPROM. El tiempo de lectura de esta memoria es parecido al tiempo de lectura de las memorias RAM; no obstante, su tiempo de escritura, del orden de milisegundos, es demasiado elevado, lo que fuerza a establecer estados de espera en el proceso de escritura. Esta memoria es adecuada para aquellos sistemas que necesitan tener datos almacenados de forma estable, pero que pueden modificarse con cierta frecuencia. -FLASH: este tipo de memoria es de reciente aparicin y son memorias EEPROM que tienen una configuracin interna estructurada, a nivel de circuito, en bloques de bits, lo que permite reducir de manera considerable el rea de silicio respecto a su homloga EEPROM, lo que reduce, por tanto, su coste e incrementa su capacidad. El tiempo de escritura y de lectura de estas memorias es comparable con el requerido para las memorias RAM. Estas memorias se proporcionan con capacidades considerables, del orden del megabit, lo que hace que se apliquen para el almacenamiento de imgenes en cmaras digitales y en la sustitucin de la cinta magntica de los contestadores telefnicos. El problema que presentan estas memorias es que pueden soportar un nmero bastante menor de ciclos de lectura/escritura que las memorias EEPROM. Las memorias del tipo RAM, Ramdom Access Memory, de lectura/escritura, se utilizan bsicamente para grabar datos y resultados relacionados con el programa que ejecuta la aplicacin, y son voltiles, es decir, pierden la informacin contenida cuando se interrumpe la tensin de alimentacin del circuito integrado. Existen dos tipos de memorias RAM: -SRAM, Static RAM: esta memoria suele tener por base un biestable del tipo RS formado por cuatro transistores que almacenan el bit concreto, y un par de transistores adicionales que se usan para efectuar las operaciones de lectura/escritura. -DRAM, Dynamic RAM: existen muchos tipos de memorias DRAM en el mercado y se utilizan de forma masiva dentro del mercado de ordenadores destinados a la computacin y el procesamiento de datos. La clula bsica de esta memoria consiste en un nico transistor y un condensador implementado en silicio de manera que su tamao es sumamente reducido, por lo
1
El efecto tnel requiere de una capa muy delgada de xido aislante, SiO2, de alta calidad, para evitar que los electrones que atraviesan el xido entre la puerta flotante y el drenador del transistor MOS queden atrapados en esta capa por los defectos del xido.
8 Memoria externa
223
que suelen ser memorias de alta capacidad de almacenamiento. La informacin se almacena en el condensador de celda de la memoria, utilizando para ello la carga y descarga del condensador, factor que hace que sean memorias de bajo consumo. Tienen el inconveniente de que deben regrabarse cada pocos milisegundos, debido a que se producen pequeas fugas en las cargas de los condensadores que causan la prdida del estado lgico almacenado, lo que hace que tengan una circuitera interna compleja para el refresco de la memoria.
n
Entradas/salidas de datos
Memoria
Entradas de control
Las memorias que se emplean para sistemas basados en un microcontrolador, suelen tener una estructura interna de celdas de tipo matricial, organizada en filas y columnas, donde cada celda contiene un bit de informacin, el nmero de columnas agrupa 8 bits (que forman un byte), y donde el nmero de filas determina la capacidad de la memoria. El tamao de estas memorias es de 256x8bits o 256bytes, 1kx8bits o 1kbyte, 2kbytes, 4kbytes, 8kbytes y as sucesivamente en potencias de 2. En estos sistemas tambin se utilizan memorias serie con un nico bit de entrada/salida. El dato a leer o escribir en estas memorias puede tener varios tamaos: es comn que sea de 8bits, de 16bits o de 32bits. Estas memorias suelen tener un encapsulado reducido y unas pocas lneas de control. Para acceder a cada posicin de memoria se dispone de un nmero determinado de lneas de direccin, dependiendo del tamao de la memoria que se desea emplear, de manera que se cumple la siguiente relacin: m = 2n, donde m es el tamao de la memoria en bytes y n el nmero de lneas de direccin. Las memorias (figura 8.1) tambin suelen tener 8 lneas de entrada/salida de datos, en las que se introducen los bytes que se quieren escribir o grabar. Se efecta su escritura o lectura, segn sea el caso, por medio de la activacin de las lneas de control que tienen asociadas. En lneas generales las memorias ROM, PROM y EPROM suelen tener una o ms seales del tipo CS, Chip Select, o CE, Chip Enable, y OE, Output Enable, para seleccionar y realizar la lectura de la memoria, respectivamente. En el caso de las memorias EPROM, stas suelen tener dos seales de control: /CE, habilitacin o seleccin del circuito integrado, y /OE, habilitacin de la salida. La tabla 8.1 resume los modos de funcionamiento de la memoria EPROM, considerando todos los posibles valores /CE y /OE.
/OE L H X
/CE L L H
L=Low, 0 lgico. H=High, 1 lgico. X= indeterminado, 0 1 lgicos. Triestado= salidas en alta impedancia.
En la tabla 8.1 se observa cmo las salidas presentan un estado triestado en el cual cada lnea se pone en estado de alta impedancia, esta situacin se da en la mayor parte de las memorias semiconductoras, cuando la seal CE es inactiva, ya que la memoria entra un estado de bajo consumo, con un consumo al menos un 25% menor de lo habitual. En cuanto a las memorias del tipo RAM, suelen tener como seales de control /CS o /CE, que habilita el funcionamiento del circuito integrado, y RD/(/WR), Read/Write (lectura/escritura), que determina si se va a leer o escribir en la memoria; aunque, en lugar de esta seal combinada lectura/escritura, puede tener una lnea propia, /OE, para la lectura, y otra, /WE, Write Enable, para la escritura. La tabla 8.2 resume el funcionamiento de esta memoria considerando las lneas /CS y RD/(/WR), y la tabla 8.3 muestra su funcionamiento considerando las lneas /CE, /OE y /WE.
Tabla 8.2 Lneas de control de una memoria RAM
/CS H L L
RD/ WE
X H L
L=Low, 0 lgico. H=High, 1 lgico. X= indeterminado, 0 1 lgicos. Triestado= salidas en alta impedancia
Tabla 8.3 Lneas de control de una memoria RAM con las entradas de lectura/escritura separadas
/CE H L L L L
/OE X L H L H
/WE X H L L H
E/S de datos Tri-estado Salida dato Entrada dato Entrada dato Tri-estado
L=Low, 0 lgico. H=High, 1 lgico. X= indeterminado, 0 1 lgicos. Triestado= salidas en alta impedancia. Standby= estado de espera
8 Memoria externa
225
-Ciclo de lectura: el ciclo de lectura efecta una lectura sobre la memoria externa para leer un operando de una instruccin, que puede ser un dato o una direccin. -Ciclo de escritura: el ciclo de escritura escribe un dato sobre la memoria. La duracin de estos ciclos es diferente dependiendo del tipo de ciclo y es distinto para las familias MCS-51 y MCS-251. La duracin habitual de estos ciclos para la MCS-251 es de dos o tres estados, mientras que para la MCS-51 suele ser al menos de un ciclo mquina. Durante este tiempo se activan las seales involucradas en el acceso a la memoria externa de forma adecuada.
A15A8
P0 Latch ALE
CLK
D7D0 A7A0
Fig. 8.2 Conexin del bus de direcciones y de datos con una memoria externa, para la MCS-51
Adems de la seal ALE, en la MCS-51 existen ms lneas de control: /EA, /PSEN, /RD y /WR. /EA External Access inhibe, a 0 lgico, el acceso a la memoria interna de programas del microcontrolador. /PSEN se activa cuando se accede a la memoria externa de programa. /RD se activa cuando el microcontrolador procede a la lectura de la memoria externa de datos (RAM). Y /WR se activa al escribir en la memoria externa de datos. 8.5.1 Diagramas de tiempos para la MCS-51 Las figuras 8.3, 8.4 y 8.5 muestran los diagramas de tiempos del ciclo de fetch, de lectura y de escritura para la MCS-51. En las tablas 8.4 y 8.5 se indica el valor de los tiempos asociados para una frecuencia de reloj de 16MHz.
Tabla 8.4 Valores mnimos en nanosegundos de los tiempos indicados en los ciclos de fetch, de lectura y de escritura para la MCS-51, con una frecuencia de reloj de 16MHz
tLL
85
tAL
8
tLA
28
tLC
23
tCC
143
tCI
0
tLW tAW
138 120
tWHLH
23
226
Tabla 8.5 Valores mximos de los tiempos en nanosegundos de los tiempos indicados en los ciclos de fetch, de lectura y de escritura para la MCS-51, con una frecuencia de reloj de 16MHz
tAD
398
tLW
238
tWHLH
103
tAFR
0
208
10
148
55
t CY
350
t LC
PSEN
t CC
t AL
P0
t LA
AD0..AD7
t CIV
INSTRUC
t CIF
AD0..AD7 INSTRUC
t AFC t AIV
P2 AD8..AD15
t CI
AD8..AD15
Fig. 8.3 Diagrama de tiempos de un ciclo fetch en memoria externa para la MCS-51
t LD t WHLH
ALE
PSEN
t LW
RD
t RR t DFR t DR
ENTRADA DEL DATO
t AL
t LA t AW
AD0..AD7
t RD t AFR
AD8..AD15
P0
t AD
P2
Fig. 8.4 Diagrama de tiempos de un ciclo de lectura en memoria externa para la MCS-51
t WHLH
ALE
PSEN
t LW
WD
t WW t DWX t WD
t AL
P0
t AW t LA
AD0..AD7
t DW
SALIDA DEL DATO
P2
AD8..AD15
Fig. 8.5 Diagrama de tiempos de un ciclo escritura en memoria externa para la MCS-51
8 Memoria externa
227
En la ejecucin del ciclo de fetch para la MCS-51 se realizan los siguientes pasos: 1. 2. 3. 4. Colocar el byte alto y el byte bajo del bus de direcciones en el puerto P2, lneas A8,, A15, y P0, lneas A0,, A7, respectivamente. Forzar a que la seal ALE tenga un flanco de bajada para que el contenido del puerto P0, lneas A0,, A7, se almacenen en el latch. Una vez que la direccin est presente a la entrada de la memoria, se activa la seal /PSEN para realizar la lectura de la memoria. La memoria coloca el cdigo de operacin en el bus de datos, puerto P0; el microcontrolador lee este dato coincidiendo con el flanco de subida de /PSEN.
228
A000H-AFFFH, C000H-CFFFH y E000H-EFFFH. Fuera de estas zonas la memoria no est seleccionada, tal y como se indica en la figura 8.7.
80C31
P0
Latch
D7D0 Q7Q0 A7A0
74LS373
CLK A12A8
A7A0
A14A8
/OE
/CE
Fig. 8.6 Conexin de una memoria RAM de 8kbytes y una memoria EPROM de 32kbytes al 80C31
c)
Memoria de datos
0000H
RAM (8 k)
1FFFH 2000H Zona Imagen (8k) 2FFFH 4000H Zona Imagen (8k) 4FFFH 6000H Zona Imagen (8k) 6FFFH 8000H Zona Imagen (8k) 8FFFH
a) Memoria de programas
0000H
b)
Memoria de datos
0000H
Sin memoria
Sin memoria
A000H Zona Imagen (8k) AFFFH C000H Zona Imagen (8k) CFFFH E000H Zona Imagen (8k) EFFFH
FFFFH
FFFFH
Fig. 8.7 Mapa de memoria del circuito de la figura 8.6. a) Mapa de la memoria de programas. b) Mapa de la memoria de datos. c) Mapa de la memoria de datos considerando imgenes
8 Memoria externa
229
80C31
P0
Latch
D7D0 Q7Q0 A7A0 A7A0
74LS373
CLK A12A8 A12A8
A7A0
A14A8
/OE
/CE
Fig. 8.8 Conexin de dos memorias RAM de 8kbytes y una memoria EPROM de 32kbytes al 80C31
Segn el mapa de memoria de la figura 8.7, la capacidad de memoria RAM del sistema puede ampliarse en 8kbytes ms conectando un circuito integrado de memoria RAM 6164 adicional, como se muestra en la figura 8.8. La memoria RAM2 se sita en las zonas del mapa de memoria de datos que no es imagen; para ello se conecta la lnea A13 mediante una puerta lgica NOT a la seal /CS de la memoria. Con el circuito de la figura 8.8, la memoria RAM1 se selecciona cuando la lnea A13 est a 0 lgico, mientras que la memoria RAM2 se selecciona cuando la lnea A13 est a 1 lgico. La memoria RAM2 ocupa las zonas sombreadas que hay en el mapa de memoria de la figura 8.7, y se selecciona cuando las direcciones del bus estn dentro de uno de los siguientes rangos de direcciones: 1000H-1FFFH, 3000H-3FFFH, 5000H5FFFH, 7000H-7FFFH, 9000H-9FFFH, B000H-BFFFH, D000H-DFFFH y F000H-FFFFH. Para utilizar ms circuitos integrados de memoria se necesita emplear una lgica de seleccin de la memoria algo ms compleja, que garantice la conexin de ms memorias y de otros dispositivos al microcontrolador; para ello en el siguiente ejemplo se propone el uso de un decodificador en la seleccin de las memorias. Ejemplo 8.2 Seleccin de memorias mediante el 74LS138 La figura 8.9 muestra el circuito de conexin de dos memorias EPROM 27C128 de 16kbytes cada una, y de dos memorias RAM 6164 de 8kbytes cada una. La seleccin de las memorias se efecta con el decodificador de 3 a 8 lneas 74LS138. Las salidas Y0-Y7 del 74LS138 se activan a 0 lgico cuando en las entradas, C, B y A, aparece el cdigo correspondiente de la salida, segn la tabla de verdad del decodificador de la figura 6.18. Las entradas G1, /G2A y /G2B son las lneas de habilitacin del decodificador y deben estar a 1, 0 y 0 lgicos, respectivamente, para que el decodificador funcione correctamente. El decodificador queda inhabilitado si la entrada G1 est a 0 lgico o cualquiera de las entradas /G2A o /G2B est a 1 lgico, es decir, si cualquiera de estas entradas est inhabilitada.
230
80C31
P0
Latch
D7D0 Q7Q0 A7A0 A7A0
A7A0
A7A0
A13A8
/OE
/CE
/OE
/CE
74LS138
Vcc G1 /G2A /G2B C B A Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
Entradas Habilit. Seleccin G1 G2* C B A X H X X X L X X X X H L L L L H L L L H H L L H L H L L H H H L H L L H L H L H H L H H L H L H H H *G2=G2A+G2B
Salidas Y0 H H L H H H H H H H Y1 H H H L H H H H H H Y2 H H H H L H H H H H Y3 H H H H H L H H H H Y4 H H H H H H L H H H Y5 H H H H H H H L H H Y6 H H H H H H H H L H Y7 H H H H H H H H H L
Fig. 8.9 Conexin de dos memorias RAM y de dos memorias EPROM con el 74LS138
Conectando la lnea A15 a la entrada C del 74LS138, la lnea A14 a la entrada B y la lnea A13 a la entrada A, la salida Y0 del decodificador se activa siempre y cuando las lneas A15, A14 y A13 estn a 0 lgico, lo que ocurre en el rango de direcciones comprendido entre 0000H y 1FFFH, es decir, las primeras 8k posiciones del mapa de memoria. De la misma forma, cada una de las restantes entradas se activa con un rango de 8k posiciones del mapa de memoria, segn la tabla 8.6.
Tabla 8.6 Espacio de memoria en el cual se activan las salidas del 74LS138 en la figura 8.9
Salida activa
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
Espacio de memoria
0000H-1FFFH 2000H-3FFFH 4000H-5FFFH 6000H-7FFFH 8000H-9FFFH A000H-BFFFH C000H-DFFFH E000H-FFFFH
Memoria habilitada
RAM1 y EPROM1 RAM2 y EPROM1 EPROM2 EPROM2 -
Las lneas de seleccin de las memorias RAM1 y RAM2, al tener una capacidad de 8kbytes, se conectan directamente a las salidas Y0 y Y1 del decodificador, respectivamente. La memoria EPROM1 tiene una capacidad de 16kbytes, por lo que su lnea de seleccin, /CE, est conectada a las salidas Y0 e Y1 por medio de una puerta AND. Esta memoria se habilita siempre y cuando el microcontrolador efecte una lectura en los primeros 16kbytes del mapa de
8 Memoria externa
231
memoria. De la misma forma, la entrada /CE de la memoria EPROM2 se conecta a las salidas Y2 y Y3; se habilita cuando el microcontrolador realiza una lectura en el espacio comprendido entre 4000H y 7FFFH del mapa de memoria.
Bus de direcciones
A0,,A7 A8,,A15 A16 A17
Ubicacin
P0.0,,P0.7 P2.0,,P2.7 P3.7 P1.7
El bus de datos es de 8 bits y su ubicacin es configurable por el usuario, quien debe elegir entre dos opciones: modo paginado y modo no paginado (tabla 8.8).
Tabla 8.8 Posibilidades de ubicacin del bus de datos
Bus de datos
Modo no paginado Modo paginado
Ubicacin
P0.0,,P0.7 P2.0,,P2.7
Caractersticas
Compatible con el 8XC51 Acceso ptimo a la memoria externa
El modo paginado es ms eficiente en el acceso a la memoria externa, ya que reduce el tiempo invertido por el microcontrolador para leer los cdigos de operacin de las instrucciones, pero no es compatible con los microcontroladores de la familia MCS-51. En cuanto a las conexiones externas, la diferencia entre ambos modos radica en la ubicacin del bus de datos. En el modo no paginado el bus de datos est implementado por el puerto P0, que al mismo tiempo implementa las 8 lneas de menor peso del bus de direcciones, de la A0 a la A7. Debido a esta duplicidad de tareas, el puerto P0 debe conectarse a un registro, o latch, de 8 bits, cuya carga est controlada por la seal ALE, a fin de almacenar la parte baja de la direccin (figura 8.10). En cambio, si el microcontrolador est configurado en modo paginado, es el puerto P2 el que realiza la funcin de bus de datos, al mismo tiempo que implementa las 8 lneas del bus de direcciones que van de la A8 a la A15. En este caso el latch se conecta al puerto P2, a fin de almacenar los bits de direcciones A8,..,A15.
232
8XC251Sx
P2
RAM/ EPROM
8XC251Sx
RAM/ EPROM
P0 ALE
Latch
A7:0
Modo no paginado
Modo paginado
El bus de control est compuesto por todas aquellas seales que permiten controlar qu tipo de operacin, de lectura o escritura se realiza sobre la memoria externa. El microcontrolador 8XC251Sx dispone de dos seales de control de lectura, /RD y /PSEN, y una de escritura, /WR (tabla 8.9). El rango de direcciones asociadas a estas seales de control depende del valor de los bits de configuracin RD1 y RD0.
Tabla 8.9 Seales de acceso a la memoria externa
Nombre Tipo
A17 A16 A15:8 AD7:0 ALE /EA /PSEN O O O I/O O I O
Descripcin
Lnea de direccin A17. Lnea de direccin A16. Parte alta del bus de direcciones. Bus de datos y parte baja del bus de direcciones (nodo no paginado). Address Latch Enable. Controla la carga del registro de 8 bits que est conectado al puerto que realiza las funciones de bus de datos. External Access. Esta entrada inhibe, si esta a cero lgico, el acceso a la memoria OTPROM/ROM interna del microcontrolador. Program Store Enable. Esta seal controla las operaciones de lectura en la memoria externa. El rango de direcciones para las que opera esta seal de control depende de los bits de configuracin RD1 y RD0. Seal de lectura o lnea A16 del bus de direcciones. Dependiendo del valor de los bits de configuracin RD1 y RD0 esta lnea controla la lectura de memoria externa en las direcciones [ 7F:FFFFH, o bien implementa la lnea de mayor peso del bus de direcciones. Seal de escritura. Esta seal controla las operaciones de escritura en la memoria externa.
/RD
P3.7/A16
/WR
P3.6
Existen otras seales de control auxiliar que intervienen en el acceso a la memoria externa, como son la seal ALE (Address Latch Enable) y /EA (External Access). La seal ALE est ubicada en el pin 30 del microcontrolador (encapsulado DIP) y controla la carga del registro que est conectado al bus de datos. El pin /EA se corresponde con el pin 31 del microcontrolador (encapsulado DIP) e inhibe, cuando est a 0 lgico, el acceso a la memoria interna del tipo ROM. En la tabla 8.9 se resume la totalidad de seales que intervienen, por parte del microcontrolador, en el acceso a la memoria externa.
8 Memoria externa
233
8XC251S x
RAM 256Kbytes
D7:0
Latch
A7:0
Fig. 8.11 Conexin de una memoria RAM de 256Kbytes al microcontrolador 8XC251Sx en modo paginado
La seal ALE controla la carga del registro y se activa cuando en el puerto P0 est disponible la parte baja de la direccin (A0, , A7). Esta parte baja quedar almacenada en el registro, cuyas salidas estn conectadas a las 8 lneas de direcciones de menor peso de la memoria RAM. El puerto P2 est conectado a las lneas de direcciones A8, ..., A15 de la memoria RAM. Las
234
dos ltimas lneas de direcciones del microcontrolador, A16 y A17, estn conectadas a las dos entradas de direcciones de mayor peso de la memoria RAM. Para controlar las operaciones de lectura y escritura se han conectado las salidas /WR y /PSEN del microcontrolador a las entradas de control de la memoria RAM, /WE (Write Enable) y /OE (Output Enable), respectivamente. Por otra parte, la entrada /CE de la memoria RAM est conectada a masa, de forma que el integrado de memoria RAM est permanentemente habilitado. Tambin se puede observar en la figura 8.11 que el pin /EA del microcontrolador est conectado a masa, lo que significa que la memoria ROM interna est inhibida y no es accesible. El microcontrolador puede realizar tres tipos de operaciones, denominadas ciclos, sobre la memoria externa: 1. Ciclo de lectura: el microcontrolador ejecuta un ciclo de lectura sobre la memoria externa para leer un operando, que puede ser un dato o una direccin, almacenado en una posicin de la memoria externa. 2. Ciclo de escritura: el microcontrolador ejecuta un ciclo de escritura sobre la memoria externa para escribir el contenido de una posicin de memoria. 3. Ciclo de fetch o de lectura de cdigo de operacin: el ciclo de fetch es una operacin de lectura de la memoria externa, donde la informacin leda es el cdigo de operacin de la siguiente instruccin que debe ejecutar el microcontrolador. Estas operaciones tienen una duracin de dos o tres estados, durante los cuales se activan las seales involucradas en el acceso a la memoria externa, en el momento y orden adecuado, como se puede observar en los cronogramas correspondientes. En la figura 8.12 est representado el cronograma del ciclo de fetch para el modo no paginado, que tiene una duracin de dos estados, o sea, cuatro perodos de reloj. En la ejecucin del ciclo de fetch se realizan los siguientes pasos: 1. Al comienzo del ciclo de fetch se coloca la parte alta de la direccin, donde est almacenado el cdigo de operacin que va a leer el microcontrolador, en el puerto P2 (A8, , A15). Si se utiliza un bus de direcciones de 17 18 lneas tambin aparece en ese momento su valor correspondiente en sus respectivas ubicaciones (P3.7 y P1.7). 2. A continuacin el microcontrolador coloca la parte baja de la direccin (A0, , A7) en el puerto P0. 3. El microcontrolador hace pasar la seal ALE por un flanco de bajada de forma que se carga en el registro el contenido del puerto P0, o sea, las lneas A0, , A7 del bus de direcciones. 4. Una vez que la direccin est disponible en las entradas de direcciones de la memoria, el microcontrolador activa la seal de lectura, indicando con ello a la memoria que ya puede colocar un dato vlido en el bus de datos. 5. Si todo va bien la memoria RAM responde a la activacin de la seal de lectura colocando el cdigo de operacin en el bus de datos. El microcontrolador lee este cdigo coincidiendo con el flanco de subida de /PSEN.
8 Memoria externa
235
Estado 1 XTAL Estado 2
ALE
/RD, /PSEN
4 2 5
A7:0 D7:0
P0
1
A17, A16, P2 A17,A16,A15:8
En la figura 8.13 est representado el cronograma del ciclo de lectura en modo no paginado. Este ciclo tiene una duracin de 6 perodos de reloj. La secuencia de un ciclo de lectura es similar a la del ciclo de fetch, con la nica diferencia que tiene una duracin mayor.
Estado 1 XTAL Estado 2 Estado 3
ALE
/RD, /PSEN
P0
A7:0
D7:0
A17, A16, P2
En la figura 8.14 est representado el cronograma correspondiente al ciclo de escritura en modo no paginado, cuya duracin tambin es de 6 perodos de reloj. La secuencia de activacin de las seales de control tambin es similar a la del ciclo de lectura, con la nica diferencia que, en este caso, el microcontrolador activa la seal de escritura /WR en lugar de la seal de lectura. Si se opta por trabajar en modo paginado, se deber conectar el registro, o latch, de 8 bits a la salida del puerto P2 (figura 8.15). Trabajar en modo paginado tiene como principal ventaja un ahorro de tiempo en el acceso a la memoria externa. Esto es debido a que el ciclo de fetch, en determinadas circunstancias, se ejecuta en tan slo un estado en lugar de dos. En efecto, cuando el microcontrolador debe leer el siguiente cdigo de operacin en una direccin donde los bits A8, , A15 del bus de direcciones han cambiado con respecto al valor que tenan para la instruccin anterior, la lectura dura dos estados. Ahora bien, la lectura de los siguientes cdigos de operacin dura un solo estado, siempre y cuando los bits A8, , A15 del bus de direcciones no cambien.
236
Estado 1 XTAL Estado 2
ALE
P0
A17, A16, P2
8XC251Sx
RAM 256Kbytes
D7:0
Latch
A15:8
Fig. 8.15 Conexin de una memoria RAM de 256Kbytes al microcontrolador 8XC251Sx en modo paginado
En la figura 8.16 se presenta el cronograma para estas dos situaciones. El primer ciclo de fetch tiene una duracin de 2 estados, porque hay un cambio de los bits A8, , A15, con respecto a la direccin anterior. En el segundo ciclo de fetch se mantiene el valor de los bits A8, , A15 y, por tanto, la duracin es de solo 1 estado.
Ciclo 1, cambio de pgina Estado 1 XTAL Estado 2 Ciclo 2 misma pgina Estado 1
ALE
/PSEN
A17, A16, P0
P2
A15:8
D7:0
D7:0
8 Memoria externa
237
Finalmente, en las figuras 8.17a) y 8.17b) se presenta el cronograma de los ciclos de lectura y escritura en modo paginado. La nica diferencia con respecto a los cronogramas del modo no paginado (figuras 8.13 y 8.14) es que el bus de datos est ubicado en el puerto P2.
Estado 1 XTAL Estado 2 Estado 3
Estado 1 XTAL
Estado 2
Estado 3
ALE
ALE
/WR
A17, A16, P0
D7:0
P2
P2
A15:8
D7:0
a)
b)
Hay diseos en los que la memoria externa utilizada tiene un retardo importante y no puede responder al microcontrolador con la rapidez necesaria. En estos casos, para que no se produzcan lecturas o escrituras errneas se deben introducir ciclos de espera. Los ciclos de espera resuelven este problema, ya que alargan el ciclo de fetch, el ciclo de lectura y el de escritura, el tiempo suficiente para que la memoria externa responda adecuadamente. Configurando convenientemente el microcontrolador es posible introducir 0, 1, 2 3 ciclos de espera para las seales /RD, /WR y /PSEN. En la figura 8.18 est representado el cronograma del ciclo de fetch con un estado de espera adicional que proporciona a la memoria externa un tiempo suplementario, equivalente a dos periodos de reloj, para que coloque el cdigo de operacin en el bus de datos. En la figura 8.19 est representado el ciclo de lectura con un estado de espera adicional. Tambin es posible introducir un estado de espera en la seal ALE para poder cargar adecuadamente el registro cuando ste es excesivamente lento. En la figura 8.20 se muestra un ciclo de fetch donde se ha introducido un estado de espera en la seal ALE.
Estado 1 XTAL Estado 2 Estado 3
ALE
P0
A17, A16, P2
Fig. 8.18 Ciclo de fetch en modo no paginado con un estado de espera adicional
238
Estado 1 XTAL Estado 2 Estado 3
ALE
P0
A17, A16, P2
ALE
/RD, /PSEN
P0
A7:0
D7:0
A17, A16, P2
Fig. 8.20 Ciclo de fetch en modo no paginado con un estado de espera en la seal ALE
Ejemplo 8.4 Conexin de una memoria EPROM y otra RAM de 128Kbytes cada una En la figura 8.21 se presenta un ejemplo de conexin de la memoria externa al microcontrolador para una configuracin de 18 lneas de bus de direcciones y modo no paginado. En este caso se ha conectado al microcontrolador una memoria RAM de 128Kbytes de capacidad y una memoria EPROM de la misma capacidad.
8XC251S x
Latch
OE
CE
8 Memoria externa
239
En la figura 8.22 se muestra cmo queda distribuido el espacio de direcciones del microcontrolador entre los integrados de memoria considerados en este ejemplo. En esta figura se puede observar que la memoria RAM est vinculada a las direcciones de las regiones 00:, 01:, FC: y FD:, mientras que la memoria EPROM est vinculada a las direcciones de las regiones FE:, FF:, 02: y 03:. A cada posicin fsica de la memoria RAM se puede acceder a travs de dos direcciones distintas, una perteneciente a las regiones 00: 01:, y la otra perteneciente a las regiones FC: o FD: que se denominan zonas imagen. Igualmente se puede acceder a cualquier posicin de la memoria EPROM utilizando dos direcciones distintas: una perteneciente a las regiones FE: o FF:, y la otra perteneciente a las regiones 02: o 03: (zonas imagen). En la figura 8.23 se puede observar las direcciones de memoria externa asociadas a cada uno de los circuitos integrados de la figura 8.21, junto con las regiones del mapa de memoria del microcontrolador al que estn vinculadas esas direcciones.
Espacio de memoria (512Kbytes) FFFFH FF: 0000H FE: FD: FC: Memoria EPROM externa 128Kbytes
A17 A16
1 1 0
1 0 1 0
EPROM
RAM
8.8.2 17 bits de bus de direcciones (RD1, RD0 = 01) Con esta configuracin se dispone de 17 lneas de bus de direcciones externo: las 16 primeras lneas, A0-A15, implementadas mediante los puertos P0 y P2, y la lnea A16 implementada en el pin P3.7. Esta configuracin permite direccionar hasta 128Kbytes de memoria externa. La lnea A16 del bus de direcciones externo selecciona entre las dos regiones de 64Kbytes de memoria externa. En este caso las direcciones de las regiones 00:, 02:, FC: y FE: (todas ellas con el bit A16 =0) permiten acceder a la primera regin de 64Kbytes de memoria externa. Por otra parte, las direcciones de las regiones 01:, 02:, FD: y FF: (todas ellas con el bit A16=1) posibilitan el acceso a la otra regin de 64Kbytes de memoria externa (figura 8.24).
240
A16
Memoria externa 128Kbytes 64Kbytes 01:, 03:, FD:, FF: 64Kbytes 00:, 02:, FC:, FE:
1 0
Fig. 8.24 Regiones asociadas a las direcciones de memoria externa para RD1, RD0 = 01
Ejemplo 8.5 Conexin de una memoria RAM de 128Kbytes En la figura 8.25 est representada la conexin de una memoria RAM de 128Kbytes de capacidad al microcontrolador 8XC251Sx, configurado con 17 lneas de bus de direcciones en modo no paginado.
8XC251Sx
RAM 128Kbytes D7:0
Latch
A7:0
A15:8 A16 OE CE WE
8.8.3 16 bits de bus de direcciones (RD1, RD0 = 10) Esta configuracin permite tener un total de 16 lneas de bus de direcciones, de la A0 a la A15, implementadas con los puertos P0 y P2, lo que posibilita direccionar hasta 64Kbytes de memoria externa. Para esta configuracin todas las regiones de memoria interna (00:, 01:, 02:, 03:, FC:, FD:, FE: y FF:) estn ubicadas en la misma regin de memoria externa de 64Kbytes (figura 8.26).
Memoria externa 64Kbytes 64Kbytes 00:, 01:, 02:, 03:, FC:, FD:, FE:, FF:
Fig. 8.26 Regiones asociadas a las direcciones de memoria externa para RD1, RD0 = 10
8.8.4 16 bits de bus de direcciones (RD1, RD0 = 11) Esta configuracin es la nica compatible con los microcontroladores de la familia MCS-51. Por este motivo, dispone de 16 lneas de bus de direcciones y de tres seales de control de acceso a la memoria externa: ] /PSEN: seal de control de lectura de la memoria externa para las regiones FC:, FD:, FE: y FF:. ] /RD: seal de control de lectura de la memoria externa para las regiones 00:, 01:, 02: y 03:. ] /WR: seal de control de escritura de la memoria externa para las regiones 00:, 01:, 02: y 03:.
8 Memoria externa
241
Para que la compatibilidad con la familia MCS-51 sea completa, se debe configurar al microcontrolador 8XC251Sx para que trabaje en modo no paginado. Ejemplo 8.6 Conexin de una memoria RAM de 64Kbytes en modo paginado En la figura 8.27 est representado un ejemplo de conexin de una memoria RAM de 64Kbytes al microcontrolador 8XC251Sx configurado en modo paginado. En esta aplicacin el cdigo del programa se almacena en la memoria interna ROM/OTPROM/EPROM. 8XC251S x
RAM 64 Kbytes D7:0 P2 ALE EA P0 WR A7:0 CE A15:8
Latch
PSEN
OE
WE
Fig. 8.27 Ejemplo de conexin para modo paginado (RD1, RD0 = 10)
Ejemplo 8.7 Conexin de una memoria RAM de 64Kbytes en modo no paginado En la figura 8.28 se muestra el esquema de un ejemplo de conexin, para esta configuracin, de un microcontrolador 8XC251Sx con una memoria RAM de 64Kbytes. En este caso, se ha conectado la entrada de escritura de la memoria RAM, /WE, a la salida de escritura del microcontrolador, /WR. Por otra parte, se ha conectado la entrada de habilitacin de lectura, /OE, a la salida de una puerta lgica que realiza la operacin AND entre las dos seales de control de lectura del microcontrolador, /PSEN y /RD. De esta forma, siempre que se ejecute una lectura en la memoria externa, para cualquier regin del mapa de memoria disponible (00:, 01:, 02:, 03:, FC:, FD:, FE: y FF:), se activar la entrada de lectura de la memoria RAM. 8XC251S x
RAM 64 Kbytes D7:0
P0 ALE EA P2 RD
Latch
A7:0
A15:8 CE OE
WR
PSEN
WE
242
A pesar de que slo se dispone de 16 lneas de bus de direcciones en esta configuracin, es posible direccionar hasta un total de 128Kbytes de memoria externa utilizando de forma separada las seales de control /PSEN, /WR y /RD (ejemplo 8.8). Ejemplo 8.8 Conexin de dos memorias de 64Kbytes con RD1, RD0 = 11 En la figura 8.29 se muestra la conexin de dos integrados de memoria, de 64Kbytes cada uno, al microcontrolador 8XC251Sx, configurado con RD1, RD0 = 11. La memoria RAM se controla exclusivamente con las seales /WR y /RD, de forma que se habilitar su funcionamiento para aquellas direcciones correspondientes a las regiones 00:, 01:, 02: y 03:. Por otra parte, el integrado de memoria EPROM se controla con la seal /PSEN; esto significa que slo se habilita cuando se efectan lecturas en direcciones correspondientes a las regiones FC:, FD:, FE: y FF:.
8XC251Sx
P0 ALE P2 EA WR PSEN RD
Latch
A7:0 A15:8
WE OE CE OE CE
Ejemplo 8.9 Diseo de la decodificacin de memoria de un sistema microprocesador Se pretende disear un sistema basado en el microcontrolador 8XC251 que se ajuste al mapa de memoria de la figura 8.30, estando el microcontrolador configurado para ser compatible con la familia MCS-51: modo no paginado y 16 lneas de bus de direcciones (RD1, RD0 = 11).
Mapa de memoria controlado por /PSEN VAC O FFFFH C000H BFFFH A000H 9FFFH VACO EPROM EPROM 2000H 1FFFH 0000H VACO Mapa de memoria controlado por /WR y /RD FFFFH RAM C000H BFFFH VACO 6000H 5FFFH 4000H 3FFFH 0000H
RAM
8 Memoria externa
243
Para realizarlo se dispone de un circuito integrado de memoria EPROM de 32Kbytes y de un circuito integrado de memoria RAM de 32Kbytes (figura 8.31).
EPROM
OE DO D7 A0 CE A14 15 CE 8 OE WE
RAM
DO D7 A0 A14
15
En la decodificacin del mapa de memoria se ha utilizado el decodificador 74138 cuyo esquema elctrico y tabla de verdad aparecen en la figura 8.32.
74LS138 G1 G2A G2B C B A Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
Entradas Habilit. Seleccin G1 G2* C B A X H X X X L X X X X H L L L L H L L L H H L L H L H L L H H H L H L L H L H L H H L H H L H L H H H * G2=G2A+G2B Salidas Y0 H H L H H H H H H H Y1 H H H L H H H H H H Y2 H H H H L H H H H H Y3 H H H H H L H H H H Y4 H H H H H H L H H H Y5 H H H H H H H L H H Y6 H H H H H H H H L H Y7 H H H H H H H H H L
En la figura 8.33 est representado el esquema elctrico correspondiente a la decodificacin de la memoria externa.
8XC251
ALE P0 P2 RD PSEN LATCH 8 BITS
EPROM
A0,...,A12 OE CE D0,...,D7
WR
RAM
0V 0V 5V
PSEN
RD
D0,...,D7 A0,...,A14 OE CE WE
PSEN
RD WR
244
Ejemplo 8.10 Decodificacin de memoria de un sistema microprocesador con RD1, RD0=10 Se desea disear un sistema basado en el microcontrolador 8XC251Sx que se ajuste al mapa de memoria de la figura 8.34. El microcontrolador est configurado para trabajar en modo no paginado con 16 lneas de bus de direcciones (RD1, RD0 = 10). Para realizarlo se disponen de integrados de memoria PROM de 4Kbytes e integrados de memoria RAM de 4K x 4 bits cuyos esquemas elctricos aparecen en la figura 8.35.
VAC O FFFFH B000H AFFFH 9000H 8FFFH VACO 1000H 0FFFH 0000H
RAM
PROM
Para implementar los 4Kbytes de memoria PROM, de la direccin 0000H a la 0FFFH, slo es necesario un circuito integrado. En la tabla 8.10 se indican los valores de las lneas del bus de direcciones que habilitan el integrado de memoria PROM.
Tabla 8.10 Direcciones asociadas a la memoria PROM
Se accede a la memoria PROM cuando las cuatro lneas de mayor peso del bus de direcciones valen 0 lgico, A15=A14=A13=A12=0; por tanto, la funcin que habilita o selecciona el funcionamiento de la memoria PROM es:
CSPROM = A 15 A 14 A 13 A 12
Esta funcin se implementa mediante una puerta NOR de cuatro entradas (figura 8.36).
PSEN
8 Memoria externa
245
La salida de esta puerta NOR estar conectada a una de las entradas de habilitacin de la memoria, CS2, mientras que la otra entrada de habilitacin, CS1, est conectada a la seal de lectura de memoria externa, /PSEN. Por otra parte, para implementar la zona de memoria RAM de 8Kbytes se divide sta en dos zonas de 4Kbytes cada una (figura 8.37), ya que los integrados de memoria RAM disponibles son de 4Kbytes.
Para cubrir cada zona de memoria RAM (RAM 1 y RAM 2) necesitamos utilizar dos integrados de memoria RAM de 4K x 4 bit: uno se encargar de almacenar los 4 bits de menor peso del dato y el otro almacenar los 4 bits de mayor peso. En la tabla 8.11 se indican los valores de las lneas del bus de direcciones que permiten el acceso a la zona RAM 1.
Tabla 8.11 Direcciones asociadas a la memoria RAM 1
Vemos, pues, que para acceder a la zona de memoria RAM 1, las cuatro lneas de mayor peso del bus de direcciones deben adquirir los siguientes valores: A15=1, A14=0, A13=0 y A12=1. Por tanto, la funcin que selecciona la zona de memoria RAM 1 es:
246
Para acceder a la zona de memoria RAM 2, las cuatro lneas de mayor peso del bus de direcciones deben adquirir los siguientes valores: A15=1, A14=0, A13=1 y A12=0. La funcin que selecciona la zona de memoria RAM 2 es:
WR PSEN
WR PSEN
WR PSEN
WR PSEN
En la figura 8.39 aparece el esquema elctrico del decodificador 74138 conectado adecuadamente para generar las seales de habilitacin de las memorias PROM y RAM.
74138
0V A14 5V G2A G2B G1
A B C
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
CSPROM
CSRAM1 CSRAM2
247
248
Al principio de establecer las bases de la comunicacin serie, se utilizaban dos bits de stop por cuestiones tecnolgicas del momento. No obstante, en la actualidad es suficiente con emplear un solo bit de stop. El bit de stop (figura 9.1) se indica manteniendo un nivel lgico alto durante un intervalo t, tras el cual, puede procederse a transmitir el siguiente dato. As, la inclusin del bit de start y el de stop, en la comunicacin serie asncrona, resulta imprescindible para separar y distinguir los datos transmitidos.
t
Inactivo Bit start Bit stop (LSB) 0 1 1 0 2 0 3 1 4 1 5 0 6 0 (MSB) 7 0 Inactivo
Estado
Fig. 9.1
Generalmente, el dato en una comunicacin serie es de 8 bits, a los que se puede aadir un noveno bit de paridad, con el fin de detectar errores en la transmisin. El sentido de la transmisin es simplex cuando se realiza en una nica direccin, del emisor al receptor, es haf-duplex cuando se puede realizar en ambas direcciones, emisor-receptor y receptoremisor (pero no en ambas direcciones simultneamente), y full-duplex cuando se pueden enviar datos en ambas direcciones de forma simultnea. En la transmisin asncrona se puede dar el caso de que un sistema sea lento a la hora de procesar los datos que recibe, por lo que ste debe ser capaz de indicarle al transmisor su incapacidad de procesar ms datos y que, por tanto, se espere hasta una nueva transmisin. Este problema se suele solventar mediante el protocolo XON/XOFF, en el cual se dispone de dos caracteres ASCII de control, DC1 (XON) y DC3 (XOFF), para detener y para reanudar la comunicacin, respectivamente. Cuando el receptor no puede procesar ms datos enva un carcter XOFF al emisor, tras el cual el emisor deja de transmitir hasta que recibe un carcter XON.
249
en el modo 2 pueden programarse dos velocidades de transmisin, y en los modos 1 y 3 se pueden programar distintas velocidades de transmisin. Los terminales asociados al puerto serie son TXD, terminal P3.1, y RXD, terminal P3.0. En el modo 0, el terminal TXD soporta la seal de reloj de la transmisin sncrona. Los registros asociados al puerto de comunicacin serie son SBUF, SCON en toda la familia MCS-51, y los registros SADDR y SADEN para las versiones 8XC52/54/58, 8XC51FX y 87C51GB. El registro SBUF, Serial Buffer, es el buffer del puerto serie, que almacena el dato recibido o enviado por el puerto. El registro SCON, Serial Control (tabla 9.1), es el registro de control que permite programar las caractersticas de funcionamiento del puerto. El registro SADDR se utiliza para definir la direccin del microcontrolador que hace la funcin de esclavo, cuando ste se encuentra en un entorno de comunicacin multiprocesador. Finalmente, el registro SADEN especifica el byte de mscara para el microcontrolador esclavo, en la comunicacin multiprocesador.
Tabla 9.1 Registro SCON para la MCS-51
(MSB)
SM0 * FE/SM0
Registro SCON
SM1 SM2 REN TB8 RB8 TI
(LSB)
RI
Bit
Comentario
FE/SM0 Frame Error o bit 0 de seleccin de modo del puerto serie. Esta opcin slo es valida para las versiones 8XC51Fx de la MCS-51. Este bit acta como FE o SM0 segn sea el estado del registro SMOD0 (bit 6 del registro PCON), si SMOD0=1 acta como FE y si SMOD=0 acta como SM0. El bit FE se activa a 1 lgico cuando se detecta un bit de stop invlido en la recepcin de un dato. Una vez activo, este bit no se borra por otros datos recibidos y se debe borrar por software. SM0 es el bit de seleccin del puerto serie; su modo de funcionamiento se selecciona junto con SM1. SM0 Bit 0 de seleccin de modo del puerto serie. Aparece con este formato en la MCS-51, excepto para las versiones 8XC51Fx.. SM0 junto con SM1, determina el modo de funcionamiento del puerto serie. SM1 Bit 1 de seleccin de modo del puerto serie. SM1 SM0 Modo 0 0 0 0 1 1 1 0 2 1 1 3 SM2 Bit 2 de modo del puerto serie. Permite habilitar, o no, la comunicacin serie, en entornos multiprocesador. REN Bit de habilitacin de la recepcin. REN=1 habilita la recepcin de un dato y REN=0 la inhabilita. TB8 Bit noveno de transmisin. Es el dcimo bit en la transmisin de un dato para los modos 2 y 3. RB8 Bit noveno de recepcin. Obtiene el valor del dcimo bit del dato transmitido en los modos 2 y 3. TI Bit de interrupcin en transmisin. Se pone a 1 cuando finaliza la transmisin del dato. Debe borrarse por software. RI Bit de interrupcin en recepcin. Se pone a 1 cuando se recibe un dato. Debe borrarse por software.
* Para la MCS-51, excepto para la versin 8XC51Fx. Slo para la versin 8XC51Fx.
En el puerto de comunicacin serie el registro SBUF est duplicado, de manera que uno de los registros est conectado al terminal TXD y el otro registro est conectado al terminal RXD. Esta duplicidad del registro SBUF permite poder transmitir y recibir datos simultneamente (comunicacin full-duplex). Sin embargo, con el registro SBUF se trabaja de una manera sencilla, pues se trata a ste como a un nico registro: se transmite un dato al cargarlo en SBUF, y se lee un dato de SBUF cuando ste se ha recibido.
250
9.3.1 Modo 0. Modo sncrono Este modo se determina mediante la puesta a cero lgico de los bits SM0 y SM1 del registro SCON. La velocidad de transmisin de datos es de FOSC/12, donde FOSC es la frecuencia de reloj del microcontrolador. El terminal TXD genera la seal de reloj que sincroniza la comunicacin, y la transmisin y recepcin de datos se lleva a cabo a travs del terminal RXD.
9.3.2 Modos 1, 2 y 3. Modos asncronos En los modos 1, 2 y 3 se pueden enviar datos a travs de la lnea TXD y recibirlos a travs de la lnea RXD de forma simultnea (full-duplex). En la figura 9.2 se muestra la trama del dato en la transmisin de estos modos.
Noveno bit (Slo modos 2 y 3)
Bit 1
D0
Bit de start
D1
D2
D3
D4
D5
D6
D7
TB8
Bit de stop
Dato de 8 bits
a) Modo 1 En el modo 1, la trama de datos est formada por 10 bits. El primer bit de la trama es el bit de start, a 0 lgico, le siguen los 8 bits del dato, y finaliza con un dcimo bit que consiste en el bit de stop, a 1 lgico. La base de tiempos se puede generar, en este modo, por medio del Timer 1, del Timer 2 (en aquellas versiones que disponen de tres Timers) o de ambos Timers. La velocidad de transmisin del puerto serie, en baudios, depende del tiempo de desbordamiento de los Timers. Por defecto, la velocidad de transmisin la establece el Timer 1, y viene dada en baudios por la frmula siguiente:
Frec. transmisin [ 2 X
(9.1)
251
donde X puede valer 0 1 lgico. Para la MCS-51, excepto las versiones 8XC51Fx, el bit X se corresponde con el bit SMOD del registro PCON. Para las versiones 8XC51Fx el bit X se corresponde con el bit SMOD1 del registro PCON. En realidad el bit SMOD y SMOD1 son el mismo bit con distintos nombres, y corresponden al bit 7 del registro PCON. En la comunicacin serie se debe evitar que el Timer provoque una interrupcin cada vez que llega a desbordamiento; para ello debe de inhibirse la interrupcin del Timer mediante el bit ET del registro IE. El Timer 1 se suele configurar en el modo 2, como temporizador de 8 bits con autorrecarga (modo 2), aunque puede tambin configurarse en los modos 0, 2 y 3. Para este caso, la velocidad de transmisin depender del valor cargado el registro TH1 del Timer 1: Frec. transmisin [ 2 X FOSC 32 12 ]256 TH1 (9.2)
donde FOSC es la frecuencia de reloj del microcontrolador. El bit X, al igual que para la ecuacin (9.1), es el sptimo bit del registro PCON. La tabla 9.2 muestra distintas frecuencias de transmisin que se pueden obtener con el Timer 1 en el modo 2 de funcionamiento.
Tabla 9.2 Timer 1 como generador de baudios para el modo 2 de funcionamiento
Frecuencia
(Baudios)
62.5 Kbaud (Max) 19.2 Kbaud 9.6 Kbaud 4.8 Kbaud 2.4 Kbaud 1.2 Kbaud 137.5 Baud 110.0 Baud b) Modo 2
Frecuencia Oscilador 12.0 MHz 11.059 MHz 11.059 MHz 11.059 MHz 11.059 MHz 11.059 MHz 11.059 MHz 6.0 MHz
SMOD 1 1 0 0 0 0 0 0 C/T 0 0 0 0 0 0 0 0
Timer 1 Valor recarga TH1 FFH FDH FDH FAH F4H E8H 1DH 72H
En el modo 2, la trama de bits del puerto serie est compuesta de 11 bits. El primer bit es el bit de start, le siguen los 8 bits del dato ms un noveno bit definible por el usuario, y termina con un bit de stop. El noveno bit del dato transmitido se corresponde con el estado del bit TB8 del registro SCON. En la recepcin, este noveno bit se ubica en el bit RB8 del registro SCON. Para transmitir en este modo se debe poner el noveno bit a transmitir en el bit TR8, antes de realizar la escritura del dato en el registro SBUF. La recepcin se debe habilitar antes que se produzca, poniendo para ello el bit REN a 1 lgico y el bit RI a 0 lgico. En el modo 2 slo se permiten dos velocidades de comunicacin para el puerto serie, dependiendo del valor del bit X: Frec. transmisin [ 2 X FOSC 64 (9.3)
El bit X tiene la misma correspondencia que la definida para el resto de modos de funcionamiento.
252
c) Modo 3 El modo 3 del puerto serie es similar al modo 2, con la nica diferencia que la velocidad de la comunicacin del puerto serie se obtiene de la misma manera que en el modo 1.
9.3.3 El Timer 2 como base para el puerto serie El Timer 2 tiene un modo de funcionamiento especfico utilizado para fijar la velocidad de comunicacin de datos por el puerto serie, Baud Rate Generator Mode (figura 9.3). Para seleccionar este modo se deben programar adecuadamente los bits RCLCK y TCLCK del registro T2CON, como se muestra en la tabla 9.3.
Rebasamiento del Timer 1 2 0 1
X XTAL1
0 1
TH2 TR2 C/T2 TL2
1 16 0
RCLCK
RX Clock
T2
1 16 0
RCAP2H RCAP2L TCLCK Peticin de interrupcin
TX Clock
T2EX EXEN2
EXF2
X=SMOD para la MCS-51, excepto para la versin 8XC51Fx. X=SMOD1 para la versin 8XC51Fx.
Fig. 9.3 Diagrama de bloques del Timer 2 funcionando en el modo generador de Baud Rate Tabla 9.3 Seleccin del Timer 2 como generador de baudios
RCLCK 0 0 1 1
TCLCK 0 1 0 1
Cuando el Timer 2 se selecciona como generador de baudios funciona de forma similar al modo autorrecarga. Los registros TH2 y TL2 se recargan con el valor de los registros RCAP2H y RCAP2L, en cada desbordamiento. La velocidad de comunicacin depende del valor puesto en estos registros: Frec. transmisin [ 32 ]65536 FOSC (RCAP 2H ,RCAP2L ) (9.4)
En la figura 9.3 se muestra el diagrama de bloques del Timer 2 configurado en modo generador de
253
baudios. En la tabla 9.4 se indican las distintas velocidades de comunicacin y el valor a cargar en los registros RCAP2H y RCAP2L para conseguir distintas velocidades de transmisin.
Tabla 9.4 Timer 2 como generador de baudios para los modos 1 y 3 del puerto serie
Baudios 375.0 Kbaud 9.6 Kbaud 4.8 Kbaud 2.4 Kbaud 1.2 Kbaud 300.0 baud 110.0 baud 300.0 baud 110.0 baud
Frecuencia oscilador 12.0 MHz 12.0 MHz 12.0 MHz 12.0 MHz 12.0 MHz 12.0 MHz 12.0 MHz 6.0 MHz 6.0 MHz
RCAP2H RCAP2L FFH FFH FFH D9H FFH B2H FFH 64H FEH C8H FBH 1EH F2H AFH FDH 8FH F9H 57H
254
El nmero mnimo de seales con el que se puede realizar la comunicacin bidireccional entre dos equipos es: TXD para la transmisin, RXD para la recepcin y una lnea de masa (figura 9.4).
Equipo A MC1488 TXD MC1489 RXD Equipo B
TXD
En este ejemplo se desea conectar una impresora de 40 columnas a un 87C51 mediante el bus RS-232 (figura 9.5). El microcontrolador se utiliza en una aplicacin de etiquetaje, donde se imprime un nmero asignado al producto y un texto determinado segn el tipo de producto. Las etiquetas son autoadhesivas y se pegan al producto mediante un aplicador automtico. 87C51
/INT0
Entrada de producto
MC1488 RS-232
Impresora
RXD TXD
Tipo de producto
El control de la impresora se realiza mediante caracteres ASCII reservados para ello. El microcontrolador iniciar la comunicacin con la impresora envindole el carcter ASCII STX Start of text, que se corresponde con el nmero hexadecimal 02H. Tras este carcter se le puede enviar un carcter de comando como LF, Line feed, (0AH); CAN, Cancel, (18H); ESC, Escape, (1BH); carcter de impresin en negrita, cursiva, etc. Tras este comando, se le enva el texto que se quiere imprimir en ASCII, y por ltimo el comando de impresin CR, Carriage return, (0DH), por lo que se imprimir el texto transmitido. En este ejemplo se trata tan slo de imprimir el texto PRODUCTO N: seguido de cuatro cifras que identifican el tipo de producto. La aplicacin tiene un interruptor de final de carrera como sensor de la llegada del producto conectado a la entrada de interrupcin /INT0. El
255
interruptor proporciona un 0 lgico cuando hay un producto a etiquetar y un 1 lgico cuando no hay producto. La empresa tiene 64 tipos de productos diferentes, codificados con cuatro cifras cada uno. Los cdigos de estos productos se han almacenado en la memoria de programas. El microcontrolador recibe en el puerto P2 seis lneas de entrada que identifican el tipo de producto, al mismo tiempo que se activa el interruptor final de carrera conectado a /INT0. El programa de este ejemplo se muestra a continuacin
;************************************************************************** ; Programa para la comunicacin y control de una impresora de 40 columnas ;************************************************************************** ORG 0H ; Vectorizacin LJMP Inicio ORG 03H LJMP RSI_INT0 ORG 023H ;Vectorizacin del puerto de comunicacin serie LJMP RSI_RS ;************************************************************************** ; Rutina de Inicio ;************************************************************************** Inicio: MOV SP, #30H ;Sita SP en la 30H SETB IT0 ;Interrupcin INT0 por flanco descendente SETB EX0 ;Habilita interrupcin INT0 SETB ES ;Habilita interrupcin del puerto de comunicacin serie SETB SM1 ;Configura la comunicacin serie en el modo 1 SETB REN ;Habilita la recepcin de un dato por el puerto serie MOV TMOD, #20H ;Timer 1 en Modo 2, GATE=0 y C/T=0 MOV TL1, #0FDH ;Valor de TL1, para velocidad de 9600 baudios MOV TH1, #0FDH ;Valor de recarga de Timer 1, para velocidad de 9600 baudios SETB EA ;Habilita bit de interrupcin general SETB TR1 ;Pone marcha el Timer 1 (Genera la base de tiempos de la RS-232). MOV R6, #01H ;R6 se utiliza para indicar que se puede transmitir LJMP Principal ;Ir hacia rutina principal ;************************************************************************** ; Rutina de servicio de INT0 ;************************************************************************** RSI_INT0: MOV R7, #01 ;R7=1 para indicar inicio de transmisin RETI ;************************************************************************** ; Rutina de servicio del puerto serie ;************************************************************************** RSI_RS: JNB TI, Recibe ;Si no interrumpe TI, entonces es RI CLR TI ;Borra bit TI RETI Recibe: CLR RI ;Borra bit RI RETI ;*************************************************************************** ; Rutina Principal (R7 se emplea como indicador de final de conversin. R7=1 Conversin finalizada) ;*************************************************************************** Principal: CJNE R7, #01, Principal ;Bucle de espera a que R7 sea igual a 01H MOV R7, #0 ;Borra R6 MOV R1, P2 ;Lee P2 para saber el tipo de producto MOV A, R1 ANL A, #3FH ;Mscara con 3FH MOV R1, A ACALL Imprime_cod ;Realiza la lectura del A/D SJMP Principal ;Bucle infinito
256
Microcontroladores MCS-51 y MCS-251 ;************************************************************************** ; Subrutina de Impresin ;************************************************************************** Imprime_cod: MOV R5, #14 ;Nmero de caracteres del texto MOV R0, #10H ;Pone direccin 10H en puntero Imp_buc: CLR C ;Borra acarreo MOV A, #14 ;Pone dato 14 en A SUBB A, R5 ;Resta de 14-R5, contador de 0 a 14. LCALL Tab_tex ;Toma un caracter del texto MOV A, @R0 ;Pone caracter ledo en memoria interna INC R0 ;Incrementa puntero DJNZ R5, Imp_buc ;Realiza bucle hasta final de texto (14 caracteres) Lee_cod: MOV A, R1 ;Situado el texto, falta situar cdigo en la memoria MOV B, #2 ;Multiplica A por 2 MUL AB PUSH A ;Guarda A en la pila LCALL Tabla_cod ;Lee byte alto del cdigo LCALL Bin_ASCII ;Llama a la rutina de conversin de binario a ASCII MOV @R0, B ;Guarda B en la memoria INC R0 ;Incrementa puntero MOV @R0, A ;Guarda A en la memoria INC R0 ;Incrementa puntero POP A ;Recupera la situacin de producto en la tabla INC A ;Posicin de byte bajo del cdigo en la tabla LCALL Tabla_cod ;Lee byte bajo del cdigo LCALL Bin_ASCII ;Llama a la rutina de conversin de binario a ASCII MOV @R0, B ;Guarda B en la memoria INC R0 ;Incrementa puntero MOV @R0, A ;Guarda A en la memoria LCALL Print ;Salta a la subrutina de impresin LJMP Principal Tab_text: INC A ;Tabla con el texto a imprimir MOVC A, @A+PC RET DB PRODUCTO N: Tabla_cod: INC A ;Tabla con los cdigos de los productos MOVC A, @A+PC ;Lee tabla de cdigos RET DB 10H, 15H ;Cdigo del producto n 1 DB 25H, 46H ;Cdigo del producto n 2 DB 1AH, 1FH ;Cdigo del producto n 3 DB 78H, 22H ;Cdigo del producto n 1 ........... ; .................... ........... ; .................... DB 99H, 56H ;Cdigo del producto n 64 Print: MOV R0, #10H ;Pone puntero con direccin de buffer de impresin MOV R5, #18 ;Pone tamao de caracteres a imprimir MOV A, #02H ;Pone caracter STX en A LCALL Transmite ;Transmite dato Print_buc: MOV A, @R0 ;Lee texto del buffer de memoria LCALL Transmite ;Transmite dato INC R0 ;Incrementa puntero DJNZ R5, Print_buc ;Realiza bucle hasta enviar el buffer entero MOV A, #0DH ;Pone caracter CR en A LCALL Transmite ;Transmite caracter LJMP Principal ;Regresa al bucle principal Bin_ASCII: PUSH A ;Guarda A en la pila ANL A, #0F0H ;Mscara. Borra los 4 bits bajos, mantiene los altos SWAP A LCALL Tab_BinASCII MOV B, A POP A ;Recupera A de la pila
9 Puerto de comunicacin serie ANL A, #0FH ;Mscara. Borra los 4 bit bajos LCALL Tab_BinACSII RET Transmite: MOV SBUF, A ;Transmite dato contenido en A RET Tab_BinASCII: INC A ;Tabla de conversin de binario a ASCII MOVC A, @A+PC RET DB 30H, 31H, 32H, 33H, 34H, 35H, 36H, 37H DB 38H, 39H, 41H, 42H, 43H, 44H, 45H, 46H
257
En este programa se utiliza el registro R7 como indicativo de que ha entrado un producto. La transmisin consiste en ir colocando los datos contenidos a partir de la posicin 10H de memoria interna que se utiliza como buffer de datos para la transmisin. En total se transmiten cada vez 18 caracteres: 14 caracteres correspondientes al texto y 4 caracteres correspondientes al cdigo de cuatro cifras del producto. El cdigo del producto se ha situado en la subrutina Tab_cod y est formado por dos bytes. En el programa primero se lee el byte alto del cdigo en la tabla, que se desglosa en dos bytes en formato ASCII: el primero corresponde a los 4 bits altos y el otro a los 4 bits bajos. Luego se lee el byte bajo del cdigo, que se convierte a ASCII de la misma manera que el primer byte. A la impresora se transmite primero el carcter STX (02H), seguido de 18 bytes, almacenados en el buffer de memoria a partir de la posicin 10H y que corresponden al texto y al cdigo de producto, y por ltimo el carcter CR (0DH), que hace que se impriman los datos transmitidos. Para realizar la comunicacin se ha seleccionado una velocidad de 9.600 baudios; para ello se configura el puerto serie en el modo 1, en el que se transmiten 10 bits: 1 bit de start, 8 bits del dato y 1 bit de stop. El Timer 1 del microcontrolador se utiliza como base de tiempos para la transmisin, por lo que debe estar configurado en el modo 2 de 8 bits con autorrecarga, con el bit C/T a 0 lgico, con el bit SMOD a 0 lgico, con el valor FDH de recarga en el registro TH1, y con una frecuencia de reloj de 11.059MHz. Ejemplo 9.2 Comunicacin multipunto mediante RS-485 En la industria de la alimentacin es frecuente tener mltiples cmaras frigorficas en distintos puntos de una nave industrial, o bien dentro de una misma rea comercial. La regulacin y la monitorizacin de la temperatura en cada una de las cmaras frigorficas es de suma importancia, especialmente en el sector de los congelados, donde es imprescindible controlar en todo momento el estado de conservacin y la calidad de un producto. En la figura 9.6 se propone una red de comunicacin basada en la norma RS-485, para realizar el control y la monitorizacin entre un ordenador central que hace la funcin de maestro y las cmaras frigorficas que hacen la funcin de esclavos. En esta aplicacin se ha escogido la norma RS-485 porque es un sistema de transmisin diferencial que permite la comunicacin bidireccional de hasta 32 equipos en un bus de datos comn, permite la transmisin a gran distancia y a gran velocidad, y los emisores deben incorporar autoproteccin contra la sobrecarga de acceso (es decir, la situacin de tener mltiples emisores intentando acceder al mismo tiempo a la lnea de transmisin). Las principales caractersticas de la RS-485 son:
258
La mxima longitud de cable es de 1.200 metros. La velocidad mxima de transmisin es de 10Mbits/seg. Impedancia de entrada del receptor de 12k4. Margen de modo comn de la entrada del receptor de -7V a +12V. Sensibilidad de la entrada diferencial de 200mV en un margen de modo comn de -7V a +12V.
La interfaz con el bus RS-485 se implementa con el circuito integrado DS3695 o el DS75176 de National Semiconductor, que tiene un transmisor y un receptor diferencial, cuyo estado se controla con las entradas DE y /RE, respectivamente. Cada una de las cmaras frigorficas tiene un circuito electrnico formado por un microcontrolador 87C51, cuatro dgitos de siete segmentos donde se visualiza la temperatura en grados centgrados de la cmara, un DS1620 de Dallas Semiconductor que hace de sensor de temperatura y de acondicionador de seal, y un DS3695 para la interfaz RS-485 (figura 9.7). Esclavo 1
Nodo 0
RT + _
Direcci n
DE
DS3695
+
/RE
Nodo 1
RXD
RO DI
RO
R
DE /RE
TXD
DS3695
DS3695
+
/RE
Direcci n
DE
Direcci n
Nodo 2
RXD
RO DI
TXD
Esclavo 2 Direcci n
DS3695
+ RT _
/RE DE
RXD
RO DI
Nodo N D
TXD
Esclavo N
Fig. 9.6 Red de comunicacin basada en la RS-485
Para realizar la comunicacin en la red se debe establecer un protocolo, en el que se definen una serie de reglas con las que se gestionar la comunicacin entre las cmaras frigorficas y el
259
equipo maestro. Cada una de las conexiones en la red RS-485 se denomina nodo. Cada nodo puede, mediante un protocolo, enviar o recibir mensajes o bloques de datos de la red.
87C51 DS1620
DS3695
RS-485
DE /RE
Las funciones que deber realizar el circuito electrnico de cada una de las cmaras son monitorizar la temperatura de la cmara en el visualizador de cuatro dgitos de siete segmentos y transmitir la temperatura de la cmara al equipo maestro cada vez que ste se lo pida. Para comprobar el estado de la red y de la interfaz con cada nodo, el equipo maestro enviar un comando y un dato a cada uno de los esclavos, lo que forzar al esclavo a transmitir el dato recibido al maestro. De esta forma el equipo maestro puede comprobar si hay alguna anomala en la red o en la interfaz de un nodo determinado. La red estar formada por un equipo central que har de maestro y por veinticinco esclavos. El protocolo estar formado por tres bytes. El primer byte se corresponder con el nmero del nodo destino de la transmisin. A cada nodo se le asignar un nmero: el nodo 0 se corresponder con el nodo maestro y los nodos esclavos se numerarn consecutivamente como nodo 1, nodo 2, , nodo 25. El segundo byte del protocolo ser el nmero del nodo que origina el mensaje. Y, por ltimo, el tercer byte se corresponder con un comando ejecutable por el nodo esclavo, que podr ser el carcter ASCII DC1 (11H) o DC2 (12H). El comando DC1 indicar al nodo esclavo que debe transmitir los datos correspondientes a la temperatura al nodo maestro, y el comando DC2 indicar que se va a hacer un chequeo de la lnea por parte del nodo maestro. La lectura de la temperatura en cada microcontrolador estar almacenada en las posiciones 20H y 21H de la memoria interna. La posicin 20H contendr el byte de menor peso y la posicin 21H el byte de mayor peso. En consecuencia, cuando un nodo esclavo reciba el comando DC1, le transmitir al nodo maestro estos dos bytes correspondientes a la temperatura de la cmara frigorfica. El nodo esclavo, en este caso, transmitir un primer byte correspondiente al nmero del nodo maestro (00H), un segundo byte que corresponde con el nmero del nodo esclavo y los dos bytes correspondientes al valor de la temperatura de la cmara. En el caso que un nodo esclavo reciba el comando DC2 de chequeo de la red, ste pasar a la espera de un dato concreto que le debe transmitir el nodo maestro. Para ello, el nodo maestro
260
transmite un primer byte correspondiente al nmero del esclavo y un segundo byte que consiste en la constante AAH. A continuacin se muestra el programa que realiza la comunicacin de un microcontrolador 87C51 como el nodo esclavo nmero 2 de la red. En este programa no se considera el control del DS1620 ni la visualizacin en los cuatro dgitos de siete segmentos de la figura 9.7. La velocidad de comunicacin se ha configurado para 19.200 baudios, y se ha programado el puerto serie en el modo asncrono 1, al igual que en el ejemplo anterior. El Timer 1 est configurado en el modo 2 de 8 bits con autorrecarga, con el bit C/T a 0 lgico, con el bit SMOD a 1 lgico, con el valor FDH de recarga en el registro TH1 y con 11.059MHz de frecuencia de reloj.
;************************************************************************** ; Programa para la comunicacin del bus RS-485 del segundo mdulo esclavo ;************************************************************************** ; Declaracin de constantes y de variables ;************************************************************************** ID_MOD EQU #02H ;Nmero de identificacin de este mdulo ID_Master EQU #00H ;Nmero de identificacin del maestro DC1 EQU #11H ;Valor del comando DC1 DC2 EQU #12H ;Valor del comando DC2 Orden_in EQU 10H ;Variable que indica el n de byte recibido Haz_Eco EQU 13H ;Variable que indica el la accin de eco Dato_Eco EQU 14H ;Variable que contendr el dato enviado por el maestro Temp_bajo EQU 20H ;Variable que contiene el byte bajo de la temperatura Temp_alto EQU 21H ;Variable que contiene el byte bajo de la temperatura ;************************************************************************** ; ; Rutina de Vectorizacin ;************************************************************************** ORG 0H LJMP Inicio ORG 023H ;Vectorizacin del puerto de comunicacin serie LJMP RSI_RS ;************************************************************************** ; Rutina de Inicio (Configuracin de la comunicacin a 19200 baudios) ;************************************************************************** Inicio: MOV Orden_in, #0 ;Pone a 0 MOV Orden_out, #0 ;Pone a 0 MOV Orden_tx, #0 ;Pone a 0 MOV SP, #30H ;Reubica el Stack Pointer CLR P1.1 ;Establece el sentido RS-485 en recepcin SETB ES ;Habilita interrupcin del puerto de comunicacin serie ORL PCON, #80H ;Pone el bit 7 de PCON, bit SMOD, a 1 lgico SETB SM1 ;Configura la comunicacin serie en el modo 1 SETB REN ;Habilita la recepcin de un dato por el puerto serie MOV TMOD, #20H ;Timer 1 en Modo 2, GATE=0 y C/T=0 MOV TL1, #0FDH ;Valor de TL1, para velocidad de 19200 baudios MOV TH1, #0FDH ;Valor de recarga de Timer 1, para velocidad de 19200 baudios SETB EA ;Habilita bit de interrupcin general SETB TR1 ;Pone marcha el Timer 1 (Genera la base de tiempos de la RS-485) LJMP Principal ;Ir hacia rutina principal ;************************************************************************** ; Rutina de servicio del puerto serie ;************************************************************************** RSI_RS: JNB TI, Recibe ;Si no interrumpe TI, entonces es RI CLR TI ;Borra bit TI RETI
9 Puerto de comunicacin serie Recibe: MOV A, SBUF ;Lee dato recibido CJNE Orden_in, #0, Es_byte2 ;Identifca si se recibe el 1, el 2 o el 3 byte SJMP S_byte1 CJNE Orden_in, #01, S_byte3 ;Si no es el byte1 ni el byte2, entonces es el byte3 SJMP S_byte2 CJNE A, ID_MOD, Salir ;Comprueba que sea este mdulo, si no es sale INC Orden_in ;Incrementa contador. Pasa a la espera del siguiente byte SJMP Salir CJNE A, ID_Master, Salir ;Comprueba que le enva el mensaje el mod. maestro INC Orden_in ;Incrementa contador. Pasa a la espera del siguiente byte SJMP Salir CJNE A, DC1, Es_DC2 ;Comprueba que sea el comando DC1 o DC2 MOV Orden_in, #0 ;Inicializa contador MOV Orden_tx, #01H ;Da la orden de transmitir la temperatura de la cmara SJMP Salir CJNE A, DC2, Es_Eco ;Comprueba que sea el comando DC2. Si no, aborta MOV Orden_in, #0 ;Inicializa contador MOV Haz_Eco, #01H ;Activa el eco. Pasa a la espera del caracter de eco SJMP Salir CJNE Haz_Eco, #01H, Abortar ;Aborta la recepcin MOV Dato_Eco, A ;Guarda dato recibido en memoria, para transmitirlo MOV Orden_tx, #02H ;Da la orden de transmitir el dato recibido MOV Haz_Eco, #0 ;Borra indicador de eco MOV Orden_in, #0 ;Inicializa contador CLR RI RETI
261
Es_byte2: S_byte1:
S_byte2:
S_byte3:
Es_DC2:
Es_Eco:
Abortar: Salir:
;*************************************************************************** ; Rutina Principal ;*************************************************************************** Principal: CJNE Orden_tx, #0, Es_trans_1 ;Comprueba si se debe transmitir la SJMP Principal ;temperatura Es_trans_1: CJNE Orden_tx, #01H, Es_trans_2 ;Comprueba si debe transmitir Eco MOV Orden_tx, #0 ;Borra variable LCALL Trans_temp ;Transmite la temperatura SJMP Principal Es_trans_2: MOV Orden_tx, #0 ;Borra variable LCALL Trans_Eco ;Transmite el dato recibido SJMP Principal ;*************************************************************************** ; Subrutina Trans_temp para la transmisin de la temperatura ;*************************************************************************** Trans_Temp: MOV A, ID_Master ;Carga n de identificacin del maestro LCALL Transmite MOV A, ID_MOD ;Carga el n de identificacin de este mdulo LCALL Transmite MOV A, Temp_alto ;Carga el byte alto de la temperatura leda por el .C LCALL Transmite MOV A, Temp_bajo ;Carga el byte bajo de la temperatura leda por el .C LCALL Transmite RET ;*************************************************************************** ; Subrutina Trans_Eco para Eco con el dato enviado por el .C ;*************************************************************************** Trans_Eco: MOV A, ID_Master ;Carga n de identificacin del maestro LCALL Transmite MOV A, ID_MOD ;Carga el n de identificacin de este mdulo LCALL Transmite MOV A, Dato_Eco ;Carga el dato a enviar de Eco LCALL Transmite RET
262
Transmite: SETB P1.1 MOV SBUF, A CLR P1.1 RET
Microcontroladores MCS-51 y MCS-251 ;Establece el sentido RS-485 en transmisin ;Transmite dato contenido en A ;Establece el sentido RS-485 en recepcin
La rutina principal est continuamente pendiente de la operacin con el nodo maestro, que viene indicada por la variable Orden_tx. Esta variable puede valer 01H cuando se debe transmitir la temperatura leda por el microcontrolador, o bien 02H cuando debe transmitir el dato recibido por parte del nodo maestro. Las entradas DE y /RE del DS3695 determinan el sentido de la comunicacin con la red, y ambas estn conectadas a la patilla P1.1 (figura 9.7), de manera que cuando P1.1 est a 0 lgico el DS3596 est configurado para recibir datos y a 1 lgico para transmitir datos. El terminal P1.1 establece el sentido de la comunicacin. En la rutina de RSI del puerto serie se utiliza la variable Orden_in como contador de 0 a 2 que indica el orden del byte recibido por parte del nodo maestro. El protocolo establece que, para dirigirse al microcontrolador del ejemplo (nodo 2), el nodo maestro debe transmitir el dato 02H (destino del mensaje), el dato 00H (origen del mensaje) y un comando de orden que puede ser DC1 o DC2. En el caso de recibir el carcter DC2, la rutina de RSI inicializa la variable Orden_in y pasa a la espera del dato que se debe transmitir como eco. En el caso de que el destino de la comunicacin no sea este nodo, o bien que el origen de la comunicacin no sea el nodo maestro, el proceso obviar los datos recibidos, y pasar a la espera de un mensaje del nodo maestro.
RXD
P3.0
263
En la tabla 9.6 se muestran los registros asociados al puerto de comunicacin serie. El registro SBUF almacena el dato recibido o enviado por el puerto serie. El registro SCON permite programar las caractersticas de funcionamiento del puerto serie y los registros SADDR y SADEN estn relacionados con la configuracin de la direccin del puerto serie en el caso de que se trabaje en entornos multiprocesador.
Tabla 9.6 Registros asociados al puerto de comunicacin serie Mnemnico SBUF SCON SADDR SADEN Descripcin Buffer del puerto serie. Este registro est compuesto por dos registros: en uno se carga el dato recibido y en el otro se almacena el dato enviado. Registro de control del puerto serie. Este registro permite programar las prestaciones de funcionamiento del puerto serie. Direccin del puerto serie. Define la direccin individual del dispositivo esclavo. Habilitacin de la direccin del puerto serie. Especifica el byte de mscara que se utiliza para definir la direccin de un dispositivo esclavo. Direccin S:099H S:098H S:0A8H S:0B8H
En la tabla 9.7 se indica brevemente la funcin de cada uno de los bits del registro SCON.
Tabla 9.7 Registro de control del puerto de comunicacin serie
b4 REN
b0 RI
Mnemnico
SM0 6 SM1
5 4 3 2
1 0
TI RI
Bit de Frame Error. Para seleccionar esta opcin de funcionamiento se debe colocar a 1 lgico el bit SMOD0 del registro PCON. En este caso, el bit FE se pone a 1 cuando se detecta un error en el bit de stop del dato recibido. Bit 0 del modo del puerto serie. Para seleccionar esta opcin se debe poner a 0 el bit SMOD0. Los bits SM0 y SM1 permiten seleccionar el modo de trabajo del puerto. Bit 1 de modo del puerto serie. Programando adecuadamente los bits SM0 y SM1 se puede seleccionar el modo de trabajo del puerto serie. SM0 SM1 Modo 0 0 0 0 1 1 1 0 2 1 1 3 Bit 2 de modo del Puerto Serie. Este bit permite habilitar, o no, la comunicacin serie en entornos multiprocesador. Bit de habilitacin de recepcin. Este bit se pone a 1 lgico para habilitar la recepcin, y se pone a 0 lgico, para habilitar la transmisin. Bit 8 del dato transmitido. En los modos 2 y 3, se escribe en este bit el valor del noveno bit que se transmite. Bit 8 del dato recibido. En el modo 1 este bit adquiere, automticamente, el valor del bit de stop recibido, si SM2=0. En los modos 2 y 3, este bit adquiere automticamente el valor del noveno bit recibido si SM2=0. Flag de interrupcin en transmisin. Este bit se pone a 1 lgico cuando finaliza la transmisin del dato. Se debe borrar por programa. Flag de interrupcin en recepcin. Este bit se pone a 1 lgico despus de recibir un dato. Debe ponerse a cero por programa.
En la figura 9.8 se observa el esquema del puerto de comunicacin serie. Este perifrico incorpora un registro denominado SBUF que almacena el dato a transmitir o el dato recibido. Fsicamente este registro est compuesto por dos registros distintos, un registro conectado al pin TXD, que almacena el
264
dato a transmitir, y otro registro conectado al pin RXD, a travs de un registro de desplazamiento, que almacena el dato recibido por el puerto serie. Esta duplicidad de registros permite poder transmitir y recibir datos al mismo tiempo (comunicacin full-duplex).
IB bus
Escribir SBUF
Leer SBUF
T xD
SBUF transmisin
SBUF recepcin
Cargar SBUF
R xD
9.6.1 Modo 0 o sncrono Para programar el puerto de comunicacin serie en modo cero hay que colocar los bits SM0 y SM1 del registro SCON, a cero lgico. En este modo la velocidad de transmisin de datos es FOSC/12 y la transmisin-recepcin de datos se produce a travs del pin RXD, mientras que por el pin TXD se genera la seal de reloj que sincroniza la transmisin. Los ocho bits del dato se transmiten y se reciben comenzando por el bit de menor peso, LSB, y acabando por el bit de mayor peso, MSB. Para transmitir un dato hay que poner a cero el bit REN del registro SCON y escribir en el registro SBUF el dato a transmitir. La transmisin se inicia cuando se ejecuta la instruccin de escritura en el registro SBUF. En la figura 9.9 se muestra el cronograma correspondiente a la transmisin de un dato. La transmisin comienza por el bit de menor peso del dato a transmitir, D0, en el estado S6P2 del ciclo de perifrico que viene a continuacin de la ejecucin de la instruccin SBUF. En el estado S3P1 del siguiente ciclo de perifrico, la salida TXD pasa a cero para generar el primer pulso de la seal de reloj que sincroniza la transmisin. Este flanco de bajada en TXD se utiliza para comunicar al receptor que ya
265
hay un bit vlido en el pin RXD. En cada ciclo de perifrico se transmite un nuevo bit hasta acabar con el bit de mayor peso, D7. Al finalizar la transmisin, la lnea RXD se queda con el valor 1 lgico y se activa el flag de interrupcin TI.
TXD S3P1 Escribir en SBUF S6P2 Registro S6P2 RXD D0 S6P2 S6P2 D1 S6P2 D2 S6P2 D6 D7 S6P2 S6P1
TI S1P1
En la figura 9.10 se muestra el cronograma correspondiente a la recepcin de un dato. El proceso de recepcin comienza cuando se escribe en el registro SCON la combinacin binaria que pone los bits SM0, SM1 y RI a cero y el bit REN a 1 lgico. Un ciclo de perifrico despus de ejecutada esta instruccin, en el estado S3P1, la salida TXD pasa a 0 lgico para generar el primer pulso de la seal de reloj que sincroniza la recepcin. Este flanco de bajada avisa al dispositivo transmisor para que coloque en la entrada RXD el primer bit, D0, del dato a transmitir. El microcontrolador lee el bit suministrado por el transmisor en el estado S5P2 de ese mismo ciclo de perifrico e introduce el bit ledo en el registro de recepcin en el estado S6P2. Despus de haber ledo los ocho bits del dato se activa el flag de interrupcin RI del registro SCON. El dato recibido se puede leer ejecutando una instruccin de lectura del registro SBUF.
TXD S3P1 Escribir en SCON S6P2 Registro S6P2 D0 RXD S6P2 RI S1P1 S6P2 S5P2 S6P2 D1 S6P2 D6 S6P2 D7
REN = 1, RI = 0
S6P1
Ejemplo 9.3 Comunicacin va serie entre un 8XC251Sx y un perifrico en modo 0 En este ejemplo se trata de disear una rutina que controle la transmisin a un perifrico, a travs del puerto serie, de los datos almacenados entre las direcciones 50H y 60H de la memoria del microcontrolador 8XC251Sx. El perifrico dispone de un registro de desplazamiento con entrada serie y salida paralelo, para recibir los datos que le enva el puerto serie programado en modo cero. La entrada serie del registro de desplazamiento se conecta a la salida de datos del puerto serie (pin P3.0 o RXD),
266
mientras que la entrada de reloj se conecta al pin P3.1, para poder sincronizar la carga de datos en el registro de desplazamiento con la seal de reloj del puerto serie (figura 9.11).
8XC251Sx
Perifrico
Registro de desplazamiento
P3.0 P3.1
Fig. 9.11 Conexin del microcontrolador al perifrico a travs del puerto serie
El programa debe comenzar con instrucciones que configuren el puerto de comunicacin serie en modo 0 y habilitado para transmitir. Si se realiza el control del puerto serie mediante interrupciones, se debe habilitar la interrupcin de este perifrico y disear una rutina de servicio de interrupcin del puerto serie que enve un dato cada vez que se active el flag TI. Para recorrer el margen de posiciones de memoria que contienen los datos a transmitir se utiliza un registro como puntero de memoria inicializado con el valor 50H. Si la frecuencia de la seal de reloj del microcontrolador es, por ejemplo, de 12MHz, la velocidad de transmisin en este modo es de 1Mbaud. A continuacin se presenta el listado del programa principal y de la rutina de servicio a la interrupcin del puerto serie.
;------------------------------------------------------------------------------------------------------------; PROGRAMA PRINCIPAL DE LA TRANSMISION SERIE ;------------------------------------------------------------------------------------------------------------ORG FF:0000H ; Se salta a una zona de memoria con espacio suficiente JMP INICIO ; para almacenar las instrucciones del programa principal. ORG FF:0500H ; Programacin del puerto serie INICIO: CLR SM1 ; Se programa el puerto serie en modo 0. CLR SM0 ; CLR REN ; Se habilita la transmisin por el puerto serie. SETB ES ; Se habilita la interrupcin del puerto serie. SETB EA ; Se activa el bit habilitador de interrupciones. SETB INTR ; Cuando la CPU vectorice una interrupcin cargar en ; la pila los 3 bytes del PC y el registro de estado. ; Inicializacin del puntero MOV R0, #50H ; Se inicializa el registro R0 con el valor 50H. MOV SBUF,R0 ; Se enva el primer dato de la zona de memoria por el puerto serie. ;------------------------------------------------------------------------------------------------------------; RUTINA DE SERVICIO A LA INTERRUPCION DEL PUERTO SERIE ;------------------------------------------------------------------------------------------------------------ORG FF:0023H ; Vector de interrupcin del puerto serie. JMP RSI_PS ; Se salta a una zona de memoria con espacio suficiente ; para almacenar las instrucciones de la rutina. ORG FF:1000H RSI_PS: CLR TI ; Se borra el flag TI. INC R0 ; Se incrementa el puntero R0. MOV SBUF,R0 ; Se enva el dato por el puerto serie. CMP R0,#60H ; Se compara el contenido del puntero con la ltima ; posicin de memoria de la zona a transmitir.
9 Puerto de comunicacin serie JNE CONT CLR ES RETI ; Si todava no se han enviado todos los datos se retorna ; al programa principal. ; Si se ha terminado la transmisin se borra el flag de ; interrupcin del puerto serie. ; Se retorna al programa principal.
267
9.6.2 Modos 1, 2 y 3. Modos asncronos Cuando se programa el puerto de comunicacin serie en alguno de los modos asncronos, se pueden enviar datos, a travs de la lnea TXD, y recibir datos, a travs de la lnea RXD, de forma simultnea. En la figura 9.12 est representada la trama del dato que se transmite en los modos asncronos, los modos 1, 2 y 3.
D0 D1 D2 D3
Dato Bit de Start Noveno bit (slo modos 2 y 3) Bit de Stop
D4
D5
D6
D7
D8
a) Modo 1 En el modo 1, la trama de datos est compuesta de 10 bits: hay un primer bit de start o comienzo del dato, que vale cero lgico, e indica el comienzo de la transmisin del dato; a continuacin vienen los 8 bits del dato a transmitir y finalmente el bit de stop, que siempre vale 1 lgico. Para enviar un dato en modo 1 basta con poner a cero el bit REN, bit 4 del registro SCON y, a continuacin, escribir en el registro SBUF el dato que se desea enviar. La transmisin comienza una vez escrito el dato en el registro SBUF. Para recibir un dato en modo 1, en primer lugar se debe habilitar la recepcin poniendo a 1 lgico el bit REN. La recepcin comienza cuando se detecta un flanco de bajada en el pin RXD. La velocidad de transmisin en el modo 1 depende de la velocidad de desbordamiento del Timer 1 y/o del Timer 2. Se puede seleccionar cualquiera de ellas o ambos Timers para fijar la velocidad de transmisin y/o recepcin. El Timer que fija por defecto la velocidad de transmisin es el Timer 1, y sta viene dada por la frmula siguiente, en baudios o bits/s: Velocidad de transmisin: 2SMOD1 Velocidad de rebasamiento del Timer 1 [baudios] 32 Si se desea utilizar el Timer 1 como generador de baudios, se debe inhibir la interrupcin del Timer 1, poniendo a cero el bit ETI del registro IE0 y se debe configurar como contador o como temporizador en el modo de trabajo que se desee. En muchas aplicaciones se configura el Timer 1 como temporizador en el modo 2. En este caso, la velocidad de transmisin depender del valor cargado inicialmente en el registro del Timer 1, TH1: Velocidad de transmisin: 2SMOD1
FOSC [baudios] 32 12 ]256 TH1
268
Tabla 9.8 Timer 1 como generador de baudios para los modos 1 y 3 del puerto serie Baudios 62.5 Kbaud (Max) 19.2 Kbaud 9.6 Kbaud 4.8 Kbaud 2.4 Kbaud 1.2 Kbaud 137.5 Baud 110.0 Baud 110.0 Baud Frecuencia Oscilador 12.0 MHz 11.059 MHz 11.059 MHz 11.059 MHz 11.059 MHz 11.059 MHz 11.059 MHz 6.0 MHz 12.0 MHz SMOD1 1 1 0 0 0 0 0 0 0 C/T 0 0 0 0 0 0 0 0 0 Timer 1 Modo Valor recarga 2 FFH 2 FDH 2 FDH 2 FAH 2 F4H 2 E8H 2 1DH 2 72H 1 FEEBH
Se pueden obtener velocidades de transmisin bajas configurando el Timer 1 en modo 1, habilitando su interrupcin e inicializndolo, adecuadamente, en la rutina de servicio a la interrupcin. Si por ejemplo, la frecuencia de reloj es de 12MHz y se recarga el Timer 1 en la rutina de interrupcin con el valor FEEBH, se consigue fijar la velocidad de transmisin en 110.0 Baudios. Con otros valores de recarga se pueden conseguir velocidades ms bajas. El Timer 2 tiene un modo de funcionamiento especfico, denominado Baud Rate Generator Mode, utilizado para fijar la velocidad de transmisin o de recepcin de datos por el puerto serie. Para seleccionar el Timer 2 como generador de baudios, en transmisin y/o recepcin, se deben programar adecuadamente los bits RCLCK y TCLCK del registro T2CON, tal y como se muestra en la tabla 9.9.
Tabla 9.9 Seleccin del Timer 2 como generador de baudios
RCLCK
0 0 1 1
TCLCK
0 1 0 1
Cuando el Timer 2 se selecciona como generador de baudios funciona de forma similar al modo autorrecarga. Al sufrir desbordamiento, los registros TH2 y TL2 se recargan con el valor de los registros RCAP2H y RCAP2L, que se inicializan por programa. La velocidad de transmisin depende de los valores cargados en estos registros: Velocidad de transmisin:
FOSC 32 ]65536
(RCAP2H , RCAP2L )
[baudios]
En la figura 9.13 se muestra el esquema del Timer 2 configurado en modo generador de baudios. En la tabla 9.10 se indican distintas velocidades de transmisin de acuerdo con los valores de los registros RCAP2H y RCAP2L.
269
2
0 1
SMOD1
XTAL1
0 1
TL2 (8 bits)
16
0
RX Clock
T2 C/T2
RCLCK
1 0 RCAP2H RCAP2L
16
TX Clock
TCLCK
Peticin de interrupcin
T2EX
EXF2
EXEN2
Fig. 9.13 Esquema del Timer 2 trabajando en el modo generador de Baud Rate Tabla 9.10 Timer 2 como generador de baudios para los modos 1 y 3 del puerto serie
Baudios
375.0 Kbaud 9.6 Kbaud 4.8 Kbaud 2.4 Kbaud 1.2 Kbaud 300.0 baud 110.0 baud 300.0 baud 110.0 baud
Frecuencia oscilador
12.0 MHz 12.0 MHz 12.0 MHz 12.0 MHz 12.0 MHz 12.0 MHz 12.0 MHz 6.0 MHz 6.0 MHz
RCAP2H
FFH FFH FFH FFH FEH FBH F2H FDH F9H
RCAP2L
FFH D9H B2H 64H C8H 1EH AFH 8FH 57H
Ejemplo 9.4 Comunicacin va serie entre dos microcontroladores 8XC251Sx en modo 1 En este ejemplo se trata de disear un canal de comunicacin que transmita, va serie entre dos puntos remotos, datos de 8 bits. Para implementar este sistema se utilizan dos microcontroladores de la serie 8XC251Sx. Uno de ellos, denominado emisor, recibe un dato de entrada a travs de un canal paralelo de 8 bits que est conectado al puerto P1 y lo enva a travs del puerto de comunicacin serie a otro microcontrolador 8XC251Sx, denominado receptor, que lo recibe y lo reenva en formato paralelo por el puerto P1 (figura 9.14). Para indicar que hay un nuevo dato en el puerto P1, listo para ser ledo por el microcontrolador emisor, se activa la entrada de interrupcin externa cero con un flanco negativo.
Emisor
8XC251Sx
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 INT0
Receptor
8XC251Sx TXD RXD P3.0
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 P2.0
P3.1
270
El microcontrolador receptor (figura 9.14) tambin dispone de una salida de dato vlido ubicada en el pin P2.0. Por esta salida se genera un pulso positivo para indicar que ya est disponible en el puerto P1 un nuevo dato recibido por el puerto serie. Para realizar la transmisin, se programa en modo 1 el puerto serie de los dos microcontroladores, con una velocidad de transmisin/recepcin de 9.600 baudios. Esta aplicacin requiere el diseo de dos rutinas, una rutina de envo de datos, para el microcontrolador emisor, y una rutina de recepcin para el microcontrolador receptor. La rutina del emisor comienza programando el puerto serie en modo 1. A continuacin se debe habilitar la interrupcin externa cero, programar el Timer 1 como temporizador en modo 2 e inicializar adecuadamente los registros TH1 y TL1 para que la velocidad de transmisin sea de 9.600 baudios. Si consideramos que la frecuencia de la seal de reloj es de 11.059MHz y que el bit SMOD1 est a 0 lgico, se debe cargar el valor FDH en TH1 y TL1 para obtener una velocidad de transmisin de 9.600 baudios. Por otra parte, la rutina de servicio a la interrupcin /INT0 incluye instrucciones que ejecutan el envo del dato ledo en el puerto P1 por el puerto serie. En cualquier caso, se debe garantizar que no se enviar un nuevo dato hasta que no finalice la transmisin del dato en curso. Por este motivo, se chequea de forma reiterada el bit TI mientras ste valga 0 lgico. Cuando termine la transmisin del dato, este bit pasar a 1 lgico, y finalizar la rutina de servicio a la interrupcin /INT0. A continuacin se presenta el listado del programa principal y de la rutina de servicio a la interrupcin externa cero del microcontrolador emisor.
;------------------------------------------------------------------------------------------------------------; PROGRAMA PRINCIPAL DE LA TRANSMISION SERIE ;------------------------------------------------------------------------------------------------------------ORG FF:0000H ; JMP TRSER ; Salto al programa principal. ORG FF:0100H ; Programacin del puerto serie TRSER: SETB SM1 ; Se programa el puerto serie en modo 1. CLR SM0 ; CLR REN ; Se habilita la transmisin por el puerto serie. ; Programacin del Timer 1 MOV TMOD,#20H ; Se programa el Timer 1 en modo 2, como MOV TL0,#FDH ; temporizador y se inicializa con el valor FDH para que MOV TH0,#FDH ; la velocidad de transmisin sea de 9,6Kbaud. CLR SMOD1 ; Se pone a cero el bit SMOD1. ; Programacin de la interrupcin /INT0 SETB EX0 ; Se habilita la interrupcin /INT0. SETB EA ; Se activa el bit habilitador de interrupciones. SETB INTR ; Para cargar en la pila 3 bytes del PC y el registro de estado. SETB IT0 ; Interrupcin /INT0 activa por flanco descendente. ;------------------------------------------------------------------------------------------------------------; RUTINA DE SERVICIO A LA INTERRUPCION /INT0 ;------------------------------------------------------------------------------------------------------------ORG FF:0003H ; Vector de interrupcin de /INT0. JMP RSI_INT0 ; Salto a la rutina de RSI. ORG FF:2000H RSI_INT0: MOV R0,P1 ; Se carga el dato del puerto P1 en el registro R0.
271
; Carga el dato en SBUF para comenzar la transmisin serie. ; Bucle de espera mientras dura la transmisin del dato. ; Se borra el flag TI. ; Se retorna al programa principal.
SIGUE:
La rutina del receptor tiene en comn con la del emisor la programacin del Timer 1 y la programacin del puerto serie, excepto en el bit REN, que debe ponerse a 1 lgico para habilitar la recepcin. La rutina tambin incluye instrucciones que detectan cundo se ha recibido un nuevo dato mediante el chequeo continuo del bit RI. Cuando se active este bit, se cargar el dato recibido, que est ubicado en el registro SBUF, en el puerto P1, al mismo tiempo que se generar un pulso positivo en la salida P2.0. A continuacin se presenta el listado del programa que controla el funcionamiento del microcontrolador receptor.
;------------------------------------------------------------------------------------------------------------; PROGRAMA PRINCIPAL DE LA TRANSMISION SERIE ;------------------------------------------------------------------------------------------------------------ORG FF:0000H ; Programacin del puerto serie SETB SM1 ; Se programa el puerto serie en modo 1. CLR SM0 ; SETB REN ; Se habilita la recepcin por el puerto serie. ; Programacin del Timer 1 MOV TMOD,#20H ; Se programa el Timer 1 en modo 2, como MOV TL0,#FDH ; temporizador y se inicializa con el valor FDH para que MOV TH0,#FDH ; la velocidad de transmisin sea de 9,6Kbaud. CLR SMOD1 ; Se pone a cero el bit SMOD1. ; Control de la recepcin de datos por el puerto serie. SIGUE: JNB RI,SIGUE ; Bucle de espera hasta que no se reciba un nuevo dato por el puerto serie. CLR RI ; Se borra el flag RI. MOV R0,SBUF ; Se carga el dato recibido en el registro R0. MOV P1,R0 ; Se carga el dato en el registro P1. SETB P2.0 ; Se genera un pulso positivo por el pin P2.0 para CLR P2.0 ; indicar que hay un nuevo dato en el puerto P1. JMP SIGUE ; Salta a la instruccin de chequeo de RI para detectar la recepcin de un nuevo dato.
b) Modo 2 Cuando el puerto serie est programado en el modo 2, la trama de bits que se transmite o se recibe est compuesta por 11 bits: 1 bit de start, 8 bits de datos, comenzando siempre por el bit de menor peso, un noveno bit programable por el usuario y un bit de stop. Los datos se transmiten por el pin TXD y se reciben por el pin RXD. En la transmisin, el noveno bit transmitido se corresponde con el valor del bit TR8 del registro SCON, mientras que en la recepcin, el noveno bit se almacena en el bit RB8 del dicho registro. El procedimiento para transmitir en modo 2 comienza seleccionando el modo de trabajo; a continuacin se pone a 0 lgico el bit REN, se escribe el bit TR8 con el valor del noveno bit a transmitir y se carga en el registro SBUF el dato que se desea enviar por el puerto serie. La transmisin comienza justo despus de escribir el registro SBUF. La recepcin se produce cuando se recibe un flanco descendente por el pin RXD, mientras el bit REN est a 1 lgico. En este modo de trabajo, slo se permiten dos velocidades de transmisin/recepcin, dependiendo del valor del bit SMOD1:
272
Velocidad puerto serie: 2 SMOD1 FOSC [baudios] 64 c) Modo 3 El modo 3 del puerto serie es similar al modo 2, con la nica diferencia que la velocidad de transmisin/recepcin se obtiene de la misma manera que en el modo 1.
8XC251 Esclavo
TXD RXD
8XC251 Esclavo
TXD RXD
8XC251 Esclavo
TXD RXD
273
Para que llevar a cabo la comunicacin va serie en un entorno multiprocesador, todos los microcontroladores esclavos deben tener su bit SM2 a 1 lgico. En estas condiciones, cuando el microcontrolador que acta de maestro quiere comunicarse con algn esclavo debe, en primer lugar, transmitir a travs del puerto serie un dato con la direccin del esclavo. El noveno bit del dato transmitido ser un 1 lgico como indicativo de que se enva una direccin. Todos los esclavos leern esa direccin, pero slo aquel que reconozca su propia direccin pondr el bit RB8 a 1 lgico, al mismo tiempo que activar su flag de interrupcin RI para generar una interrupcin. El microcontrolador esclavo, que ha sido direccionado, pondr a cero su bit SM2, preparndose, de este modo, para recibir los bytes de datos enviados por el maestro. Los bytes de datos tienen el noveno bit a 0 lgico; por tanto, son ignorados por todos los esclavos que tienen su bit SM2 a 1. De este modo, el nico microcontrolador esclavo que responde al maestro es el que ha reconocido su direccin.
9.9.1 Direcciones given La direccin individual del microcontrolador se almacena en el registro SADDR; por otra parte, el registro SADEN contiene una mscara de bits que permiten tomar, indistintamente, como 0 1 lgico, aquellos bits del registro SADDR que en el registro SADEN estn a 0 lgico. De este modo se puede direccionar ms de un esclavo al mismo tiempo. Por ejemplo, si en el registro SADDR est almacenado el valor 1001 0011 y en el registro SADEN el valor 0101 1111, el microcontrolador responde a las direcciones: X0X1 0011. En este caso, las combinaciones posibles de valores que pueden tomar los bits 5 y 7, dan lugar a 4 direcciones distintas asociadas al mismo microcontrolador y denominadas direcciones given. En los casos extremos, si el registro SADEN almacena el valor 0000 0000, el microcontrolador responde a cualquier direccin, y si el registro SADEN est cargado con el valor 1111 1111, slo responde a la direccin almacenada en el registro SADDR. Ejemplo 9.5 Direccionamiento de diferentes esclavos utilizando direcciones given Se dispone de tres microcontroladores esclavos con las siguientes direcciones y mscaras: Esclavo A: SADDR = 1111 0001 SADEN = 1111 1010 Given = 1111 0X0X SADDR = 1111 0011 SADEN = 1111 1001 Given = 1111 0XX1
Esclavo B:
274
Esclavo C:
Si nos fijamos en las direcciones anteriores, se puede comprobar que, para el esclavo A, el bit de menor peso de la direccin es indeterminado, mientras que en los esclavos B y C vale 1 lgico. Entonces, para comunicarse exclusivamente con el esclavo A, la direccin deber tener el bit de menor peso a cero, como, por ejemplo, la direccin 1111 0000. Por otra parte, para el esclavo A, el segundo bit vale 0 mientras que en los esclavos B y C es indeterminado. Luego, para comunicarse con los esclavos B y C, pero no con el A, el microcontrolador maestro deber enviar una direccin que tenga el segundo bit a 1 lgico, por ejemplo la direccin 1111 0011. Para los esclavos A y B el tercer bit es indeterminado, mientras que para el esclavo C el tercer bit de la direccin vale 0. Para comunicarse con los esclavos A y B, pero no con el C, el maestro deber enviar una direccin con el tercer bit a 1 lgico, por ejemplo la direccin 1111 0101. Si el microcontrolador maestro debe comunicarse con los tres esclavos a la vez, enva una direccin con el primer bit a 1 lgico, el segundo bit a 0 lgico y el tercero a 0 lgico, por ejemplo la direccin 1111 0001.
9.9.2 Direcciones broadcast Las direcciones broadcast se forman realizando la operacin OR lgica entre el contenido del registro SADDR y el contenido del registro SADEN, donde los ceros representan bits indeterminados, por ejemplo: SADDR = 0101 0110 SADEN = 1111 1100 Broadcast (SADDR) or (SADEN) = 1111 111X Ejemplo 9.6 Direccionamiento de diferentes esclavos utilizando direcciones broadcast Se dispone de tres microcontroladores esclavos con las siguientes direcciones y mscaras: Esclavo A: SADDR = 1111 0001 SADEN = 1111 1010 Broadcast = 1111 1X11 SADDR = 1111 0011 SADEN = 1111 1001 Broadcast = 1111 1X11 SADDR = 1111 0010 SADEN = 1111 1101 Given = 1111 1111
Esclavo B:
Esclavo C:
275
Para los esclavos A y B, el bit tercero es indeterminado, mientras que para el esclavo C es igual a 1 lgico. En este caso, para comunicarse con todos los esclavos el microcontrolador maestro debe enviar la direccin FFH. Si el maestro debe comunicarse con los esclavos A y B pero no con el C debe enviar la direccin FBH. Ejemplo 9.7 Comunicacin multiprocesador en modo 2 Se dispone de un sistema que incorpora cinco microcontroladores, un maestro y cuatro esclavos, denominados A, B, C y D, conectados entre s a travs del puerto serie para trabajar en entorno multiprocesador (figura 9.16).
8XC251 Maestro
TXD RXD
8XC251 Esclavo A
TXD RXD
8XC251 Esclavo B
TXD RXD
8XC251 Esclavo C
TXD RXD
8XC251 Esclavo D
TXD RXD
En la tabla 9.11 se especifica el contenido de los registros SADDR y SADEN de los distintos esclavos, as como las direcciones given y broadcast resultantes.
Tabla 9.11 Direcciones de los microcontroladores esclavos.
Esclavo B
0000 0010 1111 1010 0000 0X1X 1111 1X1X
Esclavo C
0000 0100 1111 0101 0000 X1X0 1111 X1X1
Esclavo D
0000 1000 1111 0011 0000 XX00 1111 1X11
Para controlar esta aplicacin, se debe disear un programa que gestione el envo de datos entre el maestro y los esclavos. La secuencia de transferencia de datos es la siguiente: En primer lugar el maestro transmite a los esclavos A y D, los datos contenidos entre las direcciones de memoria 50H y 5FH. A continuacin, enva al esclavo C los datos almacenados en las posiciones de memoria de la 60H a la 6FH. Finalmente, el maestro transmite a todos los esclavos el contenido de la direccin 70H. El programa del microcontrolador que realiza las funciones de maestro, incluye instrucciones que programan el puerto serie en modo 2 y que lo habilitan para transmitir. A continuacin, vienen las instrucciones que realizan la transmisin de datos a los distintos esclavos. Para mandar datos a los esclavos A y D se puede utilizar la direccin 0000 0000, que es comn a ambos esclavos. Para transmitir datos al esclavo C se utiliza la direccin 0000 1110, que es exclusiva de este esclavo. Finalmente, para direccionar todos los esclavos simultneamente se
276
puede emplear la direccin 1111 1111. A continuacin se detalla el programa de control de transmisin de datos del maestro.
;------------------------------------------------------------------------------------------------------------; PROGRAMA PRINCIPAL DEL MAESTRO ;------------------------------------------------------------------------------------------------------------ORG FF:0000H ; Programacin del puerto serie SETB SM0 ; Se programa el puerto serie en modo 2. CLR SM1 ; CLR REN ; Se habilita la transmisin por el puerto serie. SETB SMOD1 ; Se pone el bit SMOD1 a 1 lgico. ; Envo de datos a los esclavos A y D. SETB TB8 ; Se coloca el 9 bit a 1 para indicar a los esclavos que se enva una direccin. MOV SBUF,#00H ; El maestro enva por el puerto serie la direccin de los esclavos A y D. SIG1: JNB TI,SIG1 ; El maestro espera a que se acabe la transmisin. CLR TI ; Se borra el flag TI. CLR TB8 ; El maestro se dispone a enviar los datos. MOV R0,#10H ; Se carga un contador con el nmero de datos a enviar. MOV R1,#50H ; Se carga un puntero con la direccin de memoria ; donde estn almacenados los datos. SIG2: MOV SBUF,@R1 ; Se enva un dato. INC R1 ; Se incrementa el puntero en una unidad. SIG3: JNB TI,SIG3 ; El maestro espera a que se acabe la transmisin. CLR TI ; Se borra el flag de interrupcin en transmisin. DJNZ R0,SIG2 ; Se decrementa el contador de datos transmitidos. ; Envo de datos al esclavo C. SETB TB8 ; Se coloca el 9 bit a 1 para indicar a los esclavos que se enva una direccin. MOV SBUF,#0EH ; El maestro enva por el puerto serie la direccin del esclavo C. SIG4: JNB TI,SIG4 ; El maestro espera a que se acabe la transmisin. CLR TI ; Se borra el flag TI. CLR TB8 ; El maestro se dispone a enviar los datos. MOV R0,#10H ; Se carga un contador con el nmero de datos a enviar. MOV R1,#60H ; Se carga un puntero con la direccin de memoria donde estn los datos. SIG5: MOV SBUF,@R1 ; Se enva un dato. INC R1 ; Se incrementa el puntero en una unidad. SIG6: JNB TI,SIG6 ; El maestro espera a que se acabe la transmisin. CLR TI ; Se borra el flag de interrupcin en transmisin. DJNZ R0,SIG5 ; Se decrementa el contador de datos transmitidos. ; Envo de datos a todos los esclavos. SETB TB8 ; Se coloca el noveno bit a 1 lgico para indicar a los ; esclavos que se enva una direccin. MOV SBUF,#FFH ; El maestro enva por el puerto serie una direccin comn a todos los esclavos. SIG7: JNB TI,SIG7 ; El maestro espera a que se acabe la transmisin. CLR TI ; Se borra el flag TI. CLR TB8 ; El maestro se dispone a enviar los datos. MOV SBUF,70H ; Se enva el dato de la direccin 70H. SIG8: JNB TI,SIG8 ; El maestro espera a que se acabe la transmisin. CLR TI ; Se borra el flag de interrupcin en transmisin.
277
Bit
7
Mnemnico
CF
Funcin
Flag de desbordamiento del temporizador/contador del PCA. Este flag se activa cuando el Timer del PCA sufre desbordamiento. Esto genera una interrupcin al microcontrolador si el bit ECF (registro CMOD) est activo. Este bit se borra por programa. Bit de control de puesta en marcha del temporizador/contador del PCA. Bit de puesta en marcha del Timer del PCA. Debe estar a 1 lgico para que el Timer funcione. Reservado. Flags del mdulo de comparacin/captura. Se pone a 1 lgico, automticamente, cuando el comparador se activa, lo que genera una interrupcin al microcontrolador si el bit ECCFx correspondiente est activo. Debe ser borrado por programa.
6 5 4:0
CR --CCF4:0
278 Tabla 10.2 Registro de modo CMOD del temporizador/contador del PCA CMOD b7 CIDL
b6 WDTE
b5 ---
b4 ---
b0 ECF
Bit
7
Mnemnico
CIDL
Funcin
Bit de control del PCA temporizador/contador en modo Idle. Cuando CIDL=1 inhibe al Timer del PCA durante el modo Idle. Si CIDL=0 el Timer del PCA funciona durante el modo Idle. Bit de habilitacin del Timer watchdog. WDTE=1 habilita el Timer watchdog del mdulo 4 del PCA. WDTE=0 inhibe el Timer watchdog del PCA Bits reservados. Los valores de estos bits son indeterminados. No deben utilizarse. Bits de seleccin de las entradas del PCA temporizador/contador. CPS1 CPS0 0 0 FOSC/12 0 1 FOSC/4 1 0 Desbordamiento del Timer 0 1 1 Reloj externo en el pin ECI (frecuencia mx. =FOSC/8) Bit de habilitacin de la interrupcin del PCA temporizador/contador. Cuando ECF=1 se habilita el bit CF en el registro CCON para generar una peticin de interrupcin.
WDTE
5:3 2:1
--CPS1:0
ECF
Mnemnico
CL CH CCON
Descripcin
Temporizador/contador del PCA. Estos dos registros de 8 bits implementan fsicamente el temporizador/contador de 16 bits del PCA. Registro de control del temporizador/contador del PCA. Contiene los bits de puesta en marcha y desbordamiento del temporizador; y los flags de interrupcin de los 5 mdulos de comparacin/captura. Registro de modo del temporizador/contador del PCA. Contiene los bits para habilitar el temporizador/contador del PCA durante el modo de funcionamiento Idle, para habilitar el temporizador watchdog, para seleccionar la entrada del temporizador/contador y para habilitar la interrupcin por desbordamiento del temporizador/contador del PCA. Registros de comparacin/captura del mdulo 0 del PCA. Estos registros cargan el valor comparado o capturado. Cuando el PCA trabaja en modo PWM, el registro de menor peso controla el ciclo de trabajo de la onda de salida. Registros de comparacin/captura del mdulo 1 del PCA. Idem Registros de comparacin/captura del mdulo 2 del PCA. Idem Registros de comparacin/captura del mdulo 3 del PCA. Idem Registros de comparacin/captura del mdulo 4 del PCA. Idem Registros de modo de los mdulos de comparacin/captura del PCA. Contiene los bits que permiten seleccionar el modo de operacin de los mdulos de comparacin/captura y habilitacin del flag de comparacin captura.
CMOD
CCAP0H CCAP0L CCAP1H CCAP1L CCAP2H CCAP2L CCAP3H CCAP3L CCAP4H CCAP4L CCAPM0 CCAPM1 CCAPM2 CCAPM3 CCAPM4
279
00 01 10 11
CPS1
CPS0
CIDL
ECF CMOD.0
CMOD.2 CMOD.1 CMOD.7 IDL PCON.0 Modo Idle CR CCON.6 Run Control
Los bits CPS1 y CPS0 del registro CMOD seleccionan una de las cuatro posibles fuentes de entrada del temporizador/contador: 1. 2. 3. 4. FOSC/12: para CPS1, CPS0 = 00, el temporizador/contador se incrementa cada ciclo de perifrico, en concreto en el perodo 2 del estado 5, S5P2. FOSC/4: para CPS1, CPS0 = 01, el temporizador/contador se incrementa cada cuatro perodos de seal de reloj. Desbordamiento del Timer 0: para CPS1, CPS0 = 10, el temporizador/contador se incrementa cada vez que desborda el Timer 0. Pin P1.2/ECI: si se programan los bits CPS1, CPS0 = 11, el temporizador/contador se incrementa cuando se aplica un flanco descendente en el pin P1.2/ECI. La frecuencia mxima de incremento para este caso es de FOSC /8.
El PCA dispone de tres bits relacionados con la habilitacin del funcionamiento del temporizador. El bit CR, ubicado en el registro CCON, pone en marcha el temporizador si la salida de la puerta NAND est a 1 lgico (figura 10.1). En caso de que el microcontrolador est trabajando en el modo Idle de bajo consumo (bit IDL del registro PCON a 1 lgico), el temporizador del PCA seguir funcionando mientras el bit CIDL, registro CMOD, est a cero lgico. Es posible leer el contenido de los registros CH y CL del temporizador/contador del PCA en cualquier momento, pero no se puede escribir en estos registros mientras el temporizador est funcionando.
280
10.3.1 Modo captura El modo captura permite medir perodos, anchos de pulso, ciclos de trabajo y diferencia de fase entre cinco seales. En la figura 10.2 se muestra el esquema correspondiente al modo captura.
Temporizador/contador del PCA Entrada de cuenta CH (8 bits) Captura CL (8 bits)
CCAPxH CCAPxL x = 0, 1, 2, 3 4 X=01 CCFx Registro CCON X 7 O CAPPx CAPNx O O O Enable ECCFx 0 Peticin de interrupcin
El microcontrolador verifica los pines de entrada CEX0, CEX1, CEX2, CEX3 y CEX4 para detectar transiciones positivas y/o negativas en la seal binaria aplicada en estos pines (tabla 10.4).
Tabla 10.4 Seales externas asociadas al PCA
Nombre Tipo
ECI CEX0 CEX1 CEX2 CEX3 CEX4 I I/O
Descripcin
Entrada externa del temporizador/contador del PCA. Esta seal es la entrada de reloj externo para el temporizador/contador del PCA. Entradas/salidas externas de los mdulos de comparacin/captura. Cada mdulo de comparacin/captura tiene asociado como pin de entrada/salida un pin del puerto P1.
Ubicacin
P1.2 P1.3 P1.4 P1.5 P1.6 P1.7/A17
281
Cuando un mdulo de comparacin/captura, que est programado en modo captura, detecta una transicin en su entrada CEXx, se carga en los registros CCAPxH/ CCAPxL el valor actual de los registros del Timer del PCA. El objetivo de esta operacin es registrar el momento en que se produjo la transicin de la seal de entrada, con una resolucin equivalente a un perodo de reloj del Timer del PCA. Al producirse la captura, tambin se activa el flag de comparacin/captura CCFx del registro CCON. Por otra parte, si el bit de habilitacin de interrupcin del registro CCAPMx, ECCFx, est activo, el PCA realiza una peticin de interrupcin al microcontrolador. En la rutina de servicio a la interrupcin del PCA se debe borrar el flag de interrupcin activo y guardar el valor capturado en los registros CCAPxH/CCAPxL en la memoria RAM, ya que con la siguiente captura se reemplaza ese valor. Para configurar un mdulo del PCA en modo captura se debe programar adecuadamente el bit CAPPx (captura de flanco positivo), y CAPNx (captura del flanco negativo) del registro CCAPMx de dicho mdulo. En la tabla 10.5 se especifica el contenido de los registros CCAPMx y en la tabla 10.6 se indica el valor que deben tomar estos bits para programar los mdulos del PCA en las distintas configuraciones posibles. Por ejemplo, para capturar una transicin positiva se debe activar el bit CAPPx y borrar el bit CAPNx. Si se desea capturar una transicin negativa, el bit activo debe ser CAPNx, mientras que el bit CAPPx debe estar a cero. Si ambos bits estn a 1 lgico, se capturan flancos positivos y negativos.
Tabla 10.5 Registros de comparacin/captura del PCA
CCAPMx b7 --Bit
7 6
b6 ECOMx
b5 CAPPx
b4 CAPNx
b3 MATx
Mnemnico
--ECOMx
Funcin
Reservado. Este bit no se puede utilizar. Modos de comparacin. Cuando este bit est a 1 lgico se habilita el comparador del mdulo. Este comparador se utiliza para generar un Timer, salidas de alta velocidad, un modulador de anchura de pulso o un temporizador watchdog. Modo captura positiva. Cuando este bit est a 1 lgico, habilita la captura de flancos positivos en la entrada externa CEXx. Modo captura negativa. Cuando este bit est a 1 lgico, habilita la captura de flancos negativos en la entrada externa CEXx. Si se pone este bit a 1 lgico, se habilita el flag de interrupcin del mdulo cuando se activa el comparador. Conmutacin. CuandoTOGx=1, estando el comparador habilitado, la salida CEXx conmuta de valor cada vez que se activa el comparador. Modo PWM. Cuando PWMx=1 se configura el mdulo como modulador de anchura de pulsos con 8 bits de resolucin y con salida por el pin CEXx. Habilitacin de interrupciones. Este bit habilita las interrupciones generadas al activarse el comparador del mdulo.
5 4 3 2 1 0
Modo
Sin operacin Captura con el flanco positivo de la entrada CEXx Captura con el flanco negativo de la entrada CEXx Captura con el flanco positivo o negativo de la entrada CEXx Comparacin: software Timer Comparacin: salida de alta velocidad Comparacin: PWM de 8 bits Comparacin: watchdog en el mdulo M4
Ejemplo 10.1 Funcionamiento del PCA en modo captura En este ejemplo se trata de medir el desfase entre dos seales senoidales, Va(t) y Vb(t), de igual frecuencia pero de distinta fase, utilizando dos mdulos del PCA programados para capturar flancos positivos. En la figura 10.3 se muestra el esquema del montaje propuesto para medir el desfase. Este esquema incorpora dos comparadores que digitalizan dos seales senoidales con una precisin de 1 bit. La salida de los comparadores se aplica a la entrada de los mdulos 0 y 1 del PCA, CEX0 y CEX1, respectivamente. La salida del comparador vale 1 lgico cuando la seal de entrada es positiva y 0 lgico cuando es negativa.
8XC251Sx
Va(t)
Comparador
+
Vb(t) +
CEX0
Desfase
CEX1
Los mdulos 0 y 1 del PCA trabajan en modo captura de flanco positivo, de forma que capturan el valor de los registros del Timer del PCA cuando la entrada correspondiente pasa por un flanco positivo. Midiendo el tiempo transcurrido entre el flanco de subida en la entrada CEX0 y el flanco de subida en la entrada CEX1 y, conociendo la frecuencia de la seal de reloj y el perodo de las seales Va(t) y Vb(t), se puede determinar, en grados, el retardo entre ambas seales. El perodo de la seal de entrada se obtiene realizando la diferencia entre los valores capturados por el mdulo 0 en dos flancos de subida consecutivos. Para simplificar el programa que controla esta aplicacin se puede considerar que el perodo de las seales de entrada es inferior a la mitad del tiempo que tarda el Timer del PCA en sufrir
283
desbordamiento, teniendo en cuenta que el reloj de entrada del Timer es FOSC/4 y FOSC=16MHz. El programa de control de la aplicacin estar compuesto por un programa principal de configuracin e inicializacin de perifricos y por una rutina de servicio a la interrupcin del PCA. En el programa principal se incluye, en primer lugar, una instruccin que inicializa un contador de capturas del mdulo 0, que permite contabilizar las dos capturas necesarias para obtener el perodo de la seal. Asimismo, se deben programar adecuadamente los registros CCAPM0 y CCAPM1, para configurar los mdulos 0 y 1 del PCA en modo captura del flanco positivo; se deber inicializar el registro CMOD para seleccionar la entrada FOSC/4 como reloj del Timer del PCA; se deben poner a cero los registros de los mdulos 0 y 1 (CCAP0H/CCAP0L y CCAP1H/CCAP1L); y se deben habilitar los flags de interrupcin del Timer del PCA, y del mdulo 0, ubicados en el registro CCON. El flag de interrupcin de mdulo 1 se habilita en la rutina RSI del PCA, despus de que el mdulo 0 haya capturado el primer flanco. Finalmente, se pone en marcha el Timer del PCA, activando el bit CR del registro CCON, y se habilita la interrupcin del PCA en el registro de habilitacin de interrupciones. En la figura 10.4 se muestra cmo se deben programar los registros CCON y CMOD, segn las especificaciones del enunciado.
CCON
CF CR --CCF4 CCF3 CCF2 CCF1 CCF0
Puesta en marcha del Timer del PCA Borrado de los flags de interrupcin de los mdulos 0 y 1
CMOD
CIDL WDTE ------CPS1 CPS0 ECF
En la figura 10.5 se muestran los bits que hay que activar en los registros CCAPM0 y CCAPM1, para programar los mdulos 0 y 1 en el modo captura de flanco positivo.
PWM x ECCF0
Habilita el modo de captura de flanco positivo Habilita la interrupcin del mdulo 0 Fig. 10.5 Programacin de los registros CCAPM0 y CCAPM1
En la rutina RSI del PCA se debe determinar cul de los dos mdulos ha interrumpido y almacenar, en algn registro tipo Word, el valor capturado por ese mdulo. La siguiente interrupcin est generada necesariamente por una captura de flanco positivo del otro mdulo. El valor capturado en este caso se cargar en otro registro tipo Word. Finalmente, se deja que el primer mdulo vuelva a capturar otro flanco positivo. Realizando la diferencia entre ambos valores capturados, se determina el periodo de la seal (figura 10.6). Perodo Segundo flanco Primer flanco
Fig. 10.6 Medida del perodo de la seal
Teniendo el perodo y los valores de captura del primer flanco de ambos mdulos, es posible calcular el desfase entre ambas seales, que en grados vendr dado por: FP Vb[t ] FP Va [t ] 360 Periodo (10.1)
285
donde FPVb(t) es el valor de captura del primer flanco positivo de la seal Vb(t) y FPVa(t) es el valor de captura del primer flanco positivo de la seal Va(t). A continuacin se detalla el listado de la rutina de servicio a la interrupcin del PCA.
;---------------------------------------------------------------------------------------------------------; RUTINA DE SERVICIO A LA INTERRUPCIN DEL PCA ;---------------------------------------------------------------------------------------------------------ORG FF:0033H ; La rutina comienza en la direccin FF:0033H JMP FF:1000H ; Se salta a la direccin FF:1000H donde hay espacio de memoria ; suficiente para colocar el resto de instrucciones de la rutina. ORG FF:1000H ; JB CCF1,FP1 ; Si ha interrumpido el mdulo 1 se salta a FP1. CLR CCF0 ; Se borra el flag de interrupcin del mdulo cero. SETB ECCF1 ; Se habilita al mdulo 1 para interrumpir. INC R6,#1H ; Se incrementa el contador de capturas. CMP R6,#02H ; Si se han realizado dos capturas se inhibe la interrupcin del JE SAL1 ; mdulo 1 y se pasa a calcular el desfase. MOV R0,CCAP0H ; Se carga el contenido de los registros de comparacin/captura del MOV R1,CCAP0L ; mdulo 0 del PCA en el registro WR0. RETI ; Se retorna al programa principal SAL1:MOV R2,CCAP0H ; Se carga la segunda captura del mdulo 0 del PCA en el registro MOV R3,CCAP0L ; WR2. CLR ECCF0 ; Se inhiben futuras interrupciones del mdulo 0. MOV WR8,WR2 ; SUB WR8,WR0 ; Se calcula el perodo. MOV WR10,#360d ; Se carga el valor 360 en WR10. DIV WR8,WR10 ; Se divide el periodo entre 360 para determinar a cuantos ; incrementos del timer equivale a un grado. SUB WR4,WR2 ; Se obtiene el tiempo entre las dos capturas de las seales desfasadas. DIV WR4,WR10 ; Se obtiene el desfase en grados RETI ; Se retorna al programa principal. FP1: CLR CCF1 ; Se borra el flag de interrupcin del mdulo 1. CLR ECCF1 ; Se inhibe futuras interrupciones del mdulo 1. MOV R4,CCAP1H ; Se carga el contenido de los registros de comparacin/captura del MOV R5,CCAP1L ; mdulo 1 del PCA en el registro WR4. RETI ; Se retorna al programa principal.
Ejemplo 10.2 Medida del ancho de un pulso El PCA puede medir el ancho de un pulso digital capturando los flancos positivo y negativo del pulso (figura 10.7) y efectuando la diferencia entre el valor de las dos capturas. Si se conoce cul es el tipo de flanco que se produce primero, el PCA puede configurarse para capturar cualquiera de los flancos del pulso, tanto positivo como negativo. Por contra, si se desconoce este hecho se puede determinar qu flanco realizar la primera captura eligiendo el modo adecuado de funcionamiento del PCA. En este ejemplo se supone que el primer flanco que se produce es el flanco positivo.
W 87C51FA
P1.3/CEX0
1 Captura
2 Captura
286
La rutina para efectuar la medida del ancho del pulso se muestra a continuacin.
;************************************************************************ ; Rutina para la lectura del ancho de un pulso mediante el PCA ;************************************************************************ CAPTL EQU 20H ;Posicin para el byte bajo de la 1 captura CAPTH EQU 21H ;Posicin para el byte alto de la 2 captura ANCHOL EQU 22H ;Posicin para el byte bajo del ancho de pulso ANCHOH EQU 23H ;Posicin para el byte alto del ancho de pulso Orden_captura EQU 24H.0 ;Indicador de si ha sido la 1 o la 2 captura ORG 00H LJMP Inicio ORG 033H LJMP RSI_PCA ;************************************************************************ ; Inicio (En esta rutina slo se configura el PCA para la lectura del ancho) ;************************************************************************ Inicio: MOV CMOD, #0 ;Inicializa el temporizador del PCA MOV CL, #0 ;Se escoge una entrada de (1/12)xFosc MOV CH, #0 ;Borra los registros CL y CH MOV CCAPM0, #21H ;Configura el mdulo 0 para capturar el flanco positivo SETB EC ;Habilita la interrupcin del PCA SETB EA ;Activa el bit de habilitacin general SETB CR ;Pone en marcha el temporizador del PCA CLR Orden:_captura ;Borra el bit de orden de captura. Esta es la primera captura ;************************************************************************ ; Rutina de RSI del PCA ;************************************************************************ RSI_PCA: CLR CCF0 ;Borra el bit del mdulo 0 de comparacin/captura JB Orden_captura, Captura_2 ;Comprueba si se trata de la primera o segunda captura Captura_1: MOV CAPTL, CCAP0L ;Guarda el byte bajo de la captura MOV CAPTH, CCAP0H ;Guarda el byte alto de la captura MOV CCAPM0, #11H ;Configura el mdulo 0 para capturar el flanco negativo SETB Orden_captura RETI Captura_2: PUSH ACC ;Guarda el acumulador y el registro de estado en la pila PUSH PSW CLR C ;Borra el bit de acarreo para efectuar una resta de 16 bits MOV A, CCAP0L ;Lee el byte bajo de la 2 captura SUBB A, CAPTL ;Efecta la resta con el byte bajo de la 1 captura MOV ANCHOL ;Guarda resultado MOV A, CCAP0H ;Lee el byte alto de la 2 captura SUBB A, CAPTH ;Efecta la resta con el byte alto de la 1 captura MOV ANCHOH ;Guarda resultado MOV CCAPM0, #21H ;Configura el mdulo 0 para capturar el siguiente flanco + CLR Orden_captura POP PSW ;Recupera el PSW de la pila POP ACC ;Recupera el acumulador de la pila RETI
En esta rutina se utiliza el mdulo 0 para realizar la captura de los flancos, positivo y negativo, del pulso. Para ello, primero se pone el dato 21H en el registro CCAPM0, lo que configura al mdulo para una captura del flanco positivo, poniendo los bits CAPP0 y ECCF0, de captura positiva y de habilitacin de interrupcin, respectivamente, a 1 lgico. Y, luego, al efectuarse esta captura, se pone el dato 11H en CCAPM0, que configura al mdulo para una posterior captura del flanco negativo (bits CAPN0 y ECCF0 a 1 lgico).
287
Al producirse la primera captura del flanco positivo de la seal, en la rutina de atencin a la interrupcin del PCA, RSI_PCA, los registros CCAP0L y CCAP0H del mdulo se almacenan en las posiciones 20H y 21H, respectivamente, de la memoria RAM interna. Cuando se realiza la segunda captura, el valor de estos registros se recupera de la memoria interna para efectuar una resta de 16 bits con el valor actual de la captura. De esta forma, el valor de la diferencia entre las capturas es el valor de 16 bits del ancho del pulso a medir, y se guarda en las posiciones 22H y 23H de la memoria RAM interna. Para que la aplicacin funcione correctamente en los registro CL y CH no debe producirse un desbordamiento, puesto que el programa no considera esta posibilidad.
10.3.2 Modos de comparacin Los modos de comparacin permiten a los mdulos del PCA operar como temporizadores, como contadores, o bien, como moduladores de anchura de pulsos, PWM. El funcionamiento del mdulo, en estos modos, est basado en el comparador de 16 bits que incorpora cada mdulo, cuya funcin ser bsicamente la de comparar el contenido de los registros de comparacin/captura con los registros del Timer del PCA, y activar su salida cuando los contenidos de ambos registros sean iguales. En total hay cuatro modos de comparacin: modo temporizador por software de 16 bits, modo de salida de alta velocidad, modo de temporizador watchdog y modo PWM. Para que un mdulo del PCA funcione en alguno de los modos de comparacin se debe llevar a cabo el siguiente procedimiento general: 1. 2. 3. 4. 5. 6. Poner a 1 lgico el bit ECOMx del registro CCAPMx, correspondiente al mdulo que deseamos programar en algn modo de comparacin (tablas 10.3 y 10.4). Programar adecuadamente el resto de bits del registro CCAPMx para seleccionar el modo concreto de funcionamiento. Seleccionar la seal de entrada del Timer del PCA. Cargar el valor de comparacin en los registros de comparacin/captura del mdulo. Poner a 1 lgico el bit de puesta en marcha del Timer del PCA. Poner a cero el flag de interrupcin del mdulo de comparacin/captura una vez activo.
a) Modo temporizador de 16 bits Para trabajar en este modo se ponen a 1 lgico los bits ECOMx y MATx del registro CCAPMx (tabla 10.6). En este modo de funcionamiento, el comparador que incorpora el mdulo compara el contenido de los registros de comparacin/captura con el contenido de los registros del Timer del PCA. Cuando el contenido de estos registros coincide, se activa el flag de interrupcin del mdulo, CCFx, ubicado en el registro CCON. Si el bit de habilitacin de interrupcin del mdulo est activo se produce una peticin de interrupcin. En la figura 10.8 se muestra el esquema de bloques, correspondiente a los modos de funcionamiento de temporizador de 16 bits y de salida de alta velocidad.
288
Mdulo de comparacin y captura CCAP xH CCAP xL
Comparador de 16 bits
CCF x CCON X 7 0 Reset Escribir CCAP xL 1 Escribir CCAP xH ECOM x 0 0 MAT x TOG x 0
b) Modo de salida de alta velocidad En este modo de funcionamiento, se genera una seal binaria de salida a travs del pin CEXx, asociado al mdulo, que conmuta de valor cada vez que se activa el comparador del mdulo (figura 10.8). La conmutacin de este pin es independiente de la atencin a la interrupcin. Esto permite dar una respuesta ms rpida y precisa a la activacin del comparador. Para programar un mdulo en este modo de funcionamiento se deben poner a 1 lgico los bits ECOMx, MATx, y TOGx del registro CCAPMx (tabla 10.6). c) Modo temporizador watchdog El temporizador watchdog, WDT, tiene como funcin generar un reset del microcontrolador si no se inicializan de forma regular sus registros. El WDT se utiliza en aplicaciones sometidas a fenmenos que pueden inducir al microcontrolador a ejecutar errneamente el programa, como son el ruido elctrico, derivas instantneas de la tensin de alimentacin, descargas elctricas, etc. Los microcontrolador de la serie 8XC251Sx disponen de dos WDT: uno de 14 bits y otro de 16 bits, que es una opcin de funcionamiento del mdulo 4 del PCA. Cuando el Timer del PCA alcanza el valor cargado en los registros de comparacin/captura del mdulo 4, se genera un reset del microcontrolador, que tiene el mismo efecto que un reset externo. Para programar el mdulo 4 como WDT, se ponen a 1 lgico los bits ECOM4 y MAT4 del registro CCAPM4 y el bit WDTE del registro CMOD; tambin debe seleccionarse la entrada del Timer del PCA, programando los bits CPS0 y CPS1 del registro CMOD. El valor de comparacin se carga en los registros CCAP4H/CCAP4L, aunque, si se desea, tambin se puede cargar un valor inicial distinto de cero en los registros del Timer del PCA, CH/CL. La diferencia entre estos valores multiplicada por
289
el perodo de reloj de entrada del Timer del PCA, determina el tiempo que tarda el WDT en generar un reset, si no se realiza ninguna accin que lo evite, como por ejemplo: 1. 2. 3. Cambiar peridicamente el valor de los registros CCAP4H/CCAP4L antes de que se active el comparador. Cambiar repetidamente el contenido del temporizador del PCA antes de que alcance el valor del mdulo 4. Inhibir la salida del mdulo 4 poniendo a cero el bit WDTE = 0 antes de que se active el comparador y habilitarlo de nuevo despus de que se halle activado.
La segunda opcin no es recomendable cuando se utilizan otros mdulos del PCA, pues el temporizador del PCA es la base de tiempos de todos los mdulos y su cambio afectara al funcionamiento del resto de los mdulos. La tercera opcin puede ser poco conveniente, pues podra ocurrir un error en la ejecucin del programa cuando se tuviese inhibido el mdulo 4, de manera que el watchdog no intervendra y la situacin no se solucionara. La primera opcin es la ms viable debido a que no se inhabilita el watchdog, pero se debe cambiar peridicamente el contenido de CCAP4H/CCAP4L por el programa para actualizar el watchdog. En la siguiente rutina se muestra la inicializacin del PCA para utilizar el mdulo 4 como watchdog en un microcontrolador 8XC51FX:
;************************************************************************ ; Rutina de inicializacin del mdulo 4 en modo watchdog para 8XC51FX ;************************************************************************ INI_WATCHDOG: MOV CCAPM4, #4CH ;Mdulo en modo de comparacin MOV CCAP4L, #0FFH ;Se escribe primero en el byte bajo del mdulo MOV CCAP4H, #0FFH ;Los valores de comparacin se deben cambiar ;antes de que el temporizador del PCA llegue a ;desbordamiento, es decir, a FFFFH ORL CMOD, #40H ;Activa el bit WDTE para habilitar el watchdog ;sin tener que afectar al resto de bits de CMOD
A continuacin se muestra la subrutina, para un microcontrolador 8XC51FX, que permite actualizar los registros del mdulo 4 del PCA:
;************************************************************************ ; Subrutina de refresco del watchdog del PCA para 8XC51FX ;************************************************************************ WATCHDOG: CLR EA ;Inhabilita las interrupciones MOV CCAP4L, #0 ;Borra el byte bajo, de forma que la prxima comparacin MOV CCAP4H, CH ;est dentro de 255 incrementos del PCA SETB EA ;Habilita las interrupciones RETI
En la figura 10.9 se muestra el diagrama de bloques del mdulo 4 cuando est programado como WDT.
290
Mdulo de comparacin y captura CCAP4H CCAP4L
ECOM4
X 0
c) Modo PWM Los cinco mdulos de comparacin/captura pueden programarse independientemente en modo PWM. La seal PWM est disponible en la salida CEXx, con una resolucin de ancho de pulso de 8 bits. Para programar un mdulo del PCA en modo PWM se deben activar los bits ECOMx y PWMx del registro CCAPMx. En este modo de funcionamiento, se compara el registro CL del Timer del PCA con el registro CCAPxL. Cuando CL es menor que CCAPxL, la salida CEXx es un 0 lgico. Para valores de CL mayores o iguales que CCAPxH, la salida permanece a 1 lgico hasta que el registro CL sufre desbordamiento y vuelve, automticamente, a 0 lgico. En ese momento se recarga el registro CCAPxL con el contenido del registro CCAPxH, empezando, as, un nuevo perodo de la seal PWM (figura 10.10). El ciclo de trabajo de la seal PWM se controla mediante el valor almacenado en el registro CCAPxL, mientras que el valor del registro CCAPxH proporciona el ciclo de trabajo del siguiente perodo. Cargando el valor adecuado en el registro CCAPxH se puede variar el ciclo de trabajo desde un 0.4%, para un valor de 255, hasta el 100%, para un valor de 0. En la figura 10.11 se muestran las seales PWM obtenidas para distintos valores del registro CCAPxL. La frecuencia de la seal PWM generada en este modo de funcionamiento es igual a la frecuencia de la seal de entrada del temporizador del PCA dividida por 256. La mayor frecuencia de entrada del Timer es FOSC/4, que da lugar a una frecuencia de seal PWM de 15.6kHz, considerando una frecuencia de reloj de 16MHz.
291
CCAPxL X=01 x = 0, 1, 2, 3, 4 8 8 0 CL < CCAPxL Comparador de 8 bits CL CCAPxL Habilitacin 1 CEXx CL (8 bits)
X 7
ECOMx
PWMx
0 0
Seal PWM
Ejemplo 10.3 Generador de seal programable En este ejemplo se debe controlar la frecuencia de trabajo de un generador de seal realizado mediante un oscilador controlado por tensin, VCO, y el mdulo 0 del PCA trabajando en modo PWM. El VCO genera en su salida un seal cuya frecuencia es proporcional a la tensin de entrada, en concreto:
f o Vi
256 (kHz) 5
(10.2)
292
En la figura 10.12 se muestra el esquema de esta aplicacin: se observa que se ha conectado la entrada de tensin del VCO a la salida CEX0 del mdulo 0 a travs de un filtro paso-bajo.
8XC251Sx
R
CEX0
VCO
Vi
C
fo
La tensin de entrada del VCO es el resultado de filtrar la seal de salida PWM generada por el mdulo 0. Si la seal PWM tiene una frecuencia suficientemente alta respecto a la frecuencia de corte del filtro paso-bajo, la tensin de salida del filtro, Vi, ser prcticamente constante, y su valor igual a la componente continua de la seal PWM generada (figura 10.13).
T Ta
Va
C
Fig. 10.13 Seal PWM filtrada
Vi=Va Ta/T
Si se considera que el margen dinmico de la salida CEX0 est entre 0 y 5V, y teniendo en cuenta que el ciclo de trabajo de la seal PWM oscila entre 0.004 y 1, la frecuencia generada por el VCO estar comprendida entre 1kHz, para un ciclo de trabajo de 0.004, y 256kHz, para un ciclo de trabajo de 1, con una resolucin de 1kHz. El programa asociado a la aplicacin debe incluir instrucciones que configuren adecuadamente el registro CCAPM0 para que el mdulo 0 del PCA trabaje en modo PWM, que programen el registro CMOD para seleccionar la entrada FOSC/4 como reloj del Timer del PCA, e instrucciones que inicialicen los registros CCAP0H y CCAP0L para obtener el ciclo de trabajo deseado. Teniendo en cuenta la expresin 10.2, el valor cargado en el registro CCAP0H es, directamente, el valor de frecuencia en kHz, que se obtendr a la salida del VCO. Finalmente, se pone en marcha el Timer del PCA activando el bit CR del registro CCON. A continuacin se detallan las instrucciones del programa principal de esta aplicacin.
;---------------------------------------------------------------------------------------------------------; PROGRAMA DEL GENERADOR DE FRECUENCIA ;---------------------------------------------------------------------------------------------------------ORG FF:0000H ; El programa comienza en la direccin FF:0000H JMP FF:2000H ; Se salta a la direccin FF:2000H donde hay espacio de memoria ; suficiente para colocar el resto de instrucciones del programa. ORG FF:2000H ; SETB ECCM0 ; Se programan adecuadamente los bits del registro CCAPM0 SETB PWM0 ; para que el mdulo cero trabaje en modo PWM. CLR CAPP0 ;
10 El array de contadores programables (PCA) CLR CAPN0 ; CLR MAT0 ; CLR TOG0 ; CLR ECCF0 ; MOV CCAP0L,#5H ; Se carga en los registros CCAP0H y CCAP0L el valor de la MOV CCAP0H,#5H ; frecuencia que se desea generar (por ejemplo 5kHz). MOV CL,#00H ; Se inicializa a cero el timer del PCA. MOV CH,#00H ; SETB CR ; Se pone en marcha el timer del PCA.
293
Ejemplo 10.4 Medida de frecuencia La medida de la frecuencia de una seal digital (figura 10.14) se puede efectuar con el PCA del microcontrolador. Para ello, es necesario medir el tiempo T de duracin de un tren de N pulsos de la seal digital. El mdulo de captura del PCA se debe configurar para capturar los flancos positivos, de forma que cada captura se producir con cada nuevo pulso de la seal. T 87C51FA
P1.3/CEX0
Captura 1
Captura N
T = Tpo (Captura 1)-Tpo (Captura N) Fig. 10.14 Medida de la frecuencia de una seal con el 87C51FA
La frecuencia de la seal se obtiene dividiendo el nmero N de capturas por el tiempo T transcurrido: Frecuencia N Nmero de capturas T Tiempo (10.3)
La rutina para la medida de la frecuencia se muestra a continuacin, donde se supone que la duracin T del tren de N pulsos es menor que el tiempo de desbordamiento del temporizador del PCA.
;************************************************************************ ; Rutina para la medida de la frecuencia de una seal mediante el PCA ;************************************************************************ CAPTL EQU 20H ;Posicin para el byte bajo de la 1 captura CAPTH EQU 21H ;Posicin para el byte alto de la 2 captura PERIODOL EQU 22H ;Byte bajo del tiempo T PERIODOH EQU 23H ;Byte alto del tiempo T NUM_CAP EQU 24H ;Determina el nmero de capturas a realizar FLANCO EQU 25H.0 ;Bit que indica si es la primera captura en efectuarse ORG 00H LJMP Inicio ORG 033H ;Vectorizacin del PCA LJMP RSI_PCA
294
Microcontroladores MCS-51 y MCS-251 ;************************************************************************ ; Inicio (En esta rutina slo se configura el PCA para la medida de la frecuencia) ;************************************************************************ Inicio: MOV CMOD, #0 ;Inicializa el temporizador del PCA MOV CL, #0 ;Se escoge una entrada de (1/12)xFosc MOV CH, #0 ;Borra los registros CL y CH MOV CCAPM0, #21H ;Configura el mdulo 0 para capturar el flanco positivo SETB EC ;Habilita la interrupcin del PCA SETB EA ;Activa el bit de habilitacin general SETB CR ;Pone en marcha el temporizador del PCA MOV NUM_CAP, #10 ;Determina el nmero de capturas a efectuar = a 10 pulsos CLR FLANCO ;Borra el bit de indicacin de la primera captura ;************************************************************************ ; Rutina de RSI del PCA ;************************************************************************ RSI_PCA: CLR CCF0 ;Borra el bit del mdulo 0 del comparacin/ captura JB FLANCO, CAPT_SIG ;Comprueba si es la primera captura CAPT_1: MOV CAPTL, CCAP0L ;Guarda el byte bajo de la primera captura MOV CAPTH, CCAP0H ;Guarda el byte alto de la primera captura SETB FLANCO ;Pone a 1 lgico para el resto de las capturas RETI CAPT_SIG: DJNZ NUM_CAP, Salir ;Mientras no llegue a 10 pulsos salir PUSH ACC ;Guarda ACC y PSW en la pila PUSH PSW CLR C ;Borra el bit de acarreo MOV A, CCAP0L ;Lee el byte bajo de la captura N, para resta de 16 bits SUBB A, CAPTL ;Resta con el byte bajo de la primera captura MOV PERIODOL, A ;Guarda el resultado MOV A, CCAP0H ;Lee el byte alto de la captura N SUBB A, CAPTH ;Resta con el byte alto de la primera captura MOV PERIODOH, A ;Guarda el resultado MOV NUM_CAP, #10 ;N de capturas a efectuar para la siguiente medida CLR FLANCO ;Borra bit para la siguiente medida POP PSW ;Recupera ACC y PSW POP ACC Salir: RETI
En esta rutina no se incluye la divisin de N por el valor T obtenido. sta es una divisin de 16 bits que se puede realizar mediante la rutina DIV16 del apartado 5.7. Ejemplo 10.5 Medida del ciclo de trabajo de una seal PWM El ciclo de trabajo de una seal de modulacin de anchura de pulso, PWM, se determina por la relacin existente entre el tiempo que la seal permanece a 1 lgico, TON, y el perodo T de la seal. Por tanto, para calcular el ciclo de trabajo deben medirse estos tiempos, por lo que se debe configurar el mdulo de captura del PCA para que capture tanto los flancos positivos como los flancos negativos de la seal. T
TON
87C51FA
P1.3/CEX0
Captura 1
Captura 3 Captura 2
Fig. 10.14 Medida del ciclo de trabajo de una seal PWM mediante el 87C51FA
295
La seal PWM tiene un perodo T constante que determina su frecuencia (figura 10.14). El ciclo de trabajo de la seal viene dado por la relacin:
Ciclo de trabajo TON T
(10.4)
Para efectuar la medida de TON y TOFF se deben realizar tres capturas dentro de un mismo perodo (figura 10.14). Con la diferencia entre la captura 2 y la captura 1 se mide el tiempo TON, y con la diferencia entre la captura 3 y la captura 1 se determina el perodo T de la seal, de forma que para calcular el ciclo de trabajo se debe realizar la siguiente divisin:
Ciclo de trabajo TON T po (Captura 2) T po (Captura 1) T T po (Captura 3) T po (Captura 1)
(10.5)
;************************************************************************ ; Rutina para la medida del ciclo de trabajo de una seal PWM ;************************************************************************ CAPTL EQU 20H ;Posicin para el byte bajo de la 1 captura CAPTH EQU 21H ;Posicin para el byte alto de la 2 captura ANCHOL EQU 22H ;Byte bajo del tiempo TON ANCHOH EQU 23H ;Byte alto del tiempo TON PERIODOL EQU 24H ;Byte bajo del periodo de la seal T PERIODOH EQU 25H ;Byte alto del periodo de la seal T FLANCO1 EQU 26H.0 ;Bits de indicacin del tipo de captura (1, 2 o 3) FLANCO2 EQU 26H.1 ORG 00H LJMP Inicio ORG 033H ;Vectorizacin del PCA LJMP RSI_PCA ;************************************************************************ ; Inicio (En esta rutina slo se configura el PCA para la medida del ciclo de trabajo) ;************************************************************************ Inicio: MOV CMOD, #0 ;Inicializa el temporizador del PCA MOV CL, #0 ;Se escoge una entrada de (1/12)xFosc MOV CH, #0 ;Borra los registros CL y CH MOV CCAPM0, #21H ;Configura el mdulo 0 para capturar el flanco positivo SETB EC ;Habilita la interrupcin del PCA SETB EA ;Activa el bit de habilitacin general SETB CR ;Pone en marcha el temporizador del PCA CLR FLANCO0 CLR FLANCO1 ;************************************************************************ ; Rutina de RSI del PCA ;************************************************************************ RSI_PCA: CLR CCF0 ;Borra el bit del mdulo 0 del comparacin/ captura JB FLANCO1, CAPT_2 ;Comprueba si es el primer flanco positivo CAPT_1: MOV CAPTL, CCAP0L MOV CAPTH, CCAP0H SETB FLANCO1 MOV CCAPM0, #31H ;Bits CCAP0 y CCAPN a 1 lgico, captura RETI ;flanco positivo y negativo CAPT_2: PUSH ACC ;Guarda ACC y PSW en la pila PUSH PSW JB FLANCO2, CAPT_3 ;Comprueba si es la segunda captura CLR C ;Si es la segunda captura pasa a hacer la resta de 16 bits MOV A, CCAP0L ;Lee el byte bajo de la captura actual SUBB A, CAPTL ;Resta con el byte bajo de la primera lectura MOV ANCHOL, A ;Guarda resultado en ANCHOL
296
MOV A, CCAP0H SUBB A, CAPTH MOV ANCHOH, A SETB FLANCO2 POP PSW POP ACC RETI CLR C MOV A, CCAP0L SUBB A, CAPTL MOV PERIODOL, A MOV A, CCAP0H SUBB A, CAPTH MOV PERIODOH, A MOV CCAPM0, #21H CLR FLANCO1 CLR FLANCO2 POP PSW POP ACC RETI
Microcontroladores MCS-51 y MCS-251 ;Lee el byte alto de la captura actual ;Resta con el byte alto de la primera lectura ;Guarda resultado en ANCHOH ;Configura para la tercera captura ;Recupera ACC y PSW de la pila
CAPT_3:
;Pasa a efectuar la resta entre la 3 y la 1 captura ;Lee el byte bajo de la captura actual (3 captura) ;Resta con el byte bajo de la primera lectura ;Guarda resultado en PERIODOL ;Lee el byte alto de la captura actual (3 captura) ;Resta con el byte alto de la primera lectura ;Guarda resultado en PERIODOH ;Configura el mdulo para captura de flanco positivo ;Borra bit ;Borra bit ;Recupera ACC y PSW de la pila
En esta rutina falta efectuar la divisin de 16 bits entre las variables ANCHO y PERIODO, que se puede realizar mediante la rutina DIV16 del apartado 5.7.
297
1 2
Los filtros FIR son filtros digitales no recursivos, ampliamente tratados en la teora clsica del procesado de seal. A diferencia de los FIR, los filtros IIR son recursivos, es decir, con realimentacin de la salida del filtro.
298
expone la implementacin de varias tcnicas de conversin A/D de bajo coste, en las que se utilizan algunos de los recursos internos del microcontrolador.
MC1408
VREF (+)
VREF (-)
2mA Io COMP
Vo [0-10V]
VEE
RANGE GND
En el circuito de la figura 11.1, el diodo zener de 2.5V y las resistencias de 1.25k se emplean para establecer una fuente de corriente precisa de 2mA. La corriente Io de salida del convertidor D/A se convierte en tensin mediante el amplificador operacional, de manera que la tensin de salida de este amplificador es: Vo ] 2mA [ Entrada binaria [ 5k 256
Con esta frmula, la corriente a fondo de escala, es decir, con la palabra binaria con todos los bits a 1 lgico, es de 2mA; por tanto, la tensin mxima a fondo de escala ser de 10V. Este valor se puede modificar mediante la resistencia RT de realimentacin del amplificador operacional. El tiempo de respuesta del convertidor D/A es un parmetro que determina su mxima velocidad de
299
conversin; el MC1408DAC tiene un tiempo de establecimiento settling time de 300ns. Y, la resolucin del MC1408DAC, para el fondo de escala de 10V, es de 39.1mV, que equivale al incremento de la tensin de salida que se produce cuando el bit de menor peso de entrada del DAC cambia de valor.
+V I I/256 R I/256 2R D0
1
I/128 I/128 2R D1
1 0
I/4 I/4 2R D7
1 0
I/2 I/2 2R D8
1 0
2R
0
RT
Vo ] Io [ RT
Io ] Di [
i
I 28
i
Io
i ] 0,1,...,7
Ejemplo 11.1 Generacin de una senoide mediante el MC1408DAC En este ejemplo, se trata de realizar un programa para la MCS-51 con el circuito de la figura 11.1, que sea capaz de sintetizar una seal senoidal de 1.25kHz de frecuencia. Para ello, se debe tener en cuenta que la tensin de salida Vo del circuito es unipolar, y que se debe especificar un nmero de muestras de salida para que la seal tenga una forma adecuada. En este caso, se obtienen 32 muestras de la seal (figura 11.3), es decir, 16 muestras por cada semiperodo, para representar la seal senoidal.
V
10
7.5
2.5
La seal senoidal tiene una componente continua de 5V, de manera que su valor oscilar entre 0V y 10V, segn la siguiente expresin: Vo ] 5V ( 5V [ sin () donde es el ngulo de cada muestra de la senoide. En la tabla 11.1 se presenta el valor de cada una de las muestras de salida del convertidor D/A, en voltios, y el valor binario
300
correspondiente a la entrada del convertidor. En el programa de este ejemplo se debe implementar la tabla de datos, D7-D0, que debe extraer por el puerto del microcontrolador. El Timer 1, mediante interrupcin, determinar la base de tiempos de extraccin de los datos por el puerto P1. Para generar una frecuencia de 1.25kHz el peiodo de la seal debe ser de 0.8ms, y el de cada muestra de salida de 0.8ms/32, es decir, cada muestra se debe extraer cada 25)s. Este perodo se puede generar con el Timer 1, configurado en el modo 2 de 8 bits con autorrecarga. Con una frecuencia de reloj de 12MHz, y con el Timer contando pulsos internos, bit C/T a 0 lgico, se puede hacer que el Timer interrumpa cada 25)s, poniendo el registro TH1 al valor E7H, es decir, a la diferencia entre el valor de rebasamiento del Timer y 25)s (256)s-25)s).
Tabla 11.1 Valores de las muestras para la generacin de la seal senoidal formada por 32 muestras con una separacin de 11.25 cada una
0 11.25 22.5 33.75 45 56.25 67.5 78.75 90 101.25 111.5 123.75 135 146.25 157.5 168.75 sin( ) 0 0.195 0.382 0.555 0.707 0.831 0.923 0.980 1 0.980 0.923 0.831 0.707 0.555 0.382 0.195 Vo (V) 5 5.975 6.913 7.777 8.535 9.157 9.619 9.904 10 9.904 9.619 9.157 8.535 7.777 6.913 5.975 D7-D0 80H 99H B1H C7H DAH EAH F6H FDH FFH FDH F6H EAH DAH C7H B1H 99H 180 191.25 202.5 213.75 225 236.25 247.5 258.75 270 281.25 292.5 303.75 315 326.25 337.5 348.75 sin( ) 0 -0.195 -0.382 -0.555 -0.707 -0.831 -0.923 -0.980 -1 -0.980 -0.923 -0.831 -0.707 -0.555 -0.382 -0.195 Vo (V) 5 4.024 3.086 2.222 1.464 0.842 0.380 0.096 0 0.096 0.380 0.842 1.464 2.222 3.086 4.024 D0-D7 80H 67H 4FH 39H 25H 13H 08H 02H 00H 02H 08H 13H 25H 39H 4FH 67H
301
;************************************************************************ ; Rutina de servicio del Timer1 ;************************************************************************ RSI_Timer1:MOV A, R7 ;Pone R7 en A, (1)s). CALL Tab_Seno ;LLamada a subrutina de tabla, (2)s). MOV P1, A ;Pone dato ledo en A, (1)s). CJNE R7, #31, Borra ;Mira si el contador R7 supera su valor max., (2)s). INC R7 ;Incrementa contador R7, (1)s). RETI ;Fin de rutina. El bit TF1 se borra automticamente, (2)s). Borra: MOV R7, #0 ;Borra R7, (1)s). RETI ;Fin de rutina. El bit TF1 se borra automticamente, (2)s). Tab_Seno: INC A ;Incrementa ndice de lectura de la tabla, (1)s). MOVC A, @A+PC ;Lectura indexada de la tabla, (2)s). RET ;Retorno de subrutina, (2)s). DB 80H, 99H, B1H, C7H, DAH, EAH, F6H, FDH ;Tabla de datos DB FFH, FDH, F6H, EAH, DAH, C7H, B1H, 99H DB 80H, 67H, 4FH, 39H, 25H, 13H, 08H, 02H DB 00H, 02H, 08H, 13H, 25H, 39H, 4FH, 67H
La rutina principal de este ejemplo consiste en un bucle infinito sin ninguna funcin definida, puesto que la seal senoidal se genera totalmente por interrupcin. El registro R7 se utiliza como un contador entre 0 y 31, que ndica el orden del dato a leer en la tabla definida por la subrutina Tab_seno. Este contador se borra cada vez que se ha extrado la ltima muestra de la seal senoidal. Para determinar el instante preciso en el cual se extrae por el puerto P1 una muestra de la seal senoidal, se debe tener en cuenta el tiempo en que se genera la interrupcin, el tiempo en que tarda el microcontrolador en saltar a la rutina de RSI y el tiempo que tarda la rutina en poner el dato correspondiente en el puerto P1. El Timer 1 causa una interrupcin cada 31)s, el tiempo mnimo en saltar a la rutina de RSI es de 3 ciclos mquina, o sea, de 3)s para una frecuencia de reloj de 12MHz, y la rutina, para poner el dato ledo en el puerto, debe ejecutar seis instrucciones, lo que supone un tiempo de 8)s. En definitiva, desde que se produce la interrupcin hasta que la muestra aparece en el puerto P1 transcurren 11)s. Por tanto, cada muestra aparecer 11)s despus de que se produzca la interrupcin del Timer (figura 11.4).
Muestra 1 Muestra 2 Muestra n
11)s 16)s
Int. T1
Int. T1
Int. T1
Int. Timer 1
Int. T1
Una vez sacada la muestra por el puerto P1, la rutina de RSI puede tardar 2 3 instrucciones ms en terminar de ejecutarse por completo, lo que, en el peor caso, supone un tiempo de 5)s adicionales. En consecuencia, el tiempo en que se finaliza el proceso de interrupcin es de 16)s, por lo que la interrupcin del Timer 1 no puede producirse por debajo de este tiempo. Este hecho supone que, si se quiere modificar la frecuencia de la seal senoidal, el perodo de
302
cada muestra de la seal no puede ser inferior al proceso de interrupcin; es posible generar, para este caso, una seal senoidal con una frecuencia mxima de 1.953Hz. No obstante, esta frecuencia se puede disminuir reduciendo la cantidad de muestras de la seal, o bien aumentando la frecuencia de la seal de reloj del microcontrolador.
MC1408
1.25k
VREF (+)
VREF (-)
2mA
LF355
COMP
VEE
RANGE GND
P3.4 LM393
VIN
Fig. 11.5 Convertidor A/D de 8 bits de bajo coste mediante aproximaciones sucesivas
La tcnica de aproximaciones sucesivas se centra en la bsqueda binaria, por parte del microcontrolador, de un valor de tensin de entrada Vin desconocido, comparndolo, para ello, con valores conocidos de tensin, obtenidos a partir de un convertidor D/A y de una tensin de referencia Vref. Como el convertidor D/A y el circuito empleado en la figura 11.5 son los mismos, prcticamente, que en el apartado anterior, las tensiones mxima y mnima que se pueden generar en la salida Vo son 10V y 0V, respectivamente. El valor mximo se corresponde con la palabra digital 11111111 y el valor mnimo con 00000000 del puerto P1. La bsqueda binaria se inicia poniendo Vo a la mitad del fondo de escala, o sea, a (Vmax-Vmin)/2, por lo que en el puerto P1 se debe poner el bit ms significativo a 1 lgico y el resto de bits a 0 lgico (10000000)(figura 11.6). La tensin Vo generada por el D/A se compara con la seal Vin, de forma que la salida del comparador es 0 lgico si Vin es mayor que Vo (Vin>Vo), y 1 lgico si Vin en menor que Vo (Vin<Vo). El microcontrolador debe leer el estado de la comparacin, y si Vin es mayor que Vo, entonces le debe sumar a la tensin actual Vo la mitad del margen superior que queda hasta llegar al fondo de escala, es decir, (Vmax+Vo)/2, lo que se consigue poniendo a 1 lgico el bit 6 del puerto
303
P1 (P1=11000000). Si, al contrario, resulta que Vin es menor que Vo, entonces le debe restar a la tensin actual Vo la mitad del margen inferior que queda hasta llegar al mnimo de tensin, 0V, es decir, (Vo-Vmin)/2, lo que se consigue poniendo a 0 lgico el bit 7 y a 1 lgico el bit 6 del puerto P1 (P1=01000000). Este procedimiento se contina de forma sucesiva, hasta llegar a determinar el estado del bit 0 del puerto P1. La conversin de la seal se lleva a cabo de esta manera en tan slo 8 pasos, empezando por el bit ms significativo y terminando por el bit menos significativo. La figura 11.6 muestra el algoritmo que hay que realizar con la tcnica de aproximaciones sucesivas. En este algoritmo Vo(k) representa el valor de Vo actual y Vo(k+1) representa el valor de Vo futuro a realizar. La conversin finaliza en 8 iteraciones, de forma que, partiendo del inicio, si tomamos el bit ms significativo (MSB) como bit b(i), con i=7, se pueden dar dos situaciones en el algoritmo, dependiendo del resultado de la comparacin entre Vin y Vo. En el caso de que Vin sea mayor que Vo, Vin>Vo, se ejecuta la segunda ecuacin del algoritmo (ecuacin 2), que en realidad se lleva a cabo simplemente forzando el bit b(i-1) a 1 lgico, es decir, para este caso, poniendo el bit b(6) a 1 lgico. Al contrario, si Vin es menor que Vo, Vin<Vo, se ejecuta la primera ecuacin del algoritmo (ecuacin 1), que se lleva a cabo poniendo el bit b(i) a 0 lgico y el bit b(i-1) a 1 lgico, es decir, poniendo en este caso el bit b(7) a 0 lgico y el bit b(6) a 1 lgico. Este algoritmo se iterar hasta llegar a evaluar el bit b(0).
Inicio
Vin > Vo NO
Vo (k ( 1) ] Vo( k )
SI
Vo (k ) V mn 2
Vo(k ( 1) ] Vo(k ) (
V mx Vo(k ) 2
NO
304
El tiempo de conversin de esta rutina, depender del valor de la seal analgica Vin. No obstante, se pueden determinar el peor y mejor caso a ejecutar por la subrutina. El peor caso consistir en un valor de Vin que obligue la ejecucin de todas las instrucciones de la subrutina. Teniendo en cuenta un reloj de 12MHz para el microcontrolador, la subrutina tiene una primera instruccin que borra el puerto P1 y que tarda 2)s en ejecutarse. El resto de las instrucciones son una secuencia de puesta a 1 lgico, lectura del comparador y borrado, que tarda 4)s, es decir, 1)s para la puesta a 1 lgico, 2)s para la lectura del comparador y 1)s para el borrado. Esta secuencia se repite hasta ocho veces, por lo que el tiempo de conversin, en el peor de los casos, es:
tpeor ] 2 ( (1 ( 2 ( 1) [ 8 ( 2 ] 44)s
El mejor de los casos consiste en una seal Vin tal que no se ejecute ninguna de las instrucciones CLR, por lo que el tiempo de conversin es:
tmejor ] 2 ( (1 ( 2) [ 8 ( 2 ] 28)s
En consecuencia, con la subrutina mostrada y el circuito de la figura 11.5 el tiempo de conversin estar comprendido entre 28)s y 44)s.
305
Bus datos
D0-D7
Vcc +Vref
P0
A10 A11 S0 S1 S2
-Vref
LM336-5
MCS-51
Canal 0
A12
ADC0809
IN0 IN1 IN2 IN3 IN4 IN5 IN6 IN7 EOC GND
P2
/INT0
74LS04
CLOCK
1k
b
74LS04 680pF
Las salidas del convertidor A/D son triestadas, D0-D7, por lo que se pueden conectar directamente al bus de datos de un sistema microprocesador. El convertidor precisa de una tensin de referencia externa de 5V y de una seal de reloj comprendida entre 10kHz y 1280kHz. El tiempo de conversin del convertidor es de 64 perodos de reloj desde el momento en que se inicia la conversin, por lo que para una frecuencia de 640kHz el tiempo de conversin es de unos 100)s, aproximadamente, y de 50 )s para una frecuencia de 1280kHz. La figura 11.8 muestra el diagrama de bloques del convertidor, que est compuesto por un multiplexor analgico de 8 canales, un comparador, un registro de aproximaciones sucesivas (SAR), una escalera de resistencias R-2R y una serie de interruptores que actan sobre la escalera de resistencias.
306
START CLOCK
8 entradas analgicas
Registro de aproximaciones sucesivas (SAR) Buffer-latch triestado de salida Ramificacin de interruptores 8 bits de salida
Vcc
GND
+Vref
-Vref
OE
La figura 11.9 muestra el diagrama de tiempos del convertidor. El proceso de conversin del convertidor empieza poniendo la lnea de control ALE a 1 lgico, lo que hace que se carguen las direcciones S2-S0 en el latch interno de direcciones, seleccionando el canal analgico de entrada. Aplicando un pulso en la seal de START se inicia la conversin de la seal, se borran los registros internos del convertidor en el flanco de subida, y se inicia la conversin en el flanco de bajada. La seal EOC, End of Conversion, pasa a 0 lgico en los primeros 8 perodos de reloj desde el flanco de subida de la seal START, lo que indica el final de la conversin en el flanco de subida de EOC. Una vez producido este flanco, se puede leer el dato obtenido por la conversin, para lo cual debe aplicarse un pulso positivo a la seal OE, Output Enable, de forma que el dato se site en las 8 lneas del bus de datos. Las salidas del convertidor permanecen en estado triestado hasta que se pone el dato convertido en el bus de datos. Segn la figura 11.7, las salidas D0-D7 del convertidor se conectan directamente al bus de direcciones del microcontrolador, puerto P0. El inicio de la conversin se realiza aplicando un pulso en las lneas START y ALE del convertidor. Estas entradas (figura 11.7) estn conectadas a las lneas A15, A14 y A13 del bus de direcciones, mediante dos puertas AND, de forma que estarn a 1 lgico slo cuando A15, A14 y A13 estn a 1 lgico. Al mismo tiempo, las lneas A12, A11 y A10 del bus de direcciones, estn conectadas a las entradas de seleccin del canal analgico, I2, I1 y I0, respectivamente. De esta forma, el inicio de la conversin en el convertidor y la seleccin del canal analgico pueden efectuarse situando una direccin concreta en el bus de direcciones, que se corresponda con los rangos de direcciones de la tabla 11.2.
307
Th
ESTABLE Tl Teoc
OE
Th2
Salidas D0-D7
TRIESTADO
DATO VLIDO
Segn la tabla 11.2, escribiendo cualquier dato en el bus de datos por medio de la instruccin MOVX y escogiendo el canal analgico de entrada con una de las direcciones de la tabla, puede iniciarse el proceso de conversin del convertidor. La seal EOC est conectada mediante una puerta inversora a la entrada de interrupcin /INT0 del microcontrolador; en consecuencia, el flanco de subida en EOC, que indica el final de conversin del convertidor, aparece como un flanco de bajada a la entrada de /INT0, que causar una interrupcin si /INT0 est habilitada por flanco descendente.
Tabla 11.2 Rango de direcciones del mapa de memoria para iniciar la conversin, junto con la seleccin del canal analgico de entrada y para la lectura del dato Rango de direcciones Funcin C000H-DFFFH Lectura del dato convertido E000H-E3FFH Inicio conversin, seleccin canal 0 E400H-E7FFH Inicio conversin, seleccin canal 1 E800H-EBFFH Inicio conversin, seleccin canal 2 EC00H-EFFFH Inicio conversin, seleccin canal 3 F000H-F3FFH Inicio conversin, seleccin canal 4 F400H-F7FFH Inicio conversin, seleccin canal 5 F800H-FBFFH Inicio conversin, seleccin canal 6 FC00H-FFFFH Inicio conversin, seleccin canal 7
La seal OE del convertidor est conectada tambin a dos puertas AND y a una puerta NOT, de manera que OE estar a 1 lgico si se sita una direccin con la combinacin 1, 1 y 0 lgicos, en las lneas A15, A14 y A13, respectivamente. En definitiva, el dato convertido se puede leer, en la rutina de RSI de /INT0, ejecutando una lectura en cualquiera de las direcciones comprendidas en el rango C000H-DFFFH, mediante la instruccin MOVX.
308
Ejemplo 11.2 Monitorizacin del estado de las bateras de un SAI Los equipos de alimentacin ininterrumpida, SAI, se utilizan para mantener la tensin de la red elctrica en los equipos informticos, en el caso de que se produzcan cortes repentinos de la red. Estos equipos tienen una serie de bateras que, en el caso de producirse un corte, aportan la energa necesaria para que, durante un intervalo de tiempo, sea posible cerrar los sistemas y guardar la informacin ms importante. El estado de las bateras se debe comprobar regularmente para poder detectar anomalas en el proceso de carga y descarga, e indicar el momento en el cual una batera es defectuosa. En este ejemplo se quiere utilizar un microcontrolador de la familia MCS-51 para monitorizar el estado de las bateras, es decir, para leer su valor y proporcionrselo al sistema de control del SAI, que suele llevarse a cabo por medio de un procesador digital de seal DSP. Segn la figura 11.10, el equipo SAI tiene un total de ocho bateras de 12V, que forman dos ramas de cuatro bateras cada una conectadas en paralelo, y que entrega la energa necesaria para mantener la tensin de la red elctrica en los equipos informticos. El microcontrolador debe leer la tensin de cada una de las bateras cuando la DSP se lo indique mediante la transmisin del carcter ASCII 05H va RS-232C. Una vez finalizada la lectura de todos los canales del A/D, el microcontrolador debe transmitir a la DSP la lectura 3 efectuada de cada batera va RS-232C; para ello debe transmitir el carcter 11H (XON ), que se tomar por la DSP como carcter de inicio de la transmisin, los datos correspondientes a la lectura efectuada en cada batera y el carcter 13H (XOFF) de final de transmisin. En el circuito de la figura 11.10 tan slo se utiliza una memoria EPROM de 2kbytes de capacidad para albergar el programa. No es necesario utilizar ningn circuito integrado de memoria RAM externa, pues se usa la memoria interna del microcontrolador. La memoria EPROM se selecciona mediante las lneas A12, A13, A14 y A15 del bus de direcciones, que estn conectadas a una serie de puertas AND (figura 11.10), que hacen que la memoria est seleccionada en el rango de direcciones comprendido entre 0000H y 0FFFH, o sea, en las primeras 4kdirecciones del mapa de memoria (figura 11.11); aparece, por tanto, una zona imagen en el rango [0800H-0FFFH] de 2kdirecciones. El convertidor A/D utiliza los mismos rangos de direcciones para el inicio de la conversin y para la seleccin del canal que los mostrados en la tabla 11.2. La rutina de monitorizacin utiliza el registro R7 como indicador del final de conversin del convertidor A/D. El tiempo de conversin del convertidor es de unos 100)s. La salida E0C del convertidor A/D (figura 11.10) est conectada a la entrada de interrupcin /INT0 del microcontrolador a travs de una puerta NOT. El final de la conversin se indica con un flanco
Para controlar el flujo en la comunicacin entre dos sistemas que procesan la informacin a distinta velocidad, es frecuente emplear el protocolo XON/XOFF, en el cual se utilizan los caracteres ASCII 11H (XON) y 13H (XOFF), para iniciar y para detener la transmisin, respectivamente. En este caso, XON y XOFF se usan para indicar el inicio y el final de la transmisin por parte del microcontrolador.
309
de subida en EOC, que aparece en /INT0 como un flanco de bajada y provoca una interrupcin. La rutina de RSI de /INT0 se limita a poner R7 al valor 01H, indicando de esta manera que la conversin ha terminado.
MCS-51
P0 RXD TXD A13 /INT0 ALE P2 /EA /PSEN
Latch
D74D0 74LS08 Q74Q0 A74A0 /CE d A12
74LS373
CLK A104A8 /OE
+5V
+ V1 _ + V2 _ + V3 _ + V4 _ + V5 _ + V6 _ + V7 _ + V8 _
+12V
IN0 IN1 Sensado y acondicionamiento de seal IN2 IN3 IN4 IN5 IN6 IN7 A10 A11 S0 S1 S2 EOC GND A la DSP
1.8k
ADC0809
OE
A12
CLOCK
RS-232C
Fig. 11.10 Convertidor ADC0809 y microcontrolador para la monitorizacin de las bateras de un equipo SAI
De la misma forma que R7, el registro R6 se emplea por la rutina de RSI del puerto serie para indicar que se ha recibido, va RS-232C, el carcter ASCII 05H, que corresponde a la orden de lectura del A/D. La rutina de RSI, al recibir este carcter, pone el registro R6 al valor 01H, para que en la rutina principal se proceda a la lectura de todos los canales del convertidor A/D. La rutina principal tiene un bucle de espera de recepcin, de la orden de lectura del convertidor A/D, que est pendiente del valor del registro R6. Cuando la rutina detecta que R6 se ha puesto a 01H, sta pasa a leer cada uno de los canales del convertidor A/D. Para ello, inicia la
310
conversin mediante la escritura con MOVX de cualquier dato en una de las direcciones de inicio y de seleccin de canal que aparece en la tabla 11.2. Luego, la rutina pasa a la espera del final de la conversin mediante un bucle que examina continuamente el estado del registro R7. Finalmente, la rutina pasa a leer el dato obtenido por el convertidor efectuando una lectura en la direccin C000H con la instruccin MOVX. Terminada la lectura de todos los canales, la rutina principal pasa a transmitir cada uno de los datos obtenidos a la DSP va RS-232C.
b)
Memoria de datos
0000H
Sin memoria
a) Memoria de programas
0000H
BFFFH
C000H Lectura dato (1k) DFFFH E000H Ini. y Canal 0 (1k) E3FFH E400H Ini. y Canal 1 (1k) E7FFH E800H Ini. y Canal 2 (1k) EBFFH EC00H Ini. y Canal 3 (1k) EFFFH F000H Ini. y Canal 4 (1k) F3FFH F400H Ini. y Canal 5 (1k) F7FFH F800H Ini. y Canal 6 (1k) FBFFH FC00H Ini. y Canal 7 (1k) FFFFH
EPROM (2 kbytes)
07FFH 0800H
Imagen (2 kbytes)
0FFFH 1000H
Sin memoria
FFFFH
Fig. 11.11 Mapa de memoria del circuito de la figura 11.10. a) Mapa de la memoria de programas. b) Mapa de la memoria de datos
La velocidad de transmisin de los datos es de 9.600 baudios; para ello se realiza la comunicacin asncrona del puerto serie en el modo 1, en el que se transmiten 10 bits: 1 bit de start, 8 bits del dato y 1 bit de stop. El Timer 1 del microcontrolador se utiliza como base de tiempos para la transmisin, por lo que debe estar configurado en el modo 2 de 8 bits con autorrecarga, con el bit C/T a 0 lgico, con el valor FDH de recarga en el registro TH1 y con 11.059MHz de frecuencia de reloj. El programa que realiza la monitorizacin de las bateras para la MCS-51 se muestra a continuacin:
;************************************************************************** ; Monitorizacin de las bateras de un SAI para la MCS-51 ;************************************************************************** ; Declaracin de variables ;************************************************************************** Conv_Canal_0 EQU #E000H ;Inicio de conversin y seleccin del canal 0 Conv_Canal_1 EQU #E400H ;Inicio de conversin y seleccin del canal 1 Conv_Canal_2 EQU #E800H ;Inicio de conversin y seleccin del canal 2 Conv_Canal_3 EQU #EC00H ;Inicio de conversin y seleccin del canal 3
311
Conv_Canal_4 EQU #F000H ;Inicio de conversin y seleccin del canal 4 Conv_Canal_5 EQU #F400H ;Inicio de conversin y seleccin del canal 5 Conv_Canal_6 EQU #F800H ;Inicio de conversin y seleccin del canal 6 Conv_Canal_7 EQU #FC00H ;Inicio de conversin y seleccin del canal 7 Lectura_AD EQU #C000H ;Lectura del A/D CA0 EQU 20H ;Direccin 20H de la memoria RAM interna CA1 EQU 21H ;Direccin 21H de la memoria RAM interna CA2 EQU 22H ;Direccin 22H de la memoria RAM interna CA3 EQU 23H ;Direccin 23H de la memoria RAM interna CA4 EQU 24H ;Direccin 24H de la memoria RAM interna CA5 EQU 25H ;Direccin 25H de la memoria RAM interna CA6 EQU 26H ;Direccin 26H de la memoria RAM interna CA7 EQU 27H ;Direccin 27H de la memoria RAM interna ;************************************************************************** ; Rutina de Vectorizacin ;************************************************************************** ORG 0H LJMP Inicio ORG 03H LJMP RSI_INT0 ORG 023H ;Vectorizacin del puerto de comunicacin serie LJMP RSI_RS ;************************************************************************** ; Rutina de Inicio ;************************************************************************** Inicio: SETB IT0 ;Interrupcin INT0 por flanco descendente SETB EX0 ;Habilita interrupcin INT0 SETB ES ;Habilita interrupcin del puerto de comunicacin serie SETB SM1 ;Configura la comunicacin serie en el modo 1 SETB REN ;Habilita la recepcin de un dato por el puerto serie MOV TMOD, #20H ;Timer 1 en Modo 2, GATE=0 y C/T=0 MOV TL1, #0FDH ;Valor de TL1, para velocidad de 9600 baudios MOV TH1, #0FDH ;Valor de recarga de Timer 1, para velocidad de 9600 baudios SETB EA ;Habilita bit de interrupcin general SETB TR1 ;Pone marcha el Timer 1 ;*************************************************************************** ; Rutina de Principal ; R7 se emplea como indicador de final de conversin. R7=1 Conversin finalizada. ;*************************************************************************** Principal: CJNE R6, #01, Principal ;Bucle de espera a que R6 sea igual a 01H MOV R6, #0 ;Borra R6 ACALL Lectura_AD ;Realiza la lectura del A/D SJMP Principal ;Bucle infinito ;************************************************************************** ; Rutina de servicio de INT0 ;************************************************************************** RSI_INT0: MOV R7, #01H ;Indica mediante R7 el final de la conversin RETI ;************************************************************************** ; Rutina de servicio del puerto serie ;************************************************************************** RSI_RS: JNB TI, Recibe ;Si no interrumpe TI, entonces es RI CLR TI ;Borra bit TI RETI Recibe: MOV A, SBUF ;Lee puerto serie CJNE A, #05H, Noesorden MOV R6, #01H ;Da la orden de lectura del A/D Noesorden: CLR RI ;Borra bit RI RETI
312
Microcontroladores MCS-51 y MCS-251 ;*************************************************************************** ; Subrutinas ;*************************************************************************** Lectura_AD:MOV R7, #0 ;Borra R7 para la lectura del canal 0 MOV DPTR, #Conv_Canal_0 ;Carga direccin canal en DPTR MOVX @DPTR, A ;Inicio conversin Canal 0 Espera_C0: CJNE R7, #01H, Espera_C0 ;Bucle de espera hasta final de conversin MOV DPTR, #Lectura_AD ;Carga direccin lectura en DPTR MOVX A, @DPTR ;Lee dato del A/D MOV CA0, A ;Guarda en la memoria interna, pos. 20H Canal_1: MOV R7, #0 ;Borra R7 para la lectura del canal 1 MOV DPTR, #Conv_Canal_1 ;Carga direccin canal en DPTR MOVX @DPTR, A ;Inicio conversin Canal 1 Espera_C1: CJNE R7, #01H, Espera_C1 ;Bucle de espera hasta final de conversin MOV DPTR, #Lectura_AD ;Carga direccin lectura en DPTR MOVX A, @DPTR ;Lee dato del A/D MOV CA1, A ;Guarda en la memoria interna, pos. 21H Canal_2: MOV R7, #0 ;Borra R7 para la lectura del canal 2 MOV DPTR, #Conv_Canal_2 ;Carga direccin canal en DPTR MOVX @DPTR, A ;Inicio conversin Canal 2 Espera_C2: CJNE R7, #01H, Espera_C2 ;Bucle de espera hasta final de conversin MOV DPTR, #Lectura_AD ;Carga direccin lectura en DPTR MOVX A, @DPTR ;Lee dato del A/D MOV CA2, A ;Guarda en la memoria interna, pos. 22H Canal_3: MOV R7, #0 ;Borra R7 para la lectura del canal 3 MOV DPTR, #Conv_Canal_3 ;Carga direccin canal en DPTR MOVX @DPTR, A ;Inicio conversin Canal 3 Espera_C3: CJNE R7, #01H, Espera_C3 ;Bucle de espera hasta final de conversin MOV DPTR, #Lectura_AD ;Carga direccin lectura en DPTR MOVX A, @DPTR ;Lee dato del A/D MOV CA3, A ;Guarda en la memoria interna, pos. 23H Canal_4: MOV R7, #0 ;Borra R7 para la lectura del canal 4 MOV DPTR, #Conv_Canal_4 ;Carga direccin canal en DPTR MOVX @DPTR, A ;Inicio conversin Canal 4 Espera_C4: CJNE R7, #01H, Espera_C4 ;Bucle de espera hasta final de conversin MOV DPTR, #Lectura_AD ;Carga direccin lectura en DPTR MOVX A, @DPTR ;Lee dato del A/D MOV CA4, A ;Guarda en la memoria interna, pos. 24H Canal_5: MOV R7, #0 ;Borra R7 para la lectura del canal 5 MOV DPTR, #Conv_Canal_5 ;Carga direccin canal en DPTR MOVX @DPTR, A ;Inicio conversin Canal 5 Espera_C5: CJNE R7, #01H, Espera_C5 ;Bucle de espera hasta final de conversin MOV DPTR, #Lectura_AD ;Carga direccin lectura en DPTR MOVX A, @DPTR ;Lee dato del A/D MOV CA5, A ;Guarda en la memoria interna, pos. 25H Canal_6: MOV R7, #0 ;Borra R7 para la lectura del canal 6 MOV DPTR, #Conv_Canal_6 ;Carga direccin canal en DPTR MOVX @DPTR, A ;Inicio conversin Canal 6 Espera_C6: CJNE R7, #01H, Espera_C6 ;Bucle de espera hasta final de conversin MOV DPTR, #Lectura_AD ;Carga direccin lectura en DPTR MOVX A, @DPTR ;Lee dato del A/D MOV CA6, A ;Guarda en la memoria interna, pos. 26H Canal_7: MOV R7, #0 ;Borra R7 para la lectura del canal 7 MOV DPTR, #Conv_Canal_7 ;Carga direccin canal en DPTR MOVX @DPTR, A ;Inicio conversin Canal 7 Espera_C7: CJNE R7, #01H, Espera_C7 ;Bucle de espera hasta final de conversin MOV DPTR, #Lectura_AD ;Carga direccin lectura en DPTR MOVX A, @DPTR ;Lee dato del A/D MOV CA7, A ;Guarda en la memoria interna, pos. 27H ACALL Trans_datos RET
11 Entradas y salidas analgicas Trans_datos: MOV SBUF, #11H MOV SBUF, CA0 MOV SBUF, CA1 MOV SBUF, CA2 MOV SBUF, CA3 MOV SBUF, CA4 MOV SBUF, CA5 MOV SBUF, CA6 MOV SBUF, CA7 MOV SBUF, #13H RET ;Caracter XON de inicio de transmisin ;Transmite dato canal 0 ;Transmite dato canal 1 ;Transmite dato canal 2 ;Transmite dato canal 3 ;Transmite dato canal 4 ;Transmite dato canal 5 ;Transmite dato canal 6 ;Transmite dato canal 7 ;Caracter XOFF de final de transmisin
313
Ejemplo 11.3 Control de la velocidad de un motor En esta aplicacin se debe controlar, mediante un sistema basado en el microcontrolador 8XC251, la velocidad de un motor de corriente continua de pequea potencia. En la figura 11.12 aparece el esquema general del sistema de control y de la planta a controlar. El microcontrolador 8XC251 est configurado con 16 lneas de bus de datos: RD1, RD0 = 10.
8XC251
DAC
Vo Motor Vi Tacmetro
ADC
El objetivo del control es mantener constante la velocidad del motor, independientemente de las condiciones de carga del mismo. Mediante un convertidor digital/analgico, DAC, de 8 bits se fija la tensin de alimentacin del motor. Conectado al eje del motor se encuentra otro motor que realiza funciones de tacmetro, generando una tensin proporcional a la velocidad de giro. A travs de un convertidor analgico/digital, ADC, de 8 bits, el microcontrolador adquiere la tensin que genera el tacmetro, determinando de este modo la velocidad de giro real del motor. El proceso de control que realiza el microcontrolador 8XC251 consiste en comparar la velocidad real del motor con la deseada, y modificar convenientemente la combinacin binaria aplicada al DAC para que ambas velocidades, la real y la deseada, se aproximen lo ms posible. a) Conexin del DAC al microcontrolador 8XC251 El DAC utilizado es el AD557 de Analog Devices (figura 11.13). El AD557 es un DAC de 8 bits que incorpora todos los elementos necesarios para conectarlo directamente a un microcontrolador. El AD557 dispone de un registro donde se escribe el dato de 8 bits que se debe convertir. Para escribir en este registro, basta aplicar el dato a las entradas de datos del convertidor (D0,...,D7), al mismo tiempo que se activan, a 0 lgico, las entradas /CS y /CE.
314
Vo
Para ahorrar pines de entrada/salida se puede conectar el convertidor DAC al microcontrolador como si de un integrado de memoria se tratase, adjudicndole una direccin o rango de direcciones dentro del mapa de memoria del sistema microcontrolador. En este caso, se direcciona el convertidor en la posicin de memoria externa 0032H. Para realizar la conversin de un dato, basta grabarlo en la direccin de memoria XX:0032H, donde XX simboliza cualquier regin del mapa de memoria disponible para el usuario: 00:, 01:, 02:, 03:, FC:, FD:, FE: o FF:. Teniendo en cuenta estas consideraciones, la conexin entre el microcontrolador y el DAC quedar como aparece en la figura 11.14.
8XC251
P0
A0 A1 A2 A3 A4 A5 A6 A7
ALE P2 WR
8
LATCH 8 BITS
En el esquema de la figura 11.14 se observa que se ha conectado la salida de escritura, /WR, del microcontrolador 8XC251, a la entrada de habilitacin del convertidor, /CE. Esto se ha hecho as, para que se active dicha entrada cuando el microcontrolador realice una operacin de escritura, y no de lectura. Por otra parte, se ha conectado la entrada de seleccin de integrado, /CS, a la salida de una puerta NAND, cuyas entradas, a su vez, estn conectadas a las lneas del bus de direcciones del microcontrolador. Tal y como se ha realizado la conexin, la salida de esta puerta NAND se activa, a 0 lgico, cuando en el bus de direcciones aparece la direccin 0032H, o sea, cuando el microcontrolador 8XC251 direcciona, para leer o escribir, la posicin de memoria 0032H. En definitiva, con la conexin realizada, para que se activen las entradas /CE y /CS del convertidor ser necesario que el microcontrolador realice una operacin de escritura en la direccin de memoria 0032H. Las siguientes instrucciones tienen como objetivo cargar un dato cualquiera denominado X, de 8 bits, en el DAC, escribiendo dicho dato en la direccin 0032H:
MOV R11,#XH MOV WR0,#0032H MOV @WR0,R11
315
b) Conexin del ADC al microcontrolador 8XC251 Para realizar la conversin analgico-digital de la tensin generada por el tacmetro se utiliza el ADC modelo AD673 de Analog Devices (figura 11.15). El AD673 es un convertidor de 8 bits que incorpora todos los elementos necesarios para conectarlo a un microcontrolador. Este dispositivo dispone de las siguientes seales: D0,..,D7: Salidas de datos triestadas. A travs de estas salidas podemos leer la combinacin binaria resultado de realizar la conversin de la tensin de entrada Vi procedente del tacmetro. /OE: Habilitacin de salida. La activacin de esta seal, a 0 lgico, nos permite leer el dato resultado de la conversin analgico-digital. C: Entrada de inicio de conversin. Para iniciar la conversin debemos aplicar un pulso a esta entrada, o sea, primero un 0 lgico, luego un 1 y, seguidamente, otro 0 lgico. /DR: Salida de Data Ready o dato vlido. Esta salida se activa, a 0 lgico, cuando el ADC finaliza la conversin. La activacin de esta salida indica al microcontrolador que ya ha terminado el proceso de conversin y que el dato vlido est disponible para ser ledo por el microcontrolador.
8 D0,..,D7 OE C DR
ADC AD673
Vi
En la figura 11.16 aparece el esquema elctrico simplificado de la conexin del 8XC251 al ADC. Las lneas de datos y la lnea /OE del AD673 estn conectadas convenientemente, a las lneas del microcontrolador 8XC251, para que la lectura del dato se realice cuando se ejecute una instruccin de lectura de la posicin 00:0200H de la memoria externa. Para realizar el control del ADC por interrupciones, se ha conectado la salida /DR del convertidor a la entrada /INT0 del microcontrolador, de forma que cuando finaliza la conversin se realiza una peticin de interrupcin al microcontrolador. En el programa principal de la aplicacin se incluyen instrucciones que configuran la interrupcin /INT0 para que sea activa por flanco descendente con un nivel de prioridad alto.
8XC251 P0 ALE
7
ADC AD673
Latch
OE Vi C DR
P2
P2.1 1
P1.0 INT0
316
En la rutina de servicio a la interrupcin /INT0 se incluyen las instrucciones que implementan el algoritmo de control de la velocidad de giro del motor. En el diseo de esta rutina se han considerado los siguientes aspectos: 1. El valor de la velocidad deseada est almacenado en la posicin 20H de la memoria RAM interna del microcontrolador. 2. El dato que proporciona el convertidor ADC es la velocidad real. Ambos valores, velocidad deseada y real, estn expresados en binario con 8 bits de precisin. 3. El valor que se graba en el convertidor DAC, y que fija la velocidad real actual del motor, est almacenado, inicialmente, en la posicin 30H de la memoria RAM interna. La RSI diseada debe leer el dato vlido que le proporciona el convertidor ADC, comparar ese dato a velocidad real con el valor de la velocidad ideal que est almacenado en la posicin 20H de la memoria RAM interna, y modificar el valor grabado en el DAC segn la siguiente estrategia: Si la velocidad real es mayor, como mnimo en dos unidades, que la velocidad ideal, se decrementar en una unidad la combinacin binaria aplicada al DAC. Si la velocidad real es menor, como mnimo en dos unidades, que la velocidad ideal, se incrementar en una unidad la combinacin binaria aplicada al DAC. En caso contrario no se modificar la combinacin binaria escrita en el DAC. La RSI tambin debe generar las seales adecuadas para que el convertidor ADC comience una nueva conversin. A continuacin se detallan las instrucciones del programa principal y de la RSI de la interrupcin /INT0:
;******************************************************************************** ; Control de la velocidad del motor DC ;******************************************************************************** ;Programa principal ORG FF:0000H ; El programa principal comienza en la direccin FF:0000H. JMP 0200H ; Para no interferir con la RSI de la interrupcin /INT0 se reubica a partir ORG FF:0200H ; de la direccin FF:0200H MOV TCON,#01H ; Configura /INT0 para que sea activa por flanco descendente. MOV IE,#81H ; Habilita la interrupcin externa cero. MOV IPH0,#01H ; Estas instrucciones programan la interrupcin INT0 MOV IPL0,#01H ; con nivel de prioridad mximo, nivel 3. ;******************************************************************************** ; RSI de la interrupcin /INT0 ;******************************************************************************** ORG FF:0003H ; La rutina de RSI de /INT0 comienza en la direccin FF:0003H. JMP FF:0100H ; Debido al tamao de la rutina de RSI se realiza salto a la ; direccin FF:0100H, donde se dispone de memoria libre. MOV WR0,#0200H ; Se carga en el registro palabra WR0 la direccin 0200H. MOV R11,@WR0 ; Pone en R11 el contenido de la direccin 0200H, que es dato convertido. CJNE A,20H,SIGUE ; Compara la velocidad real con la deseada (almacenada en dir. 20H) JMP FIN ; Si las velocidades son iguales salta a FIN y va al programa principal. SIGUE: JNC RESTA ; Salto a RESTA si la velocidad real es mayor que la deseada. MOV 22H,A ; Si la velocidad real es menor que la deseada, realizo la MOV A,20H ; diferencia entre la velocidad deseada y la velocidad real. CLR C ; SUB A,22H ; CJNE A,#02H,SIGUE2 ; Se compara la diferencia de velocidades con 2. JMP FIN ; Si la diferencia es igual a dos salta a FIN y va al programa principal.
11 Entradas y salidas analgicas SIGUE2: JC FIN ; Si la diferencia es menor que dos salta a FIN y retorna al programa principal, ; en caso contrario se debe aumentar la combinacin binaria aplicada al DAC ; (direc. 32H) y se salta a FIN para volver al programa principal. INC 30H ; Se incrementa la posicin de memoria 30H JMP CARGA ; Se salta a CARGA donde se cargar el incremento en la direccin 32H
317
RESTA: SUB A,20H ; Se hace la resta entre la velocidad real y la deseada. SIGUE2: CJNE A,#02H,SIGUE3 ; Se compara la diferencia con dos. JMP FIN ; Si la diferencia es igual a 2 el programa acaba SIGUE3 JC FIN ; Si la diferencia es menor que dos el programa acaba. DEC 30H ; Se decrementa el contenido de la posicin 30H. CARGA: MOV A,30H ; Se carga el resultado del decremento en el Acumulador. MOV DR0,#0032H ; Se carga el resultado en la posicin de memoria MOVH DR0,#0001H ; 01:0032H. MOV @DR0,R11 ; FIN: RETI ; Se retorna al programa principal.
En la figura 11.17 se presenta el diagrama de flujo de la rutina de servicio a la interrupcin externa cero, /INT0.
INICIO DE LA ISR DE INT0
RETI
RETI
318
Vmx
Fig. 11.18 Obtencin de una seal discreta Vo cuyo ancho de pulso w es proporcional al valor en un momento dado de la seal analgica Vin
Utilizando la seal en diente de sierra, la relacin entre el ancho de pulso w a medir y el valor de la seal analgica se puede deducir, fcilmente, de la figura 11.18, y viene dado por la expresin: w Vin (k ) ] Vmx 1 T (11.1)
donde Vin(k) es el valor de la seal analgica en el instante k, Vmx es el mximo valor de tensin que puede tomar la seal en diente de sierra, T es el perodo de la seal de diente de sierra y w es el ancho del pulso obtenido de la seal analgica. El ancho del pulso de la seal Vo se puede medir de forma precisa con el Timer 0 o con el Timer 1, debido a que la puesta en marcha y la parada de estos temporizadores puede efectuarse por medio de las entradas de interrupcin /INT0 y /INT1, respectivamente. Por ejemplo, para el Timer 0 poniendo el bit GATE del registro TMOD a 1 lgico y el bit TR0 del registro TCON a 1 lgico, el temporizador se pone en marcha cuando /INT0 est a 1 lgico y se detiene cuando est a 0 lgico (figura 7.1). De la misma forma, se puede gobernar al Timer 1 mediante la entrada /INT1, poniendo los bits GATE y TR1 a 1 lgicos.
MCS-51
/INT0
W Fig. 11.19 Lectura de ancho de un pulso a travs de /INT0 y del Timer 0 para la MCS-51
Las entradas /INT0 y /INT1 se pueden, adems, utilizar para generar una interrupcin que indique el final de la conversin, activando, para ello, las interrupciones por flanco descendente. Por ejemplo, para el Timer 0 (figura 11.19), el temporizador se pone en marcha cuando /INT0 est a 1 lgico y se detiene cuando /INT0 pasa a 0 lgico; pero, adems, el flanco descendente de /INT0 puede generar una interrupcin que se puede aprovechar como indicativo de final de conversin. El Timer puede llegar a desbordamiento cuando el ancho de los pulsos a medir sea de una valor considerable. En este caso, es conveniente que el Timer genere una interrupcin cuando llegue a desbordamiento, que permita contabilizar el nmero de desbordamientos producidos en la rutina de
319
RSI del Timer. La figura 11.20 muestra un pulso cuyo ancho causa varios desbordamientos en el Timer, hecho que determina la manera de calcular el valor medido.
Puesta en marcha Desbordamientos interrupcin del Timer Parada Interrupcin /INT0
64 k
64 k
64 k
Fig. 11.20 Pulso con un ancho que provoca varios desbordamientos del Timer
En este caso, considerando que el Timer tiene el bit C/T a 0 lgico, que est configurado en el modo 1 como temporizador/contador de 16 bits y que la frecuencia de reloj del microcontrolador es de 12MHz, el ancho de un pulso se puede determinar mediante la siguiente ecuacin: W ] M [ 65536 ( V )s (11.2)
donde M es el nmero de desbordamientos producidos en el Timer, V es el valor de la ltima lectura del Timer y 65.536 o FFFFH es el valor de desbordamiento del Timer. La precisin en la medida del ancho del pulso depender de la base de tiempos empleada por los Timers. Con C/T a 0 lgico (figura 7.1), y con una frecuencia de reloj de 12MHz, la precisin del temporizador es de un microsegundo. Con C/T a 1 lgico la precisin del Timer depender de la seal de reloj externa (terminales T0 para el Timer 0 y T1 para el Timer 1). Las rutinas de RSI del Timer 0 y de /INT0 se muestran a continuacin, para el caso de la figura 11.19, donde se desea medir el ancho w de un pulso que puede causar varios desbordamientos. En la rutina de RSI del Timer 0 se utiliza el registro R7 como contador del nmero de desbordamientos cometidos por este.
;************************************************************************ ; Rutina de Inicio ;************************************************************************ SETB IT0 ;Activa /INT0 por flanco descendente SETB EX0 ;Habilita interrupcin de /INT0 SETB ET0 ;Habilita interrupcin del Timer 0 SETB EA ;Habilita bit de interrupcin general MOV TMOD, #09H ;M1=0 y M0=1 (Modo 1), GATE=1 y C/T=0, para Timer 0. SETB TR0 ;Pone marcha el Timer 0 ;************************************************************************ ; Rutina de servicio del Timer 0 ;************************************************************************ RSI_Timer0:INC R7 ;Incrementa contador del n de desbordamientos RETI ;************************************************************************ ; Rutina de servicio de /INT0 ;************************************************************************ RSI_INT0: MOV R6, TH0 ;Lee byte alto del Timer 0 MOV R5, TL0 ;Lee byte bajo del Timer 0 MOV B, R7 ;Guarda R7 en registro B
320
MOV TH0, #0 MOV TL0, #0 MOV R7, #0 RETI
La rutina de inicio configura el Timer 0 en el modo 1 como temporizador/contador de 16 bits, contando pulsos internos de reloj (C/T = 0), y con el bit GATE a 1 lgico. La rutina de RSI del Timer0 tan slo contabiliza el nmero de desbordamientos de ste. La rutina de RSI de /INT0 guarda la ltima lectura del Timer en los registros R5 y R6 (figura 11.20), y a continuacin borra los registros del Timer. El valor del ancho del pulso W se debe obtener de la ecuacin (11.2); para ello, se debe multiplicar el registro B de 1 byte por el dato FFFFH de 2 bytes, y luego sumar al resultado el valor ledo de los registros TH0 y TL0 del Timer. Este clculo se puede hacer en la rutina de RSI de /INT0 o en cualquier otra parte del programa. Ejemplo 11.4 Conversin A/D por modulacin de anchura de pulsos utilizando los Timers 0 y 1 En la figura 11.21 se muestra un circuito de conversin analgico/digital con un microcontrolador de la familia MCS-51, que utiliza el Timer 0 para generar la forma peridica de la seal en diente de sierra, con un perodo Tm, y el Timer 1 para medir el ancho del pulso recibido a travs de la entrada de interrupcin /INT1.
S C Control interruptor S P1.0
Vcc
Rt
MCS-51
+ _
/INT1
Fig. 11.21 Circuito de conversin A/D mediante modulacin de anchura de pulsos con una seal en forma de diente de sierra, empleando un microcontrolador de la MCS-51
La seal en forma de diente de sierra se genera por medio del amplificador operacional, que hace de circuito integrador con reset, y por medio de la patilla P1.0 del microcontrolador que controla el cierre y la apertura del interruptor S. El integrador tiene una tensin negativa de entrada constante, -Vr, por lo que produce a la salida una tensin Vo positiva en forma de rampa (figura 11.22), cuya pendiente es proporcional a los valores de Vr, R, C y del tiempo de integracin Tm.
Vo ]
Vi RC
Vi T RC
m]
Vo ]
Vr [ T RC
(11.3)
T Fig. 11.22
321
La seal analgica Vin de entrada proviene de un sensor de temperatura ambiente cuyo margen de tensin est comprendido entre 0.1V, para -15C, y 5V, para 55C. El valor mximo de la tensin de salida del integrador, para adecuarse al margen de la seal analgica, debe ser algo mayor que 5V; en este caso se toma el valor de 5.1V. La seal analgica tiene una variacin temporal lenta, por lo que se toma una frecuencia de muestreo de 5 muestras por segundo, que es ms que suficiente para tener una representacin temporal adecuada de la seal. Para obtener esta frecuencia, el perodo de muestreo Tm ha de ser de 0.2s, por lo que, teniendo en cuenta que el Timer 0 llega a desbordamiento cada 64k pulsos de entrada, es decir, cada 65.536)s, el nmero de desbordamientos que debe tener el Timer es de:
N desbordamientos ] Tiempo 0,2s ] ] 3.051 65536)s 65536)s
Luego, es suficiente con hacer que el Timer 0 desborde tres veces para generar, de forma aproximada, la frecuencia de muestreo requerida. A partir de la ecuacin (11.3) se determina que con una tensin Vr negativa de 5V, una resistencia de 200k y un condensador de 980nF, la tensin mxima alcanzada por la rampa en 0.2s es de 5.1V, aproximadamente. El programa que realiza la conversin A/D por modulacin de anchura de pulsos para la MCS51 se muestra a continuacin:
;************************************************************************** ; Conversin A/D por modulacin de anchura de pulsos para la MCS-51 ;************************************************************************** ; Rutina de Vectorizacin ;************************************************************************** ORG 0H LJMP Inicio ORG 0BH LJMP RSI_Timer0 ORG 013H LJMP RSI_INT1 ORG 01BH LJMP RSI_Timer1 ;************************************************************************** ; Rutina de Inicio ;************************************************************************** Inicio:SETB IT1 ; Activa la interrupcin /INT1 por flanco descendente SETB EX1 ; Habilita interrupcin /INT1 SETB ET0 ; Habilita la interrupcin del Timer 0 SETB ET1 ; Habilita la interrupcin del Timer 1 SETB EA ; Habilita bit de interrupcin general MOV TMOD, #91H ; Timer 1 (Modo 1, GATE=1, C/T=0).Timer 0 (Modo 1, GATE=0, C/T=0) SETB TR0 ; Pone en marcha el Timer 0 SETB TR1 ; Pone en marcha el Timer 1 ;*************************************************************************** ; Rutina de Principal ;*************************************************************************** Principal: CJNE R3, #01, Principal ;Bucle de espera a que R6 sea igual a 01H MOV R3, #0 ;Borra R6 ACALL Calcula_w ;Realiza el clculo del ancho W del pulso SJMP Principal ;Bucle infinito
322
Microcontroladores MCS-51 y MCS-251 ;************************************************************************** ; Rutina de servicio de INT1 ;************************************************************************** RSI_INT1: MOV R6, TH1 ;Pone TH1 en R6 MOV R5, TL1 ;Pone TL1 en R5 MOV B, R7 ;Pone R7 en B MOV TH1, #0 ;Pone a cero el Timer 1 MOV TL1, #0 MOV R7, #0 ;Borra R7 MOV R3,#1 ;Indica con R3 el final de la lectura RETI ;************************************************************************** ; Rutina de servicio de Timer 0 (Cierra el interruptor S cada 3 desbordamientos del Timer 0) ;************************************************************************** RSI_Timer0: CJNE R4, #02H, Cont_S ;Si distinto a 02H va a Cont_S MOV R4, #0 ;Pone a cerro contador de desbordamientos SETB P1.0 ;Cierra el interruptor S (reset rampa) CLR P1.0 ;Abre interruptor S RETI Cont_S: INC R4 ;Incrementa contador (contador de 0 a 2) RETI ;************************************************************************** ; Rutina de servicio de Timer 1 ;************************************************************************** RSI_Timer1: INC R7 RETI ;*************************************************************************** ; Subrutina de clculo del ancho del pulso ; entrada: B=N de rebasamientos del Timer 1, R6=TH1 y R5=TL1 ;Salida: W= FFFFH x B + (TH1,TL1), R0=byte alto, R1=byte intermedio, R0=byte bajo ;*************************************************************************** Calcula_w: MOV A, B ;Pone B (rebasamientos Timer 1) en A MOV B, #FFH ;Pone FFH en B MUL AB ;Multiplica MOV R2, A ;Guarda A en R0 CLR C ;Borra bit de acarreo ADD A, B ;Suma A y B MOV R1, A ;Guarda resultado en R1 CLR A ;Borra A ADDC A, B ;Suma el acarreo anterior a B MOV R0, A ;Resultado R0=byte alto, R1=byte intermedio y ;R2=byte bajo CLR C ;Borra acarreo MOV A, R5 ;R6=TL1, pone TL1 en A ADD A, R2 ;Suma TL1 y R2 MOV R2, A ;Guarda resultado en R2 MOV A, R6 ;R6=TH1, pone TH1 en A ADDC A, R1 ;Suma TH1 y R1 con acarreo MOV R1, A ;Guarda resultado en R1 CLR A ;Borra A ADDC A, R0 ;Suma el acarreo a R0 MOV R0, A ;Guarda resultado en R0 RET
La rutina de RSI de /INT1 utiliza el registro R3 como indicativo de final de lectura del ancho del pulso w. El registro R3 se pone al valor 01H cuando se ha finalizado la lectura. La rutina principal est formada por un bucle de espera del final de la lectura. Este bucle, si detecta que R3 es igual a 01H, borra el registro y ejecuta la subrutina Calcula_w que efecta el clculo del ancho del pulso. La subrutina implementa la ecuacin (11.2) y tiene por entrada el nmero de
323
rebasamientos del Timer 1 en el registro B, el ltimo valor de TH1 en el registro R6 y el ltimo valor de TL1 en el registro R5. Las operaciones que efecta la subrutina Calcula_w se muestran en la figura 11.23. La subrutina Calcula_w, de acuerdo con la ecuacin (11.2), debe multiplicar el contenido del registro B por 65.536, o FFFFH. Esta multiplicacin se lleva a cabo en dos partes: una primera multiplicacin de B por FFH y una suma posterior de los resultados. La instruccin MUL AB slo se ejecuta una vez, puesto que el byte alto y el byte bajo del dato FFFFH son los mismos. El resultado de la suma, M0, M1 y M2 (figura 11.23), se almacena en los registros R0, R1 y R2, respectivamente. FFFFH xB C1 C2 C3 C4 M0 M1 M2 + TH1 TL1 S0 S1 S2
Fig. 11.23 Operaciones que realiza la subrutina Calcula_w
Al resultado de la multiplicacin se le suma el valor de los registros del Timer 1, que estn almacenados en los registros R6 y R5. El resultado final de la suma, S0, S1 y S2, se sita en los registros R0, R1 y R2, respectivamente. Para efectuar el reset del circuito integrador es suficiente con poner a 1 lgico la patilla P1.0 con la instruccin SETB en la rutina de RSI del Timer 0, cerrando el interruptor S y forzando la salida Vo a cero voltios. La siguiente instruccin pone a 0 lgico la patilla P1.0, abriendo el interruptor S y dejando actuar al integrador como tal. En el programa realizado no se contempla ningn uso posterior del valor de temperatura ledo por el microcontrolador. Este valor se puede visualizar en una serie de dgitos de siete segmentos y se puede utilizar para realizar una regulacin de la temperatura del sistema medido. Ejemplo 11.5 Sistema de adquisicin de temperatura con el sensor MAX6576 En la figura 11.24 se presenta el esquema de un sistema de adquisicin de temperatura donde se utiliza un sensor de temperatura MAX6576, de la compaa MAXIM, que suministra una seal binaria cuyo perodo es proporcional a la temperatura absoluta: Perodo = C T(K) (11.1)
donde C es una constante de proporcionalidad que puede tener cuatro posibles valores entre 10s/K y 640s/K, seleccionables mediante las entradas TS0 y TS1.
324
+2.7 a +5.5V
VDD
8XC251
MAX6576
TS0 TS1 OUT P0.0
En esta aplicacin, la funcin del microcrontrolador es la de calcular la temperatura de acuerdo con el perodo medido de la onda cuadrada, mediante uno de los temporizadores del C. Con las entradas TS0 y TS1 conectadas a masa, la constante de proporcionalidad perodo/ temperatura, C, adquiere el valor 10s/K, por lo que el perodo viene dado por: Perodo = 10s/K T(K) (11.2)
El programa que controla esta aplicacin debe configurar el Timer 0 para que trabaje como temporizador en modo 1, e inicializar su valor a cero. Seguidamente se pone en marcha durante el tiempo equivalente a un perodo de la onda cuadrada. A partir del valor que tiene el Timer 0, una vez detenido su funcionamiento, se calcula la temperatura. Si la frecuencia de la seal de reloj del microcontrolador es de 12MHz, el Timer 0 se incrementa una vez cada microsegundo, por lo que la relacin entre la temperatura y el nmero de incrementos sufrido por el Timer 0 vendr dado por: Temperatura (C) = (N 2731)/10 donde N es el nmero de incrementos sufrido por el Timer 0. A continuacin se detalla el programa que controla el funcionamiento del sistema de adquisicin de temperatura del ejemplo 11.5.
;************************************************************* ; Control de la sistema de adquisin del ejemplo 11.5 ;************************************************************* ;Programa principal ORG FF:0000H ; El programa principal comienza en la direccin FF:0000H. MOV TMOD,#01H ; Se configura el Timer 0 como temporizador en modo 1. MOV TH0,#00H ; Se inicializa el Timer 0 con el valor 0. MOV TL0,#00H ; SIG1: JB P0.0,SIG1 ; Se espera a que comience un perodo con un 1 lgico SIG2: JNB P0.0,SIG2 ; SETB TR0 ; Se pone en marcha el Timer 0. SIG3: JB P0.0,SIG3 ; Se espera a que pase el perodo. SIG4: JNB P0.0,SIG4 ; CLR TR0 ; Se detiene el Timer 0.
(11.3)
11 Entradas y salidas analgicas MOV R2,#TH0 MOV R3,#TL0 MOV WR0,#2731D MOV WR4,#10D SUB WR2,WR0 DIV WR2,WR4
325
; Se carga en el registro WR2 el contenido del Timer 0. ; ; ; ; Se resta del contenido del Timer 0 el valor 2731 y se divide entre 10 ; para obtener la temperatura en grados centgrados en el registro WR2.
Ejemplo 11.6 Adquisicin de temperatura con el sensor MAX6577 La compaa MAXIM dispone de otro sensor de temperatura, el MAX6577, que genera una onda cuadrada cuya frecuencia es proporcional a la temperatura en K: Frecuencia = F T(K) (11.4)
donde F es el coeficiente de proporcionalidad, que puede adquirir uno de entre cuatro posibles valores entre 0.0675Hz/K y 4Hz/K, seleccionables mediante las entradas TS0 y TS1. En la figura 11.25 se muestra el esquema elctrico de un sistema de adquisicin y visualizacin de temperatura basado en el microcontrolador 8XC251 y en el sensor MAX6577.
+5V 8XC251 P1.0 +2.7 a +5.5V
VDD
MAX6577
TS0 TS1 OUT
En este ejemplo la entrada TS0 del sensor MAX6577 est conectada a la tensin de alimentacin, mientras que la entrada TS1 est conectada a masa, de modo que el factor de escala F vale 1Hz/K. La seal de salida del sensor se introduce en la entrada de cuenta del Timer 0. La temperatura medida se muestra en binario y en grados centgrados a travs de los leds conectados al puerto P1. La estrategia de control de esta aplicacin consiste en medir la frecuencia de la seal de salida del sensor de temperatura, contando los pulsos que genera durante un segundo. Para ello se utiliza el Timer 0 para contar los pulsos, y el Timer 1, controlado mediante interrupcin, para temporizar 1 segundo. Si se considera que la frecuencia de funcionamiento del microcontrolador es de 12MHz, el Timer 1 se incrementa en una unidad cada mocrosegundo. Si se incializa este Timer con el valor 3CB0H, tarda 50ms en llegar a rebasamiento, por lo que debe rebasar 20 veces para temporizar un segundo.
326
Una vez transcurrido 1s, se resta el nmero 273 al valor contenido en el Timer 0 para obtener la temperatura en grados centgrados. Este valor de temperatura se carga posteriormente en el puerto P1 para ser visualizado a travs de los leds. A continuacin se muestra el listado del programa que controla el sistema de adquisin de temperatura.
;************************************************************* ; Control de la sistema de adquisin del ejemplo 11.6 ;************************************************************* ;Programa principal ORG FF:0000H ; El programa principal comienza en la direccin FF:0000H., pero se ; reubica en la direccin FF:1000H para no interferir con la RSI del Timer 1. JMP 1000H ORG FF:1000H ; Comienzo del programa principal. MOV TMOD,#15H ; Se programa el Timer 1 como temporizador y el Timer 0 como ; contador. MOV TH0,#00H ; Se inicializa el Timer 0 a cero. MOV TL0,#00H ; MOV TH1,#3CH ; Se incializa el Timer 1 para temporizar 20ms. MOV TL1,#B0H ; MOV TCON,#50H ; Se pone en marcha los Timers 0 y 1. MOV R0,#20D ; Se inicializa el contador R0 con 20. MOV IE,#88H ; Habilita la interrupcin del Timer 1 y se activa el bit EA. CLR F0 ; ESPERA:JNB F0,ESPERA; ; RSI del Timer 1 ORG FF:001BH MOV TH1,#3CH MOV TL1,#B0H DJNZ TICKS,FIN MOV R10,TH0 MOV R11,TL0 SUB WR10,#273D CPL A MOV P1,R11 MOV TH0,#00H MOV TL0,#00H MOV R0,#20D FIN: RETI
; Direccin de comienzo de la RSI del Timer 1. ; ; ; ; Se carga el valor del Timer 0 en el registro WR0 ; ; Se resta 273 al valor del Timer 0 para obtener la temperatura ; en grados centgrados. ; Se complementa el valor de la temperatura para activar los leds a nivel ; bajo. ; Se inicializa de nuevo el Timer 0 a cero. ; ; Se inicializa el contador R0 con 20.
327
12.2.1 Bits de control del puerto serie El bit SMOD1 del registro PCON permite doblar la velocidad de transmisin del puerto de comunicacin serie. Por otra parte, el bit SMOD0 del registro PCON determina la funcin del bit 7 del registro SCON. En el caso que SMOD0 est a 1 lgico, el bit SCON.7 permite leer o escribir el bit Framing Error (FE). Cuando SMOD0 est a cero el bit SCON.7 trabaja como bit SM0 del puerto de comunicacin serie.
12.2.2 Bit de Power Off (POF) El bit de Power Off se pone automticamente a 1 lgico cuando la tensin de alimentacin del microcontrolador, Vcc, aumenta desde Vcc<3V hasta Vcc>3V. Con la activacin de este bit se pone de manifiesto que el contenido de la memoria RAM interna es indeterminado, circunstancia que ocurre, por ejemplo, cuando se aplica la tensin de alimentacin al integrado. Este bit puede ser puesto a uno o a cero por programa. En general, este bit se verifica despus de un reset del microcontrolador, para determinar si el reset se ha realizado por una puesta en marcha de la aplicacin, por un fallo de la alimentacin, o bien ha sido un reset efectuado con el microcontrolador en funcionamiento normal. En los dos primeros casos, este bit se pone a 1 para indicar que el contenido de la memoria voltil interna es indeterminado; en este
328
caso lo habitual es borrar el bit mediante una instruccin. En el tercer caso, este bit permanece a 0 lgico. Si se detecta que el bit POF se pone a 1 por otro motivo, por ejemplo, si se produce una deriva en la tensin de alimentacin que provoca que Vcc baje por debajo de 3V, se deber realizar un reset por software para reinicializar el microcontrolador.
Tabla 12.1 Registro de control de potencia
b6 SMOD0
b5 --
b4 POF
b0 IDL
Mnemnico SMOD1
SMOD0
5 4
-POF
3 2 1
GF1 GF0 PD
IDL
Funcin Bit de doble velocidad de transmisin. Cuando este bit est a uno se dobla la velocidad de transmisin de datos del puerto de comunicacin serie, cuando se utiliza el Timer 1 y el puerto serie est trabajando en el modo 1, 2 o 3. Seleccin de SCON.7. Cuando este bit est a 1 lgico, el bit SCON.7 permite leer o escribir el bit Framing Error. Cuando este bit est a cero, el bit SCON.7 realiza la funcin de SM0. Reservado. Este bit est reservado y no puede ser utilizado por el usuario. Bit de Power Off. Este bit se pone a uno lgico cuando la tensin de alimentacin baja por debajo de los 3 voltios o cuando se aplica la alimentacin al microcontrolador. Con esta activacin se indica que el contenido de la memoria RAM interna es indeterminado. Este bit se puede borrar por software. Bit de propsito general. Bit de propsito general. Bit de modo Power Down. Cuando este bit est a 1 lgico se activa el modo Power Down. Este bit se pone a cero cuando se realiza un reset del microcontrolador, o bien, cuando se realiza una peticin de interrupcin. Bit de modo Idle. Cuando este bit est a 1 lgico se activa el modo Idle. Este bit se pone a cero cuando se realiza un reset del microcontrolador, o bien, cuando se realiza una peticin de interrupcin.
329
Durante el modo Idle el contenido de los registros de la CPU permanece intacto, as como el contenido de la memoria RAM interna y de los registros del rea SFR. Para entrar en el modo de funcionamiento Idle se debe poner a uno lgico el bit IDL del registro PCON. Existen dos formas de salir del modo Idle: Generando una interrupcin que est habilitada. Cuando se activa una fuente de interrupcin que est habilitada se pone a cero automticamente el bit IDL. Despus de ejecutar la rutina de servicio a la interrupcin, el microcontrolador contina ejecutando el programa principal por la instruccin siguiente a aquella que puso el bit IDL a uno lgico. Realizando un reset del microcontrolador. Cuando se aplica un nivel alto al pin de reset del microcontrolador, se borra automticamente el bit IDL. El microcontrolador contina ejecutando de forma momentnea el programa principal por la instruccin siguiente a la que activ el bit IDL, hasta que el algoritmo de reset interno toma el control e inicializa el contador de programa con la direccin FF:0000H.
OSC
Fig. 12.1 Control del reloj mediante los bits Idle y Power Down
Hay dos maneras de salir del modo Power Down: Generando una interrupcin externa. Cuando se activa una fuente de interrupcin externa que est habilitada para interrumpir, el bit PD se pone a cero automticamente, de forma que la CPU y los perifricos vuelven a recibir la seal de reloj. Inmediatamente despus, la CPU ejecuta la rutina de servicio a la interrupcin y, a continuacin, sigue ejecutando el programa principal por la instruccin siguiente a la que activ el bit PD.
330
Realizando un reset del microcontrolador. Cuando se aplica un nivel alto al pin de reset del microcontrolador se pone a cero el bit PD, lo que permite a la CPU y los perifricos continuar con su funcionamiento normal. El microcontrolador contina ejecutando de forma momentnea el programa principal por la instruccin siguiente a la que activ el bit IDL, hasta que el algoritmo de reset interno toma el control e inicializa el contador de programa con la direccin FF:0000H.
3.
En la MCS-51, para entrar en el modo ONCE se debe: 1. Poner a 0 lgico la patilla ALE mientras el microcontrolador est en la fase de reset y el terminal /PSEN est a 1 lgico. Mantener ALE a 0 lgico mientras el reset (terminal RST) es desactivado.
2.
Para la MCS-51, cuando el microcontrolador est en el modo ONCE, el puerto P0 permanece flotante en estado de alta impedancia, y el resto de los puertos, junto con el terminal ALE y /PSEN, estn conectados dbilmente a 1 lgico. Para salir del modo ONCE basta con efectuar un reset del microcontrolador.
331
Mnemnico <dest>,<src>
MOV
MOVX
ADD
ADDC SUBB
Descripcin Instrucciones de transferencia de datos A, Rn A = Rn. Copia el valor de Rn en A A, dir8 A = (dir8) Copia el contenido de la direccin dir8 en A A, @Ri A = (@Ri) Copia el valor direccionado por @Ri en A A, #dato A = #dato Pone el dato en A Rn, A Rn = A Copia el valor de A en Rn Rn, dir8 Rn = (dir8) Copia el contenido de la direccin dir8 en Rn Rn, #dato Rn = #dato Pone el dato en Rn dir8, A (dir8) = A Copia el valor de A en la direccin dir8 dir8, Rn (dir8) = Rn Copia el valor de Rn en la direccin dir8 dir8, dir8 (dir8) = (dir8) Copia de la direccin src a la direccin dest dir8, @Ri (dir8) = (@Ri) Copia la posicin direccionada por @Ri en la direccin dir8 dir8, #dato (dir8) = #dato Copia el dato en la direccin dir8 @Ri, A (@Ri) = A Copia A en la posicin direccionada por @Ri @Ri, dir8 (@Ri) = (dir8) Copia la direccin dir8 en la posicin direccionada por @Ri @Ri, #dato (@Ri) = #dato Copia el dato en la posicin direccionada por @Ri DPTR,#dato16 DPTR = #dato16 Pone el dato de 16 bits en el DPTR A, @Ri A = (@Ri) Copia en A el byte de la RAM externa apuntada por @Ri A, @DPTR A = (@DPTR) Copia en A el byte de la RAM externa apuntada por @DPTR @Ri, A (@Ri) = A Copia A en posicin de RAM externa apuntada por @Ri @DPTR, A (@DPTR) = A Copia A en posicin de RAM externa apuntada por @DPTR A, @A+DPTR A = (A + DPTR) Pone en A el byte de cdigo apuntado por @A+DPTR A, @A+PC A = (A + PC) Pone en A el byte de cdigo apuntado por @A+PC dir8 Mete el byte de la direccin dir8 en la pila dir8 Mete el byte de la direccin dir8 en al pila A, Rn Intercambia A y Rn A, dir8 Intercambia A y el byte de la direccin dir8 A, @Ri Intercambia A y el byte apuntado por @Ri A, @Ri Intercambia los cuatro bits bajos de A y del byte apuntado por @Ri Instrucciones aritmticas A, Rn A=A+ Rn Suma A con Rn, pone el resultado en A A, dir8 A=A+ (dir8) Suma A con el byte de la direccin dir8, pone el resultado en A A, @Ri A=A+ (@Ri) Suma A con el byte apuntado por @Ri, pone el resultado en A A, #dato A=A+ dato Suma A con el dato, pone el resultado en A A, Rn A=A Rn Suma (+) para ADDC y resta (-) para SUBB A, dir8 A=A (dir8) C Suma (+) para ADDC y resta (-) para SUBB A, @Ri A=A (@Ri ) C Suma (+) para ADDC y resta (-) para SUBB A, #dato A=A dato C Suma (+) para ADDC y resta (-) para SUBB A A=A 1 Signo + para INC. Signo - para DEC Rn Rn=Rn 1 Signo + para INC. Signo - para DEC dir8 (dir8) = (dir8) 1 Signo + para INC. Signo - para DEC @Ri (@Ri ) = (@Ri ) 1 Signo + para INC. Signo - para DEC DPTR DPTR = DPTR +1 Incremento del DPTR AB Multiplica A por B. Deja el byte alto del resultado en B y el byte bajo en A AB Divide A por B. Deja el cociente en A y el resto en B A Ajuste decimal del acumulador
332
Mnemnico <dest>,<src>
Apndice 1 Juego de instrucciones de la familia MCS-51 Descripcin Bytes Tpo* Instrucciones lgicas A, Rn A = A AND o OR o XOR Rn Funcin AND, OR o XOR lgica 1 1 A, dir8 A = A AND o OR o XOR (dir8) Funcin AND, OR o XOR lgica 2 1 A, @Ri A = A AND o OR o XOR (@Ri) Funcin AND, OR o XOR lgica 1 1 A, #dato A = A AND o OR o XOR #dato Funcin AND, OR o XOR lgica 2 1 dir8, A (dir8) = (dir8) AND o OR o XOR A Funcin AND, OR o XOR lgica 2 dir8, #dato (dir8) = (dir8) AND o OR o XOR #dato Funcin AND, OR o XOR lgica 2 3 A A=0 Borra el acumulador 1 1 A Complementa el acumulador 1 1 A Rotacin a la izquierda del acumulador 1 1 A Rotacin a la izquierda con acarreo del acumulador 1 1 A Rotacin a la derecha del acumulador 1 1 A Rotacin a la derecha con acarreo del acumulador 1 1 A Intercambia los 4 bits bajos del acumulador con sus 4 bits altos 1 1 Instrucciones booleanas C Pone a cero el bit de acarreo 1 1 bit Pone a cero el bit direccionado 2 1 C Pone a uno el bit de acarreo 1 1 bit Pone a uno el bit direccionado 2 1 C Complementa el bit de acarreo 1 1 bit Complementa el bit direccionado 2 1 C, bit C = C AND (bit) AND lgica entre C y el bit, resultado lo pone en C 2 2 C, /bit C = C AND (/bit) AND lgica entre C y el bit complementado, resultado en C 2 2 C, bit C = C OR (bit) OR lgica entre C y el bit, resultado lo pone en C 2 2 C, /bit C = C AND (/bit) OR lgica entre C y el bit complementado, resultado en C 2 2 C, bit C = bit Pone el valor del bit en el bit de acarreo C 2 1 bit, C bit = C Pone el valor del bit de acarreo en el bit indicado 2 2 Instrucciones de salto incondicional dir11 Salto absoluto. Salta a una direccin de 11 bits 2 2 dir16 Salto largo. Salta a cualquier direccin del espacio de memoria 3 2 rel Salto corto con direccionamiento relativo 2 2 @A+DPTR Salto indirecto a la direccin A + DPTR 1 2 Salto a la siguiente instruccin 1 1 Instrucciones de salto condicional rel Salta si el bit de acarreo est a 1 lgico 2 2 rel Salta si el bit de acarreo est a 0 lgico 2 2 bit, rel Salta si el bit direccionado est a 1 lgico 3 2 bit, rel Salta si el bit direccionado est a 0 lgico 3 2 bit, rel Salta si el bit direccionado est a 1 lgico y luego lo pone a 0 lgico 3 2 rel Salta si el acumulador vale cero 2 2 rel Salta si el acumulador es distinto de cero 2 2 A, dir8, rel Compara A con el valor de la direccin dir8 y hace un salto relativo si son distintos 3 2 A, #dato, rel Compara A con el dato y hace un salto relativo si son distintos 3 2 Rn, #dato, rel Compara Rn con el dato y hace un salto relativo si son distintos 3 2 @Ri,#dato,rel Compara el byte apuntado por @Ri y hace un salto relativo si son distintos 3 2 Rn, rel Decrementa Rn en una unidad y hace un salto relativo si Rn es distinto de cero 2 2 dir8, rel Decrementa el byte de dir8 y hace un salto relativo si es distinto de cero 3 2 Instrucciones de llamada y retorno a subrutinas dir11 Llamada a subrutina de tipo absoluto, direccin de 11 bits 2 2 dir16 Llamada a subrutina tipo long, direccin de 16 bits 3 2 Retorno de subrutina 1 2 Retorno de la rutina de servicio a la interrupcin 1 2 *El tiempo de ejecucin, Tpo, viene dado en ciclos mquina
CLR CPL RL RLC RR RRC SWAP CLR SETB CPL ANL ORL MOV AJMP LJMP SJMP JMP NOP JC JNC JB JNB JBC JZ JNZ CJNE
333
CMP
334
Mnemnico DIV <dest>,<src>
MOV
Descripcin Instrucciones aritmticas (continuacin) Rmd,Rms Divide Rmd por Rms WRjd,WRjs Divide WRjd por WRjs Instrucciones lgicas Rmd = Rmd AND OR XOR Rms Rmd,Rms WRjd = WRjd AND OR XOR WRjs WRjd,WRjs Rm = Rm AND OR XOR #data Rm,#data WRj = WRj AND OR XOR #data16 WRj,#data16 Rm,dir8 Rm = Rm AND OR XOR (dir8) WRj,dir8 WRj = WRj AND OR XOR (dir8, dir8+1) Rm,dir16 Rm = Rm AND OR XOR (dir16) WRj = WRj AND OR XOR (dir16, dir16+1) WRj,dir16 Rm = Rm AND OR XOR (@WRj) Rm,@WRj Rm = Rm AND OR XOR (@DRk) Rm,@DRk Rm Desplazamiento lgico a la izquierda de Rm WRj Desplazamiento lgico a la izquierda de WRj Rm Desplazamiento aritmtico a la derecha de Rm WRj Desplazamiento aritmtico a la derecha de WRj Rm Desplazamiento lgico a la derecha de Rm WRj Desplazamiento lgico a la derecha de WRj Instrucciones de transferencia de datos Rmd,Rms Rmd = Rms WRjd,WRjs WRjd = WRjs DRkd,DRks DRkd = DRks Rm,#data Rm = #data WRj,#data16 WRj = #data16 DRk,#0data16 DRk = #0data16 DRk,#1data16 DRk = #1data16 DRk,dir8 DRk = (dir8, dir8+1, dir8+2, dir8+3) DRk,dir16 DRk = (dir16, dir16+1, dir16+2, dir16+3) Rm,dir8 Rm = dir8 WRj,dir8 Wrj = (dir8, dir8+1) Rm,dir16 Rm = (dir16) WRj,dir16 Wrj = (dir16, dir16+1) Rm,@WRj Rm = (@WRj) Rm,@DRk Rm = (@DRk) WRjd,@WRjs WRjd = (@WRjs, @WRjs+1) WRj,@DRk WRj = (@DRk, @DRk+1) dir8,Rm (dir8) = Rm dir8,WRj (dir8, dir8+1) = WRj dir16,Rm (dir16) = Rm dir16,WRj (dir16, dir16+1) = WRj @WRj,Rm (@WRj) = Rm @DRk,Rm (@DRk) = Rm @WRjd,WRjs (@WRjd , @WRjd +1) = Wrjs @DRk,WRj (@DRk, @Drk+1) = WRj dir8,DRk (dir8, dir8+1, dir8+2, dir8+3) = DRk dir16,DRk (dir16, dir16+1, dir16+2, dir16+3) = DRk Rm,@WRj+dis16 Rm = (@WRj+dis16) WRj,@WRj+dis16 WRj = (@WRj+dis16, @WRj+dis16+1) Rm,@DRk+dis24 Rm = (@DRk+dis24) WRj,@DRk+dis24 WRj = (@Drk+dis24, @DRk+dis24+1)
335
Tclock 10 12 12 14 4 2 2 6 10 6 10 18 4 8 16 2 6 2 6 2 6 4 4 4 4 4 6 6/12 6/12 12/18 10 12 10 2/8 2/8 2/8 2/8 2/8 2/8 2/8 2/8 16 22 26 18
Mnemnico MOV
POP
CLR SETB CPL ANL ORL MOV JB JNB JBC EJMP LJMP JE JNE JG JLE JSL JSLE JSG JSGE LCALL ECALL ERET
<dest>,<src> Descripcin Instrucciones de transferencia de datos (continuacin) @WRj+dis16,Rm (@WRj+dis16) = Rm @WRj+dis16,WRj (@WRj+dis16, @WRj+dis16+1) = Rm @DRk+dis24,Rm (@DRk+dis24) = Rm @DRk+dis24,WRj (@DRk+dis24, @DRk+dis24+1) = Rm DRk(hi),#data16 DRk(hi) = data16 WRj,Rm WRj = MSB, Rm WRj,Rm WRj = 0, Rm Instrucciones de transferencia de datos en la pila Mete el dato #data en la pila #data Mete el dato #data16 en la pila #data16 Mete el contenido de Rm en la pila Rm Mete el contenido de WRj en la pila WRj Mete el contenido de DRk en la pila DRk Mete en Rm un dato de la pila Rm Mete en WRj un Word de la pila WRj Mete en DRk un Dword de la pila DRk Instrucciones booleanas CY Pone a cero el bit de acarreo bit Pone a cero el bit direccionado CY Pone a uno el bit de acarreo bit Pone a uno el bit direccionado CY Complementa el bit de acarreo bit Complementa el bit direccionado CY, bit CY = CY AND (bit) CY, /bit CY = CY AND (/bit) CY, bit CY = CY OR (bit) CY,/bit CY = CY AND (/bit) CY, bit CY = bit bit, CY bit = CY bit, rel Salta si (bit) es 1 bit, rel Salta si (bit) no es uno bit, rel Salta si (bit) es uno y borran el bit Instrucciones de salto incondicional addr24 Salto extendido @DRk Salto extendido indirecto @WRj Salto largo indirecto Instrucciones de salto condicional rel Salta si es igual (si Z=1) rel Salta si no es igual (si Z=0) rel Salta si es mayor que. (si CY=Z=0) rel Salta si es menor o igual que. (si Z=1 o CY=1) rel Salta si es menor que (con signo). (si N[OV) rel Salta si es menor o igual que (con signo). (si Z=1 si N[OV) rel Salta si es mayor que (con signo). (si Z=0 y N=OV) rel Salta si es mayor o igual que (con signo). (si N=OV) Instrucciones de llamada y retorno de subrutina @WRj Llamada a subrutina tipo long @DRk Llamada a subrutina tipo extendido dir24 Retorno extendido de subrutina