LODI T6 MAR 2013 v6

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 63

APUNTES DE LÓGICA DIGITAL TEMA_6/Pág.

MICROCONTROLADOR 80C537 (FAMILIA 8051) (MICROINSTRUCTOR TM-311 DE PROMAX)

1. INTRODUCCIÓN

Los avances de la tecnología MOS aplicados en la fabricación de circuitos integrados


de alta densidad permitieron, antes del comienzo de la década de los 80, implementar
en un solo chip todos los bloques funcionales que componen un microordenador. A dicho
circuito integrado se denomina microcontrolador monochip.
Un microcontrolador consta de los siguientes elementos básicos:

* CPU
* Memoria dedicada a contener programas (ROM).
* Memoria para soporte de datos temporales (RAM).
* Módulos de E/S (puertos paralelo y serie, temporizadores, etc).

Con carácter general, los microcontroladores se usan en los sistemas de control


que reúnan las siguientes propiedades:

1. El precio es un factor crítico.


2. La capacidad de memoria necesaria es pequeña.
3. El procesamiento se realiza en tiempo real.
4. Se opera en decimal y se manipulan bits específicos.
5. No se gobiernan muchos periféricos.
6. Los sistemas son dedicados y siempre ejecutan el mismo programa de aplicación.

Una regla básica sobre la aplicación de los microcontroladores aconseja su uso en


las áreas de gran consumo. La exigencia de grabar en fábrica la zona de memoria ROM
interna con el programa de aplicación, hacen soportable su coste, solamente cuando
el número de chips a fabricar es elevado, a partir de 10.000 unidades. Existen
versiones en las que la zona de memoria no volátil es tipo PROM y EPROM, en cuyo caso
es el usuario quien puede grabar el programa y pueden aplicarse en series cortas y
prototipos. Una de las áreas de más interés para el empleo de los microcontroladores
es la de los electrodomésticos y el relacionado con la industria de automoción.

Aplicaciones usuales de microcontroladores Aplicaciones específicas de microcontroladores de


organizados alrededor de una CPU de 8 bits: 16 y 32 bits:

- Instrumentos de medida - Aplicaciones militares


- Sistemas de alarma - Robótica
- Electromedicina - Visión artificial y tratamiento de imágenes
- Equipos de audio y video - Telefonía móvil
- Paneles de control - Control de procesos industriales
- Comunicaciones móviles - Controladores de Redes de Área Local
- Máquinas de coser y bordar
- Juegos electrónicos y tragaperras
- Impresoras, modems, etc.

La evolución del mercado de los microcontroladores de 8 bits ha experimentado un


incremento considerable desde 1989, año en el que se vendieron 575 millones de
unidades, al año 1992 con 950 millones. Del total de ventas, la tercera parte se
destinó a las aplicaciones relacionadas con los computadores y sus periféricos,
alrededor de una cuarta parte del gran consumo (TV, electrodomésticos, juegos, etc.),
las comunicaciones y las aplicaciones industriales absorben un 16% cada una y el resto
lo absorbió la industria de automoción.
El mercado de los microcontroladores de 16 bits ascendió desde 1988, con 23 millones
de unidades, a los 40 millones en 1992. La ofimática y las comunicaciones fueron las
áreas de mayor consumo.
Por último las ventas de microcontroladores de 32 bits, que en 1988 rozaron la cifra
de 1.500.000 unidades, se multiplicaron por 10 en 1992. El campo de mayor aplicación
fue el procesamiento de imágenes, seguido de las comunicaciones, las aplicaciones
militares, las industriales y el control de dispositivos de almacenamiento masivo
de datos.
Todas las familias de microcontroladores de 8 bits están caracterizadas por: CPU
de 8 bits, consumo inferior a 1 W (por lo general), frecuencia de trabajo de 10 a
20 Mhz, capacidad de E/S entre 24 y 32 líneas y disponibilidad de memoria RAM y ROM.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 2

2. DESCRIPCIÓN DEL HARDWARE DEL TM-311

El TM-311 implementa la CPU SAB 80C537 de SIEMENS que es 100% compatible con los
microprocesadores de la familia 51 de INTEL. Las características principales del SAB
80C517/80C537 son:

- Es un microcontrolador de 8 bits
- 8 Kbytes de memoria ROM para programa en el propio chip (solo el 80C517)
- Versión sin ROM también disponible (80C537)
- Totalmente compatible con el 80C515/80C535
- 256 bytes de RAM en el propio chip.
- Alcanza hasta 1 millón de instrucciones por segundo, trabajando con una frecuencia
de reloj de 12 Mhz. (Ciclo de instrucción de 1 µseg).
- Esta realizado en tecnología ACMOS (bajo consumo de corriente).
- 64 de las 111 instrucciones son ejecutadas en un ciclo de instrucción.
- Programa externo y memoria para datos ampliable hasta 64 Kbytes cada una.
- Conversor A/D de 8 bits.
- 12 entradas multiplexadas
- Tensiones de referencia programables.
- Inicio de conversión externa/interna.
- Dos temporizadores/contadores de 16 bits (compatibles con el 8051).
- Una potente unidad de comparación/captura (CCU) basada en un
temporizador/contador de 16 bits de alta velocidad para funciones de comparación
rápidas.
- Un registro de recarga/comparación/captura de 16 bits.
- Cuatro registros de comparación/captura de 16 bits, uno de los cuales sirve para
comparar hasta nueve canales (comparación concurrente).
- Ocho registros de comparación rápida de 16 bits.
- Unidad aritmética para división, multiplicación, desplazamiento (shift) y
operaciones normalizadas.
- Ocho punteros de datos para direccionamiento indirecto del programa y memoria de
datos externa.
- Prestaciones extendidas de watchdog.
- Temporizador de watchdog programable de 16 bits.
- Oscilador de watchdog.
- Encapsulado PLCC-84
- Totalmente compatible con el 8051.
- Nueve puertos.
- Siete puertos bidireccionales de 8 bits.
- Un puerto de entrada de 8 bits y otro de 4 bits para señales analógicas y
digitales.
- Dos interfaces serie full-duplex con sus propios generadores de baud rate.
- Cuatro niveles de prioridad para el sistema de interrupciones, 14 vectores de
interrupción.
- Tres modos reducción de consumo.
- Modo slow-down
- Modo idle.
- Modo power-down
- Ha sido diseñado tanto para operar con bytes como con bits.
- Las instrucciones pueden ocupar de uno a tres bytes.
- Las instrucciones para ejecutarse pueden requerir de uno, dos o cuatro ciclos de
reloj. Cada ciclo de reloj requiere doce ciclos del oscilador.
- El juego de instrucciones permite transferencias de datos, operaciones lógicas y
aritméticas.
- Utiliza cinco modos de direccionamiento: direccionamiento inmediato,
direccionamiento directo, direccionamiento por registro, direccionamiento
indirecto por registro, direccionamiento indirecto indexado por registro (y
direccionamiento de bit).
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 3

2.1 ORGANIZACIÓN DE LA MEMORIA

El SAB 80C537 puede direccionar 64 Kbytes externos de memoria de programa y 64


Kbytes externos de memoria de datos (arquitectura Harvard). En los equipos TM-311
esta memoria se reduce a 32 KBytes de memoria ROM y 32 KBytes de memoria RAM.
La memoria ROM está configurada como memoria de programa en la que se ubica el
sistema operativo del equipo.
Una parte de la memoria RAM está configurada para que sirva indistintamente como
memoria de programa y memoria de datos (estructura Newman).
Dispone de una memoria RAM interna que se divide en 256 bytes de memoria de datos
y 128 bytes que actúan como área de registros de función especial (SFR).
En el equipo TM-311 la memoria de programa (EPROM) está estructurada de la
siguiente forma:

DIRECCIÓN CONTENIDO

$0000 - $00FF contienen los vectores de interrupción (256 bytes)

$0100 - $7FFF contienen el Programa Monitor (queda mucha memoria libre)

La memoria externa RAM para código y datos ocupa las direcciones $8000 a $EFFF
(28 KBytes). Y la memoria RAM solo para datos las direcciones $0000 a $7FFF
(32 KBytes).

2.1.1 MEMORIA DE DATOS INTERNA

La memoria de datos interna está dividida en tres bloques físicamente separados:


los 128 bytes inferiores, los 128 bytes superiores y los 128 bytes de los registros
de función especial (SFR).
Dado que los 128 bytes superiores y los 128 bytes de SFR comparten las mismas
direcciones ($80 a $FF) debe accederse a ellos mediante distintos modos de
direccionamiento.
Los 128 bytes inferiores de la memoria RAM interna se subdividen en tres
grupos:

- Un área de registros de propósito general localizados en las direcciones $00 a


$1F (4 bancos de registros R0 a R7).
- 16 bytes, desde la dirección $20 a $2F que contienen 128 bits directamente
direccionables. Estos bits pueden ser accedidos de dos formas diferentes que son
válidas para el lenguaje ensamblador. Una de ellas consiste en acceder a ellos
mediante su dirección de bit $00 a $7F. La otra es accediendo a su dirección de
byte $20 a $2F. Dentro del byte se puede acceder al bit deseado, de modo que los
bits 20.0 a 20.7 son los bits $00 a $07.
- Posiciones $30 a $7F que pueden ser utilizados libremente como área de
almacenamiento.

La PILA, puede ser ubicada en cualquier posición de la memoria interna, incluida


las partes reservadas como registros de propósito general y bits directamente
direccionables. La profundidad de la pila está limitada solamente por la memoria RAM
interna accesible indirectamente.

Modos de direccionamiento de la memoria RAM interna:

- Primeros 128 bytes: acceso directo e indirecto.


- Últimos 128 bytes: acceso indirecto.
- Área de registros de función especial (SFR): acceso directo.

2.2 REGISTROS DE PROPOSITO GENERAL

Tal y como se he mencionado antes, las 32 primeras direcciones de la memoria


RAM contienen los registros de propósito general. Estos están compuestos por 4 bancos
de 8 registros cada uno. Solo uno de estos bancos está activo al mismo tiempo.
Para ello el registro de estado PSW dispone de dos bits (PSW.3 y PSW.4) que
permiten seleccionar el banco activo. Este método permite un cambio de contexto
rápido, lo cual es útil a la entrada de subrutinas o en la gestión de interrupciones.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 4

Al arrancar el sistema, el banco seleccionado por defecto es el cero (0),


direcciones $00 a $07. Los registros seleccionados son accesibles directamente como
tales, esto es, como los registros de propósito general R0 a R7.
Los registros R0 y R1 pueden ser utilizados en algunas instrucciones como
punteros de memoria interna o externa (acceso a los 128 bytes superiores, por ejemplo
MOV A, @R0).
Si se va a utilizar más de un banco de registros será necesario colocar la pila
en otra posición (la pila se inicializa por defecto en la dirección de RAM interna
$07, con lo que el primer dato lo guarda en la posición $08).

2.2.1 REGISTROS DE FUNCIONES ESPECIALES (SFR)

Esta área de la memoria interna tiene dos funciones muy importantes. En primer
lugar, todos los registros a excepción del contador de programa y los cuatro bancos
de registros de propósito general residen aquí. Los registros de la CPU son los
aritméticos A, B, PSW y los punteros SP, DPH y DPL.
En segundo lugar, en esta área de memoria están todos los registros de los
periféricos contenidos en la CPU, como es el puerto serie, los puertos paralelos,
los temporizadores, el conversor analógico-digital, el watchdog,.... Esto quiere
decir que el acceso a estos periféricos se realiza exclusivamente a través de estos
registros.
Estos registros de función especial están localizados en las direcciones $80
a $FF de la memoria RAM interna. Los 81 registros de función especial del 80537 residen
en esta área.
La parte de este área no utilizada por los registros, puede ser utilizada por
el usuario que puede definirse sus propios registros, pero deberá tener en cuenta
que con ello se arriesga a que sus aplicaciones no funcionen en otras CPU de la familia
51, ya que puede ocurrir que un registro no utilizado en el 80537 esté ocupado por
un periférico en otra CPU.
Dieciséis SFRs, que están posicionados en direcciones divisibles por ocho, son
direccionables bit a bit, lo que permite direccionar directamente 128 bits dentro
del área SFR. Aparte de las 128 posiciones direccionables por bit que están fuera
de la zona de SFR.
Debido a que la zona de SFR está mapeada en memoria, el acceso a los registros
de funciones especiales es tan sencillo como a la RAM interna, y pueden ser procesados
con la mayoría de instrucciones. Además, si no se utilizan las funciones especiales,
los registros no utilizados pueden ser usados como registros para guardar datos del
usuario. De todas formas, todos los SFRs sólo pueden ser accedidos por
direccionamiento directo.
Los registros de funciones especiales se listan a continuación en unas tablas
que están organizadas en grupos funcionales que se refieren a bloques funcionales
del 80537. Los nombres de los bloques y los símbolos están listados por orden
alfabético. Los registros de funciones especiales que son direccionables por bit
están marcados con un punto en la cuarta columna (DIR= direcciones). Los registros
de funciones especiales con bits pertenecientes a más de un bloque funcional están
marcados con un asterisco en el nombre del símbolo.
CONTENIDO
DESPUÉS DE
BLOQUE SÍMBOLO NOMBRE DIR RESET

CPU ACC (A) Acumulador 0E0H A 00H


B Registro B 0F0H A 00H
DPH Puntero de dato, byte alto 83H 00H
DPL Puntero de dato, byte bajo 82H 00H
DPSEL Registro selección puntero de dato 92H XXXX.X000B
PSW Registro palabra de estado de programa 0D0H A 00H
SP Puntero de pila (stack pointer) 81H 07H

CONVERSOR ADCON0 Registro 0 de control del conversor A/D 0D8H A 00H


A/D ADCON1 Registro 0 de control del conversor A/D 0DCH XXXX.0000B
ADDAT Registro de datos del conversor A/D 0D9H 00H
DAPR Registro programable del conversor A/D 0DAH 00H

SISTEMA DE IEN0 Registro 0 de habilitación de interrupciones 0A8H A 00H


INTERRUPCIONES CTCON * Reg. de control del comparador del temporizador 0E1H 0XXX.0000B
IEN1 Registro 1 de habilitación de interrupciones 0B8H A 00H
IEN2 Registro 2 de habilitación de interrupciones 9AH XXXX.00X0B
IP0 Registro 0 de prioridad de interrupciones 0A9H 00H
IP1 Registro 1 de prioridad de interrupciones 0B9H XX00.0000B
IRCON Registro de control de petición de interrupción 0C0H A 00H
TCON * Registro de control del temporizador 88H A 00H
T2CON * Registro de control del temporizador 2 0C8H A 00H
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 5

CONTENIDO
DESPUÉS DE
BLOQUE SÍMBOLO NOMBRE DIR RESET

UNIDAD DE CCEN Registro activación comparación/captura 0C1H 00H


COMPARACIÓN/ CC4EN Registro activación comparación/captura 4 0C9H X000.0000B
CAPTURA CCH1 Registro 1 comparación/captura, byte alto 0C3H 00H
CCU CCH2 Registro 2 comparación/captura, byte alto 0C5H 00H
CCH3 Registro 3 comparación/captura, byte alto 0C7H 00H
CCH4 Registro 4 comparación/captura, byte alto 0CFH 00H
CCL1 Registro 1 comparación/captura, byte bajo 0C2H 00H
CCL2 Registro 2 comparación/captura, byte bajo 0C4H 00H
CCL3 Registro 3 comparación/captura, byte bajo 0C6H 00H
CCL4 Registro 4 comparación/captura, byte bajo 0CEH 00H
CMEN Registro de activación de comparación 0F6H 00H
CMH0 Registro 0 de comparación, byte alto 0D3H 00H
CMH1 Registro 1 de comparación, byte alto 0D5H 00H
CMH2 Registro 2 de comparación, byte alto 0D7H 00H
CMH3 Registro 3 de comparación, byte alto 0E3H 00H
CMH4 Registro 4 de comparación, byte alto 0E5H 00H
CMH5 Registro 5 de comparación, byte alto 0E7H 00H
CMH6 Registro 6 de comparación, byte alto 0F3H 00H
CMH7 Registro 7 de comparación, byte alto 0F5H 00H
CML0 Registro 0 de comparación, byte bajo 0D2H 00H
CML1 Registro 1 de comparación, byte bajo 0D4H 00H
CML2 Registro 2 de comparación, byte bajo 0D6H 00H
CML3 Registro 3 de comparación, byte bajo 0E2H 00H
CML4 Registro 4 de comparación, byte bajo 0E4H 00H
CML5 Registro 5 de comparación, byte bajo 0E6H 00H
CML6 Registro 6 de comparación, byte bajo 0F2H 00H
CML7 Registro 7 de comparación, byte bajo 0F4H 00H
CMSEL Selección de entrada de comparación 0F7H 00H
CRCH Reg. de recarga del comp./capturador, byte alto 0CBH 00H
CRCL Reg. de recarga del comp./capturador, byte bajo 0CAH 00H
CTCON Registro de control del temporizador comparador 0E1H 0XXX.0000B
CTRELH Reg. de recarga del comp. temporizador, byte alto 0DFH 00H
CTRELL Reg. de recarga del comp. temporizador, byte bajo 0DEH 00H
TH2 Temporizador 2, byte alto 0CDH 00H
TL2 Temporizador 2, byte bajo 0CCH 00H
T2CON Registro de control del temporizador 2 0C8H A 00H

WATCHDOG IEN0 * Registro 0 de habilitación de interrupción 0A8H A 00H


IEN1 * Registro 1 de habilitación de interrupción 0B8H A 00H
IP0 * Registro 0 de prioridad de interrupción 0A9H 00H
IP1 * Registro 1 de prioridad de interrupción 0B9H XX00.0000B
WDTREL Reg. de recarga del temporizador de watchdog 86H 00H

UNIDAD DE ARCON Registro de control aritmético 0EFH 0XXX.XXXXB


MUL/DIV MD0 Registro 0 de multiplicación/división 0E9H XXH
MD1 Registro 1 de multiplicación/división 0EAH XXH
MD2 Registro 2 de multiplicación/división 0EBH XXH
MD3 Registro 3 de multiplicación/división 0ECH XXH
MD4 Registro 4 de multiplicación/división 0EDH XXH
MD5 Registro 5 de multiplicación/división 0EEH XXH

PORTS (PUERTOS) P0 Puerto 0 80H A FFH


P1 Puerto 1 90H A FFH
P2 Puerto 2 0A0H A FFH
P3 Puerto 3 0B0H A FFH
P4 Puerto 4 0E8H A FFH
P5 Puerto 5 FFH
0F8H A
P6 Puerto 6 FFH
0FAH
P7 Puerto 7, entrada analógica/digital XXH
0DBH
P8 Puerto 8, entrada analógica/digital, 4 bits XXH
0DDH

POWER PCON Registro de control de consumo 87H 00H

CANALES SERIE ADCON0 * Registro de control del conversor A/D 0D8H A 00H
PCON * Registro de control de consumo 87H 00H
S0BUF Registro buffer del canal serie 0 99H XXH
S0CON Registro de control del canal serie 0 98H A 00H
S0RELL Canal serie 0, recarga del registro, byte bajo 0AAH 0D9H
S0RELH Canal serie 0, recarga del registro, byte alto 0BAH XXXX.XX11B
S1BUF Registro buffer del canal serie 1 9CH XXH
S1CON Registro de control del canal serie 1 9BH 0X00.0000B
S1REL Registro de recarga del canal serie 1 9DH 00H
S1RELH Canal serie 1, recarga del registro, byte alto 0BBH XXXX.XX11B

TIMER 0/ TCON Registro de control del temporizador 88H A 00H


TIMER 1 TH0 Temporizador 0, byte alto 8CH 00H
TH1 Temporizador 1, byte alto 8DH 00H
TL0 Temporizador 0, byte bajo 8AH 00H
TL1 Temporizador 1, byte bajo 8BH 00H
TMOD Registro de modo del temporizador 89H 00H
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 6

REGISTRO DE PALABRA DE ESTADO DEL PROGRAMA (PSW)

PSW es la abreviatura de AProgram Status Word@ (palabra de estado del programa).


Este registro contiene los indicadores de estado (flags), que pueden ser leídos o
modificados por el usuario. Su dirección directa es D0H y sus bits se pueden
direccionar individualmente.

0D7H 0D6H 0D5H 0D4H 0D3H 0D2H 0D1H 0D0H


CY AC F0 RS1 RS0 OV F1 P

CY: Indicador de acarreo (designado también por la letra C)


AC: Indicador de acarreo auxiliar que indica un acarreo del bit 3 sobre el bit 4 (se
utiliza para las operaciones en BCD).
F0: Indicador sin función, disponible para el usuario.
RS1 Y RS0: Bits de control para la selección del banco de registros (R0 a R7).
00 Banco 0 seleccionado
01 Banco 1 seleccionado
10 Banco 2 seleccionado
11 Banco 3 seleccionado
OV: Indicador de desbordamiento (overflow).
F1: Indicador para propósito general del usuario.
P: Indicador de paridad. Puesto a uno o a cero por hardware en cada ciclo de
instrucción para indicar el número de bits a uno en el acumulador, por ejemplo paridad
par.

REGISTRO A (ACUMULADOR)

Este registro forma parte de la unidad aritmético lógica del microcontrolador,


por lo que cuando se quiere hacer una operación aritmético o lógica con dos bytes
uno de ellos tiene que estar siempre en el acumulador, quedando al final el resultado
de la operación en este registro acumulador.

REGISTRO B

El registro B se usa durante la multiplicación y la división y sirve tanto como


origen y destino. Para otras instrucciones puede ser tratado como un registro libre
para el usuario con direccionamiento directo (0F0H).

REGISTRO SP - PUNTERO DE PILA (STACK)

El registro SP es un puntero de pila de 8 bits. Esta característica teóricamente


limita el tamaño de la pila a 256 bytes. En la práctica, la pila tendrá menos de 256
bytes porque debe estar forzosamente en la RAM interna. SP se incrementa antes de
poner un dato en la pila. Después de la inicialización del microcontrolador, el
puntero de pila tiene el valor 07H, lo que coloca la pila justo por encima del banco
de registros cero (0). Naturalmente, este valor pude ser modificado por el usuario
y la pila puede residir en cualquier dirección de la RAM interna.

PUNTERO DE DATOS (DPTR). REGISTRO DE SELECCIÓN DE PUNTERO DE DATOS

Como una ampliación al funcionamiento de los microcontroladores 8051 estándar,


el 80C537 contiene ocho registros de 16 bits que pueden ser usados como punteros de
datos. Para seguir la compatibilidad con la arquitectura del 8051, el conjunto de
instrucciones usa sólo uno de estos punteros de datos cada vez. La selección del
puntero de datos actual se realiza con el registro de función especial DPSEL
(dirección 92H).

PUERTOS DEL 0 AL 8

Los registros del P0 al P8 son los latches de los SFR para los puertos 0 al
8, respectivamente. Los SFR de los puertos 0 al 5 son direccionables por bit. Los
puertos del 0 al 6 son puertos de 8 bits de entrada/salida que pueden ser utilizadas
como puertos de propósito general y pueden dar funciones de salida dedicadas a los
periféricos del propio chip del 80C537.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 7

EL puerto 7 (8 bits) y el puerto 8 (4 bits) son puertos de entrada de propósito


general y no tienen latch interno. Esto significa que estos puertos se utilizan como
12 entradas multiplexadas para el conversor A/D pero también se pueden utilizar como
entradas digitales. P7/P8 son sus SFR asociados cuando sus valores digitales son
leídos por la CPU. Ambos puertos solo pueden ser leídos.

3. REGLAS Y SINTAXIS DEL FICHERO FUENTE

Como norma general cada línea se compone de una etiqueta, un mnemónico, unos
argumentos y un comentario, por ejemplo:

etiqueta: MOV A,B ;carga el registro A con B

Sintaxis:

- Las etiquetas deben estar siempre a la izquierda del texto, y pueden terminarse
con dos puntos <:>.

Cuando se utiliza una etiqueta como argumento de una instrucción no lleva nunca
los dos puntos. Ejemplo:

inicio:
mov R0,#$27 ;carga el registro R0 con un 27
bucle:
djnz R0,bucle ;decrementa y salta a bucle
;hasta que R0 sea igual a cero

- Los mnemónicos deben estar separados de la izquierda por lo menos un espacio,


aunque normalmente se suelen tabular, con el fin de que el listado sea más
legible.
- Los argumentos deben proseguir al mnemónico forzosamente, y estarán separados
de este al menos por un espacio.

Los argumentos, para algunas instrucciones, pueden ir acompañados de los


siguientes símbolos:

<#> El número que le sigue es un dato que puede estar expresado en decimal o
en hexadecimal. Ejemplo:

MOV A, #03 ;carga el acumulador con el número 3, DATO EN DECIMAL


MOV A, #$03 ;carga el acumulador con el número 3, DATO EN HEX.
MOV A, #03H ;carga el acumulador con el número 3, DATO EN HEX.

En estos ejemplos, los símbolos <$> y <H> indican que el dato esta
expresado en hexadecimal.
Cuando el segundo argumento no va acompañado del símbolo <#> significa que
el dato hace referencia a una dirección de memoria. Ejemplo:

MOV A,03 ;carga el acumulador con el dato contenido en la


;posición de memoria número 3 (dirección 3)

<@> El argumento que le sigue hace referencia a una dirección de una posición
de memoria. Se utiliza en los modos de direccionamiento indirecto por
registro y direccionamiento indirecto indexado por registro. Ejemplo:

MOV A,@R0 ;el contenido de la posición de


;memoria apuntada por el dato contenido
;en el registro R0 se transfiere
;al acumulador

</> El argumento que le sigue (que es un bit determinado) se invierte


(complementa). Ejemplo:

MOV C,/P1.3 ;transfiere al carry auxiliar (CY)


;el estado del bit 3 del puerto 1 invertido
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 8

- Todos los valores numéricos deben comenzar por un dígito numérico, por tanto la
expresión AA6H@ no es correcta y sí lo es A0A6H@; de esta manera no se puede
confundir con una Etiqueta.
- Los argumentos entre sí estarán separados por comas, pudiendo haber también
espacios entre ellos.
- Finalmente, después de los argumentos va el comentario (opcional), que consiste
en un texto cualquiera que no está sujeto a ninguna regla. Si la línea no dispone
de mnemónico con argumentos el comentario debe estar precedido por un punto y coma
<;>.
- Si se desea pueden dejarse líneas en blanco.

SE RECOMIENDA:

- Utilizar siempre el punto y coma <;> antes de los comentarios.


- Por claridad, alinear los comentarios.
- No incluir instrucción (mnemónico) en las líneas con etiqueta.

4. DIRECTIVAS DEL ENSAMBLADOR (FICHERO FUENTE)

Las directivas son comandos que interpreta el ensamblador, pero que no traduce.
Son instrucciones propias de un ensamblador que facilitan la edición de programas.
Estas instrucciones son independientes de la CPU con la que se está trabajando.
Adicionalmente a los mnemónicos, en cualquier parte del programa pueden incluirse
directivas del ensamblador. Las directivas del ensamblador TV51ASM son:

AUSES@, AEQU@, AORG@, ADB@, AEND@ y A;@


<ORG>

Esta directiva sirve para indicar la dirección de comienzo del código objeto que
debe generar el ensamblador. Para ello se le puede indicar un valor numérico.
Cada listado con código debe contener una y sola una directiva tipo AORG@, la cual
debe estar situada antes de la primera línea con código ejecutable. Ejemplos:

org $8000 ;indica que el código debe comenzar en


;la dirección $8000 (primera posición de la RAM)

<END>

Esta directiva indica fin de listado, de forma que todo lo que haya escrito después
de esta directiva será ignorado. Todos los listados a ensamblar deben de terminar
siempre con una directiva AEND@, de lo contrario se producirá un error al ensamblar.

<DB>

Esta directiva define un número determinado de bytes con un contenido. Para ello
después de la directiva deben colocarse una lista de valores. Estos pueden ser números
decimales, hexadecimales, caracteres y cadenas, por ejemplo:

[etiqueta] DB $1b, 'E',=ABC=,10,13,0

El ensamblador colocará en la posición referenciada por [etiqueta] el valor $1B,


en la posición de memoria siguiente el valor ASCII de 'E' ($45), en las tres posiciones
siguientes los valores ASCII de 'A', 'B' y 'C' ($41,$42,$43), en la posición siguiente
el valor decimal 10 ($0A), seguido de 13 ($0D) y 0 ($00).
Esta directiva es útil para incluir dentro del código del programa tablas de datos
que pueden fácilmente ser leídas con la instrucción MOVC, o por la instrucción MOVX
si se utiliza una configuración NEWMAN en lugar de HARDWARD, esto es que la memoria
de programa y datos coinciden.
El ensamblador les asigna a las etiquetas una posición de memoria a continuación
de la última posición de memoria ocupada por el programa fuente. Es decir, a partir
de la posición de memoria ocupada por la directiva AEND@.

<;>
El A;@ se utiliza como carácter previo a un comentario. Esta directiva puede
escribirse en cualquier campo de la línea de edición y cataloga al resto de la misma
como tratamiento de comentario. Un comentario termina cuando cambiamos de línea.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 9

<EQU>
Directiva que iguala expresiones alfanuméricas, llamadas constantes, con valores
numéricos o con otras constantes.
Valores numéricos.- Estos valores pueden ser de:

- 1 byte, rango de 0..255 en decimal, ó 0..0FFH en hexadecimal.


- 2 bytes, rango de 0..65535 en decimal, ó 0..0FFFFH en hexadecimal

Permite definir directamente etiquetas a un valor, por ejemplo:

P1 equ $90 ;define etiqueta P1


CLKOUT equ P1.6 ;define etiqueta CLKOUT

Estas dos líneas definen las etiquetas P1 y CLKOUT. Estas se pueden emplear para
facilitar el acceso al puerto P1, y al pin CLKOUT, por ejemplo:

inicio:
mov P1,A ;saca por el puerto P1 el acumulador
bucle:
clr CLKOUT ;pone P1.6 a nivel bajo
setb CLKOUT ;activa P1.6
sjmp bucle ;salta a bucle

<USES>
Directiva que inserta en el programa editado, las direcciones de bit y de byte
de los registros especiales de la CPU-8031 o CPU-80537.
Es recomendable escribir esta directiva al inicio del programa editado.

USES 8031 ó USES 80537


Nota: los argumentos 8031 y 80537 son ficheros con extensión .ASM

5. OPERADORES

Son operadores, los símbolos que al ser ensamblados realizan operaciones


aritméticas entre constantes numéricas. El resultado de las operaciones es otra
constante y solo se puede utilizar como tal. Las constantes numéricas, pueden
definirse como:

- Valores numéricos (definidos anteriormente).


- Expresión alfanumérica declarada con la directiva AEQU@ y con las mismas
características que los valores numéricos.

Las operaciones permitidas son: SUMA (+), RESTA (-), MULTIPLICACIÓN (*) y
DIVISIÓN (/).

A+@ SUMA DOS VALORES. Los sumandos de la operación pueden ser valores numéricos,
constantes, etiquetas o mezcla entre ellos. Ejemplo:
VALOR EQU 0AFH
DATO EQU 34
CONS EQU VALOR+DATO
A-A RESTA DOS VALORES. El concepto es similar al apartado anterior. Los resultados
negativos de una operación se representan en el convenio del complemento a dos.
CONTPC EQU 1234H
DIFEREN EQU CONTPC-9220H
A*@ PRODUCTO DE VALORES. El resultado no debe exceder de dos bytes.
VALOR EQU 0AFH
DATO EQU 34
CONS222 EQU VALOR*DATO
MOV A, #DATO*6
A/@ DIVISIÓN ENTERA DE DOS VALORES. El resto no divisible por el divisor se
desprecia.
VALOR EQU 0AFH
DATO EQU 34
DIVISOR EQU 12H
MOV DATO, #VALOR/DIVISOR
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 10

6. LIMITACIONES DEL PROGRAMA ENSAMBLADOR (ASM51)

El ensamblador incluido en el KIT de desarrollo del TV51ASM tiene sus


limitaciones:

- La longitud máxima de una línea es de 500 caracteres.


- La longitud máxima de las etiquetas es de 30 caracteres.
- El número máximo de etiquetas es de 200.
- El tamaño máximo del código objeto es de 64 Kbytes.

Como norma general los ficheros fuentes se guardaran con la extensión .ASM. A
partir del fichero fuente el ensamblador generará varios ficheros, los cuales
contienen diferentes informaciones. Estos ficheros tienen el mismo nombre que el
fichero fuente, pero un apellido propio que los identifica *.PRN, *.HEX, *.MAP.

- Fichero *.PRN, el fichero con extensión A.PRN@ contiene en caracteres ASCII todo
el programa editado, más todos los códigos de las instrucciones y directivas
ensambladas, así como las posiciones de memoria a las cuales van dirigidos estos
códigos.
- Fichero *.HEX, contiene el código máquina necesario para:
- Transmitir el programa por el canal serie del ordenador al microinstructor.
- Usarlo en un depurador de programas sobre el mismo ordenador.
- Generar el fichero A.DAT@ en la opción de menú 8051:Eprom
- Fichero *.MAP, agrupa en caracteres ASCII todas las direcciones de los registros
especiales y el valor de las constantes numéricas y etiquetas declaradas.

7. EL DEPURADOR

El depurador es un programa que permite ejecutar paso a paso un programa sobre


el microcontrolador. Cada vez que se ejecuta una instrucción es posible ver el
contenido de la memoria y los registros, así como alterarlos.

8. NORMAS DE EDICIÓN DE UN PROGRAMA (FICHERO FUENTE)

Cada línea a editar en un programa tiene cuatro campos posibles de información:

[Constantes] [Directivas] [Argumentos] [;Comentarios]


[Etiquetas] [Instrucciones]

USES 80537 ; identificación de los registros


ORG 8000H ; dirección de la RAM a partir de la
; cual se carga el programa
dato EQU 0A5H ; asigna a la constante dato el valor A5H (en
; hexadecimal, dato= A516)
inicio: ; etiqueta Ainicio@, marca una posición
MOV A, #dato ; carga el acumulador con el valor Adato@
MOV A, #25 ; carga el acumulador con el dato decimal 25
SJMP inicio ; salto incondicional a la posición Ainicio A
END ; fin del programa

- Constantes y Etiquetas

Las constantes y etiquetas son expresiones alfanuméricas escogidas por el usuario


que definen valores numéricos o posiciones de memoria, respectivamente.
Estas expresiones deben siempre comenzar por una letra. Al utilizarlas como
constantes y etiquetas no pueden usarse expresiones que ya utiliza el ensamblador,
tales como:
- instrucciones de la CPU
- directivas del propio ensamblador
- nombres de registros

- Instrucciones y Directivas

Mnemónicos de las instrucciones de la CPU y directivas del ensamblador.

- Argumentos. Argumentos de cada mnemónico o directiva.

- Comentarios. Anotaciones propias del usuario y que no genera código máquina.


APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 11

Nota: Todos los campos son optativos, según convenga al programador. Los espacios
no son significativos y las líneas en blanco tampoco.
Para una mejor legibilidad del programa, se recomienda acceder a cada campo
utilizando el tabulador colocado a 8 espacios. Si se adopta esta forma de trabajo,
las AConstantes@ y AEtiquetas@, no deben tener más de 7 caracteres.

9. MODOS DE DIRECCIONAMIENTO

El juego de instrucciones emplea seis modos de direccionamiento que son los


siguientes:

- Direccionamiento inmediato

En lo referente al código máquina, este modo de direccionamiento se traduce en que


el código de operación va seguido de un segundo byte que representa un dato. Debido
a que este dato se encuentra en la memoria de programa, memoria que generalmente sólo
es accesible en lectura, se trata por definición de una constante. En cuanto a la
sintaxis en el código fuente, el direccionamiento utiliza el carácter #.

Ejemplo:
Poner en A el valor 30H: MOV A,#30H
Poner en A el valor establecido para el símbolo VAL: MOV A,#VAL

- Direccionamiento directo

Uno de los operandos de la instrucción es una dirección sobre cuyo contenido va


a actuar la operación. La sintaxis del código fuente no emplea ningún signo
particular.

Ejemplo:
MOV A,30H ;significa poner en A el dato situado en la dirección 30H

Este método de direccionamiento es el único medio de acceder a los registros con


función especial. De forma general, el direccionamiento directo sólo afecta a los
128 bytes inferiores de la RAM interna y a los SFR.

- Direccionamiento por registro

El (o los) operando(s) de la operación están representados por nombres de registros.


En realidad la operación actúa sobre los valores contenidos en estos registros.

Ejemplo:
MOV A,R1 ; transferir a A el valor contenido en R1
ADD A,R0 ; sumar a este valor el contenido de R0

-Direccionamiento indirecto por registro

El direccionamiento indirecto por registro utiliza el contenido de los registros


R0 y R1 como una dirección de 8 bits. Estos punteros permiten trabajar con los datos
situados en los 256 primeros bytes de la memoria RAM interna (128 bytes para los
8051/31 y 8751) o con una página de 256 bytes de la memoria externa. En este último
caso, la página es definida por el contenido del puerto P2. Este modo de
direccionamiento no permite el acceso a los registros con función especial (SFR).
En el código fuente se utiliza el signo @ para indicar al ensamblador la utilización
de este modo de direccionamiento.

Ejemplo:
MOV R0,#30H ; poner el valor 30H en R0 mediante direccionamiento inmediato
MOV A,@R0 ; el contenido de la dirección 30H se pone en A

El mismo tipo de direccionamiento es posible con el registro de 16 bits DPTR; en


este caso, el direccionamiento es aplicable a los 64 Kbytes de la memoria externa.
Las instrucciones de salvaguarda en la pila y de recuperación desde la pila utilizan
implícitamente este modo de direccionamiento por medio del puntero SP.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 12

- Direccionamiento indirecto indexado por registro

Este modo de direccionamiento sólo permite acceder en modo lectura a la memoria


de programa. Permite recuperar datos estructurados en forma de tabla colocada en el
código de programa.
En este modo de direccionamiento, el contador de programa PC o el puntero de datos
DPTR hacen las veces de puntero. El desplazamiento añadido al valor de este puntero
es el contenido del acumulador y el valor recuperado es colocado en el acumulador.
Este modo de direccionamiento facilita el acceso a tablas de datos pero el valor del
desplazamiento se pierde.

Ejemplo:

INC A ; se añade 1 al valor de A para compensar la instrucción RET


; después, A toma el valor 50H si A era 0 antes de la llamada
; a esta subrutina
MOVC A,@A+PC
RET
DB 50H, 60H

-Direccionamiento de bit

Los microcontroladores de la familia MCS-51 integran un procesador booleano para


el cual el papel de acumulador es realizado por el indicador de acarreo CY, que para
este uso se denomina C. Una serie de instrucciones permiten la realización de
operaciones lógicas que actúan sobre el estado de bits. Por tanto es posible un
direccionamiento de bit. Al emplearse un solo byte para especificar la dirección,
el número de bits direccionables directamente está limitado a 256. La dirección de
estos bits se encuentra, por una parte, en la tabla de registros con función especial
y, por otra, en la RAM interna.
Estos bits pueden ser accedidos de dos formas diferentes que son válidas para
el lenguaje ensamblador. Una de ellas consiste en acceder a ellos mediante su
dirección de bit $00 a $7F para la RAM baja y $80 a $FF para los 128 bits de la zona
SFR. La otra es accediendo a su dirección de byte $20 a $2F para la zona RAM y para
la zona SFR tenemos: $80 (P0), $88 (TCON), $90 (P1), $98 (S0CON), $A0 (P2), $A8 (IEN0),
$B0 (P3), $B8 (IEN1), $C0 (IRCON), $C8 (T2CON), $D0 (PSW), $D8 (ADCON0), $E0 (A),
$E8 (P4), $F0 (B), $F8 (P5). Observar que para la zona SFR la dirección de byte coincide
con la dirección de bit del primer bit (BIT 0) de cada registro. Esto es: P4.0 = $E8.0
= 0E8H O también P4.5 = $E8.5 = 0EDH
Ejemplo:

SETB P4.5 ;pon a 1 el bit 5 del puerto 4


CLR $E8.5 ;pon a 0 el bit 5 del puerto 4
SETB 0EDH ;pon a 1 el bit 5 del puerto 4
MOV C,P1.3 ; poner el estado del bit 3 del puerto P1 en CY
ANL C,17H ; Y lógico con el bit 7 de la posición de RAM de dirección 22H
ORL C,/P2.0 ; O lógico con el inverso del bit 0 del puerto P2
MOV 7FH,C ; y guardar el resultado en el bit 7 de la posición RAM de
; dirección 2FH

10. FORMATO DE LAS INSTRUCCIONES

Las instrucciones de la familia MCS-51, y en especial las del 8051, admiten tres
formatos, según el número de bytes que contengan. Son los siguientes:
1.- Instrucciones de un solo byte. El byte es el código OP que define la instrucción.
2.- Instrucciones de dos bytes. El primer byte es el código OP y el segundo puede
ser un dato o un desplazamiento (con signo).
3.- Instrucciones de tres bytes. El primer byte es el código OP y los dos restantes
conforman un dato de 16 bits o una dirección.
Al expresar las instrucciones se pone como primer operando el destino y como
segundo el origen. Las instrucciones podemos clasificarlas en los siguientes bloques:
- Instrucciones de transferencia
- Instrucciones aritméticas
- Instrucciones lógicas
- Instrucciones booleanas
- Instrucciones para la ruptura de secuencia
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 13

10.1 INSTRUCCIONES DE TRANSFERENCIA DE DATOS

Ninguna instrucción de transferencia de datos afecta el estado de los flags


del PSW a excepción de las instrucciones POP y MOV directamente al PSW.

GENERALES

MOV

Las instrucciones MOV realizan una transferencia de un bit o un byte desde el operando
origen al operando destino. <MOV destino, origen>

PUSH

La instrucción PUSH incrementa el registro SP y entonces realiza una transferencia


de un byte desde el operando origen a la posición de STACK direccionada por el SP.

POP

La instrucción POP realiza la transferencia de un byte desde la posición de STACK


direccionada por el SP, al operando destino y después decrementa el SP.

EJEMPLO:

;Programa MOVER.ASM para familiarizarse y comprender las instrucciones de


;TRANSFERENCIA GENERALES de datos y los distintos MODOS DE DIRECCIONAMIENTO.

USES 80537 ;usa el fichero 80537.asm para identificar los REGISTROS SFR
ORG 8000H ;carga el programa a partir de la dirección 8000H

inicio: ;etiqueta para retorno del bucle de programa

MOV A, #25H ;DIR. INMEDIATO carga en el acumulador 25H (A=25H)


MOV 30H, A ;DIR. DIRECTO, pon el contenido de A en la posición
;de memoria 30H de la RAM interna
MOV R1, A ;DIR. POR REGISTRO, ahora R1=A=25H
MOV @R1, #127 ;DIR. INDIRECTO POR REGISTRO y DIR.INMEDIATO, coloca
;en la posición de memoria apuntada por R1 (@R1=25H)
;el dato decimal 127=7FH
MOV B, @R1 ;DIR. POR REGISTRO, el contenido de la posición de
;memoria apuntada por R1 se copia en el registro B
PUSH B ;salva el contenido de B en la PILA. OBSERVAR SP
PUSH ACC ;salva el contenido de A en la PILA. OBSERVAR SP
;con esta instrucción hay que poner ACC, sino da error
;de sintaxis
MOV C, B.1 ;DIR. DE BIT, pon el contenido del bit 1 del registro
;B en el bit de carry "C"
MOV C, 0F7H ;DIR. DE BIT, copia el contenido del bit 7 de B en "C"
MOV $F0.4,C ;DIR. DE BIT, copia el contenido de "C" en el bit 4 de B
;las tres últimas instrucciones son un ejemplo de los
;tres modos de direccionamiento de bit
MOV A, B ;DIR POR REGISTRO, copia B en A
POP ACC ;recuperamos el contenido inicial de A. OBSERVAR SP
POP B ;recuperamos el contenido inicial de B. OBSERVAR SP
MOV A, #0 ;pon A a cero (dato decimal)
MOV PSW,#$FF ;OBSERVAR COMO EL BIT DE PARIDAD NO CAMBIA, NO SE PONE A UNO
MOV B, #00H ;pon B a cero (dato hexadecimal)
MOV @R1,A ;pon la posición de memoria apuntada por R1 a cero
MOV R1,A ;pon R1 a cero
MOV 30H, #0 ;pon a cero la posición de memoria 30H
SJMP INICIO ;ve a inicio y repite toda la secuencia indefinidamente
END ;fin de FICHERO FUENTE. FIN DE PROGRAMA
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 14

10.2 ESPECIFICAS AL ACUMULADOR

XCH

Intercambia el contenido del operando origen con el acumulador (A), sólo un byte.
<XCH A, origen>. Formas posibles: XCH A, Rn | XCH A, DIRECTO | XCH A, @Ri
El contenido de AA@ se copia en Aorigen@ y el de Aorigen@ en AA@.

XCHD

Intercambia el nibble bajo (4 bits de menor peso) del operando origen con el nibble
bajo del acumulador (A). <XCHD A, origen>. Formas posibles: XCHD A, @Ri
El nibble bajo del acumulador se copia en el nibble bajo de la posición de memoria
apuntada por @Ri y el nibble bajo de la posición de memoria apuntada por @Ri se copia
en el nibble bajo del acumulador.

MOVX

Realiza la transferencia de un byte entre la memoria de datos externa (RAM) y el


acumulador. La dirección externa puede especificarse mediante el contenido del
registro DPTR (16 bits) o mediante los registros R0 o R1 (8 bits).
<MOVX destino, origen>. Formas posibles: MOVX, A,@Ri | MOVX A, @DPTR
MOVX @Ri, A | MOVX @DPTR, A
- Cuando se utiliza un direccionamiento de 16 bits (DPTR) por el puerto P2 sale el
contenido del registro DPH (byte alto del puntero DPTR)líneas de dirección de memoria
A8-A15 y por el puerto P0 sale el contenido del registro DPL (byte bajo del puntero
DPTR)líneas de dirección de memoria A0-A7. Por el puerto P0 después de la dirección
A0-A7 salen o entran los datos D0-D7.
- Cuando se utiliza un direccionamiento de 8 bits (Ri) por el puerto P2 sale el
contenido del registro SFR asociado al puerto P2. Por tanto, el contenido de ese
registro se coloca en las líneas de direcciones altas A8-A15. Y por el puerto P0 sale
el contenido del registro Ri. Por tanto, el contenido de ese registro se coloca en
las líneas de direcciones bajas A0-A7. Esta particularidad facilita la paginación
de la memoria, ofreciendo 256 páginas de 256 bytes cada una. El direccionamiento de
una posición de memoria determinada se efectúa colocando el número de la página en
el registro P2, y el direccionamiento dentro de la página es determinado por el
contenido del registro Ri (R0 o R1).

MOVC

Esta instrucción realiza la transferencia de un byte desde la memoria de programa


al acumulador. La dirección del byte leído es igual a la suma del valor de 8 bits
original del acumulador y del contenido de 16 bits del registro base. El registro
base puede ser el contador de programa PC o el registro DPTR.
<MOVC A, @A+reg_base>. Formas posibles: MOVC A, @A+DPTR | MOVC A, @A+PC
Esta instrucción se utiliza para recuperar un dato constante perteneciente a una tabla
ubicada en memoria de programa. El registro base indica la dirección en donde empieza
la tabla y el acumulador se carga con un valor que identifica la posición del dato
en la tabla. Este valor se suma al puntero (DPTR o PC) y, a continuación, el valor
del dato así designado es colocado en el acumulador. La tabla puede contener hasta
256 elementos. La instrucción que utiliza PC como puntero obliga a colocar la tabla
lo más cerca posible de la instrucción y además ha de tenerse en cuenta que el contenido
de PC se incrementa a la dirección de la siguiente instrucción antes de realizarse
la suma con el acumulador (A).
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 15

10.3 DE CARGA DE 16 BITS

MOV DPTR, #dato

Carga un dato inmediato de 16 bits en el par de registros DPH (byte alto) y DPL (byte
bajo).

EJEMPLO:

;Programa MOV_ACU.ASM para estudiar el comportamiento de las instrucciones


;de transferencias de datos especificas del acumulador.

USES 80537
ORG 8000H

inicio:

MOV A, #77H
MOV R3, #88H
XCH A, R3 ;ahora A= y R3=
MOV R0, #30H
MOV @R0, #66H
XCHD A, @R0 ;ahora A= y @R0=
MOV DPTR, #0105H
MOVX @DPTR, A
MOV P2, #01H
MOV R1, #05H
MOV A, #00H
MOVX A, @R1 ;ahora A=
MOV DPTR, #TABLA
MOV A, #00H
MOVC A, @A+DPTR ;ahora A=
MOV R4, A ;ahora R4=
MOV A, #01H
MOVC A, @A+DPTR ;ahora A=
MOV R5, A ;ahora R5=
MOV A, #02H
MOVC A, @A+DPTR ;ahora A=
MOV R6, A ;ahora R6= (=codigo ASCII hexadecimal de 'A')
SJMP inicio

TABLA DB 33H, 17H, 'A'


END
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 16

10.4 INSTRUCCIONES ARITMÉTICAS

El 8051 tiene cuatro operaciones aritméticas básicas. Solamente se soportan


directamente las operaciones aritméticas de 8 bits sin signo. Sin embargo, el flag
de desbordamiento, permite la operación de suma y resta con o sin signo de números
binarios enteros. Las operaciones aritméticas se pueden realizar también
directamente en BCD natural.
Estas operaciones básicas que puede ejecutar el 8051 son suma, resta,
multiplicación y división. Se debe tener presente en todo momento que el 8051 es un
microprocesador de 8 bits, y que por tanto realiza las operaciones con operandos de
8 bits. No obstante, escribiendo algoritmos adecuados es posible realizar operaciones
con valores de más de 8 bits, incluso con valores en coma flotante, tal y como hace
cualquier calculadora científica. El hecho de disponer de bit de acarreo (CY) es lo
que posibilita realizar operaciones con números de más de ocho bits.

10.4.1 SUMA

INC

La instrucción INC incrementa en uno el operando fuente y pone el resultado en el


operando fuente. <INC operando_fuente>. Formas posibles: INC A | INC Rn
INC directo |INC @Ri

ADD

La instrucción ADD suma el contenido del acumulador (A) con el operando fuente y el
resultado lo guarda en el acumulador. <ADD A, operando_fuente>
Formas posibles: ADD A, Rn | ADD A, directo | ADD A, @Ri | ADD A, #dato
Con esta instrucción el indicador de acarreo (CY) y el indicador de acarreo auxiliar
(AC) se ponen a 1 si se produce un acarreo desde el bit 7 o el bit 3, respectivamente,
y se ponen a cero si no se produce el acarreo correspondiente.
- Para una suma de dos enteros sin signo, el indicador de acarreo CY informa de un
eventual desbordamiento.
- El indicador de overflow (OV) se pone a uno durante una suma de dos enteros con
signo si la suma de dos números positivos genera un resultado negativo, o si la suma
de dos números negativos produce un resultado positivo.

ADDC

La instrucción ADDC suma el contenido del acumulador con el operando fuente, y a esto
le suma el bit de carry (CY), y guarda el resultado en el acumulador.
<ADDC A, operando_fuente + CY>.
Formas posibles: ADDC A, Rn | ADDC A, directo | ADDC A, @Ri | ADDC A, #dato
Lo dicho sobre los flags CY, AC y OV para la instrucción ADD se verifica también para
esta instrucción ADDC.

DA

La instrucción DA (ajuste decimal del acumulador para las operaciones en BCD natural)
corrige la suma que resulta de la suma binaria de dos operandos de dos dígitos
decimales. La suma decimal en BCD natural formada por DA se guarda en el acumulador.
El flag de carry (CY) se pone a uno si el resultado en BCD es mayor de 99, en caso
contrario e pone a cero. <DA A>
- Esta instrucción tiene que venir precedida de una suma con los operandos expresados
en BCD natural.
- Si al sumar dos dígitos expresados en BCD natural el resultado pasa de nueve, hay
que sumarle seis para hacer el ajuste decimal. Pues bien, esta instrucción <DA A>
hace justamente eso.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 17

EJEMPLO:

;Programa SUMA_BCD.ASM para estudiar el comportamiento de las instrucciones


;de suma en binario natural y en BCD natural sin signo

USES 80537
ORG 8000H

NA EQU 35H ;NA-> numero A = 35H


NB EQU 27H ;NB-> numero B = 27H

inicio:

;SUMA BINARIA

MOV A, #NA
MOV R2, #NB
ADD A, R2
MOV R3, A ;R3= carry auxiliar AC= y carry CY=

;SUMA DECIMAL

MOV A, #NA
MOV R2, #NB
ADD A, R2
DA A
MOV R4, A ;R4= carry auxiliar AC= y carry CY=

;SUMA BINARIA CON DESBORDAMIENTO

MOV A, #83H
MOV R2, #96H
ADD A, R2
MOV R5, A ;R5= AC= CY= OV=

SJMP inicio
END

EJERCICIO

Escribe un programa que nos permita sumar dos números de 16 bits.


A) En binario natural
b) En BCD natural

Se seguirá un procedimiento similar al del ejemplo anterior, definiendo primero los


números a sumar como constantes. Los números a sumar y el resultado obtenido se
guardaran en la memoria RAM interna, por encima de la posición 128.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 18

10.4.2 RESTA

DEC

La instrucción DEC decrementa en uno el operando fuente y pone el resultado en el


operando fuente. <DEC operando_fuente>. Formas posibles: DEC A | DEC Rn
DEC directo |DEC @Ri
SUBB

La instrucción SUBB resta el operando fuente y el indicador de acarreo (CY) del


contenido del acumulador.<SUBB A, operando_fuente + CY>. Es decir el Acumulador es
el minuendo y el operando fuente más el carry el sustraendo. El resultado se coloca
en el acumulador.
Formas posibles: SUBB A, Rn | SUBB A, directo | SUBB A, @Ri | SUBB A, #dato
- El indicador de acarreo (CY) se pone a uno si se produce un desbordamiento. Esto
nos va a permitir restar números de más de ocho bits. El bit de acarreo (CY) se pone
a uno cuando el resultado de la resta es negativo.
- El indicador de carry auxiliar (AC) se pone a uno si se produce un acarreo del bit
tres.
- El indicador de overflow (OV) se pone a uno si se produce un acarreo del bit seis
pero no del bit siete o viceversa.
- En una substracción de enteros con signo, el indicador OV se pone a uno:
a) si un valor negativo restado de un valor positivo produce un resultado negativo.
b) si un valor positivo restado de un valor negativo produce un resultado positivo.

EJEMPLO:

;Programa RESTA_BI.ASM para estudiar el comportamiento de las instrucciones


;de RESTA en binario natural de números enteros con signo

USES 80537
ORG 8000H
NA EQU 53 ;NA-> numero A = 35H = +53
NB EQU 55 ;NB-> numero B = 37H = +55
NC EQU 55 ;NC-> numero C = 37H = +55
ND EQU 53 ;ND-> numero D = 35H = +53
NE EQU 82 ;NE-> numero E = 52H = +82
NF EQU 191 ;NF-> numero F = BFH = -65 (CONVENIO C-2)

inicio:
;RESTA BINARIA DE NÚMEROS ENTEROS CON SIGNO (resultado negativo)

CLR C ;esta instrucción pone el bit de carry a cero (CY=0)


MOV A, #NA
MOV R2, #NB
SUBB A, R2
MOV R3, A ;R3= OV= y carry CY=

;RESTA BINARIA DE NÚMEROS ENTEROS CON SIGNO (resultado positivo)


CLR C
MOV A, #NC
MOV R2, #ND
SUBB A, R2
MOV R4, A ;R4= OV= y carry CY=

;RESTA BINARIA DE NÚMEROS ENTEROS CON SIGNO (resultado overflow)


CLR C
MOV A, #NE
MOV R2, #NF
SUBB A, R2
MOV R5, A ;R5= OV= y carry CY=
SJMP inicio
END

EJERCICIO
Realizar un programa que nos permita restar dos números enteros de 16 bits con signo.
El sustraendo se guardara en R2(L) y R3(H) y el minuendo en R4(L) y R5(H). El resultado
se guardara en R6(L) y R7(H).
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 19

10.4.3 MULTIPLICACIÓN

El microcontrolador 80C537, al igual que los otros de la familia 51 tiene


instrucciones que permiten multiplicar y dividir. Estas funciones son inusuales en
microprocesadores de 8 bits, siendo un auténtico lujo para el programador.

MUL

La instrucción MUL AB realiza una multiplicación sin signo de los enteros contenidos
en el acumulador y el registro B. La parte menos significativa del resultado de 16
bits es colocada en el acumulador, mientras que los 8 bits más significativos son
colocados en el registro B.
- Si el producto da un resultado mayor que 255, se pone a 1 el indicador de
desbordamiento (OV). En caso contrario se pone a cero.
- El indicador de acarreo (CY) se pone a cero en todos los casos.

EJEMPLO:

;Programa MUL_BIN.ASM para estudiar el comportamiento de las instrucciones


;de MULTIPLICACIÓN en binario natural de números enteros SIN signo

USES 80537
ORG 8000H

NA EQU 12 ;NA-> numero A = 0CH = 12


NB EQU 18 ;NB-> numero B = 12H = 18 (12*18 = 216)
NC EQU 255 ;NC-> numero C = FFH = 255
ND EQU 255 ;ND-> numero D = FFH = 255 (255*255 = 65025)

inicio:

;MULTIPLICACIÓN BINARIA DE NÚMEROS ENTEROS (resultado < 255)

MOV A, #NA
MOV B, #NB
MUL AB
MOV R2, A ;R2= OV= y carry CY=
MOV R3, B ;R3=

;MULTIPLICACIÓN BINARIA DE NÚMEROS ENTEROS (255 < resultado < 65535)

MOV A, #NC
MOV B, #ND
MUL AB
MOV R4, A ;R4= OV= y carry CY=
MOV R5, B ;R5=

SJMP inicio
END
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 20

10.4.4 DIVISIÓN

DIV

La instrucción DIV AB realiza la división del entero sin signo del acumulador entre
el entero sin signo que se encuentra en el registro B (S= A/B). El acumulador recibe
la parte entera del cociente y el registro B el resto de la división.
- El indicador de acarreo (CY) y el indicador de rebasamiento (OV) se ponen a cero.
- A lo dicho en el punto anterior hay una excepción: si B vale 00 (B= 00H, división
por cero), los valores devueltos en A y en B no están definidos y el indicador de
rebasamiento (OV) se pone a 1 para detectar esta circunstancia.

EJEMPLO:

;Programa DIV_BIN.ASM para estudiar el comportamiento de la instrucción


;de DIVISIÓN en binario natural de números enteros SIN signo

USES 80537
ORG 8000H

NA EQU 208 ;NA-> numero A = D0H = 208


NB EQU 100 ;NB-> numero B = 64H = 100 (208:100 = 2,08)
NC EQU 25 ;NC-> numero C = 19H = 25
ND EQU 0 ;ND-> numero D = 00H = 0 (25:0 = ERROR)

inicio:

;DIVISIÓN BINARIA DE NÚMEROS ENTEROS (divisor distinto de 0)

MOV A, #NA
MOV B, #NB
DIV AB
MOV R2, A ;R2= OV= y carry CY=
MOV R3, B ;R3=

;DIVISIÓN BINARIA DE NÚMEROS ENTEROS (divisor igual a 0 (B=0)

MOV A, #NC
MOV B, #ND
DIV AB
MOV R4, A ;R4= OV= y carry CY=
MOV R5, B ;R5=

SJMP inicio
END
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 21

11. INSTRUCCIONES LÓGICAS

El 8051 realiza las operaciones lógicas con un solo operando o con dos operandos.
Las instrucciones lógicas que efectúan operaciones con un bit reciben el nombre de
INSTRUCCIONES BOOLEANAS.

11.1 OPERACIONES CON UN SOLO OPERANDO

CLR

La instrucción CLR pone a cero el operando <CLR operando>. Formas posibles:

CLR A -> pone a cero todos los bits del acumulador.


CLR bit -> se pone a cero el bit especificado. Esta instrucción puede actuar sobre
el indicador de acarreo (CY) o sobre un bit direccionable directamente.
(Formas posibles: CLR C | CLR bit

SETB

La instrucción SETB pone a uno cualquier bit direccionable directamente <SETB bit>.
Formas posibles: SETB C | SETB bit

CPL

La instrucción CPL complementa el operando <CPL operando>. Formas posibles:

CPL A -> complementa (invierte) todos los bits del acumulador.


CPL bit -> complementa (invierte) el bit especificado. Esta instrucción puede
actuar sobre el indicador de acarreo (CY) o sobre un bit direccionable
directamente. (Formas posibles: CPL C | CPL bit

11.2 OPERACIONES DE ROTACIÓN CON EL ACUMULADOR

RL A

Rotación a la izquierda. Los 8 bits del acumulador se desplazan una posición a la


izquierda. El bit 7 se coloca en la posición menos significativa (bit 0).

RLC A

Rotación a la izquierda a través del indicador de acarreo. Los 8 bits del acumulador
se desplazan una posición a la izquierda. El bit 7 se coloca en el indicador de acarreo
(CY), mientras que el valor de este se coloca en la posición menos significativa del
acumulador (bit 0).

RR A

Rotación a la derecha. Los 8 bits del acumulador se desplazan una posición a la


derecha. El bit 0 se coloca en la posición más significativa (bit 7).

RRC A

Rotación a la derecha a través del indicador de acarreo. Los 8 bits del acumulador
se desplazan una posición a la derecha. El bit 0 se coloca en el indicador de acarreo
(CY), mientras que el valor de este se coloca en la posición más significativa del
acumulador (bit 7).

SWAP A

Permutación de los 4 bits altos del acumulador con los 4 bits bajos. Los 4 bits más
significativos (4-7) del acumulador se intercambian con los 4 bits menos
significativos (0-3). Esta instrucción reemplaza con ventaja a 4 instrucciones de
rotación hacia la izquierda.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 22
EJEMPLO:
;Programa BI_BCD.ASM, este programa convierte un número de un byte
;expresado en binario a BCD natural. Se utiliza como ejemplo de aplicación
;de la instrucción de rotación SWAP y de borrado CLR

USES 80537
ORG 8000H

NA EQU 245 ;NA-> numero A = F5H (en binario) = 245 en decimal


;las CENTENAS se guardan en R4 y las DECENAS Y UNIDADES EN R5
inicio:

MOV A, #NA
MOV B, #100 ;divisor=100, PARA CALCULAR LAS CENTENAS
DIV AB ;en A obtenemos las centenas y en B el resto
MOV R4, A ;guarda las centenas en R4
MOV R3, B ;guarda el resto en R3
MOV B, #10 ;divisor=10, PARA CALCULAR LAS DECENAS Y UNIDADES
MOV A, R3 ;pon el resto de la división anterior en A
DIV AB ;en A obtenemos las decenas y en B las unidades
SWAP A ;pon las DECENAS en los cuatro bits superiores
ADD A, B ;las UNIDADES se añaden a las decenas
MOV R5, A ;guarda las decenas y las unidades en R5

MOV P1, R4 ;VISUALIZA las centenas en el puerto P1


MOV P4, R5 ;VISUALIZA las decenas y unidades en el puerto P4

CLR A ;estas tres instrucciones siguientes se utilizan


MOV P1, A ;para poner a cero los puertos P1 y P4 antes
MOV P4, A ;de iniciar de nuevo el bucle
SJMP inicio
END

EJERCICIO

Diseñar un programa que haga justo lo contrario que el anterior. Es decir, a partir de un número expresado
en decimal de tres dígitos obtener su representación en binario natural. El número decimal lo guardaremos
en los registros R4 (centenas) y R5 (decenas y unidades). El resultado en binario natural se guardara
en R6 (byte bajo) y R7 (byte alto).

EJEMPLO:

;Programa MUL_RRA.ASM, este programa es un ejemplo para la utilización de


;las instrucciones de rotación del acumulador y de operación con un bit.
;El programa nos permite multiplicar un número entero sin signo
;de 5 bits por 33, esto es S= 33*A. RESULTADO en R4(L) y R5(H)

USES 80537
ORG 8000H
NA EQU 25 ;NA-> numero A = 19H = 25 en decimal (MULTIPLICANDO)
inicio:
MOV A, #NA ;pon el multiplicando en el acumulador
MOV R2, A ;pon el multiplicando en R2
CLR C ;pon el bit de carry a cero
RLC A ;multiplica por 2
RLC A ;multiplica por 4
RLC A ;multiplica por 8
RLC A ;multiplica por 16
MOV R4, A ;guarda byte bajo R4(L),
CLR A ;pon a cero el acumulador
RLC A ;ROTA hacia el byte alto
MOV R5, A ;guarda byte alto R5(H)
CLR C
MOV A, R4 ;pon byte bajo en A
RLC A ;multiplica por 32
MOV R4, A ;guarda byte bajo
MOV A, R5 ;recupera byte alto
RLC A ;rota hacia el byte alto
MOV R5, A ;guarda el byte alto
MOV A, R4 ;recupera byte bajo
ADD A,R2 ;ahora a 32*A le sumamos A, estos es: S=32*A+A= 33*A
MOV R4, A
CLR A ;suma al byte alto (R5) el acarreo que nos llevamos
ADDC A, R5 ;del byte bajo (R4)
MOV R5, A ;guarda el byte alto en R5

MOV P1, R5 ;VISUALIZA el byte alto del resultado en P1


MOV P4, R4 ;VISUALIZA el byte bajo del resultado en P4

CLR A
MOV P1, A ;pon a cero P1
MOV P4, A ;pon a cero P4
SJMP inicio
END
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 23

11.3 OPERACIONES CON DOS OPERANDOS

ANL

La instrucción <ANL operando_destino, operando_origen> realiza la operación lógica


AND (Y) entre el operando origen y el operando destino. El resultado se devuelve en
el operando destino. Formas posibles: ANL A, Rn | ANL A, directo | ANL A, @Ri ANL
A, #dato | ANL directo, A | ANL directo, #dato

Esta instrucción también puede operar con el bit de acarreo (CY) y otro bit, en este
caso la sintaxis es <ANL C, bit_origen>. Esta instrucción realiza la operación lógica
AND entre el bit de acarreo y otro bit direccionable directamente, el resultado queda
en el bit de acarreo. Formas posibles: ANL C, bit | ANL C, /bit
- El signo A/@ delante del operando origen es interpretado por el ensamblador como
complemento lógico. En tal caso, la operación realizada es un Y lógico entre el inverso
del bit origen y el indicador de acarreo, pero el estado del bit origen no se modifica.

ORL

La instrucción <ORL operando_destino, operando_origen> realiza la operación lógica


OR (O) entre el operando origen y el operando destino. El resultado se devuelve en
el operando destino. Formas posibles: ORL A, Rn | ORL A, directo | ORL A, @Ri ORL
A, #dato | ORL directo, A | ORL directo, #dato

Esta instrucción también puede operar con el bit de acarreo (CY) y otro bit, en este
caso la sintaxis es <ORL C, bit_origen>. Esta instrucción realiza la operación lógica
OR entre el bit de acarreo y otro bit direccionable directamente, el resultado queda
en el bit de acarreo. Formas posibles: ORL C, bit | ORL C, /bit
- El signo A/@ delante del operando origen es interpretado por el ensamblador como
complemento lógico. En tal caso, la operación realizada es un O lógico entre el inverso
del bit origen y el indicador de acarreo. El estado del bit origen no se modifica.

XRL

La instrucción <XRL operando_destino, operando_origen> realiza la operación lógica


OR exclusiva(XOR) entre el operando origen y el operando destino. El resultado se
devuelve en el operando destino. Formas posibles: XRL A, Rn | XRL A, directo |
XRL A, @Ri | XRL A, #dato | XRL directo, A | XRL directo, #dato

EJEMPLO:
;Programa AND_LOG.ASM, este programa es un ejemplo para la utilización de
;las instrucciones lógicas con dos operandos (ANL, ORL, XRL)

USES 80537
ORG 8000H

NA EQU 0FFH ;NA-> numero A, byte de mascara para invertir bits


;seleccionados del byte destino, en este caso todos
inicio:

;INVIERTE LOS BITS DEL REGISTRO R2, UTILIZA LA INSTRUCCIÓN "CPL"

MOV R2, #0F0H ;pon el byte a invertir en R2


MOV A, R2
CPL A ;invierte el byte
MOV R2, A ;guarda el byte invertido en R2 (R2= )

;INVIERTE LOS BITS DEL REGISTRO R2, UTILIZA LA INSTRUCCIÓN "XRL"

MOV A, #NA ;pon la mascara en el acumulador


MOV R3, #0F0H ;pon el byte a invertir en R3
XRL A, R3 ;invierte el byte
MOV R3, A ;guarda el byte invertido en R3 (R3= )

SJMP inicio
END
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 24

12. INSTRUCCIONES DE TRANSFERENCIA DE CONTROL

Hay tres clases de operaciones de control de transferencia:

- Llamadas incondicionales, retornos y saltos.


- Saltos condicionales
- Interrupciones

Estas instrucciones, bajo unas condiciones determinadas, causan que la


ejecución de un programa no sea secuencial, esto es, que el control del programa se
transfiera a una instrucción que no es la que sigue a las instrucciones de control
de transferencia, sino a otra deseada por el usuario programador, que puede estar
ubicada en cualquier posición de la memoria de programa.
Estas instrucciones son las que permiten crear programas complejos que analicen
una serie de condiciones y generen a partir de ahí un resultado. Por ejemplo el simple
caso de una alarma. El procesador lee el estado de los sensores, si estos son activados
(se rompe una ventana, se abre una puerta o alguien cruza ante un sensor de
infrarrojos) y la alarma esta activada debe esperar un tiempo determinado (por ejemplo
45 segundos) y si la alarma sigue activada debe dar la orden de que suene la campana.
Una aplicación elemental que requiere de control de transferencia.

12.1 MANEJO DE SUBRUTINAS

La mayoría de los desarrolladores y programadores van escribiendo subprogramas


que realizan tareas determinadas (por ejemplo un retardador de un segundo).
Usualmente estos subprogramas son compartidos por varios programas. El
funcionamiento que debe seguir un salto a un subprograma o función es el siguiente:
primero se transfiere el control del programa al subprograma, se ejecuta este y cuando
su ejecución se ha completado se devuelve el control del programa a la instrucción
que lo llamó.
Para que esto sea posible, antes de transferir el control del programa se ha de
guardar el contenido del contador de programa en algún lugar de la memoria. Para ello
existe un área de la memoria contenida en la memoria de datos interna denominada PILA.
Esta área de memoria está en la dirección apuntada por el registro de 8 bits
denominado SP (stack pointer= puntero de pila). Fácilmente se pueden meter y sacar
datos en la PILA, lo único a tener en cuenta es que se trata de una estructura LIFO
(Last Input First Output= último en entrar primero en salir). Es decir, el último
dato que entró es el primero en salir.
Para meter un byte en la pila se debe incrementar en una unidad el registro SP
y escribir el dato correspondiente en la posición apuntada por SP. Para extraer un
dato debe leerse la posición de memoria apuntada por SP y a continuación decrementar
SP en una unidad.
Debido a que es un proceso muy frecuente, el microprocesador dispone ya de
instrucciones para gestionar la pila. Estas son:

- PUSH directo, introduce un dato en la pila procedente del byte direccionado


- POP directo, extrae un dato de la pila y lo coloca en el byte direccionado

Como se puede observar el direccionamiento de las instrucciones PUSH y POP es


directo, lo que quiere decir que los únicos datos que pueden ser introducidos en la
pila son los registros de función especial y las 128 primeras posiciones de memoria.

EJEMPLO
PUSH A ;guarda el contenido del Acumulador en la PILA
PUSH B ;guarda el contenido del registro B en la PILA
* * *
POP B ;recupera el contenido del registro B de la PILA
POP A ;recupera el contenido del acumulador de la PILA

Si ejecutamos las instrucciones POP en otro orden la consecuencia es que estamos


intercambiando el contenido de los registros A y B. Lo que siempre debemos tener
presente es que hay que ejecutar el mismo número de instrucciones POP que PUSH. Por
tanto, la pila también permite intercambiar datos entre registros. Aunque su uso más
frecuente está en la posibilidad de saltar a subprogramas y retornar el control del
programa.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 25

12.2 LLAMADAS INCONDICIONALES, RETORNOS Y SALTOS

Las llamadas incondicionales, los retornos y los saltos transfieren el control


desde el valor actual del Contador de Programa a la dirección destino.

12.2.1 SALTOS INCONDICIONALES

Las instrucciones siguientes nos permiten realizar un salto incondicional a otra


dirección de memoria en la cual queremos que siga ejecutándose nuestro programa.
Existen cuatro instrucciones:

SJMP rel, se trata de un salto corto relativo de 8 bits con signo, que permite saltar
a una dirección 128 posiciones anterior o 127 posiciones posterior ("rel" es un número
de 8 bits con signo expresado en complemento a dos que se suma al contenido del registro
PC después de incrementarlo dos veces). En vez de un número se puede poner una
etiqueta, que identificara el lugar al que queremos saltar. Esta etiqueta tiene que
estar como máximo (127) 128 posiciones arriba o abajo del valor del PC.

AJMP dir11, es una instrucción que permite un salto absoluto a una dirección
cualquiera con la condición de que sus 5 bits más significativos coincidan con los
del contador de programa (PC)(después de un doble incremento del mismo). Es decir,
la dirección a la que se transfiere el programa debe estar en el mismo segmento de
memoria de 2 KBytes que la instrucción que sigue a la AJMP.

LJMP dir16, permite realizar un salto absoluto de 16 bits (64 KBytes) a cualquier
posición de la memoria de programa.

JMP @A+DPTR, salto indirecto a DPTR+A. Esta instrucción permite un salto absoluto
con direccionamiento de 16 bits, esto es, permite saltar a cualquier posición de
memoria. La posición de memoria a la que debe saltar está definida por la suma del
registro de 16 bits DPTR y el registro acumulador de 8 bits.

EJEMPLO:

;Programa SALTO_IN.ASM para estudiar el comportamiento de las instrucciones


;de SALTO INCONDICIONAL

USES 80537
ORG 8000H

NA EQU 35H ;NA-> numero A = 35H


NB EQU 27H ;NB-> numero B = 27H

SALTO_1:
SJMP SUMABIN ;subrutina: suma dos números de 8 bits sin signo
;en binario natural, el resultado se guarda en R3
SALTO_2:
SJMP SUMADEC ;subrutina: suma dos números de 8 bits sin signo
;en BCD natural, el resultado se guarda en R4
SALTO_3:
SJMP SUMABINDES ;subrutina: suma dos números de 8 bits sin signo
;en binario natural, el resultado se guarda en R5
;en este caso se produce DESBORDAMIENTO
SUMABIN:
MOV A, #NA
MOV R2, #NB
ADD A, R2
MOV R3, A ;R3= carry auxiliar AC= y carry CY=
SJMP SALTO_2

SUMADEC:
MOV A, #NA
MOV R2, #NB
ADD A, R2
DA A
MOV R4, A ;R4= carry auxiliar AC= y carry CY=
SJMP SALTO_3

SUMABINDES:
MOV A, #83H
MOV R2, #96H
ADD A, R2
MOV R5, A ;R5= AC= CY= OV=
SJMP SALTO_1
END
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 26

12.2.2 LLAMADAS A SUBPROGRAMAS

Para ejecutar un subprograma es necesario llamarlo a través de una de las


siguientes instrucciones: ACALL y LCALL, que son en cierto modo similares a AJMP y
LJMP. Su diferencia estriba en que antes de transferir el control del programa
guardan los dos bytes que conforman el contador de programa (PC)(que apunta a la
instrucción posterior al salto - call).
Para facilitar el retorno la mayoría de los microprocesadores disponen de otra
instrucción, RET, que lo único que hace es leer el registro de 16 bits PC de la PILA.
El formato en que se guarda el PC en la PILA es: primero se mete el byte de menor
peso y después el de mayor peso.
Es norma que los subprogramas y subrutinas que deben ser llamadas con un CALL
no modifiquen o alteren los registros del programa principal, por lo que al entrar
en ellas estas deben guardar en la PILA, con la ayuda de la instrucción PUSH, todos
los registros que vayan a ser alterados y que al salir del subprograma deban permanecer
inalterados. Estos, una vez guardados en la PILA podrán ser modificados y recargados
a voluntad, siempre que antes de salir de la subrutina se restauren, todos de nuevo,
mediante las instrucciones POP.
Antes de salir de una subrutina, instrucción RET, deben ejecutarse tantas
instrucciones POP como instrucciones PUSH se hubiesen ejecutado anteriormente. De
no ser así, el control del programa se transferirá a una dirección no predecible.

INSTRUCCIONES:

- ACALL dir11, llamada incondicional a una subrutina que debe estar situada en el
mismo bloque de 2 KBytes en el que se encuentra la dirección contenida en el PC. En
primer lugar, el PC es incrementado dos veces para obtener la dirección de retorno
(la dirección de la instrucción que sigue a la instrucción ACALL), esta dirección
se guarda en la PILA y después tiene lugar el salto.

- LCALL dir16, llamada incondicional a una subrutina. Provoca una bifurcación a la


dirección expresada por los 16 bits de dir16. La subrutina puede estar en cualquier
posición dentro de los 64 KBytes. La instrucción suma el valor 3 al contenido del
PC para obtener la dirección de la próxima instrucción a ejecutar después de la
subrutina. Esta dirección se guarda a continuación en la PILA.

- RET, retorno de subrutina. Retorna el control del programa a la instrucción


posterior a la llamada ACALL o LCALL. Para ello toma la dirección de retorno de la
PILA y ajusta la PILA acorde a la nueva situación.

EJEMPLO:
;Programa CALL_INB.ASM para estudiar el comportamiento de las instrucciones
;de LLAMADA INCONDICIONAL

USES 80537
ORG 8000H

NA EQU 35H ;NA-> numero A = 35H


NB EQU 27H ;NB-> numero B = 27H

MOV A, #NA ;carga los operandos en A y R2


MOV R2, #NB
INICIO:
ACALL SUMABIN ;subrutina: suma dos números de 8 bits sin signo
;en binario natural, el resultado se guarda en R3
ACALL SUMADEC ;subrutina: suma dos números de 8 bits sin signo
;en BCD natural, el resultado se guarda en R4
SJMP INICIO
SUMABIN:
PUSH ACC ;salva el operando del acumulador en la PILA
ADD A, R2
MOV R3, A ;R3= carry auxiliar AC= y carry CY=
POP ACC ;recupera el operando del acumulador de la PILA
RET ;retorno de subrutina

SUMADEC:
PUSH ACC
ADD A, R2
DA A
MOV R4, A ;R4= carry auxiliar AC= y carry CY=
POP ACC
RET
END
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 27

12.3 SALTOS CONDICIONALES

Las siguientes instrucciones nos permiten crear programas que se comporten de


una u otra forma según la coyuntura del sistema, es decir, que los programas sean
capaces de tomar decisiones en función de diversos parámetros. Para ello se dispone
de un amplio abanico de funciones para realizar saltos condicionales, esto es, si
se verifica determinada condición. Normalmente, las condiciones se reducen a que
determinado bit está a uno o a cero.
La dirección de destino estará dentro de un margen de 256 bytes centrados respecto
a la dirección de inicio de la siguiente instrucción. Es decir, todas estas
instrucciones utilizan un direccionamiento relativo (rel) de un byte, lo que limita
a -128 y +127 bytes el destino del salto. (Nota: "rel" significa dirección relativa
al PC en complemento a dos entre +127 y -128 posiciones. En el fichero fuente Arel@
puede ser sustituida por una etiqueta, lo que facilita mucho la programación).

Los saltos condicionales son:

JZ rel

Salto si el acumulador es igual a cero (0). Si todos los bits del acumulador son cero,
se realiza la bifurcación a la dirección especificada. En caso contrario, se ejecutará
la instrucción siguiente. La dirección de destino se calcula sumando el valor con
signo Arel@ al valor del PC después de incrementar éste.

JNZ rel

Salto si el acumulador es distinto de cero (0). Si el acumulador contiene un valor


distinto de cero, se realiza la bifurcación a la dirección especificada. En caso
contrario, se ejecutará la instrucción siguiente. La dirección de destino se calcula
sumando el valor con signo Arel@ al valor del PC después de incrementar éste.

JC rel

Salto si el indicador de acarreo está a uno (1). Si el indicador de acarreo está a


uno, se ejecuta un salto a la dirección especificada, Si no, se ejecuta la instrucción
siguiente. La dirección de destino se calcula sumando el valor con signo Arel@ al valor
del PC después de incrementar éste.

JNC rel

Salto si el indicador de acarreo está a cero (0). Si el indicador de acarreo está


a cero, se ejecuta un salto a la dirección especificada, Si no, se ejecuta la
instrucción siguiente. La dirección de destino se calcula sumando el valor con signo
Arel@ al valor del PC después de incrementar éste.

JB bit, rel

Salto si el Abit@ está a uno (1). Si el Abit@ indicado está a uno, se ejecuta un salto
a la dirección especificada. Si no, se ejecuta la instrucción siguiente. La dirección
de destino se calcula sumando el valor con signo Arel@ al valor del PC después de
incrementar éste.

JNB bit, rel

Salto si el Abit@ no está a uno (1)(salto si el bit=0). Si el Abit@ indicado está a


cero, se ejecuta un salto a la dirección especificada. Si no, se ejecuta la instrucción
siguiente. La dirección de destino se calcula sumando el valor con signo Arel@ al valor
del PC después de incrementar éste.

JBC bit, rel

Salto si el Abit@ está a uno (1) y puesta a cero del mismo. Si el Abit@ indicado está
a uno, se ejecuta un salto a la dirección especificada. Si no, se ejecuta la
instrucción siguiente. Si el resultado de la comprobación es positivo, el Abit@ es
puesto a cero. La dirección de destino se calcula sumando el valor con signo Arel@
al valor del PC después de incrementar éste.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 28

CJNE operando_destino, operando_origen, rel

Esta instrucción compara el operando origen con el operando destino y realiza un salto
si no son iguales. La dirección de destino se calcula sumando el valor con signo Arel@
al valor del PC después de incrementar éste. El indicador de acarreo (CY) se pone
a uno (CY=1) si el valor del operando destino es inferior al valor del operando origen.
En los demás casos, el indicador de acarreo se pone a cero (CY=0).
Formas posibles:
CJNE A, directo, rel | CJNE A, #dato, rel
CJNE Rn, #dato, rel | CJNE @Ri, #dato, rel

DJNZ operando_fuente, rel

Esta instrucción decrementa el operando fuente y realiza un salto si el resultado


es distinto de cero. El operando fuente es decrementado en uno y, si el resultado
es diferente de cero, se ejecuta un salto relativo. Un valor original de cero (00H)
provoca un desbordamiento a 0FFH. La dirección de destino se calcula sumando el valor
con signo Arel@ al valor del PC después de incrementar éste.
Formas posibles:
DJNZ Rn, rel | DJNZ directo, rel
EJEMPLO:

;***********************************************************
; * Listado SALTO_CO.ASM. Ejemplo de las instrucciones de salto.
; * Programa que alternativamente CUENTA EN BCD NATURAL (hasta 99)
; * O EN BINARIO NATURAL (hasta 255) EN FUNCIÓN DEL ESTADO DE UN BIT
; ***********************************************************

USES 80537
ORG 8000H

LEDS EQU P4 ;define el puerto del LED


BIT EQU $20.0 ;define el bit de toma de decisión
;TEMPORIZACIÓN SUBRUTINA "ESPERA1" (DPTR y R0)
REG_16 EQU 0101H ;constante para cargar el registro DPTR
REG_RO EQU 01H ;constante para cargar el registro R0

OPTA:
JB BIT, CUENTA_BIN ;si BIT=1 salta a la subrutina CUENTA BINARIA
SJMP CUENTA_BCD ;SINO salta a la subrutina CUENTA BCD

;SUBRUTINA DE CUENTA EN BCD NATURAL

CUENTA_BCD:
MOV A,#$00 ;pon el acumulador a cero
BUCLE_BCD:
MOV R0,#REG_RO ;carga R0 con el dato REG_RO
MOV LEDS,A ;VISUALIZA por P4 el contenido del acumulador
ADD A,#$01 ;suma uno al acumulador
DA A ;haz el ajuste decimal del acumulador
ACALL ESPERA1 ;llama a la subrutina de perdida de tiempo
CJNE A, #99H, BUCLE_BCD ;repite el bucle hasta que A=99 decimal
CPL BIT ;invierte el BIT de control de OPCIÓN
SJMP OPTA ;salta a OPTA para empezar una nueva cuenta

;SUBRUTINA DE CUENTA EN BINARIO NATURAL

CUENTA_BIN:
MOV A,#$00
BUCLE_BIN:
MOV R0,#REG_RO
MOV LEDS,A
INC A
ACALL ESPERA1
CJNE A, #0FFH, BUCLE_BIN
CPL BIT
SJMP OPTA

;SUBRUTINA DE PERDIDA DE TIEMPO PARA PODER VISUALIZAR LA CUENTA

ESPERA1:
MOV DPTR,#REG_16
ESPERA2:
DJNZ DPL, ESPERA2 ;Repite bucle para byte bajo de DPTR
DJNZ DPH, ESPERA2 ;Repite bucle para byte alto de DPTR
DJNZ R0, ESPERA1
RET
END
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 29

13. LAS INTERRUPCIONES

El 8051 básico tiene cinco fuentes de interrupción, mientras que la versión 8052
cuenta con seis. Todas estas fuentes de interrupción son enmascarables, es decir,
se pueden habilitar o no por software. Después de la inicialización todas las
interrupciones están inhibidas.
El registro IEN0 sirve para habilitar o inhibir individualmente las fuentes de
interrupción.
El mecanismo de interrupción posee vectores de dirección fija. Estas direcciones
están situadas en la parte baja de la memoria de programa.
El SAB 80C537 (microcontrolador de la placa TM-311) dispone de 14 fuentes de
interrupción con 4 niveles de prioridad. Siete (7) fuentes de interrupción pueden
ser generadas por los periféricos del propio chip (ej: temporizador 0, temporizador
1, temporizador 2, temporizador comparador, interface serie y conversor
analógico-digital) y siete (7) interrupciones pueden ser activadas externamente.
La estructura de las interrupciones se basa en un mecanismo común para generar
las varias interrupciones, cada fuente de interrupción tiene su(s) propio(s) flag(s)
de petición localizado en un registro de función especial (ejemplo TCON, IRCON, S0CON,
S1CON). Proporciona el enlace entre los periféricos o fuentes externas con las
condiciones de las interrupciones, el flag dedicado a la petición es puesto a A1",
si la interrupción está permitida o no. Por ejemplo, cada vez que hay overflow del
timer 0 se pone a A1" su correspondiente flag de petición de interrupción TF0. Si
ya estaba a uno A1", se deja igual. Pero esto no quiere decir que la interrupción
necesariamente sea servida.
Ahora cada petición de interrupción tiene su correspondiente flag que puede ser
permitido o prohibido individualmente mediante los bits de los SFRs, IEN0, IEN1, IEN2.
Esto determina si la interrupción actual será realizada. Además, hay un bit global
de permiso para todas las interrupciones que cuando se pone a cero A0", prohíbe todas
las interrupciones (deshabilita) independientemente del estado de sus bits
individuales.

13.1 TABLA DE VECTORES DE INTERRUPCIÓN

La lógica subyacente en la disposición de los vectores de interrupción es la


siguiente:
La primera instrucción que se ejecuta después de una inicialización (RESET=1)
es la que se encuentra en la dirección $0000 de la memoria de programa. El fabricante
ha reservado 3 bytes para esta primera instrucción, valor que corresponde a una
instrucción de salto del tipo <<LJMP dir>>.
Por ello, el primer emplazamiento reservado a las subrutinas que deben atender
las diferentes interrupciones del programa principal se haya situado en la dirección
$0003. Las direcciones correspondientes a los vectores de interrupción están
separadas entre sí ocho bytes. En la mayoría de los casos, este espacio sólo es
suficiente para contener el comienzo de la subrutina de servicio de la interrupción.
La tabla siguiente resume las fuentes de interrupción, el indicador correspondiente
y la dirección del vector que corresponde a cada fuente.

DIRECCIÓN DE LOS VECTORES DE INTERRUPCIÓN


FUENTE DE INTERRUPCIÓN INDICADOR DIRECCIÓN DEL VECTOR
INT0 IE0 $0003 (RAM TM-311 $8003)
TIMER 0 TF0 $000B (RAM TM-311 $800B)
INT1 IE1 $0013 (RAM TM-311 $8013)
TIMER 1 TF1 $001B (RAM TM-311 $801B)
PUERTO SERIE RI0+TI0 $0023 (RAM TM-311 $8023)
TIMER 2 (µC 8052) TF2+EXF2 $002B (RAM TM-311 $802B)
IADC COVERSOR A/D IADC $0043 (RAM TM-311 $8043)
IEX2 INTERRUPCIÓN IEX2 $004B (RAM TM-311 $804B)
IEX3 IEX3 $0053 (RAM TM-311 $8053)
IEX4 IEX4 $005B (RAM TM-311 $805B)
IEX5 IEX5 $0063 (RAM TM-311 $8063)
IEX6 IEX6 $006B (RAM TM-311 $806B)
CANAL SERIE 1 RI1/TI1 $0083 (RAM TM-311 $8083)
COMPARE TIMER OVERFLOW CTF $009B (RAM TM-311 $809B)
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 30

Los primeros 256 bytes de la memoria EPROM del TM-311, posiciones $0000 a $00FF, están
configurados para que contengan los vectores de interrupción adecuados. El sistema
está diseñado para que el desarrollo de aplicaciones independientes sea lo más simple
posible, por ello todos los vectores de interrupción (INT0, TIMER0, INT1, TIMER1,
SERIAL, TIMER2, IADC, IEX2, IEX3, IEX4, IEX5 e IEX6) apuntan 32768 ($8000) posiciones
más arriba. Por ejemplo, cada vez que se produzca una interrupción del temporizador
(0) cero el control del programa será transferido a la CPU a la dirección $0003, donde
hallará una instrucción que lo transferirá $8000 posiciones más arriba, esto es a
la dirección $8003 (RAM TM-311 $8003). Algo similar sucede con el resto de vectores
de interrupción.

13.2 HABILITACIÓN Y PRIORIDAD DE LAS INTERRUPCIONES

Después de la inicialización del microcontrolador, todas las fuentes de


interrupción están inhibidas debido a que se han puesto a cero los bits del registro
IExx. Para poder utilizar el mecanismo de interrupciones, es necesario, por tanto,
comenzar por habilitar la o las fuentes de interrupción empleadas por la aplicación.
Este registro forma parte de la zona de la RAM interna cuyos bits son
direccionables individualmente, así que es posible con una única instrucción
modificar uno solo de esos bits sin modificar el estado de los otros. Esta posibilidad
justifica el papel del bit EAL. En efecto, cualquiera que sea el estado de los otros
siete bits, es posible suspender completamente la atención de interrupciones poniendo
EAL a cero (0). Posteriormente la puesta a uno de este mismo bit permite de nuevo
la atención de las interrupciones de acuerdo con el estado de los otros siete (7)
bits.

REGISTRO DE HABILITACIÓN DE INTERRUPCIONES (TM311 -> IEN0)(0A8H)

EAL WDT ET2 ES0 ET1 EX1 ET0 EX0

POSICIÓN SÍMBOLO FUNCIÓN (Habilitan la interrupción con A1")

IEN0.7 EAL Inhibición de todas las INT.

IEN0.6 - (WDT) Sin función en 8051 y 8052

IEN0.5 ET2 INT. del TIMER 2 (overflow)

IEN0.4 ES0 INT. del puerto SERIE CERO (0)

IEN0.3 ET1 INT. del TIMER 1

IEN0.2 EX1 INT. externa INT1 (uno)

IEN0.1 ET0 INT. del TIMER 0 (overflow)

IEN0.0 EX0 INT. externa INT0 (cero)

REGISTRO DE HABILITACIÓN DE INTERRUPCIONES (TM311 -> IEN1)(0B8H)

EXEN2 SWDT EX6 EX5 EX4 EX3 EX2 EADC

POSICIÓN SÍMBOLO FUNCIÓN (Habilitan la interrupción con A1")

IEN1.7 EXEN2 Interrupción externa de recarga TIMER 2

IEN1.6 - (WDT) Sin función en 8051 y 8052

IEN1.5 EX6 INT.externa 6/INT.captura/comparación 0

IEN1.4 EX5 INT.externa 5/INT.captura/comparación 1

IEN1.3 EX4 INT.externa 4/INT.captura/comparación 2

IEN1.2 EX3 INT.externa 3/INT.captura/comparación 3

IEN1.1 EX2 INT.externa 2/INT.captura/comparación 4

IEN1.0 EADC INT. del conversor A/D


APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 31

13.2.1 PRIORIDAD DE LAS INTERRUPCIONES

Es importante saber que interrupción, si hay más de un tipo de interrupción


habilitada, sería atendida en caso de ser detectadas dos o más en el mismo ciclo
máquina.
Si todas las interrupciones se consideran del mismo nivel de prioridad, la
posición de los bits de habilitación de las interrupciones dentro del registro IExx
define un orden de atención intrínseco al propio procesador. En efecto, el muestreo
de las peticiones de interrupción se hace según una secuencia de comprobación que
define una jerarquía implícita para la atención de las peticiones de interrupción
simultaneas. Esta jerarquía se corresponde con el orden de la tabla de vectores y
se muestra a continuación:

ORDEN FUENTE

1 IEO PRIORIDAD MÁS ALTA


2 TFO
3 IE1
4 TF1
5 RI0+TI0
6 TF2+EXF2 PRIORIDAD MÁS BAJA

Se puede modificar el nivel de prioridad implícito de las seis fuentes de


interrupción atribuyendo a una o varias de las mismas un nivel más alto de prioridad.
Esta modificación se realiza programando los bits del registro IPx (Interrupt
Priority). La puesta a 1 de un bit de este registro da una prioridad mayor a las
peticiones provenientes de la fuente correspondiente que a las peticiones de fuentes
que permanecen en el nivel inicial. En caso de que dos indicadores de interrupción
con prioridad alta se activen a la vez, la jerarquía implícita determinada por la
secuencia de comprobación es la que determina el orden en que se atienden estas dos
interrupciones.

REGISTRO DE PRIORIDAD DE INTERRUPCIONES (IP0)(0A9H)


- - PT2 PS PT1 PX1 PT0 PX0

POSICIÓN SÍMBOLO FUNCIÓN (Prioridad = A1")

IP0.7 - Reservado

IP0.6 - Reservado

IP0.5 PT2 Prioridad de INTERRUPCIÓN del TIMER 2

IP0.4 PS Prioridad de INTERRUPCIÓN del puerto SERIE

IP0.3 PT1 Prioridad de INTERRUPCIÓN del TIMER 1

IP0.2 PX1 Prioridad de INTERRUPCIÓN externa INT1

IP0.1 PT0 Prioridad de INTERRUPCIÓN del TIMER 0

IP0.0 PX0 Prioridad de INTERRUPCIÓN externa INT0

NOTA: El registro IP0 define las prioridades para el registro IEN0 y el registro IP1(0B9H)
define las prioridades para el registro IEN1. Para acceder a los bits de estos registros
con los símbolos hay que definirlos previamente en el fichero 80537.ASM o en la cabecera
del programa (PX0 EQU $0A9.0), de lo contrario hay que acceder con la notación IP0.0. (En
general IPy.x)

13.3 INTERRUPCIONES EXTERNAS INT0 E INT1

Utilizando dos líneas del puerto P3, es posible disponer de dos fuentes de
interrupción externa. Se trata de las líneas P3.2 y P3.3 cuyas funciones secundarias
son, respectivamente, INT0 e INT1. Se puede definir que ocurra una interrupción
externa por un cambio de estado lógico en una de estas dos líneas (interrupción por
nivel) o por la detección de un cambio de estado (interrupción por flanco negativo
o de bajada). La elección se realiza programando los dos bits IT0 e IT1 del registro
TCON.
Si el bit IT0 (o IT1) se pone a 1, la interrupción ocurrirá por un cambio de estado
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 32

de 1 a 0 (flanco de bajada). Si el bit IT0 (o IT1) se pone a cero, la interrupción


ocurrirá por la presencia de un estado lógico 0 en la patilla INT0 (o INT1).
Otros dos bits de ese mismo registro reflejan el estado de estas fuentes de
interrupción. Se trata de los bits IE0 e IE1. Estos dos bits se ponen a 1 cuando se
satisface la condición de interrupción (transición o cambio de estado), y, a
continuación, si está habilitada la fuente de interrupción, el contador de programa
toma el valor de la dirección de la subrutina de interrupción de INT0 o INT1.
Después de la bifurcación a esta dirección, el bit IE0 (o IE1) se vuelve a poner
a (0) cero automáticamente cuando el evento detectado es un flanco de bajada. Por
el contrario, si el evento detectado es un cambio de estado lógico, el indicador IEO
(o IE1) permanece a 1 y debe ser puesto a (0) cero por programa.

13.4 EJECUCIÓN DE UNA INTERRUPCIÓN

Cuando el procesador acepta una petición de interrupción, se ejecuta un salto


automático a la subrutina de servicio correspondiente. Antes de ejecutar el salto
a la subrutina, el procesador guarda automáticamente en la PILA la dirección de la
siguiente instrucción que debía ser ejecutada. Luego pone a (1) uno un indicador
interno que señala que está en curso una interrupción y, finalmente, ejecuta el salto.
Una subrutina de servicio de interrupción debe terminar obligatoriamente con una
instrucción RETI, que es una instrucción especial de retorno.
- Instrucción RETI, recupera de la PILA la dirección en la que debe continuar el
programa interrumpido, y actualiza el indicador interno, permitiendo así que se pueda
atender otra interrupción del mismo nivel.

REGISTRO DE FUNCIÓN ESPECIAL <<TCON>> (dirección $88)


TF1 - TF0 - IE1 IT1 IE0 IT0
BIT FUNCIÓN

IT0 Bit de control de la interrupción 0. Activado y desactivado por software


para indicar si las interrupciones externas deben producirse por
transición negativa o por nivel bajo.

IE0 Bandera de la interrupción 0. Es activada por el hardware cuando la


interrupción externa detecta una transición. Es limpiada por el hardware
cuando se procesa la interrupción.

IT1 Bit de control de la interrupción 1. Activado y desactivado por software


para indicar si las interrupciones externas deben producirse por
transición negativa o por nivel bajo.

IE1 Bandera de la interrupción 1. Es activada por el hardware cuando la


interrupción externa detecta una transición. Es limpiada por el hardware
cuando se procesa la interrupción.

TF0 Bandera de rebosamiento del temporizador 0. Activada por el hardware


cuando el contador del temporizador 0 sufre un rebosamiento. Desactivada
por el hardware cuando el procesador llama al vector.

TF1 Bandera de rebosamiento del temporizador 1. Activada por el hardware


cuando el contador del temporizador 1 sufre un rebosamiento. Desactivada
por el hardware cuando el procesador llama al vector.

13.5 ATENCIÓN DE UNA PETICIÓN DE INTERRUPCIÓN

Los indicadores de interrupción se muestrean durante el período S5P2 de cada


ciclo de máquina. La muestra se analiza durante el siguiente ciclo de máquina. (Para
el Timer 2, especifico del 8052, el indicador TF2 se activa durante el período S5P2
del ciclo en el que el contador se desborda y la detección y el tratamiento de la
petición se realizan en este mismo ciclo de máquina).
Si en el instante S5P2 de un ciclo de máquina está activado alguno de los
indicadores, al final del siguiente ciclo (ciclo de análisis), el sistema de
interrupciones genera una llamada a una subrutina cuya dirección es la adecuada a
la fuente a la que corresponde el indicador. Esta llamada de subrutina se bloquea
si se detecta una de las siguientes condiciones:
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 33

1. Se está atendiendo ya una interrupción del mismo nivel de prioridad o de nivel


superior.
2. El ciclo de máquina en el que se realiza el análisis no es el último de la instrucción
que se está ejecutando.
3. La instrucción que se está ejecutando es una orden de retorno de subrutina de
interrupción (RETI) o una instrucción de escritura en uno de los registros IExx o
IPx.

La condición 3 garantiza que se ejecuta al menos una instrucción después de


la modificación de los registros que controlan el mecanismo de interrupciones y
después de finalizar un tratamiento de interrupción. Una nueva petición de
interrupción sólo se atenderá y tratará después de la ejecución de esta instrucción
adicional.
En caso de un bloqueo del proceso de interrupción por una de las tres condiciones
citadas, )qué ocurre con la petición no atendida?

Dado que el muestreo de los indicadores de interrupción se repite en cada ciclo


máquina, la nueva muestra reemplaza a la antigua y, si la petición de interrupción
todavía está presente, será tenida en cuenta en el siguiente ciclo de máquina. En
caso de que la petición de interrupción provenga de una fuente interna (puerto serie,
timer,...) El indicador aún estará activo, bien porque debe ser desactivado por
programa, o bien porque se vuelve a poner a cero en el momento del salto a la subrutina
de servicio de la interrupción. Por tanto, la petición de interrupción se tendrá en
cuenta de nuevo inmediatamente después del bloqueo, (salvo que el usuario haya puesto
el indicador a cero por programa!

Por el contrario, en el caso de una interrupción proveniente de una fuente


externa programada para interrumpir por nivel, es posible que la petición de
interrupción nunca sea atendida. En efecto, al bloquearse la petición es preciso que
el cambio de estado dure hasta el próximo muestreo, un ciclo de máquina más tarde,
para que un nuevo análisis conduzca a la ejecución de la petición.

Cuando el procesador acepta la petición de interrupción, se ejecuta un salto


automático a la subrutina apropiada. Eventualmente, en este momento es cuando se
vuelve a poner a cero el indicador de petición de interrupción.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 34

EJEMPLO:

;***********************************************************
; * Listado INT_BDEC.asm
; * Programa que CUENTA EN BCD NATURAL O EN BINARIO NATURAL
; * EN FUNCIÓN DE UNA INTERRUPCIÓN EXTERNA POR LA LÍNEA INT0
; ***********************************************************

USES 80537
ORG 8000H

LJMP INICIO

LEDS equ P4 ;Define el puerto del LED

;**********************VECTOR INTERRUPCIÓN INT0******************************


ORG 8003H

LJMP CUENTA_BIN
;VECTOR de la SUBRUTINA de la INTERRUPCION INT0.
;Esta instrucción esta ubicada en la posición de
;memoria $8003
;****************************************************************************

SETB IEN0.7 ;habilita las interrupciones (EAL= 1)


SETB IEN0.0 ;habilita la interrupcion externa INT0 (EX0= 1)
SETB TCON.0 ;ITO= 1 para que INTO se active por FLANCO

CUENTA_BCD:

MOV A,#$00 ;pon el acumulador a cero


MOV R0,#$02 ;carga R0 con el dato 02H

INICIO_BCD:

mov LEDS,A ;saca por el puerto P4 el contenido


;del acumulador
DELAYBCD1: ;pierde un poco de tiempo

MOV DPTR,#$FFFF ;carga DPTR Con el dato FFFFH

DELAYBCD2:

djnz DPL, DELAYBCD2 ;Repite bucle para byte bajo


djnz DPH, DELAYBCD2 ;Repite bucle para byte alto
DJNZ R0, DELAYBCD1 ;repite el bucle entero de nuevo
ADD A,#$01 ;suma uno al acumulador
DA A ;haz el ajuste decimal del acumulador
MOV R0,#$02
Ljmp inicio_BCD ;Repite el subprograma CUENTA_BCD

CUENTA_BIN:
PUSH ACC
PUSH $00 ;PUSH R0
mov A,#$00 ;Carga 0 en el acumulador

INICIO_BIN:
mov LEDS,A
MOV R0,#$02

DELAY1: ;Pierde un poco de tiempo


MOV DPTR,#$F1FF
DELAY2:
djnz DPL, DELAY2 ;Repite bucle para byte bajo
djnz DPH, DELAY2 ;Repite bucle para byte alto
DJNZ R0, DELAY1
INC A
CJNE A,#$00, inicio_BIN ;Repite el subprograma CUENTA_BIN
POP $00 ;POP R0
POP ACC
RETI ;retorno de la interrupción INT0
END ;FIN DEL PROGRAMA
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 35

14. LOS TEMPORIZADORES (TIMERS)

El 80C537 tiene temporizadores y contadores de 16 bits de uso general: timer


cero, timer uno, timer dos y el timer comparador. Los timer/contador cero y uno son
totalmente compatibles con los timers cero y uno del 8051.

14.1 TIMER 0 Y TIMER 1

Cada timer está dotado de un contador de 16 bits accesible en forma de dos


registros de 8 bits que son parte de los registros con función especial:
- TH0 (byte alto) y TL0 (byte bajo) para el timer 0
- TH1 (byte alto) y TL1 (byte bajo) para el timer 1
Las funciones de estos dos timers son configurables mediante los dos registros
especiales de función: TMOD y TCON. Tienen dos posibilidades de configuración, como
temporizadores o como contadores de eventos:

- TEMPORIZADOR. Bajo el funcionamiento de temporizador el registro de temporizador


es incrementado en una unidad cada ciclo de máquina. Dado que un ciclo de máquina
consiste en 12 períodos de oscilador, la velocidad del contador es 1/12 de la
frecuencia de oscilador, lo que equivale a 1 MHz para una frecuencia del oscilador
de 12 MHz.
- CONTADOR. Bajo el funcionamiento de contador el registro es incrementado en los
flancos descendentes (cada vez que el valor pasa de 1 a 0) en las patillas de entrada
T0 y T1 (funciones alternativas a P3.4 y P3.5). En este modo la entrada externa es
muestreada durante S5P2 de cada ciclo de máquina. Cuando en un ciclo la entrada está
a nivel alto, y en el siguiente ciclo está a nivel bajo se incrementa el registro
del temporizador en una unidad durante S3P1 del ciclo siguiente al cual se detectó
la transición.
Dado que reconocer una transición de 1 a 0 requiere de dos ciclos de reloj (24
periodos de oscilación) la velocidad máxima del contador en este modo es 1/24 de la
frecuencia de reloj. Por ejemplo, para una frecuencia de reloj de 12 MHz, la velocidad
máxima de muestreo de un contador de eventos es de 500 KHz. No hay restricciones en
el ciclo de trabajo de la señal externa de entrada, pero para asegurar que el nivel
obtenido se muestrea al menos una vez antes de que cambie, debe ser sostenido al menos
durante todo un ciclo de máquina.

Además de la posibilidad de elección entre estas dos funciones, los timers 0


y 1 disponen de cuatro modos de funcionamiento diferentes, que permiten modificar
el formato del registro de conteo o habilitar la recarga automática de un valor de
consigna. El timer 1 puede hacer las veces de generador de frecuencias del interfaz
de comunicación serie.
La configuración de un timer (elección de su función y de su modo) se efectúa
mediante la programación del registro de control TMOD.
REGISTRO DE FUNCIÓN ESPECIAL <<TMOD>> (dirección $89)
TIMER 1 TIMER 0
GATE / M1 M0 GATE / M1 M0

BIT FUNCIÓN

GATE GATE=1, el TIMER X está habilitado solamente cuando su patilla de entrada INTx está a uno
(1) y el bit TRx del registro TCON está a uno (1).
GATE= 0, el TIMER X está habilitado si TRx= 1.

= 0, el TIMER actúa como TEMPORIZADOR


/ = 1, el TIMER actúa como CONTADOR de los eventos presentes en la entrada Tx.

M1 M0 MODO DE FUNCIONAMIENTO

0 0 - Contador/temporizador de 8 bits. THx opera como como timer/contador de 8 bits. TLx sirve
como preescala de 5 bits.

0 1 - Contador/temporizador de 16 bits. THx y TLx están en cascada. No hay preescala

1 0 - Contador/temporizador de 8 bits con recarga automática. El contenido de THx se carga en


TLx cuando éste llega a cero, es decir cada vez que hay overflow.

1 1 - TIMER 0: el registro TL0 actúa como contador/temporizador de 8 bits controlado por los
bits de control del TIMER 0. Por otra parte, TH0 es configurado como temporizador de 8 bits
controlado por los bits de control del TIMER 1.
TIMER 1: el contador permanece detenido.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 36

REGISTRO DE FUNCIÓN ESPECIAL <<TCON>> (dirección $88)


TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

BIT FUNCIÓN

IT0 Bit de control de la interrupción 0 (INT0). Activado y desactivado por software para indicar
si las interrupciones externas deben producirse por transición negativa o por nivel bajo.
IT0=0 detección por nivel bajo; IT0= 1 detección por flanco negativo.

IE0 Bandera de la interrupción 0 (INT0). Es activada por el hardware cuando la interrupción


externa detecta una transición. Es limpiada por el hardware cuando se procesa la
interrupción.

IT1 Bit de control de la interrupción 1 (INT1). Activado y desactivado por software para indicar
si las interrupciones externas deben producirse por transición negativa o por nivel bajo.
IT1=0 detección por nivel bajo; IT1= 1 detección por flanco negativo.

IE1 Bandera de la interrupción 1 (INT1). Es activada por el hardware cuando la interrupción


externa detecta una transición. Es limpiada por el hardware cuando se procesa la
interrupción.

TR0 Bit de control de arranque del TIMER 0. Se debe poner a 1 por software para arrancar el
TIMER y a 0 para pararlo.

TF0 Bandera (flag) de rebosamiento del temporizador 0. Activada por el hardware (puesta a 1)
cuando el contador del temporizador 0 sufre un rebosamiento. Desactivada por el hardware
(puesta a 0) cuando el procesador llama al vector de interrupción.

TR1 Bit de control de arranque del TIMER 1. Se debe poner a 1 por software para arrancar el
TIMER y a 0 para pararlo.

TF1 Bandera (flag) de rebosamiento del temporizador 1. Activada por el hardware (puesta a 1)
cuando el contador del temporizador 1 sufre un rebosamiento. Desactivada por el hardware
(puesta a 0) cuando el procesador llama al vector de interrupción.

14.2 MODOS DE OPERACIÓN (M1, M0)

El modo se selecciona fijando los bits M0 y M1 del registro TMOD.

14.2.1 MODO 0

En este modo actúa como temporizador/contador de 8 bits precedido por un


predivisor de 32. El registro del timer se configura como un registro de 13 bits:
5 bits en la parte baja (TLx) para el predivisor y 8 bits en la parte alta (THx) para
la cuenta. Cuando el timer llega a cero (0), por desbordamiento, el indicador de
interrupción TFx se pone a uno (1). Este indicador solicita una interrupción de la
CPU, la cual, si está habilitada, llevara al microcontrolador a la subrutina que
depende de esa interrupción. Una vez atendida la interrupción, el indicador TFx se
vuelve a poner a cero (0) automáticamente por hardware.
La entrada del contador está habilitada cuando TRx=1 y cuando GATE=0 o INTx=1
(activando GATE=1 permite controlar el temporizador a través de la entrada externa
INTx para facilitar la medida de los anchos de pulso).

14.2.2 MODO 1

El modo 1 es idéntico al modo 0, excepto que el registro del contador emplea


su capacidad completa (16 bits) sin predivisor.

14.2.3 MODO 2

Este modo configura el registro del temporizador como un contador de 8 bits


con recarga automática. La parte baja TLx sirve de contador. Cuando este contador
llega a cero por desbordamiento, el indicador TFx se pone a uno (1) y el contenido
de THx se carga en el contador TLx. El contenido de THx, que se le da un valor por
programa, no se modifica.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 37

14.2.4 MODO 3

En modo 3, el timer 1 está bloqueado como si su bit de control TR1 estuviera


a cero (0).
Por el contrario, en el caso del timer 0, los registros TL0 y TH0 se configuran
como dos contadores de 8 bits. El contador TL0 utiliza la lógica de control del timer
0( / ,GATE, TR0, INT0 y TF0), mientras que el contador TH0 tiene la función fija de
C /T

temporizador controlado por TR1, es un contador de ciclos de máquina. El contador


TH0 actúa sobre el indicador TF1 y toma, en consecuencia, la función de interrupción
del timer 1. Es decir, TH0 está cerrado en modo timer (contando ciclos máquina) y
toma posesión del uso de TR1 y TF1 del timer 1. De este modo, ahora TH0 controla la
interrupción del timer 1.
El modo 3 está dirigido a las aplicaciones que necesitan un contador o
temporizador adicional de 8 bits. Con el timer 0 en modo 3 el temporizador 1 puede
ser activado o desactivado entrando o saliendo de su modo 3, con lo que se obtiene
un timer de 16 bits (el timer 1) y dos timers de 8 bits. Esta característica sólo
es utilizable en aplicaciones en las que el timer 1 no requiera su recurso de
interrupción, puesto que en este caso su indicador (TF1) está unido a la salida del
contador de 8 bits en que se convierte TH0.

EJEMPLO:

;******************************************************************
; LISTADO: RLO_TIM0.ASM
; PROGRAMA QUE SIMULA UN RELOJ DIGITAL UTILIZANDO EL TIMER 0
; DEL MICROCONTROLADOR
;*****************************************************************
; EJEMPLO PARA LA UTILIZACION DE LOS TIMERS (TIMER 0 EN MODO 1)
;******************************************************************

USES 80537
ORG 8000H

LJMP INICIO
;*******************VECTOR INT. TIMER_0******************************
ORG 800BH

LJMP RELOJ_SEG ;salta al tratamiento de la subrutina RELOJ


;*********************************************************************

SEGUNDOS equ P4 ;registro asociado al puerto P4 -> R1 (seg)


MINUTOS equ P5 ;registro asociado al puerto P5 -> R2 (min)
HORAS equ P1 ;registro asociado al puerto P1 -> R3 (horas)

INICIO:
MOV R1, #$00 ;inicializa los segundos
MOV R2, #$00 ;inicializa los minutos
MOV R3, #$00 ;inicializa las horas
SETB IEN0.7 ;habilita las interrupciones
SETB IEN0.1 ;habilita la interrupción4n del TIMER 0
MOV TMOD, #$01 ;programa el TIMER 0 en MODO 1
MOV TCON, #$10 ;activa el temporizador del TIMER 0
MOV R0, #$00 ;inicializa contador de desbordamientos
;para ver su evolución4n con el depurador
ESP_INT:
MOV R5, TL0 ;los registros R5 y R6 los utilizamos para
MOV R6, TH0 ;ver con el depurador la evolución4n de los
AJMP ESP_INT ;bytes ALTO (TH0) y BAJO (TL0) del TIMER 0
;aquí entretenemos al microcontrolador
;esperando que se produzca una interrupción4n
;por desbordamiento del contador del TIMER 0
;En vez de esto podríamos estar ejecutando
;otro programa cualquiera, por ejemplo el
;que ya hicimos de contar en BCD NATURAL.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 38

RELOJ_SEG: ;SUBRUTINA QUE CUENTA LOS DESBORDAMIENTOS DEL TIMER 1


PUSH $04 ;salva en la PILA el registro R5
PUSH $05 ;salva en la PILA el registro R6
INC R0 ;incrementa el contador de desbordamientos
CJNE R0, #$10,REGRESA ;comparamos R0 con $10 (16 decimal)
;para esperar a que pase un (1) segundo
;cuando suceda esto incrementamos los
;segundos. (1 seg= 1.000.000 de ciclos m_quina
;a una frecuencia de reloj de 12 MHz)
MOV R0, #$00 ;inicializamos R0 para la cuenta del
;pr4ximo segundo
ACALL SEGUNDO ;llamada a la subrutina SEGUNDO para contar
;los segundos
REGRESA:
POP $05 ;recupera de la PILA el registro R6
POP $04 ;recupera de la PILA el registro R5
RETI ;retorna del servicio de la interrupción4n

SEGUNDO: ;SUBRUTINA QUE CUENTA LOS SEGUNDOS


MOV A, R1
ADD A, #$01
DA A
MOV R1, A
ACALL VISUALIZA ;llamada a la subrutina visualiza para
;ver el RELOJ en tiempo real
CJNE R1, #$60, RET_SEG ;si no llegamos a 60 seg retorna
;para contar otro segundo, en caso
;contrario vete a la subrutina minuto
;para incrementar el minutero
MOV R1, #$00 ;prepara el segundero para volver a cero
ACALL MINUTO ;llamada a la subrutina MINUTO
RET_SEG:
RET ;retorna de la subrutina segundo

MINUTO: ;SUBRUTINA QUE CUENTA LOS MINUTOS


MOV A,R2 ;pasa los minutos al acumulador
ADD A, #$01 ;suma uno a los minutos
DA A ;haz el ajuste decimal
MOV R2, A ;pasa los minutos al registro R2
ACALL VISUALIZA ;idem que la subrutina segundo, solo que
CJNE R2, #$60, RET_MIN ;ahora para los minutos
MOV R2, #$00
ACALL HORA
RET_MIN:
RET

HORA: ;SUBRUTINA QUE CUENTA LAS HORAS


MOV A,R3 ;pasa las horas al acumulador
ADD A, #$01 ;suma uno a las horas
DA A ;haz el ajuste decimal
MOV R3, A ;pasa las horas al registro R3
ACALL VISUALIZA ;idem que la subrutina segundo, solo
CJNE R3, #$24, RET_HOR ;que ahora para las horas
MOV R3, #$00
RET_HOR:
RET

VISUALIZA:
MOV SEGUNDOS, R1
MOV MINUTOS, R2
MOV HORAS, R3
RET
END
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 39

15. CONVERSOR ANALÓGICO DIGITAL

Los puertos 7 y 8 del µC 80C537 están disponibles sólo como puertos de entrada
y están previstos para dos funciones: entradas digitales y entradas analógicas.
Cuando son usados como entradas digitales, los SFR correspondientes P7 y P8
contienen el valor digital aplicado a las líneas del puerto siete (8 bits) y el puerto
ocho (4 bits). Cuando se usan como entradas analógicas, el canal analógico deseado
se selecciona mediante un campo de tres bits en el SFR ADCON0 o un campo de cuatro
bits en el SFR ADCON1, como se describe más adelante. Es posible leer estos puertos
al mismo tiempo como entradas digitales y como entradas analógicas, esto es, dedicar
ciertas señales a entradas digitales y ciertas otras a entradas analógicas. Para ello
deberá pararse el conversor analógico digital cada vez que se dese realizar una
lectura digital.
Si un valor digital tiene que ser leído, los niveles de voltaje tendrían que
ser mantenidos dentro de las especificaciones de voltaje de entrada (VIL/VIH). Como
P7 y P8 no son registros direccionables bit a bit, todas las líneas de entrada de
P7 y P8 son leídas al mismo tiempo por las instrucciones de byte.
Para poder garantizar una conversión A/D de alta calidad, las líneas de entrada
digital del puerto P7 y puerto P8, no deberían conmutarse mientras un pin de puerto
vecino está ejecutando una conversión A/D.

15.1 CARACTERÍSTICAS DEL CONVERSOR A/D

El µC 80C537 nos proporciona un convertidor A/D con las siguientes


características:
- 12 canales de entrada multiplexadas, las cuales pueden usarse como entradas
digitales.
- Tensión interna de referencia programable (cada 16 escalones) gracias a un array
de resistencias.
- 8 bits de resolución dentro de la escala de tensión de selección de referencia.
- Tiempo de conversión de 13 µseg (incluyendo tiempo de muestreo) con una
frecuencia de oscilador de 12 MHz.
- Selección externa o interna para empezar la conversión.
- Petición de interrupción después de cada conversión.

Para la conversión se utiliza el método de aproximaciones sucesivas. Los


voltajes de referencia externos deben ser fijos y de acuerdo a las especificaciones
(no superar la tensión de alimentación). Los voltajes de referencia internos pueden
variarse para reducir el rango de valores de referencia del convertidor A/D con el
fin de obtener una mayor resolución.

15.2 FUNCIÓN Y CONTROL DEL CONVERTIDOR A/D

El registro de función especial ADCON0 se usa para asignar el modo de operación,


chequear el estado y seleccionar una de las entradas analógicas de los ocho canales
del puerto P7. El registro de función especial ADCON1 permite seleccionar uno de los
doce canales de entrada, los ocho del puerto P7 y los cuatro del puerto P8.

ADCON0 (0D8H) BD CLK ADEX BSY ADM MX2 MX1 MX0

ADCON1 (0DCH) - - - - MX3 MX2 MX1 MX0

BIT FUNCIÓN

MX3,MX2,MX1,MX0 Selecciona uno de los doce canales del conversor A/D

ADM Modo de conversión A/D. Si ADM=1 se selecciona modo de conversión continua. Si ADM=0,
el convertidor se para después de cada conversión.

BSY Flag de Busy (ocupado). Esta bandera se pone a uno para indicar que se está realizando
una conversión, y a cero para indicar que no hay ninguna conversión en curso. (Es
activada por hardware)

ADEX Principio de conversión interna/externa. Cuando está a uno, está permitida la


conversión por el pin P6.0 (ADST).
BD y CLK No son utilizados por el convertidor A/D.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 40

Mediante los bits MX0 al MX3 se selecciona el canal. Los bits MX0 al MX2 pueden
leerse o escribirse indistintamente del ADCON0 o del ADCON1.

MX3 MX2 MX1 MX0 CANAL Como podemos observar los bits MX2 al MX0
PIN
están representados en los dos registros de
0 0 0 0 Entrada AN0 P7.0
función especial ADCON0 y ADCON1. En todo
0 0 0 1 Entrada AN1 P7.1 caso, estos bits representan lo mismo por lo
que tiene el mismo efecto acceder a ellos por
0 0 1 0 Entrada AN2 P7.2 ADCON0 o ADCON1. Esto se ha hecho para
mantener la compatibilidad del software con
0 0 1 1 Entrada AN3 P7.3
el 80C515. Este dispositivo tiene solamente
0 1 0 0 Entrada AN4 P7.4 ocho canales de entrada que son
seleccionados por MX0 al MX2 del registro
0 1 0 1 Entrada AN5 P7.5 ADCON0. Sin embargo, el 80C537 tiene doce
canales de entrada analógicos, por lo que
0 1 1 0 Entrada AN6 P7.6
para seleccionarlos todos se necesitan 4
0 1 1 1 Entrada AN7 P7.7 bits, de ahí la necesidad de utilizar una
variable más (MX3) y un nuevo registro de
1 X 0 0 Entrada AN8 P8.0 función especial ADCON1.
Si las 12 entradas multiplexadas son
1 X 0 1 Entrada AN9 P8.1
necesarias el registro ADCON1 tiene que
1 X 1 0 Entrada AN10 P8.2 utilizarse. Este contiene un campo de cuatro
bits para seleccionar una de las doce
1 X 1 1 Entrada AN11 P8.3 entradas analógicas, las ocho del puerto P7
y cuatro del puerto P8. Así pues, hay dos
métodos de selección del canal para el puerto P7 y no tiene importancia cual se use:
si un nuevo canal se selecciona en ADCON1 el cambio se hace automáticamente en los
correspondientes bits MX0 a MX2 en el ADCON0 y viceversa. Si el bit MX3 está a A1",
las entradas adicionales analógicas para el puerto P8 se utilizan, MX0 y MX1
determinan que canal del puerto P8 queda seleccionado.

El registro de función especial ADDAT contiene el resultado de 8 bits de la


última conversión. El resultado, independientemente de las veces que se lea se
mantiene hasta que el convertidor analógico digital haya terminado la siguiente
conversión, momento en el que vuelve a escribir en el registro ADDAT.

ADDAT (0D9H) Este registro contiene el resultado de la conversión

15.2.1 INICIO DE LA CONVERSIÓN

Cuando una instrucción escribe en el registro de función especial DAPR, se


dispara el inicio interno de conversión (ADEX=0). El procedimiento de inicio es
independiente del valor que se escribe en DAPR. Esto es, el valor de DAPR determina
que referencia interna de voltaje se utiliza para la conversión. Cuando la conversión
simple está seleccionada (ADM=0) solamente se realiza una conversión. Si está en modo
continuo (ADM=1) después de completar una conversión se dispara una nueva conversión
hasta que ADM se ponga a cero.
Cuando está seleccionado el inicio de conversión externo, al escribir en DAPR
no se inicia la conversión; en este caso, la conversión empezará cuando se detecte
un flanco de bajada del pin P6.0 (ADST). Si está en modo continuo (ADM=1) se realizan
nuevas conversiones automáticamente mientras que el P6.0 (ADST) esté a cero (0). Esto
se hace hasta que P6.0 (ADST) tenga un nivel alto; en este caso la última conversión
se completa.

15.2.2 VOLTAJES DE REFERENCIA

El 80C537 dispone de dos pines en los que se debe poner los voltajes de
referencia del convertidor analógico digital. El pin VVAREF es el voltaje de referencia
superior, mientras que VAGND es el voltaje de referencia inferior. a diferencia de
la mayoría de los convertidores analógicos digitales no solo es posible utilizar estos
voltajes de referencia externos, sino que aquí es posible obtener otros voltajes de
referencia a partir de estos. Para ello la CPU dispone internamente de una matriz
de resistencias con 16 voltajes equidistantes entre VAREF y VAGND. A partir de ella se
obtienen VintAREF y VintAGND que utiliza el convertidor integrado de la CPU. Para
seleccionar estos voltajes se dispone del registro de función especial DAPR. El
voltaje puede ser programado en pasos de 1/16 del voltaje externo (VAREF - VAGND). Los
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 41

4 bits inferiores definen VintAGND y los 4 bits superiores VintAREF.

DAPR (0DA) Programación de VintAREF (bits 4-7) Programación de VintAGND (bits 0-3)

Solo hay unas reglas a seguir, la diferencia entre los voltajes de referencia
internos debe ser un voltio o más. Los voltajes de referencia externos no pueden
salirse del rango de los valores de alimentación. VAREF debe ser mayor que VAGND. En
el caso de que los voltajes de referencia sean 0 y 5 voltios deberá haber por lo menos
4 pasos entre la referencia inferior y la referencia superior.
Los valores de VintAREF y VintAGND vienen dados por las siguientes fórmulas:

V int AGND = VAGND +


DAPR(3-0)
16 • (VAREF -VAGND) Para DAPR(3-0) < CH

V int AREF = VAGND +


DAPR(7-4)
16 • (VAREF -VAGND)
Para DAPR(7-4) > 3H
DAPR(3-0) es el contenido del nibble bajo, y DAPR(7-4) es el contenido del nibble
alto. Cada cuatro bits del nibble se utilizan para programar la referencia interna
de voltaje.
Si DAPR(3-0) o DAPR(4-7) tienen valor cero (0), los voltajes de referencia
internos corresponderán respectivamente a sus voltajes de referencia externos. Si
el voltaje de entrada es mayor al de referencia superior (VAINPUT>VintAREF), el resultado
de la conversión será FFH. Mientras que si es menor que el voltaje de referencia
inferior (VAINPUT<VintAGND) el resultado de la conversión será 00H.
Normalmente los voltajes de referencia externos coinciden con los voltajes de
la alimentación. En tal caso los voltajes de referencia internos quedan establecidos
según muestra la siguiente tabla dependiendo de la combinación binaria del registro
de función especial DAPR.
La programación de la referencia interna
PASO DAPR(3-0) VintAGND vintAREF de voltaje permite el ajuste del rango
DAPR(7-4) interno al rango externo de la entrada
analógica de voltaje, debería usarse para
0 %0000 0.0 5.0
incrementar la resolución de la entrada
1 %0001 0.3125 - analógica del conversor, para empezar una
segunda conversión con una referencia
2 %0010 0.625 - interna de voltaje comprimida con rango
cerrado al valor analógico precisamente
3 %0011 0.9375 -
medido.
4 %0100 1.25 1.25 El voltaje de referencia ha de
satisfacer algunos requerimientos
5 %0101 1.5625 1.5625 relacionados con el nivel de VAGND y VAREF y
la impedancia de salida del suministrador
6 %0110 1.875 1.875
de voltaje:
7 %0111 2.1875 2.1875 - VAREF = VCC " 5%
- VAGND = VSS " 5%
8 %1000 2.5 2.5 - La impedancia de salida de la fuente de
9 %1001 2.8125 2.8125
señal analógica debe ser inferior a 5 KΩ.
Si una entrada analógica tiene un
10 %1010 3.125 3.125 voltaje 0,2V superior a la referencia
superior (VAREF) o 0,2V inferior a la
11 %1011 3.4375 3.4375 referencia inferior (VAGND), se corre el
12 %1100 3.75 3.75
riesgo de que todos los puertos analógicos
se interfieran y den resultados erróneos
13 %1101 - 4.0625 o poco precisos.
Gracias a la posibilidad de
14 %1110 - 4.375 seleccionar voltajes de referencia
15 %1111 - 4.68754
internos, fácilmente se pueden obtener
programaciones de lecturas con una
resolución de hasta 10 bits. Para ello se
realizará una primera lectura con las referencias externas. Con ayuda del valor
obtenido se realizará una segunda lectura con un rango de referencia menor, con lo
cual aumentamos la resolución del convertidor.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 42

15.2.3 TIEMPO DE CONVERSIÓN

Una conversión interna empieza cuando se escribe en el registro de función


especial DAPR (ADEX=0). Una escritura en DAPR comenzará una nueva conversión si una
conversión está en progreso. La conversión empieza en el siguiente ciclo de máquina
y el flag de BSY se pone a A1". Cuando se selecciona el principio de conversión externo
(ADEX=1) la conversión empieza en el ciclo de máquina siguiente al que se ha detectado
el nivel bajo en P6.0(ADST).
El proceso de conversión puede dividirse en tres partes:

TIEMPO DE CARGA (tL)


Durante este tiempo la capacidad de la entrada analógica Ci debe ser cargada
con el nivel del voltaje de entrada analógico. La fuente externa analógica debe
suministrar la suficiente corriente para cargar el condensador de entrada durante
el tiempo de carga. Esto cusa algunas restricciones por la impedancia de la fuente
analógica. Para una aplicación típica el valor de la impedancia debe ser menor que
aproximadamente 5 KΩ.

TIEMPO DE MUESTREO (tS)


Durante este tiempo el condensador interno se conecta al canal analógico de
entrada. El tiempo de muestreo incluye el tiempo de carga descrito anteriormente.
Después de que el tiempo de carga haya pasado, la entrada analógica seleccionada debe
ser constante para el resto de tiempo de muestreo. De otra manera el calibrador interno
del circuito comparador podría resultar afectado y reduciría la exactitud de la
conversión. En aplicaciones típicas el voltaje cambia aproximadamente 200-300 mV en
las entradas durante este tiempo, pero esto no afecta.

TIEMPO DE CONVERSIÓN (tC)


El tiempo de conversión incluye el tiempo de carga y el tiempo de muestreo,
esto es, el tiempo total de conversión. Después de la carga y el muestreo, se realiza
la conversión en sí. En el último ciclo de la conversión el valor es guardado en ADDAT.
En el ciclo anterior la bandera BSY es desactivada.
La interrupción del convertidor analógico digital es generada por el bit IADC
del registro IRCON. IADC es activado algunos ciclos antes de que la conversión se
haya completado. Esto es así para permitir que se pueda leer el dato nada más terminar
la conversión. Esto es, se activa IADC, se genera una interrupción, el programa salta
a ella después de guardar el antiguo PC en la pila, lee el código de la primera
instrucción de la subrutina de interrupción, y si ésta intenta leer ADDAT se
encontrará ya el dato de la conversión. De este modo, se optimiza el tiempo de
respuesta.
Algo similar sucede con BSY, que normalmente se utiliza para leer datos del
conversor por polling, mediante la instrucción JB BSY, rel (espera a que se termine
la conversión, y ejecuta la instrucción que hay después de ella después de que la
conversión esté completada).
En modo continuo después de (tC) se comienza un nuevo tiempo de conversión,
realizándose una lectura cada 13 ciclos máquina.

15.2.4 REGISTROS SFR IMPLICADOS EN LA INTERRUPCIÓN

REGISTRO IEN0 (0A8H)


IEN0 (0A8H) EAL WDT ET2 ES0 ET1 EX1 ET0 EX0
EAL, Permite o prohíbe todas las interrupciones. Si EAL=0, las interrupciones no son
reconocidas. Si EAL=1, cada fuente de interrupción se permite o prohíbe con su propio
bit.

REGISTRO IEN1 (0B8H)


IEN1 (0B8H) EXEN2 SWDT EX6 EX5 EX4 EX3 EX2 EADC

EADC, Permite o prohíbe la interrupción del conversor A/D. Si EADC=0, la interrupción


del conversor A/D se prohíbe.

REGISTRO IRCON (0C0H)


IRCON (0C0H) EXF2 TF2 IEX6 IEX5 IEX4 IEX3 IEX2 IADC

IADC, Bandera de petición de interrupción del conversor A/D. Es puesto a A1" por
hardware al final de la conversión. Debe ponerse a A0" por software.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 43

EJEMPLO:

;*************************************************************
;Este programa muestrea la señal analógica en uno *
;de los terminales analógicos de entrada y la convierte *
;en una combinación binaria de 8 bits. *
;Conversor A/D ANA_DIG.ASM por POLLING (muestreos sucesivos)*
;*************************************************************

USES 80537
ORG 8000H

INICIO:
MOV ADCON0, #00H ;selecciona el modo de conversión
;discontinua (ADM=0) e interna (ADEX=0)
MOV ADCON1, #08H ;muestrea el canal analógico P8.0

REPITE:
MOV DAPR, #00H ;inicia la conversión para VREF= 5V

ESP_CONV:
JB BSY, ESP_CONV ;espera a que la conversión termine

MOV P4, ADDAT ;muestra el resultado de la conversión por P4

SJMP REPITE ;haz una nueva conversión

END

;*************************************************************
;Este programa muestrea la señal analógica en uno *
;de los terminales analógicos de entrada y la convierte *
;en una combinación binaria de 8 bits. *
;Conversor A/D ANAi_DIG.ASM por INTERRUPCIÓN *
;*************************************************************

USES 80537
ORG 8000H

INICIO:
SETB EAL ;habilita las interrupciones
SETB EADC ;habilita la INT. del conversor A/D
MOV ADCON0, #00H ;selecciona el modo de conversión
;discontinua (ADM=0) e interna (ADEX=0)
MOV ADCON1, #08H ;muestrea el canal analógico P8.0
MOV DPH, #0FH

REPITE:
DJNZ DPH, REPITE ;genera un retardo para que de tiempo
;a que se genere la interrupción
MOV DAPR, #00H ;inicia una conversión con VREF= 5V
SJMP REPITE ;haz una nueva conversión

ORG 8043H ;dirección del vector de INT IADC


SUB_INT: ;subrutina de la INT. del conversor A/D
MOV P4, ADDAT ;visualiza la conversión por P4
CLR IADC ;borra la bandera de INT.
MOV DPH, #0FH
RETI

END
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 44

16. COMUNICACIÓN SERIE

El 80C537 tiene dos canales serie los cuales funcionan casi igual en el modo
de operación asíncrono. Los dos canales son full-duplex, es decir, pueden transmitir
y recibir simultáneamente. Los dos tienen buffer de recepción, esto significa que
pueden empezar la recepción de un 21 byte antes de que un byte previo haya sido leído
del registro (sin embargo, si el 1er byte aún no ha sido leído antes de acabar la
recepción del 21 byte, el último byte recibido se perderá). El canal serie 0 del 80C537
es completamente compatible con el canal serie del 8051. El canal serie 1 tiene la
misma funcionalidad en sus modos asíncronos, pero carece del modo síncrono.

16.1 CANAL SERIE 0

La interfaz de comunicación serie es accesible físicamente gracias a la función


secundaria de dos líneas del puerto P3. Se trata del terminal RXD (función secundaria
de P3.0) para recepción y del terminal TXD (segunda función de P3.1) para transmisión.
Los registros de recepción y de transmisión son ambos accesibles en la misma
dirección de la RAM interna, designada por el símbolo S0BUF cuyo valor es 99H. Una
escritura en esta dirección accede al registro de transmisión, mientras que una
lectura del contenido de esta dirección permite extraer el dato del registro de
recepción.

S0BUF (99H) Este registro contiene el dato transmitido o recibido

El control del puerto serie se realiza gracias al registro con función especial
S0CON situado en la dirección 98H.

REGISTRO S0CON (98H)


S0CON (98H) SM0 SM1 SM20 REN0 TB80 RB80 TI0 RI0

SM0 SM1 MODO DESCRIPCIÓN VELOCIDAD (baudios)

0 0 0 Comunicación síncrona FOSC/12

0 1 1 UART 8 bits (comunicación asíncrona) Variable

1 0 2 UART 9 bits (comunicación asíncrona) FOSC/32 o FOSC/64

1 1 3 UART 9 bits (comunicación asíncrona) Variable

>> SM20, habilita la comunicación multiprocesador en los modos 2 y 3. En los modos


2 o 3, si SM20= 1, RI0 no se activará si el noveno bit recibido (RB80) es cero. En
el modo 1, si SM20= 1, RI0 sólo se activará al recibirse un bit de stop válido. En
el modo 0, SM20 debe ser 0.
>> REN0, el programa habilita la recepción serie poniendo este bit a 1. Hay que ponerlo
a cero por programa para deshabilitar la recepción.
>> TB80, es el noveno bit a transmitir en modo 2 ó 3. Se pondrá a 0 o a 1, según se
desee.
>> RB80, en los modos 2 y 3 es el noveno bit recibido. En el modo 1, si SM20= 0, RB80
es el bit de stop recibido. En el modo 0 este bit no se utiliza.
>> TI0, flag de interrupción de la transmisión. Se pone a 1 por hardware al finalizar
la transmisión del octavo bit en el modo 0. En los otros modos, se activa al comenzar
la transmisión del bit de stop. Se ha de borrar (poner a cero) por programa.
>> RI0, flag de interrupción de la recepción. Se pone a 1 por hardware al finalizar
la recepción del octavo bit en el modo 0. En los otros modos, se activa a mitad de
la recepción del bit de stop (salvo la excepción indicada al describir el bit SM20).
Se ha de borrar (poner a cero) por programa.

REGISTRO PCON (87H)


PCON (87H) SM0D PDS IDLS SD GF1 GF0 PDE IDLE
SMOD, cuando SMOD=1, el baud rate del canal serie 0 en modo 1,2 o 3 se dobla.

El puerto serie tiene cuatro modos de funcionamiento: modos 0, 1, 2 y 3 los


cuales se describen a continuación brevemente.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 45

Modo 0. Los datos en formato serie son transmitidos y recibidos a través de la línea
RXD. La salida TXD sirve de señal de reloj. La comunicación, por tanto, es de tipo
half-duplex y síncrona. El puerto serie actúa como un registro de desplazamiento.
El formato de la transferencia es de 8 bits, comenzando la transmisión por el bit
menos significativo (LSB). La velocidad de transmisión es fija e igual a 1/12 de la
frecuencia de reloj.
La transmisión es iniciada por cualquier instrucción que utilice S0BUF como
registro destino. La señal <<escritura en S0BUF>> en el instante S6P2 hace que se
cargue un A1" en la novena posición (bit de stop) del registro de desplazamiento de
transmisión, iniciándose la transmisión. Al finalizar la transmisión se activa el
bit TI0 poniéndose a uno (TI0=1).
La recepción se inicia cuando REN0= 1 y RI0= 0. Al finalizar la recepción se
activa el bit RI0 poniéndose a uno (RI0=1).

Modo 1. Se trata de un formato de transmisión asíncrono de 10 bits, típico de cualquier


UART (Universal Asincronous Receiver Transmiter). La transmisión comienza con el bit
de start (a nivel bajo), seguido de 8 bits de datos (comenzando por el LSB) y
finalizando con un bit de stop (a nivel alto). La transmisión se realiza a través
del terminal TXD y la recepción a través de RXD. En estado de reposo la línea TXD
permanece a nivel alto, hasta que se inicie la transmisión de un nuevo carácter.
El último bit transmitido es el bit de stop, que siempre toma el valor uno (1).
En recepción, el bit de stop se coloca en el bit RB80 del registro S0CON.
La velocidad de trasmisión de este modo de funcionamiento es variable. El valor
se obtiene en función de cómo se programe el temporizador 1 en el 8051 y los
temporizadores 1 y 2 en el 8052 (ya que los desplazamientos en el registro S0BUF se
producen cada vez que el temporizador se desborda). Esta característica permite
velocidades diferentes para recepción y transmisión.
Es habitual emplear el Timer 1 trabajando como temporizador con autorrecarga
(modo 2), en este caso la velocidad en bits/seg se obtiene por la siguiente formula:

2 SMOD Frecuencia del reloj


Velocidad (bits / seg ) = •
32 12 •(256 − TH1)
La siguiente tabla muestra los valores más utilizados, dentro de las
velocidades estándar con las que podemos configurar el puerto serie, utilizando el
temporizador 1.

TIMER 1
Velocidad Foscilador SMOD
(Baudios) (Mhz) (PCON.7) C /T C/T Modo Valor recarga

MODO 0: 1MHz (máx) 12 X X X X


Modo 2: 375 K (máx) 12 1 X X X
Modos 1,3: 62,5 K 12 1 0 2 FFH
Modos 1,3: 19,2 K 11,059 1 0 2 FDH
Modos 1,3: 9,6 K 11,059 0 0 2 FDH
Modos 1,3: 4,8 K 11,059 0 0 2 FAH
Modos 1,3: 2,4 K 11,059 0 0 2 F4H
Modos 1,3: 1,2 K 11,059 0 0 2 E8H
Modos 1,3: 137,5 11,059 0 0 2 1DH
Modos 1,3: 110 6 0 0 2 72H
Modos 1,3: 110 12 0 0 1 FEEBH

Se pueden conseguir velocidades muy bajas, habilitando las interrupciones del


temporizador 1, y configurando el temporizador en el modo 1 (temporizador de 16 bits),
recargando por programa los registros TH1 y TL1 al entrar en la rutina de interrupción.

La transmisión se inicia por cualquier instrucción que utilice S0BUF como


registro destino. La señal <<escritura en S0BUF>> hace que se cargue un A1" en la
novena posición del registro de desplazamiento de transmisión, y la unidad de control
de transmisión solicita la transmisión. Ésta se inicia en el instante S1P1 del ciclo
máquina siguiente. Los bits están sincronizados con el valor del contador dividido
por 16, y no con la señal <<escritura en S0BUF>>. Al finalizar la transmisión se activa
el bit TI0 poniéndose a uno (TI0=1).
La recepción se inicia al detectar una transición a nivel bajo en la línea RXD.
Al finalizar la recepción, la carga de S0BUF y RB80, así como la activación de RI0,
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 46

solo ocurren si, y sólo si, se dan las siguientes condiciones en el último
desplazamiento del registro de recepción: RI0= 0 y SM20= 0 o que el noveno bit recibido
sea A1". Si no se dan estas condiciones, la trama se pierde y RI0 no se activa (no
se pone a uno). Si se dan ambas, el bit de stop se lleva a RB80, el dato de 8 bits
se carga en S0BUF y se activa RI0 (se pone a uno).

Modo 2. Es similar al modo 1, salvo que se transmiten 11 bits: un bit de start, 8


bits de datos (comenzando por el LSB), seguido de un bit programable y finalizando
con el bit de stop. El noveno bit transmitido (bit programable) es el bit TB80 del
registro S0CON, que se pude poner a cero o a uno por programa.
Un ejemplo de utilización de este bit, es para transmitir el llamado bit de
paridad del dato, y así poder hacer compatible la transmisión con un formato de
transmisión de paridad par o impar. En este caso debe de ser el programador quien
genere este bit y lo escriba sobre TB80, por cada carácter transmitido.
Una manera inmediata de obtener el valor de la paridad de un dato de 8 bits,
es copiando el bit AP@ de la palabra de estado (PSW). Durante la recepción, el noveno
bit transmitido, se copia sobre el flag RB80 del registro S0CON, ignorándose en este
caso el bit de stop. La velocidad de transmisión es configurable, pudiéndose
seleccionar el valor 1/32 o 1/64 de la frecuencia de reloj. La elección se efectúa
mediante el valor de SMOD que es el bit de mayor peso del registro PCON.
El proceso de transmisión y recepción es similar al del modo 1.

Modo 3. Se trata del modo 2, excepto que la velocidad de transmisión/recepción es


variable. Esta se puede obtener del temporizador 1 en el 8051 o del temporizador 1
o 2 en el 8052, ya que los desplazamientos en el registro S0BUF se producen cada vez
que el temporizador se desborda (ecuación modo 1).
El proceso de transmisión y recepción es similar al del modo 1.

16.2 COMUNICACIONES MULTIPROCESADOR

Los modos 2 y 3 del interface serie 0 tienen una función especial para la
comunicación multiprocesador. En estos modos se transmiten 9 bits de datos. El noveno
bit es recibido por RB80, y seguidamente se recibe el bit de stop. El puerto puede
programarse de tal manera que cuando se recibe el bit de stop, la interrupción del
puerto serie se active (por ejemplo el flag RI0 se pone a uno) sólo si RB80=1. Esta
capacidad se activa poniendo a uno el bit SM20 del S0CON. Una manera para usar esta
capacidad en las comunicaciones multiprocesador es la siguiente:
- Si el procesador principal quiere transmitir un bloque de datos a uno de sus
esclavos, primero envía un byte de dirección que identifica al esclavo. El byte de
dirección se diferencia de un byte de datos en que el noveno bit es un uno (1) en
un byte de dirección y un cero (0) en un byte de datos. Con SM20=1, ningún esclavo
será interrumpido por un byte de datos. Un byte de dirección, sin embargo,
interrumpirá a todos los esclavos, y cada esclavo examinará si la dirección recibida
(byte de dirección) es la suya o no. El esclavo que identifique la dirección como
suya pondrá a cero (0) el bit SM20 y se preparará para recibir los bytes de datos
que vengan. Después de haber recibido un mensaje completo, el esclavo pondrá a A1"
el SM20 otra vez. Los esclavos que no han sido seleccionados (direccionados) tendrán
su SM20 a A1" y seguirán haciendo su trabajo, ignorando los bytes de datos que llegan.

16.3 EJEMPLOS DE PROGRAMACIÓN

EJEMPLO 1

Programación de las rutinas básicas de transmisión y recepción de un carácter


a través del puerto serie en los modos 1, 2 y 3, realizando la consulta de los flags
TI0 y RI0 por sondeo.

Una de las formas de controlar la comunicación a través del puerto serie es


mediante interrupciones, con las ventajas que ello conlleva. En este ejemplo se
desarrollan las rutinas necesarias para llevar a cabo el control de la recepción y
transmisión de cada carácter, por consulta de los flags RI0 y TI0 respectivamente.
Esto ocasiona que en un proceso de recepción de datos, el microcontrolador tenga que
estar permanentemente dedicado a la consulta del flag RI0, para detectar cuando se
recibe un dato. Si la recepción de los datos se espera en determinados instantes de
tiempo perfectamente conocidos, esto no ocasiona ningún problema, pero si los datos
llegan de manera aleatoria, la CPU sólo puede estar dedicada a la recepción de datos
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 47

por el puerto serie, para evitar la pérdida de información.


Aun así, estas rutinas se muestran a continuación por ser ampliamente
utilizadas en muchas aplicaciones.

RECEPCIÓN

RX_CAR:

JNB RI0, RX_CAR ;espera a que RI0=1 (recepción del carácter completo)
CLR RIO ;borra flag RI0, para nueva recepción
MOV A, S0BUF ;lleva al acumulador el carácter recibido
RET

TRANSMISIÓN

TX_CAR:

JNB TI0, TX_CAR ;espera a que TI0=1 (transmisión del carácter completo)
CLR TIO ;borra flag TI0, para nueva TRANSMISIÓN
MOV S0BUF, A ;carga el registro S0BUF con el dato a transmitir
RET

La rutina de recepción, devuelve el carácter recibido en el acumulador. Obsérvese


como hasta que el dato no se ha completado en el registro S0BUF, no se activa el flag
RI0. Esto obliga a que se esté consultando este flag como primera instrucción. Como
los flags asociados al puerto serie no se borran de forma automática, debe efectuarse
el borrado por programa (CLR RI0).

La rutina de transmisión, en este caso, comprueba el flag TI0, indicador de que el


registro S0BUF está vacío (ya se ha transmitido el carácter anterior) y por tanto
el nuevo dato puede ser cargado en el registro S0BUF. Antes ha de borrarse el flag
TI0 (CLR TI0), para esperar a la transmisión de un nuevo carácter, que se inicia al
escribir un dato en el registro S0BUF.

EJEMPLO 2
Se pretende desarrollar un programa para llevar a cabo un control del puerto
cuatro (P4) en función del carácter recibido por el puerto serie.
El programa espera recibir un carácter ASCII por el puerto serie, de forma que
si el µC recibe el carácter AL@ se activan los 4 bits de menor peso del puerto P4,
y si recibe el carácter AH@ se activan los 4 bits de mayor peso.
Antes de esperar la recepción del carácter, se lleva a cabo una transmisión
de un mensaje de texto que indica la condición de que el sistema está preparado para
recibir datos.
El control del puerto serie lo haremos por sondeo, a partir de las rutinas
escritas en el ejemplo anterior, con objeto de demostrar una aplicación sencilla de
su utilización.
El funcionamiento puede ser probado ejecutando un programa de comunicaciones
a través del puerto serie del ordenador. Se trata del Terminal de Windows, que
debidamente configurado permite comunicar el PC con el exterior a través del puerto
serie (COM1 Y COM2). En nuestro caso, el entorno de programación en ensamblador
(TV51ASM), tiene una opción en los menús desplegables (8051\TERMINAL) que nos permite
comunicarnos a través del puerto serie.
Como la comunicación a través del puerto serie del PC es asíncrona, es necesario
configurar el puerto serie del µC en uno de los modos asíncronos. Se ha elegido el
modo 1, pues permite seleccionar una velocidad variable en la comunicación, dentro
de las velocidades estándar típicas, con un formato de 8 bits por dato. La velocidad
elegida es de 19200 baudios.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 48

;********************************************************************
;Programa de ejemplo de comunicación serie en modo 1 por el método *
;de sondeo, fichero fuente EJ_SERIE.ASM. Comunicación PC <<->> µC *
;********************************************************************

USES 80537
ORG 8000H
INICIO
MOV S0CON,#52H ;modo 1 (8 bits), REN=1, TI=1
ORL PCON, #80H ;SMOD=1
MOV TH1, #0FDH ;velocidad= 19200 baudios
MOV TL1, TH1
MOV TMOD, #20H ;TIMER 1 en modo 2
SETB TR1 ;arranque del Timer 1
MENU
MOV DPTR,#TEXTO
ACALL TX_CADENA ;rutina para transmitir una cadena de texto
ACALL RX_CAR ;lee caracter
ACALL TX_CAR ;lo transmite (eco)
CJNE A, #'L', LAZO ;comprueba si recibe "L"
MOV P4, #0FH ;activa 4 bits de menor peso de P4
SJMP MENU ;transmite mensaje
LAZO
CJNE A, #'H', MENU ;comprueba si recibe "H"
MOV P4, #0F0H ;activa 4 bits de mayor peso de P4
SJMP MENU

TEXTO DB 'pulsa <L> o <H>:',10, 13,0

;***************************************************************
;Rutina que se encarga de transmitir a través del puerto serie *
;una cadena de caracteres almacenada en memoria de programa; *
;cuya dirección de comienzo se pasa atraves del registro DPTR. *
;***************************************************************

TX_CADENA
PUSH ACC
SIGUE
CLR A
MOVC A, @A+DPTR ;lleva al acumulador un caracter del mensaje
JZ FIN ;comprueba el final de la cadena (00H)
ACALL TX_CAR ;transmite caracter
INC DPTR ;para apuntar al siguiente
SJMP SIGUE ;repite el proceso con cada caracter
FIN
POP ACC
RET
;*****************************************************************
;Rutina de recepción de un caracter a traves del puerto serie *
;*****************************************************************

RX_CAR
JNB RI0, RX_CAR ;Espera recepción de un dato
CLR RI0 ;borra flag RI0 (recepción completa)
MOV A, S0BUF ;recoge el caracter recibido en el acumulador
RET
;*****************************************************************
;Rutina de transmisión de un caracter a traves del puerto serie *
;*****************************************************************

TX_CAR
JNB TI0, TX_CAR ;espera transmisión de un dato
CLR TI0 ;borra flag TI0 (transmisión completa)
MOV S0BUF, A ;carga registro S0BUF con el dato
RET
END
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 49

EJEMPLO 3

;**************************************************************
;Este programa hace que un bit sobre el puerto P4 se desplace *
;de izquierda a derecha y viceversa, en función del carácter *
;recibido por el puerto serie. Si se recibe el carácter <<i>>,*
;el desplazamiento se hará a la izquierda, y si se recibe el *
;carácter <<d>>, el desplazamiento se hará a la derecha. *
;La velocidad de desplazamiento podrá aumentar o disminuir *
;en incrementos de 0,1 seg, en función de que se reciba el *
;carácter <<+>> o <<->>. Ficero fuente DSE_RIE.ASM *
;**************************************************************

USES 80537
ORG 8000H

CONTAR EQU 00H ;variable auxiliar para contar tiempo (00H=R0)


VELOCIDA EQU 01H ;variable para la velocidad de desplazamiento (01H=R1)
SENTIDO EQU $20.0 ;variable tipo bit, para detectar el sentido
CIEN_mseg EQU $20.1 ;variable tipo bit, para detectar 100 mseg

SJMP PRINCIPAL ;salto para salvar los vectores de interrupción

ORG 800BH ;vector de interrupción del TIMER 0


SJMP TIMER_0

ORG 8023H ;vector de interrupción del puerto serie cero


SJMP SERIE

ORG 8030H

PRINCIPAL:

MOV A, #00
MOV S0CON, #50H ;modo 1, REN=1
ORL PCON, #80H ;SMOD=1
MOV TMOD, #21H ;TIMER 0 en modo 1 y TIMER 1 en modo 2
MOV TH1, #0FDH ;Vt=19200 Baudios
MOV TL1, TH1
MOV TL0, #00H ;Toverflow= [65536 - (TH0,TL0)]A12/Fosc
MOV TH0, #0B8H
MOV CONTAR, #00H ;inicializa CONTADOR (R0=0)
MOV VELOCIDA, #10 ;fija por defecto 10A100 mseg= 1 seg. (VELOCIDA)
MOV IEN0, #92H ;habilita Int. TIMER 0 y puerto serie
MOV IP0, #10H ;puerto serie prioridad alta
MOV TCON, #50H ;TR0=1 y TR1=1
SETB C ;C=1

REPITE:

JB SENTIDO, IZQDA ;consulta var. aux. SENTIDO


RRC A ;Desplazamiento dcha.
MOV P4, A ;saca bit al puerto
ACALL RETARDO ;tiempo de espera variable
SJMP REPITE

IZQDA:

RLC A ;desplazamiento Izq.


MOV P4, A ;saca bit al puerto
ACALL RETARDO ;tiempo de espera
SJMP REPITE
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 50

;*******************************************************************
;Rutina de tratamiento de interrupción del TIMER 0, se ejecuta *
;cada 20 mseg. A través de la variable auxiliar CONTADOR detecta *
;cuando han transcurrido 100 mseg. *
;*******************************************************************

TIMER_0:
PUSH PSW ;salva registro de estado
MOV TL0, #00H ;recarga para un tiempo de overflow de 20 mseg
MOV TH0, #0B8H
INC CONTAR ;incrementa el CONTADOR (R0)
CJNE R0, #01H, SIGUE ;espera a que transcurran 100 mseg
MOV CONTAR, #00H ;borra el CONTADOR
SETB CIEN_mseg ;activa flag indicador de 100 mseg
SIGUE:
POP PSW
RETI

;*******************************************************************
;Rutina de interrupción del puerto serie. Se ejecuta cada vez que *
;se recibe un carácter por el puerto serie. La transmisión está *
;deshabilitada. Comprueba el carácter recibido y actualiza las *
;variables VELOC y SENTIDO. *
;*******************************************************************
SERIE:
PUSH ACC
PUSH PSW
CLR RI0 ;borra flag RI0 de recepción
MOV A, S0BUF ;carga en el acumulador el carácter recibido
CJNE A, #'+', LAZO1 ;comprueba si es "+"
CJNE R1,#01H, AUMENTA ;comprueba el limite para max. velocidad(=R1)
SJMP FIN_SERIE ;sal de la rutina si se alcanza el limite
AUMENTA:
DEC VELOCIDA ;decrementa variable VELOC
SJMP FIN_SERIE ;sal de la rutina
LAZO1:
CJNE A,#'-', LAZO2 ;comprueba si es "-"
CJNE R1, #0FFH, REDUCE ;comprueba el limite para min. velocidad(=R1)
SJMP FIN_SERIE ;sal de la rutina
REDUCE:
INC VELOCIDA ;incrementa variable VELOC
SJMP FIN_SERIE ;sal de la rutina
LAZO2:
CJNE A,#'i', LAZO3 ;comprueba si es "i"
SETB SENTIDO ;sentido =izq.
LAZO3
CJNE A,#'d', FIN_SERIE ;comprueba si es "d"
CLR SENTIDO ;sentido=dcha.
FIN_SERIE:
POP PSW
POP ACC
RETI
;********************************************************************
;Rutina de retardo variable, en función del valor almacenado en la *
;variable VELOC. Obsérvese que cuanto mayor es VELOC, el retardo *
;aumenta y como consecuencia el desplazamiento es más lento. *
;Tiempo de espera0 VELOCA100 mseg. *
;********************************************************************

RETARDO:
MOV B, VELOCIDA ;inicializa B con el valor de velocidad
LAZO4
JNB CIEN_mseg, LAZO4 ;espera a que transcurran 100 mseg.
CLR CIEN_mseg ;borra la variable CIEN_mseg para repetir
DJNZ B, LAZO4 ;repite hasta B=0
RET
END
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 51

17. TEMPORIZADOR WATCHDOG

La CPU del microcontrolador 80C537 dispone de un periférico denominado WATCHDOG


(perro guardián). Este periférico consiste en un temporizador que se va incrementando
en una unidad cada ciclo máquina. Cuando éste alcanza el valor 65536 resetea el
microcontrolador.
Por tanto la aplicación que se ejecuta en el microcontrolador debe poner a cero
(0) este contador antes de que cuente 65536 ciclos máquina. Con ello el sistema puede
asegurarse de que el programa funciona correctamente, ya que por lo menos una vez
cada 65 ms (en un equipo a 12 MHz) deberá notificar su buen funcionamiento poniendo
el contador de este temporizador a cero. Si por cualquier motivo no se pusiera a
tiempo, indicaría que algo ha fallado, así que volvería a reinicializar el sistema,
esto es, comenzar de nuevo.

REGISTRO IEN0 (0A8H)


IEN0 (0A8H) EAL WDT ET2 ES0 ET1 EX1 ET0 EX0
WDT, bandera de refresco del WATCHDOG. Se debe poner a uno para refrescar el watchdog.
Debe ser activada inmediatamente después de activar SWDT, con el fin de prevenir un
refresco no intencionado del temporizador del watcdog.

REGISTRO IEN1 (0B8H)


IEN1 (0B8H) EXEN2 SWDT EX6 EX5 EX4 EX3 EX2 EADC
SWDT, inicializador del refresco del temporizador del watchdog. Cuando es puesto
a uno (1) inmediatamente después de activar WDT, se reinicializa el contador del
watchdog.

Después de un RESET externo el WATCHDOG es deshabilitado y su contador puesto


a cero. El contador es inicializado activando el bit SWDT. Una vez puesto en marcha
no es posible pararlo vía software. Para poner a cero el contador del WATCHDOG y evitar
un reseteo interno deberá ejecutarse una secuencia de dos instrucciones en la que
en la primera se active el WDT y en la siguiente el bit SWDT.
WDT será desactivado automáticamente durante el segundo ciclo máquina, de modo
que para poner a cero el contador del WATCHDOG es necesario utilizar instrucciones
de un ciclo, como por ejemplo SETB SWDT.
Esta secuencia ha sido ideada con el fin de minimizar el riesgo de que un
programa fuera de control pueda accidentalmente periódicamente poner a cero el
contador, y así evitar la reinicialización del sistema.
El RESET por hardware y el RESET realizado por el WATCHDOG se diferencian en
que el temporizador del WATCDOG no es deshabilitado. El bit WDTS (activado por WDT)
permite averiguar cuál ha sido la fuente de RESET. Si este bit está activo fue el
WATCDOG quien reinicializó el equipo, en caso contrario fue algún dispositivo externo
(ej: pulsador, o inicio de corriente).

REGISTRO IP0 (0A9H)


IP0 (0A9H) - WDST IP0.5 IP0.4 IP0.3 IP0.2 IP0.1 IPO.0
WDST, bandera de estado del watchdog. Es activado por el hardware cuando el
temporizador del watchdog es inicializado. Puede ser leído por el software.

18. SALIDA DEL RELOJ DEL SISTEMA

Para los periféricos que requieran de un reloj, el 80C537 puede generar una
señal de salida derivada de la frecuencia del oscilador. Esta señal de salida se halla
en la patilla P1.6/CLKOUT. Si el bit CLK (bit 6 del registro ADCON0) está activo,
P1.6 genera una señal de 1/12 veces la frecuencia del oscilador, esto es de 1 MHz
en un equipo funcionando a 12 Mhz.

REGISTRO ADCON0 (0D8H)


ADCON0 (0D8H) BD CLK ADEX BSY ADM MX2 MX1 MX0
CLK, habilitación del reloj de salida. Cuando es puesto a uno se genera en la patilla
P1.6/CLKOUT una señal de reloj con una frecuencia igual a 1/12 de la frecuencia del
oscilador.
Para poder utilizar esta función el bit P1.6 debe ponerse a uno (1), que es
el valor por defecto al arrancar el microcontrolador. Este reloj está a uno durante
S3P1 y S3P2 de cada ciclo de máquina, y a nivel bajo en los otros estados.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 52

19. MODULACIÓN POR ANCHO DE PULSOS (PWM)

La modulación por ancho de pulsos (también conocida como PWM, siglas en inglés de pulse
width modulation) de una señal o fuente de energía es una técnica en la que se modifica
el ciclo de trabajo de una señal periódica (una senoidal o una cuadrada, por ejemplo),
ya sea para transmitir información a través de un canal de comunicaciones o para controlar
la cantidad de energía que se envía a una carga.

El ciclo de trabajo de una señal periódica es el ancho relativo de su parte positiva en


relación con el período. Expresado matemáticamente:

D es el ciclo de trabajo
es el tiempo en que la función es
positiva (ancho del pulso)
T es el período de la función

La frecuencia debe ser suficientemente alta


para que:

* No provoque ruido audible (si es que a uno le


molesta) -> mayor a 15...20 KHz

No se anule la corriente en el motor (no entre


en conducción discontínua). Puede pasar en
motores chicos, en los grandes por la gran
inductancia propia del motor no es importante.
También se puede solucionar agregando un
inductor en serie con el motor. A bajas
velocidades (ciclo de trabajo pequeño) puede
ser necesario aumentar la frecuencia de PWM para
no entrar en conducción discontinua. En otras
palabras, mayores frecuencias de PWM nos
permitirán regular velocidades más bajas usando
el mismo algoritmo de control, sin que el motor
esté arrancando/parando constantemente.
Pero tampoco queremos la frecuencia de PWM muy
alta porque:

• Se genera más ruido eléctrico en el sistema.


• Hay mayores pérdidas de conmutación/menor eficiencia en el elemento de control
(puente H, transistor...). Esto suele limitar la frecuencia de operación en los
puentes H integrados al orden de los 100 KHz.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 53

19.1 CONFIGURACIÓN DE PWM CON EL 80C537

La Unidad de Comparación/Captura (CCU)

La unidad de comparación/captura es una de las más poderosas unidades periféricas del SAB
80C537 para su uso en todo tipo de generación de la señal digital y captura de eventos
como la generación de pulsos, modulación de ancho de pulso, medición del ancho de pulso,
etc.

La CCU se compone de dos timer/contador de 16-bit con función de recarga automática y una
serie de 13 registros para comparar o comparar/capturar. Un conjunto de seis registros
de control se usa para la adaptación flexible de la CCU a una amplia variedad de aplicaciones
de usuario.

El CCU es el periférico ideal para diversas aplicaciones de control de automoción


(encendido/inyección control, anti-bloqueo de frenos, etc), así como para aplicaciones
industriales (DC, AC trifásico, y control de motor paso a paso, la generación de
frecuencias, de digital a analógico, control de proceso, etc).

El diagrama de bloques en la figura 7-33 muestra la configuración general de la CCU. Todos


los registros CCX y el registro CRC se destinan exclusivamente al temporizador 2 (timer-2).
Cada uno de los ocho registros de comparación CM0 a CM7 puede asignarse al temporizador
2 (timer-2) o a la más rápida comparar temporizador (compare timer), por ejemplo, para
proporcionar hasta 8 canales PWM. La asignación de los registros CMX - que se puede realizar
individualmente para cada registro - se combina con la selección automática de uno de los
dos modos de comparar posibles.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 54

Los puertos P5, P4 y siete líneas del puerto P1 tienen funciones alternativas dedicadas
a la CCU. Estas funciones se enumeran en la tabla 7-8. Normalmente cada registro controla
una línea de salida de los puertos. El registro CC4 es una excepción, ya que puede manipular
hasta nueve líneas de salida (una en el puerto P1.4 y las otros ocho en el puerto P5) al
mismo tiempo. Una lista de todos los registros de funciones especiales que permiten
configurar la CCU se da en la tabla 7-9.

TIMER-2

Temporizador 2 es una de las dos bases


de tiempo de 16-bit de la unidad
comparación/captura. Puede funcionar
como temporizador, contador de eventos,
o temporizador activado por el pin P1.7.
El diagrama de bloques en la figura 7-34
a) muestra la configuración general del
temporizador 2.

Modo temporizador TIMER-2

En función de temporizador, la tasa de


recuento se deriva de la frecuencia del
oscilador. Un prescaler 2:1 ofrece la
posibilidad de seleccionar una tasa de
conteo de 1/12 o 1/24 de la frecuencia
del oscilador. Por lo tanto, el registro
de 16-bit del timer (que consta de TH2
y TL2) o bien se incrementa en cada ciclo
máquina o en cada segundo ciclo máquina.
El prescaler es seleccionado por T2PS bits en el registro de función especial T2CON (ver
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 55

figura 7-35). Si T2PS está desactivada (clear), la frecuencia de entrada es 1/12 de la


frecuencia del oscilador, si T2PS es activada (set), el prescaler 2:1 se activa y la
frecuencia de entrada es 1/24 de la frecuencia del oscilador.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 56

19.2 FUNCIÓN COMPARACIÓN EN LA CCU

La función comparación de la combinación de temporizador/registro puede ser descrito


como sigue. El valor de 16-bit almacenado en un registro comparador o registro
comparar/capturar se compara con el contenido del registro del temporizador. Si el valor
de la cuenta en el registro del temporizador coincide con el valor almacenado, la señal
de salida correspondiente es generada en el pin del puerto seleccionado.
El contenido del registro de comparación se puede considerar como "marca de tiempo" en
el que una salida dedicada reacciona de una manera predefinida (ya sea con una transición
positiva o negativa). La variación de esta "marca de tiempo" de algún modo cambia la onda
de una señal de salida rectangular en un pin del puerto. Esto es, nos permite hacer una
variación del ciclo de trabajo de una señal periódica. Ello se utiliza para la modulación
de ancho de pulso (PWM), así como para una continua generación controlada de cualquier
clase de formas de onda cuadrada. En el caso de la SAB 80C537, se implementan dos modos
de comparar para cubrir una amplia gama de posibles aplicaciones (véase la sección 7.5.4
a continuación).

En el 80C537 - gracias a la gran cantidad de registros (13) y a tener dos


temporizadores asociados – es posible seleccionar varias combinaciones
Temporizador/registro.

COMPARAR MODO 0

En el modo 0, al coincidir el contenido del registro


del timer y el contenido del registro comparador, la
salida cambia de nivel bajo a alto. Y regresa a nivel
bajo cuando el timer se desborda (overflow). Mientras
el modo de comparación 0 está activado,
el pin de salida apropiado es controlado por el
circuito temporizador sólo, y no por el usuario. La
figura 7-38 muestra un diagrama funcional de un puerto
en modo 0.

El comparar en modo 0 es ideal para la generación de


señales de salida cuadradas modulados en anchura
(PWM). También se puede usar para proporcionar señales
de reloj de salida con período y ciclo de trabajo
definido. Este es el modo en el que necesita el menor
tiempo de CPU. Una vez configurado, la salida pasa a ser oscilante sin intervención de
la CPU. La figura 7-39 ilustra la función de comparación en el modo 0.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 57

La Tabla 7-10 muestra posibles configuraciones de la CCU y los modos de comparar


correspondientes que se puede seleccionar.

FUNCIÓN DE COMPARACIÓN DEL TEMPORIZADOR 2 CON LOS REGISTROS CRC, CC1 A CC4

Función de comparación de registros de CRC, CC1 a CC3

Los registros de CRC, CC1 a CC3 están permanentemente conectados al temporizador


2 (timer-2).
Los cuatro registros son multifuncionales, ya que, además, establecen una captura
o capacidad de recarga (el registro CRC solamente). Una selección general de la función
es hecha en el registro CCEN (ver figura 7-41). Para la función de comparar se puede utilizar
el modo de comparación 0 o 1, respectivamente. El modo de comparación se selecciona poniendo
a cero o a uno el bit T2CM del registro de función especial T2CON.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 58

RANGO DE MODULACIÓN EN COMPARACIÓN MODO 0

En la siguiente figura podemos apreciar que para obtener el ciclo de trabajo máximo, los
registros CCHx/CCLx o CRCH/CRCL deben cargarse con ceros (0000H). Y para obtener el ciclo
de trabajo mínimo (aproximadamente el 0%) los registros CCHx/CCLx o CRCH/CRCL deben
cargarse con unos (FFFFH). El pico que vemos en la gráfica se produce en el momento en
el que se desborda el timer y tiene una duración aproximada de 500 ns para una frecuencia
del oscilador de 12 MHz.
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 59

19.3 EJEMPLO DE APLICACIÓN

Obtener en el pin P1.1 una señal PWM.

1º Identificamos los registros de función especial que están involucrados para configurar
la unidad CCU en el modo comparación y activamos los bits adecuados.

En nuestro caso hacemos:

- T2I1=0 T2I0=1 Activación del Timer-2

- T2R1=0 T2R0=0 Recarga desactivada

- T2CM=0 Seleccionamos compare modo 0

- T2PS=0 Seleccionamos Fosc/12 como frecuencia de entrada al Timer-2.

INSTRUCCIÓN: MOV T2CON, #81H

Las combinaciones indicadas de los bits T2PS1 (CTCON) y T2PS(T2CON) dividen la frecuencia
del timer según se muestra:

CTCON T2CON
T2PS1 T2PS
0 0 Fosc/12= /1 ->Fosc/12
0 1 Fosc/12= /2 ->Fosc/24
1 0 Fosc/12= /4 ->Fosc/48
1 1 Fosc/12= /8 ->Fosc/96

En nuestro caso hacemos:

T2PS1=0 T2PS=1, con lo cual seleccionamos Fosc/24.

INSTRUCCIÓN: MOV CTCON, #00H


APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 60

Habilitamos el registro de la unidad CCU que queremos utilizar para comparar con el registro
del Timer_2, en nuestro caso:

COCAH1=1 COCAL1=0 Habilitamos comparación con los registros CCH1 y CCL1.

INSTRUCCIÓN: MOV CCEN, #08H

2º Identificamos los registros para comparar asociados al pin P1.1, información que
obtenemos de la siguiente tabla, En nuestro caso CCH1/CCL1.

Una vez configurados los registros SFR


indicados, para modificar el ancho de
impulso de la señal en el pin P1.1 lo que
tenemos que hacer es poner en CCH1 y CCL1
los valores adecuados para obtener el ciclo
de trabajo deseado.
Una vez configurados los registros SFR
indicados, para modificar el ancho de
impulso de la señal en el pin P1.1 lo que
tenemos que hacer es poner en CCH1 y CCL1
los valores adecuados para obtener el ciclo
de trabajo deseado.
Con un registro de 16 bits tenemos
216= 65536 combinaciones posibles. Si
cargamos el registro CCH1/CCL1 con su valor medio, esto es 65536/2= 32768= 8000H el ciclo
de trabajo será del 50%, a partir de aquí, para calcular otro ciclo de trabajo hacemos
la siguiente regla de tres:

Si 50% ------> 32768 Por tanto


(100-X%) ------> Y

Por ejemplo, para un ciclo de trabajo del 35% tendremos que:

Entonces: CCH1= A6H y CCL1= 66H


APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 61

;*******************************************************************************
;Ejemplo de aplicación PWM. Programa para regular la velocidad de un motor de *
;CC por modulación de ancho de pulso. Para ello disponemos de un pulsador *
;conectado a la interrupción externa INT0 de tal forma que cada vez que se *
;accione este pulsador, el ciclo de trabajo de la señal cuadrada que tendremos *
;en el pin P1.1 se incrementará en un 5%, lo cual hará incrementarse la *
;velocidad del motor en ese mismo porcentaje. Cuando se alcance el 100% se *
;reiniciará el sistema de nuevo desde el 0%. *
;*******************************************************************************

USES 80537
;#include <REG517A.INC>
ORG 8000H

LJMP INICIO
;******************************************************************************
ORG 8003H ; external interrupt 0 address

ESPERA:
JNB P3.2,ESPERA
LCALL DELAY1
JNB P3.2,ESPERA
INC R0
INC R0
CPL F0
LCALL DELAY1
MOV P4,00H ; Dirección OOH=R0
CLR IE0 ;Borrar bandera de interrupción INT0 para anular un rebote
RETI

;******************************************************************************
ORG 8040H ; program start address
INICIO:
CLR F0
LCALL CONFIG
MOV R0,#00H
MOV P4,00H ; Dirección 00H=R0
MOV CCH1,#0FFH ;CICLO DE TRABAJO = 0% MOTOR PARADO
MOV CCL1,#0FFH
REPITE:
JNB F0,REPITE
LCALL VELOCIDAD
SJMP REPITE
;******************************************************************************
CONFIG:
MOV R0,#00H
MOV T2CON,#81H ; T2CON= T2PS-I3FR-I2FR-T2R1-T2R0-T2CM-T2I1-T2I0 (B7->B0)
; CONF.= 1 0 0 0 0 0 0 1

; B1(T2I1)_B0(T2I0)= 01 TIMER FUNCIÓN


; B2(T2CM)=0 COMPARE MODE_0.
; B3(T2R0)_B4(T2R1)=10 MODE_0
; B5_B6=XX ;
; B7(T2PS)=0 Fosc/12
; T2R0 T2R1 SELECCION DEL MODO DE RECARGA DEL TIMER 2
; 0 X RECARGA DESHABILITADA
; 1 0 MODE 0= SE RECARGA EL TIMER CON TH2=CRCH y TL2=CRCL
; 1 1 MODE 1= RECARGA EN EL FLANCO DESCENDENTE DEL PIN T2EX/P1.5

MOV CTCON,#00H ; CTCON= T2PS1-X-X-X-CTF-CLK2-CLK1-CLK0 (B7->B0)


APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 62

;*******************************************************************************
; T2PS1 SELECCIONA LA PREESCALA DEL TIMER 2 SEGÚN SE MUESTRA EN "NOTA"
;******************************NOTA*********************************************
;Las combinaciones indicadas de estos dos bits dividen la frecuencia del timer según ;se
muestra
;CTCON T2CON
;T2PS1 T2PS
; 0 0 Fosc/12= /1
; 0 1 Fosc/12= /2 ->Fosc/24
; 1 0 Fosc/12= /4 ->Fosc/48
; 1 1 Fosc/12= /8 ->Fosc/96
;*******************************************************************************
;*******************************************************************************
; CC3 CC2 CC1 CC0
MOV CCEN, #08H ;CCEN= COCAH3-COCAL3-COCAH2-COCAL2-COCAH1-COCAL1-COCAH0-COCAL0 (B7->B0)
;CONF.= 0 0 0 0 1 0 0 0
;Configuracion PWM PIN P1.1 (CC1)
SETB EX0 ;habilitación externa cero (INT0)
SETB IT0 ;INT0 activada por flanco
SETB EAL ;Habilitación general interrupciones
RET

;*******************************************************************************
;*******************************************************************************
VELOCIDAD:
CLR EX0
MOV DPTR,#TABLA_VEL
MOV 01H,R0 ;R1=01H Dirección registro R1
MOV A,R1
MOVC A, @A+DPTR
MOV CCH1,A

INC R1
MOV A,R1
MOVC A, @A+DPTR
MOV CCL1,A

CJNE R0,#2AH,SIGUE
MOV R0,#0FEH ;R0=FEH para que la siguiente pulsación lo ponga en R0=00H
SIGUE:
SETB EX0
CLR F0
RET

;******************************************************************************
DELAY1: ;pierde un poco de tiempo
MOV DPTR,#0FFFFH ;carga DPTR Con el dato FFFFH
DELAY2:
DJNZ DPL, DELAY2 ;Repite bucle para byte bajo
DJNZ DPH, DELAY2 ;Repite bucle para byte alto
RET
;******************************************************************************

TABLA_VEL:
;(H - L)
; 0% 5% 10% 15% 20% 25% 30% 35% 40% 45% 50%
DB 0FFH,0FFH,0F3H,33H,0E6H,66H,0D9H,99H,0CCH,0CCH,0C0H,00H,0B3H,33H,0A6H,66H,99H,99H,8CH,0CCH,80H,00H
; 55% 60% 65% 70% 75% 80% 85% 90% 95% 99% 100%
DB 73H,33H,66H,66H,59H,99H,4CH,0CCH,40H,00H,33H,33H,26H,66H,19H,99H,0CH,0CCH,01H,8FH,00H,00H

END
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 63

EJERCICIO_1

Hacer un programa que sume dos números de 8 bits:


a) En binario natural
b) En BCD natural
- Los operandos se definirán al principio del programa como constantes
- Los operandos se guardaran en los registros R2 y R3 y el resultado en el registro R4
- El resultado se visualizara en la placa de los LEDS

EJERCICIO_2

Repetir el ejercicio_1 pero para restar.

EJERCICIO_3

Hacer un programa que reste dos números de 7 bits y signo expresados en el convenio del
complemento a dos.

EJERCICIO_4

A los programas de los ejercicios 1 y 3 añadirle una subrutina que nos permita detectar
que se produjo rebasamiento. El programa nos informara de esta circunstancia haciendo
parpadear el led número siete. Para poder ver parpadear el led tendremos que hacer también
una subrutina de pérdida de tiempo.

EJERCICIO_5

a) Hacer un programa que nos permita leer un dato (BYTE) por un puerto (puerto en modo
entrada) y sacar su contenido por otro puerto (puerto en modo salida).
b) Repetir el apartado a) pero haciendo una lectura bit a bit de un puerto y sacando el
estado de ese bit por una línea de otro puerto.
Nota: para generar las entradas utilizaremos los interruptores de los entrenadores de
electrónica digital y como salida utilizaremos las placas de los leds.

EJERCICIO_6

Hacer un programa que simule un reloj digital. Para visualizarlo utilizaremos los displays
de los entrenadores de electrónica digital.

EJERCICIO_7

Repetir el programa que simule un reloj digital utilizando las instrucciones de llamadas
a subprogramas (ACALL, LCALL, RET). Para visualizarlo utilizaremos los displays de los
entrenadores de electrónica digital.

También podría gustarte