Riist- või tarkvara disaini näidisprojekt
Antud artiklis on juttu nö elektroonika hobiprojektist, mis siiski sai autorilt enam tähelepanu, kuna lahendust sai otsitud nii riist- kui tarkvaralisena, seda küll ilma koosdisaini metoodikat kasutamata. Sellest siis ka nihe pealkirjas – mitte riist- ja tarkvara koosdisain vaid riist- või tarkvara disain. Tulemus võib siiski väärida järeletegemist kuna valminud kontroller on küllalt universaalne seade.
Projekti algatas lihtne juhtum – tekkis vajadus lisada 3-värvilisele LED-prožektorile PAR56, mis on küll varustatud sisemise kontrolleriga ja mõningate DIP-lülitilt valitavate valmis värvusskeemide ning värvivahetusprogrammidega, täielikku häälestusulatust lubav lihtne juhtseade. Valgustusseadmete juhtimiseks on olemas ka valmispulte, kuid need olid ühe pro˛ektori kodukasutaja jaoks „liiga head“.
Nagu lähemal uurimisel selgus, on DMX (täpsemini DMX512 [1]) füüsikalisel tasandil sama, mis RS485 [2], s.t. diferentssignaali kasutav jadakoodi andmevahetusstandard. DMX protokoll on lihtne, lausa robustne – kõige lihtsamal juhul ühesuunaline andmepakett, milles iga bait tähendab infot ühe DMX kanali kohta. Konkreetne DMX-seade võib kasutada oma funktsioonide juhtimiseks mingit kanalite vahemikku paketist. Ühte paketti mahub kuni 512 kanalit, selle ulatuse ärakasutamine sõltub juba otstarbest, pakett võib olla palju lühem, olles määratud vajatavate kanalite arvuga. Pakettide vahel on paus (BREAK) loogilisel nivool „0“. Iga pakett algab minimaalselt 12µs märgisega MARK (nivool „1“), millele järgneb startkood (DMX seadmetel on üldjuhul koodiks 0x00) ja seejärel juba kanalid alates number 1-st. Jadakood saadetakse välja andmesõnadena (slot) kujul – startbitt (loogiline „0“), 8 andmebitti alates nooremast ja kaks stoppbitti (loogiline „1“). DMX standard defineerib veel pakettide vahelise pausi minimaalse kestvuse (92 µs ) ja ülekandekiiruse, milleks on üsna aukartustäratav 250kboodi – ühe bit kohta 4 µs aega. Maksimaalse paketipikkuse ja minimaalse pausi korral jõutakse sekundis saata 44 paketti, samas kui seadmed peaksid säilitama tööre˛iimi ka siis kui tuleb ainult üks pakett sekundis. Eri kanalid võivad olla mõeldud eri seadmetele kõik ühe ja sama RS485 signaaliahela (
daicy-chain topoloogia) küljes. Iga seade loeb ühisest paketist välja just temale seatud kanalite andmed.
PAR56 prožektor on häälestatud reageerima paketi nelja esimese kanali andmetele, mis on siis vastavalt:
1. Punased LED-d (koodid 0-255),
2. Rohelised LED-d (koodid 0-255)
3. Sinised LED-d (koodid 0-255)
4. Heledus (koodid 0-189), vilkumine (koodid 190-250) ja mittedefineeritud (koodid 251-255).
Niisiis, lähtudes otse standardist, tuleks saata sagedusel 250kHz vähemalt kord sekundis välja 58-bitiline pakett-vektor. Juhul kui PAR56 kõigi kanalite väärtuseks on 127, oleks pakett järgmine (algus paremal):
"1101111111011011111110110111111101101111111011000000000111" ====>
Kolm „111“ alguses annavad täpselt vajaliku 12µs MARK-sündmuse.
Kui nüüd juhtseadme projekteerimiseks läheb, siis selgub, et kõige lihtsama mikrokontrolleriga seda ära ei teegi, hädavajalik on riistvaralise jadaside mooduli olemasolu (UART). Ilma selleta oleks paketi saatmine protsessorile üle jõu käiv - tavaline mikrokontrolleri töökiirus on suurusjärgus 1 µs käsutsükli kohta, mille korral jõuaks protsessor teha ühe biti väljasaatmise jooksul vaid 4 käsku – sellest ei piisa, et andmeid ette valmistada. UART moodul võtaks bitthaaval andmesõna formeerimise vaeva enda peale ja baithaaval andmeid ette sööta jõuab siis ka palju aeglasem protsessor (baidi saateaeg koos START ja kahe STOP-bitiga on 11 x 4 = 44 µs). Signaali pausiaeg on DMX korral piisavalt pikaks venitatav (kuni 1 sekund), et selle jooksul mistahes protsessor mistahes kasutajaliidese töötlemisega toime tulla.
Kuidas oleks aga riistvaraline lahend väliprogrammeeritaval kiibil? Tegelikult väga elementaarne – riistvaras võib kuitahes pikki bitivektoreid moodustada, vajalikud andmebaidid tuleb vaid vektorisse õigesse positsiooni omistada ja 250kHz taktiga väljundisse suunata. Kasutajaliidest võib riistvara töödelda paralleelselt jadakoodi väljastamisega, selleks jätkub ressursse ka kõige tagasihoidlikumas FPGA-kiibis.
-- Nexus 2 on takteeritud 50MHz signaaliga, millest teeme esmalt 25MHz signaali
kell: process(clock)
begin
if rising_edge(clock) then
clk <= not clk;
end if;
end process kell;
-- DMX jaoks 250KHz signaali tegemine 25MHz taktisignaalist
txkell: process(clk)
begin
if rising_edge(clk) then
if txclk_cnt /= 49 then
txclk_cnt <= txclk_cnt + 1;
else
txclk_cnt <=(others =>'0');
txclk <= not txclk;
end if;
end if;
end process txkell;
-- Main procedure
counting : process(txclk,reset)
begin
if reset = '1' then
DE <= '1'; -- lubav signal RS485 kiibi väljundile
txcnt <= (others =>'0'); -- tsükliloendur (pakett + paus)
dmxvector <= "1101111111011011111110110111111101101111111011000000000111";
else
if rising_edge(txclk) then
txcnt <= txcnt + 1;
if txcnt <= 1279 then –-paketitsükli kestvus 1280 x 4 us = 5.12ms
dmxvector <= '0' & dmxvector (57 downto 1); -- nihe paremale
else
txcnt <=(others =>;'0');< dmxvector <= "11" & dmxch4 & "011" & dmxblue & "011" & dmxgreen & "011" & dmxred & "011000000000111"; -- DMX pakett-vektori moodustamine
end if;
end if;
end if;
end process counting;
TxDI <= dmxvector(0); -- vektori kõige parempoolne bitt väljundisse DMX-signaaliks
Tervikkirjeldusse kuulub veel komponent, mis tagab signaalide dmxred,dmxgreen, dmxblue ja dmxch4 juhtimise kasutaja poolt. Võib öelda, et kood töötas esimesest katsest, lubades pro˛ektorit vabalt juhtida ning katsetamise käigus proovida läbi erinevaid kasutajaliideseid.
Eksperiment: Tarkvaraline lahendus
Tarkvara kandjaks protsessor Microchip PIC16F88, arendustarkvaraks Microchip IDE (vabavara) ja CCS C-kompilaator PCM (kommertsprodukt [4]).
Mikrokontroller PIC16F88 on lihtne 8-bitilise arhitektuuriga 18-väljaviiguline protsessor, mis on paljude lisade hulgas varustatud asünkroonse jadaliidesega (USART). Dokumentatsiooni järgi suudab USART protsessor 4MHz sisemise takti korral genereerida vabalt 250kboodist jadasignaali.
Koodi kirjutamisel tuli tõdeda mitmeid üllatusi, mis nõudsid paljusid katseid enne kui tulemus PAR56 pro˛ektorit allutama hakkas:
1. Selgus, et PIC16F88 PortA on vaikimisi analoogsisenditena häälestatud, s.t. digitaalsisenditena kasutamiseks tuli analoogmoodul välja lülitada. Muidugi oli see ka dokumentatsioonis kirjas.
2. PIC16F88 USART ei ole otseselt häälestatav kahe stop-bitiga jadaprotokollile. Siiski, kuna andmeüksuse suurus võib olla ka 9 bitti, siis oli võimalik sättida 9-s bitt täitma esimese stopp-biti rolli (konstantselt „1“). Seda tuli siis teha väljaspool CCS PCM kompilaatori standardfunktsioone (assembleris).
3. PIC16F88 USART ei toetanud otseselt DMX protokolli. Tõsi küll, USART oskab genereerida väidetavalt RS485-toetuseks mõeldud ENABLE-signaali, mis on aktiivne andmesõna saatmise ajal, kuid ei oleks taganud vajalikku MARK signaali kestvust ja pealegi muutub ENABLE korraks passiivseks ka andmesõnade vahel, mis rikuks DMX-paketi kuju.
4. USART väljund jääb andmesõnade saatmise vaheajal kõrgeks „1“ . Kuna DMX protokoll nõuab BREAK tingimuse moodustamist, mille ajal signaal on „0“, siis lõppkokkuvõttes tuli BREAK ja MARK tingimused samuti genereerida väljaspool kompilaatori standardfunktsioone.
Nimetatud erisused tegid iseenesest triviaalse ülesande lahendamise ajakulukas ja väljundsignaali tegeliku kuju tuvastamiseks ja häälestamiseks tuli kasutada digitaalostsillograafi.
Lõppjäreldused
Riistvara (Nexys 2 ja Xilinx FPGA)
- Geomeetria: Halb, defineeritud arendusplaadi suurusega ~180cm2
- Katseplatvorm: Hea, triviaalne kodeerimine lähtudes otseselt standardist
- Arendusaeg: Tunde
- Kompileerimise/sünteesi ja mahalaadimise aeg: Minutites
- Hind: Nexys arendusplaat -$99, RS485 ajur -$3
Tarkvara (PIC16F88)
- Geomeetria: Hea, plaadi suurus määratud protsessori ja ajurikiibi poolt ~18cm2
- Katseplatvorm: Komplitseeritud tingituna USART otsesest mittesobivusest konkreetse (DMX) protokolliga
- Arendusaeg: Päevi
- Kompileerimise/sünteesi ja mahalaadimise aeg: Sekundites
- Protsessor - $5, RS485 ajur - $3, CCS PCM C-kompilaator - $150
Tuleb tunnistada, et mõlematel variantidel on plusse ja miinuseid. Kiireks prototüüpimiseks on riistvaraline lahendus FPGA-l vägagi sobiv ja eriti ladusalt läheb standardikohase protokolli genereerimine. Samas iga arendusplaadi väline lisafunktsionaalsus nõuab väliste riistvaraliste moodulite lisamist (näiteks mikrokontrolleris on mugav sisemine EEPROM, mida võib kasutada oleku säilitamiseks seadme väljalülitatud olekus; Nexys 2 arendusplaadil tulnuks sellise funktsionaalsuse saamiseks lisada mälukaardi moodul).
Tarkvaraline lahendus sobib lõppteostuseks paremini, kuid nõuab protsessori ning kompilaatori dokumentatsiooni põhjalikku uurimist, et kõigi võimaluste ja tõkete rägastikus leida sobiv tee protokolli ja muu funktsionaalsuse teostuseks.
Lõpptulemus, nelja kanaliga ja nelja mäluga DMX kontroller koos PAR56 prožektoriga on näha järgmisel fotol:
Seadme kasutajaliidesel on neli nuppu värvide valikuks (ühtlasi ka mälupesade valikuks), nupud valitud värvi väärtuse kerimiseks ning värvuskombinatsiooni salvestus- ja taasesitusnupud.
Projektifailid on veebis [5]: PIC16F88-ga DMX-kontrolleri skeem ja trükkplaat CadSoft Eagle failidena, kontrolleri tarkvara CCS PSM C-ning kompileeritud HEX-koodis ning Nexys 2 arendusplaadile mõeldud kontrolleri tipptaseme komponendi kirjeldus VHDL keeles.
Viiteid
1. DMX512,
http://en.wikipedia.org/wiki/DMX512
2. Jan Axelson, Designing RS-485 Circuits,
http://lms.uni-mb.si/~meolic/students/mpk/designingRS485.pdf
3. Nexys 2 FPGA board,
http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,400,789&Prod=NEXYS2
4. CCS Compilers,
http://www.ccsinfo.com/content.php?page=compilers
5. Kontrolleri projektifailid (tarkvara uusim versioon dets. 2011!!!):
http://mini.li.ttu.ee/~nalle/tmp/DMX_PAR56contoller