Úvod
Zabudované mikropočítačové systémy zpravidla komunikují s uživatelem pomocí displeje a klávesnice. Zvuk nebývá příliš využíván, pokud odhlédneme od specifických aplikací, jako jsou hrací automaty, herní konzole nebo telefonní informační systémy. Souvisí to možná i s tím, že opačný směr komunikace - rozpoznávání řeči - se začíná prakticky uplatňovat až v poslední době, a stále ještě s mnoha omezeními.
U malých a středně výkonných systémů se setkáváme se zvukovou signalizací méně často, než by bylo možné, anebo je tato signalizace velmi primitivní. Důvody menšího rozšíření zvukové signalizace totiž mohou být i technicko-ekonomické. Jak vlastně vypadají možnosti generování zvuků u mikropočítačů? Běžné, i výkonné mikrořadiče žádný výstup alespoň obdélníkového signálu s proměnným kmitočtem nemají. Pouze u některých typů je možné využít výstup pulzní šířkové modulace (PWM), pokud má relativně plynule volitelnou periodu. Ačkoliv by třeba nejeden kanál PWM zůstal pro tento účel volný, nebude asi možné použít tak krátkou, popř. v tak širokém rozmezí proměnnou periodu PWM (společnou pro všechny kanály) s ohledem na akční členy, připojené k ostatním kanálům.
Jinou možností generování obdélníkového signálu je přepínat logickou úroveň výstupu při obsluze přerušení od časovače. Jen v málokteré aplikaci si však můžeme dovolit využít jeden ze dvou či tří časovačů mikrořadiče jen pro tento účel a k tomu ještě nastavit vysokou prioritu (pokud je vůbec volitelná) příslušného přerušení. Pak už zbývá jen generovat signál v hlavním programu, kde je jeho perioda nejistá (cyklus je přerušován) a současně nelze provádět téměř žádnou další činnost.
Východiskem je zřejmě použití externího obvodu. Různé levné melodické generátory s anglosaskými nebo německými melodiemi, resp. generátory zvuků sirény, střelby, zvířecích a podobných zvuků však asi nebudou vhodným řešením.
Parametry generátoru
Generování zvukové signalizace v mikropočítačových aplikacích, především v těch jednodušších na bázi mikrořadičů, řeší obvod se samostatným, příslušně naprogramovaným, mikrořadičem Microchip PIC12C5xxA. Generátor má následující vlastnosti:
- realizace jediným malým integrovaným obvodem s 8 vývody, bez dalších součástek !
- nízká cena integrovaného obvodu (cca 40 Kč)
- příp. jednoduchý proudový booster (cca 15 Kč), dodávající do reproduktoru výkon až 1 W
- nízký odběr naprázdno (< 1 mA)
- příjem povelů po synchronní sériové sběrnici SPI (popř. I2C) v režimu slave
- možné řízení přenosu (handshaking) dvěma signály (výběr obvodu, připravenost k příjmu)
- příp. autonomní provoz s výběrem až 27 sekvencí zvuků úrovněmi nastavenými na 3 vstupech
- generování 50 půltónů v rozsahu 4 oktáv (H až c4, t.j. 123,5 Hz až 2093 Hz)
- délka tónu i pauzy v 15 stupních (16 ms až 4 s) nebo trvale
- generování zvuku sirény (frekvenční modulace s volitelným zdvihem a kmitočtem)
- délka melodie omezena pouze kapacitou paměti, v RWM max. 8 tónů (16 pro PIC12C509)
- možnost předprogramovaných melodií (zvuků) v paměti kódu, dostupných 1bajtovým povelem
- opakování melodie nebo trylku sirény až 30× nebo trvale
- 4 úrovně hlasitosti (u každého tónu volitelné nezávisle)
Jak je z výčtu patrné, použití mikrořadiče umožnilo funkce generátoru výrazně rozšířit nad rámec pouhého generování jednoho tónu s volitelnou délkou.
Zapojení
Na základním obvodu s jedinou součástkou není co popisovat. Na obr. 1 je obvod již doplněn proudovým boosterem v můstkovém komplementárním zapojení s tranzistory o maximálním dovoleném proudu 1 A a tantalovým kondenzátorem blokujícím značné proudové špičky. Bez osazeného boosteru se na protitaktně spínané výstupy mikrořadiče (svorky J2), na nichž je tak dvojnásobná amplituda napětí, připojí přímo piezoelektrický akustický měnič. Je možno použít i malý (magnetodynamický) reproduktor s vysokou impedancí (cca 100 W). Výstupní budiče vývodů mikrořadiče mají poměrně velký vnitřní odpor, takže s touto zátěží k překročení dovoleného proudu budiče ±25 mA nedojde. Měřením bylo zjištěno, že výkonové přizpůsobení nastane při zatěžovacím odporu 108 W, kdy by byl výstupní výkon 60 mW.
Při malém napájecím napětí mikrořadiče i boosteru snižují relativně velké úbytky napětí na přechodech BE tranzistorů (a přirozeně i na budičích vývodů mikrořadiče) dosažitelné výstupní napětí a tím i výkon a účinnost. Obzvlášť výrazné by to bylo při nižším napájecím napětí obvodu, např. 3,3 V, při kterém je jinak funkce mikrořadiče ještě zaručena. Nicméně při standardním napájení 5 V je možno na svorkách J3 do reproduktoru o impedanci 4 W dodat až 1,0 W a do doporučené zátěže 8 W pak 0,8 W. Miniaturní reproduktory pak tedy ani nelze použít, neboť jejich dovolený příkon je podstatně nižší. S větším reproduktorem, zejména pokud bude (s uvážením kmitočtově závislé citlivosti lidského sluchu) napájen signálem o vhodném kmitočtu, se dosáhne i poměrně značné hlasitosti, např. k signalizaci alarmu.
Mikrořadič PIC12C50xA
Mikrořadiče Microchip PIC12C508A a PIC12C509A mají 512, resp. 1024 slov paměti kódu (jednorázově programovatelná EPROM), 25, resp. 41 bajtů paměti dat RWM a 3 až 6 vstupně/výstupních vývodů. Shodně s nejstarší rodinou mikrořadičů PIC16C5x mají obvod watchdog, jeden 8bitový čítač/časovač s předděličem, pouze dvouúrovňový hardwarový zásobník a chybí jim systém přerušení - podrobněji např. v [1]. Nejsou vybaveny žádným sériovým rozhraním.
Po konfiguraci do módu s interním zdrojem hodinového kmitočtu z vestavěného RC oscilátoru se ušetří 2 vývody pro jinak běžný externí krystal. Další vývod se získá aktivací interního obvodu resetu, takže z 8vývodového pouzdra se využije všech 6 dostupných vývodů (2 zbývají na napájení) jako volitelné a programově řízené vstupy nebo výstupy, soustředěné v bráně nazývané GPIO.
Je pochopitelné, že jmenovitý kmitočet 4 MHz vestavěného oscilátoru není možné při výrobě zaručit a že kolísá s napájecím napětím a teplotou. Kmitočet může být kalibrován 6bitovou hodnotou, zapsanou do speciálního funkčního registru OSCCAL. Základní, výrobní, tolerance může být odstraněna využitím hodnoty, která je výrobcem zapsána na nejvyšší adresu paměti kódu EPROM jako instrukce MOVLW cal (zápis bezprostřední hodnoty cal do pracovního registru W). Na tuto adresu je po resetu mikrořadiče nastaven čítač instrukcí, který se následujícím přetečením nastaví na adresu 0, tj. na skutečný začátek programu. Tam může být instrukce MOVWF OSCCAL, kterou se provede přesun hodnoty do registru a tím vlastní kalibrace.
Hodinový kmitočet samozřejmě přímo určuje absolutní výšku generovaných tónů. Podle měření v [4] je střední rozlišení možného nastavení 1,0 % ze jmenovité hodnoty, takže pokud výrobce kalibraci nešidí, měla by být odchylka za standardních podmínek (napájení 5,0 V, teplota 25 °C) nejvýše 0,5 %. Teplotní závislost kmitočtu je podle grafu v datovém listu přibližně 0,05 %/K, což by představovalo pro běžnou změnu teploty okolo 20 K (uvnitř elektronického zařízení v interiéru) odchylku kmitočtu 1 %. Závislost na napájecím napětí uvedena není - pokud však bude napětí běžně stabilizováno, není o ní snad nutno uvažovat. S jistou rezervou se dá očekávat, že chyba absolutního ladění nepřesáhne čtvrt tónu (půltónový krok je cca 6 %), což kromě nemnoha jedinců s absolutním sluchem prý málokdo rozezná. Chyby relativního ladění jsou již záležitostí softwarových smyček a nedělitelného instrukčního cyklu 1 µs (1 instrukční cyklus = 4 periody hodin).
Z hardwarového vybavení mikrořadiče zmiňme ještě pull-up rezistory na vývodech GP0, GP1 a GP3, společně připojované programově nastavitelným bitem v registru OPTION. Mikrořadič může přejít do režimu spánku (sleep), kdy jeho odběr poklesne z typické hodnoty 0,8 mA na zlomek mikroampéru. Z tohoto režimu může být probuzen jak watchdogem (pokud běží, je však odběr ve spánku poněkud vyšší), tak změnou úrovně na jednom ze vstupů GP0, GP1 nebo GP3.
Vstupní rozhraní
Funkce a parametry generátoru jsou téměř zcela určeny programem mikrořadiče. Tvoří jej dvě části: vstup povelu a kódů zvuků po sériovém rozhraní, popř. čtení vstupů volby zvuku s následným dekódováním, a pak vlastní generování zvuků.
Implementace sériového rozhraní SPI je v generátoru redukována jednak na režim slave (vývod hodinového signálu SCLK je stále vstupem), jednak výhradně na vstup dat (implementován pouze vstup MOSI – Master Output Slave Input, výstup MISO chybí). Jedna ze čtyř možných kombinací polarity (klidová úroveň) a fáze (aktivní hrana) signálu SCLK ve vztahu k signálu dat může být zvolena ve zdrojovém kódu programu. Standardně je klidovou úrovní log.0 a aktivní je hrana náběžná. Přenos bajtu začíná nejvyšším bitem (MSB), ovšem i to je možno v programu změnit.
Hardwarově řešené rozhraní SPI může být obecně velmi rychlé (vysoký kmitočet signálu SCLK), neboť je nutno uvažovat pouze zpoždění posuvných registrů a šíření signálu po případně delším vedení. Softwarová náhrada je přirozeně až o 2 řády pomalejší. Data na vstupu MOSI musejí zůstat platná ještě alespoň 8 µs po náběžné hraně hodin. Další náběžná hrana hodin může uprostřed přenosu bajtu přijít nejdříve po 12 µs, mezi posledním bitem předcházejícího a prvním bitem následujícího bajtu až po 26 µs. Přenos nejdelší možné nastavovací sekvence (18 bajtů pro 8 tónů) pak trvá minimálně 2 ms.
Nezbytné přídavné zpoždění mezi příjmem bajtů příliš nevadí, neboť hardwarové rozhraní SPI mikroprocesoru (či mikrořadiče) řídící generátor mívá jen jednoduchý vysílací bufer, takže mezi vysláním bajtů se právě objeví žádoucí menší prodlevy způsobené programovým zápisem dalšího bajtu do buferu.
Pokud by v mikroprocesoru nebylo možno nastavit dostatečně nízkou přenosovou rychlost, nebo by nebyl volným rozhraním SPI vybaven vůbec, nic nebrání (velmi jednoduché) softwarové implementaci rozhraní rovněž na jeho straně.
Generátor může sdílet SPI rozhraní mikroprocesoru s dalšími obvody. Příjem dat zahájí teprve po aktivaci úrovní log.0 na vstupu /CS (Chip Select; obvykle bývá označován /SS jako Slave Select). Vstup /CS slouží též k předčasnému ukončení generovaného zvuku, a to po návratu do klidové úrovně log.1 další sestupnou hranou, která vlastně může zahájit přenos dalšího nastavení. Nejde jen o ukončení nepřetržitého tónu, ale i o delší či opakované sekvence zvuků – teoretická maximální doba generování zvukové sekvence z RWM buferu PIC12C508A je totiž přes půl hodiny. Pokud nepotřebujeme ani volit mezi slave obvody, ani přerušovat zvuk, může být vstup /CS trvale uzemněn. Pak by se ovšem po připojení napájení spouštěl standardně povolený test generátoru – je-li po resetu vstup /CS na log.0, ozve se krátká sekvence tónů.
Na druhou stranu, pokud nechceme zvuk předčasně ukončit, měl by se mikroprocesor dozvědět, kdy generování zvuků skončilo, resp. zda je možno nastavit další sekvenci. K tomu slouží monitorování výstupu RDY, který je nastaven na log.1 po resetu mikrořadiče generátoru, přejde do log.0 po příjmu posledního bajtu povelu a na log.1 se vrátí po ukončeném generování zvuků.
Pokud by generátor měl být součástí bateriově napájeného zařízení osazeného obvody se vstupem stand-by, je možno podobnou funkci také naprogramovat. Po ukončení zvukového výstupu přejde mikrořadič do spánku, ze kterého je probuzen až změnou úrovně na vstupu /CS na začátku příjmu dalšího povelu. Během spánku však musí být na všech vstupech nastavena log.1, aby interními pull-up rezistory netekl proud. Rezistory by bylo možno odpojit, avšak standardně připojeny jsou, aby náhodné změny úrovní na případně nezapojených, plovoucích, vstupech nesimulovaly zadání povelu, a tak generování nežádoucích zvuků.
Je-li generátor naprogramován do autonomního provozu se sekvencemi zvuku uloženými v paměti kódu, mají všechny 4 vstupy mikrořadiče (GP2-5) jinou funkci. Jednou z variant je volba jedné ze čtyř sekvencí zvuku aktivací (volitelně log.0 nebo log.1) příslušného vstupu. Větší možnost výběru sekvencí představuje využití 3 vstupů na kódování jejího pořadového čísla s tím, že zvuk je pak spuštěn aktivací čtvrtého vstupu. Při dvojkovém kódování (úrovně L, H) je možností 23 = 8, při kódování trojkovém (L, H, nezapojen) pak prakticky zcela postačujících 33 = 27. Způsob rozpoznání nepřipojeného vstupu je podrobně vysvětlen v [2] a [3]. Připomeňme, že vstupy musejí být v tomto případě opatřeny předřadným rezistorem.
Formát povelů
Povely a data k nastavení generátoru po sběrnici SPI mají různý formát a tím i počet bajtů, což je určeno 2 až 3 nejvyššími bity v prvním vyslaném, resp. přijatém bajtu. Jedná se o formáty :
- 1 bajt s pořadovým číslem sekvence zvuků v paměti kódu
- 2 bajty pro nastavení jediného tónu
- 4 až 18 (popř. 34 u PIC12C509A) bajtů sekvence 1 až 8 (16) tónů do RWM buferu
- 5 bajtů pro generování zvuku sirény
V posledních dvou případech označuje konec přenosu bajt s nulovou hodnotou. Tato stop značka je ve výše uvedeném počtu bajtů již zahrnuta.
V prvním formátu povelů představuje 6 nižších bitů pořadové číslo (1 až 63) libovolně dlouhé sekvence zvuků. Na začátku (v hlavičce) tabulky jsou uloženy ukazatele (adresy), které odkazují na začátek každé sekvence. Konec sekvence je opět označen nulovým bajtem jako stop značkou.
Bajt z tabulky konstant v paměti programu je možno načíst pouze speciálním obratem pomocí volání podprogramu. Index se připraví jako parametr do registru W. Na začátku podprogramu se přičte index k programovému čítači instrukcí ADDWF PCL, takže se provede skok na příslušnou instrukci návratu z podprogramu RETLW k, vracející v pracovním registru W požadovaný bajt.
Ve druhém formátu představuje nižší polovina prvního bajtu kód délky tónu a 6 nižších bitů druhého bajtu kód (1 až 50) výšky tónu. Dva nejvyšší bity téhož bajtu kódují sílu (hlasitost) tónu. Přesnější veličinou by bylo zeslabení, neboť hodnotě 0 odpovídá hlasitost maximální a hodnotě 3 minimální.
Ve třetím i čtvrtém formátu udává 5 nižších bitů prvního bajtu počet opakování melodie nebo trylků sirény (zvýšení a snížení kmitočtu, tj. 1 periodu frekvenční modulace tónu). Rozsah opakování je 1× až 30×, hodnota 31 znamená opakování trvalé.
Ve třetím formátu povelů pak následuje různý počet párů bajtů, v nichž
první bajt kóduje nižší polovinou délku tónu a vyšší
polovinou délku pauzy a druhý bajt výšku a hlasitost tónu stejně jako ve
druhém případě. Zápis i čtení do buferu v RWM se provádí
nepřímým adresováním pomocí registru FSR. U mikrořadiče PIC12C509A se však
pro druhých 16 bajtů buferu musí přepnout stránka paměti.
Ve čtvrtém formátu kóduje druhý bajt půlperiodu frekvenční modulace –
první půlperiodu se kmitočet sirény zvyšuje, druhou snižuje. Kmitočet tónu na konci
modulační periody se může poněkud lišit od výchozího. Jednotkou délky půlperiody
a současně intervalem, ve kterém dochází k diskrétním změnám kmitočtu
sirény, je doba 16,4 ms. Výchozí tón každého trylku je určen spolu s
hlasitostí třetím bajtem kódu ve shodě s druhým formátem.
Čtvrtý bajt – krok modulace – obsahuje pořadové číslo zlomku
aktuálního počtu cyklů hrubého zpoždění. Zlomky jsou členy geometrické řady s
kvocientem 3/4, který je zajištěn postupným dělením hodnoty dvěma (posuv čísla o
1 bit vpravo) a přičtením čísla získaného dalším dělením dvěma.
Vypočítaná část (ovšem minimálně jednotka) je pak úbytkem, resp.
přírůstkem následujícího počtu cyklů zpoždění, který určuje půlperiodu
tónu. Takto počítaný proměnný krok periody tónu přibližuje kmitočtovou modulaci
ideální představě trojúhelníkového průběhu (t.j. po úsecích
lineárního) – při nižších kmitočtech je totiž změna periody větší
než při kmitočtech vyšších.
Všechny tři parametry nastavení zvuku sirény (výchozí tón, půlperioda a
krok modulace) musejí být v rozumných poměrech, což je nejlepší zvolit zkusmo a
posoudit poslechem.
Jednotku délky tónů i pauz odměřuje interní časovač TMR0 s předděličem nastaveným na plný dělící poměr 1:256. Testuje se změna úrovně 6. bitu časovače, což odpovídá výše zmíněné jednotce času 16,4 ms. Kódu doby trvání v rozsahu 1 až 15 je v tabulce přiřazena 8bitová hodnota z geometrické řady s kvocientem cca 1,4, kterou je nastaven programový čítač cyklu. Tón i pauza mohou trvat až 4 s.
Ladění a hlasitost
Výšku tónu by bylo možno zadávat hodnotou kmitočtu, avšak použitý mikrořadič nemá dostatek paměti a výpočetního výkonu k převodu kmitočtu na počet cyklů zpoždění, kterým je časována půlperioda tónu. Kromě toho by kmitočet představoval 2bajtové číslo a též možný krok volby kmitočtu 1 Hz je příliš velký u nejnižších tónů a příliš malý u nejvyšších kmitočtů. Ani zadávání půlperiody tónu v mikrosekundách není vhodné – opět by se jednalo o 2bajtové číslo, avšak největší překážkou je, že prázdný cyklus konstantní délky s 2bajtovým čítačem cyklu trvá minimálně 6 instrukčních cyklů (zde 6 µs). Nejjednodušší, a to i pro přípravu skutečných melodií, je posílat do generátoru pořadové číslo půltónu a příslušný počet cyklů zjišťovat v tabulce, uložené v paměti programu.
Pro přesné naladění nejvyšších tónů je i délka nejkratšího možného cyklu 3 µs ještě příliš hrubým rozlišením. Naštěstí je možno snadno vytvořit podprogram s dobou trvání odstupňovanou po jednom instrukčním cyklu (1 µs). Slouží k tomu již zmíněná instrukce ADDWF PCL pro přičtení obsahu registru W k programovému čítači. Pak se půlperioda tónu časuje hrubě cyklem o délce 16 µs s 1bajtovým čítačem a jemně podprogramem s délkou proměnnou v rozmezí 16 µs. Parametr podprogramu se vyhledává ve druhé tabulce, kde jsou pro úsporu paměti uloženy v každém slově dvě 4bitové položky. Obsah tabulek byl po iteračním výpočtu skriptem MATLABu vygenerován do samostatných souborů, vkládaných do programu v asembleru mikrořadiče PIC.
Chyba relativního ladění, vypočítaná opět v MATLABu na základě počtu instrukčních cyklů půlperiody tónu, má stále stejné, kladné znaménko. Až do 44. půltónu (fis3) nepřekročí 4,5 centu, na předposledním půltónu se objeví maximum 7,3 centu. Poznamenejme, že půltónový interval se rovnoměrně dělí na 100 centů, 1 cent pak představuje odchylku kmitočtu cca 60 ppm. Ladění s odchylkou do ±5 centů je prý možné považovat za dobré.
Hlavní část programu v mikrořadiči generátoru tvoří vnořené cykly. Vnější cyklus opakuje melodii nebo trylky sirény, nižší cyklus prochází buferem v RWM nebo tabulkou v paměti kódu a načítá kódy výšky, délky tónu a délky pauzy nebo periodu výchozího tónu, modulační krok a délku trylku zvuku sirény. Vnitřní, přesně časovaný, cyklus převádí kód výšky tónu na počet průchodů smyčkou nejvnitřnějšího cyklu generování zpoždění a trvá polovinu periody tónu, po níž se změní stav výstupů GP0 a GP1 pro elektroakustický měnič na opačný. Takto je však pouze generován obdélníkový průběh (střída 1,0) pro plnou hlasitost, při nižších úrovních hlasitosti jsou na výstupu úzké pulzy, jejichž polarita se rovněž střídá.
Nastavení hlasitosti proměnnou šířkou pulzů není ideální – v důsledku rozdílného frekvenčního spektra různě širokých pulzů je i zabarvení tónů výrazně závislé na hlasitosti. Projevuje se to i značnou kmitočtovou závislostí mezi efektivní úrovní signálu a odpovídající hlasitostí, což lze vysvětlit tím, že u nízkých kmitočtů přispívají vyšší harmonické k hlasitosti zvuku výrazně, neboť jejich kmitočty spadají nejen do omezené frekvenční charakteristiky obyčejného reproduktoru, ale především do oblasti vyšší citlivosti lidského sluchu, zatímco vyšší harmonické vysokých tónů se již téměř neuplatní. Rozbor spekter a výsledky měření hlasitosti by si zasloužily samostatný článek. Pro základní orientaci uveďme, že nízkou, subjektivně shodnou hlasitost pro krajní tóny rozsahu generátoru vyvolají signály s poměrem stříd téměř 1:6 (nižší pro nízký tón), takže šířky nejužších pulzů jsou v poměru jen cca 3, ačkoliv poměr krajních period tónů je téměř 17.
Úplné vyrovnání hlasitosti tónů různých kmitočtů nebylo možné, ale základní, hrubá lineární aproximace s oboustrannou limitací byla pro korekci závislosti implementována. Jistým problémem bylo, že požadované střídy signálu jsou nízké (řádu 2×10-3 až 1×10-1) a představují šířku pulzů cca od 3 µs do 200 µs, jejichž časování nebylo možné zajistit v rámci hrubého cyklu odměřujícího půlperiodu tónu.
Vzhledem k tomu, že nejkratší půlperioda tónu trvá 239 µs, je možno v tomto čase kromě potřebných testů a nastavení proměnných časovat další proměnné zpoždění (vždy, nezávisle na požadované hlasitosti, aby délka půlperiody zůstala konstantní), kterým se v případě nižší hlasitosti vymezí šířka (úzkého) pulzu. Ve skutečnosti je pro nejnižší hlasitost použito časování podprogramem po 1 µs analogicky s jemným časováním délky půlperiody (viz výše), pro vyšší hlasitost pak minimální cyklus po 3 µs s maximální hodnotou čítače cyklu 63 a konečně pro druhou nejvyšší hlasitost je využit cyklus hrubého zpoždění, ovšem se zvýšeným rozlišením, uskutečněným rozdělením na poloviny po 8 µs. Výpočet parametrů (v MATLABu, viz výše) hlavního hrubého a jemného zpoždění musí přirozeně brát v úvahu hodnoty obou pomocných zpoždění časujících šířku úzkých pulzů.
Hlasitost zvuku generátoru klesá se stupněm zeslabení (0 až 3) velmi přibližně po 10 dB.
Zkušební řízení generátoru osobním počítačem
Osobní počítač (PC) je pro oživování různých elektronických modulů s digitálním rozhraním vhodným nástrojem, neboť se ve srovnání s jinými druhy mikropočítačů snadno programuje.
Nejinak tomu bylo i při vývoji zvukového generátoru. Jeho rozhraní má 3 vstupy a 1 výstup, takže ze standardních rozhraní PC lze použít jak paralelní (LPT), tak sériový (COM) port. Sériový port má právě 3 výstupy – kromě pomocných signálů DTR a RTS lze i datový výstup TXD libovolně programově nastavovat na log.0 a log.1 zapínáním a vypínáním režimu Break.
Nejprve byl vyzkoušen LPT port: stačilo přímo připojit datové výstupy DATA0 až DATA2 na vstupy generátoru SCLK, MOSI a CS a jeho výstup RDY spojit se vstupem PE portu.
V jazyku C byla vytvořena konzolová aplikace SOUNDGEN, běžící v DOSu. Parametrem při spuštění se volí komunikační port. Podle nápovědy se jednopísmennou zkratkou vybere jeden ze čtyř formátů povelů a doplní příslušným číselným parametrem. Podle potřeby si program vyžádá až 4 další parametry, stačí však zpravidla zadat jen první (výšku tónu), ostatní se pak doplní implicitními hodnotami. Při přípravě melodie se vkládání parametrů tónů opakuje; prompt ukazuje pořadové číslo tónu.
Po ukončení povelu se vygenerují kódy, které se pak vyšlou sériově s
časováním sběrnice SPI. Pro kontrolu se vysílané bajty vypíšou v
hexadecimálním formátu na konzoli. Stiskem klávesy ENTER je možno
generování dlouhého nebo trvalého zvuku předčasně ukončit.
Vložením hvězdičky se opakuje poslední povel, zápisem jména souboru s implicitní
příponou SPI se spustí uložený povel, popř. celá řada povelů hrajících
dlouhou melodii. Soubory obsahují posloupnost jednobajtových hexadecimálních
čísel, tak jak se mají vyslat na výstup SPI. Tyto krátké textové soubory
je možno vytvářet přímo v programu ukládáním vyslaných bajtů, a to
zadáním jména souboru po dohrání otestovaného zvuku.
Za poznámku stojí způsob, jakým jsou vytvářena zpoždění řádu desítek mikrosekund potřebná ke zpomalení výstupu SPI, a to nezávisle na hodinovém kmitočtu procesoru. Slouží k tomu operace vstupu nebo výstupu do libovolného registru, ke kterému se přistupuje s časováním ISA sběrnice. Jedna operace pak trvá nezávisle na rychlosti počítače ca 1,2 µs. Pro jednoduchost je použito opakované čtení bázového registru příslušného portu.
Vzhledem k tomu, že k dokončení vývoje generátoru s PIC12C50xA byl s úspěchem použit real-time obvodový emulátor MU Alpha (výrobce ASIX Praha), který se připojuje přes paralelní port, byl pro řízení generátoru použit volný sériový port. Jeho použití je též perspektivní pro případné programování ve Windows, neboť na rozdíl od paralelního portu lze jednotlivé vývody ovládat i testovat funkcemi API. Takový program pak funguje i v těch verzích Windows, které nepovolují přímý přístup k registrům portů.
K přizpůsobení výstupních úrovní RS 232C (na PC až ±12 V) na běžné CMOS/TTL vstupy mikrořadiče (zde z DTR a RTS na GP4 a GP5) stačí rezistory s hodnotou 10-20 kW a vnitřní záchytné diody. Vyšší napětí na vstupu MCLR/GP3 z výstupu TXD by mohl mikrořadič chápat jako přepnutí do programovacího režimu, proto zde byla navíc použita Zenerova dioda na napětí 5,6 V. Výstupní napětí mikrořadiče v CMOS úrovních (0 a +5 V) by ke správnému vybuzení vstupu (zde CTS) s úrovní RS 232C nestačilo jen u zcela ojedinělého COM adaptéru, nebo až při velmi vysokých rychlostech přenosu, což rozhodně není náš případ.
Závěr
Použití generátoru může být velmi široké – od nenápadné signalizace (nízká hlasitost) stisku tlačítek na klávesnici, odlišených výškou tónu, přes různé znělky a fanfáry signalizující jak řádný, tak chybový stav mikropočítačem řízeného systému, až po výrazný alarm (siréna plnou hlasitostí) v případě poruchy či nebezpečného stavu.
Připomeňme možnost samostatného provozu generátoru s volbou zvuků logickými signály.
Je možno hrát i libovolně dlouhé melodie – po 8 vložených a zahraných tónech lze do generátoru poslat další. Do paměti kódu je možno uložit až 55 tónů (v jediné melodii), do obvodu PIC12C509A např. 5 melodií po 24 tónech. Nastavením pauz zvolíme přednes legato či staccato. Pochopitelně jednotónový obdélníkový signál se nemůže srovnávat se zvukem polyfonního generátoru s řízením tvaru amplitudové obálky akordu.
Poprvé byl generátor zvuku použit ve speciálním přístroji pro měření některých fyzikálních veličin textilií. Přístroj, a tedy i generátor, je řízen mikrořadičem Atmel AVR ATmega161. Protože jak fáze přípravy, tak vlastního měření textilního vzorku trvají několik minut, signalizuje generátor jejich ukončení, a obsluha tak nemusí stále sledovat LCD displej. Rovněž případné chyby obsluhy jsou signalizovány i zvukově.
Ačkoliv se mikrořadič interně resetuje spolehlivě, v případě problémů by bylo možno ponechat vstup resetu externí, takže by byl aktivován signálem CS (ovšem s invertovanou funkcí).
Na vzorku obvodu byla zjištěna odchylka pouze +0,53 % od kmitočtu komorního a1. Odběr v klidovém stavu činil 1,52 mA, při plné hlasitosti a na nejnižším kmitočtu s reproduktorem o impedanci 50 W pak 66 mA.
Kontakt v případě zájmu o další informace nebo využití : ivan.dolezal@quick.cz
DOWNLOAD & Odkazy
- [1] WWW stránky firmy Microchip : http://www.microchip.com
- [2] Šabata, J.: Kalibrace vnitřního RC oscilátoru u mikrořadičů PIC12C5xxA. http://fl.hw.cz/docs/pic_rc_konstanta/kalibrace.html
- [3] Doležal, I.: Mikrořadiče Microchip PIC. Sdělovací technika, 44 (1996), č.11: s.8-10, č.12: s.12-15.
- [4] Doležal, I.: Multifunkční rozhraní pro sériový port PC. Sdělovací technika, 49 (2001), č.3, s.16-19.