Čo je pamäťový čip a ako programovať mikroobvody. Ako vymazať EEPROM (nezávislá pamäť) Pomocou pamäte eeprom

Minule, keď som písal moju “podrobnú odpoveď na otázku” ako zálohovať firmware z Mega, mi vyčítali, že som nespomenul zálohu EEPROM. Vtedy som to neurobil vedome, pretože... Správne som usúdil, že vo fáze počiatočného „priblíženia sa k projektilu“ nie je potrebné všetko komplikovať. Faktom je, že nie každému je zrejmé, že EEPROM nie je flashovaná pri kompilácii a nahrávaní firmvéru z Arduino IDE. To znamená, že pri nahrávaní firmvéru z IDE sa do EEPROM nenahráva absolútne nič. A manipulácie s EEPROM (ak je jej použitie vo firmvéri vôbec povolené) sa vykonávajú na úplne inej úrovni. A preto zálohovať holý firmvér bez jemné úpravy, ktorý sa MOŽNO (iba snáď) dá uložiť do EEPROM, úplne stačilo uložiť len holý firmware. Ale keďže vyvstala otázka, prečo to „nežuť“. Poďme si to prejsť po poriadku. Čo je EEPROM a prečo o tom hovoriť?
EEPROM - (Electrically Erasable Programmable Read-Only Memory) oblasť stálej pamäte mikrokontroléra, do ktorej je možné zapisovať a čítať informácie. Často sa používa na uloženie nastavení programu, ktoré sa môžu počas prevádzky zmeniť a musia sa uložiť po vypnutí napájania.

Ako 3D tlačiareň využíva EEPROM?
Pozrime sa na Marlin ako príklad.V Marlin Firmware po vybalení sa EEPROM nepoužíva.Parametre konfigurátora (Configuration.h), ktoré zahŕňajú možnosť jeho použitia, sú štandardne zakomentované.

#define EEPROM_SETTINGS
#define EEPROM_CHITCHAT

Ak je povolené používanie EEPROM, tlačiareň môže ukladať a používať nasledujúce nastavenia (špecifikované od buržoázie):

  • Počet krokov na milimeter
  • Maximálna/minimálna rýchlosť posuvu [mm/s]
  • Maximálne zrýchlenie [mm/s^2]
  • Zrýchlenie
  • Zrýchlenie počas zaťahovania
  • Nastavenia PID
  • Posun domácej pozície
  • Minimálna rýchlosť posuvu počas pohybu [mm/s]
  • Minimálny čas sekcie [ms]
  • Skok maximálnej rýchlosti osi X-Y[mm/s]
  • Maximálna rýchlosť skoku v osi Z [mm/s]
Tieto nastavenia môžete upraviť pomocou obrazovky a ovládacích prvkov tlačiarne. Keď je povolené používanie EEPROM, v ponuke by sa mali zobraziť nasledujúce položky:
  • Uložiť pamäť
  • Načítať pamäť
  • Obnoviť Failsafe
GCode môžete použiť aj na priamu prácu (cez Pronterface).
  • M500 Uloží aktuálne nastavenia do EEPROM až do ďalšieho spustenia alebo príkazu M501.
  • M501 Číta nastavenia z EEPROM.
  • M502 Resetuje nastavenia na predvolené hodnoty špecifikované v Configurations.h. Ak po ňom spustíte M500, do EEPROM sa vložia predvolené hodnoty.
  • M503 Zobrazuje aktuálne nastavenia - ""Tie uložené v EEPROM.""
O EEPROM si môžete prečítať vo firmvéri Repitier.

Ako čítať a zapisovať dáta do EEPROM?
Podobne ako pri metóde opísanej v metóde zálohovania firmvéru pomocou kľúča -U. Iba v tomto prípade sa za ním zobrazí ukazovateľ, ktorý naznačuje, že je potrebné prečítať EEPROM.

avrdude.exe -p atmega2560 -c kabeláž -PCOM5 -b115200 -Ueeprom:r:"printer_eeprom".eep:i

Tento príkaz načíta dáta EEPROM do súboru "printer_eeprom.eep" Ak bude úspešný, na obrazovke uvidíte niečo ako nasledovné.

Nahrávanie tiež nie je zložité a vykonáva sa podobným príkazom, ktorý sa líši len tým v klávese -U Nie je to "r", ale "w".

avrdude.exe -p atmega2560 -c kabeláž -PCOM5 -b115200 -Ueeprom:w:"printer_eeprom".eep:i

Ak bude úspešný, na obrazovke uvidíte niečo ako nasledujúcu správu.

Ako a prečo vymazať EEPROM?
Na začiatok: "Prečo to robíte?" Musíte vymazať EEPROM, ak ju používal aj predchádzajúci firmvér a v pamäti môže zostať odpad. Niekde som už narazil na ľudí s problémami, že po prechode z jedného firmvéru na druhý (z Marlina na Repitier EMNIP) sa ich tlačiareň začala správať takpovediac „kreatívne“. Je to spôsobené tým, že rôzne firmvéry ukladajú svoje údaje pod rôzne adresy. A keď sa pokúsite prečítať údaje z nesprávnej adresy, začne pandemonium.
EEPROM môžete vymazať iba programovo z firmvéru, ale na to budete musieť dočasne nahrať špeciálny náčrt do ovládača. Viac si o tom môžete prečítať v oficiálnej dokumentácii Arduina.
Ak je EEPROM vymazaná, nie je Arduino doska a v niektorých abstraktných ovládačoch bude potrebné zmeniť kód náčrtu s ohľadom na veľkosť EEPROM v konkrétnom ovládači na doske. Ak to chcete urobiť, budete musieť zmeniť podmienku ukončenia v slučke "Pre". Napríklad pre ATmega328, ktorý má 1kb EEPROM pamäť, bude cyklus vyzerať takto:
Záver.
Rozprával som sa už dosť dlho, ale načo to všetko je? Aby sme dospeli k záveru, že pri zálohovaní firmvéru je možné uložiť aj EEPROM, ale iba ak potrebujete nastavenia v nej uložené. Ak ste pripravení ich obetovať, zabudnite na to. Tiež, ak zmeníte jeden firmvér na iný alebo prejdete z verzie na inú, nebuďte leniví a pred nahraním vymažte EEPROM nový firmvér. No zároveň sme sa naučili veľa nových vecí.

Náš ovládač pece je takmer pripravený - zatiaľ však zostáva ovládačom „zlatej rybky“, ktorý si pamätá všetky nastavenia iba päť minút pred prvým vypnutím. Pre zapamätanie si našich nastavení, hodnoty nastavenej teploty a kalibračných bodov aj po vypnutí napájania je potrebné použiť energeticky nezávislú pamäť - EEPROM.
Naši priatelia písali veľmi dobre o práci s EEPROM.

Hlavná vec, ktorú musíme vedieť, je to Pamäť EEPROM Je lepšie to považovať nie za „len pamäť“, ale za samostatné interné zariadenie v čipe.
EEPROM oddelený adresný priestor, ktorý nemá nič spoločné s adresným priestorom procesora (FLASH a SRAM); ak chcete získať prístup k údajom na konkrétnej adrese v energeticky nezávislej pamäti, musíte vykonať určitú postupnosť akcie pomocou množstva registrov (adresové registre EEARH a EEARL, dátový register EEDR a riadiaci register EECR).
Podľa údajového listu, aby ste zapísali bajt na konkrétnu adresu do EEPROM, musíte urobiť nasledovné:

  1. počkajte, kým bude EEPROM pripravená na zapisovanie dát (bit EEPE registra EECR je vynulovaný);
  2. počkajte na ukončenie zápisu do pamäte FLASH (resetovanie bitu SELFPRGEN registra SPMCSR) - treba to urobiť, ak je v programe prítomný bootloader;
  3. zapísať Nová adresa do registra EEAR (ak je to potrebné);
  4. zapísať dátový bajt do registra EEDR (ak je to potrebné);
  5. nastavte bit EEMPE registra EECR na jednu;
  6. do štyroch hodinových cyklov po nastavení príznaku EEMPE zapíšeme do bitu EEPE registra EECR logickú jednotku.

Procesor potom preskočí 2 hodinové cykly pred vykonaním ďalšej inštrukcie.
Druhý bod je potrebné vykonať, ak je v programe bootloader - faktom je, že zápis do EEPROM nemožno vykonávať súčasne so zápisom do pamäte FLASH, takže pred zápisom do EEPROM sa musíte uistiť, že programovanie pamäte FLASH je dokončené; ak mikrokontrolér nemá bootloader, potom nikdy nezmení obsah pamäte FLASH (nezabudnite, že avr má architektúru Harvard: pamäť programu (FLASH) a pamäť údajov (SRAM) sú oddelené).
Trvanie nahrávacieho cyklu závisí od frekvencie vnútorného RC oscilátora čipu, napájacieho napätia a teploty; zvyčajne pre modely ATmega48x/88x/168x je to 3,4 ms (!), pre niektoré staršie modely – 8,5 ms (!!!).
Okrem toho pri zápise do EEPROM môžu nastať problémy s volaním prerušení pri vykonávaní vyššie uvedenej sekvencie akcií – preto je lepšie prerušenia pri zápise do EEPROM zakázať.
Čítanie energeticky nezávislej pamäte je o niečo jednoduchšie:

  1. počkajte, kým bude EEPROM pripravená na čítanie údajov (bit EEWE registra EECR je resetovaný);
  2. napíšte adresu do registra EEAR;
  3. nastavte bit EERE registra EECR na jednu;
  4. čítame údaje z registra EEDR (v skutočnosti sa to stane, keď sa požadované údaje presunú do registra údajov tvrdý reštart bit EERE; ale nie je potrebné sledovať stav tohto bitu, keďže operácia čítania z EEPROM sa vykonáva vždy v jednom hodinovom cykle).

Po nastavení bitu v EERE na jeden procesor preskočí 4 takty pred vykonaním ďalšej inštrukcie.
Ako vidíme, práca s energeticky nezávislá pamäť– proces je časovo náročný; ak často zapisujeme a čítame dáta z EEPROM, program sa môže začať spomaľovať.

Píšeme však program v prostredí IAR a máme šťastie: všetku prácu s čítaním a zápisom z EEPROM vykoná vývojové prostredie - iar má modifikátor „__eeprom“, ktorý vytvára premenné v energeticky nezávislej pamäti - a potom už len budeme musieť čítať z "konštantných" premenných na "aktuálne" (pri inicializácii regulátora), alebo zapisovať z "aktuálnych" premenných do "konštantných" - to znamená, že keď sa zmení aktuálna hodnota, hodnota premenná v energeticky nezávislej pamäti sa musí tiež zmeniť.
Nové premenné budú vyzerať takto:

Eeprom uint16_t EEP_MinTemperature;

Ešte pár všeobecných slov: a hoci nepredpokladáme ukazovatele na premenné eeprom, musíme si uvedomiť, že eeprom je samostatný adresný priestor, a aby sme vytvorili ukazovateľ na eeprom (a kompilátor nám to umožňuje), musíme uveďte, že toto je ukazovateľ na adresu v eeprom:

Uint16_t __eeprom *EEP_MinTemperatureAdr;

Vráťme sa k ovládaču kachlí a EEPROM. V našom prípade neexistuje žiadna EEPROM virtuálny prístroj, samozrejme, sa neočakáva; Okrem toho stojí za zváženie, či je na prácu s energeticky nezávislou pamäťou potrebná samostatná knižnica - sú príliš „roztrúsené“ v nahrávacom programe dôležité nastavenia; ak sa pokúsite vytvoriť samostatnú knižnicu, budete musieť urobiť krížové odkazy: v knižnici pre EEPROM pripojte knižnice ADC, vykurovacieho telesa a globálnych nastavení; a v týchto periférnych knižniciach pripojenie knižnice EEPROM nie je veľmi dobrý prístup.
Ďalšou možnosťou je pridať premennú eeprom do každej knižnice, kde potrebujete uložiť nastavenia, a uložiť príslušné nastavenia priamo do virtuálne stroje. Túto možnosť implementujeme.
Najprv si vypíšme, aké premenné musíme uložiť do EEPROM:

  1. kalibračné body
  2. hodnoty maximálnej a minimálnej nastavenej teploty a kroku nastavenia teploty
  3. nastavenú hodnotu teploty
  4. Koeficienty PID regulátora

Hodnotu kuchynského časovača neukladáme - budeme predpokladať, že používateľ musí nastaviť časovač sporáka vždy po vypnutí napájania.
Všetky tieto nastavenia nastavuje užívateľ otočením enkodéra a následným krátkym stlačením užívateľského tlačidla. Zároveň nezabúdame, že počet cyklov čítania a zápisu EEPROM je stále obmedzený, takže neprepisujte tie isté informácie znova (napríklad ak používateľ zvolil rovnakú hodnotu niektorého nastavenia, ako bola). Preto pred každou zmenou premennej __eeprom skontrolujeme, či ju netreba prepísať:

//ak sa hodnota zmenila, prepíšte ju v energeticky nezávislej pamäti, ak (ADCTemperature.atMinTemperatureValue != (uint16_t)VMEncoderCounter.ecntValue) (ADCTemperature.atMinTemperatureValue = (uint16_t)EPCTere.TemperatureCounter.at. MinTemperatureV hodnota; )

Čítanie nastavení z EEPROM je tiež jednoduché - pri inicializácii „aktuálnych“ nastavení jednoducho načítame hodnotu z energeticky nezávislej pamäte:

ADCTemperature.atMinTemperatureValue = EEP_MinTemperature;

Aby naše zariadenie malo hneď od začiatku nejaké nastavenia v EEPROM, projekt pre prvé spustenie možno skompilovať s inicializovanými týmito premennými:

Eeprom uint16_t EEP_MinTemperature = 20; ... //pole na uloženie kalibračných bodov do energeticky nezávislej pamäte __eeprom TCalibrationData EEP_CalibrationData = ((20, 1300), (300, 4092));

V tomto prípade kompilátor pred začatím práce s hlavnou funkciou inicializuje premenné __eeprom. Ak chcete získať súbor s energeticky nezávislou pamäťou (.eep), musíte prejsť do nasledujúcich nastavení:
Project->Options..->Linker->Extra Options
Ak nie je začiarknuté políčko „Použiť možnosti príkazového riadka“, začiarknite ho a pridajte riadok
-Ointel-standard,(XDATA)=.eep
Najprv skompilujeme projekt s inicializovanými premennými, samostatne uložíme súbor eep; potom pri vytváraní premenných odstránime inicializáciu.

To je všetko - náš sporák je pripravený!

Arduino je celá rodina rôzne zariadenia na vytváranie elektronických projektov. Mikrokontroléry sú veľmi pohodlné na používanie a ľahko sa ich naučí aj začiatočník. Každý mikrokontrolér sa skladá z dosky, programov na obsluhu a pamäte. Tento článok sa bude zaoberať energeticky nezávislou pamäťou používanou v Arduine.

Popis pamäte EEPROM

Arduino poskytuje svojim používateľom tri typy vstavanej pamäte zariadenia: stacionárnu RAM (pamäť s náhodným prístupom alebo SRAM - statická pamäť s náhodným prístupom) - nevyhnutná na zaznamenávanie a ukladanie údajov počas používania; flash karty – na ukladanie už zaznamenaných vzorov; – na uchovávanie a následné použitie údajov.

Všetky údaje v pamäti RAM sa vymažú, akonáhle sa zariadenie reštartuje alebo sa vypne napájanie. Druhé dva ukladajú všetky informácie pred prepísaním a umožňujú vám ich v prípade potreby získať. Flash disky sú v dnešnej dobe celkom bežné. Pamäť EEPROM stojí za zváženie podrobnejšie.

Skratka znamená Electrically Erasable Programmable Read-Only Memory a v preklade do ruštiny doslova znamená elektricky vymazateľná programovateľná pamäť len na čítanie. Výrobca garantuje bezpečnosť informácií niekoľko desaťročí po poslednom výpadku prúdu (zvyčajne sa udáva doba 20 rokov, v závislosti od rýchlosti, akou klesá nabitie zariadenia).

Musíte však vedieť, že možnosť prepisovania na zariadenie je obmedzená a nie je viac ako 100 000-krát. Preto sa odporúča byť opatrný a pozorný na zadávané údaje a znova ich neprepísať.

Množstvo pamäte je v porovnaní s modernými médiami veľmi malé a pre rôzne mikrokontroléry sa líši. Napríklad pre:

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

Je navrhnutý týmto spôsobom, pretože každý mikrokontrolér je navrhnutý pre špecifický objem úloh, má iný počet kolíkov na pripojenie, a preto je potrebné iné množstvo pamäte. Navyše táto suma postačuje na bežne vytvárané projekty.

Zápis do EEPROM vyžaduje značné množstvo času – cca. 3 ms. Ak počas nahrávania vypnete napájanie, údaje sa vôbec neuložia alebo sa môžu zaznamenať nesprávne. Vždy je potrebné dodatočne skontrolovať zadané informácie, aby nedošlo k poruchám počas prevádzky. Čítanie údajov je oveľa rýchlejšie a pamäťový zdroj sa nezníži.

Knižnica

Práca s pamäťou EEPROM sa vykonáva pomocou knižnice, ktorá bola špeciálne vytvorená pre Arduino. Medzi hlavné patrí schopnosť zapisovať a čítať dáta. aktivovaný príkazom #include EEPROM.h.

  • Pre záznamy– EEPROM.write(adresa, údaje);
  • Pre čítanie– EEPROM.read(adresa).

V týchto náčrtoch: adresa – argument s údajmi bunky, do ktorej sa zadávajú údaje druhého argumentu; pri čítaní sa používa jeden argument, adresa, ktorý udáva, odkiaľ sa má informácia čítať.

Funkcia Účel
prečítať (adresa) číta 1 bajt z EEPROM; adresa – adresa, z ktorej sa čítajú dáta (bunka začínajúca od 0);
napísať (adresa, hodnota) zapíše hodnotu (1 bajt, číslo od 0 do 255) do pamäte na adrese;
aktualizovať (adresa, hodnota) nahradí hodnotu na adrese, ak sa jej starý obsah líši od nového;
získať (adresa, údaje) načítava údaje zadaného typu z pamäte na adrese;
vložiť (adresa, údaje) zapisuje údaje zadaného typu do pamäte na adrese;
EEPROM umožňuje použiť identifikátor "EEPROM" ako pole na zapisovanie údajov a čítanie z pamäte.

Zápis celých čísel

Zápis celých čísel do energeticky nezávislej pamäte EEPROM je celkom jednoduchý. Čísla sa zadávajú pri spustení funkcie EEPROM.write(). Požadované údaje sú uvedené v zátvorkách. V tomto prípade sa čísla od 0 do 255 a čísla nad 255 píšu odlišne. Prvé sa zadávajú jednoducho - ich objem zaberá 1 bajt, teda jednu bunku. Ak chcete zapísať posledný bajt, musíte použiť operátory highByte() pre najvyšší bajt a lowByte() pre najnižší bajt.

Číslo je rozdelené na bajty a zapísané samostatne do buniek. Napríklad číslo 789 bude napísané v dvoch bunkách: prvá bude obsahovať faktor 3 a druhá bude obsahovať chýbajúcu hodnotu. Výsledkom je požadovaná hodnota:

3 * 256 + 21 = 789

Pre « reunion“ platí veľké celé číslo funkcia slova(): int val = slovo (ahoj, nízke). Musíte si prečítať, že maximálne celé číslo pre záznam je 65536 (to znamená 2 na 16). V bunkách, ktoré ešte nemali iné položky, monitor zobrazí čísla 255 v každej z nich.

Zápis čísel a reťazcov s pohyblivou rádovou čiarkou

Čísla s pohyblivou rádovou čiarkou a reťazcové čísla sú formou zápisu reálnych čísel, kde sú reprezentované mantisou a exponentom. Takéto čísla sa zapisujú do energeticky nezávislej pamäte EEPROM aktiváciou funkcie EEPROM.put(), respektíve čítanie, – EEPROM.get().

Pri programovaní sú číselné hodnoty s pohyblivou rádovou čiarkou označené ako float, treba poznamenať, že nejde o príkaz, ale o číslo. Typ znaku (typ znaku) – používa sa na reprezentáciu reťazcov. Proces zápisu čísel na monitor sa spustí pomocou setup(), čítanie - pomocou loop().

Počas procesu sa na obrazovke monitora môžu objaviť hodnoty ovf, čo znamená „preplnené“ a nan, čo znamená „chýbajúce“. číselná hodnota" To znamená, že informácie zapísané do bunky nemožno reprodukovať ako číslo s pohyblivou rádovou čiarkou. Táto situácia nenastane, ak spoľahlivo viete, v ktorej bunke je zaznamenaný typ informácie.

Príklady projektov a náčrtov

Príklad č.1

Skica zapíše až 16 znakov zo sériového portu a vypíše 16 znakov z EEPROM v slučke. Vďaka tomu sa dáta zapisujú do EEPROM a monitoruje sa obsah energeticky nezávislej pamäte.

// kontrola fungovania EEPROM #include int i, d; void setup() ( Serial.begin(9600); // inicializácia portu, rýchlosť 9600 ) void loop() ( // čítanie EEPROM a výstup 16 dát na sériový port Serial.println(); Serial.print("EEPROM = "); i= 0; zatiaľ čo (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); }

Príklad č.2

Pre lepšie pochopenie môžeme vytvoriť malý náčrt, ktorý pomôže pochopiť, ako pracovať s energeticky nezávislou pamäťou. Počítame všetky bunky tejto pamäte. Ak bunka nie je prázdna - výstup na sériový port. Potom vyplňte bunky medzerami. Potom zadáme text cez monitor sériového portu. Zapíšeme ho do EEPROM a prečítame ho pri ďalšom zapnutí.

#include int adresa = 0; // adresa eeprom int read_value = 0; // dáta načítané z eeprom char serial_in_data; // údaje sériového portu int led = 6; // riadok 6 pre LED int i; void setup() ( pinMode(led, OUTPUT); // riadok 6 je nakonfigurovaný ako výstup Serial.begin(9600); // prenosová rýchlosť na sériovom porte 9600 Serial.println(); Serial.println("PREDCHÁDZAJÚCI TEXT V EEPROM : -"); 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); }

Príklad č.3

Zapíše dve celé čísla do pamäte, načíta ich z EEPROM a odošle ich na sériový port. Čísla od 0 do 255 zaberajú pomocou funkcie 1 bajt pamäte EEPROM.write() sa zapíšu do požadovanej bunky. Pre čísla väčšie ako 255 je potrebné ich rozdeliť na bajty pomocou highByte() A lowByte() a zapíšte každý bajt do vlastnej bunky. Maximálny počet je v tomto prípade 65536 (alebo 2 16).

#include // pripojenie knižnice EEPROM void setup() ( int smallNum = 123; // celé číslo od 0 do 255 EEPROM.write(0, smallNum); // zapísanie čísla do bunky 0 int bigNum = 789; // rozdelenie čísla > 255 x 2 bajty (max. 65536) byte hi = highByte(bigNum); // vysoký bajt bajt low = lowByte(bigNum); // nízky bajt EEPROM.write(1, hi); // zápis vysokého bajtu EEPROM do bunky 1 .write(2, low); // zapíše nízky bajt do bunky 2 Serial.begin(9600); // inicializuje sériový 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 мин }

Príklad č.4

Zápis čísel a reťazcov s pohyblivou rádovou čiarkou - metóda EEPROM.put(). Čítanie - EEPROM.get().

#include // pripojenie knižnice void setup() ( int addr = 0; // adresa float f = 3.1415926f; // číslo s pohyblivou rádovou čiarkou (typ float) EEPROM.put(addr, f); // zapíšte číslo f do adresy addr addr += sizeof(float); // výpočet nasledujúcej voľnej pamäťovej bunky char name = "Ahoj, SolTau.ru!"; // vytvorenie poľa znakov EEPROM.put(addr, name); // zápis poľa do EEPROM Serial.begin (9600); // inicializácia sériového portu ) 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 минуту }

Príklad č.5

Použitie EEPROM ako poľa.

#include void setup() ( EEPROM = 11; // zápis 1. bunky EEPROM = 121; // zápis 2. bunky EEPROM = 141; // zápis 3. bunky EEPROM = 236; // zápis 4. bunky 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); }

Práca s EEPROM

Ako už bolo spomenuté, pamäť EEPROM je obmedzená. Ak chcete predĺžiť životnosť energeticky nezávislej pamäte, namiesto funkcie write() je lepšie použiť funkciu aktualizácie. V tomto prípade sa prepísanie vykoná len pre tie bunky, ktorých hodnota sa líši od novo zapísanej.

Ďalšou užitočnou funkciou predmetnej pamäte mikrokontroléra je schopnosť používať bajtové úložné bunky ako súčasti integrálneho poľa EEPROM. Pri akomkoľvek formáte použitia je potrebné neustále monitorovať integritu zaznamenávaných údajov.

Takáto pamäť na Arduine štandardne ukladá to najdôležitejšie pre chod ovládača a zariadenia. Napríklad, ak je regulátor teploty vytvorený na takomto základe a počiatočné údaje sa ukážu ako chybné, zariadenie bude fungovať „neadekvátne“ existujúcim podmienkam - výrazne podhodnotí alebo nadhodnotí teplotu.

Existuje niekoľko situácií, kedy EEPROM obsahuje nesprávne údaje:

  1. Pri počiatočnej aktivácii ešte neboli žiadne záznamy.
  2. Počas nekontrolovaného výpadku prúdu sa niektoré alebo všetky údaje nezaznamenajú alebo sa zaznamenajú nesprávne.
  3. Po dokončení možných cyklov prepisovania údajov.

Aby sa predišlo nepríjemným následkom, zariadenie môže byť naprogramované na niekoľko možností akcie: použiť údaje núdzového kódu, úplne vypnúť systém, signalizovať poruchu, použiť predtým vytvorenú kópiu alebo iné.

Na kontrolu integrity informácií sa používa systémový riadiaci kód. Vytvára sa na základe pôvodného záznamu údajov a po overení údaje prepočíta. Ak je výsledok iný, ide o chybu. Najbežnejšou verziou takejto kontroly je kontrolný súčet – vykoná sa jednoduchá matematická operácia na sčítanie všetkých hodnôt buniek.

Skúsení programátori pridávajú k tomuto kódu ďalšie „exkluzívne OR“, ako napríklad E5h. Ak sa všetky hodnoty rovnajú nule a systém omylom vynuluje pôvodné údaje, tento trik odhalí chybu.

Toto sú základné princípy práce s energeticky nezávislou pamäťou EEPROM pre mikrokontroléry Arduino. Pre určité projekty sa oplatí používať iba tento typ pamäte. Má to svoje výhody aj nevýhody. Na zvládnutie metód písania a čítania je lepšie začať s jednoduchými úlohami.

Všetky mikrokontroléry z rodiny Mega obsahujú energeticky nezávislú pamäť ( EEPROM Pamäť). Objem tejto pamäte sa pohybuje od 512 bajtov v modeloch ATmega8x až po 4 KB v starších modeloch. EEPROM pamäť sa nachádza vo vlastnom adresnom priestore a podobne ako RAM je usporiadaná lineárne. Pracovať s EEPROM Pamäť využíva tri I/O registre: register adries, register údajov a riadiaci register.

Register adries

Register adries EEPROM Pamäť EEAR (register adries EEPROM) fyzicky umiestnené v dvoch RVV EEARH:EEARL, ktorý sa nachádza pozdĺž
adresy $1F ($3F) a $1E ($3E). Do tohto registra sa načíta adresa bunky, do ktorej sa bude pristupovať. Register adries je zapisovateľný aj čitateľný. Zároveň v registri EEARH používajú sa iba najmenej významné bity (počet použitých bitov závisí od objemu EEPROM Pamäť). Nepoužité bity registra EEARH sú len na čítanie a obsahujú "0".

Register údajov

Register údajov EEPROM Pamäť EEDR (údajový register EEPROM) na $1D ($3D). Pri zápise do tohto registra sa načítajú údaje, ktoré by mali byť vložené EEPROM a pri čítaní sa údaje čítajú z EEPROM.

Kontrolný register

Kontrolný register EEPROM Pamäť EECR (riadiaci register EEPROM) sa nachádza na 1C (3C USD). Tento register slúži na
Riadenie prístupu EEPROM Pamäť. Jeho popis je uvedený v tabuľke nižšie:

Vypúšťanie názov Popis
7..4 - nepoužíva sa, čítajte ako "0"
3 EERIE Povoliť prerušenie z EEPROM. Tento bit riadi generovanie prerušenia, ktoré nastane po dokončení cyklu zápisu EEPROM. Ak je tento bit nastavený na "1", prerušenia sú povolené (ak je príznak I v registri
SREG je tiež nastavený na "1"). Keď sa bit EEWE vymaže (pozri ďalej v
tabuľka) prerušenie sa generuje neustále
2 EEMWE Ovládanie oprávnenia na zápis do EEPROM. Stav tohto bitu určuje činnosť príznaku povolenia zápisu EEWE. Ak je tento bit nastavený na „1“, potom pri zápise do EEWE bitu „1“ sa dáta zapisujú do EEPROM. V opačnom prípade nemá nastavenie EEWE na „1“ žiadny účinok. Po inštalácii softvéru sa bit EEMWE resetuje hardvérom cez
4 strojové cykly
1 EEWE Povoliť zápis do EEPROM. Keď je tento bit nastavený na „1“, dáta sa zapisujú do EEPROM (ak sa EEMWE rovná „1“).
0 EERE Povolenie na čítanie z EEPROM. Po nastavení tohto bitu na „1“ sa dáta načítajú z EEPROM. Po dokončení čítania je tento bit hardvérovo resetovaný

Na zápis jedného bajtu do EEPROM potrebujete:

1. Počkajte, kým bude EEPROM pripravená na zápis dát (počkajte, kým sa neresetuje príznak EEWE registra EECR).

2. Počkajte na dokončenie zápisu do pamäte programu FLASH (počkajte, kým sa nevynuluje príznak SPMEN registra SPMCR).

3. Vložte dátový bajt do registra EEDR a požadovanú adresu do registra EEAR (ak je to potrebné).

4. Nastavte príznak EEMWE registra EECR na „1“.

5. Zapíšte protokol do bitu EEWE v registri EECR. "1" pre 4 strojové cykly. Po nainštalovaní tohto bitu procesor
preskočí 2 strojové cykly pred vykonaním ďalšej inštrukcie.

Na prečítanie jedného bajtu z EEPROM potrebujete:

1. Skontrolujte stav vlajky EEWE. Faktom je, že kým sa vykonáva operácia zápisu do pamäte EEPROM (je nastavený príznak EEWE), nie je možné vykonať čítanie pamäte EEPROM ani zmenu registra adries.

2. Vložte požadovanú adresu do registra EEAR.

3. Nastavte bit EERE registra EECR na „1“.

Keď sú požadované dáta umiestnené v dátovom registri EEDR, dôjde k hardvérovému resetu tohto bitu. Nie je však potrebné monitorovať stav bitu EERE, aby sa určilo, kedy je operácia čítania dokončená, pretože operácia čítania z EEPROM je vždy dokončená v jednom strojovom cykle. Navyše po nastavení bitu EERE na „1“ procesor pred spustením ďalšej inštrukcie preskočí 4 strojové cykly.

Prostredie AVR Studio GCC má štandardnú knižnicu pre prácu s EEPROM, ktorá sa umožňuje pripojením súboru . Hlavné funkcie sú eeprom_read_byte(), eeprom_write_byte(), eeprom_read_word(), eeprom_write_word(). Napíšme si napríklad program pre minipočítadlo od 0 do 9, kde po stlačení jedného tlačidla sa pridá hodnota a ďalšie tlačidlo uloží túto hodnotu do pamäte. Mikrokontrolér Atmega8 pracuje z interného generátora hodín s frekvenciou 8 MHz. Jednomiestny sedemsegmentový indikátor so spoločnou anódou je pripojený k portu B cez prúdové obmedzovacie odpory R1-R7, spoločná anóda je pripojená k napájaciemu zdroju plus. Diagram je zobrazený nižšie:

Najprv pripojíme knižnice potrebné na prevádzku vrátane EEPROM. Definujte premenné. Premenná "s" ukladá hodnotu pre výstup do indikátora, po stlačení tlačidla SB1 sa táto hodnota zvýši o jednu, ale nie viac ako 10. Premenná eeprom_var bude interagovať s EEPROM. Po zapnutí napájania sa načíta EEPROM, načítané údaje sa priradia premennej „s“, na základe toho sa na indikátore zobrazí určité číslo. Keď stlačíte SB2, údaje z premennej „s“ sa zapíšu do EEPROM a indikátor raz zabliká.

#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; // definujte premennú v EEPROM int main (void) ( DDRB = 0xFF; // Port B na výstup PORTB = 0xFF; DDRD = 0x00; // Port D na vstup PORTD = 0xFF; // Zapnutie pull-up odporov s = eeprom_read_byte(&eeprom_var ); // prečíta bajt z EEPROM a vloží ho do "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; } }

Komentáre

0 AntonChip 5. 2. 2013 22:15

Citujem Max:

Možno si niečo mýlim, ale ak máte indikátor s OA, tak stačí jeden rezistor na 5V linke.Načo montovať prúdové obmedzovacie odpory za prvok, ktorý majú chrániť pred vysokým prúdom??


Len si predstavte, čo sa stane, ak sa jeden segment indikátora uzavrie s touto a inou schémou zapojenia odporu.

0 AntonChip 15.05.2013 11:16

Citujem gydok:

Ako napísať dvojrozmerné pole do eeprom?


kód:
#include // Zahrňte knižnicu

EEMEM unsigned char colors=((1, 2, 3), // Deklarovanie poľa v EEPROM
{4, 5, 6}};

eeprom_write_byte(&farby, 1); // Zápis prvkov poľa do EEPROM
eeprom_write_byte(&farby, 2);
eeprom_write_byte(&farby, 3);
eeprom_write_byte(&farby, 4);
eeprom_write_byte(&farby, 5);
eeprom_write_byte(&farby, 6);

unsigned char temp;
temp = eeprom_read_byte(&farby); // Extrahovanie prvku poľa z EEPROM, 2. riadok (), 1. stĺpec (), t.j. číslo 4

Resetovanie pamäte EEPROM

Príklad prechádza cez všetky pamäťové bunky a zapisuje do nich nuly.

// Pripojenie knižnice na prácu s EEPROM. #include "EEPROM.h" void setup() ( // Prejdite všetky bunky (bajty) a zapíšte do nich nuly. for (int i = 0; i< EEPROM.length(); i++) EEPROM.update(i, 0); } void loop() { // Пустой цикл... }


Obnovenie továrenských nastavení

Ak chcete pamäť vrátiť do továrenského nastavenia, je potrebné nahradiť 0 255, t.j. zapisovať nie nuly, ale číslo 255. V budúcnosti je teda možné pomocou funkcie isNaN() skontrolovať, či sa zápis do pamäte EEPROM vykonal alebo nie.

// Pripojenie knižnice na prácu s EEPROM. #include "EEPROM.h" void setup() ( // Prejdite všetky bunky (bajty) a napíšte do nich čísla 255. for (int i = 0; i< EEPROM.length(); i++) EEPROM.update(i, 255); } void loop() { // Пустой цикл... }

Povedzte nám o nás

Správa

Ak máte skúsenosti s prácou s Arduinom a skutočne máte čas na kreativitu, pozývame každého, aby sa stal autorom článkov publikovaných na našom portáli. Môžu to byť lekcie alebo príbehy o vašich experimentoch s Arduinom. Popis rôznych senzorov a modulov. Rady a návody pre začiatočníkov. Píšte a uverejňujte svoje články