Avtor: mag. Vladimir Mitrović
E-pošta: vmitrovic12@gmail.com
2019_275_47
Za radijski sprejemnik, ki ga opisujemo, so v Narodnem centru tehnične kulture v Kraljevici (Hrvaška) projektirali ustrezno ohišje retro izgleda (slike 79 in 80). Izdelali smo 30 takšnih sprejemnikov in vsi so delali odlično!
Naša naloga ta mesec je napisati ustrezen Bascom-AVR program, ki bo oživel radijski sprejemnik in zagotovil, da dela v skladu z navodili in predhodnim opisom. Da bi si olajšali to delo, smo napisali programske knjižnice za integrirana vezja TEA5767 (FM tuner) in PT2257 (elektronski potenciometer).
Ta vsebina je samo za naročnike
Knjižnica TEA5767$SE.sub
Knjižnica TEA5767$SE.sub vsebuje ukaze za integrirano vezje TEA5767. Knjižnica dimenzionira in uporablja naslednje globalne spremenljivke:
Dim Tea5767$w_regs(5) As Byte
Niz Tea5767$w_regs(5) vsebuje kopijo konfiguracijskih (write) registrov integriranega vezja TEA5767. S postavljanjem ustreznih vrednosti v te registre uporabnik določa način dela integriranega vezja, postavlja sprejemno frekvenco in zažene izvršitev razpoložljivih ukazov.
Dim Tea5767$r_regs(5) As Byte
Niz Tea5767$r_regs(5) vsebuje kopijo statusnih (read) registrov integriranega vezja TEA5767. Ti registri vsebujejo informacijo o trenutnem stanju integriranega vezja in statusu sprejema izbrane radijske postaje.
Dim Tea5767$signal_level As Byte
Spremenljivka Tea5767$signal_level vsebuje informacijo o jakosti signala nastavljene radijske postaje (0-15).
Dim Tea5767$10f As Word
Spremenljivka Tea5767$10f vsebuje frekvenco nastavljene radijske postaje pomnoženo s faktorjem 10 (875-1080).
Tea5767$rf Alias Tea5767$r_regs(0).7 Tea5767$blf Alias Tea5767$r_regs(0).6
Tea5767$rf in Tea5767$blf sta alternativni imeni ready flag in band limit flag bitov iz statusnega registra integriranega vezja (prikazujeta ali je nastavljena radijska postaja in če je dosežena mejna frekvenca področja, 87,5 ali 108 MHz).
Tea5767$stereo Alias Tea5767$r_regs(2).7
Tea5767$stereo bit je kopija stereo bita iz statusnega registra integriranega vezja (prikazuje ali je sprejem v mono ali v stereo tehniki).
Poleg navedenih ta knjižnica definira še nekaj spremenljivk s prefiksom Tea5767$$; te spremenljivke uporabljajo podprogrami iz knjižnice in jih ni priporočljivo uporabljati direktno iz glavnega programa. Knjižnica v začetku vpisuje v Tea5767$w_regs niz postavk, ki ustrezajo evropskemu standardu FM prenosa (frekvenčno področje 87,5-108 MHz, 75 µs de-emphasis), kot tudi postavke za katere se predpostavlja, da bodo ustrezali večini uporabnikov (soft mute, stereo on, stereo noise cancelling, mute off). Te postavke se lahko po potrebi programsko spremenijo, vendar bodo postale aktivne šele, ko se prenesejo v konfiguracijske registre integriranega vezja z ukazom Tea5767$write_regs ali Tea5767$write_regs.
Sledi opis ukazov iz knjižnice:
Ukaz Tea5767$read_regs
Tea5767$read_regs
Parametri: | nima |
Namen: | Bere statusne registre TEA5767 čipa in njihovo vsebino prenaša v niz Tea5767$r_regs. |
Opomba: | Po izvršitvi se posodobijo vrednosti statusnih bitov Tea5767$rf, Tea5767$blf in Tea5767$stereo. |
Ukaz Tea5767$write_regs
Tea5767$write_regs
Parametri: | nima |
Namen: | Vsebina niza Tea5767$w_regs se vpisuje v konfiguracijske registre TEA5767 čipa. |
Opomba: | Ukaz ne briše vsebine Tea5767$w_regs niza. |
Ukaz Tea5767$tune
Tm1638$tune par1
Parametri: | par1 | konstanta ali ime word spremenljivke, ki vsebuje desetkratno frekvenco (10f = 875-1080) |
Namen: | Nastavlja TEA5767 na dano frekvenco. Prebere informacijo o jakosti signala nastavljene radijske postaje in jo vpisuje v spremenljivko Tea5767$signal_level. |
Ukaz Tea5767$read_signal_level
Tea5767$read_signal_level
Parametri: | nima |
Namen: | Prebere informacijo o jakosti signala nastavljene radijske postaje in jo vpisuje v spremenljivko Tea5767$signal_level in ažurira bite Tea5767$rf, Tea5767$blf ter Tea5767$stereo. |
Ukaz Tea5767$read_info
Tea5767$read_info
Parametri: | nima |
Namen: | Prebere informacije o jakosti signala (Tea5767$signal_level) in frekvenci nastavljene radijske postaje (Tea5767$10f) ter ažurira bite Tea5767$rf, Tea5767$blf in Tea5767$stereo. |
Opomba: | V spremenljivko Tea5767$10f je vpisana desetkratna vrednost frekvence, 10f. |
Ukaz Tea5767$mute
Tea5767$mute
Parametri: | nima |
Namen: | Vklopi mute opcijo (maksimalno duši nivo izhodnih avdio signalov). |
Opomba: | Mute ukaz prekliče prvi naslednji Tea5767$tune ukaz. |
Ukaz Tea5767$standby
Tea5767$standby
Parametri: | nima |
Namen: | Izklopi TEA5767 (standby). |
Opomba: | Standby prekliče prvi naslednji Tea5767$write_regs ali Tea5767$tune ukaz. |
Opomba: Knjižnica uporablja novi način definiranja podprogramov (Config Submode = New) in naslavljanje nizov od naslova 0 (Config Base = 0).
Knjižnica PT2257$SE.sub
Knjižnica PT2257$SE.sub vsebuje ukaze za integrirano vezje PT2257. Sestavni del knjižnice so tudi tabele
Dim Pt2257$$volume_table(25) As Eram Byte
in
Dim Pt2257$$attenuation_table(80) As Eram Byte
s konstantami katere ukaze iz knjižnice uporabljajo za doseganje želene stopnje dušenja. Te tabele so shranjene v EEPROMu, zato mora uporabnik med programiranjem poskrbeti, da se tudi tabele vpišejo v mikrokontroler.
Sledi opis ukazov iz knjižnice:
Ukaz Pt2257$set_volume
Pt2257$set_volume par1
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje nivo glasnosti (0-24; vrednosti >24 se postavijona 24) |
Namen: | Nastavlja dušenje PT2257 tako, da bi se dosegel nivo glasnosti obeh kanalov definiran v tabeli Pt2257$$volume_table. Par1 = 24 ustreza maksimalni glasnosti (dušenje = 0 dB), par1 = 0 ustreza minimalni glasnosti (dušenje = -79 dB). | |
Opomba: | Vrednosti v tabeli Pt2257$$volume_table so definirane s spremenljivim korakom: pri višji glasnosti korak znaša 1 dB in se nato postopno povečuje. |
Ukaz Pt2257$set_volume_l
Pt2257$set_volume_l par1
Identično kot Pt2257$set_volume, vendar ima vpliv samo na levi kanal.
Ukaz Pt2257$set_volume_r
Pt2257$set_volume_r par1
Identično kot Pt2257$set_volume, vendar ima vpliv samo na desni kanal.
Ukaz Pt2257$set_attenuation
Pt2257$set_attenuation par1
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje nivo dušenja v dB (0-79; vrednosti >79 se nastavijona 79) |
Namen: | Nastavlja dušenje obeh kanalov glede na vrednosti parametra par1. Par1 = 0 ustreza maksimalni glasnosti (dušenje = 0 dB), par1 = 79 ustreza minimalni glasnosti (dušenje = -79 dB). | |
Opomba: | Ukaz uporablja vrednosti vpisane v tabelo Pt2257$$attenuation_table, v kateri so dušenja definirana s korakom 1 dB. |
Ukaz Pt2257$set_attenuation_l
Pt2257$set_attenuation_l par1
Identično kot Pt2257$set_attenuation, vendar ima vpliv samo na levi kanal.
Ukaz Pt2257$set_attenuation_r
Pt2257$set_attenuation_r par1
Identično kot Pt2257$set_attenuation, vendar ima vpliv samo na desni kanal.
Ukaz Pt2257$mute_on
Pt2257$mute_on
Parametri: | nima |
Namen: | Vklopi mute opcijo (maksimalno duši nivo izhodnih avdio signalov). |
Ukaz Pt2257$mute_off
Pt2257$mute_off
Parametri: | nima |
Namen: | Izklopi mute opcijo, dušenje se vrača na predhodno nastavljen nivo. |
Opomba: Knjižnica uporablja novi način definiranja podprogramov (Config Submode = New) in naslavljanje nizov od naslova 0 (Config Base = 0).
Ko smo se spoznali s konceptom in z ukazi iz knjižnic TEA5767$SE.sub in PT2257$SE.sub, bomo način njihove uporabe ilustrirali s pomočjo enega primera – napisali bomo program za radijski sprejemnik opisan v preteklem nadaljevanju.
Ta program vsebuje podrobna navodila mikrokontrolerju, kako prebrati položaj krmilne palice, kako razumeti njene različne položaje in kako jih pretočiti v ukaze za posamezne dele sprejemnika, napisan pa je s ciljem, da zagotovi elegantno krmiljenje radijske sprejemnika, s funkcionalnostmi katere se pričakujejo od sodobne naprave.
Važen del programa je tudi komunikacija z uporabnikom, ki se ustvari z izpisom ustreznih sporočil na alfanumeričnem displeju.
Program FM_radijske_SE.bas
Program FM_radijske_SE.bas je napisan za Arduino Nano module z ATmega328P ali z ATmega168 mikrokontrolerjem. Kot poseben izziv je postavljena omejitev, da ne sme zavzeti več od 4 kB spomina, da bi bil dostopen tudi uporabnikom Bascom-AVR demo programa. Tukaj bomo pojasnili njegov koncept in analizirali posamezne dele; za popolno razumevanje je potrebno preučiti celoten program.
Na samem začetku programa moramo definirati število programskih spominov katere želimo uporabljati (dovoljene vrednosti so 1 do 40)
Const Preset_no = 40 '1-40
in izbrati način vezave krmilne palice:
Const Joystick_xy = 2 '1-2 Const Joystick_pm = 3 '1-4
Te dve konstanti določata pogojno prevajanje ukazov, ki berejo položaj krmilne palice in interpretirajo dobljene vrednosti, zato jih je potrebno prilagoditi uporabljeni palici, načinu kako je pritrjena na ohišje (kako je “obrnjena”) in načinu njene vezave s tiskanim vezjem radijske sprejemnika. Cilj je doseči krmiljenje s palico v skladu z navodili za uporabo sprejemnika: s premikanjem palice v smeri gor-dol se mora večati in manjšati glasnost, s premikanjem v smeri desno-levo (ali naprej-nazaj) se mora večati in zmanjševati številka programskega spomina in frekvenca. Če sta x- in y- osi zamenjani (glasnost nastavljamo s pomiki palice levo-desno namesto gor-dol), je potrebno spremeniti vrednost konstante Joystick_xy iz 1 v 2 oziroma obratno. Če so osi dobro postavljene, pa smer ni dobra (dviganje palice povzroči zmanjšanje glasnosti ali pomik palice v desno zmanjšuje številko programskega spomina), je potrebno poskusiti z neko drugo vrednostjo konstante Joystick_pm (dovoljene vrednosti so 1-4).
Nato vključujemo potrebne knjižnice,
$include "PT2257$SE.sub" $include "TEA5767$SE.sub"
definiramo pine mikrokontrolerja, ki berejo tipke krmilne palice
Button Alias Pinc.2 Config Button = Input
in pine, ki krmilijo tranzistorska vezja:
V_tda2822 Alias Portb.0 Config V_tda2822 = Output V_display Alias Portb.1 Config V_display = Output
Opazili boste, da so posameznim priključkom določena alternativna imena (npr., PINC.2, na katerem je vezana tipka, smo poimenovali Button. Pine, ki vključujejo napetosti izhodnega ojačevalnika in displeja imenujemo V_tda2822 in V_display), da bi jih kasneje v programu lahko klicali v skladu s njihovo funkcijo.
V skladu s shemo radijske sprejemnika moramo še definirati katere pine uporabljamo za povezovanje z alfanumeričnim displejem in za I2C komunikacijo, moramo pa tudi konfigurirati A/D pretvornik, saj ga uporabljamo za branje položaja krmilne palice:
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Končno, pred vhodom v glavno zanko mora program še preveriti konsistentnost vsebine EEPROMa mikrokontrolerja. V EEPROM se shranijo podatki, ki jih je potrebno pomniti tudi takrat, ko je radijski sprejemnik izključen. To je recimo spisek frekvenc shranjenih radijskih postaj, frekvenca trenutno izbrane radijske postaje, nivo glasnosti in nekatere mejne vrednosti. V kolikor bi bila porušena struktura teh podatkov, ali če se ugotovi, da je bila v trenutku zagona programa pritisnjena krmilna palica, bo program inicijaliziral tabele v EEPROMu
If Button = 0 Or Reset_flag_eram <> 0 Then Gosub Reset_radijske End If
in izpisal ustrezno sporočilo na displeju:
FM radio SE 2019
Reset!!!
S tem si program zagotovi normalno nadaljevanje dela, inicijalizacija pa za uporabnika hkrati pomeni, da bodo vsi shranjeni podatki izbrisani.
Po uvodnem delu program vstopi v brezkončno zanko, v kateri večkrat preverja, ali je krmilna palica pritisnjena ali premaknjena. Pritisk na palico preverjamo z ukazom Debounce:
Debounce Button , 0 , Button_sub , Sub
Če ta ukaz ugotovi, da je palica pritisnjena, bo Debounce izvršil podprogram Button_sub, v katerem najprej merimo kako dolgo je palica pritisnjena:
Button_sub: For B_time = 0 To 20 Waitms 50 If Button = 1 Then Exit For Next
Če je bila palica pritisnjena krajše od 1 s, bo vsebina spremenljivke B_time manjša od 21, za daljše pritiske bo 21. Kratek pritisk preklopi radijski sprejemnik med njegova dva načina dela: v enem se izbirajo prej shranjene postaje
<P0> 88.7 MHz
Vol=12 Sig=15 ST
v drugem pa je možno izbrati in shraniti novo radijsko postajo.
P0 < 88.7>MHz
Vol=12 Sig=15 ST
Dolg pritisk v pravilu pomeni, da radijski sprejemnik želimo izključiti; program bo sedaj:
- sh
- isal pozdravno sporočilo,
FM radio SE 2019
Goodbye…
- izključil napajanje osvetlitve ozadja LCDja in napajanje izhodnega ojačevalnika,
V_tda2822 = 0 V_display = 0
ter postavil TEA5767 v stanje pripravljenosti in upočasniti delo mikrokontrolerja, da bi tudi ta porabil čim manj energije:
Tea5767$standby Config Clockdiv = 256
Čeprav upočasnjen se program v mikrokontrolerju odvija tudi takrat, ko je radijski sprejemnik izključen: program se vrti v zanki pričakujoč, da radijski sprejemnik ponovno vključimo z dolgim pritiskom na krmilno palico.
For B_time = 0 To 19 If Button = 1 Then B_time = 0 Waitus 200 Next
Ukaz Waitus 200 je potrebno opazovati pogojno: program je upočasnjen za 256-krat in ukaz čaka okoli 50 ms. Ko se to pomnoži s številom prehodov preko For-Next zanke (20), pridemo do želenega trajanja 1 s – prav tako dolgo je potrebno držati palico pritisnjeno, da bi ponovno vključili sprejemnik. Ko se to zgodi bo program:
- postavil mikrokontroler na polno hitrost,
- prebral ključne podatke iz EEPROM, da bi jih lahko uporabljal,
- vklopil osvetlitev ozadja displeja in na njemu izpisal pozdravno sporočilo,
FM radio SE 2019
Hello!!!
- inicializiral FM modul,
- izbral isto radijske postajo in postavil isti nivo glasnosti kot v trenutku izklopa in
- vključil napetost napajanja izhodnega ojačevalnika.
Nato preveri, ali je bila krmilna palica pritisnjena, program preverja njen položaj. Za to se uporablja analogno digitalni pretvornik, ki napetosti z drsnikov trimerjev RX in RY, 0-5 V, pretvarja v številko v razponu od 0 do 1023.
Adc_value = Getadc(0) 'RY Adc_value = Getadc(1) 'RX
Nam bodo zanimiva 3 branja: ali je palica v enem ali v drugem skrajnjem položaju in ali se nahaja v sredini. Za skrajne položaje palice bomo vzeli vrednosti manjše od 150 in večje od 873, medtem, ko bomo vse vrednosti med 150 in 873 vzeli kot sredinski položaj:
If Adc_value < 150 Then Xy_value = 0 'minimum Elseif Adc_value > 873 Then Xy_value = 4 'maksimum Else Xy_value = 2 'sredina End If
Tako smo zagotovili prijetno delo s krmilno palico, kjer mali slučajni premiki nimajo vpliva na delo radijskega sprejemnika. Program preverja, ali je med dvema branjema prišlo do spremembe položaja krmilne palice in, odvisno od tega, izvrši različne aktivnosti. Če je palica iz srednjega položaja premaknjena gor ali dol, se bo izvršil podprogram, v katerem se menja nivo glasnosti za en korak glede na gor ali dol:
Change_volume: If Y_value < 2 Then If Volume > 0 Then Decr Volume End If If Y_value > 2 Then If Volume < 24 Then Incr Volume End If
Novi nivo glasnosti se bo vpisal v PT2257 s pomočjo ukaza Pt2257$set_volume iz PT2257$SE.sub knjižnice, nato se bo ažuriral tudi izpis na displeju:
Pt2257$set_volume Volume Gosub Disp_info Return
Če ugotovi, da je palica v zgornjem ali spodnjem položaju zadržana dalj od 1 s, bo program postopno povečeval ali zmanjševal glasnost vse dokler se palica ne spusti ali dokler se ne doseže maksimalni ali minimalni nivo glasnosti.
Kaj se bo zgodilo, če se palica iz srednjega položaja premakne desno (naprej) ali levo (nazaj) je odvisno od načina dela programa, v katerem se sprejemnik trenutno nahaja. Če se nahaja v normalnem načinu (uporabljajo se predhodno shranjene frekvence)
<P0> 88.7 MHz
Vol=12 Sig=15 ST
bo program povečal ali zmanjšal vrednost indeksne spremenljivke Preset, prebral predhodno shranjeno frekvenco radijske postaje iz tabele Freq_table in nastavil TEA5767 za sprejem nove frekvence z ukazom Tea5767$tune:
Change_preset: ... 10f = Freq_table(preset) Tea5767$tune 10f Gosub Disp_info Return
Kot pri spremembi glasnosti se tudi tukaj pred vrnitvijo v glavno zanko osveži izpis na displeju. Če ugotovi, da je palica v istem položaju zadržana dalj od 1 s, bo program po vrsti izbiral postaje po vrsti iz spomina s primerno hitrostjo tako, da lahko slišimo trenutno sprejeto vsebino in da preberemo frekvenco na displeju.
Če se nahaja v načinu za spremembo frekvence
P0 < 88.7>MHz
Vol=12 Sig=15 ST
bo program povečal ali zmanjšal frekvenco za 0,1 MHz in zatem nastavil TEA5767 za sprejem nove frekvence:
Tune: ... Tea5767$tune 10f Gosub Disp_info Return
Če sedaj ugotovi, da je palica zadržana v istem položaju dalj kot 1 s, bo program začel iskati postaje v dani smeri. Proces se konča v trenutku, ko spustimo palico. Postopek iskanja ni prehiter, tako da uporabnik lahko sliši, ko “prehaja” preko neke radijske postaje in vidi njeno frekvenco na displeju ter se lahko odloči, ali hoče prekiniti ali nadaljevati iskanje. Po potrebi je frekvenco možno fino nastaviti s kratkotrajnimi premiki palice.
Tako je programsko simuliran ukaz seek (išči), ki jo integrirano vezje TEA5767 ima implementirano v svojem firmveru. V praksi se je pokazalo, vsaj s primerki, ki sem jih imel, da ta ukaz ne dela na ustrezen način, zato v knjižnici TEA5767$SE.sub niti ni predviden Bascom-AVR ukaz, ki bi ga aktiviral. Zato je funkcija iskanja v našem radijskem sprejemniku programirana na prej opisani način.
Ko se iz načina za spremembo frekvence želimo vrniti v normalni način (to dosežemo s kratkim pritiskom na krmilno palico), bo program primerjal novo frekvenco s predhodno shranjeno. Če je prišlo do spremembe se bo na displeju pojavilo vprašanje kot:
Save? < 92.5>MHz
Vol=12 Sig=9 ST
Na to vprašanje se odgovori z ustreznim pritiskom na krmilno palico: kratek pritisk bo pomenil negativen, dolgi pritisk pa pritrdilen odgovor. Če je odgovor negativen, se spremembe frekvence pozabijo; če je odgovor pritrdilen se nova frekvenca shrani v EEPROM tabelo Freq_table.
Ko je preveril položaj palice in končal možne zadane aktivnosti, bo program še ažuriral izpis na displeju. Za to je potrebno iz integriranega vezja TEA5767 pridobiti informacijo o trenutni kvaliteti sprejema, predvsem pa o nivoju signala nastavljene radijske postaje. Pokazalo se je, da firmver TEA5767 redno ažurira mono/stereo zastavico, vendar ga je treba spodbuditi, da bi preveril nivo signala; to smo dosegli s (sicer nepotrebnim) osveževanjem vsebine konfiguracijskih registrov:
Do ... Tea5767$write_regs Tea5767$read_signal_level Gosub Disp_info ... Loop
Podprogram Disp_info oblikuje izpis na displeju glede na trenutno fazo izvrševanja programa in je primerno kompleksen: zavzema 1/4 celotnega programa. Bascom-AVR ima svoje ukaze za oblikovanje prikaza na displeju, vendar se je pokazalo, da zavzemajo preveč spomina in se niso vklapljali v koncept “programa, ki mora biti manjši od 4 kB”. Zato sem podprogram napisal “na svoj način”, pri čemur se je kot zelo koristen pokazal ukaz Insertchar. Bralca, ki ga to zanima vabim, da sam pogleda ta del programa.
Za tiste ki vedno želijo več – RDA5807M z RDS dekoderjem
Radijski sprejemnik z FM modulom TEA5767 dela korektno in popolnoma v skladu s pričakovanji. Ker so FM moduli z integriranimi vezji TEA5767 in RDA5807M hardversko in softversko kompatibilni, se je sama od sebe se pojavila ideja, da v sprejemniku pokušam uporabiti tudi ta drugi modul. Takoj je pričel delati! Kvaliteta sprejema, pri čemer predvsem mislim na občutljivost in nivo motenj, ni bila bistveno boljša ali slabša. So se pa pokazale določene razlike v firmveru: v TEA5767 načinu, RDA5807M ni pravilno poslal informacijo o nivoju signala, njegova napredna funkcija nastavljanja frekvence je ustrezala našemu principu iskanju radijskih postaj… Na kratko, če želimo izkoristiti vse funkcionalnosti integriranega vezja RDA5807M, ga je potrebno zagnati v njegovem načinu. S tem bomo dobili neke nove funkcionalnosti – dekodiranje RDS informacij, vgrajeno regulacijo glasnosti, pravilno seek funkcijo. Hkrati pa bomo tudi nekaj izgubili – program postane večji od 4 kB in ga ni mogoče prevesti z Bascom-AVR demo verzijo. Da bi uporabnikom Bascom-AVR platforme omogočili uporabo FM modula z RDA5807M čipom, smo napisali programsko knjižnico RDA5807M$SE.sub.
Knjižnica RDA5807M$SE.sub
Knjižnica RDA5807M.sub vsebuje ukaze, ki pokrivajo večino funkcionalnosti integriranega vezja RDA5807M, vključno z dekodiranjem RDS informacij iz skupine 0A (najbolj pogosto vsebuje ime radijske postaje) in 2A (svobodni tekst). Knjižnica dimenzionira in uporablja naslednje globalne spremenljivke:
Dim Rda5807m$regs(16) As Word
Niz Rda5807m$regs(16) vsebuje kopijo konfiguracijskih (2-9) in statusnih registrov (10-15) integriranega vezja RDA5807M. Z vpisom ustreznih vrednosti v konfiguracijske registre uporabnik določa način dela integriranega vezja, postavlja sprejemno frekvenco in zažene izvrševanje razpoložljivih ukazov. S pridobivanjem vsebine statusnih registrov lahko uporabnik dobi informacijo o trenutnem stanju integriranega vezja, statusu sprejema izbrane radijske postaje kot tudi uporabljeno RDS informacijo.
Dim Rda5807m$signal_level As Byte
Spremenljivka Rda5807M$signal_level vsebuje informacijo o jakosti signala nastavljene radijske postaje (0-15). Opomba: RDA5807M bere nivo signala v razponu 0-63; v praksi se je pokazalo, da ni potrebe po tako velikem razponu, zato je branje deljeno s faktorjem 4.
Dim Rda5807m$channel As Word
Spremenljivka Rda5807m$channel vsebuje informacijo o kanalu na katerem oddaja trenutno nastavljena radijska postaja; kanali se računajo od frekvence 87,0 MHz in zavzemajo 100 kHz.
Dim Rda5807m$rds_group As Byte
Spremenljivka Rda5807m$rds_group vsebuje oznako (številko) zadnje sprejete RDS skupine; to je predvsem namenjeno uporabniku, ki želi dekodirati RDS sporočila različna od 0A in 2A.
Dim Rda5807m$group_0a As String * 8
Spremenljivka Rda5807m$group_0a vsebuje tekstualno sporočilo RDS skupine 0A.
Dim Rda5807m$group_2a As String * 64
Spremenljivka Rda5807m$group_2a vsebuje tekstualno sporočilo RDS skupine 2A.
Rda5807m$stereo Alias Rda5807m$regs(10).10 Rda5807m$rds_ready Alias Rda5807m$regs(10).15 Rda5807m$rds_sync Alias Rda5807m$regs(10).12 Rda5807m$rds_blk_e Alias Rda5807m$regs(10).11 Rda5807m$rds_abcde Alias Rda5807m$regs(11).4
Alternativna imena statusnih bitov integriranega vezja RDA5807M; prikazujejo ali je sprejem v mono ali v stereo tehniki kot tudi status RDS sprejema. Te RDS flagi, skupaj s spremenljivko Rda5807m$rds_group in RDS informacijami znotraj niza Rda5807m$regs(12-15) tvorijo podlago, na kateri lahko uporabnik po potrebi dekodira tudi tiste vrste RDS informacije, ki z ukazi iz knjižnice niso pokrite.
Poleg navedenih, knjižnica definira tudi pomožne spremenljivke s prefiksom Rda5807m$$; te spremenljivke uporabljajo podprogrami iz knjižnice in jih ni priporočljivo uporabljati direktno iz glavnega programa. Knjižnica vpisuje v Rda5807m$regs niz postavk, ki ustrezajo evropskemu standardu FM prenosa (frekvenčno področje 87,5-108 MHz, širina FM kanala 100 kHz, 75 µs de-emphasis), kot tudi postavke, za katere se predpostavlja da bodo ustrezale večini uporabnikov (stereo on, RDS enable, mute off) in inicijalizira RDA5807M v skladu s temi postavkami. Te postavke se lahko po potrebi programsko zamenjajo.
Sledi opis ukazov iz knjižnice:
Ukaz Rda5807m$read_reg
Rda5807m$read_reg par1, par2
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje naslov registra (0-15) |
par2 | ime word spremenljivke v katero se prenesejo vsebine naslovljenega registra | |
Namen: | Prebere vsebine naslovljenega registra integriranega vezja RDA5807M in prenosi ga v spremenljivko par2. | |
Opomba: | Če je par1 > 15, se ukaz ne bo izvršil. |
Ukaz Rda5807m$write_reg
Rda5807m$write_reg par1, par2
Parametri: | par1 | konstanta ali ime byte spremenljivke ki vsebuje naslov registra (2-9) |
par2 | konstanta ali ime word spremenljivke katere vsebine se bodo prenesle v naslovljeni register | |
Namen: | Vpisuje par2 vsebine v naslovljeni register integriranega vezja RDA5807M. | |
Opomba: | Če je par1 < 2 ali par > 9, se ukaz ne bo izvršil. |
Ukaz Rda5807m$tune
Rda5808m$tune par1
Parametri: | par1 | konstanta ali ime word spremenljivke, ki vsebuje desetkratno frekvenco (10f = 875-1080) |
Namen: | Nastavlja RDA5807M na dano frekvenco. Ažurira statusne bite in spremenljivke Rda5807m$signal_level, Rda5807m$channel in Rda5807m$rds_group. Briše vsebine RDS buferja. | |
Opomba: | Ukaz ne preverja vrednost parametra par1; za vrednosti izven navedenih mej je obnašanje integriranega vezja nepredvidljivo. |
Ukaz Rda5807m$seek_down
Rda5808m$seek_down
Parametri: | nima |
Namen: | Išče prvo radijsko postajo na frekvenci, ki je nižja od trenutne. Ko se doseže spodnjo mejo FM področja, se nadaljuje iskanje od zgornje meje. Proces se zaustavi, ko se najde radijska postaja z dovolj kvalitetnim sprejemom ali ko se doseže začetna frekvenca. Ažurira statusne bite in spremenljivke Rda5807m$signal_level, Rda5807m$channel in Rda5807m$rds_group. Briše vsebine RDS buferja. |
Ukaz Rda5807m$seek_up
Rda5808m$seek_up
Parametri: | nima |
Namen: | Išče prvo radijsko postajo na frekvenci višji od trenutne. Ko doseže gornjo mejo FM področja, nadaljuje iskanje od spodnje meje. Proces se zaustavi, ko se najde radijska postaja z dovolj kvalitetnim sprejemom ali ko se doseže začetna frekvenca.Ažurira statusne bite in spremenljivke Rda5807m$signal_level, Rda5807m$channel in Rda5807m$rds_group. Briše vsebine RDS buferja. |
Ukaz Rda5807m$read_info
Rda5808m$read_info
Parametri: | nima |
Namen: | Ažurira statusne bite in spremenljivke Rda5807m$signal_level, Rda5807m$channel in Rda5807m$rds_group. |
Ukaz Rda5807m$read_rds_0a
Rda5808m$read_rds_0a
Parametri: | nima |
Namen: | Če je dostopna, dekodira informacijo RDS skupine 0A in dopolnjuje spremenljivko Rda5807m$group_0a z dvema novima znakoma. |
Ukaz Rda5807m$read_rds_2a
Rda5808m$read_rds_2a
Parametri: | nima |
Namen: | Če je dostopna, dekodira informacijo RDS skupine 2A in dopolnjuje spremenljivko Rda5807m$group_2a s štirimi novimi znaki. |
Ukaz Rda5807m$read_rds
Rda5808m$read_rds
Parametri: | nima |
Namen: | Če so dostopne, dekodira informacije RDS grupa 0A in 2A in dopolnjuje spremenljivke Rda5807m$group_0a in Rda5807m$group_2a. |
Ukaz Rda5807m$clear_rds_group_0a
Rda5808m$clear_rds_group_0a
Parametri: | nima |
Namen: | Briše vsebine spremenljivke Rda5807m$group_0a. |
Opomba: | Pri spremembi radijske postaje je potrebno zbrisati staro RDS informacijo. |
Ukaz Rda5807m$clear_rds_group_2a
Rda5808m$clear_rds_group_2a
Parametri: | nima |
Namen: | Briše vsebine spremenljivke Rda5807m$group_2a. |
Opomba: | Pri spremembi radijske postaje je potrebno zbrisati staro RDS informacijo. |
Ukaz Rda5807m$clear_rds_buffers
Rda5808m$clear_rds_buffers
Parametri: | nima |
Namen: | Briše vsebine spremenljivk Rda5807m$group_0a in Rda5807m$group_2a. |
Opomba: | Pri spremembi radijske postaje je potrebno zbrisati stare RDS informacije. |
Ukaz Rda5807m$set_volume
Rda5808m$set_volume par1
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje nivo glasnosti (par1.3:par1.0 = 0-15; bita par1.7:par1.4 se ignorirata) |
Namen: | Nastavlja nivo avdio signala; par1 = 0 ustreza največjemu dušenju (mute) a par1 = 15 ustreza največjemu izhodnemu nivoju (360 mV). | |
Opomba: | Skala je logaritemska. |
Ukaz Rda5807m$bass_boost
Rda5808m$bass_boost par1
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje bass boost kontrolni bit (par1.0 = 0-1; bita par1.7:par1.1 se ignorirata) |
Namen: | 1 vklopi, 0 izklopi ojačenje globokih tonov (bass boost). |
Ukaz Rda5807m$mute
Rda5808m$mute par1
Parametri: | par1 | konstanta ali ime byte spremenljivke ki vsebuje mute kontrolni bit (par1.0 = 0-1; bita par1.7:par1.1 se ignorirata) |
Namen: | 1 vklopi, 0 izklopi dušenje avdio signala (mute). |
Ukaz Rda5807m$standby
Rda5808m$standby
Parametri: | nima |
Namen: | Izklopi RDA5807M (standby). |
Ukaz Rda5807m$power_up
Rda5808m$power_up
Parametri: | nima |
Namen: | Vklopi RDA5807M. |
Knjižnica vsebuje še nekaj podprogramov, katerih ime se prične s prefiksom Rda5807m$$. Te podprogrami uporabljajo ukaze iz knjižnice in niso namenjeni za direktno uporabo iz uporabniškega programa.
Opomba: Knjižnica uporablja novi način definiranja podprogramov (Config Submode = New) in naslavljanje nizov od naslova 0 (Config Base = 0).
Program FM_radijske_RDS_SE.bas
Program FM_radijske_RDS_SE.bas je napisan kot ilustracija uporabe ukazov iz RDA5807M$SE.sub knjižnice. Program je prikladen za radijski sprejemnik po shemi s slike 75; edina sprememba v shemi je menjava FM modula TEA5768 (U2) z modulom z integriranim vezjem RDA5807M. Ker ima RDA5807M vgrajeno regulacijo glasnosti, je možno odstraniti elektronski potenciometer PT2257 (U3); jaz sem ga kljub temu obdržal, ker omogoča bolj natančno regulacijo od tiste, ki je vgrajena v RDA5807M čip.
Struktura programa je identična programu FM_radijske_SE.bas, celo je večina ukazov identična. Spremenjeni so ukazi, ki komunicirajo z FM modulom ustreznimi ukazi iz RDA5807M$SE.sub knjižnice. Prva večja sprememba je glede iskanja radijskih postaj: ker ima RDA5807M čip dobro rešeno seek funkcijo, uporabljamo ustrezne ukaze iz knjižnice:
Seek: Rda5807m$signal_level = 0 If X_value < 2 Then ... Rda5807m$seek_down End If If X_value > 2 Then ... Rda5807m$seek_up End If
Postopek iskanja je pospremljen z ustrezno informacijo na displeju:
P3 >>seek>>
Vol=12
Po uspešnem iskanju je potrebno še prebrati informacije o statusu sprejema in jih izpisati na displeju:
Rda5807m$read_info 10f = Rda5807m$channel + 870 Gosub Disp_info Return
Druga sprememba se nanaša na izpis imena radijske postaje. Poleg te informacije, ki jo radijske postaje oddajajo v skupini z oznako 0A, se preko RDS sistema krožno oddajajo tudi različne druge informacije. Zato mora program pogosto brati statusne registre RDA5807M čipa in preverjati, ali je RDS sporočilo tipa 0A sprejeto. To delamo s pomočjo ukazov Rda5807m$read_info in Rda5807m$read_rds_0a v glavni Do-Loop petlji 20-krat v sekundi:
Do ... Rda5807m$read_info Rda5807m$read_rds_0a Gosub Disp_info Loop
Ukaz Rda5807m$read_rds_0a ignorira vsa sporočila razen tistih tipa 0A. Vsako takšno sporočilo vsebuje po dva znaka imena radijske postaje in njihovo relativno pozicijo. Glede na to jih bo ukaz vpisal na ustrezno mesto znotraj stringa Rda5807m$group_0a. Tako se ime radijske postaje formira v 4 korakih, za kar je bilo potrebno najti eleganten način, kako preprečiti izpis imena radijske postaje dokler ni popolno formiran.
Izbran je takšen postopek: med brisanjem stringa Rda5807m$group_0a ga ukaz Rda5807m$clear_rds_group_0a zapolni z binarnimi ničlami. Ne glede na to v kakšnem vrstnem redu se je polnil takšen string, bo Bascom-AVR ukaz Len() izmeril njegovo maksimalno dolžino 8 šele ko bodo vsi 4 “segmenti” dopolnjeni. Zato v podprogramu Disp_info preverjamo dolžino stringa Rda5807m$group_0a preden ga izpišemo na displeju:
If Len(rda5807m$group_0a) = 8 Then Lcd "" ; Rda5807m$group_0a ; "" Else Lcd Message ; "MHz" End If
Šele ko je njegova dolžina8, se bo izpisalo ime radijske postaje:
<P3>>R-G-P<
Vol=12 Sig=10 ST
V nasprotnem primeru bo na istem mestu prikazana njena frekvenca:
<P3> 94.1 MHz
Vol=12 Sig=10 ST
Na podoben način, kot smo prebrali ime radijske postaje, lahko preberemo tudi poljubni tekst iz RDS skupine 2A. Ukaz, s katerim to delamo je Rda5807m$read_rds_2a, ime stringa v katerem se sporočilo formira je Rda5807m$group_2a. Ta string je dolžine 64 znakov in se dopolnjuje v grupah po 4 znake. Način preverjanja dopolnjenosti stringa je isti kot prej.
V knjižnici niso predvideni ukazi za ostale vrste sporočil, katere radijske postaje lahko pošiljajo preko RDS sistema. Knjižnica pa omogoča podlago tudi za njihovo dekodiranje: s preverjanjem RDS flagov in spremenljivke Rda5807m$rds_group bomo lahko ugotovili, katera vrsta sporočila je trenutno prebrana, “surove” vsebine sporočila pa lahko dobimo iz niza Rda5807m$regs(12-15). Postopek dekodiranja je odviso od tipa sporočila in ga lahko najdemo v dokumentih, ki opisujejo RDS sistem (npr. AN243 firme Silicon Labs).
Opomba: Vse knjižnice in programi iz tega članka lahko brezplačno dobite od uredništva revije Svet elektronike!
Barduino-16