LAKI PINGVINI<>
042018<><>

Arduino: Proširenje memorijskih kapaciteta

Memorije nikad dosta

Mikrokontroleri predstavljaju specijalnu vrstu mikroprocesora koji integrišu mnoštvo elektroničkih podsistema potrebnih za obavljanje širokog spektra upravljačkih zadataka. Osim podrške hardverskim interfejsima za komunikaciju sa senzorima i drugim elektroničkim sklopovima, mikrokontroleri najčešće dolaze sa manjom količinom fleš memorije za zapisivanje programa, kao i (S)RAM-om za čuvanje vrednosti promenjivih. Ti memorijski resursi su za današnje PC standarde veoma skromni, ali i sasvim dovoljni za realizaciju velikog broja zadataka. U praksi su česte situacije kada količina ugrađene memorije nije dovoljna za realizaciju određenog zadatka, pa je tada potrebno posegnuti za alternativnim rešenjima.

Interni EEPROM

Od samog početka priče o Arduinu opredelili smo se da za prezentaciju gradiva koristimo model Arduino Uno, koji kao osnovu ima mikrokontroler ATmega328P. Sa radnim taktom od 16 megaherca, 32 kilobajta fleš memorije i dva kilobajta SRAM-a, on ne spada u kategoriju najsnažnijih mikrokontrolera, ali je uz njegovu pomoć moguće realizovati mnogo zanimljivih projekata. Jedna od lepih karakteristika Atmelovih mikrokontrolera odnosi se na postojanje dodatnog EEPROM (Electrically Erasable Programmable Read-Only Memory) skladišta, čiji sadržaj ostaje sačuvan i posle prestanka dotoka električne energije. U pitanju je tehnologija koja datira još iz prve polovine osamdesetih godina prošlog veka i predstavlja preteču fleš memorija. Pomenuti čip ATmega328P sadrži jedan kilobajt EEPROM skladišta i ono se može koristiti kao svojevrsni sićušni SSD drajv. Iako se u tehničkoj dokumentaciji može pročitati da garantovani broj upisivanja iznosi 100.000, on je u stvarnosti mnogo veći.

Da bi se pristupilo ovoj memoriji, potrebno je koristiti hardverske registre mikrokontrolera, što i nije tako jednostavan posao. Na sreću, standardni Arduino IDE ima biblioteku za rad sa EEPROM skladištem i za to je u program potrebno dodati sledeću direktivu:

#include <EEPROM.h>

Rad se obavlja preko objekta pod nazivom EEPROM i na raspolaganju nam stoji pet metoda za čitanje i zapisivanje podataka. Dok write() i read() služe za pisanje i čitanje bajtova, preko metoda put() i get() možemo zapisivati i čitati sve ostale tipove podataka, kao što su int, char, float itd. U praktičnom radu je posebno zanimljiv metod update(), koji će u memoriju upisati novu vrednost samo ako se razlikuje od prethodne. Na ovaj način se može znatno produžiti vek eksploatacije čipa. Jednostavan primer upotrebe biblioteke EEPROM bi mogao da izgleda ovako:

int bajt = 236; // vrednost 0-255

EEPROM.write(12, bajt); // zapisi vrednost 236 na lokaciju 12

Kod većih brojeva koristimo standardne Arduino funkcije highbyte i lowbyte kako bismo dvobajtnu int vrednost pretvorili u bajtove:

int dva_bajta = 23456; // broj u opsegu 0-65535

byte visi = highByte(dva_bajta); // visi bajt

byte nizi = lowByte(dva_bajta); // i nizi bajt

EEPROM.write(123, visi); // zapisujemo u EEPROM

EEPROM.write(124, nizi); // na lokaciju 123-124

Prilikom čitanja iz memorije možemo koristiti funkciju word() kako bismo pojedinačne bajtove kombinovali u šesnaestobitne brojeve.

Podaci se mogu čitati ili pisati i uz pomoć izraza EEPROM[adresa] i pri tome se ne koriste metodi koje smo prethodno spominjali, već direktno pristupamo podacima na ukazanoj adresi. Na primer:

unsigned char slovo;

slovo = EEPROM[123]; //citaj karakter sa lokacije 123

slovo = "s”;

EEPROM[123] = slovo; // zapisi "s" na lokaciju 123

Moguće je koristiti unapređenu varijantu ove biblioteke pod nazivom EEPROMex (goo.gl/VGMtJb), koja sa sobom donosi mogućnost čitanja i pisanja pojedinačnih bitova, upotrebu svih raspoloživih tipova podataka, nizova i struktura.

Eksterni I2C EEPROM

U pređašnjim nastavcima smo više puta koristili I2C (I2C, IIC) i SPI magistralu za povezivanje Arduina sa drugim uređajima, tako da pažljivim čitaocima izneseni materijal neće predstavljati naročitu novost. Lepa osobina ovih interfejsa jeste da imaju univerzalni karakter, pa je tako na njih, osim raznoraznih modula sa senzorima ili nekog od sklopova za prikaz podataka, moguće priključiti i neki od modula ili čipova koji proširuju memorijske kapacitete mikrokontrolera. Ovde je važno istaći da nije moguće proširivanje RAM-a i fleš memorije koja je fabrički ugrađena u mikrokontroler, već dobijamo mogućnost da dodavanjem eksterne memorije omogućimo čitanje i zapisivanje podataka u mnogo većem obimu od onoga koji je proizvođač predvideo. Eksterne memorije su veoma korisne u projektima koji imaju potrebu zapisivanja prikupljenih informacija ili u radu koriste veliki broj ranije memorisanih podataka.

Verovatno najpopularnija porodica čipova sa EEPROM nosi oznaku AT24xxxxx i dolazi iz kuhinje poznatog proizvođača, kompanije Microchip. Reč je o CMOS memorijama, čiji se kapaciteti kreću od skromnih 128 bitova (16 bajtova), pa do sasvim solidnih 1024 kilobita (128 kilobajta). U radu koriste malo energije (prilikom čitanja maksimalno 400 mikroampera, stendbaj jedan mikroamper) i omogućavaju prenos putem IIC magistrale brzinama od 100 i 400 kiloherca (model FC do jedan megaherc), što je za njihovu namenu sasvim prihvatljivo. Ciklus zapisivanja podataka ima trajanje od dve do pet milisekundi, projektovani broj upisivanja u memoriju je jedan milion, dok se trajnost zapisanih podataka procenjuje na oko dve stotine godina. Moguće je istovremeno kaskadno povezati do osam takvih čipova. Hobisti ih rado koriste zbog niske cene i postojanja PDIP varijante kućišta sa osam iglica, koja je pogodna za rad sa prototipskim pločicama.

Pinovi A0, A1 i A2 služe za definisanje IIC adrese. Ukoliko sva tri pina povežemo sa linijom uzemljenja, adresa čipa će biti 0x50 (50 heksadecimalno ili 80 decimalno). Povezivanjem pina sa linijom napona on dobija logičku vrednost „1”, dok povezivanjem sa uzemljenjem dobija vrednost logičke nule. Pin A0 predstavlja najviši bit adrese, dok je pin A2 sa najmanjom težinom. Kombinovanjem pinova sa linijama napajanja i uzemljenja možemo da definišemo adresu u opsegu od 0x50 do 0x57.

Pin 5 (SDA) je namenjen prenosu podataka preko I2C interfejsa i povezuje se sa Arduino Uno pinom A4, dok pin 6 (SCL) obezbeđuje signal sinhronizacije i njega povezujemo sa Arduino pinom A5.

Preko pina WP regulišemo da li je omogućeno upisivanje podataka u memoriju ili će čip biti samo u režimu čitanja podataka (read only). U slučaju da je na ovom pinu logička jedinica, čip je moguće samo čitati, pa je za režim zapisivanja potrebno povezivanje sa linijom uzemljenja.

Što se tiče sheme povezivanja, treba istaći da je prilikom rada sa magistralom od 100 kiloherca potrebno koristiti pull-up otpornike od deset kilooma (mogu i oni koji su ugrađeni u mikrokontroler), dok se u radu sa magistralom od 400 kiloherca i jedan megaherc koriste otpornici od dva kilooma.

Program koji demonstrira rad sa EEPROM bi mogao da izgleda ovako:

#include <Wire.h> // biblioteka za rad sa I2C interfejsom

//funkcija za upis podataka

void EEPROMwrite(byte I2Cadr, byte mem_adr, byte data) {

Wire.beginTransmission(I2Cadr); // povezi se sa uredjajem na ovoj adresi

Wire.write(mem_adr); // mem. adr. gde zapisujemo

Wire.write(data); // sta zapisujemo

Wire.endTransmission(); // zavrsetak operacije

}

//funkcija za citanje podataka

byte EEPROMread(int I2Cadr, byte mem_adr) {

Wire.beginTransmission(I2Cadr); // adresa uredjaja

Wire.write(mem_adr); // odakle citamo

Wire.endTransmission(); // zavrsetak operacije

Wire.requestFrom(I2Cadr, 1); // master trazi 1 bajt od slejva

if(Wire.available()) // postoji li bajt za citanje?

return Wire.read(); // da, citaj podatak

else

return 0xFF; // ne, vrati vrednost 255

}

void setup() {

Wire.begin(); // prikljucujemo se na I2C magistralu

Serial.begin(9600);

// pisemo podatke u eksterni EEPROM

for(int x = 0; x < 10; x++) { // prvih 10 lokacija

EEPROMwrite(0x50, x, ’a’+i);

delay(10); // obavezna pauza prilikom zapisivanja

}

Serial.println("Upisivanje zavrseno");

}

void loop() {

for(int x = 0; x < 10; x++) {

byte vrednost = EEPROMread(0x50, x);

Serial.print(x);

Serial.print(" – ");

Serial.println(vrednost);

delay(2000);

}

}

Ovde koristimo direktnu komunikaciju sa I2C interfejsom bez upotrebe dodatnih biblioteka. Zbog jednostavnosti koristili smo zapisivanje u prvih deset memorijskih lokacija, a u slučaju pristupanja celom adresnom prostoru, umesto linije:

Wire.write(mem_adr);

unosimo sledeće:

Wire.write((int)(mem_adr >> 8)); // gornji bajt adrese

Wire.write((int)(mem_adr & 0xFF)); // donji bajt adrese

To je stari trik sa pomeranjem (šiftovanjem) vrednosti višeg bajta u niži, dok vrednost nižeg bajta dobijamo korišćenjem AND maske za izolovanje nižih osam bitova int vrednosti. Naravno, ne smemo zaboraviti da u okviru argumenata funkcije promenimo vrednost parametra mem_adr iz byte u int.

Maksimalna dužina podataka upisanih u jednom ciklusu može biti 28 bajtova, pošto je dužina I2C bafera kod Arduina ograničena na 32 bajta. Ovo se u slučaju nužde može izmeniti promenom direktive #define BUFFER_LENGTH u okviru fajla Wire.h, ali treba znati da povećanjem bafera smanjujemo dragoceni RAM.

Povezivanje se može dodatno pojednostaviti korišćenjem modula na kojem se nalazi gnezdo za postavljanje PDIP memorijskog čipa, kao i džampere koji određuju adresu uređaja i razrešavaju mogućnost upisivanja podataka. Od nas se samo zahteva da povežemo naponske linije i linije IIC interfejsa sa Arduinom preko za to predviđenih pinova. Cena modula koji dolazi zajedno sa memorijskim čipom od 32 kilobajta (AT24LS256) iznosi nešto manje od jednog evra.

Eksterna SPI fleš memorija

Jedan od najvećih nedostataka EEPROM čipova odnosi se na relativno mali memorijski kapacitet, koji se generalno kreće u granicama do jednog megabajta. U slučaju da nam je potrebno više memorije, potrebno je obratiti pažnju na memorijske čipove bazirane na fleš memoriji.

Za razliku od EEPROM-a, koji dozvoljava da se podacima pristupa na nivou pojedinačnih bajtova, fleš memorije zahtevaju brisanje i zapisivanje podataka u blokovima određene veličine. Sa jedne strane, to je dobro pošto je zapisivanje podataka po blokovima znatno brže, ali je, sa druge strane, lošije pošto se zbog promene jednog jedinog bita vrši operacija zapisivanja nad znatno većim memorijskim prostorom, što negativno utiče na vek eksploatacije. Veličina tih blokova (stranica) varira u zavisnosti od tehnologije koja je korišćena pri izradi čipa (NOR, NAND, SLC, MLC) i od memorijskog kapaciteta.

Za demonstraciju ćemo koristiti Winbondov čip W25Q32BV izrađen u NOR tehnologiji, koji nudi kapacitet od četiri megabajta (32 megabita). Memorija je organizovana u 16384 stranice sa po 256 bajtova. Brisanje se vrši u blokovima od 16, 128 i 256 stranica (4, 32 i 64 kilobajta). Čip zahteva napon od 3,3 volta i u radu troši četiri miliampera. Proizvođač garantuje sto hiljada ciklusa upisivanja, dok se trajnost podataka procenjuje na oko 20 godina.

Porodica čipova W25Q predstavlja nadogradnju serije W25X i donosi veće kapacitete i Quad-SPI brzinu kloka od 416 megaherca, što obezbeđuje brzine prenosa od 50 MB/s. Ovo je, naravno, nemoguće maksimalno iskoristiti na Arduino platformi, pošto je brzina SPI magistrale kod Atmelovih 8-bitnih mikrokontrolera ograničena na osam megaherca u master i četiri megaherca u slejv režimu.

Pinove čipa možemo podeliti u tri grupe. U prvu grupu spadaju signali SPI interfejsa (/CS, DO, DI i CLK), u drugu kontrolni signali (/WP, /HOLD) i u treću neizbežni strujni pinovi (VCC, GND). Pošto SPI interfejs može da komunicira sa velikim brojem uređaja, u radu koristi liniju /CS, koja obaveštava uređaje da su izabrani za komunikaciju preko SPI magistrale. Ta linija se na strani Arduino uređaja povezuje sa pinom SS (Slave Select) i postavljanje tog signala u stanje logičke nule znači da će uređaj imati pristup magistrali podataka. Znak kose linije („/”) ispred oznake pina nam govori baš to, da je pin aktiviran kada je u stanju logičke nule, a na elektroničkim shemama se ista stvar najčešće predstavlja linijom iznad oznake signala. Pinovi 2 (DO) i 5 (DI) se povezuju sa Arduino pinovima MISO (Master In, Slave Out) i MOSI (Master Out, Slave In) respektivno. Kao što se lako da zaključiti, preko DO signala podaci iz memorije odlaze prema mikrokontroleru, dok se preko pina DI podaci iz mikrokontrolera zapisuju u memoriju. Da bi komunikacija preko SPI interfejsa uopšte bila moguća, potrebno je uspostaviti liniju sinhronizacije prenosa podataka i za tu namenu se koristi signal CLK, koji se povezuje sa Arduinovim pinom SCK (Serial Clock).

Što se kontrolnih signala tiče, tu je stvar prilično jednostavna. Signal /WP je naš stari poznanik iz primera kada smo govorili o EEPROM i ima funkciju da zabrani upisivanje podataka u memoriju. Najčešći je slučaj da je upisivanje trajno dozvoljeno, a to se postiže dovođenjem ovog pina u stanje logičke jedinice, odnosno povezivanjem sa VCC linijom. Što se tiče signala /HOLD, njegova je namena da pauzira prenos podataka. Ta funkcija se vrlo retko koristi, pa se i ovaj pin bez nekog razmišljanja može povezati sa pozitivnom linijom napona.

Kada smo već kod napona, treba reći da ovaj čip radi u opsegu od 2,7 do 3,6 volti, pa je svakako mudra ideja sprečiti pregorevanje i produžiti život integralnom kolu tako što ćemo radni napon sa pet volti svesti na 3,3 volta. Taj problem je moguće rešiti na više načina. Jedan se sastoji od dodavanja otpornika koji će spustiti napon do željene vrednosti, kao što ilustruje crtež.

Formula po kojoj računamo izlazni napon ima sledeći oblik:

Uizl = Uul (R2/(R1+R2))

Tako ćemo, recimo, napon od pet volti preobraziti u 3,3 volta korišćenjem otpornika R1 od 1700 oma i R2 od 3300 oma. Po prethodnoj formuli izlazi:

5 V * (3300 W / (1700 W + 3300 W)) = 5 V * (3300 W / 5000 W) = 5 V * 0,66 = 3,3 V

Uopšteno, možemo koristiti proizvoljne kombinacije otpornika pod uslovom da R2 ima 1,94 puta veću vrednost od otpornika R1. To znači da možemo koristiti otpornike od npr. 100 i 194 oma i opet ćemo dobiti napon od 3,3 volta. Pošto ne postoje otpornici od 194 oma, koristimo najbližu standardnu vrednost koja iznosi 200 oma i u tom slučaju dobijamo izlazni napon od 3,33 volta, što je u granicama propisanih vrednosti (2,7-3,6).

Drugi način je da koristimo modul koji se naziva bidirekcioni pomerač napona (bidirecional level shifter), čija je namena povezivanje sklopova koji rade na različitim naponima. Vrlo čestu primenu nalaze kao most prilikom povezivanja uređaja preko IIC i SPI interfejsa. Da bismo maksimalno pojednostavili prikaz sheme vezivanja, koristili smo gotovi modul sa mogućnošću premošćavanja četiri linije za podatke, plus dve dodatne naponske linije. Postoji veliki broj različitih modela, od kojih neki koriste integrisana kola sa mogućnošću konverzije više kanala, dok drugi preferiraju kombinovanje većeg broja jednokanalnih konvertera napona (recimo, BSS138). Njih je moguće kupiti već po cenama od oko 30 evro centi.

Što se softverske strane tiče, upotreba SPI memorija je praktično jednaka korišćenju drugih uređaja koji koriste SPI magistralu. Kao i u slučaju njegovog EEPROM rođaka, i SPI fleš memorije je moguće kupiti u obliku modula pogodnih za povezivanje sa Arduinom i sličnim uređajima. Cena ovakvog modula sa četiri megabajta memorije iznosi oko 1,2 evra.

FeRAM memorije

Videli smo da EEPROM omogućava milion ciklusa zapisivanja podataka, dok je kod kvalitetnih fleš memorija danas taj broj obično od 100 hiljada do miliona. Šta da radimo ukoliko naš projekat zahteva veoma često upisivanje podataka u memoriju? Sa velikim stepenom uverenosti možemo pretpostaviti da većina onih koji čitaju ove redove nikada nije čula za FeRAM (feroelektrički RAM, FRAM, F-RAM) tip memorije, iako ta tehnologija ima mnoštvo interesantnih karakteristika. Princip funkcionisanja im je sličan onom kod RAM-a, s tim što zbog korišćenja specijalnog feritnog kondenzatora vrednosti u memorijskim ćelijama ostaju zapisane i nakon nestanka struje. Feroelektrički RAM karakteriše vreme pristupa memoriji za više od hiljadu puta kraće u odnosu na EEPROM i fleš memorije. Pri tome je potrošnja struje manja za desetine puta. Najfascinantniji podatak u vezi sa FeRAM-om odnosi se na broj ciklusa upisivanja podataka, koji je veći od sto triliona na nivou pojedinačnih bajtova, što ih praktično čini večnim. Podaci ostaju zapisani u okviru memorije preko deset godina, i to na temperaturi od 85 stepeni celzijusa, dok na nižim temperaturama ta brojka ide i preko 150 godina. Još jedna sjajna osobina FRAM-a odnosi se na izraženu otpornost prema uticaju magnetskih polja i gama zračenja, što se ne može reći za EEPROM i fleš memorije.

Postavlja se pitanje zašto pored takvih sjajnih svojstava ove memorije nisu šire zastupljene na tržištu. Ključni razlog je nemogućnost postizanja veće gustine pakovanja informacija na malom prostoru i po povoljnoj ceni, pa FRAM gubi tržišnu bitku protiv konkurentskih tehnologija. Raspoloživa integralna kola imaju manji kapacitet i veću cenu, tako da im je spektar upotrebe znatno ograničen. Cena F-RAM memorija kapaciteta 16 kilobita (dva kilobajta) iznosi oko jedan evro, dok cene čipova od četiri megabita (512 kilobajta) idu i preko dvadeset evra.

Što se tiče povezivanja sa Arduinom, praktično sve rečeno u vezi sa EEPROM-om i fleš memorijama važi i ovde. Čipovi dolaze sa IIC ili SPI interfejsom, a raspored pinova odgovara onom na našim ilustracijama. Iako postoje modeli u PDIP-8 pakovanju, njih je teško nabaviti, pa se izbor svodi na korišćenje SOIC-8 varijanti, koje lemimo na DIP podnožja ili umećemo u gnezda specijalizovana za ovu vrstu pakovanja. Za one koji nisu vešti u lemljenju SMD komponenti najbolji izbor predstavlja kupovina gotovih modula. Postoji više različitih modela koji su često univerzalne prirode. Tako je, recimo, modul pod nazivom AT24/FM24 moguće pronaći kako u varijanti sa FeRAM, tako i sa EEPROM SOIC-8 čipovima. Programiranje IIC varijante FeRAM modula je vrlo slično onome koje smo imali u slučaju EEPROM-a.

Igor S. RUŽIĆ

 
Lollypop 0.9.4
Peek 1.2.2
Discover 5.12.3
Arduino: Proširenje memorijskih kapaciteta
Šta mislite o ovom tekstu?
Arduino: DIY - Meteo Station (2)
Štitovi Arduina (7): MP3 Shield
Home / Novi brojArhiva • Opšte temeInternetTest driveTest runPD kutakCeDetekaWWW vodič • Svet igara
Svet kompjutera Copyright © 1984-2018. Politika a.d. • RedakcijaKontaktSaradnjaOglasiPretplata • Help • English
SKWeb 3.22
Opšte teme
Internet
Test Drive
Test Run
PD kutak
CeDeteka
WWW vodič
Svet igara



Naslovna stranaPrethodni brojeviOpšte informacijeKontaktOglašavanjePomoćInfo in English

Svet kompjutera