Home
Accesso / Registrazione
 di 

Alla scoperta dei D.S.P. Sesta puntata - 4

Alla scoperta dei D.S.P

IL SOFTWARE SPEC50.ASM

Il programma appare piuttosto complesso e per questo motivo abbiamo riportato in queste pagine alcuni blocchi fondamentali avendo cura di commentarli adeguatamente in italiano. Il primo blocco di programma che incontriamo (BLOCCO 1) rappresenta una tabella che riporta le formule necessarie per il calcolo del valore delle frequenze di campionamento dell’AIC. Come si può notare, queste frequenze dipendono dai valori contenuti nei registri TA, RA, TB, RB. Al termine della tabella, che non è composta da istruzioni ma solo da commenti, troviamo un blocco di istruzioni (BLOCCO 3) necessario per associare a dei numeri, utilizzati poi come label, dei valori esadecimali. Questo blocco assegna inizialmente il valore zero a tutte (meno una) le label: associando in seguito il valore 1 a una di queste label è possibile scegliere dei valori opportuni per TA e RA e di conseguenza la frequenza di campionamento e il rapporto segnale/rumore.

Dopo aver selezionato la frequenza di campionamento è possibile, attraverso le istruzioni contenute nel successivo blocco (non riportato nell’articolo), far apprendere al programma la scelta fatta: questa fase viene realizzata mediante le pseudo-istruzioni “.if” e “.endif”.

Da questo punto in poi possiamo dire che comincia il vero programma (BLOCCO 2). La prima parte delle istruzioni contenute in questo blocco consente di definire le aree di memoria riservate al passaggio dei dati, successivamente troviamo l’istruzione “mmregs” che mappa in memoria i registri del DSP e le istruzioni di settaggio degli interrupt e di abilitazione del funzionamento dell’AIC. La parte seguente del programma rappresenta il “main program” e da qui partono tutte le chiamate alle varie subroutine.

La prima ad essere invocata è la “init_s” che ha il compito di inizializzare il buffer dei dati, in pratica “riempie” quest’ultimo con 512 campioni del segnale di ingresso. Se osserviamo la prima riga di questa subroutine notiamo che il registro ausiliario è caricato con un dato che non è presente all’interno di questo programma, questo valore rappresenta un indirizzo di memoria definito nel file “dsk_twid.asm” e richiamato proprio grazie all’istruzione “include” posta in fondo al programma. Prima di tornare al corpo centrale del programma viene chiamata un’altra subroutine la “TO_HOST” che si occupa di inviare alla porta seriale del PC i dati prelevati dal DSP. In questa zona di programma vengono chiamate due subroutine che hanno il compito di gestire la comunicazione tra il DSP, l’AIC e il personal computer.

;**************************************************************************
;SUBROUTINE XMIT
;**************************************************************************
XMIT:
CLRC c ;Azzera il Carry (bit di start)
LAR ar1,#8 ;Carica in AR1il valore 8 hex
;CONTATORE: 1 startbit + 8 databits
;(+ 2 stopbits)
nextbit1: BCND snd0,nc ;Salta alla label SND0 se non c’è Carry
snd1: SETC xf ;Poni a uno il pin XF
B snd ;Salta alla label SND
snd0: CLRC xf ;Azzera il pin XF
snd: RPT #BITLEN ;Ripeti A8 h volte l’istruz. seguente
MAR *,ar1 ;Seleziona il reg. AR1
ROR ;Poni l’ lsb dell’Acc. nel Carry
BANZ nextbit1,*- ;Salta a NEXTBIT1 quando AR1 è 0
SETC xf ;Setta a 1 il pin XF
RPT #BITLEN ;Ripeti A8 h volte l’istruzione seguente
NOP
RPT #BITLEN ;Ripeti A8 h volte l’istruzione seguente
NOP
RET ;Ritorno dala subroutine
;**************************************************************************
;SUBROUTINE BRECV
;**************************************************************************
BRECV:
wait BCNDD STOK,bio ;Salta alla label STOK dopo aver
;eseguito le due istruzioni successive,
;se il piedino di BIO è a 0 carica AR7
;con il valore 7
LAR AR1,#7 ;Carica Ar1 con 7
LACL #0 ;Azzera l’Acc.
B wait ;Salta alla label Wait
STOK: RPT #BITLEN2 ;Ripeti 54 volte l’istruzione seguente
NOP
MAR *,AR1 ;Seleziona il reg. AR1
WTBIT SFR ;Muovi Acc. verso destra
RPT #BITLEN ;Ripeti A8 h volte l’istruzione seguente
NOP
BCND ZEROBT,bio ;Salta a ZEROBIT se BIO è basso
ADD #80h ;Somma all’Acc. in numero 80 hex
ZEROBT: BANZ WTBIT,*- ;Salta a WTBIT se AR1 è 0
RET ;Ritorno dalla subroutine

;*************************************************************************
;SUBROUTINE FFT
;*************************************************************************
FFT:
MAR *,AR0 ;Seleziono il registro AR0
SAR AR0,FFT_S ;Memorizzo il dato contenuto
;in AR0 nella locazione FFT_S
MAR *- ;Decremento AR0
SAR AR0,FFT_S-1 ;Memorizzo il dato contenuto in
:AR0C nella locazione FFT_S-1
MAR *+ ;Incremento AR0
MAR *BR0+ ;Il contenuto di AR0 viene usato
;come indirizzo di memoria per
;i dati, il contenuto del reg. INDX
;viene sommato con la modalità
;carry reverse
SAR AR0,FFT_S/2 ;Memorizzo il dato contenuto in
;AR0 nella locazione FFT_S/2
MAR *- ;Decremento AR0
SAR AR0,FFT_S/2-1 ;Memorizzo il dato contenuto nella
;locazione FFT_S/2-1
;CREAZIONE BUFFER CIRCOL.
LAR AR0,FFT_S/2 ;Carico AR0 con FFT_S/2
new_stg LAR AR1,#_D_base ;AR1 è utilizzato come indirizzo
;più alto
LAR AR2,#_D_base ;AR2 è utilizzato come indirizzo
;più basso
LAR AR3,#_T_base+1 ;AR3 viene utilizzato per
;puntare all’indirizzo di memoria
;contenente i coefficienti per le
;moltiplicazioni (twiddle)
LAR AR4,FFT_S/2 ;AR4 è caricato con FFT_S/2 e
;utilizzaro come contatore
B n_DFT2,*,AR1 ;Salta alla label n_DFT2 e
;seleziona AR1
DFT: MAR *BR0+,AR5 ;Somma al registro ausiliario in
;uso il reg. INDX, seleziona AR5
LAR AR5,#1 ;Carica AR5 con valore 1
MAR *BR0+,AR1 ;Somma al registro ausiliario in
;uso il reg. INDX, seleziona AR1
;---------------------------------------------------------------------------------------
n_DFT2: MAR *0+ ;Somma AR1 con il reg. INDX
MAR *0+,AR4 ;Somma AR1 con il reg. INDX,
;cambia registro
BANZ DFT,*0-,AR3 ;Salta alla label DFT se il
;contenuto del reg. in uso meno
;il contenuto di INDX è 0,
;cambia registro
MAR *,AR0 ;Seleziona AR0
MAR *BR0+ ;Somma ad AR0 il reg. INDX in
;modalità Carry Reverse
BANZ new_stg,* ;Salta a new_stg se il contenuto del
;reg. ausiliario in uso è 0
B endFFT ;Salta alla label endFFT
;-----------------------------------------------------———————————-
RET ;Ritorna dalla subroutine

Una volta tornati al MAIN viene eseguita un’altra subroutine, denominata “FFT” (riportata parzialmente in questa pagina), il cui compito è quello di calcolare la trasformata di Fourier dei campioni registrati in memoria. In questa subroutine viene creato un buffer circolare per rendere più veloci le operazioni di moltiplicazione tra i dati e i coefficienti presenti all’interno del file “dsk_twid.asm”. La sezione che si occupa di calcolare la FFT è la più complessa di tutto il programma ed è anche quella che impiega maggiormente il microprocessore a livello di calcoli in quanto deve suddividere i dati presenti nell’array creato all’inizio del programma in due parti, una reale ed una immaginaria: quest’ultima è necessaria per determinare le frequenze presenti all’interno del segnale e per poterne calcolare le ampiezze. All’interno della subroutine “FFT” troviamo anche una ulteriore subroutine che si occupa di generare la sequenza di Bit Reverse utilizzata per memorizzare in modo corretto i dati elaborati dal programma.

Dopo aver esaurito i calcoli relativi alla FFT, la sequenza di dati calcolati viene modificata al fine di ottenere dei valori adatti ad essere rappresentati sullo schermo di un PC. Il controllo del programma torna ora alla sezione MAIN in cui si provvede al test del bit ONEPASS. Se tale bit è allo stato logico 1 viene chiamata nuovamente la subroutine “TO_HOST” e i dati vengono inviati al PC e quindi allo schermo. Al contrario, se il bit ONEPASS è a zero viene eseguita la subroutine “init_d”. Quest’ultima compie le stesse operazioni della “init_s” sopra descritta utilizzando però per i suoi calcoli la media dei valori ottenuti dal campionamento. L’ultima parte del programma Spec50 è rappresentata dalla subroutine “XMIT”, richiamata a sua volta dalla subroutine “TO_HOST”, che si occupa di inviare i dati al PC rispettando i protocolli di trasmissione seriale.

Il kit è disponibile da Futura Elettronica

 

 

Scrivi un commento all'articolo esprimendo la tua opinione sul tema, chiedendo eventuali spiegazioni e/o approfondimenti e contribuendo allo sviluppo dell'argomento proposto. Verranno accettati solo commenti a tema con l'argomento dell'articolo stesso. Commenti NON a tema dovranno essere necessariamente inseriti nel Forum creando un "nuovo argomento di discussione". Per commentare devi accedere al Blog

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ci sono attualmente 12 utenti e 70 visitatori collegati.

Ultimi Commenti