Kaj je pomnilniški čip in kako programirati mikrovezja. Kako počistiti EEPROM (obstojni pomnilnik) z uporabo pomnilnika eeprom

Zadnjič, ko sem pisal svoj "podroben odgovor na vprašanje" o tem, kako narediti varnostno kopijo firmware-a iz Mega, so mi očitali, da nisem omenil varnostne kopije EEPROM-a. Takrat tega nisem naredila zavestno, ker ... Pravilno sem presodil, da v fazi začetnega "približevanja projektilu" ni treba vsega komplicirati. Dejstvo je, da ni vsakomur očitno, da se EEPROM ne utripa pri prevajanju in nalaganju vdelane programske opreme iz Arduino IDE. To pomeni, da se popolnoma nič ne naloži v EEPROM, ko se vdelana programska oprema naloži iz IDE. In manipulacije z EEPROM (če je njegova uporaba sploh omogočena v vdelani programski opremi) se izvajajo na povsem drugi ravni. In zato za varnostno kopiranje gole vdelane programske opreme brez fine nastavitve, ki se MOGOČE (samo morda) lahko shrani v EEPROM, je bilo čisto dovolj, da se shrani le goli firmware. Ampak, ker se je pojavilo vprašanje, zakaj ga ne bi "prežvečili". Pojdimo skozi to po vrsti. Kaj je EEPROM in zakaj o njem govoriti?
EEPROM - (Electrically Erasable Programmable Read-Only Memory) področje obstojnega pomnilnika mikrokontrolerja, v katerega je mogoče zapisovati in brati informacije. Pogosto se uporablja za shranjevanje programskih nastavitev, ki se lahko spremenijo med delovanjem in jih je treba shraniti, ko je napajanje izklopljeno.

Kako 3D tiskalnik uporablja EEPROM?
Oglejmo si Marlin kot primer. V Marlin Firmware takoj po namestitvi se EEPROM ne uporablja. Parametri konfiguratorja (Configuration.h), ki vključujejo možnost uporabe, so privzeto zakomentirani.

#define EEPROM_SETTINGS
#define EEPROM_CHITCHAT

Če je omogočena uporaba EEPROM-a, lahko tiskalnik shrani in uporablja naslednje nastavitve (določene iz buržoazije):

  • Število korakov na milimeter
  • Največja/najmanjša hitrost podajanja [mm/s]
  • Največji pospešek [mm/s^2]
  • Pospešek
  • Pospešek med umikom
  • Nastavitve PID
  • Odmik domačega položaja
  • Najmanjša hitrost podajanja med premikanjem [mm/s]
  • Najmanjši čas odseka [ms]
  • Skok največje hitrosti osi X-Y[mm/s]
  • Največji skok hitrosti v osi Z [mm/s]
Te nastavitve lahko urejate z zaslonom tiskalnika in kontrolniki. Ko je omogočena uporaba EEPROM-a, bi moral meni prikazati naslednje elemente:
  • Shranite spomin
  • Naloži pomnilnik
  • Obnovi Failsafe
GCode lahko uporabite tudi za neposredno delo (prek Pronterface).
  • M500 Shrani trenutne nastavitve v EEPROM do naslednjega zagona ali ukaza M501.
  • M501 Prebere nastavitve iz EEPROM-a.
  • M502 Ponastavi nastavitve na privzete vrednosti, določene v Configurations.h. Če za njim izvedete M500, bodo privzete vrednosti vnesene v EEPROM.
  • M503 Prikaže trenutne nastavitve - ""Tiste, posnete v EEPROM.""
O EEPROM-u lahko preberete v vdelani programski opremi Repitier.

Kako brati in pisati podatke v EEPROM?
Podobno metodi, opisani v metodi varnostnega kopiranja vdelane programske opreme z uporabo ključa -U. Samo v tem primeru bo za njim kazalec, ki označuje, da je treba prebrati EEPROM.

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

Ta ukaz prebere podatke EEPROM v datoteko "printer_eeprom.eep". Če je uspešen, boste na zaslonu videli nekaj podobnega naslednjemu.

Snemanje tudi ni zapleteno in se izvaja s podobnim ukazom, ki se razlikuje le v ključu -U Ni "r", ampak "w".

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

Če uspe, boste na zaslonu videli nekaj podobnega naslednjemu sporočilu.

Kako in zakaj izbrisati EEPROM?
Za začetek, "zakaj to storiti?" EEPROM morate izbrisati, če ga je uporabljala tudi prejšnja vdelana programska oprema in je lahko v pomnilniku ostala smeti. Nekje sem že naletel na ljudi s težavami, da se je njihov tiskalnik po prehodu z enega firmware-a na drugega (z Marlina na Repitier EMNIP) začel obnašati tako rekoč “kreativno”. To je posledica dejstva, da različna vdelana programska oprema shranjuje svoje podatke pod različne naslove. In ko poskušate prebrati podatke z napačnega naslova, se začne pandemonij.
EEPROM lahko izbrišete samo programsko iz vdelane programske opreme, vendar boste za to morali začasno naložiti posebno skico v krmilnik. Več o tem lahko preberete v uradni dokumentaciji Arduino.
Če je EEPROM izbrisan, ni v Arduino plošča, v nekaterih abstraktnih krmilnikih pa bo treba kodo skice spremeniti ob upoštevanju velikosti EEPROM-a v določenem krmilniku na plošči. Če želite to narediti, boste morali spremeniti končni pogoj v zanki "Za". Na primer, za ATmega328, ki ima 1 kb pomnilnika EEPROM, bo cikel videti takole:
Zaključek.
Že kar nekaj časa blodim, ampak čemu vse to? Da bi prišli do zaključka, da se pri varnostnem kopiranju firmware-a lahko shrani tudi EEPROM, vendar le, če potrebujete nastavitve, shranjene v njem. Če ste jih pripravljeni žrtvovati, potem pozabite na to. Tudi če spremenite eno vdelano programsko opremo v drugo ali preklopite z ene različice na drugo, ne bodite leni in počistite EEPROM pred nalaganjem nova strojna programska oprema. No, hkrati pa smo izvedeli veliko novega.

Naš krmilnik peči je že skoraj pripravljen - vendar za zdaj ostaja krmilnik "zlate ribice", ki si vse nastavitve zapomni le pet minut pred prvim izklopom. Če si želite zapomniti naše nastavitve, vrednost nastavljene temperature in kalibracijske točke tudi po izklopu napajanja, morate uporabiti obstojni pomnilnik - EEPROM.
Naši prijatelji so zelo dobro pisali o delu z EEPROM.

Glavna stvar, ki jo moramo vedeti, je, da EEPROM pomnilnik Bolje je, da ga ne obravnavamo kot "samo pomnilnik", ampak kot ločeno notranjo napravo v čipu.
EEPROM ločen naslovni prostor, ki nima nobene zveze z naslovnim prostorom procesorja (FLASH in SRAM); če želite dostopati do podatkov na določenem naslovu v obstojnem pomnilniku, morate izvesti določeno zaporedje dejanj z uporabo številnih registrov (naslovna registra EEARH in EEARL, podatkovni register EEDR in kontrolni register EECR).
V skladu s podatkovnim listom morate za pisanje bajta na določen naslov v EEPROM narediti naslednje:

  1. počakajte, da je EEPROM pripravljen za zapisovanje podatkov (bit EEPE registra EECR se ponastavi);
  2. počakajte na konec pisanja v pomnilnik FLASH (ponastavitev bita SELFPRGEN registra SPMCSR) - to je treba storiti, če je v programu prisoten zagonski nalagalnik;
  3. zapisati nov naslov v register EEAR (če je potrebno);
  4. zapisati podatkovni bajt v register EEDR (če je potrebno);
  5. nastavite bit EEMPE registra EECR na ena;
  6. v štirih taktih po nastavitvi zastavice EEMPE zapišemo logično enoto v bit EEPE registra EECR.

Procesor nato preskoči 2 takta, preden izvede naslednji ukaz.
Drugo točko je treba izvesti, če je v programu zagonski nalagalnik - dejstvo je, da pisanja v EEPROM ni mogoče izvajati hkrati s pisanjem v pomnilnik FLASH, zato se morate pred pisanjem v EEPROM prepričati, da je programiranje pomnilnika FLASH končano; če mikrokrmilnik nima zagonskega nalagalnika, potem nikoli ne spreminja vsebine pomnilnika FLASH (ne pozabite, da ima avr arhitekturo Harvard: programski pomnilnik (FLASH) in podatkovni pomnilnik (SRAM) sta ločena).
Trajanje snemalnega cikla je odvisno od frekvence notranjega RC oscilatorja čipa, napajalne napetosti in temperature; običajno za modele ATmega48x/88x/168x je to 3,4 ms (!), za nekatere starejše modele – 8,5 ms (!!!).
Poleg tega se lahko pri pisanju v EEPROM pojavijo težave s klicanjem prekinitev med izvajanjem zaporedja dejanj zgoraj - zato je bolje onemogočiti prekinitve med pisanjem v EEPROM.
Branje obstojnega pomnilnika je nekoliko preprostejše:

  1. počakajte, da bo EEPROM pripravljen za branje podatkov (bit EEWE registra EECR se ponastavi);
  2. vpišite naslov v register EEAR;
  3. nastavite bit EERE registra EECR na ena;
  4. beremo podatke iz registra EEDR (dejansko, ko se zahtevani podatki premaknejo v register podatkov, se zgodi trda ponastavitev bit EERE; vendar ni potrebe po spremljanju stanja tega bita, saj se operacija branja iz EEPROM-a vedno izvede v enem taktu).

Po nastavitvi bita v EERE na ena procesor preskoči 4 takte pred izvedbo naslednjega ukaza.
Kot vidimo, delo z obstojni pomnilnik– postopek je dolgotrajen; če pogosto pišemo in beremo podatke iz EEPROM-a, se lahko program začne upočasnjevati.

Vendar pa pišemo program v okolju IAR in imamo srečo: vse delo z branjem in pisanjem iz EEPROM-a bo opravilo razvojno okolje - iar ima modifikator "__eeprom", ki ustvarja spremenljivke v obstojnem pomnilniku - in takrat bomo morali samo prebrati iz "trajnih" spremenljivk v "trenutne" (pri inicializaciji krmilnika) ali pisati iz "trenutnih" spremenljivk v "konstantne" - to je, ko se trenutna vrednost spremeni, vrednost spremeniti je treba tudi spremenljivko v obstojnem pomnilniku.
Nove spremenljivke bodo videti takole:

Eeprom uint16_t EEP_MinTemperature;

Še nekaj splošnih besed: in čeprav ne predvidevamo kazalcev na spremenljivke eeprom, se moramo spomniti, da je eeprom ločen naslovni prostor, in če želimo ustvariti kazalec na eeprom (in prevajalnik nam to omogoča), moramo mora navesti, da je to kazalec na naslov v eepromu:

Uint16_t __eeprom *EEP_MinTemperatureAdr;

Vrnimo se k krmilniku peči in EEPROM-u. V našem primeru ni EEPROM-a navidezni stroj, seveda ni pričakovati; Poleg tega je vredno razmisliti, ali je za delo z obstojnim pomnilnikom potrebna ločena knjižnica - preveč so "razpršene" po snemalnem programu pomembne nastavitve; če poskušate narediti ločeno knjižnico, boste morali narediti navzkrižne reference: v knjižnici za EEPROM povežite knjižnice ADC, grelnega elementa in globalnih nastavitev; in v teh perifernih knjižnicah povezovanje knjižnice EEPROM ni zelo dober pristop.
Druga možnost je, da dodate spremenljivko eeprom v vsako knjižnico, kjer morate shraniti nastavitve, in shranite ustrezne nastavitve neposredno v virtualni stroji. To možnost bomo izvedli.
Najprej naštejmo, katere spremenljivke moramo shraniti v EEPROM:

  1. kalibracijske točke
  2. vrednosti najvišje-minimalne nastavljene temperature in koraka nastavitve temperature
  3. nastavljena vrednost temperature
  4. Koeficienti PID regulatorja

Vrednosti kuhinjskega časovnika ne shranjujemo - predvidevali bomo, da mora uporabnik nastaviti časovnik štedilnika vsakič po izklopu električnega toka.
Vse te nastavitve nastavi uporabnik z vrtenjem kodirnika in nato s kratkim pritiskom na uporabniško tipko. Ob tem se spomnimo, da je število bralno-pisalnih ciklov EEPROM-a še vedno omejeno, zato istih informacij ne prepisujte znova (na primer, če je uporabnik izbral enako vrednost neke nastavitve, kot je bila). Zato pred vsako spremembo spremenljivke __eeprom preverimo, ali jo je treba prepisati:

//če se je vrednost spremenila, jo prepišite v obstojnem pomnilniku if (ADCTemperature.atMinTemperatureValue != (uint16_t)VMEncoderCounter.ecntValue) ( ​​​​ADCTemperature.atMinTemperatureValue = (uint16_t)VMEncoderCounter.ecntValue; EEP_MinTemperature = ADCTemperature.at Najmanjša vrednost temperature; )

Tudi branje nastavitev iz EEPROM-a je preprosto - pri inicializaciji "trenutnih" nastavitev preprosto preberemo vrednost iz obstojnega pomnilnika:

ADCTemperature.atMinTemperatureValue = EEP_MinTemperature;

Da bi imela naša naprava nekaj nastavitev v EEPROM-u že od samega začetka, lahko projekt za prvi zagon prevedemo s temi inicializiranimi spremenljivkami:

Eeprom uint16_t EEP_MinTemperature = 20; ... //matrika za shranjevanje kalibracijskih točk v obstojnem pomnilniku __eeprom TCalibrationData EEP_CalibrationData = ((20, 1300), (300, 4092));

V tem primeru prevajalnik inicializira spremenljivke __eeprom, preden začne delati z glavno funkcijo. Če želite pridobiti datoteko s trajnim pomnilnikom (.eep), morate iti v naslednje nastavitve:
Projekt->Možnosti..->Povezovalnik->Dodatne možnosti
Če potrditveno polje »Uporabi možnosti ukazne vrstice« ni potrjeno, ga označite in dodajte vrstico
-Ointel-standard,(XDATA)=.eep
Najprej prevedemo projekt z inicializiranimi spremenljivkami, datoteko eep ​​shranimo posebej; potem odstranimo inicializacijo pri ustvarjanju spremenljivk.

To je vse - naša peč je pripravljena!

Arduino je cela družina razne naprave za izdelavo elektronskih projektov. Mikrokontrolerji so zelo priročni za uporabo in jih je enostavno naučiti tudi začetnik. Vsak mikrokontroler je sestavljen iz plošče, programov za delovanje in pomnilnika. Ta članek bo obravnaval obstojni pomnilnik, ki se uporablja v Arduinu.

Opis pomnilnika EEPROM

Arduino svojim uporabnikom ponuja tri vrste vgrajenega pomnilnika naprave: stacionarni RAM (pomnilnik z naključnim dostopom ali SRAM - statični pomnilnik z naključnim dostopom) - potreben za snemanje in shranjevanje podatkov med uporabo; flash kartice – za shranjevanje že posnetih vzorcev; – za shranjevanje in kasnejšo uporabo podatkov.

Vsi podatki v RAM-u se izbrišejo takoj, ko napravo znova zaženete ali izklopite. Druga dva shranita vse informacije pred prepisovanjem in vam omogočata, da jih po potrebi prikličete. Flash diski so danes precej pogosti. Vredno je podrobneje razmisliti o pomnilniku EEPROM.

Okrajšava pomeni Electrically Erasable Programmable Read-Only Memory in prevedena v ruščino dobesedno pomeni električno izbrisljiv programabilni pomnilnik samo za branje. Proizvajalec zagotavlja varnost informacij več desetletij po zadnjem izpadu električne energije (običajno je navedeno obdobje 20 let, odvisno od hitrosti upadanja napolnjenosti naprave).

Vendar morate vedeti, da je možnost prepisovanja v napravo omejena in ni več kot 100.000-krat. Zato je priporočljivo biti previden in pozoren na vnesene podatke ter jih ne prepisovati ponovno.

Količina pomnilnika je v primerjavi s sodobnimi mediji zelo majhna in se razlikuje za različne mikrokontrolerje. Na primer za:

  • ATmega328 – 1kB
  • ATmega168 in ATmega8 – 512 bajtov,
  • in ATmega1280 – 4 kB.

Zasnovan je tako, ker je vsak mikrokrmilnik zasnovan za točno določen obseg opravil, ima različno število pinov za priklop in temu primerno zahteva različno količino pomnilnika. Poleg tega ta znesek zadostuje za skupno ustvarjene projekte.

Zapisovanje v EEPROM zahteva veliko časa - pribl. 3 ms. Če med snemanjem izklopite napajanje, se podatki sploh ne bodo shranili ali pa bodo morda napačno posneti. Vedno je potrebno dodatno preveriti vnesene podatke, da preprečimo napake med delovanjem. Branje podatkov je veliko hitrejše, pomnilniški vir pa se ne zmanjša.

Knjižnica

Delo s pomnilnikom EEPROM se izvaja s knjižnico, ki je bila ustvarjena posebej za Arduino. Glavne so zmožnost pisanja in branja podatkov. aktiviran z ukazom #vključi EEPROM.h.

  • Za zapisi– EEPROM.write(naslov, podatki);
  • Za branje– EEPROM.branje(naslov).

Na teh skicah: naslov – argument s podatki celice, kjer so vpisani podatki drugega argumenta; pri branju se uporablja en argument, naslov, ki označuje, od kod naj se informacija prebere.

funkcija Namen
branje (naslov) prebere 1 bajt iz EEPROM-a; naslov – naslov, s katerega se berejo podatki (celica se začne z 0);
napiši (naslov, vrednost) zapiše vrednost (1 bajt, število od 0 do 255) v pomnilnik na naslovu;
posodobitev (naslov, vrednost) zamenja vrednost na naslovu, če se njegova stara vsebina razlikuje od nove;
pridobi (naslov, podatki) prebere podatke določene vrste iz pomnilnika na naslovu;
daj (naslov, podatki) zapiše podatke podane vrste v pomnilnik na naslovu;
EEPROM vam omogoča uporabo identifikatorja "EEPROM" kot polja za zapisovanje podatkov in branje iz pomnilnika.

Pisanje celih števil

Zapisovanje celih števil v obstojni pomnilnik EEPROM je precej preprosto. Vnos številk se izvede, ko se funkcija zažene EEPROM.write(). Zahtevani podatki so navedeni v oklepajih. V tem primeru se števila od 0 do 255 in števila nad 255 zapišejo drugače. Prve se vnesejo preprosto - njihova prostornina zavzame 1 bajt, to je eno celico. Za pisanje slednjega morate uporabiti operatorja highByte() za najvišji bajt in lowByte() za najnižji bajt.

Število je razdeljeno na bajte in zapisano ločeno v celicah. Na primer, število 789 bo zapisano v dveh celicah: prva bo vsebovala faktor 3, druga pa manjkajočo vrednost. Rezultat je zahtevana vrednost:

3 * 256 + 21 = 789

Za « ponovno združitev« velja veliko celo število besedna funkcija(): int val = beseda (hi, nizko). Prebrati morate, da je največje celo število za snemanje 65536 (to je 2 na potenco 16). V celicah, ki še niso imele drugih vnosov, bo monitor prikazal številke 255 v vsaki.

Pisanje števil in nizov s plavajočo vejico

Številke s plavajočo vejico in nizi so oblika zapisa realnih števil, kjer so predstavljena z mantiso in eksponentom. Takšne številke se z aktiviranjem funkcije zapišejo v obstojni pomnilnik EEPROM EEPROM.put(), branje oziroma, – EEPROM.get().

Pri programiranju so številske vrednosti s plavajočo vejico označene kot float; treba je omeniti, da to ni ukaz, ampak število. Vrsta znaka (vrsta znaka) – uporablja se za predstavitev nizov. Postopek zapisovanja številk na monitor se zažene z uporabo setup(), branje - z uporabo loop().

Med postopkom se lahko na zaslonu monitorja prikažeta vrednosti ovf, kar pomeni "prenapolnjeno" in nan, kar pomeni "manjkajoče". številčna vrednost" To pomeni, da informacij, zapisanih v celico, ni mogoče reproducirati kot število s plavajočo vejico. Do te situacije ne bo prišlo, če zanesljivo veste, v kateri celici je zapisana vrsta informacije.

Primeri projektov in skic

Primer št. 1

Skica bo zapisala do 16 znakov iz serijskih vrat in izpisala 16 znakov iz EEPROM-a v zanki. Zahvaljujoč temu se podatki zapisujejo v EEPROM in spremljajo vsebino obstojnega pomnilnika.

// preverite delovanje EEPROM #include int i, d; void setup() ( Serial.begin(9600); // inicializacija vrat, hitrost 9600 ) void loop() ( // branje EEPROM in izhod 16 podatkov v serijska vrata Serial.println(); Serial.print("EEPROM = "); i= 0; medtem ko(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); }

Primer št. 2

Za boljše razumevanje lahko ustvarimo majhno skico, ki bo pomagala razumeti, kako delati z obstojnim pomnilnikom. Preštejemo vse celice tega spomina. Če celica ni prazna - izhod v serijska vrata. Nato celice napolnite s presledki. Nato vnesemo besedilo prek monitorja serijskih vrat. Zapišemo ga v EEPROM in preberemo ob naslednjem vklopu.

#vključi int naslov = 0; // naslov eeprom int read_value = 0; // podatki prebrani iz eeproma char serial_in_data; // podatki serijskih vrat int led = 6; // vrstica 6 za LED int i; void setup() ( pinMode(led, OUTPUT); // vrstica 6 je konfigurirana kot izhod Serial.begin(9600); // hitrost prenosa na serijskih vratih 9600 Serial.println(); Serial.println("PREJŠNJE BESEDILO V EEPROM-u : -"); for(naslov = 0; naslov< 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); }

Primer št. 3

Zapiše dve celi števili v pomnilnik, ju prebere iz EEPROM-a in ju pošlje v serijska vrata. Številke od 0 do 255 zasedejo 1 bajt pomnilnika z uporabo funkcije EEPROM.write() se zapišejo v želeno celico. Za števila, večja od 255, jih je treba razdeliti v bajte z uporabo highByte() in lowByte() in zapišite vsak bajt v svojo celico. Največje število v tem primeru je 65536 (ali 2 16).

#vključi // poveži knjižnico EEPROM void setup() ( int smallNum = 123; // celo število od 0 do 255 EEPROM.write(0, smallNum); // zapiši številko v celico 0 int bigNum = 789; // razdeli številko > 255 x 2 bajta (največ 65536) bajt hi = highByte(bigNum); // visoki bajt bajt low = lowByte(bigNum); // nizki bajt EEPROM.write(1, hi); // zapis visokega bajta EEPROM-a v celico 1 .write(2, low); // zapišite nizki bajt v celico 2 Serial.begin(9600); // inicializirajte serijska vrata ) 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 мин }

Primer št. 4

Zapis števil in nizov s plavajočo vejico - metoda EEPROM.put(). Branje – EEPROM.get().

#vključi // poveži knjižnico void setup() ( int addr = 0; // naslov float f = 3.1415926f; // število s plavajočo vejico (tip float) EEPROM.put(addr, f); // zapiši številko f v naslov addr addr += sizeof(float); // izračunajte naslednjo prosto pomnilniško celico char name = "Pozdravljeni, SolTau.ru!"; // ustvarite niz znakov EEPROM.put(addr, name); // zapišite niz v EEPROM Serial.begin (9600); // inicializacija serijskih vrat ) 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 минуту }

Primer št. 5

Uporaba EEPROM-a kot polja.

#vključi void setup() ( EEPROM = 11; // zapis 1. celice EEPROM = 121; // zapis 2. celice EEPROM = 141; // zapis 3. celice EEPROM = 236; // zapis 4. celice 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); }

Delo z EEPROM

Kot smo že omenili, je pomnilnik EEPROM omejen. Za podaljšanje življenjske dobe obstojnega pomnilnika je namesto funkcije write() bolje uporabiti funkcijo posodobitve. V tem primeru se prepis izvede samo za tiste celice, kjer se vrednost razlikuje od na novo zapisane.

Druga uporabna funkcija zadevnega pomnilnika mikrokrmilnika je zmožnost uporabe celic za shranjevanje bajtov kot delov integralnega polja EEPROM. Pri vsakem formatu uporabe je potrebno stalno spremljanje celovitosti zapisanih podatkov.

Tak pomnilnik na Arduinu standardno hrani najpomembnejše za delovanje krmilnika in naprave. Na primer, če je regulator temperature ustvarjen na takšni podlagi in se začetni podatki izkažejo za napačne, bo naprava delovala "neustrezno" obstoječim pogojem - močno bo podcenila ali precenila temperaturo.

Obstaja več primerov, ko EEPROM vsebuje napačne podatke:

  1. Ob prvi aktivaciji še ni bilo vnosov.
  2. Med nenadzorovanim izpadom električne energije nekateri ali vsi podatki ne bodo zabeleženi ali pa bodo zabeleženi nepravilno.
  3. Po zaključku možnih ciklov prepisovanja podatkov.

Da bi se izognili neprijetnim posledicam, lahko napravo programirate za več možnosti delovanja: uporabite podatke kode za nujne primere, popolnoma izklopite sistem, signalizirajte okvaro, uporabite predhodno ustvarjeno kopijo ali druge.

Za nadzor celovitosti informacij se uporablja sistemska nadzorna koda. Ustvari se na podlagi izvirnega zapisa podatkov in ob preverjanju ponovno izračuna podatke. Če je rezultat drugačen, je to napaka. Najpogostejša različica takega preverjanja je kontrolna vsota - izvede se preprosta matematična operacija za seštevanje vseh vrednosti celic.

Izkušeni programerji tej kodi dodajo dodaten "izključni ALI", na primer E5h. Če so vse vrednosti enake nič in je sistem pomotoma ponastavil prvotne podatke, bo ta trik razkril napako.

To so osnovni principi dela z obstojnim pomnilnikom EEPROM za mikrokontrolerje Arduino. Za določene projekte se splača uporabljati samo to vrsto pomnilnika. Ima tako svoje prednosti kot slabosti. Če želite obvladati metode pisanja in branja, je bolje začeti s preprostimi nalogami.

Vsi mikrokrmilniki družine Mega vključujejo obstojni pomnilnik ( EEPROM spomin). Prostornina tega pomnilnika sega od 512 bajtov pri modelih ATmega8x do 4 KB pri starejših modelih. EEPROM pomnilnik se nahaja v lastnem naslovnem prostoru in je tako kot RAM organiziran linearno. Za delo EEPROM Pomnilnik uporablja tri V/I registre: naslovni register, podatkovni register in kontrolni register.

Naslovni register

Naslovni register EEPROM spomin EEAR (register naslovov EEPROM) fizično nahajajo v dveh RVV EEARH:EEARL, ki se nahaja ob
naslovi $1F ($3F) oziroma $1E ($3E). Ta register je naložen z naslovom celice, do katere bo dostopen. Naslovni register je berljiv in zapisljiv. Hkrati pa v registru EEARH uporabljeni so le najmanj pomembni biti (število vključenih bitov je odvisno od glasnosti EEPROM spomin). Neuporabljeni registrski biti EEARH so samo za branje in vsebujejo "0".

Register podatkov

Register podatkov EEPROM spomin EEDR (register podatkov EEPROM) ki se nahaja na $1D ($3D). Pri zapisovanju v ta register se naložijo podatki, ki jih je treba vnesti EEPROM, pri branju pa prebrani podatki iz EEPROM.

Nadzorni register

Nadzorni register EEPROM spomin EECR (kontrolni register EEPROM) ki se nahaja na $1C ($3C). Ta register se uporablja za
nadzor dostopa EEPROM spomin. Njegov opis je prikazan v spodnji tabeli:

praznjenje Ime Opis
7..4 - ni uporabljeno, beri kot "0"
3 JEZIČNO Omogoči prekinitev iz EEPROM-a. Ta bit nadzoruje generiranje prekinitve, ki se pojavi, ko je cikel pisanja EEPROM končan. Če je ta bit nastavljen na "1", so prekinitve omogočene (če je zastavica I registra
SREG je tudi nastavljen na "1"). Ko je bit EEWE počiščen (glejte nadaljevanje v
tabela) se prekinitev generira stalno
2 EEMWE Nadzor dovoljenja za pisanje v EEPROM. Stanje tega bita določa delovanje zastavice za omogočanje pisanja EEWE. Če je ta bit nastavljen na "1", potem se pri pisanju v EEWE bit "1" podatki zapišejo v EEPROM. V nasprotnem primeru nastavitev EEWE na "1" nima učinka. Po namestitvi programske opreme bit EEMWE ponastavi strojna oprema prek
4 strojni cikli
1 EEWE Dovoli pisanje v EEPROM. Ko je ta bit nastavljen na "1", se podatki zapišejo v EEPROM (če je EEMWE enak "1")
0 EERE Dovoljenje za branje iz EEPROM-a. Po nastavitvi tega bita na "1" se podatki preberejo iz EEPROM-a. Po končanem branju strojna oprema ponastavi ta bit

Za zapis enega bajta v EEPROM potrebujete:

1. Počakajte, da bo EEPROM pripravljen za pisanje podatkov (počakajte, da se zastavica EEWE registra EECR ponastavi).

2. Počakajte na zaključek pisanja v programski pomnilnik FLASH (počakajte, da se zastavica SPMEN registra SPMCR ponastavi).

3. Naložite podatkovni bajt v register EEDR in zahtevani naslov v register EEAR (če je potrebno).

4. Nastavite zastavico EEMWE registra EECR na "1".

5. Zapišite dnevnik v bit EEWE registra EECR. "1" za 4 strojne cikle. Po namestitvi tega bita se procesor
preskoči 2 strojna cikla pred izvedbo naslednjega ukaza.

Za branje enega bajta iz EEPROM-a potrebujete:

1. Preverite stanje zastavice EEWE. Dejstvo je, da med izvajanjem pisalne operacije v pomnilnik EEPROM (nastavljena je zastavica EEWE) ni mogoče izvesti niti branja pomnilnika EEPROM niti spreminjanja naslovnega registra.

2. Naložite zahtevani naslov v register EEAR.

3. Nastavite bit EERE registra EECR na "1".

Ko so zahtevani podatki postavljeni v podatkovni register EEDR, bo prišlo do strojne ponastavitve tega bita. Vendar pa ni potrebno spremljati stanja bita EERE, da bi ugotovili, kdaj je branje zaključeno, saj se branje iz EEPROM-a vedno zaključi v enem strojnem ciklu. Poleg tega po nastavitvi bita EERE na "1" procesor preskoči 4 strojne cikle, preden začne z naslednjim ukazom.

Okolje AVR Studio GCC ima standardno knjižnico za delo z EEPROM, ki jo omogočimo s povezavo datoteke . Glavne funkcije so eeprom_read_byte(), eeprom_write_byte(), eeprom_read_word(), eeprom_write_word(). Na primer, napišimo program za mini števec od 0 do 9, kjer se bo ob pritisku na en gumb dodala vrednost, drugi gumb pa bo to vrednost shranil v pomnilnik. Mikrokrmilnik Atmega8 deluje iz notranjega taktnega generatorja s frekvenco 8 MHz. Enomestni sedemsegmentni indikator s skupno anodo je priključen na vrata B prek tokovno omejevalnih uporov R1-R7, skupna anoda je priključena na napajanje plus. Diagram je prikazan spodaj:

Najprej povežemo knjižnice, potrebne za delovanje, vključno z EEPROM. Določite spremenljivke. Spremenljivka "s" shrani vrednost za prikaz na indikatorju; ko pritisnete gumb SB1, se ta vrednost poveča za eno, vendar ne več kot 10. Spremenljivka eeprom_var bo delovala z EEPROM. Ko je napajanje vklopljeno, se EEPROM prebere, prebrani podatki so dodeljeni spremenljivki "s", na podlagi tega se na indikatorju prikaže določeno število. Ko pritisnete SB2, se podatki iz spremenljivke “s” zapišejo v EEPROM in indikator enkrat utripne.

#vključi #vključi #vključi #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 nepodpisani char s; nepodpisani char eeprom_var EEMEM; // definiranje spremenljivke v EEPROM int main (void) ( DDRB = 0xFF; // Vrata B za izhod PORTB = 0xFF; DDRD = 0x00; // Vrata D za vhod PORTD = 0xFF; // Vklop povlečnih uporov s = eeprom_read_byte(&eeprom_var); // prebere bajt iz EEPROM-a in ga postavi v "s" medtem ko(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; } }

Komentarji

0 AntonChip 5.2.2013 22:15

Citiram Maxa:

Mogoče kaj zamešam, ampak če imaš indikator z OA, potem je dovolj en upor na liniji 5V.Zakaj vgrajevati tokovno omejevalne upore za elementom, ki naj bi ga ščitili pred velikim tokom??


Samo predstavljajte si, kaj se bo zgodilo, če se en segment indikatorja zapre s to in drugo shemo povezovanja upora.

0 AntonChip 15.5.2013 11:16

Citiram gydoka:

Kako zapisati dvodimenzionalno matriko v eeprom?


Koda:
#vključi // Vključi knjižnico

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

eeprom_write_byte(&barve, 1); // Zapis elementov polja v EEPROM
eeprom_write_byte(&barve, 2);
eeprom_write_byte(&barve, 3);
eeprom_write_byte(&barve, 4);
eeprom_write_byte(&barve, 5);
eeprom_write_byte(&barve, 6);

nepredznačena temp.
temp = eeprom_read_byte(&barve); // Ekstrahiraj element polja iz EEPROM-a, 2nd row(), 1st column(), tj. številka 4

Ponastavitev pomnilnika EEPROM

Primer preleti vse pomnilniške celice in vanje zapiše ničle.

// Povezovanje knjižnice za delo z EEPROM. #include "EEPROM.h" void setup() ( // Pojdi skozi vse celice (bajte) in vanje zapiši ničle. for (int i = 0; i< EEPROM.length(); i++) EEPROM.update(i, 0); } void loop() { // Пустой цикл... }


Tovarniška ponastavitev

Če želite pomnilnik vrniti na tovarniške nastavitve, morate 0 zamenjati z 255, tj. ne zapišite ničle, ampak številko 255. Tako je v prihodnosti s funkcijo isNaN() mogoče preveriti, ali je bil zapis v pomnilnik EEPROM opravljen ali ne.

// Povezovanje knjižnice za delo z EEPROM. #include "EEPROM.h" void setup() ( // Pojdite skozi vse celice (bajte) in vanje zapišite številke 255. for (int i = 0; i< EEPROM.length(); i++) EEPROM.update(i, 255); } void loop() { // Пустой цикл... }

Povejte nam o nas

Sporočilo

Če imate izkušnje z Arduinom in dejansko imate čas za ustvarjalnost, vabimo vse, da postanete avtorji člankov, objavljenih na našem portalu. To so lahko lekcije ali zgodbe o vaših poskusih z Arduinom. Opis različnih senzorjev in modulov. Nasveti in navodila za začetnike. Pišite in objavljajte svoje članke na