soluciones - Facultad de Ingeniería

Anuncio
Facultad de Ingeniería – UDELAR
Int. a los microprocesadores – JULIO 2011
SOLUCIONES
pag. 1/4
SOLUCIÓN PROBLEMA 1
a) Hardware
-- Memorias:
R O M
A[14..0]
Add[]
R A M
D[7..0]
Data[]
A[14..0]
O R 2
/ M R E Q
C S
O E
inst16
A 1 5
D[7..0]
C S
O E
W E
/ R D
N O T
inst15
/ W R
inst32
/ R D
Data[]
O R 2
/ M R E Q
A 1 5
Add[]
-- Puertos, decodificación e Interrupciones.
A[7]
NOT
A 0
A 1
inst17
A[6]
deco_1de4
inst14
NOT
OR4
Y
Y
Y
Y
A 1
A 0
inst19
0
1
2
3
IDSP_req_umbral
IDSP_dat_umbral_1
IDSP_dat_umbral_2
IDSP_adc
A[7]
A[6]
NOT
A 0
A 1
OR4
deco_1de4
Y
Y
Y
Y
A 1
A 0
inst28
0
1
2
3
ODSP_ack_umbral
ODSP_bandera
ODSP_amplitud
G
/IORQ
/ W R
DECO
inst18
inst13
inst27
G
/IORQ
/RD
NOT
inst21
inst1
DECO
inst26
IDSP_dat_umbral_1
N O T
inst8
dat_umbral_1
D[6..0]
TRI
IDSP_adc
inst7
N O T
inst24
A/D
senal
IDSP_dat_umbral_2
N O T
Vin
D[6..0]
conv[6..0],conv[7..0]
TRI
D[7..0]
inst20
conv[7]
inst10
G N D
dat_umbral_2
D[6..0]
TRI
inst9
D F F
T I C
D
PRN
N O T
Q
inst5
/INT
V C C
inst
O R 2
A N D 2
/ I O R Q
/reset
PRN
T R I
Q
CLRN
inst3
ODSP_ack_umbral AND2
inst31
D F F
D
req_umbral
CLRN
inst12
/ M 1
N O T
IDSP_req_umbral
V C C
/reset
inst30
inst29
D F F
D 0
D
PRN
ODSP_bandera
CLRN
inst6
/reset
bandera
D[7..0]
Q
D F F
D
ODSP_amplitud
PRN
CLRN
inst11
amplitud
Q
inst4
D 0
Facultad de Ingeniería – UDELAR
Int. a los microprocesadores – JULIO 2011
SOLUCIONES
b) Inicialización y reserva mem.
adc
EQU 0xC3
datumb_2 EQU 0xC2
datumb_1 EQU 0xC1
req_umb EQU 0xC0
ack_umb EQU 0xC0
bandera EQU 0xC1
amplitud EQU 0xC2
umb1_ini EQU 20
umb2_ini EQU 5
.Org 0x8000
umbral_1 DB
umbral_2 DB
Dat_ant DB
Estado
DB
Máximo
DB
pag. 2/4
;
bandera = 0x00
;
Estado = reposo (0x00)
;
amplitud = Máximo
;
}else{
;
if (Dato_leído > Máximo){
;
Máximo = Dato_leído
;
}
;
}
; }
; Dat_ ant = Dato_leído
; restauro registros y retorno
; Nota: Tener en cuenta que tanto los datos
; leídos del ADC como los umbrales siempre
; son positivos y menores que 128.
.Org 0x38
PUSH AF
.Org 0x0000
PUSH BC
LD SP, 0x0000
PUSH HL
LD A, umb1_ini
LD A, (Dat_ant)
LD (umbral_1), A
LD B, A
LD A, umb2_ini
IN A, (adc)
LD (umbral_2), A
LD C, A; Guardo en C dato leído de ADC
LD A, 0x00
LD A, (Estado)
LD (Dat_ant), A
AND 0xFF
LD (Estado), A
JP NZ, Pico
LD (Máximo), A
LD HL, umbral_1
OUT (amplitud), A
LD A, C
IM 1
SUB B
; dato_leido - dat_ant
EI
CP (HL)
; menos umbral1
JP Loop
JP M, Fin
; Si positivo → comienzo de pico
c) Loop programa principal
; si no reposo
; for (true) {
LD A, 0xFF
; Leo req_umbral
OUT (bandera), A
; if (req_umbral == 1){
LD (Estado),A
;
actualizo umbral_1
LD A, C
;
actualizo umbral_2
LD (Máximo), A
;
doy pulso ack_umbral
JP Fin
;
}
Pico: LD A, C
; }
LD HL, umbral_2
.Org 0x100
CP (HL)
; dejo lugar para la rutina de
JP P, Máx
; atención a la interrupción
; Si es positivo no se cumple
Loop: IN A, (req_umb)
; cond. de salida de pico
BIT 0, A
LD A, B
; dat_ant
JP Z, Loop
CP (HL)
IN A, (datumb_1)
JP P, Máx
AND 0x7F
; Se cumple cond. de salida de pico
LD (umbral_1), A
LD A, 0x00
IN A, (datumb_2)
OUT (bandera), A
AND 0x7f_
LD (Estado), A
LD (umbral_2), A
LD A, (Máximo)
OUT (ack_umb), A
OUT (amplitud), A
JP Loop
JP Fin
Máx:
LD A, (Máximo); comparo maximo
d) Rutina atención interrupciones
CP C
; con C (dato_leido)
; preservo registros
JP P, Fin
; Dato_leido = puerto_adc
LD A, C
; maximo = Dato_leido
; if (Estado == reposo){
LD (Máximo), A
;
if (Dato_leido – Dat_ant – umbral1 > 0){ Fin:
LD A, C
;
bandera = 0xFF
LD (Dat_ant), A
;
Estado = pico (0xFF)
POP HL
;
Máximo = Dato_leído
POP BC
;
}
POP AF
; } else{
EI
;
if ( (Dato_leido < umbral2) and
RET
;
(Dat_ant < umbral2)){
Facultad de Ingeniería – UDELAR
Int. a los microprocesadores – JULIO 2011
SOLUCIONES
pag. 3/4
SOLUCIÓN PROBLEMA 2
a) Hardware.
El protocolo descrito para los pares de señales from_T, to_T y from_R, to_R coincide con el
comportamiento de las señales RDY y STB\ del PIO. Conecto dispositivo T a puerto A porque
debe tener mayor prioridad.
Memorizo el byte alto de Dato_T con flanco de subida de from_T en un registro y agrego puertos
de 8 bits para byte alto de Dato_T y Dato_R
D[7..0]
N O T
A[6]
A[5]
A[4]
B/A\
C/D\
CE\
Clk
Dato_R[7..0]
to_R
from_R
PB[7..0]
B R D Y
BSTB\
C K
inst1
Dato_T[7..0]
to_T
from_T
PA[7..0]
A R D Y
ASTB\
M1\
IORQ\
RD\
A[0]
A[1]
O R 4
inst2
IEI
D0..D7
M 1
I O R Q
R D
A[7]
V C C
pio
IEO
INT\
int
inst
Dato_T[15..8]
from_T
D F F
D
PRN
inst5
Q
D[7..0]
D[7..0]
T R I
CLRN
inst4
A[4]
A[7]
A[6]
A[5]
A[4]
inst6
O R 6
N O T
inst12
N O T
inst8
I O R Q
W R
O R 6
N O T
inst7
D
PRN
CLRN
inst9
I O R Q
R D
A[7]
D F F
A[6]
A[5]
N O T
inst13
inst10
Q
Dato_R[15..8]
Facultad de Ingeniería – UDELAR
Int. a los microprocesadores – JULIO 2011
SOLUCIONES
b) Inicialización y reserva memoria
PIOconf_A
PIOconf_B
DatoT_low
DatoT_high
DatoR_low
DatoR_high
EQU
EQU
EQU
EQU
EQU
EQU
0x82
0x83
0x80
0x90
0x81
0x90
.Org 0x1000; Tabla en ROM
tabla_int:
DW rutint_T
DW rutint_R
.Org 0x8000; En RAM
R_Busy DB 0x00
.Org 0x0000
LD SP, 0x0000
;Config. PIO, canal A, dispositivo T
LD A, 01001111; Modo 1, entrada
OUT (PIOconf_A), A
LD A, 00000000; Vector int.
OUT (PIOconf_A), A
LD A, 10000011; Habilit. int.
OUT (PIOconf_A), A
;Config. canal B, dispositivo R
LD A, 00001111; Modo 0, salida
OUT (PIOconf_B), A
LD A, 00000010; Vector int.
OUT (PIOconf_B), A
LD A, 10000011; Habilit. Int.
OUT (PIOconf_B), A
IN A, (DatoT_low)
LD A, 0x00
LD (R_Busy), A
LD A, 0x10
LD I, A
IM 2
EI
CALL iniotros
Loop: CALL otros
JP Loop
; para subir RDY
pag. 4/4
c) Rutina interrupción Dispositivo R
;
preservo registros
;
si GetFifo devuelve dato
;
escribo dato en puerto
;
else
;
R_Busy = 00h
;
fin_si
;
restauro registros
;
habilito int, retorno
.Org 0x0200
rutint_R:
PUSH AF
PUSH BC
CALL GetFifo ; entre que verifico cola
; vacía y escribo R_Busy no deben
; entrar interrupciones del otro
; dispositivo
JP Z, enviar
LD A, 0x00
LD (R_Busy), A
EI
JP finR
enviar: EI
LD A, B
OUT (DatoR_high), A
LD C, A
OUT (DatoR_low), A
finR: POP BC
POP AF
RETI
d) Rutina interrupción Dispositivo T
;
preservo registros
;
leer dato de puerto
;
si (R_Busy = 0) entonces
;
escribo dato en puerto
;
R_Busy = FFh
;
else
;
PutFifo(dato)
;
fin_si
;
restauro registros
;
habilito int, retorno
rutint_T:
PUSH AF
PUSH BC
IN A, (DatoT_high)
LD B, A
IN A, (DatoT_low)
LD C, A
LD A, (R_Busy)
BIT 0, A
JP NZ, busy
LD A, 0xFF
LD (R_Busy), A
LD A, B
OUT (DatoR_high), A
LD A, C
OUT (DatoR_low), A
JP finR
busy: CALL PutFifo
finR: POP BC
POP AF
EI
RETI
Descargar