Avtor: dr. Simon Vavpotič
2019_276_49
ARMove 32-bitne mikroarhitekture prinašajo v svet mikrokontrolerjev veliko zmogljivost in nešteto novih možnosti uporabe. Kaj so pametni mikrokontrolerji, kaj zmorejo in kako jih uporabljamo?
Nemalokrat se sprašujemo, zakaj lahko pametni telefoni, ki so pogosto manjši od prenekatere mikrokontrolerske preizkusne ploščice, poganjajo sodobne operacijske sisteme in izvajajo skoraj toliko procesov in aplikacij kot klasični namizni računalniki, povprečen 8-bitni ali 32-bitni mikrokontroler pa po zmogljivosti še vedno primerjamo s hišnimi računalniki s konca osemdesetih in začetka devetdesetih let preteklega stoletja. Odgovor na to vprašanje dajejo procesorska jedra ARM, katerih dizajn je mogoče licencirati in ga vgraditi v lastne dizajne procesorskih ali mikrokontrolerskih čipov, s katerimi se da na eni silicijevi rezini združiti vrhunsko periferijo in (sorazmerno) velike pomnilnike z zmogljivim procesorskim jedrom (ali jedri) tipa RISC, kakršna so uporabljena tudi v pametnih telefonih.
Ta vsebina je samo za naročnike
Tokrat se bomo lotili podrobnejšega raziskovanja ATSAMV71 Xplained Ultra razvojne plošče, ki na eni tiskanini združuje ne samo SAMV71 mikrokontroler, temveč veliko zunanjih perifernih enot, s katerimi lahko dobro preverimo svoje dizajne svoje vgrajene programske opreme. Natančno bomo analizirali napajalni del, krmilili bomo vhodno-izhodne priključke, povezali SAMV71 mikrokontroler s PC preko terminalskega okna in uporabili uro realnega časa.
Napajanje iz različnih virov ter regulacija napetosti in toka
V praksi pogosto potrebujemo varno napajanje mikrokontrolerskih naprav iz različnih virov, zato je prav, da zgradbo napajalnega dela ATSAMV71 Xplained Ultra še nekoliko podrobneje spoznamo. Razvojna plošča se lahko napaja iz štirih glavnih virov: napetostnega priključka za zunanji napajalnik, robnega vtiča, ali enega od USB priključkov. Pomožni vir napajanja je superkondenzator, ki lahko zagotavlja ohranjanje vsebine nekaterih pomnilnikov v času okoli ene in pol. Razvojna plošča se sicer napaja le iz enega vira naenkrat. Mikrokontroler, programator, pomnilniki in skoraj vsi ostali čipi, razen audio kodeka, se napajajo s 3,3 V. Zato padec napajalne napetosti na USB priključku pod 5 V ne vpliva na njeno delovanje, lahko pa vpliva na razširitvene module; poraba toka pa tudi na delovanje PCjevega USB krmilnika, če imamo na PC priključenih že veliko USB naprav. Ob težavah z USB krmilnikom v PC, je priporočljivo uporabiti zunanji napajalnik.
Čeprav so mikrokontroler in ostala vezja za regulatorjem dobro zaščiteni tudi pred prenapetostmi, ne smemo biti presenečeni, če bo ob priklopu previsoke vhodne napetosti regulator pregorel in razvojna ploščna bo prenehala delovati. Ker nesreča nikoli ne počiva, se mi je zgodilo prav to. Namesto 12 V napajalnika sem pomotoma priključil 19 V napajalnik za prenosnik. K sreči je bil uničen samo TPS62143. A kaj, ko zato ni delovalo niti napajanje preko USB. Ni mi preostalo drugega, kot da podrobno raziščem na napajalno-regulatorski del in poiščem alternativno rešitev…
Napajalna priključka za zunanji napajalnik sta zaščitena proti inverzni napetosti s FET tranzistorjem. Priključek za zunanje napajanje preko vtičnice ima tudi vhodni tranzistor IRLML5203PBF, ki dovaja tok v miniaturni napetostni regulator TPS62143, ki zagotavlja zadostno napajanje za razvojno ploščo iz zunanjega napajalnika z napetostjo med 5 V in 14 V (oziroma do 17 V, če ne uporabljamo MediaLB priključka). Za TPS62143 je nameščen napajalni multiplekser TPS2113PWR, pred njim pa sta še FET-a IRLML6402 in 2N7002215 z zmogljivostma do 20 A, ki omogočata priklop zunanjega napajanja mimo TPS2113PWR. Za nepreklop na napajanje iz enega izmed priključkov USB je bil kriv uničeni TPS62143, saj sta bila priključka FET-ov IRLML6402 (S – izvor, angl. source) in 2N7002215 (G – vrata, angl. gate) povezana z maso le preko upornosti 86 kOhm, kar pa je bilo premalo, da bi bila na vhodu ~EN TPS2113PWR logična 0 in bi začel delovati. Dodati je bilo treba še manjši upor. Priznam, da sem si zares oddahnil, ko je na razvojni plošči spet zasvetila zelene svetleča dioda, pod katero je na razvojni plošči bel napis »POWER«.
Omenimo še glavni napetostni regulator, LM26480, ki se napaja iz napajalnega multiplekserja in zagotavlja štiri napetosti: 3,3 V, 2,0 V, 1,8 V in 1,2 V. Medtem, ko 3,3 V izhod napaja večino čipov, je 1,8 V uporabljenih za regulacijo polnjenja super kondenzatorja in napajanje avdio kodeka, 1,2 V pa je namenjenih vmesniškemu čipu, KSZ8061RNBW, ki povezuje analogna vezja za podporo delovanju Ethernet povezave.
Včasih za napajanje razširitvenih modulov potrebujemo tudi 5V napetost. FET tranzistorja IRLML6402 in 2N7002215 napetost iz zunanjega napajalnika znižata na okoli 4,4 V, kar lahko predstavlja problem za delovanje nekaterih razširitvenih plošč, ki jih lahko nataknemo v vtičnice na zgornji strani ATSAMV71 Xplained Ultra. Zato sem se odločil napajanje predelati, tako da sem FETa premostil. Zadaj je na vseh razširitvenih vtičnicah dejansko na voljo 5 V, ko se razvojna plošča napaja iz zunanjega napajalnika. Res pa je, da se zdaj plošča ne more napajati iz USB priključkov.
Začetek dela v ASF razvojnem okolju
Čeprav smo osnove ASF razvojnega okvira, ki ima z vsako novo različico več funkcionalnosti in izboljšav, spoznali že v preteklem nadaljevanju, je prav, da pred začetkom resnejšega programiranja natančneje opišemo njegovo arhitekturo. ASF je zbirka programskih komponent, gonilnikov za periferno operemo, sredinske programske opreme in Microchipovih aplikacij. Deli se na tri dele HAL (abstraktni nivo strojne opreme, angl. Hardware Abstraction Layer), HPL (nivo strojnih posrednikov, angl. Hardware Proxy Layer) in HRI (vmesnik za strojne registre, angl. Hardware Register Interface). Mogočih je več izvedb gonilnikov: sinhroni, asinhroni, DMA in RTOS, poleg teh pa še več tipov gonilnikov: gonilniki zunanjih naprav (angl. peripheral drivers), uporabni gonilniki (angl. utility drivers) in gonilniki, ki so del sredinske programske opreme.
Programer naj bi praviloma uporabljal smo gonilnike najvišjega abstraktnega nivoja strojne opreme, ki je dokaj neodvisen od stojne osnove, saj lahko take programe sorazmerno enostavno prenašamo med različnimi strojnimi osnovami. Pri tem vsak nivo programske opreme opisuje značilna datotečna struktura, ki ni odvisna do strojne osnove, zaradi česar lahko veliko krmilnih problemov rešimo na zmogljivejših razvojnih osnovah in nato programsko kodo prenesemo v enostavnejše, s katerimi znižamo stroške razvoja produkcijskih naprav.
Atmel START
ADF sodeluje z spletnim portalom Atmel Start (http://start.atmel.com), ki se samodejno zažene, če v Atmel Studiu iz začetnega okna kliknemo opcijo New Atmel START Project using this board. Spletni programski generator omogoča izdelavo skeletne programske kode vgrajene programske opreme glede a grafično izbrane nastavitve, denimo vhodno-izhodnih priključkov. Osnova za izdelavo skeletne kode je grafični vmesnik, v katerem izberemo želene opcija, nakar generator sam vključi potrebne programske module in pripravi osnovne nastavitve. Ena izmed podprtih funkcionalnosti možnost izbire in nastavljanja osnovnih funkcionalnosti vhodno-izhodnih priključkov mikrokontrolerskega čipa.
Za delo v Atmel Start ne potrebujemo prijave, niti nameščenega Atmel Studia. Dovolj je že novejša različica spletnega brskalnika. Iz začetnega ekrana imamo na voljo ustvarjanje novega projekta, ali prenos že izdelanega primera. Čeprav je za ASF (če ga namestimo v celoti) priloženih veliko primerov, so s spleta na voljo tudi novejši. Pri tem lahko najustreznejšega poiščemo po oznaki in tipu mikrokontrolerja, ali pa kar po preizkusni ploščici. Pri tem imamo tudi možnost izbire lastne preizkusne ploščice. Vendar bo včasih potrebno pred uporabo primera s spleta namestiti popravke ASF.
Za resnejše projekte je smiselno izdelati nov projekt, česar se lotimo v več korakih, od katerih je obvezna samo izbira mikrokontrolerja ali standardne preizkusne plošče. Sledijo izbira in določitev funkcionalnosti zunanjih priključkov mikrokontrolerskega čipa, izbira generatorjev procesorskega takta in takta ure realnega časa ter nastavitev taktov ur različnih sistemskih vodil. Vse omenjeno urejamo v grafičnih urejevalnikih, ki sta dostopna preko zavihkov na levi strani spletne aplikacije Atmel Start. Ob kliku na zavihek za urejanje priključkov se prikaže slika izbranega mikrokontrolerskega čipa z enako razporejenimi priključki kot so na čipu, kjer lahko vsakemu priključku s pomočjo dialognega okna določimo njegovo funkcionalnost. V oknu za izbiro generatorjev takta in nastavitev ur sestavimo vso potrebno logiko iz navideznih modulov, ki jih medsebojno povežemo in jim določimo delovne nastavitve.
Zadnji korak je grob hierarhični opis zgradbe aplikacije, ki temelji na že omenjenem arhitekturnem ASF modelu. Najprej izberemo osnovni tip aplikacije, na to pa dodamo potrebne programske knjižnice iz ASF, ki jih tudi ustrezno uredimo glede na ASF arhitekturne nivoje. Denimo, podpora za datotečni sistem uporablja podatkovni pogon na SD kartici, za uporabo katerega, potrebujemo ustrezen gonilnik.
Čeprav lahko v vsakem koraku delo zaključimo, izvozimo izvorno kodo v stisnjeni datoteki *.atzip in jo namestimo v eno izmed razvojnih okolij: Atmel Studio, IAR Embedded Workbanch ali KEIL µVision4, je dobro v Atmel Start želeno konfiguracijo čim natančneje opisati in si tako prihraniti čas z ročnim urejanjem datotek z osnovnim nastavitvami in dodajanjem manjkajočih programskih modulov v razvojnem okolju. Povejmo še, da lahko vsebino projektne datoteke *.atzip, ki jo prenesemo s spleta, pregledujemo in ročno urejamo tudi v datotečnem sistemu, če jo prej preimenujemo v *.zip in razširimo na podatkovni pogon PCja.
Nov projekt v Atmel Studiu
V Atmel Studiu začnemo nov projekt iz menija File, v katerem izberemo opcijo New in nato Project. Tako imamo možnost začeti z: minimalno ASF skeletno kodo, prirejeno z izbrani mikrokontroler, Arduinovim sketchem, ali ASF kodo, prirejeno za določeno razvojno ploščo. Izkušeni programerji lahko izdelajo tudi novo programsko knjižnico. Programiramo lahko v programskih jezikih C in C++ in AVR zbirniku. Ustvarimo lahko tudi prazno rešitev, ki pride prav predvsem, ko ASF okvira ne želimo uporabiti.
Izdelava novega projekta brez Atmel Start za standardno razvojno ploščo, kot je ATSAMV71 Xplained Ultra, je sorazmerno enostavna, saj se nam ni potrebno ukvarjati z nastavitvami mikrokontrolerskih ur in izbiro generatorjev taktnih impulzov. Obenem so prednastavljene tudi osnovne funkcionalnosti priključkov mikrokontrolerskega čipa. Zato se lahko takoj lotimo sestavljanja programskih knjižnic, za katere v glavnem programu po potrebi pokličemo zagonske podprograme. Oblike njihovih klicev, ali morebitne zagonske podprograme lahko prekopiramo iz številnih primerov.
Kadar si želimo za izhodišče svoje vgrajene programske opreme uporabiti že izdelan primer programske kode in mu dodati še svoje funkcionalnosti (npr. pogon za masovno hrambo podatkov), lahko iz menija FileNew izberemo opcijo Example Project, ki prekopira različico programske kode primera za izbrano razvojno ploščo in izbrani mikrokontroler med naše projekte. Tako lahko programsko kodo primera po mili volji spreminjamo brez bojazni, da je kasneje ne bi več znali vrniti v izvorno stanje. V primeru težav, preprosto začnemo nov projekt na osnovi istega primera programske kode…
Dokumentacija
Programerska referenčna dokumentacija za zadnjo različico ASF je v celoti na voljo iz Microchipovih spletnih strani, na svoj računalnik pa lahko v obliki datotek *.PDF prenesemo zgolj starejše različice. Tudi, če Atmel studio v celoti namestimo iz datoteke, bomo za pomoč potrebovali dostop do Microchipovih spletnih strežnikov, podobno ko za uporabo storitev Atmel Start. Obenem so povezave na spletno dokumentacijo vgrajene tudi v programske knjižnice in programske module, ki jih lahko vgradimo v lastno aplikacijo.
Pri delu si lahko pomagamo tudi z zavihki ASF Explorer, VA View, VA Outline in Solution Explorer, v katerih so na voljo: pregled vgrajenih programskih knjižnic ASF, pregled vseh vključenih datotek in simbolov v programski kodi, pregled vseh funkcij, spremenljivk in ukazov prevajalniku za podprte programske jezike ter hierarhični pregled programske rešitve. Precej komentarjev je tudi na začetkih programskih datotek posameznih programskih knjižnic. Vse omenjeno pride še posebej prav, ko nimamo na voljo internetne povezave. Iz primerov aplikacij se lahko nemalokrat naučimo več, kot če bi zgolj brali referenčno programsko dokumentacijo s spleta. Vendar tudi brez slednja pri resnem projektu ne gre, saj moramo natančno poznati arhitekturo, funkcionalnosti in ureditev posameznih aplikacijskih programskih vmesnikov (APIs), da bi lahko izkoristili se njihove lastnosti.
Primeri programske kode
Branje stanja stikal ter prižiganje in ugašanje LED
ATSAMV71 Xplained Ultra ima veliko razširitvenih vtičnic in prav zato z lahkoto dodamo razširitvene plošče in ga povezujemo z drugimi vezji. Za začetek se lahko svoje znanje in poznavanje ASF preizkusimo s prižiganjem in ugašanjem dveh LEDic na preizkusni plošči.
Da bi docela preizkusil zapletenost programiranja v Atmel Studiu, sem se odločil začeti čisto od začetka, brez uporabe Atmel Start (FileNewProjectGCC ASF Board Project), saj pri znani razvojni plošči ni kaj dosti nastavljati, razen tistega, kar sam dodaš ali spremeniš. Poiskal sem svojo razvojno ploščo in od Atmel Studia zahteval izdelavo projekta, nakar sem projektu dodal želene knjižnice. Tako je v pregledu ASF Explorer nastal kar zajeten seznam, a kljub temu za prižiganje vgrajenih LED in uporabo vgrajenega mikrostikala v programski kodi ni bilo potrebno veliko narediti.
Poglejmo primer programske glavnega programa programske kode, s katerim prižgemo obe vgrajeni svetleči diodi in nato drugo svetlečo diodo (LED 1) upravljamo s z mikrostikalom, glej program 1.
Kot vidimo, se lahko skoraj v celoti zanesemo na ASF, saj nam ni potrebno vedeti imen priključkov. Slednja so že podana v definicijah v datotekah glav (*.h). V prvem koraku izvedemo zagonsko kodo za nastavitev sistemskih in nastavitve razvojne plošče, nakar za prižiganje prve LEDice uporabimo makro ukaz LED_On, drugo pa prižgemo z ukazom ioport_set_pin_level.
V glavni zanki preverjamo stanje prvega mikrostikala (switch 0), ki je logična 0, ko je stikalo pritisnjeno, sicer pa je logična 1. Ko je stikalo pritisnjeno, spremenimo stanje druga LEDice (LED1) in nato počakamo, da uporabnik spusti stikalo, s čemer preprečimo ponavljanje. Celoten primer programske kode je na voljo s spletnih stani Sveta Elektronike.
Po želji lahko na zunanje priključke dodamo tudi svoje LEDice, tako da jih vežemo v prevodni smeri med priključek mikrokontrolerja in maso preko 680-ohmskega upora. Pri tem moramo poskrbeti tudi za pravilne nastavitve izbranega priključka mikrokontrolerja. K sreči so priključki na testni plošči ATSAMV71 Xplained Ultra dobro označeni. Zato lahko s pomočjo električne sheme preizkusne plošče hitro ugotovimo, s katerimi priključki mikrokontrolerja so povezani. Če nov projekt začnemo v Atmel Start, lahko izbrani priključek nastavimo za prižiganje in ugašanje LEDice kar preko grafičnega vmesnika.
Terminalsko okno
V preteklem nadaljevanju smo omenili, da lahko za zunanji nadzor delovanja mikrokontrolerja in razhroščevanje programske kode uporabljamo tudi terminalsko komunikacijo preko standardne zaporedne povezave po protokolu RS232, ali drugem programsko združljivem protokolu. Za tovrstno komunikacijo je v ASF na voljo posebna programska knjižnica, Standard serial I/O (stdio) – SAM implementation, ki podpira standardne ukaze za izpis teksta in branje znakov s tipkovnice v programskih jezikih C in C++. Po njeni vgradnji v programsko kodo, moramo popraviti ustrezne nastavitve UART enote, ki jo bomo uporabili za zaporedno komunikacijo, pri čemer moramo podati parametre komunikacije, kot so: baudna hitrost (število bitov na sekundo), število bitov, število stop bitov itn. Nastaviti moramo tudi ustrezno sistemsko uro za pogon izbranega UART. Vse to storimo z ukazoma: sysclk_enable_peripheral_clock(CONSOLE_UART_ID) in stdio_serial_init(CONF_UART, &uart_serial_options). Če uporabljamo razvojno ploščo ATSAMV71 Xplained Ultra lahko že izdelan podprogram (configure_console) in konstante za terminalsko komunikacijo s 115.200 baudi in 8-bitni brez paritete in enim stop bitom, prenesemo iz enega od številnih primerov v ASF, denimo iz RTC_Example.
Uporaba serijske komunikacije je enostavna, saj podatke na terminal izpisujemo z ukazi, kot je printf, iz njega pa jih beremo, na primer, z ukazom scanf. Pri tem so podprte tudi standardne vrste spremenljivk. Denimo, vrednost celoštevilčne spremenljivke (integer) izpišemo takole: printf(”Vrednost = %d ”, spremenljivka). Podrobnosti najdete v primeru, ki je objavljen na spletnih straneh Sveta Elektronike.
Ura realnega časa
Razvojna plošča ATSAMV71 Xplained Ultra ima vgrajen standardni resonator s 32,768 kHz tekočim kristalom, ki služi kot takt v mikrokontroler vgrajene ure realnega časa. Za uporabo slednje moramo v svoj projekt vključiti programsko knjižnico ASF RTC in napisati programsko kodo, v kateri s funkcijama rtc_set_time in rtc_set_date nastavimo začetni čas in datum. Pri tem kot argumente podamo referenco ure realnega časa, RTC, in celoštevilčne vrednosti delov časa (ure, minute, sekunde) in datuma (leto, mesec, dan, dan v tednu).
Branje realnega časa je preprosto, vendar moramo v ukazih rtc_get_time in rtc_get_date podati naslove celoštevilčnih programskih spremenljivk in ne vrednosti spremenljivk, v katere želimo shraniti dele časa in datuma (denimo &h1 namesto h1, če je želimo v spremenljivko h1 prenesti trenutno uro). Pri izpisu časa in datuma si lahko nato pomagamo s funkcijo printf v C in C++ programskih jezikih. Je pa res, da za izpis potrebujemo tudi terminalsko okno, ali drug prikazovalnik. Vendar moramo za slednjega sami izdelati ustrezno podporo, če ni že podprt v okviru ASF. V že omenjenem primeru programske kode najdete primer terminalskega izpisa ure in datume, ki se v terminalsko okno izpišeta vsakokrat, ko pritisnemo prvo mikrostikalo na razvojni plošči. Ponovimo še to, da terminal vzpostavimo preko navideznih vrat COM preko funkcionalnosti Atmel Studia, veliko enostavneje pa kar z zastonjskim namenskim programčkom, kot je Tera Term, ki lahko posnema različne oblike terminalske komunikacije.
Ko gre vse narobe!
Redko se zgodi, da mikrokontroler na razvojni plošči ATSAMV71 Xplained Ultra nikakor noče naložiti nove programske kode in vgrajeni programator vrne napako; denimo da ne more zagnati programa za reprogramiranje. Iz zagate se lahko rešimo z mostičkom, ki je poleg mikrokontrolerja, nad katerim je napis »ERASE«. Dovolj je, da ga pri vklopljenem napajanju kratko sklenemo za nekaj sekund in vsi programi v mikrokontrolerju bodo izbrisani. Programator zdaj ne bo imel več težav pri ponovnem programiranju, razen v primeru fizičnih poškodb tiskanega vezja ali mikrokontrolerja.
Pravkar opisani postopek sem nehote preizkusil pri izgradnji tokratnega primera ugnezdene programske kode, ko se je mikrokontroler nesrečno »zaklenil«, saj nisem pravilno izvedel vseh programskih nastavitev za terminalsko komunikacijo. Pri tem ni pomagal niti odklop in ponovni priklop napajanja. Mikrokontroler je dovolil reprogramiranje šele, ko sem izbrisal vsebino vseh vgrajenih EEPROMov.
Zagon raziskovalca knjižnice ASF
Čeprav lahko v PC zaženemo poljubno število kopij Atmel Studia, ni rečeno, da bomo lahko zagnali tudi poljubno število raziskovalcev ASF. ASF deluje le v kopiji Atmel Studia, ki je bila zagnana prva, v vseh ostalih lahko le prevajamo programsko kodo, pri poskusu uporabe funkcionalnosti ASF pa dobimo obvestilo o napaki. Zato je morda bolje, da naenkrat uporabljamo le eno kopijo Atmel Studia. Če se vseeno kaj zatakne, je priporočljivo Atmel Studio zapreti in ga po nekaj sekundah ponovno odpreti. Za hitrejše delovanje je dobro imeti stalno vzpostavljeno povezavo z Internetom, saj Atmel Studio z ASF pogosto poskuša iz spleta prenesti dodatne vsebine. Če tega ne more ASF ob zagonu počaka, da se izteče časovna zakasnitev, po kateri ugotovi, da Microchipovi spletni strežniki niso na voljo.
Prihodnjič
Razvojna plošča ATSAMV71 Xplained Ultra in programska knjižnica ASF programerju omogočata lahek dostop do funkcionalnosti mikrokontrolerja in vgrajene periferije. Tokrat nam je zmanjkalo prostora za opis projekta izdelava pogona za masovno hrambo podatkov. Zato se bomo temu problemu posvetili prihodnjič. Prednost ATSAMV71 Xplained Ultra je enostavnost uporabe terminalske povezave, s katero lahko na enostaven način spremljamo delovanje ključnih funkcionalnosti vgrajenih aplikacij. Zato nam, na primer pri pogonu za masovno hrambo podatkov, ki deluje preko priključka USB, ni potrebno ugibati vzroka morebitnih težav pri vzpostavljanju in uporabi aplikacijske povezave USB. Vse lahko spremljamo preko zaporedne povezave, ki jo preko svojega priključka USB prenaša vgrajeni programator na navidezna vrata COM osebnega računalnika.
Vavpotic_ARM