Microchip MPLAB Harmony je gotovo najpomembnejši programski okvir za vse tiste, ki se navdušujemo nad Microchip mikrokontrolerji in digitalnimi procesorji. Je tudi pomemben vgradni del razvojnega okolja MPLAB X IDE, ki nekajkrat pohitri in poenostavi delo programerjev.
V preteklem nadaljevanju smo spoznali MPLAB Harmony Configurator, ki omogoča enostavno izbiro programskih modulov ter izvedbo nastavitev za njihovo uporabo z različnimi mikrokontrolerji in različno periferno strojno opremo, ki jo upravljajo.
Tokrat se bomo lotili programiranja vmesnika USB. Videli bomo, kako dopolnimo pripravljeno objektno programsko kodo, da bo zares uporabna in katere funkcije za podporo komunikaciji preko USB moramo sami implementirati.
Dopolnitev in definicije podatkovnih struktur
Lotimo se torej dopolnjevanja skeletne programske kode, tako da bo povezava preko USB naposled začela delovati. Na mesta, označena z »za narediti«, moramo dodati svojo programsko kodo, ki bo lahko za vsako sporočilo iz množice obveznih sporočil, s katerimi gostiteljski računalnik vzpostavi in vzdržuje komunikacijo preko USB, pripravila ustrezen odgovor.
Programska knjižnica Harmony je več kot odličen pripomoček, ki nam olajša večino opravil, a kljub temu moramo povedati, kaj pravzaprav želimo prenašati in kako. Pripraviti moramo tudi programske strukture, v katerih bomo hranili stanje aplikacije, oziroma naše naprave. Podpreti moramo naslednje korake: inicializacija, čakanje na nastavitve (angl. wait for configuration), izvajanje glavne naloge (angl. main task execution) in stanje hujše komunikacijske napake.
V skeletni kodi (v datoteki app.h) najdemo zgolj stanje inicializacije, ostala pa moramo sprogramirati sami. Mi smo si pri tem pomagali z gotovim primerom za enostavno komunikacijo ene izmed razvojnih plošč za PIC32 preko USB (glej program 1). Mi smo manjkajoča stanja dodali v obstoječi programski podatkovni tip z naštevanjem, APP_STATES, ki je že v skeletni programski kodi. A poudarimo, da lahko v splošnem stanja aplikacije definiramo tudi z drugimi programskimi strukturami.
<Program 1>
typedef enum{
APP_STATE_INIT=0,
APP_STATE_WAIT_FOR_CONFIGURATION,
APP_STATE_MAIN_TASK,
APP_STATE_ERROR
} APP_STATES;
<konec programa 1>
Nato smo definirali tudi potrebne dodatne programske strukture za vmesno hrambo podatkov (glej program 2). Kot vidimo, mora aplikacija dejansko hraniti le najbolj osnovne podatke, kot so: ročica logične naprave USB (usbDevHandle), oddajni in sprejemni izravnalnik (receiveDataBuffer in transmitDataBuffer), hitrost prenos (usbSpeed) in še nekaj zastavic, glej program 1.
Harmonija razvoja in programiranja (2)
2016_SE244_38