Story Transcript
DEPARTAMENTO DE ELECTRONICA Y TELECOMUNICACIONES ESCUELA UNIVERSITARIA DE INGENIERIA TECNICA INDUSTRIAL E INGENIERIA TECNICA EN TOPOGRAFIA VITORIA-GASTEIZ UNIVERSIDAD DEL PAIS VASCO - EUSKAL HERRIKO UNIBERTSITATEA
MICROCONTROLADORES MCS-51
ANGEL Mª ALEDO AMORÓS Profesor Titular del Departamento de Electrónica y Telecomunicaciones FEBRERO 1992 J. M. GIL-GARCIA LEIVA Profesor Asociado del Departamento de Electrónica y Telecomunicaciones Rev. MARZO 2000
MICROCONTROLADORES MCS-51 1.-FAMILIA DE MICROCONTROLADORES MCS-51. ___________________________ 1 1.1.-INTRODUCCION._____________________________________________________________ 1 1.2.-CARACTERISTICAS FUNDAMENTALES. _______________________________________ 2 1.3.-DESCRIPCION DE LAS PATILLAS._____________________________________________ 4
2.-ARQUITECTURA DE LA FAMILIA MCS-51. _________________________________ 6 2.1.-INTRODUCCION._____________________________________________________________ 7 2.2.-RESUMEN GENERAL SOBRE MEMORIAS Y REGISTROS. _______________________ 7 2.3.-METODOS DE DIRECCIONAMIENTO. _________________________________________ 9 2.4.-FUNCIONES PERIFERICAS DENTRO DEL CHIP. _______________________________ 10
2.4.1.-Facilidades I/O. ____________________________________________________ 10 2.4.1.1.-Patillas de entrada/salida drenador abierto.____________________________ 11 2.4.1.2.-Patillas de entrada/salida cuasibidireccionales._________________________ 11 2.4.1.3.-Bus de Microprocesador. _________________________________________ 11 2.4.2.-Sistema de interrupciones.____________________________________________ 13 2.4.3.-Temporizadores/Contadores.__________________________________________ 14 2.4.4.-Comunicación serie. ________________________________________________ 17 2.4.4.1-Protocolo para comunicación entre procesadores. _______________________ 19 3.-HARDWARE DE LA CPU. ________________________________________________ 21 3.1.-DECODIFICADOR DE INSTRUCCIONES. ______________________________________ 22 3.2.-CONTADOR DE PROGRAMA (PC). ____________________________________________ 22 3.3.-MEMORIA INTERNA RAM. __________________________________________________ 22
3.3.1.-RAM interna de datos._______________________________________________ 22 3.3.1.1.-Bancos de registros. _____________________________________________ 22 3.3.2.-Registros de funciones especiales (SFR). ________________________________ 22 3.3.2.1.-Registro A. ____________________________________________________ 22 3.3.2.2.-Registro B. ____________________________________________________ 22 3.3.2.3.-Registro de palabra de estado de programa (PSW). _____________________ 23 3.3.2.4.-Apuntador de datos (DPTR). ______________________________________ 23 3.3.2.5.-Apuntador de pila (SP). __________________________________________ 24 3.4.-SECCION ARITMETICA. _____________________________________________________ 24 3.5.-SECCION DE CONTROL DE PROGRAMA. _____________________________________ 24 3.6.-PROCESADOR BOOLEANO.__________________________________________________ 24 3.7.-OSCILADOR Y CIRCUITERIA DE TEMPORIZACION.___________________________ 25
MCS - 51
i
3.8..-TEMPORIZACION DE LA CPU._______________________________________________ 26
4.-ORGANIZACION DE LA MEMORIA. ______________________________________ 28 4.1.-CONTADOR DE PROGRAMA. ________________________________________________ 28 4.2.-MEMORIA DE PROGRAMA.__________________________________________________ 29 4.3.- MEMORIA INTERNA RAM. __________________________________________________ 30
4.3.1.-RAM interna de datos._______________________________________________ 30 4.3.2.-Registros de funciones especiales.______________________________________ 31 4.3.2.1.-Registro de Palabra de Estado de Programa (PSW)._____________________ 36 5.-ACCESO A LA MEMORIA EXTERNA. _____________________________________ 37 5.1.-HABILITACION DE ACCESO A PROGRAMA (PSEN). ___________________________ 38 5.2.-HABILITACION DEL LATCHEADO DE DIRECCIONES (ALE). ___________________ 39 5.3.-SOLAPAMIENTO DE MEMORIA EXTERNA DE DATOS Y DE PROGRAMA. _______ 39 5.4.-ACCESO A MEMORIA EXTERNA. CICLO DE SINCRONISMO DEL BUS. __________ 40
5.4.1.-Secuencia de lectura de la memoria de programa.__________________________ 40 5.4.2.-Secuencia de lectura de memoria de datos. _______________________________ 41 5.4.3.-Secuencia de escritura en memoria de datos.______________________________ 42 6.-DIRECCIONAMIENTO DE OPERANDOS. __________________________________ 43 6.1.-DIRECCIONAMIENTO DE REGISTRO. ________________________________________ 43 6.2.-DIRECCIONAMIENTO DIRECTO._____________________________________________ 43 6.3.-DIRECCIONAMIENTO POR REGISTRO INDIRECTO. ___________________________ 44 6.4.-DIRECCIONAMIENTO INMEDIATO. __________________________________________ 44 6.5.-DIRECCIONAMIENTO INDIRECTO POR REGISTRO-BASE + REGISTRO-INDICE._ 44 6.6.-DIRECCIONAMIENTO DE SFR Y RAM INTERNA DE DATOS EN EL 8032/8052. ____ 44
7.-ESTRUCTURAS DE PUERTO Y OPERACION. ______________________________ 45 7.1.-CONFIGURACIONES DE ENTRADA/SALIDA I/O. _______________________________ 46 7.2.-ESCRIBIENDO EN UN PUERTO. ______________________________________________ 47 7.3.-CONEXION DE CARGAS AL PUERTO Y CONSIDERACIONES DE INTERFACE. ___ 47 7.4.-CARACTERISTICAS DE LECTURA-MODIFICACION-ESCRITURA._______________ 48
8.-SISTEMA DE INTERRUPCIONES. _________________________________________ 49 8.1.-REGISTRO DE HABILITACION DE INTERRUPCIONES (IE). _____________________ 49 8.2.-PRIORIDAD DE LAS INTERRUPCIONES. ______________________________________ 50
8.2.1.-Estructura del nivel de prioridades. _____________________________________ 50
MCS - 51
ii
8.2.2.-Estructura de prioridad dentro de cada nivel. _____________________________ 50 8.2.3.-Registro de prioridad de la interrupciones (IP).____________________________ 50 8.3.-PROTOCOLO DE RESPUESTA DE LAS INTERRUPCIONES. _____________________ 51 8.4.-INTERRUPCIONES EXTERNAS. ______________________________________________ 52 8.5.-TIEMPOS DE RESPUESTA. ___________________________________________________ 53 8.6.-EJECUCION PASO A PASO (SINGLE STEP).____________________________________ 54
9.-TEMPORIZADORES / CONTADORES (T/C). ________________________________ 55 9.1.-REGISTRO DE MODO DE FUNCIONAMIENTO DE LOS T/C (TMOD). _____________ 55 9.2.-REGISTRO DE CONTROL DE LOS T/C (TCON). ________________________________ 56 9.3.-MODOS DE FUNCIONAMIENTO DE LOS T/C. __________________________________ 57
9.3.1.-Modo 0. __________________________________________________________ 57 9.3.2.-Modo 1. __________________________________________________________ 58 9.3.3.-Modo 2. __________________________________________________________ 58 9.3.4.-Modo 3. __________________________________________________________ 59 9.4.-CONFIGURACION DE LOS T/C._______________________________________________ 60 9.5.-FORMA DE OPERAR. ________________________________________________________ 60 9.6.-TEMPORIZADOR/CONTADOR 2 (T/C 2 EN 8031/8052).___________________________ 60
9.6.1.-Configuración del T/C 2. _____________________________________________ 61 9.6.2.-Registro de control del T/C 2 (T2CON). _________________________________ 63 10.-COMUNICACION SERIE.________________________________________________ 64 10.1.-CONTROL DEL PUERTO SERIE Y SUS REGISTROS. ___________________________ 64
10.1.1.-Registro de control del puerto serie (SCON). ____________________________ 66 10.2.-MODOS DE OPERACION. ___________________________________________________ 67
10.2.1.-Modo Registro de Desplazamiento (MODO 0). __________________________ 67 10.2.2.-Modos UART (Modos 1, 2 y 3). ______________________________________ 69 10.2.2.1.-Modo 1.______________________________________________________ 69 10.2.2.2.-Modos 2 y 3. __________________________________________________ 70 10.2.2.3.-Comunicación Multiprocesador.___________________________________ 74 10.2.3.-Formatos típicos de transmisión en serie. _______________________________ 74 10.3.-GENERACION DE VELOCIDAD DE TRANSMISION CON EL T/C 1. ______________ 75 10.4.-GENERACION DE VELOCIDAD DE TRANSMISION CON EL T/C 2. ______________ 77
11.-RESET. ________________________________________________________________ 79 11.1.-CONTENIDO DE LOS SFR DESPUES DE UN RESET. ___________________________ 80 11.2.-RESET DE ENCENDIDO. ____________________________________________________ 80
MCS - 51
iii
12.-ALIMENTACION Y CARACTERISTICAS DE CONSUMO.___________________ 82 12.1.-FUNCIONAMIENTO EN BAJO CONSUMO (HMOS). ____________________________ 82 12.2.-MODOS DE REDUCCION DE CONSUMO (CHMOS). ____________________________ 82
12.2.1.-Registro de Control de Alimentación (PCON). ___________________________ 83 12.2.2.-Modo IDLE (marcha en vacío)._______________________________________ 83 12.2.3.-Modo POWER DOWN (bajo consumo).______________________________ 84 13.-INSTRUCCIONES DE LA FAMILIA MCS-51._______________________________ 85 13.1.-FUNCIONAMIENTO DE LOS FLAGS DEL PSW.________________________________ 85 13.2.-JUEGO DE INSTRUCCIONES.________________________________________________ 85 13.3 RESUMEN DE INSTRUCCIONES QUE AFECTAN A LOS FLAGS. ________________ 127
14.-MICROCONTROLADOR DS-5000. _______________________________________ 128 14.1.-REGISTROS PROPIOS DEL DS-5000._________________________________________ 128
14.1.1.-Registro PCON.__________________________________________________ 129 14.1.2.-Registro IP. _____________________________________________________ 130 14.1.3.-Registro MCON. _________________________________________________ 131 14.1.4.-Registro TA. ____________________________________________________ 132 14.2.-MODO PROGRAM LOAD. __________________________________________________ 133
Indice de figuras CAPÍTULO 1
fig. 1. 1 - Configuración de patillas ______________________________________________________ 3 fig. 1. 2 - Símbolo lógico_______________________________________________________________ 3 CAPÍTULO 2
fig. 2. 1 - Diagrama de bloques _________________________________________________________ 6 fig. 2. 2 - Diagrama de bloques de la arquitectura interna ____________________________________ 6 fig. 2. 3 - Estructura de la memoria ______________________________________________________ 7 fig. 2. 4 - Estructura de la memoria RAM interna ___________________________________________ 8 fig. 2. 5 - Registros de funciones especiales ________________________________________________ 9 fig. 2. 6 - Direccionamiento de memoria externa ___________________________________________ 12 fig. 2. 7 - Conexión de señales según mapeado de memoria __________________________________ 12 fig. 2. 8 - Sistema de interrupciones _____________________________________________________ 13 fig. 2. 9 - Contador/Temporizador 1 Modo 0. Contador 13 bits________________________________ 15 fig. 2. 10 - Contador/Temporizador 1 Modo 1. Contador 16 bits_______________________________ 15 fig. 2. 11 - Contador/Temporizador 1 Modo 2. Contador 8 bits con autorrecarga _________________ 16 fig. 2. 12 - Contador/Temporizador 0 Modo 3. Dos contadores de 8 bits ________________________ 16 fig. 2. 13 - Diagrama de bloques del puerto serie (UART)____________________________________ 17 fig. 2. 14 - Métodos para enlazar el puerto serie ___________________________________________ 18
MCS - 51
iv
fig. 2. 15 - Método para la expansión de las I/O ___________________________________________ 18 fig. 2. 16 - Formatos típicos de datos ____________________________________________________ 19
CAPÍTULO 3
fig. 3. 1 - Diagrama de bloques funcional de la familia 8051 _________________________________ 21 fig. 3. 2 - Registros de funciones especiales _______________________________________________ 23 fig. 3. 3 - Circuito oscilador para 8051 __________________________________________________ 25 fig. 3. 4 - Circuito oscilador para 8051 __________________________________________________ 25 fig. 3. 5 - Conexión de oscilador externo _________________________________________________ 26 fig. 3. 6 - Conexión de oscilador externo _________________________________________________ 26 fig. 3. 7 - Secuencias de búsqueda/ejecución ______________________________________________ 27 CAPÍTULO 4
fig. 4. 1 - Mapa de memoria ___________________________________________________________ 28 fig. 4. 2 - RAM interna _______________________________________________________________ 30 fig. 4. 3 - RAM interna de datos ________________________________________________________ 31 fig. 4. 4 - Resumen de registros de funciones especiales _____________________________________ 32 fig. 4.5 - Mapa de registros de funciones especiales ________________________________________ 33 fig. 4.6 - Bits direccionables en la memoria de registros _____________________________________ 34 CAPÍTULO 5
fig. 5. 1.a - Ejecución de programa desde memoria externa (sin MOVX) ________________________ 38 fig 5.1.b - Ejecución de memoria externa de programa (con MOVX) ___________________________ 39 fig. 5. 2 - Búsqueda en memoria de programa externa ______________________________________ 40 fig. 5. 3 - Ciclo de lectura en memoria de datos externa _____________________________________ 41 fig. 5. 4 - Ciclo de escritura en memoria de datos externa____________________________________ 42 CAPÍTULO 7
fig. 7. 1 - Latches y buffers de puertos ___________________________________________________ 46 CAPÍTULO 8
fig. 8. 1. - Diagrama de tiempos de respuesta de interrupciones _______________________________ 53 CAPÍTULO 9
fig. 9. 1 - Contador/Temporizador Modo 0 _______________________________________________ 57 fig. 9. 2 - Contador/Temporizador 1 Modo 1 ______________________________________________ 58 fig. 9. 3 - Contador/Temporizador 1 Modo 2 ______________________________________________ 58 fig. 9. 4 - Contador/Temporizador 0 Modo 3 ______________________________________________ 59 fig. 9. 5 - T/C 2 en modo T/C (RCLK=TCLK=0) ___________________________________________ 62 fig. 9. 6 - T/C 2 en modo generador de velocidad de transmisión (RCLK + TCLK = 1) _____________ 62 CAPÍTULO 10
fig. 10. 1 - Expansión I/O _____________________________________________________________ 65 fig. 10. 2 - Tipos de interface UART_____________________________________________________ 65 fig. 10. 3 - Puerto serie en modo 0 ______________________________________________________ 68 fig. 10. 4 - Puerto serie en modo 1 (RCLK, TCLK, TIMER2 sólo en 8052) _______________________ 71 fig. 10. 5 - Puerto serie en modo 2 ______________________________________________________ 72 fig. 10. 6 - Puerto serie en modo 3. (TCLK, RCLK, TIMER 2 sólo en 8052) ______________________ 73 fig. 10. 7 - Formatos típicos para distintas aplicaciones de comunicación serie___________________ 75
MCS - 51
v
fig. 10. 8 - Velocidades de transmisión más comunes generadas por T/C 1 ______________________ 77 fig. 10. 9 -T/C 2 en modo generador de velocidad de transmisión______________________________ 78 CAPÍTULO 11
fig. 11. 1 - Configuración de RESET (HMOS a RST/VPD, CHMOS a RST) ______________________ 79 fig. 11. 2 - Reset de encendido _________________________________________________________ 80 CAPÍTULO 12
fig. 12. 1 - Hardware para los modos IDLE y POWER DOWN ________________________________ 82
MCS - 51
vi
1.-FAMILIA DE MICROCONTROLADORES MCS-51.
1.1.-INTRODUCCION. La familia de microcontroladores MCS-51, construida por INTEL, se basa principalmente en tres circuitos integrados compatibles pin a pin. Estos son: 8031/8051/8751. Estos tres chips se diferencian entre sí en la memoria de programa interna en la siguiente forma: -
El 8031 no tiene memoria interna de programa, por lo que le hará falta una memoria externa para la ejecución de un programa.
-
El 8051 tiene 4 Kbytes de memoria ROM interna, programable en fábrica mediante máscara.
-
El 8751 tiene 4 Kbytes de memoria EPROM interna, es decir programable y borrable.
Así pues las tres versiones compatibles nos dan un máximo de flexibilidad a la hora de desarrollar una aplicación determinada. -
El 8751 es muy útil para el desarrollo de prototipos, producciones de pequeñas cantidades, etc...
-
El 8051 sirve (una vez desarrollado el prototipo con el 8751) para una producción de gran volumen y bajo costo.
-
El 8031 se utiliza normalmente en aplicaciones en las que sea necesaria una gran flexibilidad de la memoria de programa o se precisen memorias superiores a los 4 Kbytes (por ser memoria externa).
También existen otros miembros de la familia MCS-51 como el 8032 y el 8052, que tienen las mismas características que el 8031 y el 8051 respectivamente, pero que incluyen además otro contador/temporizador de 16 bits, otros 128 bytes de memoria RAM de datos interna y en el 8052 otros 4 Kbytes de memoria ROM interna. Cabe destacar la aparición reciente de una pastilla de la casa DALLAS SEMICONDUCTOR; la DS-5000; que, además de ser compatible patilla a patilla con la familia MCS-51, posee una memoria interna de hasta 32 Kbytes, pudiendo ésta ser dividida por el usuario en los tamaños adecuados de memoria de programa y memoria de datos. Además esta memoria, al tratarse de una RAM no volátil, es muy cómoda para la realización de prototipos y hasta de aplicaciones definitivas, pues normalmente la memoria tiene una vida no inferior a los diez años. Al final haremos una descripción de dicha pastilla con las diferencias que tiene respecto a la familia MCS-51.
MCS - 51
1
1.2.-CARACTERISTICAS FUNDAMENTALES. -
Tensión de alimentación sencilla de +5V (con tecnología HMOS y HCMOS).
-
En el 8051 y 8751, 4 Kbytes de memoria interna ROM y EPROM para programa (en el 8052 8 Kbytes).
-
128 bytes de memoria de datos interna, de los que 16 bytes son direccionables bit a bit (256 bytes de memoria de datos interna en los 8032 y 8052).
-
Posibilidad de definir por software 128 flags (para utilización por el programa de usuario).
-
Posibilidad de direccionamiento de memoria ROM externa de hasta 64 Kbytes para programa y de RAM externa de hasta 64 Kbytes para memoria de datos.
-
Ciclo de instrucción de 1 microsegundo con una frecuencia de reloj de 12 MHz.
-
32 líneas de entrada/salida bidireccionales (o cuasibidireccionales) disponibles en cuatro puertos de ocho bits cada uno.
-
Puede multiplicar o dividir en 4 microsegundos por hardware.
-
Compatible con los periféricos de las familias MCS-80 y MCS-85.
-
2 temporizadores/contadores de 16 bits (TIMER/COUNTER).
-
5 líneas de interrupción (2 externas y 3 internas) con dos niveles de prioridad programables por software.
-
Un canal de entrada/salida serie programable de alta velocidad (full duplex) que cuenta con un registro de salida/entrada SBUF de 8 bits.
-
8 registros internos de 8 bits (2 de ellos pueden usarse como vectores), que pueden colocarse en cuatro bancos diferentes (cada banco 8 registros).
-
1 registro especial para multiplicaciones y divisiones.
-
1 registro interno de 16 bits (DPTR) utilizado como vector para el direccionamiento de la memoria externa.
-
Aritmética binaria o decimal.
-
Procesador booleano integrado para aplicaciones de control.
-
Compatible con el software existente del 8048.
-
Indicador de detección de rebasamiento y cómputo de paridad.
-
PC (PROGRAM COUNTER) de 16 bits.
-
SP (STACK POINTER) de 8 bits.
-
Direccionamiento directo de byte y bit.
MCS - 51
2
fig. 1. 1 - Configuración de patillas
fig. 1. 2 - Símbolo lógico
MCS - 51
3
1.3.-DESCRIPCION DE LAS PATILLAS. ØVSS - Toma de tierra del circuito. ØVCC - Alimentación +5 V. Ø PUERTO 0 - El puerto 0 es una puerta de entrada/salida bidireccional de drenador abierto de 8 bits. Además actúa como parte baja del bus de direcciones y bus de datos multiplexado (en combinación con la señal ALE) durante la lectura y escritura de la memoria externa. También se usa para programar y verificar la memoria interna del chip. Este puerto puede admitir/suministrar a 2 cargas TTL normales o a 8 cargas LSTTL. Ø PUERTO 1 - El puerto 1 es una puerta de entrada/salida cuasibidireccional de 8 bits. Se usa como parte baja (byte bajo) del bus de direcciones durante la programación y verificación de la memoria. Este puerto puede admitir/suministrar a 1 carga TTL normal. Ø PUERTO 2 - El puerto 2 es una puerta de entrada/salida cuasibidireccional de 8 bits. Se usa como parte alta (byte alto) del bus de direcciones para la lectura y escritura de la memoria externa. También se usa durante la programación y verificación de la memoria interna como parte alta del bus de direcciones. El puerto 2 puede admitir/suministrar a 1 carga TTL normal. Ø PUERTO 3 - El puerto 3 es una puerta de entrada/salida cuasibidireccional de 8 bits. Contiene además las patillas de interrupción externa (INT0 e INT1), las entradas de los contadores (T0 y T1), las patillas del puerto serie UART (RXD y TXD) y las patillas de lectura/escritura de la memoria externa (RD y WR) usadas para diversas funciones. El latch de salida de una función debe activarse para que funcione dicha función. Este puerto puede admitir/suministrar a 1 carga TTL normal. Las funciones especiales asignadas al puerto 3 son: -
P3.0 RXD/DATA Patilla de entrada/salida serie de datos en modo registro de desplazamiento.
-
P3.1 TXD/CLOCK Patilla de salida de datos serie en modo asíncrono, o salida de reloj en modo registro de desplazamiento.
-
P3.2 INT0 . Entrada de la interrupción 0 o entrada de control para el contador 0.
-
P3.3 INT1 . Entrada de la interrupción 1 o entrada de control para el contador 1.
-
P3.4 T0 . Entrada del contador 0.
-
P3.5 T1 . Entrada del contador 1.
-
P3.6 WR . Señal de control de escritura del bus de datos, desde el puerto 0 a la memoria externa de datos RAM.
-
P3.7 RD . Señal de control de lectura del bus de datos, desde la memoria externa al puerto 0.
MCS - 51
4
Ø RST/VPD - Un paso de "0" a "1" en esta patilla (aproximadamente 3 voltios), resetea el microcomputador. Una pequeña resistencia interna permite el Power-On-Reset (reseteado sin señal externa), usando sólo un condensador entre el pin y alimentación. Ø ALE/ PROG . - Esta salida activa el latch de enclavamiento de la parte baja del bus de direcciones, cuando se accede a la memoria externa. También se usa como entrada de pulsos en la programación de la EPROM interna. Ø PSEN . - (Program Store Enable). Esta salida saca una señal de control, que habilita el bus de datos para la lectura de la memoria externa de programa EPROM/ROM. Ø EA/VDD . - Cuando EA se mantiene a nivel alto (de TTL), el microcontrolador ejecuta instrucciones desde la EPROM/ROM interna cuando el PC (contador de programa) está por debajo de 4096; si EA se mantiene a nivel bajo (de TTL), el microcontrolador busca todas las instrucciones en la memoria externa de programa EPROM/ROM. Esta patilla se utiliza también para recibir los 21 V. necesarios para la programación de la EPROM interna. ØXTAL 1 - Es una entrada al amplificador de alta ganancia del oscilador. Se puede usar como fuente del oscilador un cristal de cuarzo. Cuando se utiliza un generador externo, esta patilla debe conectarse a masa. ØXTAL 2 - Es una salida del amplificador del oscilador, y es necesaria cuando se utiliza como fuente de oscilación un cristal de cuarzo. Se usa como entrada cuando se utiliza un generador externo.
MCS - 51
5
2.-ARQUITECTURA DE LA FAMILIA MCS-51.
fig. 2. 1 - Diagrama de bloques
fig. 2. 2 - Diagrama de bloques de la arquitectura interna
MCS - 51
6
2.1.-INTRODUCCION. Las instrucciones del 8051 son una mejora de las instrucciones de la familia MCS-48. Se han mejorado para permitir una mejor expansión entre periféricos y CPU, optimizar la eficiencia y la velocidad de ejecución. Los códigos de operación han sido revisados para hacer más potentes las operaciones y para permitir nuevos tipos de direccionamiento, con lo que las antiguas operaciones quedan mejoradas. Se hace un uso más eficiente de la memoria de programa debido a que el juego de instrucciones consta de: 49 instrucciones de 1 byte, 45 de 2 bytes y 17 de 3 bytes. Si utilizamos un oscilador de 12 MHz., hay 64 instrucciones que se ejecutan en 1 microsegundo, 45 en 2 microsegundos y las restantes (multiplicación y división) en 4 microsegundos. En el resumen del juego de instrucciones aparece el número de bytes de cada instrucción así como el número de periodos de oscilador necesario para su ejecución.
2.2.-RESUMEN GENERAL SOBRE MEMORIAS Y REGISTROS. La CPU del 8051 manipula operandos en cuatro espacios de memoria, éstos son: -
64 Kbytes de memoria de programa (60 Kbytes externos y 4 Kbytes internos, o 64 Kbytes externos).
-
64 Kbytes de memoria externa de datos RAM.
-
256 bytes de memoria RAM interna de datos (384 bytes en el 8032/8052)
-
16 bits para el contador de programa.
fig. 2. 3 - Estructura de la memoria MCS - 51
7
El direccionamiento de la memoria de datos interna (RAM), está dividido en: -
128 Bytes de RAM (256 Bytes en 8032/8052).
-
128 Bytes de Registros de Funciones Especiales (SFR), con 128 bits direccionables bit a bit.
fig. 2. 4 - Estructura de la memoria RAM interna Los 128 Bytes de RAM se dividen en: -
4 Bancos de 8 registros de 8 bits cada uno.
-
La Pila (STACK).
-
128 Bits (16 Bytes) direccionables bit a bit.
-
Memoria de datos.
La profundidad de la pila está limitada sólamente por la capacidad interna disponible de la RAM de datos y su localización está determinada por el Apuntador de Pila (SP) de 8 bits. Todos los registros excepto el contador de programa (PC) y los 4 bancos de 8 registros, residen en el espacio dedicado a los registros de funciones especiales (SFR). Este mapa de memoria incluye: -
Registros aritméticos.
-
Apuntadores.
-
Puertas de entrada/salida.
-
Registros para el sistema de interrupciones.
-
Temporizadores/Contadores (Timers/Counters).
-
Canal serie.
MCS - 51
8
Además de 128 bits repartidos en el espacio de direcciones del SFR direccionables bit a bit.
fig. 2. 5 - Registros de funciones especiales
2.3.-METODOS DE DIRECCIONAMIENTO. El 8051 tiene cinco métodos de direccionamiento de operandos: -
Por Registro.
-
Directo.
-
Por registro indirecto.
-
Inmediato.
-
Indirecto de registro base + registro índice.
A los registros pertenecientes a los cuatro bancos de ocho registros, se puede acceder por direccionamiento directo, por registro o registro indirecto. A los 128 bytes de memoria de datos interna (RAM) se puede acceder mediante direccionamiento directo o registro indirecto. Los registros de funciones especiales (SFR) pueden ser accedidos mediante direccionamiento directo. La memoria de datos externa puede ser accedida mediante direccionamiento de registro indirecto. La zona de memoria de programa es accesible mediante direccionamiento indirecto de registro base + registro índice.
MCS - 51
9
El 8051 está clasificado como un controlador de 8 bits, ya que, la memoria de datos, la memoria de programa, los registros de funciones especiales (SFR), la unidad aritmético-lógica (ALU) y el bus de datos externo, trabajan con un formato de 8 bits. El 8051 ejecuta operaciones de 1 bit, de 1 byte, de 2 bytes y de 1 nibble (medio byte). El 8051 tiene grandes facilidades para transferencia de bytes y operaciones aritméticológicas. Es excelente en el manejo de bits, ya que, la transferencia de datos, las operaciones de bifurcación lógicas y condicionales, pueden ser ejecutadas directamente por variables booleanas (de 1 bit).
2.4.-FUNCIONES PERIFERICAS DENTRO DEL CHIP. Hasta ahora se han descrito vagamente la CPU y los espacios de memoria del 8051. Además de la CPU y la memoria, el 8051 tiene incorporados un sistema de interrupciones, grandes facilidades de entrada/salida (I/O), y están integradas en el chip varias funciones periféricas, para relevar a la CPU de tareas repetitivas, complicadas o de tiempo crítico, para permitir un riguroso control en tiempo real de los interfaces externos del sistema. Las facilidades de I/O del sistema incluyen: -
Patillas de entrada/salida (I/O).
-
Puertos I/O paralelo.
-
Bus bidireccional (direcciones/datos).
Las funciones periféricas son: -
2 contadores de 16 bits.
-
Puerto serie.
Todas estas operaciones juntas mejoran mucho el funcionamiento del sistema.
2.4.1.-Facilidades I/O. El 8051 tiene instrucciones que tratan sus 32 líneas de entrada/salida como 32 bits direccionables individualmente o como 4 puertos paralelo direccionables como puerto 0, 1, 2, y 3. Los puertos 0, 2 y 3 pueden asumir también otras funciones. El puerto 0 multiplexado actúa como parte baja del bus de direcciones y bus de datos usados para expandir el 8051 con memoria estándar y periféricos. El puerto 2 actúa como parte alta del bus de direcciones cuando expandimos el 8051 con memoria de programa externa o necesitamos más de los 256 bytes de memoria de datos interna y la ampliamos con memoria externa RAM. Las patillas del puerto 3 pueden ser configuradas individualmente para proporcionar las entradas de petición de interrupción externas, entradas de los contadores, entradas/salidas de la puerta serie y para generar las señales de control usadas para leer y escribir en la memoria externa. La generación o uso de una función alternativa en una patilla del puerto 3, se hace automáticamente por el 8051, mientras la patilla esté configurada como entrada.
MCS - 51
10
La configuración de los puertos se ve en la figura 1.2 (pág. 3). 2.4.1.1.-Patillas de entrada/salida drenador abierto. Cada patilla del puerto 0 puede ser configurada como una salida en drenador abierto o como una entrada de alta impedancia. Cuando se resetea el 8051, éste programa cada patilla como una entrada, poniendo un nivel alto en ésta. Si más tarde ponemos la patilla a nivel bajo, ésta se configurará como salida y admitirá corriente contínuamente. Volviendo a poner la patilla a nivel alto, emplazará su amplificador de salida (driver) en estado de alta impedancia y configurará la patilla como una entrada. 2.4.1.2.-Patillas de entrada/salida cuasibidireccionales. Los puertos 1, 2 y 3 tienen amplificadores de salida (buffer) cuasibidireccionales. Reseteando el 8051, éste programa cada patilla como una entrada al ponerla a nivel alto. Si más tarde la patilla se pone a nivel bajo, se configurará como salida con nivel bajo, y admitirá corriente contínuamente. Cualquier patilla que esté configurada como salida se configurará como entrada al intentar sacar un nivel alto como salida, pero simultáneamente a esta reconfiguración, el amplificador de salida (driver) suministrará corriente durante 2 periodos de reloj, después de los cuales una resistencia de pull-up de aproximadamente 20 a 40 KΩ mantiene la carga externa a nivel alto de TTL. Cada una de estas patillas puede admitir/suministrar a una carga TTL. 2.4.1.3.-Bus de Microprocesador. Se dota al 8051 de un Bus típico de Microprocesador para resolver una amplia gama de problemas y permitir la ampliación de uso de productos ya desarrollados anteriormente. El multiplexado de direcciones y datos proporciona un interface compatible con memorias estándar, periféricos de la familia MCS-80 y de la familia MCS-85, que incluyen dentro del chip puertas programables de entrada/salida y funciones de temporización. Al acceder a la memoria externa, se saca la parte alta del bus de direcciones por el puerto 2 y la parte baja por el puerto 0. Se proporciona la señal ALE, para enclavar la parte baja del bus de direcciones en un latch externo. Cuando se está leyendo de la memoria de programa externa (por medio de una orden MOVC o por el flujo propio del programa), se activa la señal PSEN (Program Set Enable). Cuando se escribe o se lee de la memoria externa de datos (mediante la instrucción MOVX), se genera automáticamente la señal WR o RD para habilitar la selección de memoria de datos externa al puerto 0. De esta forma se puede acceder, tanto a la RAM como a la ROM externas, con una circuitería exterior mínima, como puede verse en la figura 2.6. Así mismo, en la figura 2.7 se puede ver cómo se conectan las señales de control para direccionamiento de la memoria dependiendo del mapeado de ésta.
MCS - 51
11
El puerto 0 saca las direcciones y los datos a la memoria externa a través de un amplificador con una salida que puede admitir/suministrar a 2 cargas TTL. Al final del ciclo lectura/escritura, el bus del puerto 0 se reprograma automáticamente pera ponerse en estado de alta impedancia (entrada) y el puerto 2 regresa al estado que tenía antes de la realización de este ciclo.
fig. 2. 6 - Direccionamiento de memoria externa
fig. 2. 7 - Conexión de señales según mapeado de memoria MCS - 51
12
2.4.2.-Sistema de interrupciones. Los sucesos externos y los ocurridos en los periféricos en tiempo real dentro del chip requieren la intervención asíncrona de la CPU, para la ejecución de alguna sección particular de código. Para enlazar la ejecución asíncrona de estas funciones con la ejecución normal del programa, el 8051 está provisto de un sistema de interrupciones con dos niveles de prioridad y un complejo sistema de fuente múltiple. El tiempo de espera de respuesta a una interrupción va desde 3 µseg a 7 µseg, cuando se utiliza un oscilador de 12 MHz. El 8051 reconoce las peticiones de interrupción desde 5 fuentes distintas: -
2 desde fuentes externas a través de las patillas INT0 e INT1.
-
2, una desde cada uno de los contadores internos.
-
1 desde la puerta serie (I/O).
Cada vector de interrupción tiene una localización separada en la memoria de programa para su rutina de servicio. Cada una de las 5 fuentes puede ser asignada a cualquiera de los dos niveles de prioridad (dentro de un mismo nivel de prioridad, cada fuente tiene a su vez otro nivel respecto a las demás) y pueden ser habilitadas o deshabilitadas independientemente. Además, todas las fuentes pueden ser habilitadas o deshabilitadas globalmente. Cada interrupción externa se puede programar para ser reconocida por nivel bajo o por flanco de bajada, siendo activa a nivel bajo para permitir el cableado de varias fuentes de interrupción.
fig. 2. 8 - Sistema de interrupciones
MCS - 51
13
2.4.3.-Temporizadores/Contadores. El 8051 contiene 2 contadores de 16 bits para medidas de intervalos de tiempo, medida de anchura de pulsos, recuento de impulsos y generación periódica precisa de peticiones de interrupción. Cada uno puede ser programado independientemente para operar de los siguientes modos: -
Modo 0. Como contador de 8 bits con predivisor por 32.
-
Modo 1. Como contador de impulsos o como timer de 16 bits.
-
Modo 2. Como contador de impulsos o como timer de 8 bits con recarga automática al producirse el rebasamiento.
-
Modo 3. Adicionalmente el contador 0 puede ser programado en una modalidad que tiene dos opciones: -
Un timer de 8 bits y un contador de impulsos.
-
Dos timers de 8 bits.
Cuando el contador 0 está en modo 3, el contador 1 puede ser programado con alguna de las modalidades mencionadas anteriormente, aunque no puede poner a "1" el flag de petición de interrupción o generar una interrupción. Este modo es útil, porque el rebase del contador 1 puede usarse para impulsar el generador de velocidad de transmisión de la puerta serie. Los contadores pueden manejar frecuencias de entrada muy altas, éstas van desde 0.1 MHz a 1 MHz (para un cristal de 1.2 a 12 MHz) cuando programamos para una entrada interna que sea una división por 12 de la frecuencia del oscilador, y desde 0 a un límite superior de 50 KHz a 0.5 MHz (para un cristal de 1.2 a 12 MHz) cuando programamos para entradas externas. Ambas entradas, externa e interna pueden ser conectadas al contador por una segunda fuente externa para mediciones directas de impulsos. Los contadores se paran y se ponen en marcha bajo control de software. Cada contador coloca sus flags de petición de interrupción cuando se produce rebase o se autorrecarga con un valor. Los diferentes modos de operación y sus respectivas entradas se detallan en las figuras que siguen a continuación.
MCS - 51
14
fig. 2. 9 - Contador/Temporizador 1 Modo 0. Contador 13 bits
fig. 2. 10 - Contador/Temporizador 1 Modo 1. Contador 16 bits
MCS - 51
15
fig. 2. 11 - Contador/Temporizador 1 Modo 2. Contador 8 bits con autorrecarga
fig. 2. 12 - Contador/Temporizador 0 Modo 3. Dos contadores de 8 bits
MCS - 51
16
2.4.4.-Comunicación serie. El 8051 tiene una puerta serie I/O que se utiliza para enlazar dispositivos periféricos en serie, así como múltiples 8051 mediante protocolos asíncronos estándar full-duplex. La puerta serie tiene también un modo síncrono para la expansión de las líneas I/O, usando registros de desplazamiento MOS y TTL. Este interface por hardware de la comunicación serie ahorra código ROM y permite una frecuencia de transmisión mucho más alta que la que podría conseguirse por medio de software. En respuesta a la petición de interrupción de la puerta serie, la CPU tiene solamente que leer/escribir el buffer de la puerta para proporcionar el enlace serie.
fig. 2. 13 - Diagrama de bloques del puerto serie (UART) La puerta serie I/O full-duplex ofrece modos asíncronos para facilitar la comunicación con dispositivos UART (Transmisor/Receptor Asíncrono Universal) estándar, tales como impresoras y terminales CRT o comunicaciones con otros 8051 en sistemas de multiproceso. El receptor consta de doble buffer, para eliminar el desbordamiento que ocurriría si la CPU fallase al responder a la interrupción del receptor antes del comienzo del próximo ciclo de impulsos. En la transmisión no se necesita doble buffer ya que el 8051 puede mantener la comunicación serie a su máxima frecuencia sin necesidad de este sistema. Puede ocurrir una pequeña disminución en la frecuencia de transmisión en casos raros, como cuando la transmisión tiene una espera por una interrupción muy larga para completar el programa. En modo asíncrono se incluye el rechazo de un falso bit de arranque en la forma de recepción. Para rechazo de ruido se toman las dos mejores muestras de tres hechas cerca del centro de cada bit recibido.
MCS - 51
17
fig. 2. 14 - Métodos para enlazar el puerto serie
fig. 2. 15 - Método para la expansión de las I/O Cuando hacemos interfaces con dispositivos estándar UART, el canal serie puede ser programado en modo 1 de forma que transmita/reciba en un formato de 10 bits o programado en modo 2 ó 3 para que transmita/reciba en formato de 11 bits. El formato consta de un bit de arranque, 8 ó 9 bits de datos y 1 bit de stop. En los modos 1 y 3, el circuito temporizador de la frecuencia de transmisión recibe un pulso desde el contador 1 cada vez que el contador se rebasa. La entrada al contador 1 puede ser una fuente externa o una división por 12 de la frecuencia del oscilador. El modo de autorrecarga del contador proprociona frecuencias de transmisión de 122 a 31.250 bits por segundo (incluyendo los bits de start y stop), para un cristal de 12 MHz. En el modo 2 la frecuencia de comunicación puede ser 1/32 o 1/64 de la frecuencia del oscilador (dependiendo del estado del bit SMOD del registro de función especial PCON), produciendo una frecuencia de transmisión de 187.500 ó 375.000 bits por segundo (incluyendo los bits de start y stop) para un cristal de 12 MHz.
MCS - 51
18
fig. 2. 16 - Formatos típicos de datos Los sistemas con varios procesadores (procesos distribuidos), ofrecen más rapidez y potencia que los sistemas con una sola CPU. Esto se consigue con una jerarquía de procesadores interconectados, cada uno con sus propias memorias y entradas/salidas. En un sistema multiprocesador, un microcontroladorpatrón (master) 8051 controla una cofiguración de múltiples 8051 para operar simultáneamente en porciones separadas del programa, cada uno controlando una porción de todos los procesos. La interconexión de varios 8051 reduce la carga del procesador patrón, resultando un sistema de bajo costo de transmisión de datos. Esta forma de distribuir el proceso es especialmente efectiva en sistemas con proceso complejo donde los controles requieren estar físicamente separados. En los modos 2 y 3 un procesador esclavo puede permaner "dormido" mientras el procesador maestro envía datos y "despertar" automáticamente cuando el procesador maestro envía una dirección. 2.4.4.1-Protocolo para comunicación entre procesadores. El procesador maestro transmite un formato de direcciones o de datos dependiendo del estado del noveno bit transmitido:
MCS - 51
19
-
Si el 9º bit es "0" el formato es de datos.
-
Si el 9º bit es "1" el formato es de direcciones.
(1) Esclavos: La puerta serie se configura para interrumpir la CPU si el noveno bit recibido está a nivel alto. (2) Maestro: Transmite un formato de direcciones que selecciona al esclavo (9ºbit a "1"). (3) Esclavos: La puerta serie interrumpe a la CPU cuando recibe el formato de direcciones. El programa de servicio de interrupciones compara la dirección recibida con su dirección. El esclavo que ha sido direccionado reconfigura su puerta serie para interrumpir a la CPU en todas las transmisiones subsiguientes. (4) Maestro: Transmite el formato de control y el formato de datos (éstos serán aceptados solamente por el esclavo previamente seleccionado). En modo síncrono (modo 0) la alta velocidad de la puerta serie proporciona un método eficiente y de bajo costo para la expansión de líneas I/O (fig. 2.15), utilizando registros de desplazamiento estándar TTL y CMOS. El canal serie ofrece una salida de reloj para sincronizar el desplazamiento de los bits a/desde un registro externo. La frecuencia de transmisión de los datos es una división por 12 de la frecuencia del oscilador y es de 1Mbit por segundo a 12 MHz.
MCS - 51
20
3.-HARDWARE DE LA CPU.
fig. 3. 1 - Diagrama de bloques funcional de la familia 8051
Esta sección describe detalladamente la arquitectura del hardware de la CPU del 8051. El sistema de interrupciones y las funciones periféricas de la CPU dentro del chip, se describen en los siguientes apartados.
MCS - 51
21
3.1.-DECODIFICADOR DE INSTRUCCIONES. Cada instrucción del programa es decodificada por el decodificador de instrucciones. Esta unidad genera las señales internas que controlan las funciones de cada sección de la CPU. Estas señales controlan el origen y destino de datos, así como la función de la ALU.
3.2.-CONTADOR DE PROGRAMA (PC). El contador de programa (PC) de 16 bits controla la secuencia el la que son ejecutadas las instrucciones almacenadas en la memoria de programa. Este se maneja mediante instrucciones de transferencia de control.
3.3.-MEMORIA INTERNA RAM. El 8051 contiene 128 bytes de RAM interna de datos (la cuál incluye los registros R0-R7 en cada uno de los cuatro bancos de registros) y otros 128 bytes de RAM interna de SFR (la cuál incluye 20 registros de funciones especiales).
3.3.1.-RAM interna de datos. La RAM interna de datos proporciona 128 bytes de memoria para llenar según convenga. 3.3.1.1.-Bancos de registros. Hay cuatro bancos de ocho registros dentro de la RAM interna de datos, estos registros se denominan de R0 a R7 en cada uno de los bancos.
3.3.2.-Registros de funciones especiales (SFR). Los registros de funciones especiales incluyen: -
Regitros aritméticos (A, B, PSW).
-
Apuntadores (SP, DPH, DPL).
-
Registros de interface entre la CPU y funciones periféricas (SCON, SBUF...). 3.3.2.1.-Registro A. Es el registro acumulador y su localización en la memoria interna RAM es Acc. (Dirección E0H). 3.3.2.2.-Registro B. Está dedicado a servir de origen y destino de datos durante las operaciones de multiplicación y división. En el resto de instrucciones es un registro de propósito general. (Dirección F0H).
MCS - 51
22
3.3.2.3.-Registro de palabra de estado de programa (PSW). Este registro contiene: -
El acarreo (carry) CY (bit 7) y el carry auxiliar AC (bit 6).
-
Un flag de uso general definido por el usuario F0 (bit 5).
-
Los bits RS0 y RS1 (bits 3 y 4) de selección de banco de registros.
-
Flag de rebosamiento OV (bit 2) y de paridad P (bit 0).
Los flags del PSW graban información del estado del procesador y controlan las operaciones del mismo. Los flags CY, AC y OV reflejan generalmente el estado de las últimas operaciones aritméticas. El flag P refleja siempre la paridad del acumulador. El flag CY es también el acumulador booleano para operaciones con bits. Los dos bits de selección de los bancos de registros (RS0 y RS1) determinan cuál de los cuatro bancos de ocho registros es seleccionado. La dirección de este registro es D0H.
fig. 3. 2 - Registros de funciones especiales 3.3.2.4.-Apuntador de datos (DPTR). El registro apuntador de datos de 16 bits (DPTR) es la concatenación de los registros DPH (byte alto del DPTR, en la dirección 83H) y DPL (byte bajo del DPTR, en la dirección 82H). El DPTR se usa en direccionamientos del tipo registro-indirecto para:
MCS - 51
-
Mover constantes de la memoria de programa.
-
Mover variables de la memoria externa de datos. 23
-
Saltar a cualquiera de las direcciones de los 64 KBytes de memoria de programa.
3.3.2.5.-Apuntador de pila (SP). Los 8 bits del apuntador de pila contienen la dirección en la que se depositó el último byte en la pila. Esta es también la dirección del primer byte que puede sacarse de la pila. Puede ser modificado por software. Su dirección es la 81H.
3.4.-SECCION ARITMETICA. La sección aritmética del procesador ejecuta funciones de manipulación de muchos datos y está compuesta por: -
La unidad aritmético-lógica (ALU).
-
Los registros A, B y PSW.
La ALU acepta palabras de datos de 8 bits desde una o dos fuentes y genera un resultado de 8 bits bajo el control del decodificador de instrucciones. La ALU ejecuta operaciones aritméticas de suma, resta, multiplicación, división, incremento, decremento y ajuste, suma y comparación BCD/decimal. También ejecuta operaciones lógicas AND, OR, XOR, complementación y rotación (derecha, izquierda o cambio de nibble a la izquierda).
3.5.-SECCION DE CONTROL DE PROGRAMA. La sección de control de programa controla la secuencia en la que son ejecutadas las instrucciones almacenadas en la memoria de programa. El salto (bifurcación) condicional lógico habilita condiciones internas y externas al procesador para provocar un cambio en la secuencia de la ejecución del programa.
3.6.-PROCESADOR BOOLEANO. Aunque el procesador booleano es una parte integral de la arquitectura del 8051, puede ser considerado como un procesador de bits independiente, ya que tiene su propio conjunto de instrucciones, su propio acumulador (el flag CY), su propia RAM direccionable bit a bit y sus propias I/O. Las instrucciones de manipulación de bits permiten el direccionamiento directo de 128 bits (16 bytes) en la RAM interna de datos y 128 bits dentro de los registros de funciones especiales (SFR). Los registros de funciones especiales que contienen bits direccionables directamente, están en direcciones múltiplo de 8 (P0, TCON, P1, SCON, P2, IEC, P3, IPC, PSW, A y B). En algunos bits direccionables el procesador booleano puede ejecutar las operaciones de: activar, borrar, complemento, salto si activado, salto si no activado, salto si activado y entonces borrar, y mover a/desde acarreo. Entre algunos bits direccionables (o su complemento) y el indicador de acarreo, el
MCS - 51
24
procesador booleano puede ejecutar la operación de bits AND lógica u OR lógica, dejando el resultado en el flag de acarreo. Las instrucciones de manipulación de bits proporcionan un código óptimo y una eficiente velocidad en aplicaciones de conmutación de bits, tales como el control de los periféricos internos del 8051. El procesador booleano también proporciona unos medios directos de conversión de ecuaciones lógicas (como aquéllos usados en el diseño de lógica aleatoria) directamente en el software, de esta forma pueden resolver funciones complejas de lógica combinatoria sin excesivos movimientos de datos: enmascaramiento de bytes, tests y saltos.
3.7.-OSCILADOR Y CIRCUITERIA DE TEMPORIZACION. En el 8051 la generación de tiempos está completamente incorporada, excepto la frecuencia de referencia que puede ser un cristal o una fuente de oscilación externa. El oscilador interno es un circuito paralelo antirresonante con un rango de frecuencias de 1.2 a 12 MHz. La patilla XTAL 2 es la salida de un amplificador de alta ganancia mientras que la XTAL 1 es su entrada. Un cristal conectado entre las patillas XTAL 1 y XTAL 2 proprociona la realimentación y el desplazamiento de fase necesarios para la oscilación. En el caso de utilizar como fuente de oscilación un reloj compatible TTL externo, su frecuencia debe estar comprendida entre 1.2 y 12 MHz. En las figuras 3.3 y 3.4 se puede ver la forma de conectar un cristal de cuarzo para referencia de frecuencia (hay que hacer notar la diferencia entre los microprocesadores 8051 y 80C51 realizados con tecnología HMOS y CHMOS respectivamente).
fig. 3. 3 - Circuito oscilador para 8051
fig. 3. 4 - Circuito oscilador para 8051
En las dos figuras, tanto en el 8051 como en el 80C51, los condensadores C1 y C2 tienen unos valores de 30 pF si se usa un cristal de cuarzo o de 47 pF si utilizamos un resonador cerámico. En las figuras 3.5 y 3.6 (página 28) se ve cómo se conecta una fuente de oscilación externa, tanto para el 8051 como para el 80C51. MCS - 51
25
3.8..-TEMPORIZACION DE LA CPU. El generador de reloj interno define la secuencia de estados que marca los ciclos de máquina. Un ciclo de máquina consiste en una secuencia de 6 estados, numerados de S1 a S6. Cada uno de los estados corresponde a dos ciclos del oscilador, por lo que un ciclo de máquina equivale a 12 periodos de oscilador o a 1 µs si el oscilador es de 12 MHz. Cada estado está dividido en dos fases P1 y P2. La figura 3.7 muestra las secuencias de búsqueda y ejecución para diversos tipos de instrucciones. Normalmente por cada ciclo de máquina se generan dos secuencias de búsqueda de instrucción, si la instrucción no necesita otro byte de código la CPU simplemente ignora la secuencia de ejecución extra y el contador de programa no se incrementa.
fig. 3. 5 - Conexión de oscilador externo
fig. 3. 6 - Conexión de oscilador externo
MCS - 51
26
fig. 3. 7 - Secuencias de búsqueda/ejecución La mayor parte de las instrucciones del 8051 se ejecutan en un ciclo de máquina. MUL y DIV (multiplicar y dividir) son las únicas instrucciones que precisan 4 ciclos.
MCS - 51
27
4.-ORGANIZACION DE LA MEMORIA. En el 8051 la memoria se organiza sobre 4 espacios de direcciones: -
Contador de programa de 16 bits.
-
64 KBytes de espacio direccionado como memoria de programa.
-
64 KBytes de espacio direccionado como memoria de datos.
-
256 Bytes direccionado como memoria interna RAM (384 Bytes en el 8032/8052).
fig. 4. 1 - Mapa de memoria Hay que hacer notar la diferencia de mapas entre el 8031/8051 y el 8032/8052 en lo que respecta a la memoria RAM interna (el 8032/8052 tiene 128 Bytes más).
4.1.-CONTADOR DE PROGRAMA. Los 16 bits del contador de programa (PC) dotan al 8051 de capacidad de direccionamiento de 64 KBytes. El PC permite al usuario ejecutar llamadas y saltos (bifurcaciones) a cualquier lugar dentro del espacio direccionado como memoria de programa. No hay instrucciones que permitan mover la ejecución del programa desde el espacio de memoria del programa a ninguno de los espacios de memoria de datos.
MCS - 51
28
4.2.-MEMORIA DE PROGRAMA. En el 8051/8751 los primeros 4 KBytes de los 64 KBytes de espacio direccionado como memoria de programa, están ocupados por memoria interna ROM y EPROM respectivamente. Si se pone la patilla EA a nivel alto, el procesador es forzado a buscar estos 4 KBytes primeros en la ROM/EPROM interna. La expansión del bus para acceder a la memoria de programa por encima de los 4 KBytes es automática cuando el PC se incrementa por encima de 4095 (0FFFH). Si se pone la patilla EA a nivel bajo, el procesador busca toda la memoria de programa en la memoria externa. La velocidad de ejecución del 8051 es la misma bien sea búsqueda y carga de instrucciones desde un programa en la memoria interna o externa. Si todo el programa está dentro de la memoria interna, la posición del byte 4095 (0FFFH) debe dejarse libre para prevenir una prebúsqueda no deseada en la dirección 4096 (1000H) de la memoria externa de programa. Algunas posiciones en la memoria de programa están reservadas para programas específicos: -
Las posiciones 0000H a 0002H están reservadas para la inicialización del programa. Siguiendo al RESET, la CPU siempre comienza la ejecución en la posición 0000H.
-
Las posiciones 0003H a 002AH (3 a 42) están reservadas para los programas de servicio de petición de las 5 interrupciones. Todas las interrupciones requieren que su programa de servicio comience en la posición reservada para el mismo.
En la siguiente tabla se muestran las direcciones de las zonas de memoria de programa reservadas para las peticiones de interrupción. FUENTE
DIRECCION
Interrupción externa 0.
0003H - 000AH
Rebasamiento del temporizador 0.
000BH - 0012H
Interrupción externa 1.
0013H - 001AH
Rebasamiento del temporizador 1.
001BH - 0022H
UART.
0023H - 002AH
Rebasamiento del temporizador 2
002BH - XXXXH
y T2EX (transición negativa)
(sólo 8032/8052)
MCS - 51
29
4.3.- MEMORIA INTERNA RAM. Funcionalmente, la memoria interna RAM es el más flexible de los espacios direccionados. Interiormente está subdividida en: -
128 Bytes de memoria interna de datos (256 Bytes en el 8032/8052).
-
128 Bytes de registros de funciones especiales.
fig. 4. 2 - RAM interna
4.3.1.-RAM interna de datos. El espacio de direcciones de la RAM interna de datos es de 0 a 128 bytes (256 para el 8032/8052) ocupados por: -
4 bancos de 8 registros localizados en las direcciones 00 a 31, seleccionables mediante el registro PSW.
-
La pila puede estar localizada en cualquier lugar del espacio de direcciones de la RAM interna de datos.
-
128 posiciones de bits de la RAM interna de datos son direccionables mediante direccionamiento directo. Estos bits residen en los bytes 32 a 47 (bits 00H a 7FH).
-
Una zona de memoria disponible para el usuario en las posiciones 47 a 127 (bytes 2FH a 7FH).
Se pude ver este espacio de direcciones en la figura 4.3. (pág. 32). La profundidad de la pila está limitada solamente por la RAM interna de datos disponible, gracias a un apuntador de pila de 8 bits recargable. La pila se usa para el almacenamiento del contador de programa (PC) durante las llamadas a subrutinas y se puede usar también para el paso de parámetros.
MCS - 51
30
De no indicarle otra cosa, el sistema inicializará su apuntador de pila en la dirección 07H de la RAM interna, lo que provoca que la primera información guardada en la pila quede en la dirección 08H.
fig. 4. 3 - RAM interna de datos
4.3.2.-Registros de funciones especiales. El espacio de direcciones de los SFR está localizado en las posiciones 128 a 255. Todos los registros, excepto el PC y los 4 bancos de 8 registros, se encuentran aquí. El mapa de memoria de los SFR les permite ser tan fácilmente accesibles como la RAM interna. Como tales registros, pueden ser operados por la mayoría de las instrucciones. Además se puede acceder a 128 bits localizados dentro del espacio de direcciones de los SFR usando direccionamiento directo. Estos bits residen en los bytes múltiplos de 8 de la zona de los SFR. En las siguientes figuras se muestran: un resumen de los SFR (fig. 4.4), un mapa de memoria de la zona SFR (fig. 4.5.) y una tabla indicativa de la función de cada bit direccionable (fig. 4.6.). Tanto el mapa de memoria como la tabla de funciones de los bits, aún cuando se ha indicado el registro T2CON (existente sólo en el 8032/8052), son útiles sólamente para el 8031/8051. En el caso del 8032/8052 existen 4 registros más, asociados al temporizador contador 2. En futuras versiones (como lo es la DALLAS DS5000), es probable que algunos bytes y bits libres en esta versión se usen para nuevas funciones.
MCS - 51
31
REGISTROS. Registros aritméticos. ACC.- Acumulador B.- Registro de multiplicación y división PSW.- Palabra de estado del programa
Apuntadores. SP.- Apuntador de pila DPTR.- Apuntador de dato. Registro de 16 bits DPH.- Parte alta DPL.- Parte baja
DIRECCION.
E0 H * F0 H * D0 H *
81 H 83 H 82 H
Puertas paralelo I/O. P0.- Puerto 0 P1.- Puerto 1 P2.- Puerto 2 P3.- Puerto 3
80 H * 90 H * A0 H * B0 H *
Sistema de interrupciones. IP.- Reg. de control de prioridades de interrupciones IE.- Reg. de control de habilitación de interrupciones
B8 H * A8 H *
Temporizadores/Contadores (T/C). TMOD.- Reg. de modos de T/C 0 y T/C 1 TCON.- Reg. de control de T/C 0 y T/C 1 T2CON.- Reg. de control del T/C 2 (8032/8052) TH0.- Parte alta del T/C 0 TL0.- Parte baja del T/C 0 TH1.- Parte alta del T/C 1 TL1.- Parte baja del T/C 1 TH2.- Parte alta del T/C 2 (8032/8052) TL2.- Parte baja del T/C 2 (8032/8052) RCAP2H.- Parte alta reg. autorrecarg./capt.(8032/8052) RCAP2L.- Parte baja reg. autorrecarg./capt.(8032/8052)
89 H 88 H * C8 H * 8C H 8A H 8D H 8B H CD H CC H CB H CA H
Puerto serie I/O. SCON.- Registro de control del puerto serie I/O SBUF.- Buffer de transmisión del puerto serie
98 H * 99 H
Control de alimentación. PCON.- Reg. de control de alimentación de la CPU
87 H
(*) Indica los registros direccionables bit a bit. fig. 4.4. - Resumen de registros de funciones especiales. MCS - 51
32
fig. 4. 5 - Mapa de registros de funciones especiales
MCS - 51
33
Dirección.
Símbolo reg.
Símbolo de bit
Significado.
80H
P0.0
Bit 0 del puerto 0.
81H
P0.1
Bit 1 del puerto 0.
82H
P0.2
Bit 2 del puerto 0.
P0.3
Bit 3 del puerto 0.
84H
P0.4
Bit 4 del puerto 0.
85H
P0.5
Bit 5 del puerto 0.
86H
P0.6
Bit 6 del puerto 0.
87H
P0.7
Bit 7 del puerto 0.
88H
IT0
Bit de control del tipo de interrupción externa INT0.
89H
IE0
Flag de interrupción externa 0.
8AH
IT1
Bit de control del tipo de interrupción externa INT1.
8BH
IE1
Flag de interrupción externa 1.
8CH
TR0
Bit de control de arranque del T/C 0.
8DH
TF0
Flag de rebasamiento del T/C 0.
8EH
TR1
Bit de control de arranque del T/C 1.
8FH
TF1
Flag de rebasamiento del T/C 1.
90H
P1.0/T2
Bit 0 del puerto 1/Entrada externa del T/C 2.
91H
P1.1/T2EX
Bit 1 del puerto 1/Entrada de reset o autorrecarga del T/C 2.
92H
P1.2
Bit 2 del puerto 1.
P1.3
Bit 3 del puerto 1.
94H
P1.4
Bit 4 del puerto 1.
95H
P1.5
Bit 5 del puerto 1.
96H
P1.6
Bit 6 del puerto 1.
97H
P1.7
Bit 7 del puerto 1.
98H
RI
Flag de interrupción de recepción.
99H
TI
Flag de interrupción de transmisión.
9AH
RB8
9º bit recibido en modo recepción.
9BH
TB8
9º bit transmitido en transmisión.
REN
Habilitación de la recepción.
9DH
SM2
Bit 2 de control del modo funcionamiento de la puerta serie.
9EH
SM1
9FH
SM0
83H
P0
TCON
93H
9CH
P1
SCON
de
Bit 1 (idem). Bit 0 (idem).
fig. 4.6.(1) - Bits direccionables en la memoria de registros.
MCS - 51
34
Dirección. A0H A1H A2H A3H A4H A5H A6H A7H A8H A9H AAH ABH ACH ADH AEH AFH
Símbolo reg.
Símbolo de bit
P2
IE
Significado.
P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P2.7
Bit 0 del puerto 2. Bit 1 del puerto 2. Bit 2 del puerto 2. Bit 3 del puerto 2. Bit 4 del puerto 2. Bit 5 del puerto 2. Bit 6 del puerto 2. Bit 7 del puerto 2.
EX0 ET0 EX1 ET1 ES ET2 EA
Habilitación de interrupción externa 0 Habilitación de interrupción del T/C0 Habilitación de interrupción externa 1 Habilitación de interrupción del T/C1 Habilitación interrupción puerto serie Habilitación de interrupción del T/C2 Reservado Habilitación general de interrupciones
B0H
P3.0/RXD/DATA
Bit 0 del puerto 3 / Recepción de la UART / Recepc.-trans. en modo síncrono.
B1H
P3.1/TXD/CLOCK
B2H B3H B4H
P3.2/INT0 P3.3/INT1 P3.4/T0
Bit 1 del puerto 3 / Transmisión de la UART / Reloj en modo síncrono. Bit 2 del puerto 3 / Interrupción 0. Bit 3 del puerto 3 / Interrupción 1. Bit 4 del puerto 3 / Entrada del contador 0.
B5H
P3.5/T1
Bit 5 del puerto 3 / Entrada del contador 1.
B6H
P3.6/WR
B7H
P3.7/RD
Bit 6 del puerto 3 / Control de escritura en memoria externa. Bit 7 del puerto 3 / Control de lectura en memoria externa.
P3
fig. 4.6.(2) - Bits direccionables en la memoria de registros.
Si se efectúa una lectura en cualquier posición de la RAM interna en la que no se haya almacenado ninguna información, se obtienen valores indeterminados. Mediante la convención INTEL, el almacenamiento de direcciones multibyte y operandos de datos en memoria de programa y de datos, se realiza colocando el byte menos significativo en la dirección de orden inferior y el byte más significativo en la dirección de orden superior. Cualquier variación con respecto a esta convención se especificará convenientemente.
MCS - 51
35
4.3.2.1.-Registro de Palabra de Estado de Programa (PSW). Este registro nos indica la palabra de estado, es direccionable bit a bit y cada uno de ellos nos muestra el estado de un indicador (flag). MSB
LSB
CY
AC
F0
RS1
RS0
OV
-
P
La dirección de byte de este registro es D0H. Un nivel alto equivale a flag activado y un nivel bajo a flag desactivado. Símbolo.
Dirección.
Nombre y significado.
CY
D7H
Flag de acarreo, activado/desactivado por software o hardware durante ciertas instrucciones de aritmética/lógica.
AC
D6H
Flag de acarreo auxiliar, activado/desactivado por hardware durante instrucciones de suma o resta, para indicar acarreo o transporte negativo (borrow out: dígito producido en sustracción directa cuando la diferencia entre los dígitos es menor que 0) del bit 3.
F0
D5H
Flag 0. Flag de estado definible por el usuario. Puede ponerse a 0 ó 1 o comprobar su estado por software.
RS1
D4H
RS0
D3H
Control de selección de banco de registros (bits 1 y 0), activados/desactivados por software para determinar el banco de registros con el que se quiere trabajar .*
OV
D2H
Flag de rebasamiento, activado/desactivado por hardware durante operaciones matemáticas, para indicar rebasamiento.
-
D1H
Reservado.
P
D0H
Flag de paridad, activado/desactivado por hardware en cada instrucción para indicar un número par/impar de "unos" en el acumulador.
* Los contenidos de RS1 y RS0 seleccionan el banco de registros con el que se quiere trabajar. Hay que colocar el número del banco en binario, siendo el bit de mayor peso RS1 y el de menor RS0. En caso de no indicar nada, el sistema selecciona por defecto el 0.
MCS - 51
36
5.-ACCESO A LA MEMORIA EXTERNA.
Existen dos tipos de acceso a la memoria externa: -
Acceso a la memoria externa de programa.
-
Acceso a la memoria externa de datos.
El acceso a la memoria externa de programa utiliza la señal como señal de selección de lectura. El acceso a la memoria externa de datos utiliza o como señales de lectura o escritura en memoria respectivamente. La búsqueda en la memoria externa de programa siempre utiliza una dirección de 16 bits. El acceso a la memoria externa de datos puede ser indistintamente una dirección de 16 bits (MOVX A,@DPTR) o una dirección de 8 bits (MOVX A,@Ri). Cuando se utiliza una dirección de 16 bits, el byte alto sale por el puerto 2 donde es mantenido durante el ciclo de lectura o escritura. Durante este tiempo el latch del puerto 2 (el SFR asociado) no se modifica, y una vez acabado el ciclo de memoria, salvo que aparezca un nuevo ciclo de memoria externa inmediatamente después, el contenido del SFR asociado al puerto 2 reaparecerá en el siguiente ciclo. En caso de utilizar una dirección de 8 bits el contenido del SFR del puerto 2 permanecerá invariable durante todo el ciclo de la memoria externa, con lo que se facilita el paginado. En cualquier caso, el byte bajo de las direcciones está multiplexado en el tiempo con el byte de datos en el puerto 0. La señal de dirección/dato conduce ambos FETs de salida en el puerto 0, de manera que en esta aplicación las patillas del puerto 0 no son salidas drenador abierto, y por lo tanto no son necesarias resistencias de pull-up externas. La señal ALE (habilitación del latch de direcciones) se usa para "capturar" el byte de direcciones dentro de un latch externo. El byte de direcciones es válido en el flanco de bajada de ALE. Entonces, en un ciclo de escritura, el byte de datos será escrito en la memoria al aparecer en el puerto 0, justo después de que sea activada. En un ciclo de lectura, el byte entrante es aceptado en el puerto 0 justo después de que la señal de lectura sea activada. Durante cualquier acceso a la memoria externa, la CPU escribe 0FFH en el latch del puerto 0 (en el SFR correspondiente), de este modo se borra cualquier información que contenga el SFR del puerto 0. Se accede a la memoria externa de programa bajo dos condiciones: -
Siempre que la señal esté activada.
-
Siempre que el PC contenga un número mayor que 0FFFH (1FFFH para el 8052).
MCS - 51
37
Esto provoca que en las versiones sin ROM/EPROM interna tengamos que cablear la patilla a nivel bajo, para habilitar la búsqueda de los 4 KBytes (8 KBytes en el 8032) bajos para programa en la memoria externa. Así que para poder utilizar los 4 KBytes de memoria interna como tales, debemos poner la patilla a nivel alto. Cuando la CPU está trabajando con la memoria externa de programa, los 8 bits del puerto 2 se dedican a una función de salida de direcciones y no se puede usar como un puerto de I/O de propósito general. Durante la búsqueda de programa en la memoria externa, estos bits son los que forman el byte alto del PC, y durante el acceso a la memoria externa de datos son o el DPH o el SFR del puerto 2 (según el acceso a memoria externa de datos es a través de un MOVX A,@DPTR o un MOVX A,@Ri).
5.1.-HABILITACION DE ACCESO A PROGRAMA (PSEN). La señal de lectura para la búsqueda en memoria externa de programa es PSEN , ésta no se activa cuando se busca en la memoria interna de programa. Cuando la CPU está accediendo a la memoria externa de programa, PSEN se activa dos veces en todos los ciclos (excepto durante una instrucción MOVX), sea o no sea necesario el byte actual buscado para la instrucción en curso.
fig. 5. 1.a - Ejecución de programa desde memoria externa Cuando PSEN se activa, su "tiempo" no es el mismo que el asignado a RD . Un ciclo completo incluyendo activación y desactivación de la ALE y RD precisa de 12 periodos de oscilador. La secuencia de ejecución para estos tipos de ciclos de lectura se muestran en las figuras 5.1.a y 5.1.b.
MCS - 51
38
fig. 5. 1.b - Ejecución de programa desde memoria externa
5.2.-HABILITACION DEL LATCHEADO DE DIRECCIONES (ALE). La principal función de ALE es proporcionar una señal de tiempo apropiada para capturar el byte bajo de direcciones del P0 en un latch externo. ALE se activa dos veces en cada ciclo de máquina, salvo en el segundo ciclo de una instrucción MOVX (durante un acceso a memoria externa de datos), en que se suprime el primero de los pulsos ALE (fig. 5.1.b.). Esta activación sucede incluso cuando el ciclo no implica una búsqueda externa. Consecuentemente, en cualquier sistema que no haga uso de memoria externa, ALE se activa a una frecuencia constante de 1/6 de la frecuencia del oscilador y puede ser usada para señal de reloj externa o para temporización.
5.3.-SOLAPAMIENTO DE MEMORIA EXTERNA DE DATOS Y DE PROGRAMA. En algunas aplicaciones se prefiere que al ejecutar un programa se encuentre en la misma memoria física que los datos. En el 8051 la memoria externa de datos y de programa se pueden combinar mediante la operación lógica AND con las señales PSEN y RD . Con una lógica positiva de estas dos señales, se produce la activación de la señal de lectura a nivel bajo que puede servir para el combinado de la memoria física (fig. 2.7, pág. 13). Ya que el ciclo de PSEN es más rápido que el ciclo de RD , la memoria externa necesita ser lo suficientemente rápida para acomodarse al ciclo de PSEN .
MCS - 51
39
5.4.-ACCESO A MEMORIA EXTERNA. CICLO DE SINCRONISMO DEL BUS. 5.4.1.-Secuencia de lectura de la memoria de programa. La dirección se envía desde el procesador en P1 del estado 2. La transferencia de datos en el bus se produce durante P1-P2 del estado 3 y P1 del estado 4 (fig. 5.2). Cuando buscamos en la memoria externa de programa, el 8051 siempre buscará un número par de bytes. Si son ejecutados un número impar de bytes antes de un salto o un acceso a memoria externa de datos, el byte no ejecutado será ignorado por el 8051.
fig. 5. 2 - Búsqueda en memoria de programa externa El ciclo de lectura comienza en P2 del estado 1, con el permiso de la señal de habilitación del latch de direcciones ALE. El flanco de bajada de ALE se usa para latchear la dirección que está presente en el bus en ese instante. En P1 del estado 3 se quita la dirección de P0, quedando en estado de alta impedancia. La señal de control de lectura de memoria de programa PSEN se activa también en P1 del estado 3. PSEN provoca que una pastilla externa direccionada habilite sus amplificadores de salida, para que poco después (en P1 del estado 4) la instrucción válida se encuentre en el bus. Cuando el 8051 devuelve la señal PSEN a nivel alto, la pastilla direccionada pondrá los amplificadores de salida "flotantes", reajustando el bus de nuevo (P2 del estado 4). Para la instrucción MOVC (MOVC A,@A+PC o MOVC A,@A+DPTR; mover al acumulador el contenido de la posición de memoria cuya dirección es la suma del contenido del DPTR o el PC más el contenido del acumulador. Instrucción de 1 byte y 24 periodos), el código de operación se busca durante los 6 primeros periodos de oscilador. El primer byte de la siguiente
MCS - 51
40
instrucción se busca durante el segundo grupo de 6 periodos de oscilador. En un tercer grupo de 6 periodos de oscilador se trae al acumulador el contenido de la posición direccionada y por último en el cuarto grupo de 6 periodos de oscilador se busca por segunda vez el código de operación de la siguiente instrucción.
5.4.2.-Secuencia de lectura de memoria de datos. Cada ciclo del bus de la memoria externa de datos consta de 12 periodos de oscilador (fig. 5.3). Los 12 periodos de oscilador de la memoria externa de datos permiten al 8051 el uso de periféricos que son relativamente más lentos que su memoria de programa. La dirección se envía desde el procesador durante P1 del estado 5. La transferencia de datos por el bus se realiza entre P1 del estado 1 y P2 del estado 3. Antes de la operación de lectura, las patillas de la parte baja del bus de direcciones quedan flotantes.
fig. 5. 3 - Ciclo de lectura en memoria de datos externa El ciclo de lectura comienza durante P2 del estado 4 al pasar la señal ALE de habilitación del latch de direcciones a nivel alto. La transición de ALE se usa para latchear la dirección, la cual está presente en ese instante. En P2 del estado 6 se quita la dirección del puerto 0 quedando éste en estado de alta impedancia. La señal de control de lectura de memoria de datos RD se activa durante P1 del estado 1. RD provoca que la pastilla externa direccionada habilite sus amplificadores de salida. Poco después, el dato válido se encontrará disponible en el bus. Cuando seguidamente el 8051 devuelve RD a nivel alto, la pastilla direccionada pondrá los amplificadores de salida "flotantes", reajustando el bus de nuevo.
MCS - 51
41
5.4.3.-Secuencia de escritura en memoria de datos. El ciclo de escritura es semejante al ciclo de lectura. Comienza con el paso de ALE a nivel alto y el envío de una dirección (fig. 5.4). En P2 del estado 6 el procesador envía el dato a escribir en la posición de memoria seleccionada, este dato permanece en el bus hasta P1 del estado 4. La señal de escritura se pone a nivel bajo en P1 del estado 1 y permanece activa hasta P1 del estado 4.
fig. 5. 4 - Ciclo de escritura en memoria de datos externa
MCS - 51
42
6.-DIRECCIONAMIENTO DE OPERANDOS. Existen 5 métodos de direccionamiento de operandos fuente: -
Direccionamiento de registro.
-
Direccionamiento directo.
-
Direccionamiento de registro indirecto.
-
Direccionamiento inmediato.
-
Direccionamiento indirecto por registro-base + registro-índice.
Los tres primeros métodos sirven también para direccionar operandos destino. Ya que las operaciones en el 8051 requieren 0 (sólo NOP), 1, 2, 3 ó 4 operandos, estos 5 métodos de direccionamiento se utilizan en combinaciones que proveen al 8051 de 21 modos de direccionamiento. La mayoría de instrucciones tienen un campo fuente/destino que especifica el tipo de dato, método de direccionamiento y operandos implicados. En otro tipo de operaciones de movimiento, el operando destino es también un operando fuente. Por ejemplo en "resta con acarreo A,#5", el registro A recibe el resultado de la operación "A - 5 - acarreo". La mayoría de las operaciones implican operandos que están localizados en la memoria interna de datos. La selección del espacio de memoria de programa (MOVC) o del espacio de memoria de datos externa (MOVX), para un segundo operando, está determinada por el nemónico a no ser que sea un operando inmediato. El subconjunto de la memoria interna de datos a la que nos estamos dirigiendo se determina por el método de direccionamiento y por el valor de la dirección. Por ejemplo, se puede acceder a los SFRs solamente mediante direccionamiento directo, con una dirección entre 128 y 255.
6.1.-DIRECCIONAMIENTO DE REGISTRO. Permite acceder a 8 registros (R0-R7) del banco de registros (RB) seleccionado. Como hay 4 bancos de registros, éstos se seleccionan con 2 bits del PSW (RS0, RS1). También se puede acceder a los registros a través de direccionamiento directo y direccionamiento de registro indirecto, ya que los 4 bancos de registros están dentro de los 32 bytes más bajos de la RAM interna de datos. Otras posiciones de la RAM interna de datos que se direccionan como registro son A, B, AB (para MUL y DIV) y DPTR.
6.2.-DIRECCIONAMIENTO DIRECTO. Es el único método de acceso a la zona SFR trabajando con palabras de 8 bits y también a los bits individuales dentro de la zona SFR y la memoria interna de datos. El direccionamiento de los estos bits da acceso a un subconjunto de 128 bits de la RAM interna de datos y a otro subconjunto de 128 bits dentro de la zona SFR (fig. 4.6). MCS - 51
43
6.3.-DIRECCIONAMIENTO POR REGISTRO INDIRECTO. Con este tipo de direccionamiento, utilizando el contenido de R1 y R0 en el banco de registros seleccionado, o utilizando el contenido del apuntador de pila (sólo PUSH y POP), se direcciona la RAM interna de datos, siendo el único modo de direccionamiento que permite el acceso a los 128 bytes extras de RAM interna de datos del 8032/8052. El direccionamiento por registro indirecto también se utiliza para acceder a la memoria externa de datos. En este caso R1 o R0 del banco de registros seleccionado, se utilizan para acceder a las posiciones dentro de un bloque de 256 bytes (el número de bloque se selecciona por el contenido del puerto 2). Por ejemplo, en la instrucción MOVX A,@Ri; el contenido de R1 o R0 da los 8 bits bajos de direcciones y los 8 bits altos los proporciona el puerto 2. El apuntador de datos DPTR de 16 bits se puede utilizar para acceder a cualquier posición de la memoria externa (de datos o de programa).
6.4.-DIRECCIONAMIENTO INMEDIATO. Permite acceder a las constantes que son parte de la instrucción desde la memoria de programa.
6.5.-DIRECCIONAMIENTO INDIRECTO POR REGISTRO-BASE + REGISTRO-INDICE. Simplifica el acceso a tablas de consulta que residan en la memoria de programa. Se puede acceder a un byte de una tabla de consulta mediante un movimiento indirecto desde una posición cuya dirección es la suma de un registro-base (DPTR o PC) mas un registro-índice (A).
6.6.-DIRECCIONAMIENTO DE SFR Y RAM INTERNA DE DATOS EN EL 8032/8052. El 8032/8052 tiene 128 bytes de memoria interna de datos más que el 8031/8051, éstos se encuentran en posiciones de memoria solapadas con la zona de SFR. Así, para acceder a estos bytes sólo se puede hacer mediante un direccionamiento de registro indirecto, mientras que a la zona de SFR se puede acceder mediante direccionamiento directo. -Acceso a SFR: MOV A,88H
;cargamos el acumulador con el contenido de la dirección 88H de la ;zona de SFR (TCON).
-Acceso a RAM solapada: MOV R0,#88H ;cargamos el acumulador con el contenido de la posición 88H MOV A,@R0
MCS - 51
;de la memoria interna de datos.
44
7.-ESTRUCTURAS DE PUERTO Y OPERACION.
De los cuatro puertos de 8051, el puerto 0 es bidireccional y los puertos 1, 2 y 3 son cuasibidireccionales, es decir: -
Bidireccional: cuando en modo de entrada los pines del puerto están "flotantes". -
Cuasibidireccional: cuando en modo de entrada los pines del puerto se encuentran a nivel alto (mediante resistencias de pull-up internas).
Cada puerto consta de un latch (asociado a uno de los SFR P0 a P3), un amplificador de salida (driver) y un registro de entrada (buffer). Los drivers de salida de los puertos 0 y 2 y los buffers de entrada del puerto 0, se usan en el acceso a la memoria externa. En esta aplicación, las salidas del puerto 0 corresponden al byte bajo de las direcciones de la memoria externa multiplexadas en el tiempo con el byte de datos (escritura o lectura) de la memoria externa. Las salidas del puerto 2 corresponden al byte alto de las direcciones de la memoria externa. En los otros puertos existen pines con funciones alternativas, esto es que pueden realizar otras funciones a parte de puertos de I/O. Estos pines son: P1.0-T2
Entrada externa del T/C 2 (8032/8052).
P1.1-T2EX
Entrada externa de captura o autorrecarga del T/C 2 (8032/8052).
P3.0-RXD/DATA
Pin de entrada serie en modo asíncrono (UART) o pin de entrada/salida serie en modo registro de desplazamiento.
P3.1-TXD/CLOCK
Pin de salida en modo asíncrono (UART) o reloj en modo registro de desplazamiento.
P3.2-
Pin de interrupción externa 0.
P3.3-
Pin de interrupción externa 1.
P3.4-T0
Pin de entrada externa del T/C 0.
P3.5-T1
Pin de entrada externa del T/C 1.
P3.6-
Pin de salida de señal de escritura a la memoria externa de datos.
P3.7-
Pin de salida de señal de lectura a la memoria externa de datos.
El latch de salida correspondiente a un pin con función alternativa, debe ponerse a nivel alto para que dicha función actúe.
MCS - 51
45
7.1.-CONFIGURACIONES DE ENTRADA/SALIDA I/O. En la figura 7.1 se muestra la configuración del latch y del buffer para cada bit en cada uno de los puertos.
fig. 7. 1 - Latches y buffers de puertos Los puertos 1, 2 y 3 tienen resistencias de pull-up internas. El puerto 0 tiene salidas en drenador abierto. Cada línea I/O se puede usar independientemente como entrada o como salida, excepto las correspondientes a los puertos 0 y 2, que no pueden ser usadas como I/O de próposito general cuando se utilizan como bus de direcciones (parte baja)/datos y bus de direcciones (parte alta) respectivamente de la memoria externa. Si se desea usar un pin como entrada, el latch del bit del puerto correspondiente debe contener un "1", lo cual corta el FET driver de salida. Esta configuración, en los puertos 1, 2 y 3 permite 2 opciones: -
Usar los pines como salidas puestas a nivel alto mediante las resistencias de pullup internas.
-
Usar los pines como entradas atacadas por una fuente externa (si el pin se deja al aire, la entrada queda a nivel alto debido a la resistencia de pull-up interna).
Esta es la razón del porqué al referirse a los puertos 1, 2 y 3 se les trata como cuasibidireccionales.
MCS - 51
46
En el caso del puerto 0, un "1" en el latch del bit del puerto, provoca que el pin correspondiente quede como salida flotante, por esta razón se le denomina bidireccional. El puerto 0 difiere de los demás en que no tiene resistencias de pull-up internas. El FET superior del driver de salida de este puerto está cortado, excepto cuando se usa el puerto como bus de direcciones/datos en el acceso a memoria externa. En el caso de poner a "1" un latch del puerto 0, ambos FETs de salida quedan cortados para que el pin quede flotante pudiendo usarse como entrada de alta impedancia. Todos los latches de los puertos son puestos a "1" con la función RESET. Si después se pone un "0" en un latch de un puerto, el pin correspondiente se configurará como salida a nivel bajo. Este pin se puede volver a reconfigurar como entrada al poner nuevamente un "1" en el latch asociado al mismo.
7.2.-ESCRIBIENDO EN UN PUERTO. En la ejecución de una instrucción que cambie el nivel en un latch del puerto, el nuevo nivel llega al latch durante P2 del Estado 6 del ciclo final de la instrucción. De cualquier manera, los latches del puerto son muestreados por sus buffers sólo durante la fase 1 de cualquier período de reloj (durante la fase 2, el buffer retiene el nivel muestreado en la fase 1). Consecuentemente, el nuevo nivel en el latch del puerto no aparece en el pin de salida hasta la próxima fase 1, que será P1 del Estado 1 del siguiente cíclo de máquina. Si el cambio requiere una transición de "0" a "1" en el puerto 1, 2 ó 3, se activa un pull-up adicional durante P1 y P2 de Estado 1 del ciclo de máquina en el cual ocurre la transición. Este pull-up se utiliza para aumentar la velocidad de transición pues puede suministrar cerca de 100 veces la corriente que puede dar un pull-up normal, esto se debe a que los pull-up internos son FETs y no resistencias lineales.
7.3.-CONEXION DE CARGAS AL PUERTO Y CONSIDERACIONES DE INTERFACE. Los drivers de salida de los puertos 1, 2 y 3 pueden atacar cada uno 3 entradas TTL LS (1 entrada TTL normal). Estos puertos en versión HMOS, pueden ser atacados de forma normal por cualquier circuito TTL o NMOS. Ambas versiones, HMOS y CHMOS, pueden ser atacadas por salidas colector abierto o drenador abierto, sin resistencias de pull-up externas. Los drivers de salida del puerto 0 pueden atacar cada uno 8 entradas TTL LS (2 entradas TTL normales). De todas formas se requieren pull-up externas para atacar entradas NMOS, excepto cuando son usadas como bus de direcciones/datos.
MCS - 51
47
7.4.-CARACTERISTICAS DE LECTURA-MODIFICACION-ESCRITURA. Existen dos caminos para leer un puerto: se puede leer cada latch o cada pin (ver fig. 7.1.). En el 8051, algunas instrucciones leen el latch y otras leen el pin. Las instrucciones que leen el latch antes que el pin son aquellas que leen un valor, operan con él y lo reescriben en el latch, a estas instrucciones se les denomina instrucciones de lecturamodificación-escritura. Las instrucciones listadas a continuación son de este tipo. Cuando el operando destino es un puerto o un bit de un puerto, se lee el latch antes que el pin. ANL
AND lógica; ej. ANL P1,A
ORL
OR lógica; ej. ORL P2,A
XRL
EX-OR lógica; ej. XRL P2,A
JBC
Salto si bit=1 y borra el bit; ej. JBC P1.1,ETIQ
CPL
Complementa bit; ej. CPL P1.1
INC
Incrementa; ej. INC P1
DEC
Decrementa; ej. DEC P2
DJNZ
Decrementa y salta si no 0; ej DJNZ P3,ETIQ
MOV PX.Y,C
Mover el bit de CY al bit Y del puerto X.
CLR PX.Y
Borrar el bit Y del puerto X.
SET PX.Y
Poner a "1" el bit Y del puerto X.
No es obvio que las tres últimas instrucciones (sobre todo las dos últimas) sean instrucciones de lectura-modificación-escritura, sin embargo éstas leen el byte de los latches del puerto (los 8 bits), modifican el bit direccionado y reescriben el nuevo bit en los latches. La razón por la que las instrucciones de lectura-modificación-escritura van directamente al latch antes que al pin es para evitar una posible malinterpretación del nivel de tensión del pin. Por ejemplo, un bit de un puerto se podría usar para atacar la base de un transistor. Cuando se pone un "1" en el pin, el transistor se activa y si la CPU lee el bit del puerto en el pin antes que el latch, leería la tensión de base del transistor y la interpretería como un "0". Leyendo el latch antes que la patilla, se leerá el valor correcto del "1".
MCS - 51
48
8.-SISTEMA DE INTERRUPCIONES.
El 8051 puede atender a 5 tipos de interrupción distintos (6 en el 8032/8052), cada una de las cuales puede ser programada en 2 niveles de prioridad, pudiendo ser habilitada o deshabilitada individualmente o globalmente. La habititación o deshabilitación individual de las interrupciones, se realiza borrando o activando los bits correspondientes en el registro IE de los SFR. Los niveles de prioridad de las interrupciones se programan activando o desactivando el bit correspondiente del registro IP de los SFR. Existen dos niveles de prioridad: alto y bajo.
8.1.-REGISTRO DE HABILITACION DE INTERRUPCIONES (IE). MSB
LSB
EA
-
ET2
ES
ET1
EX1
ET0
EX0
La dirección del byte es A8H. NOTA: un "0" indica función deshabilitada y un "1" indica función habilitada. Símbolo
Dirección
Significado Si EA=0, ninguna interrupción será atendida.
EA
AFH
Si EA=1, cada interrupción será atendida o no, dependiendo del estado del bit correspondiente del registro.
-
AEH
Reservado. Habilitación de la interrupción por rebasamiento del temporizador 2 (8032/8052). Bit de uso general en el 8051.
ET2
ADH
ES
ACH
Habilitación de la interrupción de la UART.
ET1
ABH
Habilitación de temporizador 1.
EX1
AAH
Habilitación de la interrupción externa 1.
ET0
A9H
Habilitación de temporizador 0.
EX0
A8H
Habilitación de la interrupción externa 0.
MCS - 51
la
la
interrupción
interrupción
por
por
rebasamiento
del
rebasamiento
del
49
8.2.-PRIORIDAD DE LAS INTERRUPCIONES. 8.2.1.-Estructura del nivel de prioridades. Cuando se está atendiendo a una interrupción de nivel de prioridad bajo, el sistema puede atender a una interrupción de nivel de prioridad alto, pero no atenderá a una de nivel bajo hasta que haya atendido ésta. Cuando el sistema atiende a una interrupción de nivel de prioridad alto, no se puede atender a otra hasta que haya atendido ésta.
8.2.2.-Estructura de prioridad dentro de cada nivel. Dentro de cada nivel de prioridad hay una segunda estructura de prioridad. Las fuentes de interrupción del 8051 son: -
2 líneas de interrupción externas ΙΝΤ0 e ΙΝΤ1 , programables para su activación por flanco o por nivel.
-
2 líneas de interrupción de los temporizadores, activadas por los flags de rebasamiento de los mismos.
-
1 línea de interrupción de la UART, activada por uno de los flags de lectura o escritura.
La estructura de prioridad dentro de cada nivel es: 1.-Interrupción externa ΙΝΤ0 . 2.-Interrupción por rebasamiento del temporizador/contador 0. 3.-Interrupción externa ΙΝΤ1 . 4.-Interrupción por rebasamiento del temporizador/contador 1. 5.-Interrupción de la UART (puerto serie).
8.2.3.-Registro de prioridad de la interrupciones (IP). MSB -
LSB -
PT2
PS
PT1
PX1
PT0
PX0
La dirección del registro es B8H. NOTA: un "0" indica prioridad baja y un "1" alta.
MCS - 51
50
Símbolo
Dirección
Significado
-
BFH
Reservado
-
BEH
Reservado
PT2
BDH
Prioridad de la interrupción del T/C 2 (8032/8052)
PS
BCH
Prioridad de la interrupción de la UART
PT1
BBH
Prioridad de la interrupción del T/C 1
PX1
BAH
Prioridad de la interrupción externa 1 ()
PT0
B9H
Prioridad de la interrupción del T/C 0
PX0
B8H
Prioridad de la interrupción externa 0 ()
Para implementar estas normas, el sistema cuenta con dos flip-flops no direccionables para activar el nivel de prioridad. Uno de ellos indica si se está sirviendo una interrupción de alta prioridad, y si es así bloquea las interrupciones adicionales. El otro indica si se está sirviendo una interrupción de baja prioridad y si es así, bloquea el resto de las interrupciones excepto las de alta prioridad. Todas las fuentes de interrupción se muestrean en P2 del estado 5 de cada ciclo máquina, tal que para el estado 6 de cualquier ciclo se habrán establecido y dado prioridad a todas las peticiones de interrupción activadas. La respuesta a la activación de más alta prioridad comenzará con el estado S1 del siguiente ciclo de máquina. Una vez generada la respuesta, ésta podrá desatenderse por alguna de las siguientes condiciones: -
Una interrupción de igual o mayor prioridad está ya en desarrollo.
-
El ciclo actual no es el ciclo final en la ejecución de la instrucción en curso.
-
La instrucción en proceso es RETI o un acceso a los SFR IE o IP. Es decir, una petición de interrupción no se responderá después de RETI, o después de una lectura o escritura a IE o IP, hasta que al menos sea ejecutada alguna otra instrucción.
Si existe alguna de estas condiciones, se descartará el resultado del sondeo de interrupciones. Si no existe ninguna de estas condiciones, el resultado del sondeo de interrupciones se considerará en el siguiente ciclo de máquina.
8.3.-PROTOCOLO DE RESPUESTA DE LAS INTERRUPCIONES. El procesador reconoce una petición mediante la fijación del correspondiente flip-flop de activación del nivel de prioridad. Hecho esto, el procesador ejecuta una llamada por hardware a la subrutina de servicio de la interrupción reconocida. Al mismo tiempo se encarga de borrar el flag MCS - 51
51
que ha pedido la interrupción (con las excepciones de TI, RI, TF2 o EXF2, y tampoco ΙΝΤ0 e
ΙΝΤ1 , ya que el procesador no tiene control de las fuentes de estas señales). La llamada a subrutina por hardware guarda el contenido del PC en la pila, pero no salva PSW, y recarga el PC con una dirección que depende de la petición de interrupción realizada, según la siguiente tabla:
Interrupción
Dirección del servicio de interrupción
ΙΝΤ0
0003H
T0
000BH
ΙΝΤ1
0013H
T1
001BH
UART
0023H
T2-T2EX (8032/8052)
002BH
La ejecución comienza en esta dirección y no finaliza hasta que la instrucción RETI aparece. La instrucción RETI borra el flip-flop indicativo del nivel de prioridad, que se ha activado al reconocerse la interrupción. Entonces el procesador baja en dos bytes el límite superior de la pila y recarga con ellos el PC.
8.4.-INTERRUPCIONES EXTERNAS. Las fuentes de interrupción externas se pueden programar para ser activadas por flanco de bajada o por nivel bajo, mediante el activado o borrado de los bits IT1 o IT0 del registro TCON de los temporizadores/contadores. Si ITx=0, la interrupción externa x es activada por la detección de un nivel bajo en el pin
ΙΝΤx . Si ITx=1, la interrupción externa x es activada por la detección de un flanco de bajada en el pin ΙΝΤx . En ambos casos el flag de petición de interrupción IEx se activará, pidiendo la interrupción. Ya que los pines de interrupción externa son muestreados al menos una vez en cada ciclo de máquina, se precisarán al menos 12 periodos de oscilador para asegurar el muestreo de un nivel bajo. Si la interrupción externa se activa por transición, la fuente externa debe tener por lo menos el
MCS - 51
52
pin a nivel alto durante al menos un ciclo de máquina para que el flag de petición de interrupción IEx se active con seguridad. IEx se borra automáticamente por la CPU cuando se llame a su rutina de servicio. Si la interrupción externa es activada por nivel, la fuente externa debe mantener la petición activada hasta que se genere la interrupción. Una vez generada la interrupción, se debe desactivar la petición al completar la rutina de servicio, o será generada otra interrupción.
8.5.-TIEMPOS DE RESPUESTA. Los niveles de ΙΝΤ0 e ΙΝΤ1 se invierten y se latchean en IE0 e IE1 en P2 del Estado 5 de cada ciclo de máquina. Los valores no se consultarán hasta el siguiente ciclo de máquina. Si una petición está activada y se cumplen las condiciones para ser atendida, la siguiente instrucción que se ejecuta será una llamada por hardware a la rutina de servicio de la interrupción correspondiente. La llamada precisa dos ciclos. De este modo entre la activación de una petición de interrupción externa y el comienzo de la ejecución de la primera instrucción de la rutina de servicio, transcurren un mínimo de tres ciclos de máquina completos. La figura 8.1 muestra los tiempos de respuesta de las interrupciones. Si la petición de interrupción se bloquea por alguna de las condiciones mencionadas anteriormente (8.2.3), el tiempo de respuesta será más largo.
fig. 8. 1. - Diagrama de tiempos de respuesta de interrupciones 1- Si una interrupción de igual o mayor prioridad está ya en proceso, el tiempo de espera adicional, dependerá de la rutina de servicio de la interrupción. 2- Si la instrucción en proceso no está en su ciclo final, el tiempo de espera adicional no puede ser mayor que tres ciclos, ya que las instrucciones más largas MUL y DIV necesitan sólo cuatro ciclos. 3- Si la instrucción en proceso es RETI o un acceso a IE o IP, el tiempo de espera adicional no puede ser mayor que cinco ciclos (un máximo de un ciclo para completar la instrucción en proceso, más cuatro ciclos para completar la próxima instrucción, en caso de ser MUL o DIV. De esta forma, en un sistema de interrupción única, el tiempo de respuesta es siempre mayor de tres ciclos máquina y menor de ocho ciclos máquina. MCS - 51
53
8.6.-EJECUCION PASO A PASO (SINGLE STEP). La estructura de interrupciones del 8051 permite la ejecución paso a paso con muy poco software de apoyo (software overhead: nombre que designa los diversos factores que impiden obtener el rendimiento ideal de un programa). Como se ha dicho anteriormente, no se atenderá una petición de interrupción si otra de igual o mayor nivel se está ejecutando. Tampoco se atenderá después de RETI, hasta que al menos se ejecute alguna otra instrucción. Una forma de utilizar esta particularidad es programar una de las interrupciones externas o , para ser activada por nivel. La rutina de servicio para la interrupción terminará con el siguiente código: JNB
P3.2,$
;espera aquí hasta que ΙΝΤ0 vaya a nivel alto.
JB
P3.2,$
;espera aquí hasta que ΙΝΤ0 vaya a nivel bajo..
RETI
:retorna y ejecuta una instrucción.
Si mantenemos normalmente a nivel bajo el pin ΙΝΤ0 (que corresponde a P3.2), la CPU irá directamente a la rutina de interrupción externa 0, permaneciendo allí hasta que ΙΝΤ0 se ponga a "1" (p. e. al pulsar una tecla). Al poner de nuevo ΙΝΤ0 a "0", se ejecutará RETI retornando al programa de tarea, se ejecuta una nueva instrucción e inmediatamente se introduce de nuevo en la rutina de interrupción, repitiendo así el ciclo.
MCS - 51
54
9.-TEMPORIZADORES / CONTADORES (T/C).
El 8051 tiene dos temporizadores/contadores de 16 bits, T/C 0 y T/C 1 (el 8032/8052 tiene un T/C más), cada uno de los cuales puede ser configurado por software como temporizador o como contador. -
Funcionando como temporizador, el registro se incrementa internamente cada ciclo de máquina (12 periodos de oscilador).
-
Funcionando como contador, el registro se incrementa cada vez que se detecta un flanco de bajada o un nivel bajo (programable por software), en el pin de entrada exterior del contador correspondiente T0 o T1 (o T2 en 8032/8052), que se encuentran en el puerto 3.
En modo contador la entrada externa se muestrea en P2 del Estado 5 de cada ciclo de máquina. Cuando se produce un cambio de nivel alto a nivel bajo entre la muestra de un ciclo y la muestra del siguiente, el valor del contador se incrementa y este nuevo valor aparece en el registro del contador durante P1 del Estado 3 del ciclo de máquina siguiente al ciclo en el que se ha detectado la transición. Por lo tanto, la máxima frecuencia que puede detectar funcionando como contador es 1/24 de la frecuencia de reloj. No hay restricciones en el "duty cycle" de la señal de entrada externa, pero para asegurar que un nivel dado sea muestreado al menos una vez antes de que cambie, éste debe mantener su nivel durante al menos un ciclo máquina completo. Dentro de cada forma de funcionamiento (contador o temporizador), puede haber cuatro modos de trabajo. Los modos 0, 1 y 2 coinciden para ambos T/C, el modo 3 es diferente. El control de los T/C así como la programación de los distintos modos, se realiza mediante los registros especiales TMOD y TCON (y TCON2 en el 8032/8052), cuya estructura y utilización se describen seguidamente.
9.1.-REGISTRO DE MODO DE FUNCIONAMIENTO DE LOS T/C (TMOD). MSB
LSB
GATE
C/ Τ
M1
M0
GATE
T/C 1
C/ Τ
M1
M0
T/C 0
La dirección del byte del registro en 89H. NOTA: Este registro no es direccionable bit a bit.
MCS - 51
55
Símbolo
Significado
GATE
Si GATE=1, se precisa activar TRx e ΙΝΤx para habilitar el T/C. Si GATE=0, el T/C se habilita con solo activar TRx.
C/ Τ
Si C/ Τ =1, funciona como contador. Si C/ Τ =0, funciona como temporizador.
M1 y M0
Bits de selección de modo de funcionamiento. El modo es el número en M1 M0 en binario. (00=modo 0, 01=modo 1...) Registro TMOD.
-
Los bits TMOD.0 a TMOD.3 manejan el T/C 0.
-
Los bits TMOD.4 a TMOD.7 manejan el T/C 1.
9.2.-REGISTRO DE CONTROL DE LOS T/C (TCON). MSB
LSB
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
La dirección de byte del registro en 88H. Direccionable bit a bit. Símb.
Dir.
Significado Flag de rebasamiento del T/C 1. Es activado por hardware cuando en el T/C 1 se produce un rebasamiento provocando una petición de interrupción. Se desactiva automáticamente al procesarse la interrupción.
TF1
8FH
TR1
8EH
Bit de control de arranque/parada del T/C 1.
TF0
8DH
Flag de rebasamiento del T/C 0. Es activado por hardware cuando en el T/C 0 se produce un rebasamiento provocando una petición de interrupción. Se desactiva automáticamente al procesarse la interrupción..
TR0
8CH
Bit de control de arranque/parada del T/C 0.
8BH
Flag de la interrupción externa 1 ( ΙΝΤ1 ). Se activa cuando se detecta un flanco de bajada o nivel bajo en el pin INT1, y se desactiva cuando se ejecuta el servicio de interrupción.
IE1
IT1
IE0
IT0
MCS - 51
8AH
89H
88H
Bit de control de tipo de detección de ΙΝΤ1 . Si IT1=1 la interrupción se detecta por flanco de bajada. Si IT1=0 la interrupción se detecta por nivel bajo. Flag de la interrupción externa 0 ( ΙΝΤ0 ). Se activa cuando se detecta un flanco de bajada o nivel bajo en el pin INT0, y se desactiva cuando se ejecuta el servicio de interrupción. Bit de control de tipo de detección de ΙΝΤ0 . Si IT0=1 la interrupción se detecta por flanco de bajada. Si IT0=0 la interrupción se detecta por nivel bajo.
56
9.3.-MODOS DE FUNCIONAMIENTO DE LOS T/C. En las siguientes partes, cuando en un registro o bit aparezca "x", quiere decir que ese registro o bit es similar para el T/C 1 o el T/C 2.
9.3.1.-Modo 0. En este modo de funcionamiento disponemos de un contador o temporizador de 8 bits con predivisor por 32.
fig. 9. 1 - Contador/Temporizador Modo 0 Los dos registros del T/C (TLx y THx) se cofiguran como un registro de 13 bits formado por los 8 bits de THx y los 5 bits bajos de TLx (los 3 bits de mayor peso de TLx quedan indeterminados). Cuando en el T/C se produce rebasamiento, se activa el flag TFx de petición de interrupción y rebasamiento del registro TCON. Con la lectura/escritura en THx se accede a los bits 12 a 5 del T/C, con una lectura/escritura en TLx se accede a los 8 bits de este registro, de los cuales el T/C utiliza los 5 bits bajos (bits de 4 a 0) como predivisor por 32. Estos bits deberían borrarse antes de arrancar el T/C. Se permite la entrada de impulsos al T/C de 2 formas: -
Con GATEx=0, activando TRx.
-
Con GATEx=1, activando TRx e ΙΝΤx . Esta opción nos da la posibilidad de controlar el T/C externamente mediante la entrada ΙΝΤx lo que facilita la medida del ancho de pulsos.
Los registros del T/C se pueden actualizar por software.
MCS - 51
57
9.3.2.-Modo 1. En este modo disponemos de un contador o temporizador de 16 bits cuyo funcionamiento es similar al del modo 0.
fig. 9. 2 - Contador/Temporizador 1 Modo 1
9.3.3.-Modo 2. En este modo disponemos de un contador o temporizador de 8 bits (TLx) con autorrecarga automática desde THx. Cuando en TLx se produce un rebasamiento, TLx se autorrecarga con el contenido de THx y se activa el flag TFx (THx no varía).
fig. 9. 3 - Contador/Temporizador 1 Modo 2
MCS - 51
58
Al cofigurar el T/C x en modo 2, se consigue un contador compatible con otros microcomputadores de la familia MCS-48, después de cargar THx con 00H. En modo 3, el T/C 1 tiene especial aplicación en la generación de velocidad de la UART.
9.3.4.-Modo 3. En este modo de trabajo, a diferencia de los modos anteriores, los dos T/C actúan de distinta forma. -
El T/C 1 en modo 3 queda inactivo (manteniendo el contenido de sus registros) sin influir para nada en el T/C 0. El efecto es el mismo que se obtiene poniendo TR1=0. Puede ser útil para parar el T/C 1 con el T/C 0 en modo 3.
fig. 9. 4 - Contador/Temporizador 0 Modo 3 -
El T/C 0 en modo 3 deshabilita el funcionamiento del T/C 1 como tal tomando posesión de los bits TR1 y TF1 (fig. 9.4). Así TH0 controla la interrupción del T/C1.
De esta forma el T/C 1 se puede utilizar para la generación de la velocidad de transmisión de la UART en cualquiera de los modos 0, 1 ó 2 (la fuente de oscilación de la que se obtiene esa velocidad puede ser externa o interna). Además el T/C 1 se puede utilizar para cualquier aplicación que no requiera una interrupción. *TH0 se configura automáticamente como un temporizador de 8 bits (contador de ciclos de máquina), utilizando los bits de control del T/C 1 (TR1 y TF1). El temporizador se habilita mediante TR1 y una vez que se produce el rebasamiento de TH0 el flag TF1 se activa. *TL0 se configura como un T/C de 8 bits manejado con los bits de control de T/C 0. Su funcionamiento es similar al de los modos 0 y 1, pero con 8 bits. MCS - 51
59
9.4.-CONFIGURACION DE LOS T/C. La configuración de los T/C se determina con los registros: -
TMOD.- Modo de los T/C.
-
TCON.- Control de los T/C.
La entrada al circuito del T/C se puede hacer desde el exterior (para uso como contador), o desde el circuito de reloj interno (para uso como temporizador), dependiendo de la activación/desactivación del bit C/ Τ del registro TMOD. Cuando se usa como temporizador, se toma como base de tiempos 1/12 de la frecuencia de reloj. El arranque/parada del T/C se realiza mediante la activación/desactivación del bit TRx del registro TCON. Cuando el bit GATE del registro TMOD está activado, el arranque/parada del T/C x queda condicionado a la entrada externa ΙΝΤx ( ΙΝΤx =1 permite el arranque, ΙΝΤx =0 el T/C queda parado). Cuando el bit GATE está desactivado, el arranque/parada del T/C x se efectúa sin ninguna condición. En cualquier caso la función normal del pin ΙΝΤx no se ve afectada por el funcionamiento del T/C. Si se habilita ΙΝΤx , se producirá una interrupción cuando se produzca un flanco de bajada o un nivel bajo en dicho pin. - Cuando se produce el rebasamiento en los registros del T/C x, el bit TFx del registro TCON se activa generando una petición de interrupción.
9.5.-FORMA DE OPERAR. Tanto el contador como el temporizador actúan por incremento, de forma que cuando todos los bits de sus registros sean "1", con el siguiente pulso se produce un rebasamiento, pasando todos los bits de esos registros a "0" o cargándose con el valor de autorrecarga. Tras este rebasamiento TFx se activa. Cuando una instrucción cambia el modo del T/C x o altera sus bits de control, este cambio se produce al final de la ejecución de la instrucción. Las entradas T0 y T1 se muestrean en el décimo periodo de cada ciclo de máquina. Por tanto, el nivel de una señal externa ("0" ó "1") debe mantenerse por lo menos durante 12 periodos de oscilador. Hay un retraso de 12 periodos de oscilador hasta que se incrementa el registro del contador.
9.6.-TEMPORIZADOR/CONTADOR 2 (T/C 2 EN 8031/8052). Es un T/C de 16 bits con autorrecarga de 16 bits y capacidad de captura. El registro de control en el SFR es T2CON (descrito en el apartado 9.6.2). Cuando el T/C 2 funciona como temporizador, el registro del T/C 2 se incrementa cada ciclo máquina. Como contador, se incrementa con cada flanco de bajada detectado en el pin T2 MCS - 51
60
(P1.0). El pin se muestrea en P2 del Estado 5 de cada ciclo máquina en que la función de contador está activada. De esta forma, cuando la muestra es un nivel alto en un ciclo y un nivel bajo en el siguiente ciclo, el contador se incrementa. El nuevo valor del contador aparece en el registro del T/C 2 durante P1 del Estado 3 del ciclo máquina siguiente a aquél en el que la transición se ha detectado. Por esta razón, la máxima frecuencia de conteo es 1/24 de la frecuencia de reloj interno. No hay restricciones en el "duty cycle" de la señal de entrada externa, pero para asegurar que ésta es muestreada, se debe mantener su nivel durante al menos un ciclo máquina completo.
9.6.1.-Configuración del T/C 2. En ambos modos (temporizador o contador), se puede seleccionar cualquiera de las opciones autorrecarga o captura. Si el bit CP/ RL2 =1, se activa el modo captura y si CP/ RL2 =0, se activa el modo autorrecarga. En el modo captura hay dos opciones que se seleccionan con el bit EXEN2 de T2CON. Si EXEN2=0, el T/C 2 actúa como temporizador o contador de 16 bits que al rebasarse pone a "1" el flag TF2 (bit de rebasamiento del T/C 2), que puede utilizarse para generar una interrupción. Si EXEN2=1, el T/C 2 además de hacer lo anterior, capturará el contenido de TL2 y TH2 en los registros RCAP2L y RCAP2H respectivamente cuando en la entrada externa T2EX (P1.1) se produzca un flanco de bajada. Además, este flanco de bajada en T2EX, pone a "1" el flag EXF2 de T2CON (este flag, al igual que TF2, puede generar una interrupción). En el modo autorrecarga de nuevo hay dos opciones. Si EXEN2=0, cuando se rebasa el T/C 2, no solamente pone a "1" el bit TF2, sino que también provoca que el T/C 2 se recargue con el valor de 16 bits presente en los registros RCAP2L y RCAP2H, los cuales pueden alterarse por software. Si EXEN2=1, el T/C 2 además de lo anterior, se autorrecargará con los contenidos de RCAP2L y RCAP2H cuando se produzca un flanco de bajada en la entrada externa T2EX. Además, el flanco de bajada en T2EX, pone a "1" el flag EXF2, que al igual que TF2 puede generar una interrupción. La localización del vector de interrupción del T/C 2 es 2BH. La interrupción se genera por la función OR-lógica de los bits TF2 y EXF2, por esta razón la rutina del servicio de interrupción debe determinar en ocasiones cual de las dos fuentes generó la interrupción. Ninguno de estos flags se borran por hardware cuando se inicia la rutina de servicio, por lo que se debe borrar por software el flag causante de la interrupción. El T/C 2 también se puede usar como generador de velocidad de transmisión del puerto serie (en modos 1 y 3), activando los bits RCLK y/o TCLK (RCLK=TCLK=0 selecciona el T/C 1 como generador de velocidad de transmisión). En este modo la velocidad de transmisión del puerto serie se genera por los pulsos de rebasamiento del T/C 2 mejorándose el funcionamiento respecto al T/C 1.
MCS - 51
61
Si el bit C/ T2 =0, se programa el T/C 2 como temporizador, incrementándose su registro a una velocidad de 1/2 (y no 1/12) de la frecuencia del oscilador. Si C/ T2 =1, T/C2 funciona como contador incrementándose con cada flanco de bajada detectado en el pin T2 (P1.0) (la máxima frecuencia de conteo es 1/24 de la frecuencia de reloj).
fig. 9. 5 - T/C 2 en modo T/C (RCLK=TCLK=0)
fig. 9. 6 - T/C 2 en modo generador de velocidad de transmisión (RCLK + TCLK = 1) Si EXEN2 está activado mientras el T/C 2 se está usando como reloj del puerto serie, EXF2 se activará con un flanco de bajada en T2EX (P1.1), pero no se efectuará captura ni
MCS - 51
62
autorrecarga. En consecuencia, mientras el T/C 2 está en modo generador de velocidad de transmisión, el pin T2EX se puede usar como una entrada de interrupción externa. El rebasamiento del T/C 2 no afecta a TF2 y no se generará una interrupción. La recarga automática desde RCAP2H y RCAP2L se efectuará sin tener en cuenta el estado de CP/ RL2 . Cuando el T/C 2 está corriendo (TR2=1) como temporizador en el modo generador de velocidad, no se debe intentar leer o escribir TH2 o TL2. En estas condiciones, el temporizador se incrementa cada 1/2 de la frecuencia de reloj, y el resultado de una lectura o escritura puede no tener precisión. Los registros RCAP2L y RCAP2H, se pueden leer pero no se deben escribir, puesto que la escritura puede solapar una autorrecarga y causar errores. En este caso, es aconsejable parar el temporizador (TR2=0) antes de acceder a él o a los registros RCAP2.
9.6.2.-Registro de control del T/C 2 (T2CON). MSB TF2
LSB EXF2
RCLK
TCLK
EXEN2
TR2
C/
CP/
La dirección de byte del registro es C8H. Símbolo
TF2
EXF2
Dir.
CF
CE
Significado Flag de rebasamiento del T/C2. Es activado por hardware cuando en el T/C2 se produce rebasamiento, provocando petición de interrupción. Debe borrarse por software y no activa si RCLK+TCLK=1. Flag externo del T/C2. Si EXEN2=1, este flag se activa al detectarse un flanco de bajada en T2EX. En este caso, si la interrupción del T/C2 está habilitada, EXF2=1 provoca una petición de interrupción. Este bit ha de borrarse por software. Bit de selección de reloj de recepción. Si RCLK=1, el puerto serie usa pulsos de rebasamiento de T/C2 para reloj de recepción. Si es 0 el puerto serie usa T1.
RCLK
CD
TCLK
CC
Igual que RCLK para transmisión.
EXEN2
CB
Bit habilitación entrada externa T2EX. Si es 1, al detectarse flanco de bajada se activa EXF2 y T/C2 captura o autocarga. Si es 0 deshabilita el pin T2EX.
TR2
CA
Bit de control de arranque/parada del T/C2.
C/ T2
C9
Bit de selección de funcionamiento. Si es 1, contador. Si es 0,Temporizador (OSC/12).
CP/ RL2
C8
Bit de selección captura/recarga. Si es 1, se hace una captura según esté EXEN2 y pin T2EX. Si es 0,se hace una autocarga según condiciones anteriores o por rebase. Si TCLK+RCLK=1 se ignora el bit y T/C2 se autocarga cuando hay rebosamiento.
MCS - 51
63
10.-COMUNICACION SERIE. El
8051
tiene
un
puerto
serie
útil
para
interconectar
dispositivos
UART
(receptor/transmisor asíncrono universal) y para expandir I/O. El puerto serie puede transmitir y recibir datos simultáneamente (full-duplex). Dispone de un registro intermedio de entrada (SBUF), que permite la recepción de un segundo byte en el registro de recepción antes de que el primero haya pasado al bus interno del 8051. Sin embargo, si se finaliza la recepción del segundo byte antes de que el primero haya pasado al bus interno, uno de los dos bytes se perderá. Los registros (de transmisión e intermedio de recepción del puerto serie), están englobados dentro del registro de función especial SBUF, aunque internamente están físicamente separados (ver figuras 10.3, 10.4, 10.5 y 10.6). Este puerto puede programarse en 4 modos de operación mediante el registro de control SCON. -
MODO 0.- Expansión de I/O mediante registros de desplazamiento externos TTL o CMOS (figura 10.1).
-
MODO 1.- Interface UART con un formato de 10 bits y velocidad de transmisión variable.
-
MODO 2.- Interface UART con un formato de 11 bits y velocidad de transmisión fija.
-
MODO 3.- Interface UART con un formato de 11 bits y velocidad de transmisión variable.
10.1.-CONTROL DEL PUERTO SERIE Y SUS REGISTROS. Los datos recibidos y transmitidos pasan por el registro SBUF. Una escritura en el SBUF actualiza el registro de transmisión, mientras que una lectura del SBUF lee el registro intermedio de recepción. El receptor dispone de 2 registros (registro de recepción y registro intermedio de recepción, "double buffered") para eliminar el desbordamiento que podría ocurrir si la CPU no lee un dato antes de que comience a recibirse el siguiente dato. En general el transmisor no necesita 2 registros, debido a la capacidad del 8051 para mantener el encadenamiento de datos a su máxima velocidad. Se puede degradar la velocidad de transmisión si la CPU debe ejecutar alguna rutina de interrupción larga de mayor prioridad que la de transmisión. El control del puerto serie y la comprobación de su estado se realiza mediante el registro SCON.
MCS - 51
64
fig. 10. 1 - Expansión I/O
fig. 10. 2 - Tipos de interface UART
MCS - 51
65
10.1.1.-Registro de control del puerto serie (SCON). MSB
LSB
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
La dirección de byte del registro es 98H. Símbolo
Direcc.
Significado Estos dos bits indican en binario el modo de funcionamiento:
SM0
SM1
9FH
9EH
SM0
SM1 MODO
0
0
0
0
1
1
1
0
2
1
1
3
En modo 0 este bit debe ser "0".
SM2
9DH
En modo 1, si SM2=1, Ri no se activará si no se recibe un bit de stop válido. En modos 2 y 3, se habilita la comunicación multiproceso y si SM2=1, RI no se activará si el bit 9 recibido (RB8) es "0".
REN
9CH
Bit de activación de la recepción. Activado/desactivado por software.
TB8
9BH
Bit 9 transmitido en modos 2 y 3.
RB8
9AH
Bit 9 recibido en los modos 2 y 3. En modo 1, si SM2=0, es el bit de stop.
99H
Flag de interrupción de la transmisión. Activado por hardware al final del bit 8 de datos en modo 0 o al principio del bit de stop en los modos 1, 2 y 3. Debe borrarse por software.
TI
RI
98H
Flag de interrupción de la recepción. Activado al final del bit 8 de datos en modo 0 o en la mitad del bit de stop en los modos 1, 2 y 3 (ver SM2). Debe borrarse por software.
El bit REN habilita la recepción arrancando el generador de velocidad de transmisión del receptor. Este bit debe formar parte del programa de inicialización del puerto serie. El bit TI informa a la CPU de que el registro de transmisión (SBUF) está vacío y el bit RI de que el registro intermedio de recepción (SBUF) está lleno. TI y RI deben borrarse en el programa de servicio de la interrupción, para que no interrumpan constantemente a la CPU. Debido a que la petición de interrupción es el resultado de la OR-lógica de las señales RI y TI, estos bits deben muestrearse por software para determinar la fuente de la interrupción.
MCS - 51
66
10.2.-MODOS DE OPERACION. 10.2.1.-Modo Registro de Desplazamiento (MODO 0). En este modo el puerto serie se utiliza para ampliar el número de pines I/O. Dispone de una salida de reloj CLOCK (P3.1 o TXD), que sincroniza el desplazamiento de bits a/desde un registro de desplazamiento externo, a través del pin DATA (P3.0 o RXD). El formato de transmisión/recepción es de 8 bits (LSB primero). La velocidad de transmisión es fija e igual a 1/12 de la frecuencia de reloj (ver figura 10.3). La transmisión se inicia con cualquier instrucción que utilice el SBUF como registro destino. La señal de escritura en SBUF durante P2 del Estado 6, pone a "1" el bit 9 del registro de desplazamiento de transmisión y hace que TX Control comience el envío de datos. La temporización interna es tal que se produce un retraso de 1 ciclo máquina entre la señal de escritura en SBUF y la activación de SEND (de TX Control). SEND habilita la salida del registro de desplazamiento a través del pin DATA (P3.0) y también habilita la salida de SHIFT CLOCK (señal de reloj de desplazamiento) a través del pin CLOCK (P3.1). La señal SHIFT CLOCK está a nivel bajo durante los Estados 3, 4 y 5 de cada ciclo de máquina, y a nivel alto durante los Estados 1, 2 y 6. El contenido del registro de desplazamiento se desplaza a la derecha una posición (sale un bit por P3.0) en P2 del Estado 6 de cada ciclo máquina en el que SEND está activado. Mientras los bits se desplazan y salen por la derecha, por la izquierda se van introduciendo "ceros". Cuando el MSB del byte de datos está en la posición de salida del registro de desplazamiento, con lo que el bit 9 inicialmente puesto a "1" se encontrará a su izquierda, el resto de posiciones estarán a "0". Esta configuración indica al TX Control que debe realizar un último desplazamiento y desactivar SEND, a la vez que activa TI. Ambas cosas ocurren en P1 del Estado 1 del décimo ciclo máquina después de la escritura del SBUF. La recepción se inicia al poner REN=1 y RI=0. En P2 del Estado 6 del siguiente ciclo máquina, el RX Control escribe los bits 11111110 en el registro de desplazamiento de recepción y en la siguiente fase de reloj (P1 del Estado 1), activa RECEIVE (de RX Control). RECEIVE habilita la salida de la señal SHIFT CLOCK por el pin CLOCK (P3.1). Las transiciones de esta señal se efectúan en P1 del Estado 3 y P1 del Estado 6 de cada ciclo máquina. El contenido del registro de desplazamiento de recepción se desplaza una posición hacia la izquierda y el valor leído en el pin DATA (P3.0) entra en el registro de desplazamiento por la derecha en P2 del Estado 5 del mismo ciclo máquina. A medida que los bits de datos recibidos se introducen en el registro por la derecha, los "unos" cargados anteriormente se desplazan y salen por la izquierda. Cuando el "0" cargado
MCS - 51
67
inicialmente en la posición más a la derecha llega a la posición más a la izquierda en el registro de desplazamiento, indica al RX Control que debe realizar un último desplazamiento y cargar SBUF. En P1 del Estado 1 del décimo ciclo máquina después de borrar RI en el SCON, RECEIVE se desactiva y el flag RI se activa.
fig. 10. 3 - Puerto serie en modo 0 MCS - 51
68
10.2.2.-Modos UART (Modos 1, 2 y 3). En los modos 1, 2 y 3 el puerto serie actúa como UART (Transmisor Receptor Asíncrono Universal). Dispone de una salida de datos TXD (P3.1) y de una entrada de datos RXD (P3.0). La señal procedente de T/C 1 o T/C 2 (modos 1 y 3) y de reloj (modo 2), se divide por 16 para obtener la velocidad de transmisión. En estos modos la transmisión se inicia con cualquier instrucción que use SBUF como registro destino. La señal de escritura en SBUF pone un "1" (modo 1) o carga el contenido de TB8 (modos 2 y 3) en el bit 9 del registro de desplazamiento de transmisión y hace que TX Control comience la transmisión en P1 del Estado 1 (S1P1) del ciclo máquina siguiente al que se produce el rebase del contador-divisor por 16. De esta forma la duración de bit se sincroniza con el contadordivisor por 16 y no con la señal de escritura en SBUF. La transmisión se inicia con la activación de SEND (de TX Control), que pone el bit de start en el pin TXD. Con el siguiente pulso de TX Clock (una duración de bit más tarde) se activa DATA (que habilita la salida de los bits de datos) y se produce el primer pulso de desplazamiento, con lo que el primer bit pasa al pin TXD. La recepción se inicia al detectarse un flanco de bajada en la entrada RXD. Para este propósito se muestrea RXD a una velocidad 16 veces superior a la velocidad de recepción establecida. Cuando se detecta un flanco de bajada, el contador-divisor por 16 se resetea y se escribe 1FFH (111111111) en el registro de desplazamiento de entrada, de esta forma se sincroniza la señal RX Clock con la señal que se recibe. El muestreo de los bits recibidos permite rechazar falsos bits de start producidos por interferencias, para ello el contador-divisor por 16 divide cada duración de bit en 16 estados, muestreando el valor de RXD en los estados 7, 8 y 9. Un bit de start se considera válido cuando dos de los tres muestreos son "0". Si después del primer flanco de bajada admitido el bit de start resulta falso, el circuito se resetea y vuelve a esperar un nuevo flanco de bajada. Si el bit de start resulta válido, se introduce en el registro de desplazamiento de entrada y se procede a la recepción del resto del formato. El puerto serie del 8051 no proporciona indicación alguna de recepción de bit de stop. Sin embargo, ya que el bit de start se detecta por flanco de bajada, la UART no recibirá más datos si no se recibe un bit de stop. 10.2.2.1.-Modo 1. El formato de transmisión/recepción en este modo es de 10 bits : 1 bit de start ("0"), 8 bits de datos (LSB primero) y 1 bit de stop ("1"). En la recepción, el bit de stop se introduce en RB8 de SCON. La velocidad de transmisión/recepción es variable. Para generar esta velocidad se puede utilizar el T/C 1 o el T/C 2, dependiendo de los bits RCLK y TCLK de T2CON (solo en 8032/8052/) (ver figura 10.4). MCS - 51
69
En la transmisión los bits de datos se desplazan y salen por la derecha, introduciéndose "ceros" por la izquierda. Cuando el MSB del byte de datos se encuentra en la posición de salida del registro de desplazamiento, el "1" cargado inicialmente en el bit 9 de dicho registro estará a su izquierda, estando el resto de posiciones a "0". Esto indica al TX Control que debe realizar un último desplazamiento y entonces desactivar SEND y activar TI. Ambas cosas ocurren en el décimo pulso de TX Clock después de la escritura en SBUF. En la recepción los bits de datos entran por la derecha desplazando y sacando por la izquierda los "unos" cargados anteriormente. Cuando el bit de start llega a la posición más a la izquierda del registro de desplazamiento (bit 9 del registro) indica al RX Control que debe realizar un último desplazamiento, cargar SBUF, RB8 y activar RI. La señal que hace ésto se generará si se cumplen las siguientes condiciones cuando se genera el último pulso de desplazamiento: -
RI=0, y
-
SM2=0, o el bit de stop recibido=1
Si cualquiera de estas dos condiciones no se cumple, el formato recibido se pierde. Si ambas condiciones se cumplen, el bit de stop se introduce en RB8, los 8 bits de datos pasan a SBUF y se activa RI. Al mismo tiempo, RX Control (se cumplan o no las condiciones) vuelve a esperar un nuevo flanco de bajada en RXD. 10.2.2.2.-Modos 2 y 3. El formato de recepción/transmisión en estos modos es de 11 bits: 1 bit de start ("0"), 8 bits de datos (LSB el primero), 1 bit 9 de datos programable y 1 bit de stop ("1"). En la transmisión el bit 9 de datos es TB8. En la recepción el bit 9 de datos se introduce en RB8. La velocidad de transmisión puede ser de 1/32 o 1/64 de la frecuencia de oscilador (dependiendo del bit SMOD de PCON) en el modo 2, o variable en el modo 3 (en este modo la señal generadora de la velocidad de transmisión procede de T/C 1 o T/C 2, dependiendo de los bits RCLK y TCLK de TCON) (ver figuras 10.5 y 10.6). En la transmisión los bits de datos se desplazan y salen por la derecha, introduciéndose "ceros" por la izquierda, excepto en el primer pulso de desplazamiento, en el que después de sacar el primer bit de datos pone un "1" el la posición del bit 9 (bit de stop) del registro de desplazamiento. Cuando TB8 se encuentra en la posición de salida del registro de desplazamiento y el bit de stop a su izquierda, conteniendo las demás posiciones "ceros", indica a TX Control que debe realizar un último desplazamiento, desactivar SEND y activar TI. Esto ocurre en el pulso 11 de TX Clock después de la escritura en SBUF. En la recepción los bits de datos entran por la derecha, desplazando y sacando por la izquierda los "unos" introducidos anteriormente. Cuando el bit de start llega a la posición más a la izquierda del registro de desplazamiento (bit 9), indica a RX Control que debe realizar un último
MCS - 51
70
desplazamiento, cargar SBUF, RB8 y activar RI. La señal que hace ésto se genera si se cumplen las siguientes condiciones: -
RI=0, y
-
SM2=0, o el bit 9 de datos recibido igual a 1.
Si cualquiera de estas condiciones no se cumple, el dato recibido se pierde y RI no se activa. Si ambas condiciones se cumplen, el bit 9 de datos se introduce en RB8 y los 8 bits de datos pasan a SBUF. Un pulso de RX Clock después (se cumplan o no las condiciones), RX Control vuelve a esperar un nuevo flanco de bajada en RXD.
fig. 10. 4 - Puerto serie en modo 1 (RCLK, TCLK, TIMER2 sólo en 8052)
MCS - 51
71
fig. 10. 5 - Puerto serie en modo 2
MCS - 51
72
fig. 10. 6 - Puerto serie en modo 3. (TCLK, RCLK, TIMER 2 sólo en 8052)
MCS - 51
73
10.2.2.3.-Comunicación Multiprocesador. Un sistema multiprocesador puede estar compuesto por un procesador maestro y varios procesadores esclavos. Los modos 2 y 3 del puerto serie tienen especial aplicación para las comunicaciones multiprocesador. En estos modos se reciben 9 bits de datos, el bit 9 recibido se introduce en RB8. El puerto serie se puede programar de forma que cuando se recibe el bit de stop la interrupción del puerto sea activada sólo si RB8=1. Esta característica se habilita al activar el bit SM2 de SCON, y se utiliza del siguiente modo: El procesador maestro transmite un formato de direcciones o de datos dependiendo del bit 9 (TB8) del formato transmitido. Si TB8=0, el formato es de datos y si TB8=1, el formato es de direcciones. El procesador esclavo tiene configurado su puerto serie con el bit SM2=1 para interrumpir su CPU en caso de recibir un formato de direcciones (RB8=1). Cuando el procesador maestro envía un formato de direcciones (TB8=1), la dirección enviada corresponde a un procesador esclavo determinado. El procesador esclavo al recibir un formato de direcciones, interrumpe su CPU y lo compara con su propia dirección. Si la dirección coincide con la suya, el procesador reconfigura su puerto serie poniendo el bit SM2=0, para recibir e interrumpir su CPU con cada nuevo formato que le envíe el procesador maestro. Los demás procesadores esclavos mantienen el bit SM2=1 para recibir sólo formatos de direcciones. El procesador maestro transmite formatos de datos que serán aceptados sólo por el procesador direccionado (que tiene el bit SM2=0), hasta que vuelva a transmitir otro formato de direcciones que interrumpa a todos los esclavos para comprobar si han sido direccionados.
10.2.3.-Formatos típicos de transmisión en serie. Un formato es una cadena de bits. Los bits correspondientes a los distintos modos del puerto serie se pueden ver en la figura 10.7. Mediante software, se puede crear un formato que envíe un bit de paridad de la siguiente forma: MOV
C,P
;poner paridad en el bit de acarreo
MOV
TB8,C
;poner acarreo en bit de transmisión 8
MOV
SBUF,A
;cargar registro de transmisión con dato.
MCS - 51
74
fig. 10. 7 - Formatos típicos para distintas aplicaciones de comunicación serie
10.3.-GENERACION DE VELOCIDAD DE TRANSMISION CON EL T/C 1. Cuando se usa el T/C 1 como fuente para la generación de la velocidad de transmisión, esta velocidad en baudios viene determinada por la fórmula:
velocidad de transmisión =
velocidad de rebasamiento del T/C 1 n
Donde "n" es un número entero que depende del bit SMOD de PCON. Si SMOD=0, n=32 y si SMOD=1, n=16. La velocidad de rebosamiento depende de la velocidad de conteo del T/C 1, y ésta de la frecuencia del oscilador o de la frecuencia de los pulsos de entrada, si el T/C 1 se emplea como contador. Si el T/C 1 actúa como temporizador (C/ Τ de TCON = 0), la velocidad de conteo es 1/12 de la frecuencia de oscilador y si el T/C 1 actúa como contador (C/ Τ =1), la velocidad de conteo máxima es de 1/24 de la frecuencia de oscilador. El T/C 1 puede ser configurado como temporizador o como contador, y trabajar en cualquiera de sus tres modos. En la aplicación más típica se utiliza como temporizador en "modo autorrecarga" de 8 bits sin utilizar la interrupción, pero para lograr velocidades de transmisión muy bajas, se habilita la interrupción del temporizador y se le configura para correr como temporizador de 16 bits, aprovechando la interrupción para recargar los 16 bits por software con el valor adecuado a la velocidad de transmisión.
MCS - 51
75
En función de los modos de T/C 0 y T/C 1, se presentan las siguientes posibilidades: *Cuando el T/C 0 está en modo 3, el T/C 1 no dispone de interrupción. -T/C 1 en modo 0, la velocidad de rebosamiento es fija:
velocidad de rebosamien to =
velocidad de conteo 32 x 256
-T/C 1 en modo 1, la velocidad de rebosamiento es fija:
velocidad de rebasamien to =
velocidad de conteo 256 x 256
-T/C 1 en modo 2, la velocidad de rebosamiento es variable, dependiendo del valor de autorrecarga:
velocidad de rebosamien to =
velocidad de conteo 256 - TH1
*Cuando el T/C 0 está en los modos 0, 1 ó 2, el T/C 1 dispone de interrupción. Si se deshabilita la interrupción, el T/C 1 actúa igual que si T/C 0 está en modo 3. -T/C 1 en modos 0 ó 1, la velocidad de rebasamiento se puede variar recargando los registros TH1 y/o TL1 por software bajo petición de interrupción por rebasamiento: (modo 0)
velocidad de rebosamiento =
velocidad de conteo (32 x 256) - [ (256 x TH1) + TL1 ]
(modo 1)
velocidad de rebosamien to =
velocidad de conteo (256 x 256) - [ (256 x TH1) + TL1 ]
-T/C 1 en modo 2, en este caso la habilitación de la interrupción para generar la velocidad de transmisión es innecesaria, pues la recarga se efectúa automáticamente. A continuación se muestra una tabla con algunas de las velocidades de transmisión más usadas que se pueden obtener con el T/C 1.
MCS - 51
76
Velocidad
f. osc.
SMOD
T/C 1
(baudios)
(MHz)
(PCON)
C/
MODO
valor de recarga
Modo 0
12 x
x
x
x
1
x
x
x
1 Mbd Modo 2
12
375 Kbd Modos 1 y 3 62.5 Kbd
11.059
1
0
2
FFH 11111111
19.2 KBd
11.059
1
0
2
FDH 11111101
9.6 KBd
11.059
0
0
2
FDH 11111101
4.8 KBd
11.059
0
0
2
FAH 11111010
2.4 KBd
11.059
0
0
2
F4H
1.2 KBd
11.059
0
0
2
E8H 11101000
137.5 Bd
11.059
0
0
2
1DH 00011101
110 Bd
6
0
0
2
72H
110 Bd
12
0
0
1
FEEBH
11110100
01110010
fig. 10. 8 - Velocidades de transmisión más comunes generadas por T/C 1.
10.4.-GENERACION DE VELOCIDAD DE TRANSMISION CON EL T/C 2. En el 8032/8052, el T/C 2 se puede utilizar como temporizador o como contador para generar la velocidad de transmisión del puerto serie. En cualquier caso la velocidad se determina por el rebosamiento independientemente del estado del bit SMOD de PCON. Las velocidades de transmisión obtenidas con el T/C 2 como temporizador (C/ T2 =0) en los modos 1 y 3 del puerto serie vienen dadas por:
velocidad de transmisión =
frecuencia del oscilador 32 x [ 65536 - [ (256 x RCAP2H) + RCAP2L ] ]
Esto permite generar velocidades que varían desde 5,72 baudios hasta 375 Kbaudios, para un reloj de 12 MHz. Cuando el T/C 2 actúa como contador (C/ T2 =1), la máxima velocidad de conteo de la señal externa es de 1/24 de la frecuencia de oscilador. En este caso las velocidades de transmisión vienen dadas por:
MCS - 51
77
velocidad de transmisión =
frecuencia externa 65536 - [ (256 x RCAP2H) + RCAP2L ]
Al usar el T/C 2 como generador de velocidad de transmisión, pueden utilizarse distintas velocidades para transmitir y para recibir. Como puede verse en la figura 10.9, se consigue mediante los bits TCLK y RCLK de T2CON, activando cualquiera de ellos o los dos a la vez. Hay que hacer notar que el desbordamiento de TH2 no activa TF2 y no se genera interrupción, por lo que esta interrupción no tiene que estar deshabilitada cuando T/C 2 se utiliza como generador de velocidad de transmisión o recepción.
fig. 10. 9 - T/C 2 en modo generador de velocidad de transmisión Además si EXEN2=1, una transición de "1" a "0" en T2EX activará EXF2 pero no provocará la autorrecarga desde RCAP2H-RCAP2L a TH2-TL2. De esta forma, cuando el T/C 2 se utilice como generador de velocidad de transmisión, T2EX podrá utilizarse como una interrupción externa extra si se desea.
MCS - 51
78
11.-RESET. En la versión HMOS del 8051, la circuitería interna de RESET está conectada al pin RST/VPD, tal como muestra la figura 11.1. En esta versión se da la posibilidad de alimentar la RAM interna a través de este pin, en ausencia de VCC. En la versión CHMOS del 8051, la circuitería de RESET está conectada al pin RST como se ve también en la figura 11.1.
fig. 11. 1 - Configuración de RESET (HMOS a RST/VPD, CHMOS a RST) En ambas versiones el pin está conectado al circuito de Reset a través de un Trigger Schmitt para dotarlo de inmunidad al ruido. La salida de este Trigger Schmitt se muestrea por el circuito de Reset en P2 del Estado 5 de cada ciclo de máquina. Un Reset se realiza manteniendo el pin RST a nivel alto durante al menos 2 ciclos máquina (una vez arrancado el oscilador). Al efectuar un Reset, los pines ALE y PSEN (que son cuasibidireccionales) así como los pines de los cuatro puertos, quedan configurados como entradas. El Reset se ejecuta durante el segundo ciclo en el que el pin RST está a nivel alto y se repite cada ciclo máquina hasta que el pin RST pase a nivel bajo.
MCS - 51
79
11.1.-CONTENIDO DE LOS SFR DESPUES DE UN RESET. REGISTRO
CONTENIDO
REGISTRO
CONTENIDO
PC
0000H
T2CON (8052)
00H
ACC
00H
TH0
00H
B
00H
TL0
00H
PSW
00H
TH1
00H
SP
07H
TL1
00H
DPL
00H
TH2 (8052)
00H
DPH
00H
TL2 (8052)
00H
P0-P3
0FFH
RCAP2H (8052)
00H
IP
XXX00000B
RCAP2L (8052)
00H
IP (8052)
XX000000B
SCON
00H
IE
0XX00000B
SBUF
Indeterminado
IE (8052)
0X000000B
PCON (HMOS)
0XXXXXXXB
TMOD
00H
PCON (CHMOS)
0XXX0000B
TCON
00H
La RAM interna no resulta afectada por un reset. Al conectar VCC, el contenido de la RAM queda indeterminado a menos que se retorne de un modo de operación de "consumo de potencia reducido".
11.2.-RESET DE ENCENDIDO. Puede obtenerse un reset automático al conectar la alimentación mediante un circuito externo (figura 11.2), suponiendo que el tiempo de subida de VCC no exceda de 1 milisegundo y el tiempo de arranque del oscilador no exceda de 10 milisegundos.
fig. 11. 2 - Reset de encendido
MCS - 51
80
Cuando se conecta la alimentación, la tensión aplicada al pin RST es la diferencia entre VCC y la tensión del condensador, y disminuye a medida que éste se carga. Al aumentar la capacidad del condensador, la tensión en el pin RST decrece más lentamente. Es preciso que la tensión VRST permanezca por encima de la tensión umbral mínima del Trigger Schmitt el tiempo suficiente para efectuar un reset completo. El tiempo requerido es el tiempo de arranque del oscilador más 2 ciclos de máquina.
MCS - 51
81
12.-ALIMENTACION Y CARACTERISTICAS DE CONSUMO. El 8051 permite reducir el número de componentes internos a los que alimentar. De esta forma, en caso de fallo de VCC, se pueden alimentar a un mínimo de estos componentes mediante una fuente de apoyo. En las versiones HMOS, la alimentación de apoyo se consigue a través del pin RST/VPD. Las versiones CHMOS utilizan el registro PCON (Power CONtrol).
12.1.-FUNCIONAMIENTO EN BAJO CONSUMO (HMOS). Durante el funcionamiento normal la RAM interna se alimenta desde VCC. Sin embargo, como se ha visto en la figura 11.1, si la tensión en el pin RST/VPD sobrepasa a VCC entonces VPD alimenta a la RAM. Esto permite disponer de una fuente de apoyo para mantener los datos de la RAM en el caso de un fallo de alimentación (durante un corto período de tiempo). Para aprovechar esta característica, el sistema del usuario detecta inminentes fallos de alimentación, interrumpiendo al procesador para transferir los datos relevantes a la RAM y habilitar el sistema de alimentación de apoyo desde el pin RST/VPD, antes de que VCC esté por debajo del límite de funcionamiento. Cuando se restablece la alimentación, VPD necesita mantenerse durante el tiempo de arranque del oscilador más 2 ciclos máquina para efectuar un reset y poder reanudar el funcionamiento normal.
fig. 12. 1 - Hardware para los modos IDLE y POWER DOWN
12.2.-MODOS DE REDUCCION DE CONSUMO (CHMOS). Las versiones CHMOS tienen dos modos de reducción de consumo. Modo IDLE (marcha en vacío) y modo POWER DOWN (bajo consumo). La entrada a través de la cual se suministra la alimentación de apoyo es VCC y no el pin RST/VPD como en las versiones HMOS. El hardware utilizado para los dos modos se muestra en la figura 12.1. MCS - 51
82
Los modos IDLE y POWER DOWN se activan mediante los bits correspondientes en el registro PCON. En el modo IDLE (IDL=1), el oscilador continúa funcionando y las interrupciones, el puerto serie y los T/Cs continúan recibiendo señal de reloj, pero la CPU no recibe señal de reloj. En el modo POWER DOWN (PD=1), el oscilador se detiene. Con el oscilador "congelado", todas las funciones quedan paradas, pero los contenidos de la RAM interna se mantienen.
12.2.1.-Registro de Control de Alimentación (PCON). MSB
LSB
SMOD
-
-
-
GF1
GF0
PD
IDL
La dirección de byte de este registro es 87H. NOTA: este registro no es direccionable bit a bit. Símbolo
Significado Bit de doble velocidad de transmisión.
SMOD
Si SMOD=1, la velocidad de transmisión del puerto serie (modos 1, 2 y 3) se duplica.
-
Resevado.
-
Reservado.
-
Reservado.
GF1
Bit de flag de uso general.
GF0
Bit de flag de uso general.
PD
Bit de POWER DOWN. Si PD=1, se activa este modo.
IDL
Bit de IDLE. Si IDL=1, se activa este modo.
12.2.2.-Modo IDLE (marcha en vacío). Una instrucción que active IDL es la última que se ejecuta antes de entrar en modo IDLE. En este modo, se cierra el paso de la señal de reloj a la CPU, pero no a las funciones de interrupciones, puerto serie y T/Cs. El estado de la CPU se guarda en su totalidad: todos los registros mantienen sus datos (SP, PC, PSW, ACC, etc...). Hay dos caminos para desactivar el modo IDLE: -
La activación de cualquier interrupción habilitada borrará por hardware el bit IDL, desactivando el modo IDLE. La interrupción será atendida y siguiendo a RETI se ejecutará la instrucción siguiente a aquella que activó este modo. Los bits de flag GF0 y GF1, se pueden utilizar para indicar si una interrupción se ha producido durante funcionamiento normal o durante IDLE. Por ejemplo, una instrucción que
MCS - 51
83
activase IDLE puede también activar GF0 y/o GF1 y así, al desactivarse IDLE con una interrupción, la rutina de servicio de interrupción puede examinar estos flags. -
El otro modo para desactivar el modo IDLE es con un reset por hardware. Se precisan sólo dos ciclos máquina para realizarlo, ya que el oscilador permanece "corriendo".
12.2.3.-Modo POWER DOWN (bajo consumo). En el modo POWER DOWN, VCC se puede reducir al mínimo. Una instrucción que active PD es la última que se ejecuta antes de entrar en el modo POWER DOWN. En este modo el oscilador se "congela" parando todas las funciones y manteniendo sólo el contenido de la RAM interna de datos (el contenido de los SFR no se mantiene). La salida de este modo sólo es posible mediante reset por hardware. Con el reset se sale del modo POWER DOWN y se "descongela" el oscilador. El reset no puede producirse antes de que VCC se haya restablecido y se debe mantener el tiempo suficiente para que el oscilador arranque y se estabilice. NOTA: No debe reducirse la tensión antes de entrar en este modo, ni salir de él antes de restablecerse la misma.
MCS - 51
84
13.-INSTRUCCIONES DE LA FAMILIA MCS-51.
13.1.-FUNCIONAMIENTO DE LOS FLAGS DEL PSW. Salvo indicación específica en algunas instrucciones, los flags del PSW son afectados de la siguiente forma: CY - Acarreo. Se activa si en el resultado de una operación se produce un acarreo en el bit de mayor peso; en cualquier otro caso CY se borra. AC - Acarreo auxiliar. Se activa si en el resultado de una operación se produce un acarreo en el bit de mayor peso del nibble bajo (durante la suma), o una llevada de los bits de mayor peso a los de menor peso (durante la resta); en cualquier otro caso AC se borra. OV - Rebasamiento. Se activa si se produce un acarreo hacia el bit de mayor peso del resultado, pero no un acarreo desde el bit de mayor peso, o viceversa (overflow = acarreo desde b6 a b7 + acarreo desde b7 a CY); en cualquier otro caso se borra. OV se usa en aritmética de complemento a dos porque se activa cuando el resultado con signo no se puede representar en 8 bits. P - Paridad. Se activa si la suma módulo 2 (restar 2 sucesivamente al acumulador hasta que el resultado sea menor que 2) de los 8 bits del acumulador es "1" (paridad impar); en el caso contrario se desactiva (paridad par). Cuando se escribe en el registro PSW, el flag P permanece invariable ya que siempre refleja la paridad del acumulador.
13.2.-JUEGO DE INSTRUCCIONES. En la descripción de las instrucciones se van a emplear los siguientes símbolos: Rn:
Cualquiera de los registros R0 a R7 del banco activo.
direct: Dirección de datos interna de 8 bits. Se referirá a RAM. @Ri:
Dirección apuntada por el contenido de cualquiera de los registros de trabajo R0 o R1 del banco activo. Esta dirección tiene que ser obligatoriamente RAM interna.
#dato: Constante de 8 bits incluida en la instrucción. #dato16:
Constante de 16 bits incluida en la instrucción.
addr16: Dirección de 16 bits. Usado por LCALL y LJMP. addr11: Dirección de 11 bits. Usado por ACALL y AJMP. rel:
Byte de offset o desplazamiento con signo. Usado por SJMP y por todos los saltos condicionales.
bit:
Un bit direccionado directamente. Se localiza en la RAM interna de datos o en los registros especiales.
:
Variable byte fuente.
:
Variable byte destino.
MCS - 51
85
*ACALL addr11 func.: Llamada absoluta. desc.: ACALL llama incondicionalmente a la subrutina localizada en la dirección indicada. La instrucción incrementa el PC dos veces para obtener la dirección de la siguiente instrucción, almacena el resultado de 16 bits en la pila (primero el byte más bajo) e incrementa el SP dos veces. La dirección de destino se obtiene concatenando los 5 bits de mayor nivel del PC (después de haberlo incrementado dos veces), los bits 7 al 5 del código de operación y el segundo byte de la instrucción. Por lo tanto el destino debe estar en el mismo bloque de 2K de programa que el primer byte de la siguiente instrucción. No afecta a los flags. ejem.: 0123H ACALL subrut ;etiqueta de subrut=0456H si anteriormente SP=07H, después de ejecutar la instrucción SP=09H, en las localizaciones 08H y 09H contendrá 23H y 01H respectivamente y PC=0456H. oper.: ACALL (PC)
← (PC)+2
(SP)
← (SP)+1
((SP)) ← (PC7-PC0) (SP)
← (SP)+1
((SP)) ← (PC15-PC8) (PC10-0) ← dirección de página codi.: A10
A9
A8
1
0
0
0
1
A7
A6
A5
A4
A3
A2
A1
A0
bytes: ciclos:
2 2
*ADD A, func.: Suma desc.: ADD añade la variable byte indicada al acumulador. Deja el resultado en el acumulador. Si hay acarreo en el bit 7 ó 3, el carry y el carry auxiliar se ponen a 1. Cuando sumamos enteros sin signo, el flag de carry indica que ha habido overflow. ADD A,Rn oper.: ADD (A)
← (A)+(Rn)
0
1
codi.: 0 bytes: ciclos:
MCS - 51
0
1
r
r
r
1 1
86
ADD A,direct oper.: ADD ←(A)+(direct)
(A) codi.: 0
0
1
0
0
1
0
1
dirección directa
bytes: ciclos:
2 1
ADD A,@Ri oper.: ADD ← (A)+((Ri))
(A) codi.: 0
0
bytes: ciclos:
1
0
0
1
1
i
1 1
ADD A,#dato oper.: ADD (A)
← (A)+#dato
codi.: 0
0
1
0
0
1
0
0
dato inmediato bytes: ciclos:
2 1
*ADDC A, func.: Suma con carry. desc.: ADDC suma simultáneamente la variable byte indicada con el flag de carry y el contenido del acumulador, dejando el resultado en el acumulador. Si hay acarreo o acarreo auxiliar se posicionarán los flags correspondientes. Cuando se suman enteros sin signo, el flag de carry indica que ha habido desbordamiento (overflow).
MCS - 51
87
OV se activa si hay acarreo del bit 6 y no del bit 7 o si hay acarreo del bit 7 y no del bit 6. Cuando se suman enteros con signo, OV indica un número negativo producido por la suma de dos operandos positivos o la suma positiva de dos operandos negativos. Se permiten cuatro tipos de direccionamiento: por registro, directo, por registro indirecto o inmediato. ADDC A,Rn oper.: ADDC (A)
← (A)+(C)+(Rn)
codi.: 0
0
bytes: ciclos:
1
1
1
r
r
r
1 1
ADDC A,direct oper.: ADDC (A)
← (A)+(C)+(direct)
codi.: 0
0
1
1
0
1
0
1
dirección directa bytes: ciclos:
2 1
ADDC A,@Ri oper.: ADDC (A)
← (A)+(C)+((Ri))
codi.: 0 bytes: ciclos:
MCS - 51
0
1
1
0
1
1
i
1 1
88
ADDC A,#dato oper.: ADDC (A)
← (A)+(C)+#dato
codi.: 0
0
1
1
0
1
0
0
dato inmediato bytes: ciclos:
2 1
*ANL , func.: AND lógica de dos variables. desc.: ANL hace la operación lógica AND entre las variables indicadas, y almacena el resultado en la variable destino. No afecta a los flags. Los dos operandos permiten seis modos de direccionamiento distinto. Cuando el destino es el acumulador, se pueden usar como fuentes (source) registros, directo, registro-indirecto o direccionamiento inmediato. Cuando el destino es una dirección directa, la fuente puede ser el acumulador o un dato inmediato. NOTA: Cuando se usa esta instrucción para modificar un port de salida, el valor usado como dato del port se leerá del latch de datos de salida y no de los pines. ANL A,Rn oper.: ANL (A)
← (A)^(Rn)
codi.: 0 bytes: ciclos:
MCS - 51
1
0
1
1
r
r
r
1 1
89
ANL A,direct oper.: ANL (A)
← (A)^(direct)
codi.: 0
1
0
1
0
1
0
1
1
1
i
dirección directa bytes: ciclos:
2 1
ANL A,@Ri oper.: ANL (A)
← (A)^((Ri))
codi.: 0
1
bytes: ciclos:
0
1
0
1 1
ANL A,#dato oper.: ANL (A)
← (A)^#dato
codi.: 0
1
0
1
0
1
0
0
0
1
0
dato inmediato bytes: ciclos:
2 1
ANL direct,A oper.: ANL (direct) ← (direct)^(A) codi.: 0
1
0
1
0
dirección directa
MCS - 51
90
bytes: ciclos:
2 1
ANL direct,#dato oper.: ANL (direct) ← (direct)^#dato codi.: 0
1
0
1
0
0
1
1
dirección directa
dato inmediato bytes: ciclos:
3 2
*ANL C, func.: AND lógica de variables bit. desc.: Se borrará el flag de carry si el valor booleano del bit fuente es cero, en caso contrario el bit seguirá como está. El slash ("/") precediendo al operando en el código de operación en lenguaje ensamblador, indica que ha de usarse como valor fuente el complemento lógico del bit direccionado, pero el valor fuente no se modifica. No se afectan otros flags. Se permite únicamente el direccionamiento de un bit directo como operando fuente. ANL C,bit oper.: ANL (C)
← (C)^(bit)
codi.: 1
0
0
0
0
0
1
0
dirección del bit bytes: ciclos:
MCS - 51
2 2
91
ANL C,/bit oper.: ANL (C)
← (C)^()
codi.: 1
0
1
1
0
0
0
0
dirección del bit bytes: ciclos:
2 2
*AJMP addr11 func.: salto absoluto. desc.: AJMP transfiere la ejecución del programa a la dirección indicada, que se forma en el tiempo de ejecución concatenando los 5 bits de mayor nivel del PC (después de haberlo incrementado dos veces), los bits 7 al 5 del código de operación y el segundo byte de la instrucción. Por lo tanto el destino debe estar en el mismo bloque de 2K de programa que el primer byte de la siguiente instrucción. oper.: AJMP (PC)
← (PC)+2
(PC10-0) ← dirección de página codi.: A10
A9
A8
0
0
0
0
1
A7
A6
A5
A4
A3
A2
A1
A0
bytes: ciclos:
2 2
*CJNE ,,rel func.: Comparar y saltar si no es igual. desc.: CJNE compara las magnitudes de los dos primeros operandos y salta si sus dos valores no son iguales. El salto de destino se calcula sumando el desplazamiento relativo señalado en el siguiente byte de instrucción, con el contenido del PC después de incrementarlo para comenzar en la siguiente instrucción. El flag de carry se pone a 1 si el valor sin signo de es más pequeño que el valor de . No se afecta ninguno de los operandos. Los dos primeros operandos permiten cuatro tipos de direccionamiento: El acumulador puede compararse con un byte direccionado directamente o con un dato inmediato, y MCS - 51
92
alguna localización indirecta de RAM o registro de trabajo puede compararse con una constante inmediata. CJNE A,direct,rel oper.: (PC) ← (PC)+3 if (A) (direct) then (PC) ← (PC)+offset relativo if (A) < (direct) then (C) ← 1 else (C) ← 0 codi.: 1
0
1
1
0
1
0
1
1
0
0
dirección directa
dirección relativa (rel) bytes: ciclos:
3 2
CJNE A,#dato,rel (PC) ← (PC)+3 if (A) dato
oper.:
then (PC) ← (PC)+offset relativo if (A) < dato then (C) ← 1 else (C) ← 0 codi.: 1
0
1
1
0
dato inmediato
dirección relativa (rel) bytes: ciclos:
MCS - 51
3 2
93
CJNE Rn,#dato,rel oper.: (PC) ← (PC)+3 if (Rn) dato then (PC) ← (PC)+offset relativo if (Rn) < dato then (C) ← 1 else (C) ← 0 codi.: 1
0
1
1
1
r
r
r
1
1
i
dato inmediato
dirección relativa (rel) bytes: ciclos:
3 2
CJNE @Ri,#dato,rel (PC) ← (PC)+3 if ((Ri)) dato
oper.:
then (PC) ← (PC)+offset relativo if ((Ri)) < dato then (C) ← 1 else (C) ← 0 codi.: 1
0
1
1
0
dato inmediato
dirección relativa (rel)
bytes: ciclos:
MCS - 51
3 2
94
*CLR func.: desc.: oper.:
A Borrar el acumulador Se borra el acumulador (todos los bits a cero). No se afectan los flags. CLR (A)
← 0
codi.: 1
1
bytes: ciclos:
1
1
0
1
0
0
1 1
*CLR func.: Borrar bit desc.: Se borra el bit indicado (se pone a cero). No se afectan otros flags. CLR puede operar con el bit de carry o con un bit direccionado directamente. CLR C oper.: CLR (C)
← 0
codi.: 1
1
bytes: ciclos:
0
0
0
0
1
1
1 1
CLR bit oper.: CLR (bit)
← 0
codi.: 1
1
0
0
0
0
1
0
dirección del bit bytes: 2 ciclos: 1
MCS - 51
95
*CPL A func.: Complemento del acumulador. desc.: Cada bit del acumulador se complementa lógicamente (complemento a 1). No se afectan los flags. oper.: CPL A (A)
← (A)
codi.: 1
1
bytes: ciclos:
1
1
0
1
0
0
1 1
*CPL func.: Complemento de un bit. desc.: Complemento de la variable bit especificada. No se afectan flags. CPL puede operar con el carry o con bits direccionados directamente. NOTA: Cuando se utiliza esta instrucción para modificar un pin de salida, el valor usado como dato original se leerá del latch de salida, no del pin. CPL C oper.: CPL (C)
← (C )
codi.: 1
0
bytes: ciclos:
1
1
0
0
1
1
1 1
CPL bit oper.: CPL (bit)
← ( bit )
codi.: 1
0
1
1
0
0
1
0
dirección del bit bytes: ciclos:
MCS - 51
2 1
96
*DA A func.: Ajuste decimal del acumulador para la suma. desc.: DA A ajusta el valor de 8 bits en el acumulador resultante de la anterior suma de dos variables (ambas en formato BCD empaquetado), resultando dos dígitos de 4 bits. Pueden usarse para la suma las instrucciones ADD o ADDC. Si los bits 3 al 0 del acumulador son mayores de 9 (xxxx1010 - xxxx1111), o el flag AC es 1, se añade al acumulador 6 unidades generando el dígito apropiado BCD en el nibble de menor orden. La suma interna pondrá a 1 el flag de carry si el carry-out del campo de 4 bits de menor orden se propaga a los bits de mayor orden, pero podría no estar borrado en caso contrario. Si el flag de carry es ahora 1, o si los bits de mayor orden exceden de 9 (1010xxxx 1111xxxx), estos bits se incrementan en 6, produciendo el dígito BCD apropiado en el nibble de mayor orden. De nuevo pondrá a 1 el flag de carry si el carry-out del campo de 4 bits de mayor orden se produce, pero podría no estar borrado en caso contrario. El flag de carry indica de esta forma si la suma de dos variables originales BCD es mayor de 100, permitiendo precisión múltiple en suma decimal. NO se afecta OV. Todo esto ocurre durante un ciclo de instrucción. Esencialmente, esta instrucción ejecuta la conversión decimal sumando 00H, 06H, 60H ó 66H en el acumulador dependiendo del acumulador inicial y las condiciones de PSW. NOTA: DA A no puede convertir simplemente un número hexadecimal del acumulador a notación BCD, y no es aplicable a la resta. oper.: DA El contenido del acumulador está en BCD if [[(A3-0) > 9] or [(C)=1]] then (A3-0) ← (A3-0)+6 and if [[(A7-4) > 9] or [(AC)=1]] then (A7-4) ← (A7-4)+6 codi.: 1 bytes: ciclos:
1
0
1
0
1
0
0
1 1
*DEC func.: Decremento. desc.: La variable indicada se decrementa en 1. Un valor original 00H se reducirá a FFH. No se afectan los flags. Se permiten 4 modos de direccionamiento: acumulador, registro, directo o indirecto por registro.
MCS - 51
97
NOTA: Cuando se usa esta instrucción para modificar un port de salida, el valor usado como dato del port original se leerá del latch de datos de salida y no de los pines de entrada. DEC A oper.: DEC (A)
← (A)-1
codi.: 0
0
bytes: ciclos:
0
1
0
1
0
0
1 1
DEC Rn oper.: DEC (Rn)
← (Rn)-1
codi.: 0
0
bytes: ciclos:
0
1
1
r
r
r
0
1
0
1
0
1
1 1
DEC direct oper.: DEC (direct) ← (direct)-1 codi.: 0
0
dirección directa
bytes: ciclos:
2 1
DEC @Ri oper.: DEC ((Ri)) ← ((Ri))-1 codi.: 0 bytes: ciclos: MCS - 51
0
0
1
0
1
1
i
1 1 98
*DIV AB func.: División desc.: DIV AB divide el entero sin signo de 8 bits del acumulador entre el entero sin signo de 8 bits del registro B. El acumulador recibe la parte entera del cociente y el registro B recibe el resto. Se borrarán los flags carry y OV. EXCEPCION: Si B contenía originalmente 00H, los valores retornados en el acumulador y el registro B serán indeterminados y el flag de overflow OV se pondrá a 1. El flag de carry se borra en este caso. oper.: DIV (A15-8) (B7-0) ← (A)/(B) codi.: 1
0
bytes: ciclos:
0
0
0
1
0
0
1 4
*DJNZ , func.: Decrementa y salta si no es cero. desc.: DJNZ decrementa la localización de memoria indicada en el primer operando y salta a la dirección indicada en el segundo operando si el valor resultante no es cero. Un valor original de 00H se reducirá a FFH. No se afectan los flags. El salto de destino se obtendrá sumando el valor de desplazamiento relativo señalado en el siguiente byte de instrucción al PC, después de incrementarlo para que señale al primer byte de la siguiente instrucción. La localización de memoria decrementada puede ser un registro o un byte direccionado directamente. NOTA: Cuando se usa esta instrucción para modificar un puerto de salida, el valor usado como dato del puerto original se leerá del latch de datos de salida y no de los pines del puerto. DJNZ Rn,rel oper.: DJNZ (PC)
← (PC)+2
(Rn) ← (Rn)-1 if (Rn) 0 then (PC) ← (PC)+rel codi.: 1
1
0
1
1
r
r
r
dirección relativa
MCS - 51
99
bytes: ciclos:
2 2
DJNZ direct,rel oper.: DJNZ (PC)
← (PC)+3
(direct) ← (direct)-1 if (direct) 0 then (PC) ← (PC)+rel codi.: 1
1
0
1
0
1
0
1
dirección directa
dirección relativa bytes: ciclos:
3 2
*INC func.: Incremento desc.: La variable indicada se incrementa en 1. Un valor original FFH pasa a 00H. No se afectan los flags. Se permiten cuatro modos de direccionamiento: acumulador, registro, directo o indirecto por registro. NOTA: Cuando se usa esta instrucción para modificar un puerto de salida, el valor usado como dato del puerto se leerá del latch de datos de salida y no de los pines del puerto. INC A oper.: INC (A)
← (A)+1
codi.: 0 bytes: ciclos:
MCS - 51
0
0
0
0
1
0
0
1 1
100
INC Rn oper.: INC (Rn)
← (Rn)+1
codi.: 0
0
bytes: ciclos:
0
0
1
r
r
r
1 1
INC direct oper.: INC (direct) ← (direct)+1 codi.: 0
0
0
0
0
1
0
1
dirección directa bytes: ciclos:
2 1
INC @Ri oper.: INC ((Ri)) ← ((Ri))+1 codi.: 0
0
bytes: ciclos:
0
0
0
1
1
i
1 1
*INC DPTR func.: Incremento del puntero de datos "data pointer". desc.: Incremento del puntero de datos de 16 bits en 1. Un incremento de un módulo de 16 bits se hace incrementando el byte de menor orden DPL y, cuando ocurre overflow, éste se usa para incrementar la parte allta DPH. No se afectan a los flags. oper.: INC (DPTR) ← (DPTR)+1 codi.: 1
MCS - 51
0
1
0
0
0
1
1
101
bytes: ciclos:
1 2
*JB bit,rel func.: Salto si el bit está activado desc.: Si el bit indicado es 1, salta a la dirección indicada. En cualquier otro caso seguirá en la siguiente instrucción. El salto de destino se calcula sumando el desplazamiento relativo señalado en el siguiente byte de la instrucción, con el contenido del PC después de incrementarlo para que apunte a la siguiente instrucción. El bit testeado no se modifica. No afecta a los flags. oper.: JB (PC) ← (PC)+3 if (bit) = 1 then (PC) ← (PC)+rel codi.: 0
0
1
0
0
0
0
0
dirección de bit
dirección relativa bytes: ciclos:
3 2
*JBC bit,rel func.: Salto si el bit está activado y borrar el bit. desc.: Si el bit indicado es 1, salta a la dirección indicada y borra el bit, en caso contrario seguirá en la siguiente instrucción. El salto de destino se calcula sumando el desplazamiento relativo señalado en el siguiente byte de la instrucción, con el contenido del PC después de incrementarlo para que apunte a la siguiente instrucción. El bit testeado no se modifica. No afecta a los flags. oper.: JBC (PC) ← (PC)+3 if (bit) = 1 then
(bit) ← 0 (PC) ← (PC)+rel
MCS - 51
102
codi.: 0
0
0
1
0
0
0
0
dirección de bit
dirección relativa bytes: ciclos:
3 2
*JC rel func.: Salto si carry está activado desc.: Si el bit de carry es 1, salta a la dirección indicada, en cualquier otro caso seguirá en la siguiente instrucción. El salto de destino se calcula sumando el desplazamiento relativo señalado en el siguiente byte de la instrucción, con el contenido del PC después de incrementarlo para que apunte a la siguiente instrucción. No afecta a los flags. oper.: JC (PC) ← (PC)+2 if (C) = 1 then
(PC) ← (PC)+rel
codi.: 0
1
0
0
0
0
0
0
dirección relativa bytes: ciclos:
2 2
*JMP @A + DPTR func.: Salto indirecto desc.: Suma el contenido del acumulador (sin signo) con los 16 bits del puntero de datos DPTR y carga el resultado al PC. Esta será la dirección de la siguiente instrucción. Se tiene en cuenta el overflow de los bits de menor peso del DPL para sumárselos al DPH. No se alteran ni el acumulador ni el puntero de datos. oper.: JMP (PC) ← (A)+(DPTR)
MCS - 51
103
codi.: 0
1
bytes: ciclos:
1
1
0
0
1
1
1 2
*JNB bit,rel func.: Salto si el bit no es 1 desc.: Si el bit indicado es cero, salta a la dirección indicada, en otro caso sigue con la siguiente instrucción. El salto de destino se calcula sumando el desplazamiento relativo señalado en el siguiente byte de la instrucción, con el contenido del PC después de incrementarlo para que apunte a la siguiente instrucción. El bit testeado no se modifica. No afecta a los flags. oper.: JNB (PC) ← (PC)+3 if (bit) = 0 then (PC) ← (PC)+rel codi.: 0
0
1
1
0
0
0
0
dirección de bit
dirección relativa bytes: ciclos:
3 2
*JNC rel func.: Salto si carry no está activado desc.: Si el bit de carry es cero, salta a la dirección indicada, en cualquier otro caso seguirá en la siguiente instrucción. El salto de destino se calcula sumando el desplazamiento relativo señalado en el siguiente byte de la instrucción, con el contenido del PC después de incrementarlo para que apunte a la siguiente instrucción. El carry no se modifica. No afecta a los flags. oper.: JNC (PC) ← (PC)+2 if (C) = 0 then
(PC) ← (PC)+rel
codi.: 0
MCS - 51
1
0
1
0
0
0
0
104
dirección relativa bytes: ciclos:
2 2
*JNZ rel func.: Salto si el acumulador no es 0 desc.: Si algún bit del acumulador es 1, salta a la dirección indicada, en otro caso sigue con la siguiente instrucción. El salto de destino se calcula sumando el desplazamiento relativo señalado en el siguiente byte de la instrucción, con el contenido del PC después de incrementarlo para que apunte a la siguiente instrucción. El acumulador no se modifica. No afecta a los flags. oper.: JNZ (PC) ← (PC)+2 if (A) 0 then
(PC) ← (PC)+rel
codi.: 0
1
1
1
0
0
0
0
dirección relativa bytes: ciclos:
2 2
*JZ rel func.: Salto si el acumulador es 0 desc.: Si todos los bits del acumulador son 0, salta a la dirección indicada, en otro caso sigue con la siguiente instrucción. El salto de destino se calcula sumando el desplazamiento relativo señalado en el siguiente byte de la instrucción, con el contenido del PC después de incrementarlo para que apunte a la siguiente instrucción. El acumulador no se modifica. No afecta a los flags. oper.: JZ (PC) ← (PC)+2 if (A) = 0 then
(PC) ← (PC)+rel
codi.: 0
1
1
0
0
0
0
0
dirección relativa
MCS - 51
105
bytes: ciclos:
2 2
*LCALL addr16 func.: Llamada larga desc.: LCALL llama a una subrrutina localizada en la dirección indicada. La instrucción añade 3 al PC para apuntar a la siguiente instrucción y almacena el resultado de 16 bits en la pila (primero el byte bajo). El PC se carga con la dirección indicada. No se afectan los flags. oper.: LCALL (PC) ← (PC)+3 (SP) ← (SP)+1 ((SP)) ← (PC7-0) (SP) ← (SP)+1 ((SP)) ← (PC15-8) (PC) ← addr15-0 codi.: 0
0
0
1
0
0
1
0
A15
A14
A13
A12
A11
A10
A9
A8
A7
A6
A5
A4
A3
A2
A1
A0
bytes: ciclos:
3 2
*LJMP addr16 func.: Salto largo desc.: LJMP causa un salto incondicional a la dirección indicada. oper.: LJMP (PC) ← addr15-0 codi.: 0
0
0
0
0
0
1
0
A15
A14
A13
A12
A11
A10
A9
A8
A7
A6
A5
A4
A3
A2
A1
A0
bytes:
MCS - 51
3
106
ciclos:
2
*MOV , func.: Mover una variable byte desc.: La variable byte indicada en el segundo operando se copia en la dirección especificada en el primer operando. La fuente no se afecta. No se afectan los flags. MOV A,Rn oper.: MOV (A) ← (Rn) codi.: 1
1
bytes: ciclos:
1
0
1
r
r
r
1 1
MOV A,direct oper.: MOV (A) ← (direct) codi.: 1
1
1
0
0
1
0
1
1
1
i
dirección directa bytes: ciclos:
2 1 *no es válida la instrucción MOV A,ACC
MOV A,@Ri oper.: MOV (A) ← ((Ri)) codi.: 1 bytes: ciclos:
MCS - 51
1
1
0
0
1 1
107
MOV A,#dato oper.: MOV (A) ← #dato codi.: 0
1
1
1
0
1
0
0
dato inmediato bytes: ciclos:
2 1
MOV Rn,A oper.: MOV (Rn) ← (A) codi.: 1
1
bytes: ciclos:
1
1
1
r
r
r
1
0
1
r
r
r
r
r
r
1 1
MOV Rn,direct oper.: MOV (Rn) ← (direct) codi.: 1
0
dirección directa bytes: ciclos:
2 2
MOV Rn,#dato oper.: MOV (Rn) ← #dato codi.: 0
1
1
1
1
dato inmediato
MCS - 51
108
bytes: ciclos:
2 1
MOV direct,A oper.: MOV (direct) ← (A) codi.: 1
1
1
1
0
1
0
1
r
r
r
1
0
1
dirección directa bytes: ciclos:
2 1
MOV direct,Rn oper.: MOV (direct) ← (Rn) codi.: 1
0
0
0
1
dirección directa bytes: ciclos:
2 2
MOV direct1,direct2 oper.: MOV (direct1) ← (direct2) codi.: 1
0
0
0
0
dirección directa 2 (fuente)
dirección directa 1 (destino)
MCS - 51
109
bytes: ciclos:
3 2
MOV direct,@Ri oper.: MOV (direct) ← ((Ri)) codi.: 1
0
0
0
0
1
1
i
1
0
1
1
1
i
dirección directa bytes: ciclos:
2 2
MOV direct,#dato oper.: MOV (direct) ← #dato codi.: 0
1
1
1
0
dirección directa
dato inmediato bytes: ciclos:
3 2
MOV @Ri,A oper.: MOV ((Ri)) ← (A) codi.: 1
1
bytes: ciclos:
1
1
0
1 1
MOV @Ri,direct oper.: MOV ((Ri)) ← (direct) codi.: MCS - 51
110
1
0
1
0
0
1
1
i
1
1
i
dirección directa bytes: ciclos:
2 2
MOV @Ri,#dato oper.: MOV ((Ri)) ← #dato codi.: 0
1
1
1
0
dato inmediato bytes: ciclos:
2 1
*MOV , func.: Mover un dato bit desc.: La variable booleana indicada en el segundo operando se copia en el primero. Uno de estos operandos debe ser el flag de carry y el otro puede ser algún bit direccionable directamente. No se afectan otros registros.
MOV C,bit oper.: MOV (C) ← (bit) codi.: 1
0
1
0
0
0
1
0
dirección de bit bytes: ciclos:
MCS - 51
2 1
111
MOV bit,C oper.: MOV (bit) ← (C) codi.: 1
0
0
1
0
0
1
0
dirección de bit bytes: ciclos:
2 2
*MOV DPTR,#dato16 func.: Cargar el puntero de datos con una constante de 16 bits desc.: Se carga el puntero con la constante especificada en los otros bytes. El segundo byte se carga en DPH y el tercero en DPL. No se afecta a los flags. Esta es la única instrucción que mueve a la vez 16 bits. oper.: MOV (DPTR) ← #dato15-0 codi.: 1
0
0
1
0
0
0
0
dato inmediato 15-8
dato inmediato 7-0 bytes: ciclos:
3 2
*MOVC A,@A+ func.: Mover byte de código desc.: La instrucción MOVC carga el acumulador con un byte de código o una constante de la memoria de programa. La dirección del byte a cargar es la suma del valor original sin signo del contenido del acumulador mas el contenido de un registro base de 16 bits. El registro base puede ser el puntero de datos DPTR o el PC. En el segundo caso el PC se incrementa para direccionar la siguiente instrucción antes de ser sumado al acumulador. No se afectan los flags. MOVC A,@A + DPTR oper.: MOVC (A) ← ((A)+(DPTR)) MCS - 51
112
codi.: 1
0
bytes: ciclos:
0
1
0
0
1
1
0
0
0
0
1
1
1 2
MOVC A,@A + PC oper.: MOVC (PC) ← (PC)+1 (A) ← ((A)+(PC)) codi.: 1
0
bytes: ciclos:
1 2
*MOVX , func.: Mover externo. desc.: La instrucción MOVX transfiere datos entre el acumulador y un byte de la memoria externa de datos, por eso el sufijo X a MOV. Hay dos tipos de instrucciones, diferenciandose en si se genera la dirección indirecta a la RAM externa de 8 ó 16 bits. En el primer tipo, el contenido de R0 o R1 del banco de registros activo genera una dirección de 8 bits que se multiplexa con los datos a través del P0. Son suficientes 8 bits para decodificar expansiones I/O externas y arrays de RAM relativamente pequeños. Para arrays un poco más grandes, se puede usar algunos pines de puertos como salida de los bits de dirección de mayor orden. Estos pines deben controlarse con una instrucción de salida precedente a la instrucción MOVX. En el segundo tipo de la instrucción MOVX, el puntero de datos genera la dirección de 16 bits. Las salidas de P2 serán la parte alta del bus de direcciones de 16 bits (DPH), mientras que P0 multiplexa los bits de menor orden del bus de direcciones (DPL) con los datos. La función especial del registro P2 retiene los contenidos previos mientras los buffers de salida del P2 emiten el contenido de DPH. Esta forma es la más rápida y eficiente cuando se accede a arrays de datos muy grandes (de hasta 64 KBytes), mientras no se necesiten instrucciones adicionales para seleccionar los puertos de salida. Es posible en algunas situaciones mezclar los dos tipos MOVX. Un array RAM muy grande en el que sus líneas de dirección se controlan por P2, puede direccionarse a través del puntero de datos DPTR, o con un código para sacar la dirección de mayor orden a través de P2 permite a la instrucción MOVX usar R0 o R1. MOVX A,@Ri oper.: MOVX (A) ← ((Ri)) codi.: MCS - 51
113
1
1
bytes: ciclos:
1
0
0
1
1
i
1
0
0
0
0
0
1
1
0
0
1
i
1
1
0
0
0
0
1 2
MOVX A,@DPTR oper.: MOVX (A) ← ((DPTR)) codi.: 1
1
bytes: ciclos:
1 2
MOVX @Ri,A oper.: MOVX ((Ri)) ← (A) codi.: 1
1
bytes: ciclos:
1 2
MOVX @DPTR,A oper.: MOVX ((DPTR)) ← (A) codi.: 1
1
bytes: ciclos:
1 2
*MUL AB func.: Multiplicación. desc.: MUL AB multiplica el entero sin signo de 8 bits del acumulador con el registro B. El byte de menor orden del producto queda en el acumulador y el byte de mayor orden en el registro B. Si el producto es mayor que 255 (FFH) el flag de overflow se activa. El flag de carry siempre se pone a cero. oper.: MUL (A7-0) (B15-8) ← (A)*(B)
MCS - 51
114
codi.: 1
0
1
0
0
1
0
0
bytes: 1 ciclos: 4 *NOP func.: No operación. desc.: La ejecución continúa en la siguiente instrucción. A excepción del PC no se afectan ni registros ni flags. oper.: NOP (PC) ← (PC)+1 codi.: 0
0
0
0
0
0
0
0
bytes: 1 ciclos: 1 *ORL , func.: OR lógica de dos variables. desc.: ORL hace la operación lógica OR entre las variables indicadas, almacenando el resultado en la variable de destino. No se afectan flags. Los dos operandos permiten seis modos de direccionamiento distinto. Cuando el destino es el acumulador, se puede usar como fuente variables direccionadas por registro, directo, registro-indirecto o direccionamiento inmediato. Cuando el destino es una dirección directa, la fuente puede ser el acumulador o un registro inmediato. NOTA: Cuando se usa esta instrucción para modificar un port de salida, el valor usado como dato del port original se leerá del latch de datos de salida y no de los pines de entrada.
ORL A,Rn oper.: ORL (A) ← (A) or (Rn) codi.: 0
1
0
0
1
r
r
r
bytes: 1 ciclos: 1 ORL A,direct
MCS - 51
115
oper.:
ORL (A) ← (A) or (direct)
codi.: 0
1
0
0
0
1
0
1
dirección directa bytes: 2 ciclos: 1 ORL A,@Ri oper.: ORL (A) ← (A) or ((Ri)) codi.: 0
1
0
0
0
1
1
i
0
0
0
1
0
0
bytes: 1 ciclos: 1 ORL A,#dato oper.: ORL (A) ← (A) or #dato codi.: 0
1
dato inmediato bytes: 2 ciclos: 1
ORL direct,A oper.: ORL (direct) ← (A) or (direct) codi.: 0
1
0
0
0
0
1
0
dirección directa bytes: 2 MCS - 51
116
ciclos: 1 ORL direct,#dato oper.: ORL (direct) ← (direct) or #dato codi.: 0
1
0
0
0
0
1
1
dirección directa
dato inmediato bytes: 2 ciclos: 2 *ORL C, func.: Or lógica de variable bit. desc.: Activa el flag de carry si el valor booleano del bit fuente es uno, en caso contrario el bit seguirá como está. El slash ("/") precediendo al operando en el código de operación en el lenguaje ensamblador, indica que ha de usarse como valor fuente el complemento lógico del bit direccionado, pero el valor fuente no se modifica. No se afectan otros flags. Se permite únicamente el direccionamiento de un bit directo como operando fuente. ORL C,bit oper.: ORL (C) ← (C) or (bit) codi.: 0
1
1
1
0
0
1
0
0
0
0
dirección del bit bytes: 2 ciclos: 2 ORL C,/bit oper.: ORL (C) ← (C) or () codi.: 1
MCS - 51
0
1
0
0
117
dirección del bit bytes: 2 ciclos: 2 *POP direct func.: Sacar de la pila. desc.: Se lee el contenido de la localización de RAM interna direccionada por el SP y el contenido del SP se decrementa en una unidad. El valor leído se transfiere al byte indicado direccionado directamente. No se afectan a los flags. oper.: POP (direct) ← ((SP)) (SP) ← (SP)-1 codi.: 1
1
0
1
0
0
0
0
dirección directa bytes: 2 ciclos: 2 *PUSH direct func.: Meter en la pila. desc.: El SP se incrementa en una unidad. El contenido de la variable indicada se copia en la RAM interna apuntada por el SP. No se afectan flags. oper.: PUSH (SP) ← (SP)+1 ((SP)) ← (direct) codi.: 1
1
0
0
0
0
0
0
dirección directa bytes: 2 ciclos: 2 *RET func.: Retorno de una subrutina.
MCS - 51
118
desc.:
RET saca de la pila los bytes alto y bajo del PC sucesivamente, decrementando el SP en dos. La ejecución del programa continúa en la dirección resultante (generalmente en la instrucción siguiente a la llamada ACALL o LCALL. No se afectan los flags. RET
oper.:
(PC15-8) ← ((SP)) (SP) ← (SP)-1 (PC7-0) ← ((SP)) (SP) ← (SP)-1 codi.: 0
0
1
0
0
0
1
0
bytes: 1 ciclos: 2 *RETI func.: Retorno de una interrupción. desc.: RETI saca de la pila los bytes alto y bajo del PC sucesivamente y restaura la interrupción lógica para aceptar interrupciones adicionales del mismo nivel de prioridad del que se estaba procesando. El SP se decrementa en dos. El PSW no es restaurado automáticamente al estado de pre-interrupción. La ejecución del programa continúa en la dirección resultante, generalmente en la instrucción siguiente al punto en que se aceptó la interrupción. Si una interrupción de igual o inferior nivel había sido solicitada cuando se estaba ejecutando la instrucción RETI, se ejecutará una instrucción antes de atender a la interrupción. oper.: RETI (PC15-8) ← ((SP)) (SP) ← (SP)-1 (PC7-0) ← ((SP)) (SP) ← (SP)-1 codi.: 0
0
1
1
0
0
1
0
bytes: 1 ciclos: 2 *RL A func.: Rotar el acumulador a la izquierda. desc.: Se rotan los 8 bits del acumulador un bit a la izquierda. El bit 7 se traslada al bit 0. No se afectan los flags. oper.: RL (An+1) ← (An) n=0..6 (A0) ← (A7)
MCS - 51
119
codi.: 0
0
1
0
0
0
1
1
bytes: 1 ciclos: 1 *RLC A func.: Rotar el acumulador a la izquierda a través del flag de carry. desc.: Se rotan los 8 bits del acumulador y el flag de carry juntos un bit a la izquierda. El bit 7 se traslada al flag de carry y éste se traslada al bit 0. No se afectan otros flags. oper.: RLC (An+1) ← (An) n=0..6 (A0) ← (C) (C) ← (A7) codi.: 0
0
1
1
0
0
1
1
bytes: 1 ciclos: 1 *RR A func.: Rotar el acumulador a la derecha. desc.: Se rotan los 8 bits del acumulador un bit a la derecha. El bit 0 se traslada al bit 7. No se afectan los flags. oper.: RR (An) ← (An+1) n=0..6 (A7) ← (A0) codi.: 0
0
0
0
0
0
1
1
bytes: 1 ciclos: 1 *RRC A func.: Rotar el acumulador a la derecha a través del flag de carry. desc.: Se rotan los 8 bits del acumulador y el flag de carry juntos un bit a la derecha. El bit 0 se traslada al flag de carry y éste se traslada al bit 7. No se afectan otros flags.
oper.:
RRC (An) ← (An+1) n=0..6 (A7) ← (C)
MCS - 51
120
(C) ← (A0) codi.: 0
0
0
1
0
0
1
1
bytes: 1 ciclos: 1 *SETB func.: Poner a uno un bit. desc.: SETB pone a uno el bit indicado. Puede operar con el flag de carry o con cualquier bit direccionable directamente. No se afectan otros flags. SETB C oper.: SETB (C) ← 1 codi.: 1 bytes: ciclos: SETB oper.:
1
0
1
0
0
1
1
0
1
0
0
1
0
1 1 bit SETB (bit) ← 1
codi.: 1
1
dirección de bit bytes: 2 ciclos: 1
*SJMP rel func.: Salto corto. desc.: El control del programa salta incondicionalmente a la dirección indicada. La dirección de destino se calcula sumando el desplazamiento relativo señalado en el siguiente byte de instrucción con el contenido del PC después de incrementarlo para que señale a la siguiente instrucción. oper.: SJMP (PC) ← (PC)+2 MCS - 51
121
(PC) ← (PC)+rel codi.: 1
0
0
0
0
0
0
0
dirección relativa bytes: 2 ciclos: 2 *SUBB A, func.: Resta con acarreo. desc.: SUBB resta la variable byte indicada y el flag de carry al acumulador, dejando el resultado en el acumulador. SBB pone a uno el flag de carry (borrow o arrastre) si se necesita acarreo para el bit 7, borra CY en cualquier otro caso. (Si CY estaba activado antes de ejecutar la instrucción, indica que se necesitaba acarreo para el paso previo en la resta de múltiple precisión, de esta forma el carry se resta al acumulador junto con el operando fuente). AC se pone a 1 si se necesita acarreo en el bit 3. OV se pone a 1 si se necesita acarreo en el bit 6 pero no en el 7 o si se necesita acarreo en el bit 7 pero no en el 6. Cuando restamos enteros con signo, OV indica un número negativo producido cuando se ha restado de un valor positivo un valor negativo. OV también indica que se ha producido un número positivo como resultado de una resta de un número negativo menos uno positivo. SUBB A,Rn oper.: SUBB (A) ← (A)-(C)-(Rn) codi.: 1
0
0
1
1
r
r
r
1
0
1
0
1
bytes: 1 ciclos: 1 SUBB A,direct oper.: SUBB (A) ← (A)-(C)-(direct) codi.: 1
0
0
dirección directa
MCS - 51
122
bytes: 2 ciclos: 1 SUBB A,@Ri oper.: SUBB (A) ← (A)-(C)-((Ri)) codi.: 1
0
0
1
0
1
1
i
0
1
0
1
0
0
bytes: 1 ciclos: 1 SUBB A,#dato oper.: SUBB (A) ← (A)-(C)-#dato codi.: 1
0
dato inmediato bytes: 2 ciclos: 1 *SWAP A func.: Intercambio de nibbles en el acumulador. desc.: Intercambia los nibbles (bloques de 4 bits) de orden bajo y alto del acumulador. La operación también puede hacerse como una rotación de acumulador de 4 bits. oper.: SWAP (A3-0) ←→ (A7-4) codi.: 1
1
0
0
0
1
0
0
bytes: 1 ciclos: 1 *XCH A, func.: Intercambiar el acumulador con una variable byte.
MCS - 51
123
desc.:
Carga el acumulador con el contenido de la variable indicada, al mismo tiempo se escribe el valor original del acumulador en la variable indicada. Se puede usar como operandos direccionamientos por registro, directo o registro indirecto.
XCH A,Rn oper.: (A) ←→ (Rn) codi.: 1
1
0
0
1
r
r
r
0
0
0
1
0
1
1
1
i
bytes: 1 ciclos: 1 XCH A,direct oper.: (A) ←→ (direct) codi.: 1
1
dirección directa bytes: 2 ciclos: 1 XCH A,@Ri oper.: (A) ←→ ((Ri)) codi.: 1
1
0
0
0
bytes: 1 ciclos: 1 *XCHD A,@Ri func.: Cambio de dígito. desc.: Cambia el nibble de menor orden del acumulador (bits 3-0, generalmente representando un número hexadecimal o un dígito BCD) con el nibble bajo del byte que está direccionando indirectamente en la RAM interna mediante el registro indicado. El nibble de mayor orden de los dos registros no queda modificado. No se afecta a los flags. oper.: XCHD (A3-0) ←→ ((Ri)3-0) codi.: 1
MCS - 51
1
0
1
0
1
1
i
124
bytes: 1 ciclos: 1 *XRL , func.: OR Exclusiva lógica de dos variables. desc.: Hace la operación lógica "O exclusiva" entre las variables indicadas, dejando el resultado en el byte destino. No se afectan los flags. Los dos operandos permiten seis modos de direccionamiento distinto. Cuando el destino es el acumulador, se puede usar como fuente registros, directo, registro-indirecto o direccionamiento inmediato. Cuando el destino es una dirección directa, el operando fuente es el acumulador o un dato inmediato. NOTA: Cuando se usa esta instrucción para modificar un port de salida, el valor usado como dato del port original se leerá del latch de datos de salida y no de los pines de entrada. XRL A,Rn oper.: XRL (A) ← (A) ⊕ (Rn) codi.: 0
1
1
0
1
r
r
r
0
0
1
0
1
1
1
i
bytes: 1 ciclos: 1 XRL A,direct oper.: XRL (A) ← (A) ⊕ (direct) codi.: 0
1
1
dirección directa bytes: 2 ciclos: 1 XRL A,@Ri oper.: XRL (A) ← (A) ⊕ ((Ri)) codi.: 0
1
1
0
0
bytes: 1
MCS - 51
125
ciclos: 1 XRL A,#dato oper.: XRL (A) ← (A) ⊕ #dato codi.: 0
1
1
0
0
1
0
0
0
1
0
0
1
1
dato inmediato bytes: 2 ciclos: 1 XRL direct,A oper.: XRL (direct) ← (A) ⊕ (direct) codi.: 0
1
1
0
0
dirección directa bytes: 2 ciclos: 1 XRL direct,#dato oper.: XRL (direct) ← (direct) ⊕ #dato codi.: 0
1
1
0
0
dirección directa
dato inmediato bytes: 3 ciclos: 2
MCS - 51
126
13.3 RESUMEN DE INSTRUCCIONES QUE AFECTAN A LOS FLAGS. INSTRUCCION
MCS - 51
FLAG C
OV
AC
ADD
X
X
X
ADDC
X
X
X
SUBB
X
X
X
MUL
0
X
DIV
0
X
DA
X
RRC
X
RLC
X
SETB C
1
CLR C
0
CPL C
X
ANL C,bit
X
ANL C,/bit
X
ORL C,bit
X
ORL C,/bit
X
MOV C,bit
X
CJNE
X
127
14.-MICROCONTROLADOR DS-5000.
El microcontrolador DS_5000 es un chip compatible pin a pin con los microcontroladores de la familia MCS-51. Esencialmente es un 8051 con una memoria RAM no volátil (no se borra al quitar la alimentación) de 8 ó 32 KBytes dentro del mismo chip, además de la memoria RAM interna de 256 bytes (ésta sí se borra al quitar la alimentación). La memoria RAM no volátil puede ser dividida en dos espacios de memoria: de programa y de datos, mediante un registro especial accesible al usuario. Una vez hecha la división de la memoria, no se podrá escribir en el espacio de memoria de programa, pero sí leer; en la memoria de datos se podrá tanto leer como escribir. La vida media garantizada de esta memoria RAM no volátil es de diez años cuando el chip se encuentra sin alimentar, siendo indefinida si está alimentado contínuamente. Esto es debido a que el chip tiene una batería de litio interna que alimenta esta memoria que no entra en funcionamiento hasta que la tensión de alimentación no desciende por debajo de un cierto nivel de tensión. Además posee un pequeño programa monitor para cargar programas desde un ordenador vía serie. Este modo de funcionamiento (PROGRAM LOAD) se provoca manteniendo el RESET de la pastilla a nivel alto y la patilla PSEN a nivel bajo. Debido a estas características, el DS-5000 posee unos registros especiales que no tiene el 8051, además de variar algún bit en los que ya tenía el 8051. Vamos a describir sólamente estas diferencias, ya que el resto del funcionamiento es similar al del 8051 descrito anteriormente.
14.1.-REGISTROS PROPIOS DEL DS-5000. Los registros PCON e IP varían con relación a sus homólogos en el 8051, mientras que los registros de Control de Memoria (MCON) y Tiempo de acceso (TA) son específicos de este microcontrolador.
MCS - 51
128
14.1.1.-Registro PCON. Este registro controla la inicialización del microcontrolador al aplicarle la alimentación. MSB
LSB
SMOD
POR
PFW
WTR
EPFW
EWT
STOP
IDL
La dirección de byte de este registro es 87H. NOTA: Este registro no es direccionable bit a bit. Símbol. SMOD
POR
PFW
WTR
EPFW
EWT
STOP
IDL
MCS - 51
Significado "Double Baud Rate" Cuando se pone a "1", si se utiliza la comunicación serie en sus modos 1, 2 ó 3, se dobla la velocidad. Se pone a 0 con cualquier tipo de reset. Puede ser leído o escrito en cualquier momento. "Power On Reset" Indica que el reseteado fue inicializado durante una secuencia de Power On poniéndose a 0. Se mantiene a 0 hasta que se ponga a 1 por software. Se puede leer en cualquier momento. Unicamente puede escribirse mediante el registro de control de acceso (TA) "Power Fail Warning" Indica que se ha dado una caída de potencial de alimentación poniéndose a 1. Se pone a 0 después de una operación de lectura de PCON y después de un Reset On Power. Puede ser leído en cualquier momento, pero no puede ser escrito nunca. "Watchdog Timer Reset" Está a 1 mientras vigila que el reset utilizado sea coerente con el proceso de arranque de la pastilla, poniéndose a 0 después de que se lea PCON. También se pone a 0 por un Reset On Power, no cambiando por otros tipos de reset. Puede ser leído en cualquier momento, pero no puede ser escrito nunca. "Enable Power Fail Interrupt" Este bit se utiliza para habilitar o deshabilitar la interrupción Power Fail (1=habilitada). Vector de interrupción 002BH. Se pone a 0 con cualquier tipo de reset. Puede ser leído o escrito en cualquier momento. "Enable Watchdog Timer" Usado para habilitar o deshabilitar el Reset Watchdog Timer (1=habilitado). Se pone a 0 con un Reset On Power, manteniéndose a 1 con otros tipos de Reset. Puede leerse en cualquier momento. Unicamente puede escribirse mediante el registro de control de acceso (TA) "Stop" Este bit se utiliza para la parada de un programa si se pone a 1. Se pone a 0 por un Reset de hardware. Puede leerse en cualquier momento. Unicamente puede escribirse mediante el registro de control de acceso (TA) "Idle" Cuando se pone a 1, la ejecución de un programa entra en estado de ALTO y será reasumido cuando se ponga un 0, siguiendo una interrupción o un Reset de hardware. Se pone a 0 con cualquier tipo de reset. Puede ser leído o escrito en cualquier momento.
129
14.1.2.-Registro IP. Este registro controla la prioridad de las interrupciones, lo único que cambia es el bit 7. MSB RWT
LSB -
-
PS
PT1
PX1
PT0
PX0
La dirección del bit es 0B8H. Todos los bit, excepto el bit 7 pueden ser leídos o escritos en cualquier momento, siendo puestos a 0 por cualquier reset de hardware. Símb.
Direcc.
Significado "Reset Watch Timer" Cuando este bit se pone a 1 la cuenta del Watchdog Timer se reseteará, reinicializándose a continuación y poniéndose el bit a 0 de forma automática. Escribir un 0 en este bit no tiene ningún efecto. Ante cualquier tipo de reset se pone a 0.
RWT
0BFH
-
0BEH
Reservado.
-
0BDH
Reservado.
PS
0BCH
Prioridad de la interrupción de la UART.
PT1
0BBH
Prioridad de la interrupción del T/C 1.
PX1
0BAH
Prioridad de la interrupción externa 1.
PT0
0B9H
Prioridad de la interrupción del T/C 0.
PX0
OB8H
Prioridad de la interrupción externa 0.
MCS - 51
No se puede leer en ningún caso pero se puede escribir mediante el Registro de Control de Acceso (TA).
130
14.1.3.-Registro MCON. Este registro es el que controla la organización de la memoria para posterior uso y aplicación del microcontrolador. MSB
LSB
PA3
PA2
PA1
PA0
RA32/8
ECE2
PAA
-
La dirección del registro es 0C6H -Bits PA3 a PA0 "Partition Address". El conjunto de estos cuatro bits se utiliza para seleccionar la dirección de comienzo de la memoria de datos en RAM. El espacio para programa se sitúa debajo de la dirección de la partición. La selección resultante es: PA3
PA2
PA1
PA0
0
0
0
0
0
0
0
0
0
0
Dirección
PA3
PA2
PA1
PA0
Dirección
0000H
1
0
0
0
4000H
1
0800H
1
0
0
1
4800H
1
0
1000H
1
0
1
0
5000H
0
1
1
1800H
1
0
1
1
5800H
0
1
0
0
2000H
1
1
0
0
6000H
0
1
0
1
2800H
1
1
0
1
6800H
0
1
1
0
3000H
1
1
1
0
7000H*
0
1
1
1
3800H
1
1
1
1
8000H*
En las combinaciones marcadas con "*", tienen lugar un incremento de 4KBytes en lugar de los 2 KBytes. Durante la inicialización mediante un Reset On Power, todos los bits se ponen a 1. También se ponen todos a 1 cuando se realiza algún intento de poner alguno de ellos a 0, para cambiar la partición de memoria, y el Bit de Seguridad (Security Lock) esté a 1, por ser una condición ilegal. Se ponen todos a 1 también, al modificar el valor del bit de seguridad de su valor normal (1) a 0. Se tiene acceso al bit de seguridad mediante un comando del pequeño monitor que la DALLAS lleva incorporado (Modo Program Load). Pueden ser leídos en cualquier momento. Pueden ser escritos siempre que el bit PAA del mismo registro esté a 1.
MCS - 51
131
Bit RA32/8 "Range Address". Este bit fuerza a que se memorice el máximo número de direcciones utilizables. Cuando está a 1 el rango de direcciones es de 7FFFH, 32K. Si está a 0 el rango de direcciones es de 1FFFH, 8K. Durante la inicialización, mediante un Reset On Power se pone a 1 y también se pone a 1 si el bit de seguridad pasa de su estado previo 1 al estado 0. El valor no se modifica por cualquier otro tipo de reset. Puede ser leído en cualquier momento. No puede ser modificado mediante la aplicación de software. Se puede escribir sólamente durante la operación en Modo PROGRAM LOAD. Bit ECE2 "Enable Chip Enable 2". Este bit habilita o deshabillita la señal CE2, para un espacio adicional en la memoria de DATOS RAM. En las versiones DS-5000-8 y DS-5000-32 debe estar a 0. Durante la inicialización por un Reset On Power se pone a 0. Puede ser escrito o leído en cualquier momento.
Bit PAA "Partition Address Access". El estado de este bit protege la programación que se ha realizado de PA3-PA0. Si este bit está a 0 la programación no puede ser modificada. El acceso a este bit se realiza mediante el Registro de Control de Acceso (TA). Se pone a 0 ante un Reset On Power. Puede ser leído en cualquier momento.
14.1.4.-Registro TA. Este registro es el de Control de Acceso, citado con anterioridad, mediante él se pueden modificar algunos bits de otros registros. MSB
LSB
-
-
-
-
-
-
-
-
La dirección del registro es 0C7H. Todos los bits se utilizan para invocar el procedimiento requerido por el Tiempo de Acceso para escribir cualquier bit protegido. Se activa por tres operaciones de escritura secuenciales, de la forma: MOV
0C7H,0AAH
;Escribir en registro TA
MOV
0C7H,055H
;Escribir en registro TA
ORL
IP,#80H
;Reset de Watchdog Timer
El inicializado es con el valor 55H, siguiendo a cualquier tipo de reset. No se puede leer nunca desde la aplicación software. MCS - 51
132
14.2.-MODO PROGRAM LOAD. Cuando se mantiene la entrada de reset a nivel alto y PSEN a nivel bajo, el DS-5000 entra en el modo Program Load, pudiendo comunicarse con un ordenador a través de la línea serie con una velocidad de 9600 baudios, 8 bits de datos, 1 bit de stop y sin paridad. En este modo de funcionamiento corre un pequeño programa monitor que sirve para cargar programas, cambiar algunos datos de registros especiales, etc... Estando en este modo de funcionamiento, al detectar un carácter válido, se inicializa el programa cargador enviando el mensaje: DS5000 LOADER VERSION X.X COPYRIGHT(C)1988,1990 DALLAS SEMICONDUCTOR >
El signo ">" indica que está esperando un comando, estos comandos son: C
Devuelve el checksum de la memoria RAM del chip.
D
Vuelca un archivo en formato Intel Hex.
F
Llena un bloque de memoria con una constante.
K
Carga la clave de encriptación de 40 bits.
L
Carga un archivo en formato Intel Hex.
R
Leer registro MCON.
T
Haz traza (eco) mientras se cargan datos en formato Intel Hex.
U
Borra el bit de seguridad (Security Lock).
V
Verifica la memoria RAM del chip mientras entra código Intel Hex.
W
Escribe en el registro MCON.
Z
Pon a 1 el bit de seguridad.
En los comandos que llevan argumentos (direcciones), éstos se escriben detrás de los comandos, poniendo primero la dirección de comienzo y después la dirección del final; si son datos, se escriben detrás del comando antes de las direcciones. Tanto las direcciones como los datos se escriben en hexadecimal.
MCS - 51
133