Introduzione
Salve,
credo che tutti almeno una volta abbiamo avuto a che fare con l’8870, il
più famoso e diffuso decodificatore di segnali DTMF. Esso infatti, è
presente in molte applicazioni sia hobbystiche che professionali, con un
corredo molto vasto di esempi ed applicazioni. Un parente strettissimo
dell’8870 di cui ho avuto bisogno di avvalermi recentemente, e di cui
desidero parlarvi in queste righe è l’MT8889. Non lasciatevi intimorire
dal tipo di gestione, che richiede esclusivamente l’adozione di circuiti
a microcontrollore od a microprocessore. L’MT8889 racchiude al suo
interno un validissimo, nonché efficientissimo ricevitore e trasmettitore
full duplex per segnali DTMF. Dispone inoltre di un sensibile e selettivo
circuito, chiamato sul datasheet “call progress”, grazie al quale, nel
caso venisse utilizzato sulle linee telefoniche, sarebbe in grado di
determinare con esattezza se la linea telefonica sulla quale si sta
operando, è libera od occupata; semplicemente testando il tono di
chiamata o di squillo.
Tutte le procedure che troverete descritte più avanti, ovviamente sono state tratte dal datasheet molto dettagliato ed esauriente che ho trovato in rete, e riguarderanno esclusivamente le prove da me effettuate in laboratorio, inerenti la ricezione e la trasmissione dei toni DTMF; demandando a chi legge eventuali approfondimenti circa l’utilizzo della sezione “call progress”.
Cominciamo
con l’esaminare lo schema a blocchi interno dell’MT8889 visibile in
Fig.1, focalizzando la nostra attenzione sul registro di comunicazione
“Data Bus Buffer”, che può essere predisposto da programma come porta
di comunicazione d’uscita oppure d’ingresso. Tale buffer, è
accessibile tramite quattro linee di I/O indicate con D0, D1, D2 e D3,
attraverso le quali è possibile scrivere sul registro “transmit Data
Register” il dato relativo al tono da trasmettere; leggere sul registro
“Receive Data Register” il dato relativo ai toni ricevuti; scrivere
sui registri di controllo “Controll register A” e “Controll register
B”, per selezionare come vedremo più avanti il tipo di funzionamento;
ed infine leggere il registro “Status Register”, monitorando il quale
è possibile conoscere istante per istante e con esattezza, lo stato di
funzionamento dell’intero chip.
Il
compito di gestire il transito dei dati di I/O, è assegnato al blocco
“I/O control”, che come vedremo più avanti, dietro precise richieste
inoltrate tramite le linee RD, CS, WR ed RS0, metterà in comunicazione
uno dopo l’altro i vari registri interni con le quattro linee di I/O,
scongiurando collisioni e malfunzionamenti.
Se
state ancora leggendo questo articolo, vuol dire che siete a conoscenza
della funzione svolta dai toni DTMF e di come e dove essi siano usati.
Solo per completezza quindi, nella figura che segue vi propongo una
tabella di corrispondenza tra toni e relativi caratteri associati; dove
per ogni carattere, verticalmente ed orizzontalmente possiamo facilmente
individuare quali frequenze sono generate. Mentre nella
fig.3 è riportato per ogni carattere, il numero binario ad esso
associato, che scriveremo sulle linee di I/O affinché sia trasmesso,
oppure leggeremo dalle linee di I/O quando ricevuto.
Esaminiamo
adesso la funzione svolta dal registro di controllo “A” il cui
contenuto è rappresentato nella tabella di seguito riportata, dalla quale
si intuisce che il registro e costituito da quattro bits, per ognuno dei
quali è riportato il nome e la funzione svolta.
I due Registri di controllo “A” e “B”, ci permettono di impostare tutti i parametri di funzionamento del chip, secondo le nostre esigenze.
Più
dettagliatamente:
Il
bit “b0” quando posto a “1”, abilita l’uscita di bassa frequenza del chip e di
conseguenza l’emissione dei toni, questo vale sia in modo coppia di toni
che in modo singolo tono e come vedremo più avanti, può determinare
anche il tempo di durata dell’emissione stessa; se tale bit sarà posto
a zero nessun tono di B.F. sarà emesso dal chip.
Il
bit “b1” quando posto a “1”, consente solo l’emissione di toni DTMF e abilita
la funzione “Call Progress” di cui non ci occuperemo in questa
occasione; quando invece posto a “0”,
abilita il chip a ricevere ed a trasmettere segnali DTMF.
Il
bit “b2” quando posto a “0” disabilita la funzione “interrupt”; quando posto
a “1” la abilita; in
quest’ultimo caso, tutte le volte che un dato sarà ricevuto
correttamente dal chip, oppure tutte le volte che il chip sarà pronto ad
accettare un nuovo dato da trasmettere, il pin n°13 del chip normalmente
a livello alto, si porterà a livello basso, segnalando al mondo esterno
che il chip ha eseguito correttamente l’istruzione precedente e che è
pronto ad accettare l’istruzione successiva. In questo modo, il
processore esterno testando continuamente il pin n°13, provvederà nei
tempi opportuni a leggere il dato in arrivo, oppure a scrivere un nuovo
dato da trasmettere.
Il
bit “b3” quando posto a “1”, predispone il registro “Controll register B”
alla successiva operazione di scrittura. Successivamente alla
scrittura sul “Controll register B” il chip si predisporrà alla
scrittura sul “Controll register A”.
“Controll
register B”
E’
la volta adesso del registro di controllo “B” il cui contenuto è
rappresentato nella tabella di seguito riportata; anche questo registro è
costituito da quattro bits, per ognuno dei quali è riportato il nome e la
funzione svolta.
Più
dettagliatamente:
Il
bit “b0” quando posto a “0”, attiva la trasmissione dei segnali in modo “BURST”,
assegnando automaticamente ai toni ed alle pause una durata pari a 51 mS.,
seguite dalla generazione di segnali d’interrupt al pin n°13 del chip,
ammesso che l’interrupt sia abilitato
(vedi b2 del “Controll register A”).
Se
Invece, disattiviamo la funzione “BURST” portando a “1” il bit
“b0”, la durata dei toni e delle relative pause, potrà essere
determinata solo dal bit “b0” del registro “Controll register A”
(vedi b0 del “Controll register A”).
Attenzione,
perché se si è in modo “BURST” ed il bit “b1” del registro
“Controll register A” è a “1”, la durata dei toni e delle pause
sarà raddoppiata, passando a 102 mS.
Il
bit “b1” quando posto a “1”,
abilita la funzione “TEST” e se anche la funzione “DTMF” è
abilitata, il pin n°13 del chip “IRQ/CP” segnalerà la presenza di
eventuali toni all’ingresso del ricevitore, indipendentemente dalla loro
durata. Bisogna infatti ricordare che in condizioni normali di funzionamento, sono
riconosciuti come validi solo quei segnali che hanno una durata superiore
a 40 mS.; per durate inferiori i toni sono rigettati
Il
bit “b2” quando posto a “0”, consente la generazione di coppie di toni DTMF; se
invece è posto a “1”
consente l’emissione di uno dei due toni della coppia DTMF, con le
modalità previste dal bit “b3” del registro “Controll register
B”.
Il
bit “b3” quando posto a “1”, abilità l’emissione del singolo tono alto della
coppia di toni; quando posto a “0”,
abilità l’emissione del singolo tono basso della coppia di toni. Questa
funzione va usata in abbinamento al bit “b2” del registro “Controll
register B”.
Veniamo
adesso alle possibilità offerte dal registro di stato “Status Register”,
sul quale non è consentito scrivere, ma soltanto leggere. La tabella
appresso riportata, elenca i quattro bits che lo costituiscono col
relativo significato.
Più
dettagliatamente:
Il
bit b0 quando diviene “1” indica che si è verificato un interrupt e
che uno dei due bits b1 o b2 e passato a livello logico “1”. Ciò
consente di poter lavorare in full duplex con tutti i vantaggi che ne
derivano; come nel caso di stazioni ripetitrici, dove occorre
ricondizionare i segnali da ritrasmettere. Ricordarsi che al termine della
lettura dello “Status Register”, il bit b0 sarà automaticamente
resettato a zero.
Il
bit b1 quando diviene “1” indica che la durata della pausa dopo
l’emissione di un codice DTMF è terminata, che il “Transmit Data
Register” è vuoto e pronto a ricevere il codice di un nuovo dato DTMF
da trasmettere. Ricordarsi che al termine della lettura dello “Status
Register”, il bit b1 sarà automaticamente resettato a zero.
Il
bit b2 quando diviene “1” indica che è stato ricevuto correttamente
un segnale DTMF, e che il suo codice è pronto per essere letto nel
“Receive Data Register ”. Ricordarsi che al termine della
lettura dello “Status Register”, il bit b2 sarà automaticamente
resettato a zero.
Il
bit b3 quando diviene “1” indica che un segnale DTMF è presente
all’ingresso del ricevitore, quando diviene “0” indica che nessun
segnale DTMF è presente all’ingresso del ricevitore; vedi b1 del
registro “Controll register B”.
Bene,
la parte più impegnativa è superata, passeremo adesso ad analizzare in
dettaglio la funzione svolta dalle quattro linee di comando del blocco
“I/O controll”. La tabella appresso riportata elenca le combinazioni
binarie utili di tali pin con la relativa funzione svolta; essa è di
facile interpretazione e non lascia dubbi circa il loro utilizzo, tuttavia
esaminiamone in dettaglio le combinazioni utili.
Più
dettagliatamente:
Con
la combinazione 001, il dato presente sulle linee I/O sarà trasferito sul
“Transmit Data Register” per essere trasmesso.
Con
la combinazione 010, il dato presente sul “Receive Data Register ” sarà
trasferito sulle linee I/O
per essere letto.
Con
la combinazione 101, il dato presente sulle linee I/O sarà trasferito sul
“Controll register A” o “Controll register B” per stabilire il
modo di funzionamento del chip. Con la combinazione 110, il dato presente
sullo “Status Register” sarà trasferito sulle linee I/O per essere
letto.
Naturalmente
il pin “CS” attivo quando basso, abilita il chip a ricevere istruzioni
e consente di condividere tutte le linee di I/O con altri dispositivi
eventualmente presenti nel circuito.
Per rendere più comprensibile quanto fin qui descritto, nonché per stilare le istruzioni nel linguaggio da voi preferito con le temporizzazioni opportune; nella fig.4 vi propongo il grafico che ho rilevato dal mio circuito di prova, da cui si evince lo stato logico dei vari pins interessati alle varie fasi di lettura e scrittura, nonché la corretta sequenza delle istruzioni da impartire.
Analizzando
il diagramma, si comprende subito che prima di ogni altra operazione si
rende necessaria l’inizializzazione del chip. Come suggerito dal
Data-Sheet, occorre quindi leggere lo “Status Register”; scrivere sul
“Controll register” la sequenza dei valori “0 – 0 – 8 – 0” e
rileggere lo “Status Register”.
Fatto
questo, possiamo scrivere sul “Controll register ” A e B il tipo di
funzionamento da noi prescelto; nel caso in esame sono abilitati il
“Tone Output”, il “DTMF Mode”, la ”Interrupt Function” ed il “Burst Mode”.
Successivamente
a titolo d’esempio, viene scritto il codice binario “zero” sul
“transmit Data Register” affinché sia trasmesso, ed a seguire il
codice binario “uno” ed il codice binario “tre”; corrispondenti
rispettivamente ai simboli “D”, “1” e “2” come verificabile
dalla fig.3.
Da
notare che dopo ogni operazione di scrittura occorre leggere lo
“Status Register” in continuazione, finché non sarà letto un
segnale d’interrupt “D1”, dopo il quale saremo sicuri che il tono
precedente più la relativa pausa sono stati trasmessi correttamente,
e di poter continuare a scrivere il dato successivo da trasmettere.
Guardando
il diagramma, nella penultima lettura dello “Status Register”, si
evidenzia un interrupt al “D2”, ciò significa che il chip ha ricevuto
correttamente un dato e che è pronto sul “Receive Data Register ”,
quindi la successiva istruzione ne legge il contenuto rappresentato sul
grafico con delle “X”.
Da
notare che tutte le operazioni di lettura e scrittura sono abilitate dal
pin CS che viene settato a zero per il tempo necessario ad impartire
l’istruzione desiderata. Lo stesso discorso vale per il pin RD che va
posto a zero per tutte le operazioni di lettura, distinte dal pin RS che
sarà ad “1” quando occorre leggere dallo “Status Register”,
oppure a “0” quando occorre leggere dal “Receive Data Register ”. Il pin WR va
posto a zero per tutte le operazioni di scrittura, distinte dal pin RS che
sarà ad “1” quando occorre scrivere sul “Controll register ” A e
B, oppure a “0” quando occorre scrivere sul “transmit Data Register”.
Spero di aver fornito degli spunti utili, sui quali basarsi per stilare un eventuale programma nel linguaggio da voi preferito. Chi lo desidera può anche richiedere il programmino che ho usato durante le mie prove, col quale potrete verificare immediatamente, gli effetti delle varie impostazioni.
In
questo caso, dovrete realizzare lo schemino che vi propongo nella fig.5,
badando bene che tutti i collegamenti siano rispettati, onde evitare
brutte sorprese con la porta parallela del vostro PC. A tal proposito,
visto l’esiguo assorbimento del circuito, ma soprattutto per proteggere
la preziosa porta parallela del P.C., suggerisco caldamente di alimentare
il circuito con delle pilette, io ne ho usate quattro in serie da 1,2V.
Non essendoci tarature da effettuare, non appena darete alimentazione,
tutto dovrà funzionare al primo colpo. Occorre
soltanto regolare i due potenziometri, per dosare i segnali a livelli
opportuni. Durante le mie prove, ho riscontrato che il livello ottimale
del segnale di B.F. misurato nel punto “Lev.”, è di 150 mVpp.
Non
mi rimane che salutarvi e sperare di non aver tralasciato nulla, in caso
contrario, se lo desiderate non esitate a contattarmi per eventuali
chiarimenti o suggerimenti.
Il
software è a disposizione di tutti coloro che vogliono cimentarsi in
questa impresa, o che desiderano semplicemente provare questo fantastico
componente; potrete richiederlo gratuitamente al mio indirizzo e-mail francodpx@virgilio.it
.
A
tutti buon lavoro e buon divertimento.
IT9DPX - #135 (Francesco M.)