|
Povezivanje
DTMF transivera sa MC68HC11
Generisanje
tonova kakvi se čuju kada biramo broj na telefonu nije lako ako ne
koristimo specijalna integrisana kola za tu namenu. Pošto uvek odabiram
lakši način za rešavanje problema, odabrao sam kolo MT8889C koje u
sebi sadrži i prijemnik i predajnik DTMF tonova
Kako
i sama skraćenica govori, DTMF način biranja podrazumeva
upotrebu više frekvencija i to u parovima. Frekvencija ima ukupno šesnaest
i podeljene su u dve grupe. Nižu grupu čine frekvencije od 697 do
941 Hz a višu frekvencije od 1209 do 1633 Hz. Šesnaest kombinacija
frekvencija obuhvataju sve oznake sa tastature telefona (0 - 9, #, *) i
četiri specijalna znaka: A, B, C i D (Tabela 1.). Frekvencije su malo
neobične ali se njihove vrednosti lako dobijaju pravilnim odabirom
kristala u oscilatoru a to je vrednost 3,579545 MHz.
|
Firma MITEL proizvodi kola koja imaju samo funkcije prijema (detekcije) i
generisanja DTMF tonova, ali pošto je ovo mikrokontrolerska aplikacija,
odlučio sam se za primopredajno kolo - MT8889C. U aplikaciji proizvođača
su obeleženi registri čije korišćenje je neophodno za
funkcionisanje kola. Rad sa registrima obavlja mikrokontroler.
Aplikaciona nota je dosta opširna i praktično je neophodna ako želite
da vidite kako ovo kolo stvarno radi. S druge strane, neke stvari su prilično
nejasne. Postoji dijagram signala na relaciji mikrokontroler - DTMF
trasiver (transmiter receiver) ali u expanded mode-u. |

|
|
Tabela
1 |
Problem je bio šta
raditi i kako imitirati signale AS i R/W- i njihov odnos prema linijama DS
i CS- kada radimo u single chip mode-u? Proizvođač je dao taj
dijagram (Bus Timing) a nije prikazao kako čip u stvari radi!
| Kako
treba postaviti stanja na određenim linijama da bi se izvršio upis u
registre ili čitanje iz njih? Registri imaju mogućnost ili samo
čitanja ili samo upisivanja, tako da kada upišete neku vrednost nema
načina da proverite šta ste upisali. Veliki problemi! Kako sam ih ja
rešio možete da vidite iz listinga programa. U tabeli 2. su prikazane
funkcije koje se dobijaju kombinacijama stanja na linijama RS0 i R/W-. |

|
|
Tabela
2 |
Ono što treba napomenuti je da za ulazno kolo treba odabrati komponente
sa vrednostima kao u aplikacionoj noti i sa tolerancijom od 1%. Razlog je
kompatibilnost sa javnim centralama. U slučaju da je tolerancija veća
od dozvoljene, ton neće biti prepoznat od telefonske centrale. Da bi
se kod testiranja aplikacije čuo ton koji generišemo, potrebno je na
izlaz TONE (pin 8) priključiti neki NF pojačavač.
Aplikaciju sam tako osmislio da obuhvata obe funkcije čipa MT8889C -
i prijem i predaju. Na ulaz je potrebno priključiti neki izvor DTMF
tonova. To može biti neki telefon iz kojeg će se sa pogodnog mesta
izvući DTMF izlaz ili beeper za daljinsku kontrolu telefonskih
sekretarica. Ovaj drugi način sam ja koristio. Pri aktiviranju nekog
tastera na beeper-u, čip prepoznaje taj ton, prikazuje njegovu četvorobitnu
binarnu vrednost na portu F, da bi na posletku generisao taj isti ton. Bez
obzira koliko mi dugo gržali neki taster aktiviranim, trajanje tona na
pinu 8 će biti 50ms kao i pauza između dva tona. Odgovarajućim
setovanjem registara moguće je ova vremena duplirati, ali javnim
centralama je osnovno vreme od 50 ms sasvim dovoljno za pravilno
prepoznavanje tona.
|

|
|
Shema povezivanja
MT8889C sa 68HC11 |
Čitajući ovaj članak verovatno su vam padale na pamet ideje gde
se onaj tip komunikacije može upotrebiti. Evo nekih primena gde se
koristi ili gde ja mislim da se može upotrebiti: Daljinska kontrola uređajima
preko telefonske linije (uz odgovarajući interjfejs), upravljanje uređajima
u sredinama sa jakim smetnjama, telefonske sekretarice... x
|
LISTING
PROGRAMA |
**********************************************
* DTMF transiver MT8889C & 68HC11 F1 in
* Bootstrap mode.
* Input signal is from beeper (such as for
* answering machines). Output signal is carry
* on to the AF amplifier.
* Shematic diagram is shown on MT8889.sch
* After generating signal with beeper, transiver
* recognize valid signal and transmit the same
* tone on output. Tone duration is 50 ms. *
*1.6.1999 Velimir V. Cvetkovic
***********************************************
regs equ $1000 * register's base
portb equ $04 * portb for F1
ddrc equ $07
portc equ $06
portf equ $05
* Signal definition
RS0 equ %00000010
RW equ %00001000
RW_RS0 equ %00001010
DS equ %00000001
CS equ %00000100
IRQ equ %00010000
data equ %00001111
org $300 * variable location
temp rmb 1
org $100 * start of the program
start ldx #regs
clr portf,x
jsr reset
bsr upisCR
l1 bsr receive
bsr write
bra l1
upisCR bset portb,x RS0
bclr portb,x RW
bset portc,x %00001101
jsr unosw
* Write to Control Register A
bclr portc,x data
jsr unosw
* Write to Control Register B
rts
write ldaa temp
* start of transmite subroutine
bsr salji
rts
salji bsr seting
bsr broj
bsr read
rts
seting bclr portb,x RW_RS0 * RS0=0, RW=0
bset ddrc,x data * portc as output
rts
broj ldaa temp
staa portc,x
bsr unosw
bsr statusw
rts
statusw bset portb,x RW_RS0 * status checking RS0=1, RW=1
bclr ddrc,x data * portc as input
bsr unosr
bita #%00000010
* checking termination of pause duration
beq statusw * if not - branch here
rts
* Receive subroutine
receive bsr seting
bsr status
bclr portb,x RS0 * RS0=0
bset portb,x RW * RW=1
bsr unosr
staa portf,x
* display code of receive tone
staa temp
rts
read bset portb,x RW_RS0 * RS0=1, RW=1
clr portc,x bclr ddrc,x data
* portc as input
bsr unosr
ldaa portc,x
rts
status bset portb,x RW_RS0 * Status checking RS0=1, RW=1
bclr ddrc,x data
* portc as input
bsr unosr
bita #%00000100
* checking for valid data
beq status
* if not - branch here
rts
* reset subroutine
reset bset portb,x RW_RS0
* RS0=1, RW=1
bset ddrc,x data
bclr portc,x data
bsr unosw
bclr portb,x RW
bsr unosw
bsr unosw
bset portc,x %00001000
bsr unosw
bclr portc,x data
bsr unosw
bset portb,x RW
bsr unosw
rts
unosw bclr portb,x CS * CS=0
bset portb,x DS * DS=1
bclr portb,x DS * DS=0
bset portb,x CS * CS=1
rts
unosr bclr portb,x CS * CS=0
bclr ddrc,x data
* portc as input
bset portb,x DS * DS=1
ldaa portc,x
bclr portb,x DS * DS=0
bset portb,x CS * CS=1
rts
end |
|