HOME

                                       USIAMO IL  DTMF Transceiver MT 8889 C

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”.

“Data Bus Buffer”  

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.

              

“Controll register A”

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”.

 

“Status Register”

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”.

 

“I/O controll”

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.

 

Temporizzazioni

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”.

 

Conclusioni

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.)