2014-01-30

Arduino IDE - Atmega32, bootloader ir branduolio modifikavimas

Elektronikos mėgėjai ir kiti susidūrę su Arduino žino, jog tai lanksti prototipavimo
platforma. Pradedantiesiems su mikrovaldikliais - galbūt pirmoji pažintis. Begalės prirašytų bibliotekų įvairiems jutikliams ir projektams labai patrauklios naudojimui. Viskas su ja gerai, kol dirbama su ATmega168 ar ATmega328 ar panašiais mikrovaldikliais. Problema iškyla jeigu norime, kad Arduino dirbtų su nestandartiniais (ne Arduino) modeliais, pavyzdžiui - Atmega32. Išvadų skaičius, išvadų funkcijos pradeda skirtis. Laimei Arduino IDE yra lankstus įrankis ir apie tai kūrėjai tikrai pagalvojo. Reikia tik teisingai susikonfigūruoti šį įrankį ir jį prisitaikyti savo reikmėms. Šiame straipsnyje butent ir pakalbėsime apie Arduino pritaikymą dirbti su Atmega32 bei analogiškai kitais Atmel mikrovaldikliais.


I. Arduino bootloader atsisakymas

Kaip žinia mikrovaldikliai yra tokie prietaisai, kuriuos dažnai programuoja per SPI sąsają (MOSI/MISO/SCK/RST), kaip čia. Kad Arduino leidžia tai daryti per USB yra tik gudrus triukas, kurį taip pat naudoja USBasp ir kitos platformos. Esmė - specialus taip vadinamas "bootloader" kodas, kuris programiškai emuliuoja USB veikimą (t.y. lėčiau ir ne techniniame lygyje). Šis kodas yra įterpiamas į Arduino FLASH atminties pradžią bei užsikrauna vos tik paleidžiamas mikrovaldiklis su Arduino programine įranga. Jam pasileidus ir atlikus darbą toliau vykdomas mūsų kodas, kurį parašėme per Arduino IDE įrankį. Tokios emuliacijos dėka, užimama dalis FLASH atminties, kuri gali būti ypač reikalinga mūsų kodui - negerai. Kitas iš to sekantis reikalavimas - jog mikrovaldiklis būtų "varomas" ne mažesnio nei 12 MHz dažnio kvarcinio rezonatoriaus, kitaip USB emuliacijai "pritrūks" greičio. Ši dalis pasidaro probleminė, jeigu norime naudoti mažesnio dažnio kvarcinį rezonatorių ir pan.

Išsiplėtojus projektui ar ruošiant ne prototipinį variantą 1-2KB FLASH atminties užimanti Arduino bootloader dalis tiesiog dažnai nebenaudojama. Mums galbūt rūpi tiesiog pasinaudoti konkrečiomis Arduino bibliotekomis, o visą nereikalingą (bootloader) kodą išmesti taip sutaupant ir FLASH atminties. Ši funkcija numatyta ir Arduino IDE (File->Upload using Programmer), leidžianti tiesiog įrašyti sukompiliuotą kodą praleidžiant bootloader dalį.


Kad ši funkciją veiktų kaip priklauso, kaip ir minėjau, mikrovaldiklis turi būti pajungtas programavimui per SPI sąsają prie kompiuterio, pavyzdžiui per USBasp.

II. Naujo plokštės varianto sukūrimas

Sekanti mums naudinga funkcija yra Arduino plokštės/versijos pasirinkimas. Tai atliekama per Tools->Board meniu punktą. Savo plokštės variantą galime nesunkiai įdėti į šį sąrašą ir naudoti Arduino IDE naujo Atmega mikrovaldiklio programavimui.


Tai daroma redaguojant "Arduino\hardware\arduino" direktorije esantį boards.txt failą. Jame rasite visus suregistruotus Arduino variantus su savo parametrais. Analogiškai failo gale galime aprašyti ir savo variantą, pavyzdžiui:



Pavadinimas - savaime aišku, protokolas - priklausomai nuo turimo programatoriaus, šiuo atveju naudoju USBasp, tai pasirenkamas "usbasp" (standartinis Arduino protokolas "arduino" veikia per USB bootloader - jis užkomentuotas). Toliau maximum_size - būtina nurodyti kiek baitų FLASH atminties turi mikrovaldiklis, upload_speed - viena iš USART palaikomų reikšmių 9600, 19200 ar pan. 

Šiek tiek sudėtingesni parametrai - bootloader low/high fuse baitai, šias reikšmes reikėtų suderinti taip, kad mikrovaldiklis veiktų nuo išorinio kvarcinio rezonatoriaus, nebent pageidaujama kitaip. Įrankis kaip Burn-O-Matic leidžia susikonfigūruoti šias reikšmes. Tačiau geriausia tai daryti pagal oficialų mikrovaldiklio datasheet dokumentą/specifikaciją. Šiuo atveju Atmega32 mikrovaldiklis kaip tik suderintas dirbti su išoriniu 20MHz kvarciniu generatoriumi. Toliau path - direktorija iki sukompiliuoto bootloader mūsų mikrovaldikliui ir pats sukompiliuotas .hex failas. Lock/unlock bitus galima praleisti. Jeigu nenaudojame bootloader dalies, tai galima visą šią sekciją tiesiog praleisti.

Parametrą kaip mcu - mikrovaldiklio pavadinimas, svarbu parinkti teisingą pagal AVR GCC palaikomą ID (dažniausiai tiesiog tinka pavadinimas), f_cpu - kvarcinio rezonatoriaus dažnis hercais, core - kokį Arduino branduolio kodą naudoti kompiliuojant (tiesiog paliekame "arduino"), variant - unikalus plokštės pavadinimas tarp visų jau registruotų plokščių, t.y. pagal šį pavadinimą bus imamas skirtingas išvadų (pins_arduino.h) failas, būtina nurodyti ne "standard", jeigu išvadų skaičius ar funkcijos nesutampa su Arduino Atmega168 standartinėmis.

Paleidus dar kartą Arduino IDE, sąraše Tools->Boards turėtume matyti naują plokštės variantą. Tačiau čia dar ne viskas.

Toliau, jeigu nurodėme, kad išvadų skaičius/funkcijos neatitinka Arduino standartinėms (variant reikšmė - ne "standard"), būtina sukurti išvadų funkcijas aprašantį pins_arduino.h failą. Geriausia tiesiog nusikopijuoti Arduino direktorijos pavyzdį "Arduino\hardware\arduino\variants\standard", pervadinti ir atsidarius jį redaguoti. Mūsų Atmega32 atveju šis failas būtų direktorijoje: "Arduino\hardware\arduino\variants\atmega32", nes "variant" pavadinimas pas mus nurodytas kaip "atmega32".


Sunkioji dalis - aprašyti visus išvadus ir funkcijas teisingai - kur PWM išvadas, kur TIMER išvadas ir pan. Tam geriausia pasiimti visų išvadų vaizdą ir susižymėti eilės tvarka numeriukais kiekvieną išvadą, lyginti išvadų funkcijas. Programiškai nepanaudojamų išvadų kaip VCC, GND, XTAL ir pan. nereikėtų indeksuoti, o būtina praleisti. Kai kurios funkcijos gali būti perkeltos ant kito išvado ar pan. - tai reiktų pastebėti. Dažnai tiesiog rasime ir nesuderinamumų, tokiu atveju kažkoks funkcionalumas gali neveikti naudojant Arduino bibliotekas - tada teks rašyti tą dalį kodo mikrovaldikliui patiems per IDE. Kaip ten bebūtų Atmega32 yra tikrai gana gerai suderinama su Arduino ir tik labai maža dalis funkcijų lieka nepadengtos. 

Taigi PORTx išvadus sužymėti nesudėtinga pagal analogiją. Nurodome MOSI/MISO/SS/SCK išvadų numerius, SDA/SCL, Ax išvadų numerius ir t.t. 
Būtina užpildyti ir port_to_mode_PGM, port_to_output_PGM, port_to_input_PGM, digital_pin_to_port_PGM, digital_pin_to_bit_mask_PGM bei digital_pin_to_timer_PGM masyvus - jų prasmę turėtumėte suprasti pagal jau esamas įrašytas reikšmes pavyzdyje.

Taigi, jeigu viską atlikome teisingai, galima pabandyti parašyti demonstracinę programą ir įsitikinti ar Arduino IDE dirba su mikrovaldikliu. Nepamiršti, jog dabar kompiliavimas ir dvejetainio kodo įrašymas į mikrovaldiklį bus atliekamas tik per File->Upload using Programmer meniu punktą.

III. Bootloader ir branduolio modifikavimas

Na ir saldainiukas pabaigai. Naujausias Arduino bootloader kaip ir branduolio kodas prieinamas čia. Ankstesniame skyriuje aprašydami plokštę sutikome ir "bootloader" sekciją, kurią tuo metu tiesiog praleidome. Ši sekcija nurodo, kokį bootloader naudoti. Arduino standartinis bootloader kodas ir sukompiliuotas .hex failas yra direktorijoje: "Arduino\hardware\arduino\bootloaders\standard". Nusikopijavę ją bei pervadinę (pvz. "Arduino\hardware\arduino\bootloaders\custom") galime paanalizuoti Arduino programavimo protokolą, pasimodifikuoti kodą kaip mums patinka ir net persikompiliuoti pačią bootloader dalį, nes taip pat pateikiamas ir Makefile failas. Jeigu turite įsirašę WinAVR kompiliavimo įrankius, tai kompiliavimas atliekamas taip:

C:\WinAVR-20100110\utils\bin\make -f Makefile

Norint panaudoti naujajį bootloader mikrovadiklyje reikia  "bootloader.path" atitinkamai pakeisti į "custom", o kompiliuojant ir įrašynėjant kodą naudoti paprastą "File->Upload".

Toliau, taip pat mūsų valia daryti ir Arduino branduolio "core" modifikacijas, kodas yra "Arduino\hardware\arduino\cores\arduino" direktorijoje. Nusikopijavę šią direktoriją ir pervadinę kitur vardu, (pvz: "Arduino\hardware\arduino\cores\mycore"), galime keisti ar papildyti funkcionalumą, o paskui modifikuotą branduolį naudoti su savo mikrovaldiklio variantu nustatę "build.core" parametrą į "mycore" reikšmę atitinkamai.

Galimybės tikrai neribotos, Arduino IDE puikiai plečiama, nes apie tai buvo pagalvota, tuo pačiu principu naudojasi ir Arduino kūrėjai - vis papildydami Arduino šeimą naujomis galimybėmis įnešant minimalius pakeitimus. Taigi tiek teorijos ir praktikos šiam kartui, sėkmės eksperimentuojant!



Download Arduino Atmega32 files and pin map here.


Komentarų nėra:

Rašyti komentarą