Avtor: dr. Simon Vavpotič
2017_258_44
Microchip Harmony je zagotovo najpomembnejši programski okvir za vse, ki se navdušujemo nad mikrokontrolerji in digitalnimi procesorji podjetja Microchip. Je tudi pomemben ugnezden del razvojnega okolja MPLAB X IDE, ki nekajkrat pohitri in poenostavi delo programerjev.
V preteklem nadaljevanju smo se bomo nekoliko zahtevnejše implementacije snemalnika zvoka z dvema mikrokontrolerjema: PIC32 MX27 F256B in PIC32 MX250 F128B. Tokrat bomo preučili, kako PIC32 deluje tudi kot gostitelj naprav USB, navidezni spojnik (angl. virtual hub), ali pa kot večpredstavna periferna enota, denimo mikrofon USB. Pogledali bo tudi, kako vzpostavimo sistemsko konzolo, ki omogoča izpisovanje kontrolnih sporočil preko vmesnika UART.
Ta vsebina je samo za naročnike
PIC32 kot gostitelj naprav USB
Doslej je v seriji Harmonija razvoja in programiranja osebni računalnik vedno gostil PIC32, tokrat pa bomo preučili tudi možnost, da PIC32 gosti napravo USB. Nerodno je le, ker imajo mikrokontrolerji PIC18 in PIC32 le eno enoto USB. Zato ne morejo biti hkrati gostitelji naprav USB in naprave USB. Čeprav lahko hkrati povežemo največ eno fizično napravo USB, ima ta lahko več logičnih naprav. Tako deluje PIC32 hkrati tudi kot navidezni spojnik. Kot primer omenimo dvoje vrat UART (RS-232), ki jih PIC32 predstavi kot dve logični napravi.
Lahko pa PIC32 povežemo z zunanjim spojnikom USB in tako povečamo število priključkov za zunanje naprave. Vendar moramo za priklop več naprav imeti novejšo različico Microchip Harmony (npr. v1.07 ali v2.04), ali pa moramo sami preprogramirati gonilnik USB v Microchip Harmony, tako da zna poiskati naprav, ki so povezne preko spojnika. V Microchip Harmony imamo primer, hub_msd, ki prikazuje, kako z uporabo spojnika USB iz enega ključka USB prekopiramo datoteko na drugi ključek USB. Bistvena razlika glede na običajno uporabo PIC32 kot gostitelja naprav USB je dodatna vključitev gonilnika za spojnik v Microchip Harmony Configuratorju. Navesti moramo tudi novo število naprav, priključenih na spojnik, kar ustreza številu uporabljenih priključkov na spojniku, oziroma številu priključenih naprav. Poleg tega navedemo tudi novo število elementov v tabeli TPL. Spojnik pri vsakem doda 1, dodatna naprava pa še po 1. Če imamo 2 napravi, priključeni preko spojnika, bosta obe vrednosti 3.
Za vajo se lahko lotimo predelave primerov hid_basic_keyboard in hid_basic_mouse_uart, tako da pri obeh omogočimo uporabo spojnika. Če želimo v povezavo le vriniti spojnik, predelava programske kode ni potrebna, dovolj je, da v Microchip Harmony Configuratorju izberemo HUB driver in pri njem izberemo število naprav 2 ter število vnosov v TPL 2. Ostalega ni potrebno spreminjati.
Precej več dela bomo imeli, če se odločimo združiti primer za tipkovnico in miško. Takrat moramo prenesti tudi programsko kodo za podporo delovanju tipkovnic, oziroma podporo delovanju miške.
Zanimivo rešitev uporabe spojnika USB najdemo ne eni izmed japonskih spletnih strani: http://www.suwa-koubou.jp/micom/index_en.html. PIC32MX se lahko prelevi v gostitelja več naprav USB tako, da za zamenjamo naslednje datoteke v projektu Microchip Harmony: usb_host.c, usb_host.h in usb_host_local.h z datotekami, ki jih dobimo iz vzorčnega projekta v datoteki: usb_hub_demo_SBDBT32.zip. Nato v usb_config.h definiramo še število vrat, ki jih ima spojnik USB. Denimo, če ima 4 vrata, definiramo: #define USB_HUB_NUMBER_OF_DOWN_STREAM_PORTS 4. Natančne spremembe omenjenih datotek so opisana na prej omenjeni spletni strani, kjer najdemo tudi primera usb_hub_demo in usb_hub_hid_demo. Prvi preko spojnika združi miško, spletno kamero in disk v pomnilniku, drugi pa tipkovnico, miško in igralno palico. Slednji deluje tudi z več tipkovnicami, miškami in igralnimi palicami.
Gostitelj spletne kamere
Zanimiv je tudi primer priklopa spletne kamere preko priključka USB. Pri tem potrebujemo samo miniaturni testno ploščico SBDBT32 z mikrokontrolerjem PIC32MX695F512H, ki ima poleg tega še režo za kartico microSD in ni dosti večja od dveh vtičnic USB tipa A. Škoda je le, ker je SBDBT32 mogoče kupiti le pri japonskem proizvajalcu Running Electronics.
Primer za spletno kamero najdemo v strnjeni datoteki sbdbt32_uvcrec_<različica>. Zadnja različica je v sbdbt32_uvcrec_160901.zip. Če jo hočemo uporabiti s PIC32MZ, je potrebno vložiti kar nekaj dela, saj so potrebne prilagoditve na mikrokontrolersko družino PIC32MZ. Po drugi strani pa je res, da je pri spletni kameri najtežji del komunikacijski protokol, ki oamogoča prenos podatkovnega toka v mikrokontroler. Ta ni vezan na mikrokontrolersko arhitekturo, temveč je odvisen od programske opreme spletne kamere. Kodo, povezano s kamero najdemo v datotekah uvc.c, uvc.h in task_uvc.c.
Če poskušamo primer za spletno kamero prevesti za PIC32MX270F256B, nam bi spodletelo, saj ima ta dvakrat manjši RAM kot PIC32MX695F512H. Tudi manjšanje določenih podatkovnih struktur, kot je sklad, ne uspe, saj 64 kB RAM enostavno ni dovolj velik za vse. Če bi poskusili primer prevesti še za PIC32MZ2048ECH144, bi morali vložiti precej več dela, saj se njegove vgrajene zunanje enote precej razlikujejo, vendar pa ne bi imeli težav s pomnilnikom in hitrostjo delovanja.
A vrnimo se k osnovnim primerom iz zbirke Microchip Harmony, kjer je še veliko zanimivega.
Gostitelj tipkovnice USB
Poglejmo, kako mikrokontroler PIC32MZ2048ECH144 (PIC32MZ EC Starter Kit) deluje kot gostitelj običajne tipkovnice s priključkom USB. V Microchip Harmony v2.04 imamo primer hid_basic_keyboard. Znaki s tipkovnice se prenašajo v terminalsko okno preko UART, če imamo na voljo ustrezno vmesniško ploščo, oziroma pravilno povezan 3.3 V vmesnik UART. V nasprotnem lahko priključimo tipkovnico in v načinu za razhroščevanje spremljamo pritiske posameznih tipk in tudi siceršnje delovanje programa.
PIC32MZ EC Starter kit podpira serijsko komunikacijo, vendar nima izvedenega serijskega priključka. Uporabimo lahko katerikoli standardni 3,3 V vmesnik UART na USB (npr. USB SERIAL CM340 s spletne strani http://www.winchiphead.com), ki ga neposredno povežemo s PIC32MZ EC Starter Kit preko treh vodnikov: TX, RX in mase s pomočjo razširitvene ploščo Starter kit I/O Expansion Board. Slednja ima dovolj velike kontakte in robne konektorje, ki omogočajo enostavno spajkanje. PIC32MZ2048ECH144 ima več vmesnikov UART. Mi smo ostali kar pri UART 2, ki je uporabljen tudi v primeru hid_basic_keyboard. Tako je bilo v Microchip Harmony Configuratorju potrebno izbrati zgolj izhod U2TX (signal TX za UART 2) in vhod U2RX (signal RX za UART 2). Prvega smo nastavili na vrata PC2, drugega pa na vrata RE9. Tako smo uporabili priključke 48 (TX), 46 (RX) in 45 na konektorju J10 Starter kit I/O Expansion Boarda. Še nasvet: Na spletu se splača poiskati datoteko PIC32MZ 144 Pins.xlsx, v kateri so opisane vse potrebne preslikave nožic, če uporabljamo PIC32MX EC Starter Kit skupaj z Starter kit I/O Expansion Board.
Naslednji korak je bila nastavitev USB SERIAL CM340. V primerih v sklopu Microchip Harmony v2.04 so uporabljene naslednje nastavitve: hitrost 115200 b/s, brez paritete, 8 bitov in 2 stop bita.
Konzola in operacijski sistem
Za konec smo preverili še primera multi_instance_console in debug_uart. Prvi omogoča hkratno posnemanje konzole preko USB in preko UART 2, kar je uporabno pri zahtevnejših aplikacijah. debug_uart_freertos pa je prikazuje možnost izpisa kompleksnih sporočil za razhroščevanje med delovanjem programa ob uporabi operacijskega sistema FreeRTOS. Tako razhroščevanje lahko uporabljamo tudi kot koristen pripomoček pri razhroščevanju s programatorjem (npr. PICkit 3). Po drugi strani lahko konzolo uporabljamo tudi za komunikacijo z mikrokontrolerjem. Podpora zanjo je vgrajena v Microchip Harmony, le prave programske knjižnice moramo izbrati v Microchip Harmony configuratorju ter seveda pravilno nastaviti izbrani vmesnik UART.
V programu izvedemo izpis na konzolo z več ukazi. Najbolj priročna sta SYS_MESSAGE in SYS_PRINT. Prvi je namenjen samo izpisu besedila, kjer lahko uporabljamo tudi kontrolne znake, kot sta »n« (pomik v novo vrstico) in »r« (pomik na začetek vrstice). Za izpis vrednosti potrebujemo funkcijo SYS_PRINT, ki deluje podobno kot funkcija printf v standardnem C. Denimo »%d« pomeni, da bomo na tem mestu v besedilu izpisali decimalno vrednost. Za branje znakov iz konzole moramo klicati ukaz SYS_CONSOLE_Read ali pa vzpostaviti funkcijo, ki jo kliče nazaj operacijski sistem (angl. callback function).
PIC32 kot zvočna periferna enota
V Microchip Harmony v2.04 so številni primeri uporabe kodekov japonskega proizvajalca AsakiKASEI pa tudi gonilniki za D/A pretvornik AK4384 in kodeke: AK4642, AK4953 in AK7755. Omenjeni so vgrajeni tudi v številne večpredstavne testne ploščice pa tudi v dodatne, hčerinske ploščice, ki jih dodamo testnim ploščam brez podpore za zvok. Pri čipih AK moti le, da niso primerni za ročno spajkanje, saj je razmik med nožicami komaj 0,65 mm. Zato si z njimi doma bolj težko izdelamo testno ploščico.
Kako pa narediti poceni predvajalnik glasbe iz kartice SD? Potrebujemo PIC32MX250F128B, vtičnico za kartice microSD, 12-bitni digitalno-analogni pretvornik MCP4822, nekaj uporov in kondenzatorjev ter programsko kodo in načrt izdelave, ki ju najdemo na spletni strani: http://www.tahmidmc.blogspot.com v datoteki *.zip.
Pri Microchipu so se odločili za kompleksnejše primere, ki so uporabni tudi v profesionalnih napravah za predvajanje glasbe. Tako lahko nekatere testne plošče postanejo tudi zvočniki ali mikrofoni, ki delujejo preko USB.
Kakorkoli, PIC32 lahko z dodatkom zvoka postane večpredstavna periferna enota, kot sta: zvočnik USB ali mikrofon USB. Krmili lahko tudi barvni zaslon. A škoda je, da so za enkrat gonilniki v Microchip Harmony omejeni na podporo čipom le enega proizvajalca avdio čipov.
Prihodnjič
Microchip Harmony smo v nadaljevanki Harmonija razvoja in programiranja dodobra prečesal. V zadnjem delu se bomo nekoliko podrobneje lotili še podpore za operacijski sistem za delo v realnem času (RTOS). Zanimalo nas bo, kako ustvarjamo programske niti, kakšna je podpora za datotečni sistem, kakšne so možnosti za terminalski ali datotečni dostop ter kako so programsko podprte različne funkcionalne enote. Za konec še o posnemanju delovanja 8-bitnega ZX Spectruma s PIC32MX695F512H.
Harmonija razvoja in programiranja (9)
Harmonija razvoja in programiranja (8)
Harmonija razvoja in programiranja (7)
Harmonija razvoja in programiranja (6)
Harmonija razvoja in programiranja (5)
Harmonija razvoja in programiranja (4)
Harmonija razvoja in programiranja (3)
Harmonija razvoja in programiranja (2)
Harmonija razvoja in programiranja (1)