Šta je memorijski čip i kako programirati mikro kola. Kako očistiti EEPROM (nepostojivu memoriju) Korišćenje eeprom memorije

Prošli put, kada sam pisao svoj “detaljan odgovor na pitanje” o tome kako napraviti backup firmvera sa Mege, zamjerili su mi što nisam spomenuo EEPROM backup. Tada to nisam uradio svesno, jer... S pravom sam procenio da ne treba sve komplikovati u fazi početnog „prilaska projektilu“. Činjenica je da nije svima očigledno da se EEPROM ne flešuje prilikom kompajliranja i učitavanja firmvera sa Arduino IDE. To znači da se apsolutno ništa ne učitava u EEPROM kada se firmver učita iz IDE-a. A manipulacije s EEPROM-om (ako je njegova upotreba uopće omogućena u firmveru) se izvode na sasvim drugom nivou. I stoga, da napravite rezervnu kopiju golog firmvera bez fina podešavanja, koji se MOŽDA (samo možda) može pohraniti u EEPROM, bilo je sasvim dovoljno da se sačuva samo goli firmver. Ali pošto se postavilo pitanje, zašto ga ne “žvakati”. Idemo kroz to redom. Šta je EEPROM i zašto pričati o tome?
EEPROM - (Electrically Erasable Programmable Read-Only Memory) područje ​​nestalne memorije mikrokontrolera u koje se mogu upisivati ​​i čitati informacije. Često se koristi za pohranjivanje postavki programa koje se mogu promijeniti tokom rada i koje se moraju pohraniti kada je napajanje isključeno.

Kako 3D štampač koristi EEPROM?
Pogledajmo Marlin kao primjer. U Marlin Firmware-u izvan kutije, EEPROM se ne koristi.Parametri konfiguratora (Configuration.h), koji uključuju mogućnost njegovog korištenja, su po defaultu komentarisani.

#define EEPROM_SETTINGS
#define EEPROM_CHITCHAT

Ako je korištenje EEPROM-a omogućeno, pisač može pohraniti i koristiti sljedeće postavke (navedene od strane buržoazije):

  • Broj koraka po milimetru
  • Maksimalna/minimalna brzina uvlačenja [mm/s]
  • Maksimalno ubrzanje [mm/s^2]
  • Ubrzanje
  • Ubrzanje tokom uvlačenja
  • PID postavke
  • Pomak matične pozicije
  • Minimalna brzina uvlačenja tokom kretanja [mm/s]
  • Minimalno vrijeme sekcije [ms]
  • Maksimalna brzina skoka X-Y ose[mm/s]
  • Maksimalni skok brzine po Z osi [mm/s]
Ove postavke možete urediti koristeći ekran i kontrole štampača. Kada je korištenje EEPROM-a omogućeno, meni bi trebao prikazati sljedeće stavke:
  • Čuvajte memoriju
  • Učitaj memoriju
  • Restore Failsafe
Takođe možete koristiti GCode za direktan rad (preko Pronterfacea).
  • M500 Čuva trenutne postavke u EEPROM do sljedećeg pokretanja ili naredbe M501.
  • M501 Čita postavke iz EEPROM-a.
  • M502 Vraća postavke na zadane vrijednosti navedene u Configurations.h. Ako izvršite M500 nakon njega, zadane vrijednosti će biti unesene u EEPROM.
  • M503 Prikazuje trenutne postavke - ""One snimljene u EEPROM.""
O EEPROM-u možete pročitati u firmveru Repitier-a.

Kako čitati i pisati podatke u EEPROM?
Slično metodi opisanoj u metodi sigurnosne kopije firmvera pomoću ključa -U. Samo u ovom slučaju, nakon njega će biti pokazivač koji pokazuje da EEPROM treba pročitati.

avrdude.exe -p atmega2560 -c ožičenje -PCOM5 -b115200 -Ueeprom:r:"printer_eeprom".eep:i

Ova komanda čita EEPROM podatke u datoteku "printer_eeprom.eep". Ako je uspješna, na ekranu ćete vidjeti nešto poput sljedećeg.

Snimanje takođe nije komplikovano i izvodi se sličnom komandom, koja se razlikuje samo po ključu -U Nije "r", već "w".

avrdude.exe -p atmega2560 -c ožičenje -PCOM5 -b115200 -Ueeprom:w:"printer_eeprom".eep:i

Ako bude uspješno, na ekranu ćete vidjeti nešto poput sljedeće poruke.

Kako i zašto izbrisati EEPROM?
Za početak, "zašto ovo raditi?" Morate obrisati EEPROM ako ga je koristio i prethodni firmver, a u memoriji bi moglo ostati smeće. Negdje sam već nailazio na ljude sa problemima da se nakon prebacivanja sa jednog firmvera na drugi (sa Marlina na Repitier EMNIP) njihov štampač počeo ponašati, da tako kažem, „kreativno“. To je zbog činjenice da različiti firmveri pohranjuju svoje podatke ispod različite adrese. A kada pokušate da pročitate podatke sa pogrešne adrese, počinje pandemonijum.
EEPROM možete izbrisati samo programski iz firmvera, ali da biste to učinili, morat ćete privremeno učitati posebnu skicu na kontroler. Više o tome možete pročitati u službenoj Arduino dokumentaciji.
Ako je EEPROM obrisan ne u Arduino ploča, a u nekom apstraktnom kontroleru, skicni kod će se morati promijeniti uzimajući u obzir veličinu EEPROM-a u određenom kontroleru na ploči. Da biste to učinili, morat ćete promijeniti krajnji uvjet u petlji "For". Na primjer, za ATmega328, koji ima 1kb EEPROM memorije, ciklus će izgledati ovako:
Zaključak.
Lutam već neko vrijeme, ali čemu sve ovo? Kako bismo došli do zaključka da se prilikom pravljenja sigurnosne kopije firmvera može sačuvati i EEPROM, ali samo ako su vam potrebne postavke sačuvane u njemu. Ako ste spremni da ih žrtvujete, onda zaboravite na to. Također, ako promijenite jedan firmver na drugi, ili se prebacite s verzije na drugu, nemojte biti lijeni da obrišete EEPROM prije učitavanja novi firmver. Pa, istovremeno smo naučili mnogo novih stvari.

Naš kontroler peći je skoro spreman – međutim, za sada ostaje kontroler “zlatne ribice” koji pamti sva podešavanja samo pet minuta prije prvog isključivanja. Da biste zapamtili naša podešavanja, vrijednost zadane temperature i kalibracijske točke čak i nakon isključivanja napajanja, potrebno je koristiti nepromjenjivu memoriju - EEPROM.
Naši prijatelji su jako dobro pisali o radu sa EEPROM-om.

Glavna stvar koju treba da znamo je to EEPROM memorija Bolje ga je posmatrati ne kao „samo memoriju“, već kao poseban unutrašnji uređaj u čipu.
EEPROM odvojeni adresni prostor, koji nema nikakve veze sa adresnim prostorom procesora (FLASH i SRAM); da biste pristupili podacima na određenoj adresi u trajnoj memoriji, morate izvršiti određeni niz radnje pomoću većeg broja registara (adresni registri EEARH i EEARL, registar podataka EEDR i kontrolni registar EECR).
Prema tablici sa podacima, da biste upisali bajt na određenu adresu u EEPROM-u, morate učiniti sljedeće:

  1. sačekajte da EEPROM bude spreman za pisanje podataka (EEPE bit EECR registra se resetuje);
  2. sačekajte kraj upisivanja u FLASH memoriju (resetovanje bita SELFPRGEN SPMCSR registra) - to se mora uraditi ako je pokretač sistema prisutan u programu;
  3. zapiši nova adresa u registar EEAR (ako je potrebno);
  4. upisati bajt podataka u EEDR registar (ako je potrebno);
  5. postavite bit EEMPE registra EECR na jedan;
  6. unutar četiri takta nakon postavljanja EEMPE zastavice, upisujemo logičku u EEPE bit EECR registra.

Procesor tada preskače 2 ciklusa takta prije izvršavanja sljedeće instrukcije.
Druga točka se mora izvršiti ako u programu postoji bootloader - činjenica je da se upisivanje u EEPROM ne može vršiti istovremeno sa upisivanjem u FLASH memoriju, pa prije pisanja u EEPROM morate biti sigurni da je programiranje FLASH memorije završeno; ako mikrokontroler nema bootloader, onda nikada ne menja sadržaj FLASH memorije (zapamtite da avr ima harvardsku arhitekturu: programska memorija (FLASH) i memorija podataka (SRAM) su odvojene).
Trajanje ciklusa snimanja zavisi od frekvencije internog RC oscilatora čipa, napona napajanja i temperature; obično za ATmega48x/88x/168x modele to je 3,4 ms (!), za neke starije modele – 8,5 ms (!!!).
Osim toga, prilikom pisanja u EEPROM, mogu nastati problemi s pozivanjem prekida tokom izvršavanja gore navedenog niza akcija - pa je bolje onemogućiti prekide tokom pisanja u EEPROM.
Čitanje stalne memorije je malo jednostavnije:

  1. sačekajte da EEPROM bude spreman za čitanje podataka (resetuje se EEWE bit registra EECR);
  2. upisati adresu u registar EEAR;
  3. postavite bit EERE registra EECR na jedan;
  4. čitamo podatke iz EEDR registra (u stvari, kada se traženi podaci prebace u registar podataka, to se dešava hard reset bit EERE; ali nema potrebe za praćenjem stanja ovog bita, jer se operacija čitanja iz EEPROM-a uvijek izvodi u jednom ciklusu takta).

Nakon postavljanja bita u EERE na jedan, procesor preskače 4 ciklusa takta prije izvršavanja sljedeće instrukcije.
Kao što vidimo, rad sa trajna memorija– proces je dugotrajan; ako često pišemo i čitamo podatke iz EEPROM-a, program može početi da usporava.

Međutim, mi pišemo program u IAR okruženju i imamo sreće: sav posao sa čitanjem i pisanjem iz EEPROM-a obavit će razvojno okruženje - iar ima modifikator “__eeprom” koji stvara varijable u nepromjenjivoj memoriji - a onda ćemo samo trebati čitati iz "trajnih" varijabli u "trenutne" (prilikom inicijalizacije kontrolera), ili pisati iz "trenutnih" varijabli u "konstantnu" - to jest, kada se trenutna vrijednost promijeni, vrijednost varijabla u nepromjenjivoj memoriji također se mora promijeniti.
Nove varijable će izgledati ovako:

Eeprom uint16_t EEP_MinTemperature;

Nekoliko opštijih riječi: i iako ne pretpostavljamo pokazivače na eeprom varijable, moramo zapamtiti da je eeprom poseban adresni prostor, a da bismo kreirali pokazivač na eeprom (a kompajler nam to dozvoljava), mi mora naznačiti da je ovo pokazivač na adresu u eeprom-u:

Uint16_t __eeprom *EEP_MinTemperatureAdr;

Vratimo se na kontroler peći i EEPROM. U našem slučaju nema EEPROM-a virtuelna mašina, naravno, ne očekuje se; Štoviše, vrijedno je razmisliti je li potrebna posebna biblioteka za rad s nepromjenjivom memorijom - previše su "razbacane" po programu snimanja važne postavke; ako pokušate da napravite zasebnu biblioteku, moraćete da napravite unakrsne reference: u biblioteci za EEPROM povežite biblioteke ADC-a, grejnog elementa i globalnih postavki; a u ovim perifernim bibliotekama, povezivanje EEPROM biblioteke nije baš dobar pristup.
Druga opcija je da svakoj biblioteci dodate eeprom varijablu u koju trebate spremiti postavke i spremiti odgovarajuće postavke direktno u virtuelne mašine. Mi ćemo implementirati ovu opciju.
Prvo, nabrojimo koje varijable trebamo spremiti u EEPROM:

  1. kalibracione tačke
  2. vrijednosti maksimalne-minimalne zadane temperature i koraka podešavanja temperature
  3. podešena vrednost temperature
  4. Koeficijenti PID regulatora

Ne čuvamo vrijednost kuhinjskog tajmera - pretpostavit ćemo da korisnik mora podesiti tajmer štednjaka svaki put nakon isključivanja struje.
Sve ove postavke postavlja korisnik okretanjem enkodera, a zatim kratkim pritiskom na korisničko dugme. U isto vrijeme, sjećamo se da je broj EEPROM ciklusa čitanja i pisanja još uvijek ograničen, pa nemojte ponovo prepisivati ​​iste informacije (na primjer, ako je korisnik odabrao istu vrijednost neke postavke kao što je bila). Stoga, prije svake promjene varijable __eeprom, provjeravamo da li je potrebno prepisati:

//ako se vrijednost promijenila, prepiši je u nepromjenjivu memoriju if (ADCTemperature.atMinTemperatureValue != (uint16_t)VMEncoderCounter.ecntValue) (ADCTemperature.atMinTemperatureValue = (uint16_t) ADCTemperature.atMinTemperatureValue; ture.atMinTemperatureV alue; )

Čitanje postavki iz EEPROM-a je također jednostavno - kada inicijaliziramo "trenutne" postavke, jednostavno čitamo vrijednost iz nepromjenjive memorije:

ADCTemperature.atMinTemperatureValue = EEP_MinTemperature;

Da bi naš uređaj od samog početka imao neka podešavanja u EEPROM-u, projekat za prvo pokretanje se može kompajlirati sa ovim varijablama inicijaliziranim:

Eeprom uint16_t EEP_MinTemperature = 20; ... //niz za pohranjivanje kalibracijskih tačaka u nepromjenjivu memoriju __eeprom TCalibrationData EEP_CalibrationData = ((20, 1300), (300, 4092));

U ovom slučaju, kompajler inicijalizira __eeprom varijable prije početka rada s glavnom funkcijom. Da biste dobili datoteku s nepromjenjivom memorijom (.eep), morate ući u sljedeće postavke:
Projekt->Opcije..->Linker->Dodatne opcije
Ako polje za potvrdu “Koristi opcije komandne linije” nije označeno, označite ga i dodajte red
-Ointel-standard,(XDATA)=.eep
Prvo kompajliramo projekat sa inicijalizovanim varijablama, posebno sačuvamo eep ​​fajl; tada uklanjamo inicijalizaciju prilikom kreiranja varijabli.

To je sve - naša peć je spremna!

Arduino je cijela porodica razni uređaji za izradu elektronskih projekata. Mikrokontroleri su vrlo praktični za korištenje i lako ih je naučiti čak i za početnike. Svaki mikrokontroler se sastoji od ploče, programa za rad i memorije. Ovaj članak će se osvrnuti na nepromjenjivu memoriju koja se koristi u Arduinu.

Opis EEPROM memorije

Arduino svojim korisnicima pruža tri tipa ugrađene memorije uređaja: stacionarnu RAM memoriju (random access memory ili SRAM - statička memorija sa slučajnim pristupom) - neophodna za snimanje i skladištenje podataka tokom upotrebe; fleš kartice – za čuvanje već snimljenih šablona; – za skladištenje i naknadnu upotrebu podataka.

Svi podaci u RAM memoriji se brišu čim se uređaj ponovo pokrene ili isključi napajanje. Druga dva spremaju sve informacije prije prepisivanja i omogućavaju vam da ih dohvatite ako je potrebno. Flash diskovi su danas prilično uobičajeni. Vrijedi detaljnije razmotriti EEPROM memoriju.

Skraćenica je skraćenica od Electrically Erasable Programmable Read-Only Memory i prevedeno na ruski doslovno znači električno izbrisiva programabilna memorija samo za čitanje. Proizvođač jamči sigurnost informacija nekoliko desetljeća nakon posljednjeg nestanka struje (obično se daje period od 20 godina, ovisno o brzini smanjenja napunjenosti uređaja).

Međutim, morate znati da je mogućnost ponovnog pisanja na uređaj ograničena i ne više od 100.000 puta. Stoga se preporučuje da budete pažljivi i pažljivi prema unesenim podacima i da ih više ne prepisujete.

Količina memorije je, u poređenju sa savremenim medijima, veoma mala i varira za različite mikrokontrolere. Na primjer, za:

  • ATmega328 – 1 kB
  • ATmega168 i ATmega8 – 512 bajtova,
  • i ATmega1280 – 4 kB.

Dizajniran je na ovaj način jer je svaki mikrokontroler dizajniran za određenu količinu zadataka, ima različit broj pinova za povezivanje, te je shodno tome potrebna i druga količina memorije. Štaviše, ovaj iznos je dovoljan za uobičajeno kreirane projekte.

Zapisivanje u EEPROM zahtijeva značajno vrijeme - cca. 3 ms. Ako se napajanje isključi tokom snimanja, podaci se uopće neće pohraniti ili mogu biti pogrešno snimljeni. Uvijek je potrebno dodatno provjeriti unesene podatke kako bi se izbjegli kvarovi tokom rada. Čitanje podataka je mnogo brže, a memorijski resursi se ne smanjuju.

Biblioteka

Rad sa EEPROM memorijom se izvodi pomoću biblioteke koja je posebno kreirana za Arduino. Glavne su sposobnost pisanja i čitanja podataka. aktivira se komandom #include EEPROM.h.

  • Za evidencije– EEPROM.write(adresa, podaci);
  • Za čitanje– EEPROM.read(adresa).

U ovim skicama: adresa – argument sa podacima ćelije u koju se unose podaci drugog argumenta; prilikom čitanja koristi se jedan argument, adresa, koji označava odakle treba čitati informaciju.

Funkcija Svrha
pročitaj (adresa) čita 1 bajt iz EEPROM-a; adresa – adresa sa koje se čitaju podaci (ćelija počinje od 0);
napisati (adresa, vrijednost) upisuje vrijednost (1 bajt, broj od 0 do 255) u memoriju na adresi;
ažuriranje (adresa, vrijednost) zamjenjuje vrijednost na adresi ako se njen stari sadržaj razlikuje od novog;
dobiti (adresa, podaci) čita podatke specificiranog tipa iz memorije na adresi;
staviti (adresa, podaci) upisuje podatke specificiranog tipa u memoriju na adresi;
EEPROM omogućava vam da koristite identifikator "EEPROM" kao niz za pisanje podataka i čitanje iz memorije.

Pisanje cijelih brojeva

Pisanje cijelih brojeva u nepromjenjivu EEPROM memoriju je prilično jednostavno. Unos brojeva se dešava kada se funkcija pokrene EEPROM.write(). Traženi podaci su navedeni u zagradama. U ovom slučaju, brojevi od 0 do 255 i brojevi preko 255 se pišu drugačije. Prvi se unose jednostavno - njihov volumen zauzima 1 bajt, odnosno jednu ćeliju. Da biste napisali potonje, morate koristiti operatore highByte() za najviši bajt i lowByte() za najniži bajt.

Broj je podijeljen u bajtove i odvojeno upisan u ćelije. Na primjer, broj 789 će biti upisan u dvije ćelije: prva će sadržavati faktor 3, a druga će sadržavati vrijednost koja nedostaje. Rezultat je tražena vrijednost:

3 * 256 + 21 = 789

Za « ponovno ujedinjenje" primjenjuje se veliki cijeli broj funkcija riječi(): int val = riječ (bok, nisko). Morate pročitati da je maksimalni cijeli broj za snimanje 65536 (tj. 2 na stepen od 16). U ćelijama koje još nisu imale druge unose, monitor će prikazati brojeve 255 u svakoj.

Pisanje brojeva i nizova s ​​pomičnim zarezom

Brojevi s pomičnim zarezom i nizovi su oblik pisanja realnih brojeva gdje su predstavljeni mantisom i eksponentom. Takvi brojevi se upisuju u trajnu EEPROM memoriju aktiviranjem funkcije EEPROM.put(), čitajući, odnosno, – EEPROM.get().

Prilikom programiranja, numeričke vrijednosti s pomičnim zarezom označavaju se kao float; vrijedi napomenuti da ovo nije naredba, već broj. Char type (tip karaktera) – koristi se za predstavljanje nizova. Proces upisivanja brojeva na monitor se pokreće pomoću setup(), čitanje - pomoću loop().

Tokom procesa, na ekranu monitora mogu se pojaviti vrijednosti ovf, što znači "prepunjeno" i nan, što znači "nedostaje". numerička vrijednost" To znači da se informacije zapisane u ćeliju ne mogu reproducirati kao broj s pomičnim zarezom. Ova situacija neće nastati ako pouzdano znate u kojoj ćeliji je koja vrsta informacija zabilježena.

Primjeri projekata i skica

Primjer br. 1

Skica će napisati do 16 znakova sa serijskog porta i izbaciti 16 znakova iz EEPROM-a u petlji. Zahvaljujući tome, podaci se upisuju u EEPROM i prati se sadržaj nepromenljive memorije.

// provjeriti rad EEPROM-a #include int i, d; void setup() ( Serial.begin(9600); // inicijalizira port, brzina 9600 ) void loop() ( // čita EEPROM i šalje 16 podataka na serijski port Serial.println(); Serial.print("EEPROM = " ); i= 0; dok (i< 16) { Serial.print((char)EEPROM.read(i)); i++; } // проверка есть ли данные для записи if (Serial.available() != 0) { delay(50); // ожидание окончания приема данных // запись в EEPROM i= 0; while(i < 20) { d= Serial.read(); if (d == -1) d= " "; // если символы закончились, заполнение пробелами EEPROM.write(i, (byte)d); // запись EEPROM i++; } } delay(500); }

Primjer br. 2

Za bolje razumijevanje, možemo napraviti malu skicu koja će pomoći u razumijevanju rada s nepromjenjivom memorijom. Brojimo sve ćelije ove memorije. Ako ćelija nije prazna - izlaz na serijski port. Zatim ispunite ćelije razmacima. Zatim unosimo tekst kroz monitor serijskog porta. Zapisujemo ga u EEPROM i čitamo ga sljedeći put kada se uključi.

#include int adresa = 0; // eeprom adresa int read_value = 0; // podaci čitani iz eeprom char serial_in_data; // podaci serijskog porta int led = 6; // red 6 za LED int i; void setup() ( pinMode(led, OUTPUT); // red 6 je konfiguriran kao izlaz Serial.begin(9600); // brzina prijenosa na serijskom portu 9600 Serial.println(); Serial.println("PRETHODNI TEKST U EEPROM-u : -"); for(adresa = 0; adresa< 1024; address ++) // считываем всю память EEPROM { read_value = EEPROM.read(address); Serial.write(read_value); } Serial.println(); Serial.println("WRITE THE NEW TEXT: "); for(address = 0; address < 1024; address ++) // заполняем всю память EEPROM пробелами EEPROM.write(address, " "); for(address = 0; address < 1024;) // записываем пришедшие с последовательного порта данные в память EEPROM { if(Serial.available()) { serial_in_data = Serial.read(); Serial.write(serial_in_data); EEPROM.write(address, serial_in_data); address ++; digitalWrite(led, HIGH); delay(100); digitalWrite(led, LOW); } } } void loop() { //---- мигаем светодиодом каждую секунду -----// digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); }

Primjer br. 3

Zapisuje dva cijela broja u memoriju, čita ih iz EEPROM-a i šalje ih na serijski port. Brojevi od 0 do 255 zauzimaju 1 bajt memorije, koristeći funkciju EEPROM.write() se upisuju u željenu ćeliju. Za brojeve veće od 255, moraju se podijeliti u bajtove pomoću highByte() I lowByte() i upišite svaki bajt u svoju ćeliju. Maksimalni broj u ovom slučaju je 65536 (ili 2 16).

#include // povežite biblioteku EEPROM void setup() ( int smallNum = 123; // cijeli broj od 0 do 255 EEPROM.write(0, smallNum); // upišite broj u ćeliju 0 int bigNum = 789; // podijelite broj > 255 sa 2 bajta (maks. 65536) bajt hi = highByte(bigNum); // visoki bajt bajt niski = lowByte(bigNum); // niski bajt EEPROM.write(1, hi); // zapis visokog bajta EEPROM-a u ćeliju 1 .write(2, low); // upisati niži bajt u ćeliju 2 Serial.begin(9600); // inicijalizirati serijski port ) void loop() ( for (int addr=0; addr<1024; addr++) { // для всех ячеек памяти (для Arduino UNO 1024) byte val = EEPROM.read(addr); // считываем 1 байт по адресу ячейки Serial.print(addr); // выводим адрес в послед. порт Serial.print("\t"); // табуляция Serial.println(val); // выводим значение в послед. порт } delay(60000); // задержка 1 мин }

Primjer br. 4

Pisanje brojeva i nizova s ​​pomičnim zarezom - metoda EEPROM.put(). Čitanje – EEPROM.get().

#include // povezujemo biblioteku void setup() ( int addr = 0; // adresa float f = 3.1415926f; // broj s pomičnim zarezom (tip float) EEPROM.put(addr, f); // upisuje broj f na adresu addr addr += sizeof(float); // izračunaj sljedeću slobodnu memorijsku ćeliju char name = "Zdravo, SolTau.ru!"; // kreiraj niz znakova EEPROM.put(addr, name); // upiši niz na EEPROM Serial.begin (9600); // inicijalizacija serijskog porta ) void loop() ( for (int addr=0; addr<1024; addr++) { // для всех ячеек памяти (1024Б=1кБ) Serial.print(addr); // выводим адрес в послед. порт Serial.print("\t"); // табуляция float f; // переменная для хранения значений типа float EEPROM.get(addr, f); // получаем значение типа float по адресу addr Serial.print(f, 5); // выводим с точностью 5 знаков после запятой Serial.print("\t"); // табуляция char c; // переменная для хранения массива из 20 символов EEPROM.get(addr, c); // считываем массив символов по адресу addr Serial.println(c); // выводим массив в порт } delay(60000); // ждём 1 минуту }

Primjer br. 5

Korištenje EEPROM-a kao niza.

#include void setup() ( EEPROM = 11; // upiši EEPROM 1. ćelije = 121; // upiši EEPROM 2. ćelije = 141; // upiši EEPROM 3. ćelije = 236; // upiši 4. ćeliju Serial .begin(9600 ); ) void loop() ( for (int addr=0; addr<1024; addr++) { Serial.print(addr); Serial.print("\t"); int n = EEPROM; // считываем ячейку по адресу addr Serial.println(n); // выводим в порт } delay(60000); }

Rad sa EEPROM-om

Kao što je ranije spomenuto, EEPROM memorija je ograničena. Da biste produžili vijek trajanja nepromjenjive memorije, umjesto funkcije write() bolje je koristiti funkciju ažuriranja. U ovom slučaju, prepisivanje se vrši samo za one ćelije u kojima se vrijednost razlikuje od novonapisane.

Još jedna korisna funkcija dotične memorije mikrokontrolera je mogućnost korištenja ćelija za pohranu bajtova kao dijelova integralnog EEPROM niza. U svakom formatu upotrebe potrebno je stalno pratiti integritet snimljenih podataka.

Takva memorija na Arduinu standardno pohranjuje najvažnije stvari za rad kontrolera i uređaja. Na primjer, ako se na takvoj osnovi kreira regulator temperature i ispostavi se da su početni podaci pogrešni, uređaj će raditi "neadekvatno" postojećim uvjetima - uvelike će podcijeniti ili precijeniti temperaturu.

Postoji nekoliko situacija u kojima EEPROM sadrži netačne podatke:

  1. Nakon početnog aktiviranja, još nije bilo unosa.
  2. Tokom nekontrolisanog nestanka struje, neki ili svi podaci neće biti snimljeni ili će biti snimljeni pogrešno.
  3. Nakon završetka mogućih ciklusa ponovnog pisanja podataka.

Kako bi se izbjegle neugodne posljedice, uređaj se može programirati za nekoliko radnji: primijeniti podatke koda za hitne slučajeve, potpuno isključiti sistem, signalizirati kvar, koristiti prethodno kreiranu kopiju ili druge.

Za kontrolu integriteta informacija koristi se kontrolni kod sistema. Kreira se na osnovu originalnog zapisa podataka i, kada se verifikuje, ponovo izračunava podatke. Ako je rezultat drugačiji, to je greška. Najčešća verzija takve provjere je kontrolni zbroj - izvodi se jednostavna matematička operacija za dodavanje svih vrijednosti ćelija.

Iskusni programeri dodaju dodatno "ekskluzivno OR" ovom kodu, kao što je E5h. Ako su sve vrijednosti jednake nuli, a sistem greškom resetuje originalne podatke, ovaj trik će otkriti grešku.

Ovo su osnovni principi rada sa nepostojanom EEPROM memorijom za Arduino mikrokontrolere. Za određene projekte vrijedi koristiti samo ovu vrstu memorije. Ima i svoje prednosti i nedostatke. Da biste savladali metode pisanja i čitanja, bolje je početi s jednostavnim zadacima.

Svi mikrokontroleri iz porodice Mega uključuju nepromjenjivu memoriju ( EEPROM memorija). Volumen ove memorije kreće se od 512 bajtova u ATmega8x modelima do 4 KB kod starijih modela. EEPROM memorija se nalazi u sopstvenom adresnom prostoru i, kao i RAM, organizovana je linearno. Za rad sa EEPROM Memorija koristi tri I/O registra: adresni registar, registar podataka i kontrolni registar.

Address Register

Address Register EEPROM memorija EEAR (EEPROM adresni registar) fizički smješten u dva RVV EEARH:EEARL, koji se nalazi uz
adresira $1F ($3F) i $1E ($3E), respektivno. Ovaj registar se učitava sa adresom ćelije kojoj će se pristupiti. Registar adresa je upisiv i čitljiv. Istovremeno, u registru EEARH koriste se samo najmanji bitni bitovi (broj uključenih bitova ovisi o volumenu EEPROM memorija). Neiskorišteni registarski bitovi EEARH su samo za čitanje i sadrže "0".

Registar podataka

Registar podataka EEPROM memorija EEDR (EEPROM registar podataka) nalazi se na $1D ($3D). Prilikom pisanja u ovaj registar, učitavaju se podaci u koje treba staviti EEPROM, a prilikom čitanja podaci koji se čitaju iz EEPROM.

Kontrolni registar

Kontrolni registar EEPROM memorija EECR (EEPROM kontrolni registar) nalazi se na $1C ($3C). Ovaj registar se koristi za
kontrole pristupa EEPROM memorija. Njegov opis je prikazan u tabeli ispod:

Pražnjenje Ime Opis
7..4 - nije korišteno, čita se kao "0"
3 EERIE Omogući prekid iz EEPROM-a. Ovaj bit kontrolira generiranje prekida koji se javlja kada se završi ciklus pisanja u EEPROM. Ako je ovaj bit postavljen na "1", prekidi su omogućeni (ako je oznaka I registra
SREG je takođe postavljen na "1"). Kada se EEWE bit izbriše (vidi dalje u
tablica) prekid se generira konstantno
2 EEMWE Kontroliranje dozvole pisanja u EEPROM. Stanje ovog bita određuje rad oznake za omogućavanje EEWE zapisa. Ako je ovaj bit postavljen na “1”, tada se prilikom pisanja u EEWE bit “1” podaci upisuju u EEPROM. U suprotnom, postavljanje EEWE na "1" nema efekta. Nakon instalacije softvera, EEMWE bit se resetuje hardverskim putem
4 mašinska ciklusa
1 EEWE Dozvolite pisanje u EEPROM. Kada je ovaj bit postavljen na "1", podaci se upisuju u EEPROM (ako je EEMWE jednak "1")
0 EERE Dozvola za čitanje iz EEPROM-a. Nakon postavljanja ovog bita na “1”, podaci se čitaju iz EEPROM-a. Po završetku čitanja, ovaj bit se resetuje od strane hardvera

Da upišete jedan bajt u EEPROM potrebno vam je:

1. Sačekajte dok EEPROM ne bude spreman za pisanje podataka (sačekajte dok se EEWE zastavica EECR registra ne resetuje).

2. Sačekajte da se upis u FLASH programsku memoriju završi (sačekajte dok se SPMEN zastavica SPMCR registra ne resetuje).

3. Učitajte bajt podataka u EEDR registar i traženu adresu u EEAR registar (ako je potrebno).

4. Postavite EEMWE zastavicu EECR registra na “1”.

5. Upišite zapisnik u EEWE bit registra EECR. "1" za 4 mašinska ciklusa. Nakon instaliranja ovog bita, procesor
preskače 2 mašinska ciklusa prije izvršavanja sljedeće instrukcije.

Za čitanje jednog bajta iz EEPROM-a potrebno vam je:

1. Provjerite stanje EEWE zastavice. Činjenica je da dok se vrši operacija upisivanja u EEPROM memoriju (EEWE zastavica je postavljena), ne može se izvršiti ni čitanje EEPROM memorije niti promjena adresnog registra.

2. Učitajte traženu adresu u EEAR registar.

3. Postavite bit EERE registra EECR na “1”.

Kada se traženi podaci stave u registar podataka EEDR, doći će do hardverskog resetovanja ovog bita. Međutim, nije potrebno pratiti stanje EERE bita da bi se utvrdilo kada je operacija čitanja završena, budući da se operacija čitanja iz EEPROM-a uvijek završava u jednom strojnom ciklusu. Osim toga, nakon postavljanja bita EERE na "1", procesor preskače 4 strojna ciklusa prije pokretanja sljedeće instrukcije.

Okruženje AVR Studio GCC ima standardnu ​​biblioteku za rad sa EEPROM-om, koja je omogućena povezivanjem datoteke . Glavne funkcije su eeprom_read_byte(), eeprom_write_byte(), eeprom_read_word(), eeprom_write_word(). Na primjer, napišimo program za mini brojač od 0 do 9, gdje kada pritisnete jedno dugme, dodaje se vrijednost, a drugo dugme čuva ovu vrijednost u memoriji. Atmega8 mikrokontroler radi od internog generatora takta sa frekvencijom od 8 MHz. Jednocifreni sedmosegmentni indikator sa zajedničkom anodom povezan je na port B preko otpornika za ograničavanje struje R1-R7, zajednička anoda je povezana na napajanje plus. Dijagram je prikazan ispod:

Prvo povezujemo biblioteke potrebne za rad, uključujući EEPROM. Definirajte varijable. Varijabla "s" pohranjuje vrijednost za prikaz na indikatoru; kada pritisnete dugme SB1, ova vrijednost se povećava za jedan, ali ne više od 10. Varijabla eeprom_var će stupiti u interakciju sa EEPROM-om. Kada je napajanje uključeno, EEPROM se čita, očitani podaci se dodeljuju varijabli „s“, na osnovu toga, određeni broj se prikazuje na indikatoru. Kada pritisnete SB2, podaci iz varijable “s” se upisuju u EEPROM, a indikator treperi jednom.

#include #include #include #define d0 ~(0x3F) // 0 #define d1 ~(0x06) // 1 #define d2 ~(0x5B) // 2 #define d3 ~(0x4F) // 3 #define d4 ~(0x66) // 4 #define d5 ~(0x6D) // 5 #define d6 ~(0x7D) // 6 #define d7 ~(0x07) // 7 #define d8 ~(0x7F) // 8 #define d9 ~(0x6F) // 9 unsigned char s; unsigned char eeprom_var EEMEM; // definiraj varijablu u EEPROM-u int main (void) ( DDRB = 0xFF; // Port B za izlaz PORTB = 0xFF; DDRD = 0x00; // Port D za ulaz PORTD = 0xFF; // Uključi pull-up otpornike s = eeprom_read_byte(&eeprom_var ); // čitamo bajt iz EEPROM-a i stavljamo ga u "s" while(1) ( if((PIND&(1<< PD0)) == 0) // если кнопка SB1 нажата { while((PIND&(1 << PD0)) == 0){} // ждем отпускания кнопки s++; // увеличиваем "s" на единицу _delay_ms(200); } if(s == 10) // Когда дойдет до 10 обнуляем "s" { s = 0; } if((PIND&(1 << PD1)) == 0) // если кнопка SB2 нажата { while((PIND&(1 << PD1)) == 0){} // ждем отпускания кнопки DDRB = 0xFF; // мигаем индикатором _delay_ms(200); DDRB = 0x00; _delay_ms(200); DDRB = 0xFF; eeprom_write_byte(&eeprom_var, s); // записываем "s" в EEPROM _delay_ms(200); } if(s==0) // Выводим цифры на индикатор PORTB = d0; if(s==1) PORTB = d1; if(s==2) PORTB = d2; if(s==3) PORTB = d3; if(s==4) PORTB = d4; if(s==5) PORTB = d5; if(s==6) PORTB = d6; if(s==7) PORTB = d7; if(s==8) PORTB = d8; if(s==9) PORTB = d9; } }

Komentari

0 AntonChip 5/02/2013 22:15

Citiram Maxa:

Mozda nesto zbunjujem,ali ako imate indikator sa OA onda je dovoljan jedan otpornik na liniji 5V.Zasto postavljati strujno ogranicene otpornike posle elementa koji bi trebalo da zastite od velike struje??


Zamislite samo što će se dogoditi ako se jedan segment indikatora zatvori ovom i drugom šemom povezivanja otpornika.

0 AntonChip 15.05.2013 11:16

Citiram gydoka:

Kako napisati dvodimenzionalni niz u eeprom?


kod:
#include // Uključuje biblioteku

EEMEM unsigned char colors=((1, 2, 3), // Deklarirajte niz u EEPROM-u
{4, 5, 6}};

eeprom_write_byte(&colors, 1); // Upisuje elemente niza u EEPROM
eeprom_write_byte(&colors, 2);
eeprom_write_byte(&colors, 3);
eeprom_write_byte(&colors, 4);
eeprom_write_byte(&colors, 5);
eeprom_write_byte(&colors, 6);

unsigned char temp;
temp = eeprom_read_byte(&colors); // Izdvoji element niza iz EEPROM-a, 2nd row(), 1st column(), tj. broj 4

Resetiranje EEPROM memorije

Primjer prolazi kroz sve memorijske ćelije i upisuje nule u njih.

// Povezivanje biblioteke za rad sa EEPROM-om. #include "EEPROM.h" void setup() ( // Prođite kroz sve ćelije (bajtove) i upišite nule u njih. for (int i = 0; i< EEPROM.length(); i++) EEPROM.update(i, 0); } void loop() { // Пустой цикл... }


Factory reset

Ako želite da vratite memoriju na fabrička podešavanja, potrebno je da 0 zamijenite sa 255, tj. pisati ne nule, već broj 255. Tako je u budućnosti, koristeći isNaN() funkciju, moguće provjeriti da li je upis u EEPROM memoriju obavljen ili ne.

// Povezivanje biblioteke za rad sa EEPROM-om. #include "EEPROM.h" void setup() ( // Prođite kroz sve ćelije (bajtove) i upišite brojeve 255 u njih. for (int i = 0; i< EEPROM.length(); i++) EEPROM.update(i, 255); } void loop() { // Пустой цикл... }

Recite nam nešto o nama

Poruka

Ukoliko imate iskustva u radu sa Arduinom i zaista imate vremena za kreativnost, pozivamo sve da postanu autori članaka objavljenih na našem portalu. To mogu biti ili lekcije ili priče o vašim eksperimentima s Arduinom. Opis raznih senzora i modula. Savjeti i upute za početnike. Pišite i postavljajte svoje članke na