|
Appunti tecniche |
|
Visite: 1092 | Gradito: | [ Medio appunti ] |
Leggi anche appunti:Solare termicoSOLARE TERMICO La conversione dell' energia della radiazione solare in calore Tempificazione, sequenze ed impulsiTempificazione, sequenze ed impulsi Tempi di risposta ed elementi di ritardo Dicesi I trasduttoriI trasduttori Il trasduttore è un dispositivo, generalmente elettrico |
TESINA DEL CORSO DI CALCOLATORI ELETTRONICI
Se ascolto dimentico ,
se guardo ricordo ,
se faccio imparo . "
DESCRIZIONE DEL SISTEMA
Il sistema realizzato , permette di implementare un orologio con scritta scorrevole ; ed è prevista inoltre la possibilità di settare anche l'orario da tastiera.
L'hardware utilizzato consiste in un processore MOTOROLA 68000 , nella memoria (sia RAM che ROM ) , nel dispositivo TERMINAL ( utilizzato sia per la stampa a video delle varie scritte che per l'acquisizione da tastiera dei comandi di settaggio dell'orario ) e da un dispositivo 1TO4INTGEN di cui è stato usato un solo timer utile per la funzione di conteggio del tempo.
CONFIGURAZIONE
Il file di configurazione creato per descrivere il sistema in ASIM è il seguente:
Come si può notare , la memoria consiste in 8 KB di ROM ( indirizzi da 0x0000 a 0x1FFF ) e 16 KB di RAM
( indirizzi da 0x8000 a 0xBFFF ) .
Per quanto riguarda invece il processore 68000 si è inizializzato l'USP ( user stack pointer ) a 9000 mentre quello SSP (supervisor stack pointer ) a 9100.
Invece il device TERMINAL è mappato agli indirizzi 0x2000 (registro dati ) e 0x2001 (registro di controllo).
Al terminale sono assegnati due livelli d'interruzione : interruzione per Enter associata alla linea 1 avente autovettore 25 e mappata a 25*4=100=$64 con idirizzo di ISR $8500 e infine un'interruzione per Buffer Full associata alla linea 2 con autovettore 26 e mappata a 104=$68 a indirizzo di ISR $8600.
Per ultimo resta da esaminare il device 1TO4INTGEN mappato a 0x2100 , si è scelto di usare un solo timer (il contatore 1 avente l'indirizzo 0x2104 ) collegato alla linea 1 .
Il timer al termine del conteggio , genera una interruzione di livello 7 , vector number #7 , mappata a 0x007C della ROM con ISR a 0x8300.
Per quanto detto prima , allora bisogna caricare nella tavola delle eccezioni le entry point delle tre ISR :
E salvare la ROM nel file "orologio.mem " .
LISTATO ASSEMBLER
A I E L L O M A R C O *
*
* C . D . L . I N G . E L E T T R O N I C A V. O . * * * * A. A. 2 0 0 7 / 2 0 0 8 *
*
ORG $8200
TERD EQU $2000 ;indirizzo di TERMINAL registro dato
TERC EQU $2001 ;indirizzo di TERMINAL registro Stato-
;Controllo
EOS EQU 0 ;codice di fine stringa
* main program : inizializza terminal , inizializza il timer , inizializza le *locazioni di memoria associate alla gestione dell'orario e della scritta *scorrevole
*poi esegue in sequenza la pulizia dello schermo , la scritta della stampa *scorrevole e la stampa dell'orario.
*Il timer e l'annessa gestione dell'orario , oltre alla gestione della tastiera *per il settaggio dell'orario , sono tutte effettuate mediante interruzioni.
BEGIN JSR INIT_TERM ;inizializza terminal
JSR INIT_CLOCK ;inizializza cifre orologio
;tutte a 0
JSR INIT_TIMER ;inizializza timer
MOVE.W SR,D0 ;legge il registro di stato
ANDI.W #$D8FF,D0 ;maschera per reg stato ;(stato utente, int ;abilitati)
MOVE.W D0,SR ;pone liv int a 000
LOOP JSR CLEAR_TERM ;pulisce video
JSR STAMPA ;stampa scritta scorrevole
JSR STAMPA_ORA ;stampa orario
JMP LOOP ;ripete daccapo le stampe
scritta DC.B ' '
DC.B '****** A I E L L O M A R C O '
DC.B ' M A T R . 0 4 5 / 0 0 4 4 3 7 '
DC.B ' C . D . L . I N G . E L E T T'
DC.B ' R O N I C A V . O . ****** '
DC.B ' ',0 ;carattere di fine ;stringa
indice DS.W 1 ;indice vettore scritta
num_caratteri EQU $26 ;decide quanti caratteri ;stampare sullo schermo
decine_ora DS.B 1 ;decine di ore
unita_ora DS.B 1 ;unità ore
decine_min DS.B 1 ;decine di minuti
unita_min DS.B 1 ;unità minuti
scelta DS.B 1 ;se ad 1 ENTER incrementa le ;ore , se a 2 i minuti
ISR DA TIMER CHE SI OCCUPA DELLA GESTIONE DELL'OROLOGIO
*ad essa è associato il livello d'interruzione 7 ( NMI )
* autovettore 24 + 7 = 31 , mappata a 31 * 4 = 124 = $7C , ISR a $8300
ORG $8300
COUNT1INT EQU $2104 ; indirizzo del timer: ;interruzione generata
COUNT1N EQU $2106 ;indirizzo del timer: valore ;iniziale del conteggio
RITARDO EQU $FF4F ;ritardo che il timer deve ;generare
JSR OROLOGIO
MOVE.W #RITARDO,COUNT1N ;carica il timer col valore ;del ritardo da generare
NOP
RTE
ISR DA TERMINAL CHE SI OCCUPA DELLA LETTURA DEI TASTI PER LA REGOLAZIONE DELL'OROLOGIO
*Al terminale sono associati due livelli d'interruzione:
*1-Interruzione per Enter: livello 1, autovettore 25, mappata a $64, ISR a $8500
*2-Interruzione per Buffer Full: livello 2, autovettore 26, mappata a $68, ISR a
ORG $8500 ;ISR PRESSIONE ENTER
TASTO1 EQU $31 ;codice ASCII tasto 1
TASTO2 EQU $32 ;codice ASCII tasto 2
ENTER MOVE.W D0,-(A7) ;push di D0
MOVE.B TERD,D0 ;in D0 ultimo carattere ;digitato sulla tastiera (1 ;oppure 2)
CMP #TASTO1,D0 ;vede se è stato premuto il ;tasto '1'
BNE VEDISE2 ;se non è stato premuto '1' ;salta a VEDISE2
JSR INC_MIN ;chiamata subroutine ;incremento minuti
ENTERFINE ORI.B #$1B,TERC
MOVE.W (A7)+,D0 ;pop di D0
RTE
VEDISE2 CMP #TASTO2,D0 ;vede se è stato premuto il ;tasto '2'
BNE ENTERFINE ;se non è stato premuto ;nemmeno '2' salta a ;ENTERFINE
JSR INC_ORA ;chiamata subroutine ;incremento ore
BRA ENTERFINE
ISR DA BUFFER FULL
*abilita le int. su buffer full , abilita le int. su pressione di enter , pulisce *il buffer della tastiera , abilita la tastiera
ORG $8600
BUFFER_FULL ORI.B #$1B,TERC
RTE
** ** ** ** ***** AREA SOTTOPROGRAMMI ** ** ************
*sottoprogramma che si occupa della gestione dell'orologio
*ad ogni chiamata incrementa l'orario di un minuto e controlla se deve
*incrementare anche le ore
OROLOGIO ADDQ.B #1,unita_min ;unita_min=unita_min+1
CMP.B #$0A,unita_min ;vede se uguali a 10 ;(overflow sulle unità)
BNE END_OROLOGIO ;se niente overflow su unità ;esci
MOVE.B #$00,unita_min ;azzera unità minuti
ADDQ.B #1,decine_min ;decine_min=decine_min+1
CMP.B #$06,decine_min ;vede se uguali a 6
BNE END_OROLOGIO ;se niente overflow su decine ;unità esci
MOVE.B #$00,decine_min ;azzera decine minuti
ADDQ.B #1,unita_ora ;unita_ora=unita_ora+1
CMP.B #$0A,unita_ora ;vede se uguali a 10
BNE TEST ;se niente overflow su unita ;ore esci
MOVE.B #$00,unita_ora ;azzera unita ore
ADDQ.B #1,decine_ora ;decine_ora=decine_ora+1
TEST CMP.B #$02,decine_ora ;vede se uguali a 2
BNE END_OROLOGIO ;se decine ora != 2 esce
CMP.B #$04,unita_ora ;vede se uguali a 2
BNE END_OROLOGIO ;se unita_ora != 4 esce
MOVE.B #$00,unita_ora ;azzera unita_ora
MOVE.B #$00,decine_ora ;azzera decine_ora
END_OROLOGIO RTS ;fine subroutine
*sottoprogramma che ripulisce lo schermo di terminal
CLEAR_TERM ORI.B #$04,TERC ;pulisce schermo
RTS
*sottoprogramma per l'inizializzazione di terminal : abilita le int. da buffer full
*abilita le int. su enter , cancella il video , pulisce il buffer da tastiera , abilita la tastiera
*disabilita eco , pulisce flag di buffer full , pulisce flag di enter premuto
INIT_TERM MOVE.B #$1f,TERC ;seleziona indirizzo ;stato/controllo
MOVE.W A0,-(A7) ;push di A0
MOVE.W D0,-(A7) ;push di D0
LEA indice,A0
MOVEQ #0,D0
MOVE D0,(A0) ;azzera indice
MOVE.W (A7)+,D0 ;pop di D0
MOVE.W (A7)+,A0 ;pop di A0
RTS
*sottoprogramma per l'inizializzazione del timer in 1TO4INTGEN : si usa la linea 0 e la priorità è quella 7 , si carica inoltre il timer
*col valore del ritardo da generare ( pari ad un minuto )
INIT_TIMER MOVE.W #$0700,COUNT1INT ;al termine del conteggio ;sarà generata ;un'interruzione di livello 1
MOVE.W #RITARDO,COUNT1N ;carica il timer col valore ;del ritardo da generare
RTS
*sottoprogramma per l'azzeramento delle locazioni dei minuti e delle ore
INIT_CLOCK MOVE.B #0,decine_ora ;azzera decine ore
MOVE.B #0,unita_ora ;azzera unità ore
MOVE.B #0,decine_min ;azzera decine minuti
MOVE.B #0,unita_min ;azzera unità minuti
MOVE.B #1,scelta ;azzera scelta
RTS
*sottoprogramma che incrementa di uno i minuti ad ogni chiamata
INC_MIN ADDQ.B #1,unita_min ;unita_min=unita_min+1
CMP.B #$0A,unita_min ;vede se uguali a 10 ;(overflow sulle unità)
BNE END_OROLOGIO ;se niente overflow su unità ;esci
MOVE.B #$00,unita_min ;azzera unità minuti
ADDQ.B #1,decine_min ;decine_min=decine_min+1
CMP.B #$06,decine_min ;vede se uguali a 6
BNE END_INC_MIN ;se niente overflow su decine ;unità esci
MOVE.B #$00,decine_min ;azzera decine minuti
END_INC_MIN RTS
*sottoprogramma che incrementa di uno le ore ad ogni chiamata
INC_ORA ADDQ.B #1,unita_ora ;unita_ora=unita_ora+1
CMP.B #$0A,unita_ora ;vede se uguali a 10
BNE TEST_ORA ;se niente overflow su unita ;ore esci
MOVE.B #$00,unita_ora ;azzera unita ore ADDQ.B #1,decine_ora ;decine_ora=decine_ora+1
TEST_ORA CMP.B #$02,decine_ora ;vede se uguali a 2
BNE END_ORA ;se decine ora != 2 esce
CMP.B #$04,unita_ora ;vede se uguali a 2
BNE END_ORA ;se unita_ora != 4 esce
MOVE.B #$00,unita_ora ;azzera unita_ora MOVE.B #$00,decine_ora ;azzera decine_ora
END_ORA RTS
*sottoprogramma per la stampa dell'orario su terminal
STAMPA_ORA MOVE.W D0,-(A7) ;push di D0
MOVE.W D1,-(A7) ;push di D1
MOVE.B #$36,D0 ;carica indice
MOVE.B #$20,D1 ;D1 = ' '
STAMPA_LOOP MOVE.B D1,TERD ;stampa su terminal
SUBQ #1,D0 ;decrementa indice
BNE STAMPA_LOOP ;se non nullo ripete
MOVE.B #$30,D0 ;D0 = '0'
MOVE.B decine_ora,D1 ;D1= decine_ora
ADD D0,D1 ;converte in codice ASCII
MOVE.B D1,TERD ;stampa cifra
MOVE.B #$30,D0 ;D0 = '0'
MOVE.B unita_ora,D1 ;D1= unita_ora
ADD D0,D1 ;converte in codice ASCII
MOVE.B D1,TERD ;stampa cifra
MOVE.B #$20,D1 ;D1 = ' '
MOVE.B D1,TERD ;stampa su terminal
MOVE.B #$3A,D1 ;D1 = ' : '
MOVE.B D1,TERD ;stampa su terminal
MOVE.B #$20,D1 ;D1 = ' '
MOVE.B D1,TERD ;stampa su terminal
MOVE.B #$30,D0 ;D0 = '0'
MOVE.B decine_min,D1 ;D1= decine_min
ADD D0,D1 ;converte in codice ASCII
MOVE.B D1,TERD ;stampa cifra
MOVE.B #$30,D0 ;D0 = '0'
MOVE.B unita_min,D1 ;D1= unita_min
ADD D0,D1 ;converte in codice ASCII
MOVE.B D1,TERD ;stampa cifra
MOVE.B #$16,D0 ;carica indice
MOVE.B #$20,D1 ;D1 = ' '
L2 MOVE.B D1,TERD ;stampa su terminal
SUBQ #1,D0 ;decrementa indice
BNE L2 ;se non nullo ripete
MOVE.W (A7)+,D1 ;pop di D1
MOVE.W (A7)+,D0 ;pop di D0
RTS
STAMPA MOVE.W A0,-(A7) ;push di A0
MOVE.W A1,-(A7) ;push di A1
MOVE.W A2,-(A7) ;push di A2
MOVE.W #0,D0 ;azzera D0 usato come indice ;car. video
LEA scritta,A0 ;in A0 indirizzo costante da ;stampare
MOVE.W indice,A2 ;indice in A2
ADDA A2,A0 ;ottiene indirizzo corrente ;scritta da stampare
LEA TERD,A1 ;in A1 indirizzo reg. dati ;terminal
LOOP_STAMPA MOVE.B (A0)+,(A1) ;stampa carattere dal buffer ;ed incr. puntatore
ADDQ #1,D0 ;incrementa contatore ;caratteri stampati
CMP #num_caratteri,D0 ;vede se ho raggiunto il ;limite dei caratteri da ;stampare
BEQ FINE_STAMPA ;se si salta a FINE_STAMPA
BRA LOOP_STAMPA ;altrimenti salta a ;FINE_STAMPA
FINE_STAMPA CMP.B #EOS,(A0) ;vede se ho raggiunto fine ;scritta
BEQ RESETTA_SCRITTA ;se si salta a ;RESETTA_SCRITTA
RIPRISTINA_STAMPA MOVE.W (A7)+,A2 ;pop di A2
MOVE.W (A7)+,A1 ;pop di A1
MOVE.W (A7)+,A0 ;pop di A0
ADDQ #1,indice ;incrementa indice scritta ;scorrevole
USCITA_STAMPA RTS ;fine subroutine
RESETTA_SCRITTA MOVE.W #0,indice ;resetta indice scritta ;scorrevole
BRA RIPRISTINA_STAMPA ;ritorna
END BEGIN
ESEMPIO DI UTILIZZO
Una volta scritto il file assembler visto precedentemente e assemblatolo con AsmTool :
Si lancia il simulatore ASIM e si carica il file di configurazione "orologio.cfg" , si preme il tasto del "tiro al bersaglio" e si aprono le finestre di tutti i componenti specificati nel file :
In seguito dal menù "simulation" si seleziona "ON RESET".
Attivando la finestra "MEMORY" dal menù "memory" si seleziona poi "show ROM" ed in seguito sempre da questo stesso menù , si sceglie "load memory" e si carica il file "orologio.mem" che contiene la tabella delle eccezioni.
Successivamente si sceglie la finestra "M68000" e dal menù "Proc Unit" si sceglie la voce "load assembler" caricando così il file "orologio.lis" , successivamente dal menù "simulation" scegliendo l'opzione "run" , il programma è mandato in esecuzione e dalla finestra "TERMINAL" è possibile osservare la comparsa della scritta scorrevole e dell'orario :
Per incrementare i minuti bisogna (sempre selezionando la finestra di TERMINAL) digitare 1 e premere ENTER mentre per incrementare invece le ore bisogna invece digitare 2 e premere ENTER.
Appunti su: |
|
Appunti Gestione | |
Tesine costruzione | |
Lezioni Ingegneria tecnico | |