Teoría 8y9

Anuncio
Terminales del P 8085
(vistos hasta ahora)
Buses de direcciones y datos
Bus de control
Alimentación, clock, reset
Registros internos del P 8085
Instrucciones del P 8085
(vistas hasta ahora?)
Transferencia:
MVI
r,dato
MOV
r1,r2
LDA
dir
STA
dir
Aritméticas:
ADD
r
SUB
r
ADC
r
SBB
r
CMP
r
INR
r
DCR
r
ADI
SUI
ACI
SBI
CPI
dato
dato
dato
dato
dato
Lógicas (bit a bit):
ANA
r
ORA
r
XRA
r
ANI
dato
ORI
dato
XRI
dato
Complemento,
rotación, etc.:
CMA
RRC
RLC
RAL
RAR
Acceso a I/O:
IN
port
OUT
port
Salto:
JMP
dir
J[cond] dir
Subrutinas:
CALL dir
RET
C[cond] dir
R[cond]
Pila:
PUSH
POP
Registros pares:
LXI
rp,dato16
INX
rp
DCX
rp
DAD
rp
LDAX
rp
STAX
rp
LHLD
dir
SHLD
dir
rp
rp
Donde:
r = A,B,C,D,E,H,L,M
rp = HL,DE,BC,SP
dato = número de 8 bits
dir = dirección de 16 bits
port = dirección de 8 bits
dato16 = número de 16 bits
[cond]:
NZ
Z
NC
C
PO
PE
P
M
Resto de las instrucciones del P 8085
Quedan por ver:
SIM
RIM
DAA
CMC
STC
EI
DI
HLT
RST n
PCHL
XTHL
SPHL
XCHG
NOP
Terminales SID y SOD
Trabajan con las intrucciones RIM y SIM:
Mnemónico:
RIM
Código máquina:
00100000
registro acumulador
después de la instrucción
7
6
5
terminal SID (signal input data)
Assembler:
SIM
Código máquina:
00110000
registro acumulador
antes de la instrucción
= 20h (opcode)
5
4
3
2
1
0
= 30h (opcode)
7
6
5
4
3
2
1
0
1
latch
4
terminal SOD (signal output data)
Interrupciones
•
Para saber si se produce un cambio en algún periférico, podemos preguntar
permanentemente por su estado, con instrucciones conocidas tipo IN o LDA.
•
Si la velocidad de esos cambios es muy baja respecto a la frecuencia de
lectura, el sistema es muy poco eficiente.
•
En general, los periféricos tienen tiempos
de cambio >> que el del loop mostrado.
•
•
Esta manera de monitorear los cambios es
aceptable si el P no tiene otra cosa que
hacer.
IN Per_0
Cambió
Per_0?
Sí
CALL
Sub_0
Cuando el P debe realizar otras tareas,
como realizar algún cálculo por ejemplo, es
probable que no pueda hacer ambas cosas
simultáneamente.
IN Per_n
Cambió
Per_n?
Sí
CALL
Sub_n
Interrupciones
•
En general, los P trabajan con interrupciones.
•
Estas se producen cuando se activa alguna de la/las entrada/s que el P tiene
previstas para tal efecto.
•
Cuando se produce, el P termina de ejecutar la instrucción en curso y salta a
un lugar fijo de la memoria de programa, donde busca el código de operación
de la siguiente instrucción.
•
Previamente almacena en RAM (pila) la dirección donde debe continuar, luego
de la interrupción (retorno).
Interrupciones en el P 8085
Existen 5 entradas de interrupciones:
Dirección de salto
Prioridad
Máscara
Sensible a
TRAP
0024
Mayor
No
-
RST 7.5
003C
Sí
Flanco
RST 6.5
0034
Sí
Nivel
RST 5.5
002C
Sí
Nivel
INTR
sin dirección fija
Sí
-
Menor
•
La prioridad se refiere a cual interrupción es atendida si llegan dos pedidos simultáneos.
•
Para que las interrupciones enmascarables puedan ser atendidas, deben ser previamente
habilitadas (quitar máscaras).
•
Existe una máscara o habilitación general que afecta a todas
•
También, en el caso de RST7.5, RST6.5 y RST5.5, existen máscaras individuales.
Interrupciones en el P 8085
•
La RST7.5 se activa por flanco (un biestable retiene la transición) mientras que la 6.5 y la
5.5 se activan por nivel.
•
Todas las máscaras correspondientes a una interrupción deben quitarse para que esta
pueda ser atendida.
•
Cuando se atiende una interrupción cualquiera, se activa automáticamente la máscara
general de interrupciones, la cual debe ser quitada por software (EI), para que a
continuación se puedan seguir atendiendo otras interrupciones.
•
Cuando el µP se resetea quedan puestas todas las máscaras.
Terminales del P 8085
asociados a las interrupciones
Entradas de interrupción:
TRAP:
interrupción no-enmascarable
de mayor prioridad.
RST7.5: interrupción enmascarable (sensible al flanco
ascendente).
RST6.5,
RST5.5: interrupciones enmascarables (por nivel).
INTR:
interrupción de propósito general
/INTA:
reconocimiento del pedido a través de INTR
Otros terminales especiales:
HOLD:
indica que algún periférico está pidiendo el
uso de los buses (dirección, datos y control).
HLDA:
indica que el P ha recibido el pedido de HOLD y
liberará los buses en el próximo clock.
* HOLD y HLDA son usados normalmente por periféricos que
realizan acceso directo a memoria (DMA).
Instrucciones del P 8085
asociadas a las interrupciones
SIM
setea máscaras individuales,
resetea el FF de la RST7.5,
fija estado de la pata SID.
RIM
lee estado de máscaras individuales,
lee estado de habilitación de interrupciones (máscara general),
lee estado de interrupciones pendientes,
lee estado de terminal SID.
EI
habilita interrupciones (quita máscara general).
DI
inhibe interrupciones (pone máscara general).
HLT
pone al P en estado de detención (halt)
(bajo consumo, preserva contenido de registros)
Interrupciones
El registro de máscaras no es accesible directamente, pero puede ser escrito y leido por
medio de las instrucciones SIM y RIM, usando el acumulador:
reg. máscaras  A
SIM
Formato del acumulador antes de la instrucción SIM:
7
6
SOD SOE
5
X
4
3
2
1
0
R7.5 MSE M7.5 M6.5 M5.5
SOD
Bit que fija el estado del pin SOD de µP, si SOE esta en uno
SOE
Si este bit es uno, SOD puede cambiar según el valor del bit 7, pero si es cero SOD no cambia
R7.5
Si este bit es 1 se resetea el flip flop de la interrupción RST 7.5
(sin importar si la interrupción 7.5 está enmascarada o no)
MSE
Un cero en este bit inhabilita la posibilidad de cambiar las máscaras 7.5, 6.5 y 5.5
M7.5
M6.5
M5.5
Máscara de la Interrupción 7.5 (un cero la habilita un uno la inhabilita)
Máscara de la Interrupción 6.5 (un cero la habilita un uno la inhabilita)
Máscara de la Interrupción 5.5 (un cero la habilita un uno la inhabilita)
Interrupciones
A  reg. máscaras
RIM
Formato del acumulador después de la instrucción RIM:
7
6
5
4
SID I7.5 I6.5 I5.5
3
2
1
0
IE M7.5 M6.5 M5.5
SID
Estado del pin SID del µP
I7.5
I6.5
I5.5
Indican si hay alguna interrupción pendiente
IE
Indica si están habilitadas las interrupciones en general (máscara general quitada)
M7.5
M6.5
M5.5
Indican el estado actual de las máscaras individuales
Ejemplo 1: uso de interrupciones
Realizar un programa que cuente 12 pulsos de una señal de entrada (conectada a
la interrupción rst7.5) y termine:
Dir.
Assembler
0000
JMP
0100h
; Salta al comienzo del programa
DCR
RET
B
; Atención de la interrupción 7.5, decrementa contador
0100
0103
0105
0106
0108
0109
010A
010B
010C
LXI
MVI
SIM
MVI
EI
HLT
MOV
ORA
JNZ
SP,2100h
A,08
; Inicializa el SP apuntando a memoria RAM
010F
0111
0114
MVI
STA
HLT
.
.
.
003C
003D
.
.
.
B,0Ch
A,B
A
0108h
A,FFh
1000h
;
;
;
;
Quita todas las máscaras de las interrupciones
Carga el contador con el valor inicial (12)
Habilita las interrupciones (máscara general)
Entra en estado de halt
; Verifica si el contador llegó a cero
; Cuando el contador llega a cero se escribe FFh en la
; dirección 1000h y se termina el programa
Ejemplo 2: contador de pulsos
Realizar un programa que permita contar cuantos pulsos hay en una señal de
entrada, mientras otra entrada de control está en alto.
Señal de control
Señal de entrada
No se
cuentan
INT6.5
Se cuentan
Señal de Control
µP
Señal de Entrada
INT7.5
No se
cuentan
Ejemplo 2: contador de pulsos
INICIO
(subrutinas)
- Inicialización
- Cargar SP
- Quitar máscara 6.5
INT6.5
INT7.5
Habilitar int7.5
Incrementar contador
Habilitar interrupción
Sí
Sigue señal
de control?
(programa principal)
No
Mostrar resultado
RET
RET
Ejemplo 2: contador de pulsos
Programa principal:
.org
jmp
h'0000
start
.org
jmp
h'003C
int75
.org
jmp
h'0034
int65
; Salta al comienzo del programa principal
;
;
;
;
;
;
Se ubica en la posición donde esta
Salta a la etiqueta int75 donde se
interrupción.
Se ubica en la posición donde esta
Salta a la etiqueta int65 donde se
interrupción.
la int 7.5
atiende esta
la int 6.5
atiende esta
;******************PROGRAMA PRINCIPAL***********************************
.org
h'0050
start:
lxi
mvi
mvi
sim
sp,h'20FF
b,h'00
a,b'00011101
sigue:
ei
jmp
sigue
;
;
;
;
;
Inicializa el stack pointer
Se pone el contador de pulsos en cero
Se ponen máscaras sobre la 5.5 y 7.5
y se quita la correspondiente a la 6.5
además se borra el FF de la 7.5
; Se habilitan las interrupciones y se entra
; en un loop infinito...
Ejemplo 2: contador de pulsos
Subrrutinas:
;*********** INTERRUPCION 6.5 **********************************************
int65:
loop:
mvi
sim
ei
rim
ani
jnz
mov
out
mvi
mvi
sim
a,b'0011011
; Pone máscara a la 6.5 y a la 5.5 y limpia
; el FF de la 7.5
; A partir de aquí solo está habilitada la 7.5
h'20
loop
a,b
00
b,h'00
a,b'00011101
;
;
;
;
;
;
;
;
Pregunta si sigue la entrada de la 6.5
en alto para mantener la 7.5 habilitada
Cuando la señal de control baja termina de
contar y muestra el resultado.
Prepara el contador para la próxima medición
Se ponen máscaras sobre la 5.5 y 7.5,
se quita la correspondiente a la 6.5
y de paso se borra el FF de la 7.5
ret
;*************** INTERRUPCION 7.5 ******************************************
int75:
inr
ret
.end
b
; Incrementa el contador
Ejemplo 3: reloj de tiempo real
Señal de entrada (50 Hz)
INT7.5
INT7.5
Guardar “estado”
en la pila
µP
Incrementar
contador
contador = 0
Sí
“Incrementa la hora
en un segundo”
contador
= 50?
No
Recuperar “estado”
de la pila
RET
Ejemplo 3: reloj de tiempo real
Inicialización y programa principal:
.ORG
JMP
h'0000
start
; Salta al comienzo del programa principal
.ORG
JMP
h'003C
rtc
; Se ubica en la posición donde esta la rst7.5
; Salta a la etiqueta rtc donde se atiende esta
; interrupción.
;******************DEFINE ETIQUETAS*************************************
Segundos .EQU h’3000
Minutos .EQU h’3001
Horas
.EQU h’3002
Contador .EQU
h’3003
;******************PROGRAMA PRINCIPAL***********************************
.ORG h'0100
start:
LXI
SP,h'20FF
; Inicializa el stack pointer
MVI
STA
MVI
STA
MVI
STA
A,17
Horas
A,13
Minutos
A,30
Segundos
; Fija como hora inicial las 17:13:30
MVI
SIM
EI
.
.
.
.
A,b'00011011
; Se ponen máscaras sobre la 5.5 y 6.5
; y se quita la correspondiente a la 7.5
; Se habilitan las interrupciones
; El programa principal continua
; con lo suyo...
Ejemplo 3: reloj de tiempo real
Subrrutina que atiende a la rst7.5:
;****** INTERRUPCION 7.5 ******
rtc:
cont:
PUSH
PUSH
LXI
DCR
JNZ
PSW
HL
HL,Contador
M
volver
MVI
M,50
LXI
INR
MVI
CMP
JNZ
MVI
HL,Segundos
M
A,60
M
volver
M,0
; apunta a Segundos
; incrementa los segundos
INX
INR
CMP
JNZ
MVI
HL
M
M
volver
M,0
; apunta a Minutos
; incrementa los minutos
INX
INR
MVI
CMP
JNZ
MVI
HL
M
A,24
M
volver
M,0
volver: POP
POP
EI
RET
HL
PSW
; guarda acumulador y flags en la pila
; guarda contenido de HL
; decrementa
; y retorna si no llegó a cero...
; si dió 60, lo vuelve a 0
; si dió 60, lo vuelve a 0
; apunta a Horas
; incrementa las horas
; si dió 24, lo vuelve a 0
; recupera el contenido original de
; los registros H, L, A y flags
; habilita interrupciones
Descargar