LODI T6 MAR 2013 v6
LODI T6 MAR 2013 v6
LODI T6 MAR 2013 v6
1. INTRODUCCIÓN
* 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).
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
DIRECCIÓN CONTENIDO
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).
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
CONTENIDO
DESPUÉS DE
BLOQUE SÍMBOLO NOMBRE DIR RESET
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
REGISTRO A (ACUMULADOR)
REGISTRO B
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
Como norma general cada línea se compone de una etiqueta, un mnemónico, unos
argumentos y un comentario, por ejemplo:
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
<#> El número que le sigue es un dato que puede estar expresado en decimal o
en hexadecimal. Ejemplo:
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:
<@> 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:
- 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:
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:
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:
<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:
<;>
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:
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.
5. OPERADORES
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
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
- Constantes y Etiquetas
- Instrucciones y Directivas
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
- Direccionamiento inmediato
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
Ejemplo:
MOV A,30H ;significa poner en A el dato situado en la dirección 30H
Ejemplo:
MOV A,R1 ; transferir a A el valor contenido en R1
ADD A,R0 ; sumar a este valor el contenido de R0
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
Ejemplo:
-Direccionamiento de bit
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
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
POP
EJEMPLO:
USES 80537 ;usa el fichero 80537.asm para identificar los REGISTROS SFR
ORG 8000H ;carga el programa a partir de la dirección 8000H
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
MOVC
Carga un dato inmediato de 16 bits en el par de registros DPH (byte alto) y DPL (byte
bajo).
EJEMPLO:
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
10.4.1 SUMA
INC
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:
USES 80537
ORG 8000H
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=
MOV A, #83H
MOV R2, #96H
ADD A, R2
MOV R5, A ;R5= AC= CY= OV=
SJMP inicio
END
EJERCICIO
10.4.2 RESTA
DEC
EJEMPLO:
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)
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
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:
USES 80537
ORG 8000H
inicio:
MOV A, #NA
MOV B, #NB
MUL AB
MOV R2, A ;R2= OV= y carry CY=
MOV R3, B ;R3=
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:
USES 80537
ORG 8000H
inicio:
MOV A, #NA
MOV B, #NB
DIV AB
MOV R2, A ;R2= OV= y carry CY=
MOV R3, B ;R3=
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
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.
CLR
SETB
La instrucción SETB pone a uno cualquier bit direccionable directamente <SETB bit>.
Formas posibles: SETB C | SETB bit
CPL
RL A
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
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
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
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:
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
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
ANL
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
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
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
SJMP inicio
END
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 24
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
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:
USES 80537
ORG 8000H
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
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.
EJEMPLO:
;Programa CALL_INB.ASM para estudiar el comportamiento de las instrucciones
;de LLAMADA INCONDICIONAL
USES 80537
ORG 8000H
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
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
JC rel
JNC rel
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.
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
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
;***********************************************************
; * 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
OPTA:
JB BIT, CUENTA_BIN ;si BIT=1 salta a la subrutina CUENTA BINARIA
SJMP CUENTA_BCD ;SINO salta a la subrutina CUENTA BCD
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
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
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
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.
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.
ORDEN FUENTE
IP0.7 - Reservado
IP0.6 - Reservado
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)
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
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
LJMP CUENTA_BIN
;VECTOR de la SUBRUTINA de la INTERRUPCION INT0.
;Esta instrucción esta ubicada en la posición de
;memoria $8003
;****************************************************************************
CUENTA_BCD:
INICIO_BCD:
DELAYBCD2:
CUENTA_BIN:
PUSH ACC
PUSH $00 ;PUSH R0
mov A,#$00 ;Carga 0 en el acumulador
INICIO_BIN:
mov LEDS,A
MOV R0,#$02
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.
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.
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
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.
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.
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.1 MODO 0
14.2.2 MODO 1
14.2.3 MODO 2
14.2.4 MODO 3
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
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
VISUALIZA:
MOV SEGUNDOS, R1
MOV MINUTOS, R2
MOV HORAS, R3
RET
END
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 39
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.
BIT FUNCIÓN
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)
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 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
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:
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
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
END
APUNTES DE LÓGICA DIGITAL TEMA_6/Pág. 44
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.
El control del puerto serie se realiza gracias al registro con función especial
S0CON situado en la dirección 98H.
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).
TIMER 1
Velocidad Foscilador SMOD
(Baudios) (Mhz) (PCON.7) C /T C/T Modo Valor recarga
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).
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.
EJEMPLO 1
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
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
;***************************************************************
;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
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:
IZQDA:
;*******************************************************************
;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
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.
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.
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 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.
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
COMPARAR MODO 0
FUNCIÓN DE COMPARACIÓN DEL TEMPORIZADOR 2 CON LOS REGISTROS CRC, CC1 A CC4
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
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.
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
Habilitamos el registro de la unidad CCU que queremos utilizar para comparar con el registro
del Timer_2, en nuestro caso:
2º Identificamos los registros para comparar asociados al pin P1.1, información que
obtenemos de la siguiente tabla, En nuestro caso CCH1/CCL1.
;*******************************************************************************
;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
;*******************************************************************************
; 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
EJERCICIO_2
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.