Capítulo 1 - Organización de la memoria INTRODUCCIÓN El microcontrolador 8051 permite el direccionamiento de 64Kbytes de memoria de programa y 64Kbytes de memoria de datos. Además dispone de una memoria RAM interna de 128bytes. Como memoria de programa se denomina la memoria en la que se encuentra el código máquina ejecutado por el procesador mientras que en la memoria de datos se encuentran los datos manipulados por el procesador. Esta separación de funciones se traduce en modos de acceso y direccionamientos diferentes. El tamaño máximo de los programas del 8051 está limitado a 64K. Algunos ensambladores y compiladores ofrecen métodos para salvar esta limitación cuando se usa hardware especial. Sin embargo, sin estos compiladores y hardware especial, los programas están limitados a 64K. MEMORIA DE PROGRAMA La memoria de código (o memoria de programa) es una memoria de sólo lectura destinada a contener el programa a ejecutar por el 8051. El µC solamente puede ejecutar las instrucciones que residan en este tipo de memoria. El 8051 dispone de 4 Kbytes de memoria de código interna, que puede expandirse hasta 64 Kbytes utilizando chips de memoria externa. La memoria de código es una memoria no volátil (los datos permanecen al quitar la alimentación) de tipo ROM, EPROM o FLASH. Es posible utilizar combinaciones de memoria interna y externa. Un ejemplo típico es el que utiliza los 4Kbytes de ROM en el chip y el resto hasta completar como máximo los 64Kbytes en chips de memoria EPROM. Para direccionar la memoria de código el 8051 usa siempre direcciones de 16 bits. Si la patilla EA' (1) (External Address) se encuentra a nivel alto, el 8051 ejecuta instrucciones de la ROM interna, a menos que la dirección que se esté leyendo sea superior a 0x0FFF (supere los 4 Kbytes internos), en cuyo caso los accesos van dirigidos a la memoria de código externa. Si la patilla EA' se encuentra a nivel bajo, el 8051 trata de leer todas las instrucciones desde la memoria externa de código. Dentro de la memoria de programa, las primeras direcciones están reservadas para los vectores de interrupción así como para el comienzo de programa según se muestra en la figura siguiente: figura: VECTORES DE INTERRUPCIÓN DEL 8051 MEMORIA DE DATOS RAM externa RAM interna o Area de registros de funciones especiales (SFRs) o Memoria bit o Bancos de registros La memoria de datos (RAM) del µC 8051 se presenta dividida en dos; memoria de datos externa (RAM externa) y memoria de datos interna (RAM interna). RAM Externa Como sugiere el mismo nombre, la RAM externa es una memoria de acceso aleatorio, de lectura y escritura, que se encuentra fuera del chip. Los accesos a la RAM externa son más lentos y menos flexibles que los accesos a la RAM interna. Por ejemplo, para incrementar una posición en RAM interna sólo se necesita 1 instrucción y 1 ciclo máquina. En cambio, para incrementar una posición de RAM Externa se requieren 4 instrucciones y 7 ciclos máquina. En este caso, la memoria externa es 7 veces más lenta. Incrementar la posición 0x25 de RAM interna Ciclos INC 25H 1 Incrementar la posición 0x2043 de RAM Externa Ciclos n 2 MOVX A,@DPTR 2 INC A 1 MOVX @DPTR, A 2 Pero lo que pierde la RAM Externa en velocidad y flexibilidad, lo gana en cantidad, ya que la RAM interna está limitada a 128 bytes, mientras que la RAM externa puede tener un tamaño máximo de 64Kbytes. RAM Interna El 8051 dispone de 128 bytes de RAM interna (en algunos derivados como el 8052 alcanza los 256 bytes). Por encontrarse en el interior del chip es la memoria de lectura y escritura que proporciona mayor rapidez y flexibilidad en los accesos a los datos. La RAM interna es una memoria volátil, cuyo contenido desaparece cuando se quita la alimentación al µC. figura:MAPA DE MEMORIA INTERNA La RAM interna se encuentra dividida en 2 secciones: los 128 bytes inferiores y el área de los registros de funciones especiales o SFRs. Los 128 bytes inferiores permiten el acceso directo e indirecto, los 128 bytes superiores sólo permiten el acceso indirecto, y los SFRs solo pueden ser accedidos directamente. Los 128 bytes inferiores de la RAM interna están subdivididos como se muestra en el mapa de memoria. En los primeros 32 bytes de esta sección se encuentran 4 bancos de ocho registros R0-R7. El 8051 puede seleccionar uno de los 4 bancos de registros de los que dispone, mediante los bits RS0 y RS1 del registro de estado PSW. Después de un reset el 8051 utiliza el banco 0. La memoria direccionable como bit y como byte está formada por las 16 posiciones de RAM interna situadas entre las direcciones 20H y 2FH. Las restantes posiciones de RAM interna, desde la dirección 30H hasta 7FH, se utilizan para guardar las variables de usuario que requieren un acceso rápido y/o muy frecuente. La pila del microcontrolador puede ubicarse en cualquier lugar de RAM interna. Después de un reset el registro apuntador de pila queda cargado con 07H, con lo que la pila crece a partir la dirección siguiente respetando el contenido del banco de registros 0. La pila puede crecer hasta la dirección 7FH en el µC 8051. El 8051 solo puede direccionar 64K de RAM. Para superar esta limitación es necesario utilizar técnicas especiales en el hardware y en el software. Capítulo 2 - Registros de Funciones eSpeciales (SFRs) Area de Registros de funciones especiales (SFRs) Los SFRs son registros destinados, en su mayoría, al control de los periféricos integrados en el 8051. Por medio de distintos SFRs se puede: acceder a los puertos de entrada/salida del 8051; leer o escribir en el puerto serie del µC; controlar los temporizadores y contadores; configurar el sistema de interrupciones, etc. No obstante, dentro de los SFR's también se encuentran los registros aritméticos (ACC, B, PSW), el apuntador de pila (SP), y los registros apuntadores de datos (DPH y DPL). Los SFRs se encuentran en la RAM interna del microcontrolador, entre la dirección 80H y 0FFH, permitiendo el acceso directo exclusivamente. Este tema se extiende en el capítulo 2 (Ver Descripción de los SFRs estándar) Cada SFR tiene una utilidad y un formato específico. No todas las direcciones por encima de la 80H están asignadas a los SFR. Sin embargo, las direcciones de esta región, no asignadas a ningún SFR, son inexistentes y no pueden ser utilizadas como posiciones adicionales de memoria RAM. Memoria de bit El 8051, siendo un microcontrolador orientado al control, tiene la posibilidad de acceder a un número de variables de bit. Estas variables pueden tener por valores 0 ó 1. Existen 128 variables de bit posibles, numeradas desde 00H hasta FFH. El programador puede modificar estas variables con instrucciones tales como SETB, CLR, y CPL. Es importante tener en cuenta que la Memoria Bit es realmente parte de la RAM Interna. De hecho, las 128 variables bit ocupan los 16 bytes de RAM Interna desde la dirección 20H 2FH. Así, si se escribe el valor FFH en la dirección 20H de RAM Interna, los bits 00H hasta 07H se activan (1). Esto quiere decir que: MOV 20h,#0FFh es equivalente a: SETB 00h SETB 01h SETB 02h SETB 03h SETB 04h SETB 05h SETB 06h SETB 07h Lo más importante a recordar es que realmente la Memoria Bit no es un tipo de memoria aparte, sino una zona perteneciente a la RAM Interna. Si en el programa no se usan variables bit, las direcciones de RAM interna desde 20H hasta 2FH se pueden utilizar como variables byte sin problemas. Sin embargo, si la idea es usar variables bit, estas zonas de memoria debe modificarse de forma cautelosa ya que se podría llegar a sobreescribir los valores de los bits. Las variables Bit desde 00H hasta 7FH se utilizan para funciones definidas por el usuario en sus programas. Sin embargo, existen también variables bit desde 80H en adelante que son utilizadas para acceder a ciertos SFRs bit a bit. Por ejemplo, si las patillas de salida del puerto P0 (P0.0 hasta P0.7) están todas a 0, y se quiere poner a 1 la patilla P0.0, podemos ejecutar: MOV P0,#01h o también: SETB 80h (o SETB P0.0) Ambas instrucciones realizan la misma función. Sin embargo, usando el comando SETB se activará la patilla P0.0 sin afectar a ninguno de los demás estados del P0. La instrucción MOV en este caso, efectivamente pone a 1 la patilla P0.0, pero modifica el resto de las patillas poniéndolas a 0. Después de un reset al 8051 el Stack Pointer (SP o apuntador de la pila) queda cargado con 07H. Esto significa que la pila comienza desde la siguiente dirección y se expande hacia las posiciones de memoria sucesivas. Si se selecciona algún banco de registro distinto al banco 0, el SP debe ser inicializado por encima del banco de registro más alto que se esté utilizando, de otro modo se podría sobreescribir la pila. De forma similar, si usamos variables bit, normalmente es una buena idea inicializar el SP por encima del valor 2FH para garantizar que las variables bit quedan a salvo de la pila. Bancos de Registro El 8051 posee 8 registros (R0, R1, R2, R3, R4, R5, R6, y R7) que utiliza en muchas de sus instrucciones. Estos registros se usan generalmente para ayudar en la manipulación de valores y en el movimiento de datos de una zona de memoria a otra. Por ejemplo, para sumar el valor de R4 al Acumulador, se puede ejecutar la siguiente instrucción: ADD A,R4 En este caso, si el Acumulador (A) tiene el valor 6 y R4 el valor 3, después de ejecutar la instrucción el Acumulador contendrá el valor 9. Sin embargo, como el registro R4 se encuentra en la dirección 04H de RAM Interna, la siguiente instrucción debería realizar la misma operación: ADD A,04h La instrucción suma el valor contenido en la dirección 04H al Acumulador, dejando el resultado en este último. Entonces si realmente R4 está en la dirección 04H de RAM Interna, las dos instrucciones realizan la misma operación. Pero ¡Cuidado! El 8051 tiene cuatro bancos de registro distintos. Normalmente se trabaja con el banco 0, sin embargo, por software se puede seleccionar otro banco de registros (banco 1, 2 ó 3). En este caso, R4 no será equivalente a la dirección 04H. Por ejemplo, si las instrucciones del programa selecciona el banco 3, el registro R4 será sinónimo a la dirección 1CH. El concepto de bancos de registro proporciona flexibilidad al 8051, especialmente en el manejo de interrupciones. Sin embargo, lo más importante es recordar que los bancos de registro residen en los 32 primeros bytes de RAM Interna. En caso de que sólo se use el primer banco de registros (banco 0), se pueden utilizar las posiciones de RAM interna desde la dirección 08H hasta 1FH para otros menesteres. Pero cuando se desee seleccionar otro banco de registro (ya sea el banco 1, 2 ó 3), se hace necesario un cuidado especial al usar direcciones de memoria por debajo de 20H, ya que se podría sobreescribir el valor de algún registro. DESCRIPCIÓN DE LOS SFRs ESTÁNDAR SFRs de propósito general o Apuntador de pila (SP) o Apuntador de datos (DPTR) o Registro de estado de programa (PSW) o Acumulador (ACC) o Registro B SFRs que controlan los puertos de E/S SFRs que controlan las interrupciones y los Timers o Registro TCON o Registro TMOD o TLX-THX o IE o IP SFRs que controlan el puerto serie o SCON o SBUF El 8051 es un microcontrolador bastante flexible ya que tiene un número relativamente alto de modos de operación. El acceso a los SFRs se encuentra en la RAM Interna entre las direcciones 0x80 y 0xFF. Cada SFR tiene una dirección y un nombre propio como muestra la siguiente tabla de forma gráfica. Como se observa en el cuadro de los SFRs, los que tienen el fondo en azul están relacionados con los puertos E/S. El 8051 tiene cuatro puertos E/S de 8 bits, lo que hace un total de 32 patillas E/S. Los SFRs con fondo amarillo controlan las interrupciones y los timer y los de fondo morado el puerto serie. También se observan otros tipos de SFRs con fondo verde de propósito general (p. ej: funciones aritméticas, posición de la pila, etc). Algunos nombres de los SFRs aparecen en color rojo, esto se debe a que son accesibles bit a bit ( por ejemplo, usando las instrucciones SETB o CLR). Es importante observar que la dirección física que poseen estos SFRs es siembre divisibles por ocho. También se puede comprobar que aunque el rango desde la 80H hasta 0FFH ofrece 128 posibles posiciones, en realidad el 8051 standard solo posee 21 SFRs. El resto de direcciones son inexistentes. Si se escribe en una de estas posiciones cualquier dato al tratar de recuperarlo se obtendrá un valor totalmemte distinto. Se recomienda no escribir ni leer en las direcciones que no han sido asignadas a ningún SFR en particular, ya que esto puede puede provocar conductas y valores indefinidos. Incluso podría ocurrir una incompatibilidad entre el programa y otros derivados del 8051 que usen estas direcciones para otros propósitos. SFRs de propósito general SP (Stack Pointer, Dirección 81H) La pila puede colocarse en cualquier lugar de la RAM interna del µC escribiendo en este registro de 8 bits. El tamaño máximo de la pila es por lo tanto de 256 bytes. Durante una instrucción CALL o PUSH, el contenido del registro SP se incrementa antes de almacenar los datos en la dirección apuntada por SP. Durante una instrucción POP, RET, O RETI, el contenido del registro SP se decrementa después de recuperar los datos desde la dirección apuntada por SP (Salvo en "POP SP", en el cual SP se decrementa antes de ser cargado con el valor sacado de la pila). Después de un Reset, el registro SP queda cargado con el valor 07H. Su misión es apuntar a la RAM interna donde serán guardadas las direcciones de retorno de las subrutinas llamadas con instrucciones CALL, y desde donde dichas direcciones serán leídas al encontrarse con instrucciones RET de retorno de subrutina. Asimismo, las instrucciones POP permiten recoger de la PILA los valores de las variables depositados anteriormente con instrucciones PUSH. Es importante recordar que el área de los bancos de registros es compartida con la posición de la pila, como se explica en profundidad en el apartado Bancos de Registros del primer capítulo. DPL/DPH (Data Pointer Low/High, Direcciones 82H/83H) El registro de 16 bits DPTR, está formado por la unión de los registros DPH y DPL, cuya misión principal consiste en apuntar a cualquier dirección dentro de los 64 Kbytes del espacio de memoria tanto de código como de datos. Para ello se dispone de instrucciones específicas. Veamos un ejemplo: CLR MOV MOVC A DPTR,#1234H A,@A+DPTR MOVX @DPTR,A ;Borrar Acumulador. ;Cargar el DPTR con el valor 1234H. ;El contenido de la dirección 1234H de ;memoria de código, se copia en el Acc. ;El contenido del Acc se copia en la ;dirección 1234H de la memoria de datos. PSW (Program Status Word, Dirección 0D0H, Direccionable a nivel Bit) Contiene información del estado de la CPU que se actualiza tras la ejecución de cada instrucción. En la siguiente tabla se explica detenidamente: PSW (0D0H) MSB C AC F0 RS1 RS0 OV F1 LSB P C Flag de acarreo. Se pone a 1 si hay llevada en sumas o restas. AC Flag de acarreo intermedio. Se pone a 1 en las sumas y restas si hay llevada desde el nibble bajo hacia el nibble alto. F0 Flag de propósito general a disposición del programador. RS1 0 0 1 1 RS0 0 1 0 1 Selección de banco de registros Banco 0 Direcciones: 00H - 07H Banco 1 Direcciones: 08H - 0FH Banco 2 Direcciones: 10H - 17H Banco 3 Direcciones: 18H - 1FH OV Flag de desbordamiento. Cuando se utiliza aritmética entera en complemento a dos, OV = 1 indica que el resultado no cabe en 8 bits. F1 Flag de propósito general a disposición del programador. P Flag de paridad. (P = 1 si el acumulador tiene número impar de unos. P = 0 si el acumulador tiene un número par de unos.) ACC (Acumulador, Dirección 0E0H, Direccionable a nivel Bit) Es el registro más utilizado, y sobre el que recaen la mayoría de las operaciones, al estar conexionado con la Unidad Lógico Aritmética (ALU). Es direccionable a nivel Bit. Interviene en todas las instrucciones que llevan la letra A (Por ejemplo: ADD A,#34H). Cuando una instrucción admite una dirección puede utilizarse el símbolo ACC, que equivale al valor 0E0H, o dirección del registro A. B (B Register, Dirección 0F0H, Direccionable a nivel Bit) Es un registro de propósito general, que colabora con el Acumulador en las instrucciones de multiplicación y división (MUL AB y DIV AB). SFRs que controlan los puertos E/S Existen cuatro registros de 8 bits encargados de gestionar los puertos paralelos en el µC 8051 que son, P0 (Dirección 80H), P1 (Dirección 90H), P2 (Dirección 0A0H) y P3 (Dirección 0B0H). Estos puertos confieren 32 patillas al microcontrolador. Cada puerto consiste en un latch, un driver de salida, y un buffer de entrada. A continuación se detalla la estructura interna de las patillas de los puertos: Las patillas de los puertos además de servir como líneas de entrada y salida de propósito general, admiten las siguientes funciones alternativas: 1. Los drivers de salida de los puertos P0 y P2, y el buffer de entrada del puerto P0 son usados en el acceso a la memoria externa. 2. En cuanto al puerto P3, sus hilos proporcionan diferentes funciones alternativas al µC 8051. Para comprender el funcionamiento de los puertos es recomendable consultar el capítulo 4 "Los puertos Entrada/Salida" (Ver Características generales de los 4 puertos) SFRs que controlan las interrupciones y los timers Los SFRs que poseen algún punto en común con los Timers (temporizadores o contadores) o las interrupciones son las siguientes. En la siguientes tablas se utiliza el termino "x" haciendo referencia a la utilización tanto del Timer0 (T0) como del Timer1 (T1) indistintamente. TCON (Timer Control Register, Dirección 88H, Direccionable a nivel Bit) Configura y modifica las funciones de los Timers T0 y T1. TCON (88H) MSB TF1 TR1 TF0 TR0 IE1 IT1 LSB IT0 IE0 TFx: Flag de desbordamiento del timer Tx, se borra automáticamente una vez atendida la interrupción. TRx = "1" Permite que el timer Tx cuente ("0" no permite contar). IEx: Flag de petición de la interrupción externa INTx, se borra automáticamente una vez atendida la interrupción. ITx: "1" Interrupción INTx por flanco de Bajada, "0" por nivel bajo. TMOD (Timer Mode Control Register, Dirección 89H) Configura el modo de trabajo de los Timers entre los cuatro posibles de la siguiente figura. TMOD (89H) MSB LSB GATE C/T M1 M0 GATE C/T M1 Timer 1 MODO 0 1 2 3 M1 0 0 1 1 M0 0 1 0 1 M0 Timer 0 OPERACIÓN Timer de 13 bits Timer de 16 bits Timer de 8 bits con Auto-Recarga T0 desdoblado, T1 parado en modo 3 C/T: Selecciona modo Contador (1) o modo Temporizador (0). GATE = "1" Permite que la patilla PIN INTx actúe sobre la señal de CONTROL del Temporizador. (El bit TRx debe estar a "1"). TLx/THx (Timer x Low/High, Direcciones 8AH/8BH ó 8CH/8DH) Un timer puede pedir una interrupción con carácter periódico (modo temporizador), o después de recibir un determinado número de flancos de bajada en una patilla (modo contador). Los dos modos incrementan los registros TLx y THx que piden una interrupción en el momento en que se desbordan. IE (Interrupt Enable, Dirección 0A8H, Direccionable a nivel Bit) Es el registro de permiso de interrupción. Cada interrupción puede ser enmascarada individualmente activando el bit que tiene asignado en este SFR. A continuación se detalla cada bit del registro. IE (0A8H) MSB EA X X LSB ES ET1 EX1 ET0 EX0 EA Habilitación Global de las interrupciones. Si EA = 0 no se atenderá ninguna interrupción. ES Desenmascara la interrupción del puerto serie. EXx Desenmascara la interrupción externa INTx. ETx Desenmascara la interrupción del Timer Tx. IP (Interrupt Priority, Dirección 0B8H, Direccionable a nivel Bit) Cada fuente de interrupción dispone de 2 niveles de prioridad. El nivel de prioridad de una interrupción se establece mediante el bit asignado a la misma en este registro. Una interrupción solo se verá interrumpida por otra de un nivel superior de prioridad. IP (0B8H) MSB X X X LSB PS PT1 PX1 PT0 PX0 PS Prioridad de la interrupción del puerto serie. (1 = ALTA, 0 = BAJA) PTx Prioridad de la interrupción del Timer Tx. PXx Prioridad de la interrupción externa INTx. Para comprender el funcionamiento de los registros relacionados con los timers y las interrupciones es recomendable consultar el capítulo 5 "Timers" (Características generales) y capítulo 7 "Interrupciones" (Introducción) respectivamente. SFRs que controlan el puerto serie SCON (Serial Control, Dirección 98H, Direccionable a nivel Bit) Este SFR controla el modo de operación del Puerto Serie del µC 8051. A continuación se explica de forma más detenida: SCON (98H) MSB SM0 SM1 SM0 REN TB8 MODO SM0 SM1 Descripción 0 0 0 Registro de Desplazamiento 1 0 1 UART de 8 bits 2 1 0 UART de 9 bits 3 1 1 UART de 9 bits RB8 TI LSB RI Velocidad fOSC/12 Variable fOSC/64 ó fOSC/32 Variable SM2 Si vale 1, habilita la comunicación Multiprocesador en los Modos 2 y 3. TI no se activará si el 9º bit recibido (RB8) vale "0". En Modo 1, RI no se activará si no se recibe un bit "STOP" válido. En Modo 0, SM2 debe ponerse a "0". REN Si vale 1, permite la Recepción de caracteres. TB8 Es el 9º bit a transmitir en los modos 2 y 3. RB8 En los Modos 2 y 3 contiene el 9º bit recibido. En Modo 1, recoge el bit "STOP". En Modo 0, no se utiliza. TI Flag de interrupción del transmisor. Se activa al final del 8º bit en Modo 0, o al inicio del bit "STOP" en los otros modos. Debe borrarse por programa. RI Flag de interrupción del receptor. Se activa al final del 8º bit en Modo 0, o dentro del bit "STOP" en los otros Modos (salvo modo multiprocesador). Debe borrarse por programa. SBUF (Serial Control, Dirección 99H) A efectos de tratamiento es un único registro (una sola dirección) pero internamente son dos registros. Ambos registros, son accesibles mediante el SFR SBUF. La escritura en SBUF carga el registro de escritura mientras que su lectura accede al registro de recepción. Para comprender el funcionamiento de los registros relacionados con el puerto serie es recomendable consultar el capítulo 6 "El puerto serie" (Introducción). VALOR DE LOS REGISTROS DESPUÉS DEL RESET Se produce un RESET al mantener la patilla reset (pin 9) a nivel alto durante al menos dos ciclos máquina (24 periodos de oscilador). figura: CIRCUITO DE INICIALIZACIÓN La entrada RST es muestreada en la fase S5P2 de cada ciclo máquina. Las patillas de los puertos conservan su estado lógico durante el tiempo correspondiente a 19 periodos del oscilador después de la fase S5P2 en la que se ha detectado un estado lógico 1 en RST. Por consiguiente, una línea de un puerto configurada como salida puede conservar su estado después de la aparición de una orden de inicialización durante un intervalo de tiempo que varia entre 19 y 31 periodos del oscilador Mientras la entrada RST está a 1, las señales ALE y PSEN' permanecen forzadas a estado 1. Cuando RST vuelve a pasr al estado inactivo 0, habrá que esperar uno o dos ciclos máquina antes que las señales recuperen su cadencia normal. figura: CRONOGRAMA DE INICIALIZACIÓN El contenido de los registros después de conectar la alimentación o después de hacer un reset es el siguiente: Registro * ACC *B * PSW SP DPTR DPH DPL * P0 * P1 * P2 * P3 * IP * IE * TMOD TCON TH0 TL0 Descripción Acumulador Registro B Registro de estado Puntero de pila Puntero a la memoria Puerto 0 Puerto 1 Puerto 2 Puerto 3 Control de prioridad de interrupciones Control de permiso de interrupciones Control de modo de los timers Control de los timers Byte alto contador de timer 0 Byte bajo contador de timer 0 Valor al reset 00H 00H 00H 07H 00H 00H 0FFH 0FFH 0FFH 0FFH 0XX00000b 0XX00000b 00H 00H 00H 00H TH1 TL1 * SCON SBUF PCON Byte alto contador de timer 1 Byte bajo contador de timer 1 Control de la línea serie Buffer de la línea serie 00H 00H 00H indeterminado HMOS 0XXXXXXXb (1) Control de encendido CHMOS 0XXX0000b X=Indefinido (1) *=Registro direccionable bit a bit HMOS y CHMOS son distintas tecnologías con las que pueden estar fabricados el µC 8051 OTROS SFRs Todos los SFRs mencionados hasta el momento existen en el 8051 estándar, y por lo tanto todos los µC derivados de éste deben conservarlos para mantener la compatibilidad. Cuando una compañía desarrolla un derivado del 8051 añade normalmente nuevas funciones y como consecuencia nuevos SFRs. Por ejemplo, el 80C552 compatible con el 8051, esto significa que todos los SFRs definidos anteriormente existen en éste, y por lo tanto cualquier programa que funcione en el 8051 también lo hará en el 80C552. Sin embargo, el 80C552 posee nuevas características (6 puertos E/S, un temporizador adicional de 16 bits, etc), las cuales requieren nuevos SFRs que son asignados a direcciones que no eran usadas en el 8051 original. Por eso si un programa que usa SFRs nuevos se pretende hacer funcionar en un 8051 estándar no lo hará de forma correcta. Capítulo 3 - Modos de direccionamiento Introducción INTRODUCCIÓN En el microcontrolador 8051 basado en una arquitectura de 8 bits permite el mando y el control de distintos procesos basándose en un juego de instrucciones. Este conjunto de instrucciones hacen posible el acceso a los datos y programa mantenidos en RAM interna, RAM externa y memoria de código. Para ello el µC 8051 dispone de una amplia gama de modos de direccionamiento. A todo esto se le añade la incorporación de un procesador booleano que trata directamente variables de tipo bit (variables booleanas). En este capítulo se pretende describir los distintos modos de direccionamiento soportados por el µC 8051 junto con su sintaxis. DIRECCIONAMIENTO INMEDIATO Hace referencia a un operando que se proporciona de forma inmediata, en la instrucción. Debido a que este dato se encuentra en la memoria de programa (código), memoria que generalmente sólo es accesible en lectura, se trata por definición de una constante. En cuanto a la sintaxis en el código fuente, el direccionamiento inmediato utiliza el carácter "#". Ejemplo: MOV A, #30H MOV A, #VAL ;Poner en ACC (Acumulador) el valor 30H ;Poner en ACC el valor establecido para el símbolo VAL DIRECCIONAMIENTO DIRECTO Uno de los operandos de la instrucción es una dirección de 8 bits sobre cuyo contenido va actuar la operación. La sintaxis del código fuente no emplea ningún signo particular. Ejemplo: MOV A, 30H ;Poner en ACC el dato situado en la dirección 30H Este modo de direccionamiento es el único medio de acceder a los registros de funciones especiales (SFRs). De forma general, el direccionamiento directo sólo afecta a los 128 bytes inferiores de la RAM interna y a los SFRs (80H a FFH) DIRECCIONAMIENTO POR REGISTRO El (o los) operando(s) de la operación están representados por nombres de registros. En realidad la operación actúa sobre los valores contenidos en estos registros. Ejemplo: MOV A, R1 ADD A, R0 ;Transferir a ACC el valor contenido en R1 ;Sumar a ese valor el contenido de R0 DIRECCIONAMIENTO INDIRECTO POR REGISTRO El direccionamiento indirecto por registro utiliza los registros R0 o R1 como una dirección de 8 bits. Estos punteros permiten trabajar con los datos situados en los 128 primeros bytes de la RAM interna (µC 8051) o con una página de 256 bytes de la memoria externa. En este último caso, la página es definida por el contenido del puerto P2. Este modo de direccionamiento no nos permite el acceso a los registros de funciones especiales (SFRs). En el código fuente se utiliza el signo " @ " para indicar la utilización de este modo de direccionamento. Ejemplo: MOV R0,#30H ;Poner el valor 30H mediante direccionamiento inmediato ;El contenido de la dirección 30H se pone en A MOV A, @R0 El mismo tipo de direccionamiento es posible con el registro de 16 bits DPTR (DPH-DPL); en este caso, el direccionamiento es aplicable a los 64 Kbytes de la memoria externa. Las instrucciones de empilado y desenpilado en memoria de pila utilizan este modo de direccionamiento por medio del puntero SP (Stack Pointer). DIRECCIONAMIENTO INDIRECTO INDEXADO POR REGISTRO Este modo de direccionamiento sólo permite acceder en modo lectura a la memoria de programa. Permite recuperar datos estructurados en forma de tabla colocada en el código de programa. Este modo de direccionamiento, el contador de programa PC o el puntero de datos DPTR hacen las veces de puntero. El desplazamiento añadido al valor de este puntero es el contenido del acumulador y el valor recuperado es colocado en el acumulador. Este modo de direccionamiento facilita el acceso a tablas de datos pero el valor de desplazamiento se pierde. Ejemplo: . INC A MOVC A, @A+PC ;Se añade 1 al valor de A para compensar la instrucción RET ;Después, A toma el valor 50H si A era 0 antes de la llamada a esta subrutina RET DB 50H DB 60H etc DIRECCIONAMIENTO DE BIT Como se hace mención al principio de este capítulo, el microcontrolador 8051 integra un procesador booleano para el cual el papel de acumulador es realizado por el indicador de acarreo CY, que para este uso se denomina C. Este µC posee una serie de instrucciones que permiten la realización de operaciones lógicas sobre bits, es decir, puede obtenerse una manipulación bit a bit. La dirección de estos bits se encuentra, por una parte, en la tabla de registros de registros de funciones especiales (SFRs cuya dirección es múltiplo de 8) y, por otra, en RAM interna (Dirección 20H-2FH). Ejemplo: MOV C, P1.3 ANL C, 17H ORL C, P2.0 MOV 7FH, C ;Poner el estado del bit 3 de puerto P1 en CY ;AND lógica con el bit 7 de la posición de RAM de dirección 22H ;OR lógica con el bit 0 del puerto P2 ;Guardar el resultado en el bit 7 de la posición de RAM (2FH) Las operaciones de bit son la puesta a 1, la puesta a 0, el complemento, el salto condicional según el estado del bit, el salto condicional sin un bit está a estado 1 y la puesta a 0 automática de el bit, el AND lógico, el OR lógico, etc. Capítulo 4 - Los puertos de Entrada/Salida (E/S) CARACTERÍSTICAS DE LOS PUERTOS Como se ha indicado en capítulos anteriores los cuatro puertos P0, P1, P2, P3 del 8051 constituyen 32 líneas bidireccionables que pueden ser empleadas tanto para entradas como para salidas, independientes unas de otras. Cada una de estas líneas corresponde con una patilla del circuito integrado lo que ha llevado al fabricante a dotar a ciertas líneas de estos puertos de una función auxiliar. La diversidad de funciones ha obligado a un diseño diferente para cada uno de los puertos. El registro asociado a cada puerto está constituido por ocho básculas de tipo D. Durante la inicialización del microcontrolador, las salidas de estas ocho básculas se ponen a 1. Esta situación ha de tenerse en cuenta siempre y cuando se utilice uno de los puertos como salida ya que la salida estará en estado alto al menos todo el tiempo de la fase "RESET" del microcontrolador y no pasará al estado deseado por el usuario hasta que se ejecute una instrucción de escritura en el registro correspondiente al puerto del que forma parte esa salida. Por el contrario, cuando la línea deba ser utilizada como entrada, este estado inicial es indispensable para una buena recepción de información exterior. La estructura general del "buffer" de salida conectado a la patilla del circuito integrado es tal que si este "buffer" se encuentra en estado bajo, impedirá los cambios de estado de la señal externa. Por tanto, antes de utilizar una línea de un puerto de entrada, es imprescindible asegurarse de que el bit que le corresponde en el registro del puerto esté en estado 1, tal como habrá sido puesto por la inicialización de controlador. Esta observación no se puede ignorar, ya que permite entender, por ejemplo, un mal funcionamiento en recepción del interfaz serie: el bit 0 de registro P3 (P3.0 <RxD>) debe estar a 1 para que la recepción sea posible. ESTRUCTURA DE UN PUERTO E/S Los puertos P1, P2 y P3 o Etapa de salida en tecnología HMOS o Etapa de salida en tecnología CMOS El puerto P0 La comunicación entre la unidad central propiamente dicha y las patillas del circuito integrado se establece mediante los tres bloques siguientes: a. b. c. Un registro de funciones especiales (SFR) que tiene el mismo nombre que el puerto Una etapa amplificadora de salida cuya estructura es diferente según la función auxiliar asociada a cada uno de ellos Un "buffer" de adaptación del nivel de entrada Aunque la estructura de las etapas amplificadoras de salidas son diferentes para cada uno de los puertos, las estructuras que a continuación se detallan muestran una similitud de estructura en lo refente a los bloques de registro y "buffer" de lectura. La parte común de esta estructura se muestra a continuación. figura: ESTRUCTURA GENERAL DE UNA DE LAS OCHO LINEAS DE E/S DE UNO DE LO PUERTOS La báscula de tipo D memoriza el dato proveniente del bus interno bajo control de la señal de escritura procedente de la unidad central. La salida Q de esta báscula se conecta al bus interno al ejecutarse una orden de lectura. De este modo es posible leer el contenido del registro. Pero también es posible una conexión entre la patilla del circuito integrado y el bus de datos interno. Esta conexión es gobernada mediante una señal de lectura de la patilla. Según el tipo de instrucción utilizada, la unida central puede leer el estado del registro o el estado lógico presente en la patilla del circuito. Los puertos P1, P2, P3 En esto tres puertos ,la etapa de salida está equipada con un transistor (ver figura) y con otros tres transistores cuyo montaje equivalente se representa por una resistencia de "pull-up" conectada a +Vcc. La representación utilizada muestra la lógica intermedia situada entre la salida del registro y la etapa de salida. Esta lógica puede variar dependiendo de la función auxiliar atribuida a cada uno de estos tres puertos. figura: ESTRUCTURA GENERAL DE UNA ETAPA DE LOS PUERTOS P1, P2, P3 Cada línea puede ser utilizada como una entrada o como una salida digital independientemente de las otras. En caso de ser utilizada como entrada, el bit del registro correspondiente debe estar en estado lógico 1. Esto se traduce en la salida Q a 1 mientras su complemento (Q negada) esta a 0. El transistor esta bloqueado. La patilla de entrada es llevada a un potencial proximo a +Vcc por medio de la pseudo-resistencia de "pull-up". Hay que tener en cuenta que si el elemento externo conectado a esta entrada presenta un estado lógico 0, habrá una circulación de corriente saliendo de esta entrada. Para que el puerto fuera verdaderamente bidireccional, la entrada debería estar en un estado de alta impedancia. Por esta razón, los puertos P1, P2, P3 son considerados sólo como <<casi bidireccionables>>. La realización de la resistencia de "pull-up" difiere según la tecnología empleada. Etapa de salida en tecnología HMOS A continuación se muestra la constitución detallada de una etapa de salida en tecnología HMOS. El transistor Q3 constituye el <<camino de bajada>> y los transistores Q1 y Q2 constituyen el <<camino de subida>> o pseudoresistencia de "pull-up" a +Vcc. El transistor Q1, capaz de suministrar una corriente grande, es activado únicamente durante dos periodos del oscilador. Esta activación tiene lugar durante una transición de 0 a 1. Cada fabricante indica la cantidad de corriente que se puede suministrar durante la conducción del transistor Q1. El transistor Q2 entrega una corriente más pequeña representada por IIL en las características eléctricas del puerto. El transistor Q3, capaz de absorber una corriente grande, esta en saturación cuando se programa el registro con un estado lógico 0. Su capacidad para absorber corriente viene especificada por el valor IOL. figura: DETALLE DE LA ETAPA DE SALIDA EN TECNOLOGÍA HMOS Etapa de salida en tecnología CMOS En tecnología CMOS, la resistencia de "pull-up" esta realizada mediante el acoplamiento de tres transistores Q1, Q2 y Q3. Estos tres transistores de efecto de campo son de tipo <<canal P>>. Durante la transición de 0 a 1 de la salida, el transistor Q1, se activa durante los dos periodos del oscilador S1P1 y S2P2. Mientras está activado suministra una corriente grande a la salida. El valor de esta corriente es similar al de la corriente que puede absorber el transistor Q1 de la etapa en tecnología HMOS para un estado de salida 0. La conducción de Q1 mejora la velocidad de cambio de estado de salida. El transistor Q2 permanece saturado mientras el bit del registro establezca un estado lógico 1 para la patilla de salida. Este transistor puede suministrar una corriente menor que Q1. El transistor Q3 esta saturado si el potencial de la patilla es superior a una tensión comprendida entre 1 y 1,5V. En caso que la línea sea empleada como entrada, este transistor permanecerá bloqueado si la patilla es forzada a un estado lógico 0 por un circuito externo. La etapa de salida entregará hacia la entrada una corriente limitada a la corriente que puede suministrar el transistor Q2. Por el contrario, cuando la línea es utilizada como salida puesta a un estado lógico 1, esta salida podrá entregar una corriente ITL que representa la suma de la corrientes suministradas por Q" y Q3. Así pues, el transistor Q3 permite limitar la potencia disipada cuando la linea es utilizada como entrada y aumentar el valor de la corriente entregada cuando la línea es utilizada como salida. figura: DETALLE DE LA ETAPA DE SALIDA EN TECNOLOGIA CMOS La tecnología CHMOS (CMOS) proporciona más velocidad, menos consumo y mayor densidad de integración que la tecnoligía HMOS (NMOS) El puerto P0 La estructura del puerto P0 se muestra detalladamente en la figura siguiente. La función auxiliar atribuida a este puerto requiere una lógica de conmutación y un diseño particular del "buffer" de salida. Comparando con los otros tres puertos, el puerto P0 es realmente bidireccional: puede presentar un estado lógico <<flotante>> (alta impedancia) cuando se configura como entrada. Esta característica se debe a la ausencia de resistencia interna de "pull-up" a +Vcc. En realidad el papel de resistencia de "pull-up" lo juega el transistor de efecto de campo de subida, pero éste no entra en acción salvo para accesos a memoria externa (empleo de la función auxiliar del puerto). Para garantizar un estado de alta impedancia a la entrada, es necesario bloquear también el transistor de bajada. Esto se consigue por la presencia de un estado lógico 1 a la salida del registro. Cuando P0 se utiliza como simple puerto de salida, se la debe de considerar de tipo drenador abierto y, por tanto, prever la colocación de resistencias externas de "pull-up" a +Vcc. figura: ESTRUCTURA PARTICULAR DEL PUERTO P0 PUERTOS P0 Y P2 EN EL ACCESO A MEMORIA EXTERNA Como se puede comprobar en la figura, sobre la etapa de salida se pueden aplicar dos fuentes de información: 1. Las salidas del registro P0 o el bus de direcciones, multiplexado a su vez con el bus de datos, para el puerto P0. 2. Las salidas del registro P2 o la parte alta (A8/A15) del bus de direcciones, para el puerto P2 La conmutación se determina internamente. Se efectúa mediante una señal de control que depende, por una parte, del estado de la patilla EA'(1) del microcontrolador y, por otra, del tipo de instrucción que se está ejecutando. El bus de direcciones es un conjunto de líneas que permiten al µC acceder a las distintas posiciones o localizaciones de un dispositivo dado. De este modo, en caso de que el dispositivo sea una memoria externa, este bus le permitirá al µC acceder a la posición de memoria indicada en su bus de direcciones, y que estará conectado al bus de direcciones de la memoria. Por otra parte el bus de datos es un conjunto de líneas que permite la entrada y salida de datos al microprocesador, siendo por tanto un bus bidirecional. figura: CONEXIÓN DE UNA RAM EXTERNA CON EL µC 8051 FUNCIÓN ALTERNATIVA DEL PUERTO P3 Según la función auxiliar atribuida a cada línea, se puede considerar una utilización alternativa tanto en la entrada como en la salida. Para garantizar un funcionamiento correcto de la línea cuando se emplea su función auxiliar es necesario mantener a nivel alto (1) la salida Q del biestable. En caso contrario, el transistor estará en saturación, forzando así la patilla del circuito integrado a un potencial próximo a 0V. figura: ESTRUCTURA DEL PUERTO P3 Funciones auxiliares al puerto P3 P3.0 RxD P3.1 TxD P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 INT0' INT1' T0 T1 WR' RD' Puerto Serie: recepción en modo asíncrono; entrada y salida de datos en modo síncrono Puerto Serie: transmisión de datos en modo asíncrono; salida de reloj en modo síncrono Interrupción externa 0, entrada de control Timer 0 Interrupción externa 1, entrada de control Timer 1 Entrada de conteo para Timer 0 Entrada de conteo para Timer 1 Señal de escritura para memoria externa Señal de lectura para memoria externa DIAGRAMA DE TIEMPOS Escritura en un puerto (salida) Lectura de un puerto (entrada) Podemos realizar operaciones de lectura/escritura sobre cualquiera de los puertos del microcontrolador, sin embargo, el puerto P0 es el que posee una mayor cargabilidad, pudiendo gobernar ocho cargas TTL-LS, mientras que los otros tres solo permiten cuatro cargas TTL-LS. Escritura en un puerto (salida) Cuando una operación provoca la modificación del contenido del registro asignado al puerto, el nuevo valor se presenta en las salidas de las básculas de tipo D durante el periodo S6P2 del último ciclo máquina necesario para la ejecución de la instrucción. Sin embargo, la etapa de salida sólo muestra la salida del registro en la fase P1 de cada periodo. En consecuencia, el nuevo dato no llega realmente a la salida (patilla del circuito integrado) antes del periodo S1P1 del siguiente ciclo máquina. figura: ESCRITURA DE UN PUERTO Lectura de un puerto (entrada) Cuando una instrucción provoca la lectura de las patillas de entrada de un puerto, los estados presentes en estas entradas son muestreados durante el periodo S5. De esta manera precisa, el muestreo tiene lugar en la fase S5P1 o en la fase S5P2 según se utilice el puerto como tal o en su función auxiliar (figura siguiente). Por lo tanto, cualquier variación de la entrada que se produzca a un ritmo superior a un ciclo máquina no se podrá tener en cuenta. figura: LECTURA DE UN PUERTO Capítulo 5 – Timers CARACTERISTICAS GENERALES Funcionamiento como Temporizador Funcionamiento como Contador El µC 8051 dispone de 2 Timers de 16 bits, el Timer 0 y Timer 1 que ser utilizados como contadores o como temporizadores. Funcionamiento como Temporizador Cuando funciona como temporizador (Timer), el registro contador se incrementa cada ciclo máquina. Se activa un indicador cuando el contador debido a un desbordamiento (<<overfloat>>), alcanza el valor 0. Estos indicadores aparecen en el registro TCON con los nombres TF0 Y TF1. Por lo tanto, lo podemos considerar como un contador de ciclos máquina, de tal manera que, como a cada ciclo máquina le corresponden 12 periodos de reloj, la razón de contaje es 1/12 la frecuencia del oscilador. Funcionamiento como Contador Cuando funciona como contador (Counter), el registro se incrementa en el flanco descendente de la señal externa aplicada a la patilla T0 o T1. La señal externa se muestrea durante el estado 5 de la fase 2 (S5P2) de cada ciclo maquina, Como el contador se incrementa cuando la entrada señala un nivel alto en un ciclo y un nivel bajo en el ciclo siguiente, el nuevo valor de contaje aparece en el registro durante el estado 3 de la fase 1 (S3P1) del siguiente ciclo máquina en el que la transición ha sido detectada, por lo tanto la razón de contaje es 1/24 de la frecuencia del oscilador, ya que se necesitan dos ciclos máquina para reconocer la transición del flanco descendente. Además de la posibilidad de elección entre estas dos funciones, los Timers 0 y 1 disponen de cuatro modos de funcionamiento diferentes, que permiten modificar el formato del registro de conteo o habilitar la recarga automática de un valor de consigna. El Timer 1 puede hacer las veces de generador de frecuencias del interface de comunicación serie. Este fenómeno se desarrolla en el capítulo 6 "El puerto serie" (Modos de funcionamiento de la línea serie). REGISTRO DE CONTROL El control del el Timer 0 y Timer 1 se realiza a través de los cuatro bits superiores del registro TCON. Este registro es direccionable bit a bit y está situado en la posición 38H de memoria interna dentro de los registros de funciones especiales (SFRs). La descripción de los cuatro bits utilizados por los timers son los siguientes: TCON MSB TF1 TCON.7 (TF1) TCON.6 (TR1) TCON.5 (TF0) TCON.4 (TR0) TR1 TF0 TR0 Flag de overflow del Timer 1 Flag de puesta en marcha del Timer 1 Flag de overflow del Timer 0 Flag de puesta en marcha del Timer 0 Este registro de control se muestra mas detalladamente en el capítulo 2 "Registros de Funciones eSpeciales (SFRs)" (SFRs que controlan las interrupciones y los timers\Registro TCON) REGISTRO DE MODO La configuración de un Timer (elección de su función y su modo) se efectúa mediante programación del registro de control TMOD. Este registro no es direccionable bit a bit y está situado en la posición 89H de la memoria interna dentro del área de registros de funciones especiales (SRFs) La descripción de los bits de este registro es la siguiente: TMOD MSB GATE C/T M1 M0 GATE C/T M1 LSB M0 Timer 1 Timer 0 Cada elemento se ha descrito en el capítulo 2 "Registros de Funciones eSpeciales" (SFRs que controlan las interrupciones y los timers/TMOD) MODO DE FUNCIONAMIENTO DE LO TIMERS Modo 0 - 13 bits Modo 1 - 16 bits Modo 2 - 8 bits auto-recarga Modo 3 El modo de funcionamiento de los timers se selecciona fijando los bits M0 Y M1 del registro TMOD. Modo 0 - 13 bits La frecuencia de entrada es 1/12 de la frecuencia del oscilador trabajando en modo Temporizador, o la frecuencia de la señal de entrada al pin Tx (1) si trabaja en modo contador (counter). El Timer funciona en este caso como un contador de 8 bits precedido por un predivisor de 32 . El registro del contador se configura, pues, como un registro de 13 bits: 5 bits en la parte baja para el predivisor (TLx) y 8 bits en la parte alta para la cuenta (THx). Cuando el contador pase de estar los 13 bits a 1, a estar todos a 0, el indicador de interrupción TRx se pone a 1. La entrada de conteo esta habilitada cuando TRx (bit de control del registro TCON) está a 1 y cuando GATE (Bit de modo de TMOD) está a 0, o bien cuando la entrada INTx se encuentra en estado 1. figura: TIMER 1 EN MODO 0 Para el Timer 0 sería lo mismo pero utilizando los registros correspondientes a este Timer. En este modo se produce el rebosamiento al contar 2^13=8.192 ciclos máquina o flancos de bajada, hecho que activa el fag de interrupción del timer utilizado. Los 5 bits de TLx son de menor peso, y los 3 de mayor peso son indeterminados, por lo que han de ser ignorados por el programador. Modo 1 - 16 bits El modo 1 es idéntico al modo 0 excepto porque el registro del contador emplea su capacidad completa (16 bits) sin predivisor, 8 en TLx y otros 8 en THx. El rebasamiento se produce al contar 2^16=65.536 ciclos máquina o flancos de bajada, con lo que se activa el flag de interrupción. Modo 2 - 8 bits auto-recarga El modo 2 de funcionamiento configura el Timer como un contador de 8 bits con recarga automática. La parte baja TLx sirve de contador. Cuando este contador llega a 0 por desbordamiento, el indicador TFx se pone a 1 y el contenido de THx se carga en el contador TLx. El valor de autorrecarga lo elige el programador según sus cálculos, y el caso de que fuera 00 hexadecimal, entonces se produciría el rebosamiento al contar 2^8=256 ciclos máquina o flancos de bajada. figura: TIMER/COUNTER (T1) EN MODO 2 Modo 3 Es un modo que proporciona dos contadores de 8 bits independientes, siendo los registros de contaje, el TL0 y el THO. El primero mantiene la estructura del Timer T0, y el segundo (ver figura) permite solamente la cuenta de ciclos máquina, realizándose su control directamente mediante la señal TR1 y activando el flag de interrupción del Timer T1 cuando se produce el rebosamiento. El modo 3 esta dirigido a las aplicaciones que necesitan un contador adicional de 8 bits. Con el Timer T0 configurado en modo 3, el 8051 posee un timer de 16 bits (T1) y dos timers de 8 bits. Esta característica sólo es utilizable en aplicaciones en las que el Timer T1 no requiera su recurso de interrupción, puesto que en este caso su indicador (TF1) está unido a la salida del contador de 8 bits en que se convierte TH0. figura: TIMER/COUNTER (T0) EN MODO 3 En modo 3, el Timer 1 está bloqueado como si su bit de control TR1 estuviera a 0. Se utiliza el termino "x" haciendo referencia a la utilización tanto del Timer 0 (T0) como del Timer 1 (T1) indistintamente. (1) Capítulo 6 - El puerto serie INTRODUCCIÓN El µC 8051 está equipado con 1 puerto serie: el puerto serie UART (Transmisor Receptor Asíncrono Universal). La interfaz de comunicación serie es accesible físicamente gracias a la función secundaria de dos líneas del puerto P3. Se trata del terminal RxD (P3.0) para recepción y del terminal TxD (P3.1) para transmisión. El puerto serie funciona en "full-duplex", es decir, es capaz de recibir y transmitir simultáneamente. Posee un buffer de recepción que permite la recepción de un byte antes de la lectura anterior, siempre y cuando la lectura del primer byte se efectúe antes de la recepción del último bit del segundo byte. Los registros de recepción y transmisión son ambos accesibles en la misma dirección de la RAM interna, designada por el símbolo SBUF cuyo valor es 99H. FORMATO DE COMUNICACIÓN Comunicación serie asíncrona Comunicación serie síncrona En la comunicación serie se puede tener la comunicación serie síncrona o la comunicación serie asíncrona. En el primer caso se necesitan los siguientes hilos: 1 para la alimentación (Vcc), 1 para la tierra (GND), 1 para datos (los cuales viajan a través de un hilo) y 1 para el clock o señal de síncronismo (cuyos pulsos también viajan). En cambio, en el segundo caso son necesarios: 1 hilo para VCC, 1 para GND y 1 para datos. Comunicación serie asíncrona A continuación se muestra el Protocolo Asíncrono Universal: Para que tanto el transmisor como el receptor puedan comunicarse sin ningún tipo de problema es necesario que ambos dispositivos estén de acuerdo en el formato de la comunicación, es decir, coincidan en: 1. La velocidad de comunicación tiene que ser la misma para ambos dispositivos , expresada en Baudios (bits/seg) 2. Cuantos bits de datos se van a enviar/recibir: 5, 6, 7, 8, 9. 3. Qué bit de dato se envía/recibe en primer lugar: LSB, es decir el de menor peso. 4. Qué paridad se utiliza en la comunicación: PAR, IMPAR, NO, etc. 5. Cuántos bits de STOP se van a enviar/recibir: 1, 1'5, 2. Comunicación serie síncrona Como se ha comentado anteriormente, normalmente se tienen 2 hilos (sin contar el de la alimentación y tierra): por uno viajan los datos y por el otro los pulsos de reloj o clock. Al disponer de los pulsos de clock, la velocidad de comunicación de transistor no tiene por qué ser igual a la del receptor. Los datos se leen en los flancos de bajada o en los de subida del clock (depende de los dispositivos, el bus, etc.) A pesar de todo, es posible establecer una comunicación serie síncrona utilizando un único hilo por el cual viajan tanto los datos como los pulsos de clock de forma codificada. Por ejemplo; para un periodo T, 1º 1/3T "a" 1 significa "0", y 1º 2/3T a "1" significa "1". El rendimiento de la comunicación serie síncrona suele ser casi del 100%, porque los datos no van precedidos ni seguidos de otras señales auxiliares como son el bit de START, de PARIDAD, de STOP, etc. En cambio,el rendimiento de una comunicación serie asíncrona en el modo 1 UART, 8 bits datos + 1 bit de start + 1 bit de stop, es del 80%. EL REGISTRO DE CONTROL El control del puerto serie se realiza gracias al registro de funciones especiales SCON que es direccionable bit a bit y está situado en la dirección 98H. Este registro sirve para programar la línea serie del 8051 en sus diferentes modos de funcionamiento. La descripción de los bits de este registro es el siguiente: SCON MSB SM0 SM1 SM2 REN TB8 RB8 TI LSB RI Cada elemento se ha descrito en el capítulo 2 "Registros de Funciones eSpeciales" (SFRs que controlan el puerto serie/SCON) MODOS DE FUNCIONAMIENTO DE LA LINEA SERIE Modo 0 o Funcionamiento como registro de desplazamiento Modo 1 o Funcionamiento en modo 1 Modos 2 y 3 o Funcionamiento en los modos 2 y 3 El µC 8051 dispone de 4 modos de comunicación serie distintos. Estos modos se describen más detalladamente a continuación. Modo 0 En el modo 0 el puerto serie funciona como un registro de desplazamiento de 8 bits. La entrada de datos se realiza a través de la patilla RxD (P3.0). Cada dato está compuesto por una palabra de 8 bits, siendo el primero en salir o en llegar el bit menos significativo, el LSB. Tanto en transmisión como en recepción, la salida de los pulsos de clock se produce por la patilla TxD (P3.1). La lectura de datos en recepción se realiza en los flancos de subida de la señal de reloj. El formato de la palabra es el siguiente: La velocidad de comunicación es fija y vale fosc/12. Para fosc=11'0592MHz la velocidad de comunicación es: Vcom=11.059.200/12=921.600 Baudios (bits/seg) Este modo de comunicación es serie síncrono. Puede ser utilizado para ampliar en número de entradas y salidas del µC mediante el empleo de registros de desplazamiento externos conectados a la línea serie. Funcionamiento como registro de desplazamiento (modo 0) La transmisión (figura siguiente) es iniciada por una instrucción que emplea la dirección SBUF como destino (por ejemplo, MOV SBUF, A). La señal de <escritura en SBUF> que aparece en la última fase del ciclo de ejecución de la instrucción (S6P2) hace que se cargue un <<1>> en la novena posición del registro de desplazamiento de transmisión y arranca el ciclo de transmisión. Un ciclo máquina después de la aparición de esta señal, se activa la orden interna SEND. SEND habilita la salida del registro de desplazamiento por la patilla P3.0 (RxD) y habilita también la salida de reloj de desplazamiento por la patilla P3.1 (TxD). El reloj de desplazamiento permanece a nivel bajo durante S3, S4 y S5 de cada ciclo de máquina y a nivel alto durante S6, S1 y S2. Mientras SEND está activa, el registro de transmisión es desplazado una posición a la derecha en cada instante S6P2 de cada ciclo máquina. Mientras los bits de datos salen por la derecha, se introducen ceros por la izquierda. Cuando el bit más significativo del byte de datos se encuentra en la posición de salida, el uno que se cargó inicialmente en novena posición se encuentra justo a su izquierda y todas las otras posiciones están ocupadas a ceros. Esta condición indica al bloque de control TX que debe de efectuar un último desplazamiento seguido de la desactivación de SEND y la puesta a 1 de TI (flag de transmisión). El conjunto de estas operaciones dura diez ciclos máquina desde la señal de escritura en SBUF. La recepción (figura siguiente) es iniciada por la condición REN=1 y RI=0 (flag de recepción). En el periodo S6P2 del siguiente ciclo máquina, la unidad d control RX introduce los bits 11111110 en registro de recepción y la siguiente fase de reloj activa la señal RECEIVE, que a su vez activa la salida del reloj de desplazamiento por el terminal P3.1. El reloj cambia de estado en las fases S3P1 de cada ciclo máquina. Mientras que RECEIVE está activado, el contenido del registro de desplazamiento se desplaza una posición hacia la izquierda en la fase S6P2 de cada ciclo máquina. El valor que entra por la derecha se obtiene al muestrear el terminal P3.0 durante la fase S5P2 del mismo ciclo máquina. Los bits de datos desplazan hacia la izquierda los 1 que se cargaron inicialmente en el registro de recepción. Cuando el cero se encuentra en la última posición de la izquierda, el bloque de control RX realiza un último desplazamiento seguido de la carga de SBUF. Considerando como origen de tiempos el instante en que el indicador RI se ha puesto a 0, la báscula RECEIVE se pone a 0 y el indicador RI a 1 en la fase S1P1 del décimo ciclo máquina. El esquema de funcionamiento del puerto serie en modo 0 se representa en la figura siguiente. figura: PUERTO SERIE EN MODO 0 Modo 1 El puerto serie funciona como un UART de 8bits con velocidad de comunicación variable. La entrada de datos se produce a través de la patilla RxD y la salida de datos a través de la patilla TxD. Se transmiten 10 bits: 1 bit de START 8 bits de DATOS (primero LSB) 1 bit de STOP (1), RB8 en recepción El formato de la palabra es el siguiente: La velocidad de comunicación es variable y la determina el Timer 1 al desbordarse. El Timer 1 puede ser configurado como temporizador o como contador en sus 4 modos de funcionamiento. Normalmente, para la generación de baudios se utiliza como temporizador en el modo 2 (temporizador de 8 bits con autorrecarga). También hay que tener en cuenta el estado del bit SMOD del SFR PCON, el cual si está activado duplica la velocidad de comunicación del puerto serie en los modos UART (1, 2, 3). A este bit se le conoce con el nombre de " bit duplicador de velocidad". El valor de la velocidad de comunicación nos vendrá dado por la formula: Funcionamiento en modo 1 La transmisión (figura siguiente) es iniciada por la instrucción que utiliza SBUF como registro destino (por ejemplo. MOV SBUF, A). La señal de escritura en SBUF provoca que se cargue un 1 en la novena posición del registro de transmisión e indica a la unidad de control TX que se ha pedido una transmisión. Esta comienza en la fase S1P1 del siguiente ciclo máquina (el envío del bit con el contador divido por 16 con la señal de escritura en SBUF). La transmisión comienza con la activación de SEND que hace que el bit de START comience a salir por TxD. Un poco después se activa DATA, que habilita la salida del registro TxD. A medida que los bits salen por la derecha, por la izquierda se introducen ceros. Cuando el bit de datos más significativo se encuentra en la posición de salida en el registro de desplazamiento, el uno que se había cargado inicialmente en la novena posición se encuentra en la segunda, seguido por una serie de ceros. Esta condición indica al bloque de control TX que se debe efectuar un último desplazamiento, desactivar SEND y poner a TI a 1. La recepción (figura siguiente) se inicia al detectarse una transición de 1 a 0 en la patilla RxD. Éste es el motivo por el que RxD se muestrea a una frecuencia 16 veces mayor que la frecuencia de recepción. Al detectarse esta transición, se inicializa un contador de 16 y en el registro de desplazamiento se escribe el valor 1FFH. Los dieciséis períodos del contador de 16 permiten dividir en dieciseisavos el período de recepción de un bit. En el séptimo, octavo y noveno períodos de este contador, el detector de bit muestrea el valor de RxD. El valor almacenado es el valor leído al menos dos veces de las tres. Este método aumenta el rechazo del ruido. Si el primer bit detectado no era un <<0>> (bit de START), el circuito de recepción se reinicializa y queda a la espera de una nueva transición de 1 a 0. Si el bit de START es válido, se lleva a la entrada del registro de desplazamiento y se puede recibir el resto de los bits. A medida que los bits llegan por la derecha, la salida de los unos se produce por la izquierda. Cuando el bit de START se encuentra en la posición de salida (en el registro de 9 bits), la unidad de control RX ejecuta un último desplazamiento, carga el dato en SBUF y RB8 y pone a 1 el indicador RI. La señal de carga de SBUF y de RB8, y la puesta a 1 de RI se produce si y sólo si se da la siguiente condición en el último desplazamiento: RI=0 y (SM2=0 o bit STOP=1) Si esta condición no es verdadera, la trama de recepción se pierde y RI no se pone a 1. Si la condición es verdadera, el bit de STOP se coloca en RB8 y los 8 bits de datos se cargan en SBUF. En este instante, tanto si la condición ha sido satisfecha como si no, la unidad queda de nuevo a la espera de una transición de 1 a 0 en RxD. El esquema de funcionamiento del puerto serie en modo 1 se representa en la figura siguiente. figura: PUERTO SERIE EN MODO 1 Modos 2 y 3 El puerto serie se comporta como un UART de 9 bits con velocidad de comunicación fija para el modo 2 y variable para el modo 3. La entrada de datos se produce a través de la patilla RxD y la salida de datos a través de la TxD. Se transmiten/reciben 11 bits: 1 bit de START (0) 8 bits de DATOS (primero LSB) 1 bit de DATO, el 9º bit, programable por el usuario y que normalmente se utiliza como bit de paridad. En recepción es el bit RB8 y en transmisión el TR8, ambos del SFR SCON 1 bit de STOP (1), RB8 en recepción El formato de la palabra es el siguiente: Los modos 2 y 3 se diferencian únicamente en la velocidad de comunicación. La velocidad de comunicación del modo 3 se obtiene de la misma forma que para el modo 1, es decir, a través del timer T1. La velocidad de comunicación en modo 2 ofrece 2 posibilidades, en función del estado binario del bit SMOD del registro PCON. Funcionamiento en los modos 2 y 3 La transmisión (figuras siguientes) se inicia mediante una instrucción que emplee SBUF como registro destino. La señal de escritura de SBUF carga e noveno bit del dato , situado en TB8, en la novena posición de registro de desplazamiento, e indica a la unidad de control TX que se requiere una transmisión. La transmisión comienza el el periodo S1P1 del ciclo máquina que sigue al paso a 0 del contador divisor por 16. La transmisión comienza con la activación de SEND, que pone el bit de START en TxD. Un periodo de bit después se activa DATA, señal que habilita la salida por TxD del bit saliente del registro de desplazamiento. El primer impulso de desplazamiento aparece un período de bit más tarde. Este primer impulso introduce el 1 del bit de STOP en la novena posición del registro de desplazamiento. Después de esto, hay una serie de ceros que se introducen por la izquierda durante los desplazamientos. Cuando el bit de TB8 está en la posición de salida y el bit de STOP justo a su izquierda, el resto de los bits del registro de desplazamiento son ceros. Esta condición indica a la unidad de control TX que debe de realizar un último desplazamiento, desactivar SEND y poner a 1 el indicador TI. Esta situación se produce en la duodécima vuelta del contador divisor por 16 desde la escritura en SBUF. La recepción (figura siguiente) se inicia cuando se detecta una transición de 1 a 0 en la patilla RxD. Para ello, la patilla RxD se muestrea a una frecuencia 16 veces mayor que la frecuencia de recepción que se ha establecido. Cuando se detecta la transición, se reinicializa el contador divisor por 16 y se escribe el valor 1FFH en el registro de desplazamiento de entrada. Los dieciséis periodos del contador de 16 permiten la división en dieciseisavos del periodo de recepción de un bit. El detector de bit muestrea el valor de RxD en los periodos séptimo, octavo y noveno del citado contador. El valor que se almacena es el valor leído al menos dos veces de la tres.Este método aumenta el rechazo del ruido. Si el primer bit detectado no fuera un <0> (bit de START), el circuito de recepción se reinicializaría y esperaría una transición de 1 a 0. En el caso de ser válido el bit de START, éste se lleva a la entrada del registro de desplazamiento y se pueden recibir el resto de los bits. A medida que los bits llegan por la derecha, la salida de los unos se produce por la izquierda. Cuando el bit de START se encuentra en la posición más a la izquierda (en el registro de 9 bits), la unidad de control RX ejecuta el último desplazamiento. La carga del dato en SBUF y en RB8, y la puesta a 1 del indicador RI se producen si y sólo si se da la siguiente condición en el último desplazamiento: RI=0 y (SM2=0 o noveno bit=1) Si esta condición no es verdadera, la trama de recepción se pierde y RI no se pone a 1. Si la condición es verdadera, el noveno bit se coloca en RB8 y los 8 primeros bits se cargan en SBUF. Pasado un período de bit, tanto si la condición ha sido satisfecha como si no, la unidad queda de nuevo a la espera de una transición de 1 a 0 en RxD. El esquema de funcionamiento del puerto serie en modos 2 y 3 se representan en los diagramas de bloques y en el cronograma que es equivalente para ambos modos. figura: PUERTO SERIE EN MODO 2 figura: PUERTO SERIE EN MODO 3 COMUNICACIÓN ENTRE µCs Un entorno multiprocesador no es otra cosa que una red de µC conectados entre sí. Una de las formas de realizar un entorno multiprocesador con microcontroladores 8051(familia 51), es a través de sus respectivos puertos serie UART. En el caso del puerto serie UART, esto es posible en los modos 2 y 3 que tienen una configuración especial que sirve para la comunicación entre procesadores. En estos modos se transmiten 11 bits (1 start, 8 dato, 1 dato programable, 1 stop). Aunque ambos modos son posibles para la comunicación, se elige el modo 3 porque ofrece mayor flexibilidad a la hora de determinar la velocidad de comunicación del sistema. figura: DIAGRAMA COMUNICACIÓN ENTRE µCs MAESTRO-ESCLAVO El noveno bit corresponde al bit programable y es el que indica al µC que se ha recibido una dirección de esclavo. La forma de proceder es la siguiente: Cuando el procesador maestro quiere transmitir un bloque de datos, primero envía un byte de dirección que identifica al esclavo. Una dirección se diferencia de un dato en el que el 9º bit es 1 mientras que un dato 9º bit es un 0. Siempre que este SM2 (bit que pertenece al registro SCON) a 1, un esclavo no podrá ser interrumpido por un byte de dato (9º bit=0). Un byte de dirección provocará una interrupción en cada esclavo. Cada uno de estos esclavos examinará el byte recibido y lo comparará con su dirección particular. El esclavo direccionado pondrá a 0 en bit SM2 (En SCON) y se preparará para recibir el bloque de datos. Los esclavos que no han sido direccionados seguirán con el bit SM2 a 1 y por lo tanto no serán interrumpidos por los datos enviados. Par finalizar la transmisión, el maestro enviará un byte de dirección. De este modo será detectado por el esclavo receptor y servirá para que finalice la recepción activando de nuevo el bit SM2. Este byte de dirección será un byte específico para finalizar transmisiones. Link Bar 1 Contenido>Indice>Intro Tutor Capítulo 7 - Interrupciones INTRODUCCIÓN Una interrupción es una señal de llamada que detiene temporalmente la ejecución del programa principal para realizar una nueva tarea. Cuando se habla de "realizar una nueva tarea", se trata de la ejecución de una serie de instrucciones que realizan una acción determinada, pero limitada en el tiempo, y que al finalizar hará que se siga ejecutando el programa principal justo en el punto donde y como de dejó antes de producirse la interrupción. Este conjunto de instrucciones o sentencias, forman lo que se conoce como subrutina de servicio de interrupción. Cada fuente de interrupción del µC, tiene reservada un área de memoria de código para albergar este conjunto de instrucciones, 8 bytes contiguos para la familia 51. La primera dirección de estas 8, recibe el nombre de vector de interrupción. Si la extensión de la subrutina de interrupción supera el área reservada para ella, entonces mediante instrucción se salta a otra zona libre donde no haya problemas de espacio. Cuando se produce una interrupción, la CPU guarda en memoria de pila el valor del contador de programa PC (que contiene la dirección de código que contiene la siguiente instrucción que se tiene que ejecutar, pero después de finalizarse la interrupción) y seguidamente lo carga con el vector de interrupción. Así, se comenzará con la ejecución de la subrutina de servicio de interrupción y lo primero que tendrá que hacer es, guardar en la memoria de pila (empilar) los valores de los registros utilizados por el programa principal para que no sean solapados por los de la subrutina, después realizará la acción correspondiente a la interrupción ejecutando las instrucciones necesaria para ello, seguidamente, recuperará de la pila (desempilar) los valores de los registros utilizados por el programa principal, pero en orden inverso, y finalmente dará fin a la subrutina la instrucción de retorno de subrutina de interrupción, RET I, pero antes desactivará el flag que solicito es interrupción si es que no lo desactiva el sistema de interrupciones A la vuelta de la interrupción, el programa seguirá ejecutándose en las mismas condiciones en las que se dejó antes de la misma y habrá sufrido una demora de tiempo que es la suma de los tiempos: de salto de ida, de ejecución de todas las instrucciones de la subrutina, de salto de vuelta. La memoria de pila es de tipo LIFO (Last In Frist Out), la instrucción para el empilado es PUSH, y para el desempilado, POP. El contador de programa, PC, es el único registro que empila y desenpila la CPU de la familia 51 de forma automática, es decir, por hardware. El resto de los registros compartidos por el programa principal y la subrutina, tienen que ser empilados y desempilados por software, de forma manual, utilizando las instrucciones arriba mencionadas, tarea que corresponde al programador. El 8051 básico tiene cinco fuentes de interrupción con 2 niveles de prioridad. Todas estas fuentes de interrupción son << enmascarables>>, es decir, se pueden habilitar por software. Después de la inicialización todas las interrupciones están inhibidas. El registro IE sirve para habilitar o inhibir individualmente las fuentes de interrupción. TABLA DE INTERRUPCIONES Los vectores de interrupción se disponen de la siguiente manera: La primera instrucción que se ejecuta después de una inicialización (RESET=1) es la que se encuentra en la dirección 0000H de la memoria de programa. El fabricante ha reservado 3 bytes para esta primera instrucción, lugar que corresponde a una instrucción de salto que inicializa al µC en el programa principal. Por ello, el primer emplazamiento reservado a las subrutinas que deben atender las diferentes interrupciones del programa principal se haya situado en la dirección 0003H. Las direcciones correspondientes a los vectores de interrupción están separadas entre sí 8 bytes. En la mayoría de los casos, este espacio no es suficiente para contener la subrutina de servicio de interrupción, por lo que se utilizan desplazamientos (llamadas) a zonas de memoria donde puede residir el código en su totalidad. Tabla: Direcciones de los vectores de interrupción Indicador Dirección del vector Int, Externa 0 (INT0) IE0 0003H TIMER 0 TF0 000BH Int. Externa 1 (INT1) IE1 0013H TIMER 1 TF1 001BH RI+TI 0023H Fuente de interrupción Puerto Serie HABILITACIÓN DE INTERRUPCIONES Después de la inicialización del microcontrolador, todas las fuentes de interrupción están inhibidas debido a que se han puesto a cero los bits de registro IE (interrupt enable register). Para poder utilizar el mecanismo de interrupciones, es necesario, por lo tanto comenzar por habilitar la o las fuentes de interrupción empleadas por la aplicación. En este sentido, cada fuente de interrupción puede ser habilitada o desahabilitada individualmente, activando o desactivando el bit (poniendo a 1 ó a 0, respectivamente) que tiene asignado el registro de habilitación de interrupciones (IE). Este registro es direccionable bit a bit y está situado en la posición 0A8H de memoria interna dentro de los SFRs. La descripción de los bits de este registro es la siguiente: IE (0A8H) MSB EA X X LSB ES ET1 EX1 ET0 EX0 Cada elemento de este registro se ha descrito en el capítulo 2 "Registro de Funciones eSpeciales"(SFRs que controlan las interrupciones y los timers/IE NIVELES DE PRIORIDAD Cada fuente de interrupción dispone de 2 niveles de prioridad. Dicho nivel se establece poniendo a 1 ó a 0 el bit asignado a la fuente de interrupción en al registro de prioridad de interrupciones IP (Interrupt priority register) donde 0 establece la prioridad baja y el 1 prioridad alta. Este registro es direccionable bit a bit y esta situado en la posición 0B8H de memoria interna dentro del área de SFRs. La descripción de este registro es la siguiente: IP (0B8H) MSB X X X LSB PS PT1 PX1 PT0 PX0 Cada elemento de este registro se ha descrito en el capítulo 2 "Registros de Funciones especiales" (SFRs que controlan las interrupciones y los timers/IP). SOLICITUD DE DOS O MAS INTERRUPCIONES En la práctica, es posible que se soliciten dos o más interrupciones, de forma no simultanea, o también de forma simultanea. Este apartado dará a conocer cada caso por separado. Solicitud de dos interrupciones no simultaneas 1. Cuando se procesa una interrupción de nivel de prioridad bajo, esta puede se interrumpida por otra de nivel alto. 2. Cuando se procesa una interrupción de nivel de prioridad bajo, no puede ser interrumpida por otra de nivel bajo. Tras finalizar la primera, se procesará la segunda si es que el flag correspondiente permanece todavía activado. 3. Cuando se procesa una interrupción de nivel de prioridad alto, no puede ser interrumpida por otra de nivel alto. Tras finalizar la primera, se procesará la segunda si es que el flag correspondiente permanece todavía activado. 4. Cualquier interrupción, independientemente del nivel de prioridad que posea, puede ser interrumpida por la interrupción RESET. figura: Estructura general de sistema de interrupciones (8051) Solicitud de dos o más interrupciones simultaneas 1. Si tienen distinto nivel de prioridad, se atenderá la de mayor nivel de prioridad, y cuando finalice la primera, se procesará la segunda si es que el flag correspondiente permanece todavía activado. 2. Si tienen el mismo nivel de prioridad, se atenderá la de mayor prioridad, dentro del mismo nivel de prioridad en el sistema de interrupciones. PROCESO DE INTERRUPCIÓN Interrupciones externas Interrupciones de los timers Interrupciones del puerto serie Como se ha indicado en capítulo 8 el ciclo máquina del µC 8051 está compuesta por 12 pulsos de reloj. Dos ciclos completos de reloj forman un estado, habiendo un total de 6 por cada ciclo máquina, y cada estado esta compuesto por dos fases (P1 y P2). Los flags de interrupción son muestreados por el sistema de interrupciones en la fase 2 del estado 5 (S5P2) de cada ciclo máquina y se procede con su procesamiento a no ser que exista una situación de bloqueo. Si no existe ninguna situación de bloqueo: 1. En el primer ciclo máquina el sistema de interrupciones detecta los flags activados. 2. En el segundo ciclo máquina se realiza el escrutinio de las interrupciones, analizando si están habilitadas y si es así, cuál es su nivel de prioridad, al mismo tiempo que puede ejecutarse un instrucción de 1 ciclo máquina o terminar la que estaba ejecutando 3. Durante los ciclos máquina 3 y 4, el sistema de interrupciones genera un LCALL (llamada) al vector de la interrupción que seguidamente se va a ejecutar. Por lo tanto, el tiempo mínimo de respuesta de una interrupción, sin que haya ninguna situación de bloqueo, que tiene el µC desde que solicita ésta hasta que comienza su ejecución, es algo mayor que la duración de 3 ciclos máquina. Por otro lado, estas son la situaciones de bloqueo con las que se puede encontrar el sistema de interrupciones: Se está ejecutando una instrucción en el ciclo máquina 3, y hasta que no finalice no se puede generar el LCALL (llamada) por hardware al vector de interrupción Se está atendiendo otra interrupción con nivel de prioridad igual o mayor, entonces al menos una instrucción más del programa principal tendrá que ser ejecutada antes de que la interrupción sea vectorizada (el PC se carga con el vector correspondiente) Se está ejecutando la instrucción RET I o alguna de acceso a IE o a IP, entonces al menos una instrucción más del programa principal tendrá que ser ejecutada antes que la interrupción sea vectorizada. En caso de bloqueo y dado que el muestreo de los indicadores de interrupción se repite en cada ciclo máquina, la nueva muestra reemplaza a la antigua y, si la petición de interrupción todavía está presente, será tenida en cuenta en el siguiente ciclo máquina. En caso de que la petición de interrupción provenga de una fuente interna (Puerto serie, Timer, ..), el indicador aún estará activo, bien porque debe estar desactivado por programa, o bien porque se vuelve a poner a cero en el momento del salto a la subrutina de servicio de la interrupción. Por tanto, la petición de interrupción se tendrá en cuenta de nuevo inmediatamente después del bloqueo. Por el contrario, en caso de una interrupción proveniente de una fuente externa programada para interrumpir por nivel, es posible que la petición de interrupción nunca sea atendida. Al bloquearse la petición es preciso que el cambio de estado dure hasta el próximo muestreo, un ciclo de máquina más tarde, para que un nuevo análisis conduzca a la ejecución de la petición. Interrupciones externas Utilizando dos líneas del puerto P3 cuyas funciones secundarias son, respectivamente INT0' (1) e INT1' se puede definir que ocurra una interrupción externa. Las interrupciones externas INT0' e INT1' se pueden programar por nivel (cambio de estado lógico) o por flanco (cambio de estado de 1 a 0). El control se realiza con el registro TCON (cuatro bits de menor peso LSB). TCON IE1 IT1 IE0 LSB IT0 Si IT0 e IT1 están a 1, la petición de interrupción en INT0' e INT1' respectivamente se hace por flanco de bajada, mientras que si están a 0 se hace por nivel bajo. Los bits IE0 e IE1 se ponen a 1 cuando ha habido una petición de interrupción INT0' o INT1' respectivamente. Estos bits también pueden servir para provocar cualquiera de las dos interrupciones por software. Para hacer esto, primero hay que habilitar la interrupción en el registro IE y luego poner el bit IT0 o IT1 a 1 para habilitar la interrupción por flanco de bajada, seguidamente activar el bit IE0 o el IE1 para hacer la petición de INT0' o INT1' respectivamente. Esto provocará la interrupción exactamente igual que si se hubiera producido por hardware. Cuando el programa salta a la subrutina de interrupción automáticamente se borra el bit de petición de interrupción correspondiente (IE0 o IE1) mientras que el bit de modo de petición (IT0 o IT1) se mantiene invariable siempre y cuando se haya producido por flanco de bajada. En cambio, si se ha producido por un cambio de estado lógico el indicador IE0 o IE1 permanecerán a 1, por lo que han de ser puestos a cero por programa. Interrupciones de los timers Los indicadores o flags TF0 y TF1, correspondientes a el timer 0 y timer 1 respectivamente, reflejan las peticiones de interrupción de estas dos fuentes. Cuando se produce un desbordamiento (overflow) en los timers se produce un pulso en TFx (automáticamente se pone a 0) que a su vez provoca una interrupción (si está permitida). Esta interrupción hace que el programa principal salte al lugar indicado por el vector de interrupción correspondiente. Interrupción del puerto serie En el puerto serie existen dos indicadores que reflejan las peticiones de interrupción. Se trata de los indicadores o flags RI y TI. El falg RI indica la petición de interrupción debida a la recepción de un byte a traves de la línea serie y el flag TI indica que el buffer de transmisión está libre, siendo posible el envío de un nuevo byte. Estos indicadores no se ponen automáticamente a 0 por lo que el propio programador ha de hacerse con el cargo de ponerlos a 0. La petición de interrupción se reconoce sobre la operación lógica <<OR>> entre los dos indicadores RI yTI. (1) El carácter < ' > utilizado en todo el tutorial indica que el elemento a que se refiere es activo a nivel bajo, esto es, es activo cuando su nivel lógico es un cero. Capítulo 8 - Características del µC 8051 ESTRUCTURA BÁSICA DEL µC 8051 Desde mediados de la década de los 80 gran parte de los diseños basados en la automatización (electrodomésticos, sencillas aplicaciones Industriales, instrumentación medica, control numérico, etc..) utilizaban componentes de la familia 51. Esta familia 51 es una familia de microcontroladores basados todos ellos en un chip que es es el 8051. Este chip fue creado por INTEL en el año 1981 y las características de este son: o o o o o o o o o o o CPU de 8 bits Procesador Booleano con el cual puede realizar operaciones bit a bit 128 bytes de RAM interna 4 Kbytes de memoria de programa internos (ROM) 5 fuentes de interrupción con 2 niveles de prioridad 32 bits de entrada/salida direccionables bit a bit 1 línea serie Full dúplex (UART) 2 Contadores-Temporizadores de 16 bits programables 1 oscilador para las señales de reloj Posibilidad de direccionar 64Kbytes de memoria de programa externa Posibilidad de direccionar 64Kbytes de memoria de datos externa Posteriormente han sido desarrollados otras versiones del 8051 con distintas características de RAM, ROM, etc.. La arquitectura básica del 8051 es mostrada en la siguiente figura. figura b: CONFIGURACIÓN INTERNA DEL µC 8051 BÁSICO Link Bar 2 Contenido>Indice>Intro Tutor DESCRIPCIÓN DE LAS PATILLAS DEL µC 8051 Todos los fabricantes disponen de los microcontroladores 8051y sus versiones CMOS en encapsulado DIP de 40 patillas y en encapsulado PLCC de 44 patillas. En la siguiente figura se puede ver la distribución de patillas del µC 8051 según los formatos PLCC y DIP. figura: DISTRIBUCION DEL PATILLAJE DEL 8051 Con solo 40 patillas, el mC 8051 debe de soportar numerosas funciones, lo que obliga a controlar cada patilla dos funciones diferentes, multiplexadas en el tiempo.A continuación se describen las funciones generales y las señales. Patillas P0.0-P0.7 Descripción Es un puerto de 8 bits en modo drenador abierto. Cada pin puede atacar a 8 entradas TTL-LS. Es también la parte baja del bus de direcciones (A0-A7) cuando se accede a memoria externa de datos o programa. P1.0-P1.7 Puerto de 8 bits bidireccional con resistencias de pull-up internas. Puede atacar directamente a 4 entradas TTL-LS. P2.0-P2.7 Puerto de 8 bits con resistencias de pull-up internas. Puede atacar a 4 entradas TTL-LS. La función secundaria de este puerto es la de suministrar la parte alta de la dirección (A8 a A15) durante un acceso a la memoria externa. P3.0-P3.7 El puerto P3 posee características de salida y de entrada similares a las de los puertos P1 y P2. Las funciones secundarias atribuidas a las líneas de este puerto son: P3.0 RxD entrada de datos serie P3.1 TxD salida de datos serie P3.2 INT0' entrada para la interrupción externa P3.3 INT1' entrada para interrupción externa P3.4 T0 entrada de conteo del timer 0 P3.5 T1 entrada de conteo para el timer 1 P3.6 WR 'salida de escritura de la memoria externa P3.7 RD' salida de lectura de la memoria externa RST Entrada de inicialización. Un nivel lógico 1 en esta entrada con una duración de dos ciclos máquina, provoca la inicialización del microcontrolador. XTAL1 XTAL1 es la entrada del amplificador inversor destinado al oscilador de reloj, mientras que XTAL2 es su salida. Los elementos externos que se necesitan añadir para completar el circuito de reloj son un cuarzo que se coloca entre XTAL1 y XTAL2 y dos condensadores que conectan estas patillas a Vss. Aunque existe la posibilidad de hacer funcionar al microcontrolador mediante un circuito de reloj externo. XTAL 2 PSEN' El hecho que la familia 8051 pueda direccionar 64KB de memoria de programa y 64KB de memoria de datos implica un bus de direcciones de 17 bits. La patilla PSEN juega en cierto modo, el papel de decimoséptimo bit. PSEN pasa al estado lógico 0 cuando el microcontrolador comienza la recuperación de una instrucción desde la memoria de programa externa. Esta salida sólo es activa, pues, si EA=0 y debe ser utilizada como señal de selección de circuitos de memoria ROM y EPROM. Durante un acceso a la memoria externa de datos, esta salida permanece en estado 1. Pasa dos veces a estado 0 durante un ciclo máquina correspondiente a un acceso a la memoria de programa externa. ALE La patilla ALE es la salida prevista para gobernar el multiplexado del puerto P0 cuando este desempeña su función secundaria: parte baja del bus de direcciones y bus de datos. Cuando ALE esta en estado 1, el puerto P0 presenta la parte A0/A7 de la dirección. Durante la transición de 1 a 0 de ALE, la dirección todavía presente debe ser memorizada en un circuito externo. Durante el periodo en que ALE=0 el puerto P0 funciona como bus de datos. EA' Esta entrada, activa por nivel lógico 0, permite configurar el microcontrolador para sistemas con buses externos. Si después de la inicialización se detecta que el terminal EA esta conectado a masa o se encuentra a nivel lógico 0, los puertos P0 y P2 pasan a desempeñar las funciones del bus de direcciones y de datos, y las instrucciones del programa se buscan en la memoria externa a partir de la dirección 0000H. Si EA esta conectado a Vcc o se encuentra en estado lógico 1, el código del programa se busca en la memoria interna. Por el consiguiente, las versiones del microcontrolador desprovistas de memoria de programa interna deben utilizarse obligatoriamente con EA conectado al potencial Vss. Para las versiones del microcontrolador cuya memoria de programa interna es EPROM, esta entrada recibirá la tensión de programación (VPP). VCC Alimentación de +5V VSS Masa 0V OSCILADOR PARA EL µC 8051 Como se ha mencionado en el apartado anterior las patillas XTAL1 XTAL2 representan, respectivamente , la entrada y la salida de una etapa en la que puede ir montado un oscilador con un reloj de cuarzo y dos condensadores. En el interior del µC la frecuencia es la mitad de la frecuencia suministrada por el oscilador externo (frecuencia del cristal de cuarzo). Este reloj interno se encarga de definir las fases internas P y estados internos S correspondientes al ciclo máquina del dispositivo El montaje del oscilador se representa de la siguiente manera: figura: CIRCUITO OSCILADOR Se utiliza un circuito interno (dentro del chip) diferente según la tecnología empleada para la fabricación del microcontrolador. Como se muestra en la figura a, para los microntroladores realizados en tecnología HMOS la conexión hacia el secuenciador interno se efectúa desde la patilla XTAL2 mientras que en las versiones CMOS (figura b) esta conexión se efectúa desde XTAL1. Desde el punto de vista del programador , esta modificaciones de estructura interna no cambian en absoluto el empleo del circuito oscilador y el montaje incial del circuito oscilador sigue siendo valido. figura a: ESTRUCTURA INTERNA DEL OSCILADOR EN VERSIÓN HMOS figura b: ESTRUCTURA INTERNA DEL OSCILADOR EN VERSIÓN CMOS En cambio si el diseñador quisiera hacer funcionar el microntrolador mediante un circuito externo, se han de tener en cuenta ciertas consideraciones: Para los modelos realizados en tecnología HMOS, la señal externa debe ser introducida por XTAL2 mientras que XTAL1 debe ser conectada a Vss. Para los modelos realizados con tecnología CMOS, la señal externa es conectada a XTAL1 y la patilla XTAL2 queda sin conectar. Las siguientes figuras concretan esta descripción. figura: CABLEADO DE UN RELOJ PARA VERSIONES HMOS (NMOS) figura: CABLEADO DE UN RELOJ PARA VERSIONES CMOS (CHMOS) DIAGRAMA DE TIEMPOS Tiempos de la CPU Tiempos de lectura de la memoria de programa Tiempos de lectura/escritura de la memoria de datos En en mC 8051 básico un ciclo máquina consiste en una secuencia de 6 estados numerados desde S1 hasta S6. Cada estado contiene 2 periodos de oscilación. Si el oscilador es de 12MHz, cada periodo dura 1m s. Cada ciclo máquina contiene pues 12 periodos de oscilador, tal y como indica la siguiente figura. Un ciclo de máquina comienza en el periodo S1P1 y termina en el periodo S6P2. Tiempos de la CPU La ejecución del ciclo máquina comienza en el estado 1 del ciclo máquina, cuando el código de operación es almacenado en el registro de instrucción. Como norma general una instrucción necesita uno o más ciclos máquina, dependiendo de: a. Código de operación Por ejemplo, la instrucción INC A (figura a) tiene 1 byte de instrucción y necesita 1 ciclo máquina, la instrucción INC DPTR, también, 1 byte de instrucción necesita 2 ciclos máquina (figura b) y la instrucción MUL AB, necesita 4 ciclos máquina y ocupa 1 byte de memoria. b. El número de bytes Por ejemplo, la instrucción MOV A, #data (figura a) tiene 2 bytes de instrucción y necesita 1 ciclo máquina.En cambio la instrucción MOV direct,#data, consta de 3 bytes y necesita 2 ciclos máquina. figura a En la figura a se representa las instrucciones que llegan a ejecutarse en un ciclo máquina. El código de operación se lee en el periodo estado S1 y, mientras este código es memorizado por el registro de instrucción, se efectúa un segundo ciclo de recuperación de código durante el estado S4. Esta recuperación no se tiene en cuenta en función del tipo de instrucción. Aun así la ejecución no se completa hasta que termina el estado S6. Figura b Esto no ocurre siempre a más bytes más ciclos máquina, como puede verse en la (figura b). La instrucción es codificada en un solo byte, pero se ejecuta en dos ciclos máquina. La recuperación de código máquina se ignora en el periodo S4 del primer ciclo máquina y en los períodos S1 y S4 del segundo ciclo. Ante la imposibilidad de establecer una norma general que facilite el algoritmo para asignar él numero de bytes de la instrucción y los ciclos máquina utilizados, es conveniente tener presente una tabla con el repertorio de instrucciones del microcontrolador. También podemos ver en las figuras anteriores que en cada ciclo máquina se producen dos accesos a memoria, el primero, si es comienzo de ciclo de instrucción, que lee el código de operación, y el segundo, que normalmente se descarta, se utiliza para leer el segundo byte, él operando de la instrucción como ocurre el segundo caso de la figura a. Tiempos de Lectura de la memoria de Programa El ciclo de lectura de la memoria de programa comienza en el estado S1 en el flanco de subida de la señal ALE. El flanco de bajada de la señal ALE se usa para latchear (almacenar) la parte baja de la dirección (PCL). Cuando la señal de lectura (PSEN'(1)) baja, el 8051 deja libre la parte baja del bus de direcciones para permitir el acceso del periférico y dar paso a la instrucción. Cuando la señal PSEN' sube el periférico deja libre el bus de datos para un nuevo acceso del 8051 e este. Representando esto en un diagrama de tiempos. figura : CICLO DE LECTURA EN MEMORIA DE PROGRAMA Tiempos de lectura/escritura de la memoria de datos Para realizar una lectura de memoria de datos se necesitan 12 periodos de reloj. El ciclo comienza en estado S4 con la subida de la señal de ALE. El flanco de bajada de esta señal se usa para almacenar la parte baja del bus de direcciones. En el estado S6 el bus de datos se queda en alta impedancia luego se activa la señal RD' dando permiso al periférico para tomar el bus de datos. En estado S3 es leído el dato del periférico y cuando se desactiva la señal RD', el bus se queda de nuevo en alta impedancia para ser utilizado por el 8051. Véase la siguiente figura. figura :CICLO DE LECTURA EN LA MEMORIA DE DATOS EXTERNA Para realizar una escritura en la memoria de datos externa se necesitan 12 periodos de reloj. El ciclo comienza en S4 con la subida de ALE. El flanco de bajada de esta señal se utiliza para almacenar la parte baja del bus de direcciones. En el estado S6 el 8051 saca el dato al bus, luego se activa WR dando permiso al periférico para que pueda ser escrito el dato. En el estado S4 el 8051 desactiva la señal WR prohibiendo de esta manera que se escriba y dando comienzo a un nuevo ciclo. Ver siguiente diagrama de tiempos. figura : CICLO DE ESCRITURA EN LA MEMORIA DE DATOS EXTERNA MODOS DE OPERACIÓN EN REDUCCIÓN DE CONSUMO Registro PCON Modo IDLE Modo POWER DOWN En ocasiones nos encontramos con aplicaciones en las cuales el consumo del µC es critico, por ello se han diseñado versiones CMOS que poseen modos de funcionamiento de bajo consumo de potencia. Los modos de reducción en el CMOS son dos, modo IDLE (Ralentizado) y el modo POWER DOWN (Baja potencia). El registro que se encarga de controlar estas funciones es el PCON (Power Control Register), que se encuentra en los SFRs dirección 87H. PCON (Power Control, Dirección 87H) El 8051 tiene dos modos de operación con bajo consumo de corriente: el modo Idle y el modo Power Down. Se entra en estos modos activando ciertos bits de este SFR. En la siguiente tabla se detalla mejor: PCON (87H) MSB SMOD x x x GF1 GF0 PD LSB IDL SMOD Duplica la velocidad de comunicación de la línea serie en los modos 1, 2 y 3. GF1 Flag de propósito general. GF0 Flag de propósito general. PD Activando este bit se entra en modo Power Down. IDL Activando este bit se entra en modo Idle. El modo Power Down es prioritario sobre el Idle, en caso de activación simultanea Modo IDLE En este modo de funcionamiento entramos cuando el µC ejecuta una instrucción que setea el bit IDL del registro PCON (PCON.0). En este momento el microcontrolador queda ralentizado, ya que la CPU no recibe la señal de reloj como tal y como se pude comprobar en la figura debido al bloqueo que realiza la puerta a la que está conectada esta señal proveniente del registro PCON. figura:DIAGRAMA DE BLOQUES DE POWER DOWN E IDLE El estado de la CPU se preserva en su totalidad. El puntero de la pila (SP), el contador de programa (PC), la palabra de estado (PSW), el acumulador (ACC) y el resto de registros mantienen sus valores durante el modo IDLE. Las patillas de los puertos tienen estados lógicos que tenían en el instante en que fue activado el modo IDLE, ALE y PSEN' mantienen un nivel lógico alto. Existen dos maneras de salir del modo IDLE. 1. Mediante la activación de cualquier interrupción autorizada, de manera que el bit IDL del registro PCON sea desactivado por harware. La interrupción se atenderá y la próxima instrucción que se ejecute será la siguiente a la instrucción RET I, que será secuencialmente, la siguiente a la instrucción que puso el microcontrolador en el estado IDLE. 2. Mediante el RESET harware, que borra el bit IDL, reanudándose el programa desde donde fue parado, es decir, en la instrucción siguiente a la que llevo al µC a estado IDLE. Modo POWER DOWN Igual que anteriormente, al instrucción que activa PD en el registro PCON (Véase figura anterior) es la última que se ejecuta. En este modo, se para la generación de reloj del microcontrolador, con lo que se detienen todas las funciones, pero la información sobre la RAM y los SFRs se mantienen. Las patillas de los puertos de salida mantienen sus respectivos valores imagen de los que presentan en sus respectivos registros del SFR. Las patillas ALE y PSEN' permanecen a nivel bajo. La única posibilidad de salir del modo POWER DOWN es con un RESET por hardware. Cuando estamos en POWER DOWN, la tensión de alimentación, puede reducirse hasta 2V, ahora bien, se ha de tener cuidado y asegurar que esta tensión no se reduzca antes de que entremos en el modo POWER DOWN y que debe volver a su valor nominal antes que el modo POWER DOWN finalice.