
esercizio_19
By: a guest on
Jun 17th, 2012 | syntax:
ASM (NASM) | size: 2.71 KB | hits: 83 | expires: Never
Esercizio 19
Un processore PD32 è responsabile del controllo della saturazione del gas all’interno di una stanza. Per
far questo utilizza quattro sensori di gas disposti lungo il perimetro della stanza. Ogni SENSORE, una
volta avviato, interromperà il processore PD32 al superamento di una soglia fissata e preprogrammata
nella fase d’inizializzazione del sistema. Tale soglia è definita: SOGLIA. La saturazione del gas è
definita come un valore positivo a 16 bits. Il servizio associato all’interruzione è il seguente: il
processore preleva il valore della saturazione prodotto dal sensore che ha generato l’interruzione e
calcola la media tra esso e le ultime tre rilevazioni degli altri sensori. Se questa nuova media supera
quella calcolata durante la gestione dell’interruzione precedente, il PD32 scrive il valore 1 (su 32 bit)
su una periferica di output ALLARME, sincrona e direttamente interfacciata al processore. In caso di
non superamento scrive il valore 0 (su 32 bit) sulla stessa periferica ALLARME.
Per semplicità si ipotizzi che i valori iniziali associati alle quattro saturazioni precedentemente rilevate
siano SAT_SENS e che il valore iniziale della media delle saturazioni sia SAT_MEDIA.
Il sistema deve essere ciclico, in altre parole a ogni rilevazione bisogna riattivare il sensore per un
nuovo monitoraggio.
Tutti i driver sono non interrompibili.
Progettare:
- il SCA dell’interfaccia di un SENSORE e ALLARME;
- il software di attivazione del sistema, ed i driver di tutti i sensori;
Suggerimento: utilizzare una subroutine per il calcolo della media.
ORG 400H
SE1 EQU 0H
SE2 EQU 1H
SE3 EQU 2H
SE4 EQU 3H
ALARM EQU 4H
VAL EQU 500H
SATSENS EQU X
SATMED EQU Y
CODE
JSR INIT
LOOP: NOP
JMP LOOP
INIT: PUSH R0
MOVL #VAL,R0
MOVW #SATSENS,(R0)
MOVW #SATSENS,2(R0)
MOVW #SATSENS,4(R0)
MOVW #SATSENS,6(R0)
MOVW #SATMED,8(R0)
START SE1
START SE2
START SE3
START SE4
OUTL #0,ALARM
POP R0
RET
MEDIA: PUSH R0
PUSH R1
PUSH R2
MOVL #VAL, R0
MOVW R0, R1
MOVW 8(R0), R2
ADDW 2(R0), R1
ADDW 4(R0), R1
ADDW 6(R0), R1
LSRW #2,R1
SUBW R1,R2
JNC C0
JMP NOSUP
C0: JNZ Z0
JMP NO SUP
Z0: OUTL #1, ALARM
JMP EXIT
NOSUP: OUTL #0, ALARM
EXIT: MOVW R1, 8(R0)
POP R2
POP R1
POP R0
RET
HALT
DRIVER SE1, 700H
PUSH R0
MOVL #VAL, R0
INW SE1, (R0)
JSR MEDIA
START SE1
POP R0
RTI
DRIVER SE2, 800H
PUSH R0
MOVL #VAL, R0
INW SE2, 2(R0)
JSR MEDIA
START SE2
POP R0
RTI
DRIVER SE3, 900H
PUSH R0
MOVL #VAL, R0
INW SE3, 4(R0)
JSR MEDIA
START SE3
POP R0
RTI
DRIVER SE4, 1000H
PUSH R0
MOVL #VAL, R0
INW SE4, 6(R0)
JSR MEDIA
START SE4
POP R0
RTI
END