Atmel AVR ATtiny porodica mikrokontrolera Mikrokontroleri firme Atmel (pre nekoliko godina kupljena od strane kompanije Microchip) rado su viđen gost kod mnogih ljubitelja elektronike. Razloga za to je mnogo: jednostavnost upotrebe, mnoštvo literature, razvijena zajednica korisnika, povoljna cena i još mnogo toga. Naravno, za svoju popularnost dobrim delom mogu da zahvale i pojavi platforme Arduino, koja je upravo njihove mikrokontrolere izabrala za svoju okosnicu. Atmel je tokom vremena ponudio širok spektar modela za mnoštvo scenarija, tako da korisnici mogu birati one čipove koji su najbolji za obavljanje namenjenog posla, a istovremeno neće opterećivati cenu mogućnostima koje izlaze izvan okvira projekta. Tako je pre nekih petnaestak godina svetlost dana ugledala porodica mikrokontrolera pod nazivom ATtiny, koja se odlikuje manjim kapacitetom RAM i skladišne memorije, smanjenim brojem interfejsa, kao i relativno malim (6 do 32) brojem izvoda. Za nešto ozbiljnije zadatke, Atmel u ponudi ima mikrokontrolere iz porodica ATmega i ATxmega. Kompanija je svojevremeno probala sa lansiranjem 32-bitne RISC arhitekture pod nazivom AVR32, koja je nešto kasnije povučena i njeno mesto zauzima perspektivnija ARM arhitektura. U ovom tekstu posebnu pažnju posvećujemo ATtiny modelima koji dolaze u DIP kućištima, koja su pogodna za korišćenje sa prototipskim pločicama i zahvalna su za ugradnju u manje hobističke projekte sa mikrokontrolerima.
ATtiny13a Mislite da je jedan kilobajt mala količina memorije sa kojom se praktično ništa smisleno ne može uraditi? Nije baš tako! Na internetu se može naći mnoštvo zanimljivih demo-programa pisanih sa namerom da budu što kraći, a da pritom impresioniraju posmatrača. Nekada je u tih 1024 bajta moguće smestiti prava mala remek-dela programiranja. Jedan od takvih primera iz istorije računarstva je šahovska igra ZX Chess 1K za Sinclair ZX81, koja je zauzimala neverovatnih 672 bajta memorije! Naravno, nije to bio nekakav šahovski velemajstor sa atraktivnom grafikom, ali mu se mnogo puta dešavalo da matira zajapurene pacere. Znači, ukoliko je nekome pošlo za rukom da u jedan kilobajt memorije ugradi ozbiljnu veštačku inteligenciju za jednu od najkompleksnijih logičkih igara, onda je definitivno moguće napisati program koji će voditi računa o kontroli nekog jednostavnog procesa. Atmel u ponudi ima model ATtiny13a, koji nam sa skladištem od jedan kilobajt daje mogućnost da realizujemo manje zahtevne projekte. Istine radi, u njihovoj ponudi postoje još „tanji” modeli ATtiny4 i ATtiny5, koji u svojim minijaturnim šestopinskim SOT kućištima dolaze sa samo 512 bajtova fleš memorije. Za sve one koji misle da je ovo apsurdno mali program, treba naglasiti da još uvek postoje mikrokontroleri sa još manjom količinom memorije, a koji mogu da izvršavaju mnoštvo zadataka. Osim pomenutog fleš skladišta od jednog kilobajta, ATTiny13a dolazi sa 64 bajta SRAM-a, što je takođe ozbiljan problem, ali sa kvalitetnim dizajnom programa to može biti sasvim dovoljno za čuvanje sadržaja manjeg broja promenljivih. Ni to nije kraj ograničenjima, pa tako ovaj model nema nijedan standardni hardverski interfejs za komunikaciju sa drugim uređajima. Pozitivno je to da relativno lako i sa malom potrošnjom resursa možemo softverski implementirati SPI, UART ili I2C interfejse tehnikom koja se naziva bitbanging. Od retkih podržanih stvari, možemo pomenuti prisustvo četiri ADC ulaza, jedan 8-bitni brojač i PWM pseudo DAC sa jednim tajmerom i dva generatora signala.Procesor izvršava 120 instrukcija AVR asemblera, što je malo manje od onoga što ima čip Atmega328P iz Arduina Uno. Brzina takta zavisi od radnog napona, tako da na 1,8 volti imamo maksimalni klok od četiri megaherca, na 2,7 volti deset megaherca i na 4,5 volti celih dvadeset megaherca. S obzirom na to da AVR arhitektura izvršava jednu instrukciju po taktu, reč je o sasvim pristojnoj zalihi procesorske snage. U slučaju da je ekonomija struje važnija od brzine, pri radu sa naponom od 1,8 volti i taktom od jednog megaherca postižemo potrošnju od 190 mikroampera, dok je u stanju mirovanja ta vrednost samo 24 mikroampera. Postoji nekoliko minijaturnih biblioteka za programiranje ATtiny mikrokontrolera u Arduino stilu, a praktično sve su izvedene iz bazne biblioteke pod nazivom Core13. Trenutno najbolja od njih nosi naziv MicroCore (github.com/MCUdude/MicroCore) i sadrži četrdesetak funkcija kompatibilnih sa izvornom bibliotekom Arduino. Da bismo omogućili rad sa ovom platformom u Arduino IDE, prvo je potrebno da u polju za dodavanje hardvera (meni File: Preferences) upišemo sledeću liniju: https://mcudude.github.io/ MicroCore/ package_MCUdude_MicroCore_index.json Posle toga idemo u meni Tools: Board: Boards Manager i instaliramo stavku pod nazivom MicroCore. Ako smo sve uradili ispravno, u spisku podržanih platformi bi trebalo da se pojavi stavka Attiny13. Za početak ostavljamo sve opcije iz menija Tools na default vrednostima. Sledeći deo posla odnosi se na povezivanje sa Arduinom koji ćemo koristiti u svojstvu programatora. Iako nema hardverski SPI, Attiny13 ima ugrađenu logiku za ISP (In-System Programming) od strane nekog drugog uređaja. Potrebno je povezati kontakte onako kako je to predstavljeno u ovoj tabeli, posle čega iz menija File: Examples: 11.ArduinoISP pokrećemo skeč pod nazivom ArduinoISP. Funkcija ovog skeča je da omogući programiranje ATtiny uređaja. Iako se kod rada sa mikrokontrolerima često može čuti reč Bootloader, koja označava kratki kod koji omogućava flešovanje uređaja, treba istaći da ATtiny13a ne koristi nikakav sličan program, jedino se menja sadržaj nekoliko registara na mikrokontroleru, što ga priprema za proceduru prebacivanja koda. Nakon toga, prenosimo skeč na isti način kao što to radimo sa Arduino skečevima. Kompajlirani primer Blink zauzima 210 bajtova skladišta (četiri puta manje od modela Uno) i samo četiri bajta RAM. U radu sa bibliotekom MicroCore od koristi će nam biti raspored signala na pinovima mikrokontrolera koji vidimo na višebojnim ilustracijama. Zelenom bojom su označeni nazivi portova, oranž su linije interrapta, crveni su analogni ulazi, pink su linije SPI interfejsa, dok su smeđom bojom označeni pinovi vezani za tajmer i generisanje PWM.Sve u svemu, ATtiny13 je veoma zanimljiva platforma za one koji prihvataju programerske izazove, pošto zahteva dosta dovitljivosti i odgovoran rad sa ograničenim resursima. Cena ovih čipova u PDIP kućištima se kreće nešto ispod jednog dolara za pojedinačne narudžbine i oko 60 centi za količine od 10 komada, dok cena kod TSSOP varijanti u količinama od deset komada pada ispod trideset američkih centi. Snažnija braća Od ostalih modela potencijalno zanimljivih širem krugu čitalaca, izdvojili smo one koji pripadaju dvema sličnim porodicama. Prva se odnosi na čipove u PDIP-8 (SOIC-8, TSSOP-8) kućištu i njeni članovi su ATtiny25, ATtiny45 i ATtiny85. Druga porodica ima kućišta sa nešto više pinova (PDIP-14, SOIC-14, TSSOP-14), što znači da imaju i veći broj signala, ali su im radne karakteristike vrlo slične sa prethodno pomenutom porodicom.
Modeli ATtiny24a i ATtiny25 imaju po dva kilobajta fleš memorije, 128 bajta SRAM i 128 bajta EEPROM (dakle, dvostruko više od ATtiny13a), ATtiny44a i ATtiny45 nastavljaju trend i donose po četiri kilobajta fleš skladišta, 256 bajta SRAM i 256 bajta EEPROM, dok najjači modeli pomenutih porodica (ATtiny84a i ATtiny85) imaju po osam kilobajta fleša, i po 512 bajtova za SRAM i EEPROM. Oznaka „a” u nazivu pojedinih modela govori nam da su ti mikrokontroleri rađeni u PicoPower tehnologiji koja značajno smanjuje potrošnju struje. To opet znači da će modeli Attiny25, 45 i 85 trošiti 20-30% više struje tokom rada i 60% tokom mirovanja. Nije poznato zašto je proizvođač ponudio tu tehnologiju za model Attiny13A, a isto nije učinio sa njegovom snažnijom 8-pinskom braćom.
Sve u svemu, osim nabrojanih, kod modela sa osam pinova nema velikih razlika u odnosu na ATtiny13. Možemo izdvojiti uvođenje dodatnog 8-bitnog brojača, PWM je dobio još jedan tajmer, a tu je i hardverska podrška za USI (Universal Serial Interface), koji može poslužiti kao baza za dodavanje I2C ili SPI interfejsa. Za razliku od navedenih modela, modeli sa većim brojem pinova imaju po jedan 8-bitni i 16-bitni brojač i dvostruko više (osam) ADC ulaza. Kao što možemo videti na ilustraciji, kod modela 25/45/85 primetne su određene razlike. Umesto linije CLKI (eksterni signal radnog takta) kod modela ATtiny13a, ovde na pinovima 2 i 3 (XTAL1, XTAL2) imamo predviđeno mesto za priključenje standardnog (i dosta jeftinijeg) eksternog kristala za generisanje sistemskog takta. Integrisani oscilator nam omogućava da radimo sa taktovima do 16 megaherca, a ukoliko želimo postići maksimalnih 20 megaherca, potrebno je koristiti eksterni generator takta. Pinovi AIN0 i AIN1 predstavljaju ulaze analognog komparatora, dok AREF predstavlja referentni ulazni napon za A/D konverziju. Princip funkcionisanja AREF signala je jednostavan, a radi se o naponu koji određuje stepen preciznosti A/D konverzije, odnosno, maksimalne vrednosti koju na njemu merimo i delimo na 1024 dela. U slučaju da na ovom pinu imamo napon od pet volti, svaki od 1024 koraka A/D konvertera će imati veličinu od 0.00488 volti. Ukoliko je u pitanju 3,3 volta, tada će svaki A/D korak predstavljati napon od 0.00322 volta. Interno postoji podrška za rad sa referencom od 1,1 volta i 2,56 volti.Dosta toga što smo naveli za model ATtiny13a važi i ovde, tako da nam je za rad potrebna biblioteka koja podržava ovu vrstu čipova. Za osnovnu biblioteku smo izabrali ATtinyCore o kojoj se može pronaći na lokaciji goo.gl/CxWXQC. Prvi korak se sastoji u dodavanju linka koji će omogućiti preuzimanje fajlova za Boards Manager:http://drazzy.com/package_drazzy.com_index.json Nakon ovoga prelazimo u pomenuti Boards Manager, u njemu tražimo stavku koja sadrži tekst ATtinyCore i instaliramo je. I ovde za početak ne diramo izvorna podešavanja opcija iz menija Tools, kojih je nešto više nego u slučaju ATtiny13a. Slično kao u prethodnom primeru, zapisujemo skeč ArduinoISP na Arduino Uno i posle toga prenosimo kod na drugi mikrokontroler. Za razliku od prethodno pominjane biblioteke MicroCore, veličina kompajliranog koda probnog skeča Blink samo neznatno zaostaje za onim kod modela Arduino Uno (898 prema 926 bajtova). Što se tiče povezivanja, ono je identično onome koje smo imali kod ATTiny13a.
Cene ovih čipova su šarolike. DIP ATtiny25 u trenutku pisanja košta 1,7 dolara, dok SOP varijante koštaju 11 dolara za deset komada. DIP varijanta ATtiny45 košta po jedan dolar za deset komada, a u SOP varijanti 1,4 dolara. DIP Attiny85 košta 1,7 dolara pojedinačno i 15 dolara kada se kupuje 10 komada, dok SOP varijante ovog čipa koštaju jedan dolar. ATtiny24a, kako u DIP tako i u SOP varijanti, košta 80 centi na deset komada. ATtiny44a u DIP varijanti je 80, a u SOP 67 centi po komadu. I na kraju cena ATtiny84a za DIP varijantu je 1,2 dolara, dok njegov SOP brat košta 93 centa.
Razvojni moduli S obzirom na krajnju jednostavnost konstruisanja razvojnog modula zasnovanog na ATtiny mikrokontrolerima, ne iznenađuje činjenica da se neko dosetio da na njihovoj osnovi sazda minijaturnu „a’la Arduino” platformu. Najpoznatiji predstavnik ove klase uređaja je Digispark Attiny85, koji je svoju karijeru započeo kao startap projekat. Reč je o minijaturnoj pločici koja na sebi ima USB priključak bez metalnog oklopa. Iako ovakav tip priključka na datom modulu estetski izgleda privlačno, on u praksi ponekad zadaje glavobolje zbog lošeg kontakta sa USB konektorima. Tokom eksploatacije javlja se i problem sa žicama za povezivanje sa breadboardom i senzorima, pošto nije praktično da se uređaj ovog tipa nalazi tik uz računar. Zato ćemo sa njim često koristiti produžni USB kabl.
Na modulu se osim USB nalaze dve grupe konektora. Prva grupa sadrži šest signala (P0-P5) za pinove sa GPIO funkcijama, dok je druga grupa sa tri pina namenjena priključivanju napona. Modul je moguće napajati direktno preko USB porta, dovođenjem pet volti napona na istoimeni pin ili neregulisanog napona u opsegu od sedam do 20 volti na pin VIN.
Originalni Digispark moduli dolaze u dve varijante. Prva serija na sebi ima natpise rev2 i rev4, ali postoje i modeli bez ovih oznaka. Modeli sa oznakom rev3 izgledaju identično, ali su u pitanju piratske kopije koje se ne razlikuju od originala. Glavna karakteristika modela prve varijante jeste da imaju svetleću diodu priključenu na pin P1. Modeli koji pripadaju drugoj seriji redovno dolaze bez oznaka revizije, a svetleća dioda je priključena na pin P0. Funkcionalni nedostatak druge varijante je nemogućnos korišćenja I2C interfejsa zbog deljenja pina sa LE diodom. Ukoliko nam je I2C interfejs neophodan, onda moramo fizički preseći vođicu koja ide do LED, posle čega će ona prestati da funkcioniše sve dok lemljenjem ne povežemo prekinuti kontakt.
Veća je verovatnoća da ćemo koristiti klonirane varijante Digispark modula, koje su znatno jeftinije (originalni Digispark košta oko sedam dolara). Mi smo izdvojili nekoliko najpopularnijih modela čija se cena kreće od jednog do jednog i po dolara. Zbog pomenutih problema sa povezivanjem, mudro je nabaviti modele koji na sebi imaju mikro USB konektor. Kod svih modela je tokom rada potreban oprez, pošto Digispark moduli nemaju prenaponsku zaštitu niti zaštitu od zamene polariteta, tako da usled greške u povezivanju žica može doći do uništenja modula, a potencijalno i oštećenja samog računara.
Iako su vizuelno prilično različiti, moduli sa natpisom (AT)TINY85 dele mnogo zajedničkog sa svojim Digispark uzorom. LE dioda za indikaciju napajanja se nalazi ispod mikro USB konektora, dok je signalna (obe su oranž boje) smeštena između regulatora napona i mikrokontrolera. Za rad sa njima je, kao u prethodnim slučajevima, potrebno da prvo dodamo link http://digistump.com/package_digistump_index.json koji će omogućiti pojavljivanje stavke Digistump AVR Boards unutar menadžera platformi za Arduino IDE. U meniju Tools: Board biramo Default varijantu sa radnim taktom od 16,5 megaherca, dok nas svi ostali parametri ne zanimaju.
Ovi moduli dolaze sa ATtiny85 čipovima koji na sebi unapred imaju upisan bootloader (zove se micronucleus) za komunikaciju putem virtuelnog USB porta čiji se D+ i D- signali privremeno formiraju na pinovima 3 i 4. Korišćenje ovog porta je veoma različito u odnosu na rad sa svim modulima do sada. Umesto da prvo priključimo modul i nakon toga u Arduino IDE kliknemo na ekranski taster za kompajliranje i prebacivanje programa na mikrokontroler, ovde je potrebno kliknuti na taster Upload i, nakon što se u prozoru sa informacijama pojavi poruka da priključimo modul, to i učinimo. Potrebno je da računar za nekoliko sekundi prepozna uređaj i ako mu to iz nekog razloga ne pođe za rukom, dolazi do greške. Nepoznavanje ovih finesa je izvor frustracija brojnih novopečenih korisnika Digispark platforme. Da bi prebacivanje uopšte bilo moguće, prethodno je potrebno instalirati drajver pod nazivom Digispark Bootloader sa adrese goo.gl/pVwzMj. Pošto se radi o nestandardnoj tehnici emulacije USB porta, moguće je da na pojedinim računarima bude dosta problema sa priključivanjem. Primer: Blink kompajliran pomoću prateće biblioteke ima dužinu od 718 bajtova, što je osetno manje od onoga viđenog kod biblioteke MicroCore. Inače, Digispark platforma omogućava nešto malo više od šest kilobajta za programski kod, što je sasvim dovoljno i za neke složenije projekte. Sledeći bezimeni modul bismo mogli nazvati varijacijom na Digispark temu i karakterističan je po postojanju DIP gnezda za mikrokontroler, kao i po prisustvu dva reda od po četiri pina na mestu gde se kod drugih modela nalazi šest pinova. Kada se kupuju bez pratećeg mikrokontrolera, cena im je tek nekih sedamdesetak američkih centi. Dodatna dva pina ne predstavljaju nikakve nove signale, već se radi o dupliranju izvoda za napajanje i uzemljenje. Ovo je učinjeno kako bi se pojednostavilo povezivanje sa pinovima ICSP interfejsa na Arduinu. Ukoliko modul gledamo sa gornje strane i to tako da su tri naponska pina bliže posmatraču, onda je gornji levi pin ekvivalent pina P1 kod modula Digispark. Dakle, pin P1 povezujemo sa MISO, 5V sa VCC, P2 sa SCK, P0 sa MOSI i tako dalje. Ukoliko nameravamo da module ovog tipa programiramo preko USB, neophodno je da mikrokontroler ima unapred upisani bootloader. Zato je prilikom kupovine modula potrebno tražiti prodavce koji nude takvu uslugu. Ukoliko dobijemo prazan čip, potrebno je na njega preneti bootloader, a za to se koristi program AVRdude koji je sastavni deo Arduino IDE, ali se nalazi skriven duboko u njegovoj unutrašnjosti. U pitanju je procedura koja deluje kompleksno i zahteva korišćenje komandne linije. Tako, recimo, ukoliko je naš Arduino IDE instaliran u folderu C:\Arduino, potrebno je pozvati avrdude sa ovakvim parametrima: C:\Arduino\hardware\tools\avr\bin\avrdude -C C:\Arduino\hardware\tools\avr\etc\avrdude.conf -v -pattiny85 -cstk500v1 -P COM4 -b19200 -Uflash:w:C:\t85_default.hex:i -U lfuse:w:0xe1:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m? Na sreću svih onih koji se plaše komandne linije, postoji nekoliko front-end GUI aplikacija za program AVRDude, a jedna od najboljih je ona pod nazivom Avrdudess (goo.gl/qGTbeu). Omogućava jednostavno zadavanje svih potrebnih parametara, uključujući i takozvane fjuz (fuse) bitove čije objašnjenje izlazi iz okvira ovog teksta.Inače, standardni fajl sa bootloaderom (t85_default.hex) se preuzima sa lokacije goo.gl/PtUDif. Na istom mestu se nalazi i bootloader pod nazivom t85_aggressive.hex koji je za 702 bajta kraći od originala. Ovde je potrebno skrenuti pažnju da, ukoliko instaliramo standardni micronucleus bootloader, on zbog korišćenja pina P5 za analogni ulaz sprečava funkcionisanje signala RESET, tako da posle nećemo biti u stanju da čip programiramo putem SPI interfejsa sve dok ga ne reprogramiramo programatorom koji u radu koristi 12V, što ne spada u inventar prosečnog mejkera. Ukoliko se odlučimo da skečeve zapisujemo putem SPI interfejsa, onda to činimo slično onome kako smo to radili kod modela ATtinny13a. Dakle, povezujemo signale sa pinovima Arduina i zapisujemo program bez korišćenja bootloadera. Prednost ovakvog pristupa je to da ćemo na raspolaganju imati svih 8KB memorije umesto 6,44KB, koliko nam preostaje korišćenjem standardnog bootloadera. To ćemo morati da platimo odricanjem od korišćenja USB interfejsa za programiranje (može jedino imati funkciju napajanja), kao i češćim „žongliranjem” sa kablovima, pošto ćemo morati da oslobađamo pinove za povezivanje sa SPI interfejsom. Još jedna pozitivna stvar kod ove vrste modula je to da ih možemo koristiti i sa ostalim 8-pinskim DIP čipovima iz porodice ATtinny, a može predstavljati i minijaturni programator. Igor S. RUŽIĆ | | |