Ako funguje eeprom? Čo je pamäťový čip a ako programovať mikroobvody. Príklady projektov a náčrtov

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í.

Lekcia 15

Časť 1

Interné energeticky nezávislá pamäť EEPROM

Myslím, že možno nie každý, ale veľa ľudí vie, že v ovládačoch AVR okrem hlavného Náhodný vstup do pamäťe, ako aj pamäť na ukladanie firmvéru, nechýba ani energeticky nezávislá pamäť ako EEPROM. Táto pamäť je vyrobená technológiou elektrického vymazávania informácií, ktorá na rozdiel od svojej predchodkyne EPROM, v ktorej sa vymazávanie uskutočňovalo len pomocou ultrafialových lúčov, umožnila použiť tento typ pamäte takmer všade. Ako vieme, existuje aj energeticky nezávislá pamäť ako Flesh, ktorá je oveľa lacnejšia, no má aj značnú nevýhodu. Tam nie je možné vymazať jeden bajt, mazanie sa vykonáva len v blokoch, čo nie je v niektorých prípadoch úplne vhodné, najmä ak je potrebné uložiť málo informácií a tieto informácie predstavujú malé parametre nastavenia. Preto by sme sa mali zastaviť aj pri tento typ Pamäť. A to nielen preto, že je prítomný v regulátore, ale preto, že je veľmi vhodný na uloženie niektorých veličín, ktoré budeme potrebovať aj po výpadku napájania regulátora.

Keďže pracujeme s radičom Atmega8A, otvoríme si technickú dokumentáciu tohto MK a tam vidíme, že takejto pamäte máme spolu 512 bajtov. To však nie je tak málo. Ak si napríklad naprogramujeme nejaký budík, aby sa po vypnutí napájania nestratili údaje o nastaveniach, môžeme sa na túto pamäť jednoducho odvolať. Hovorí to aj dokumentácia daná pamäť garantuje, že prežije 100 000 cyklov zápisu/čítania.

Teraz to vyvoláva otázku. Ako je v mikrokontroléri organizovaný proces práce s touto pamäťou? AVR? Ako vždy sa o to postaral Atmel a zorganizoval tento proces na hardvérovej úrovni, čo je veľmi príjemné, pretože neustále musíme šetriť zdroje radiča. Na ovládanie tejto hardvérovej úrovne existujú určité registre.

Jedným z nich je registrový pár EEAR. Prečo pár, ale pretože 512 adries sa nezmestí do 8 bitov, je potrebná ešte jedna

Uvidíme, ako presne budeme riešiť počas procesu programovania EEPROM.

Nasleduje register údajov EADR

Do tohto registra budeme zapisovať dáta, aby sme ich zapísali na konkrétnu adresu pamäte EEPROM, ako aj načítali z špecifickej adresy tej istej pamäte.

No ako to už býva, takmer žiadna periféria či technológia organizovaná na hardvérovej úrovni sa nezaobíde bez riadiaceho registra. Náš riadiaci register je register EECR

Poďme sa okamžite zoznámiť s bitmi tohto registra.

Trocha EERE— bit, ktorý spôsobí spustenie procesu čítania z pamäte EEPROM. A hneď ako sa dáta načítajú a zapíšu do dátového registra, tento bit sa vynuluje. Preto môžeme tento bit považovať nielen za riadiaci bit, ale aj za stavový či stavový bit.

Trocha EEWE— bit, ktorého nastavenie prikazuje riadiacej jednotke zapisovať dáta z dátového registra na konkrétnu adresu EEPROM. Po dokončení postupu zápisu sa tento bit tiež nezávisle resetuje.

Trocha EEMWE— bit, ktorý umožňuje (nespúšťa) proces nahrávania.

Trocha EERIE— bit, ktorý umožňuje prerušenia.

No a teraz prejdime k projektu. Projekt bol vytvorený bežným štandardným spôsobom a pomenovaný Test13. Súčasťou bol aj súbor hlavná.h a vytvoria sa súbory eeprom.h A eeprom.c.

Tu zdroj vytvorené súbory

Test13.c:

#include"hlavný.h"

intHlavná( neplatné)

{

zatiaľ čo(1)

{

}

}

#ifndefMAIN_H_

#definovaťMAIN_H_

#definovaťF_CPU8 000 000 UL

#include

#include

#include

#include

#include

#include"eeprom.h"

 

#koniec Ak/* MAIN_H_ */

eeprom.h

#ifndefEEPROM_H_

#definovaťEEPROM_H_

#include"hlavný.h"

neplatnéEEPROM_write( nepodpísanéintuiAddress, nepodpísanécharucData);

nepodpísanécharEEPROM_read( nepodpísanéintuiAddress);

#koniec Ak/* EEPROM_H_ */

eeprom.c

#include"eeprom.h"

Najprv sa teda pokúsime zapísať údaje do pamäte EEPROM. Je to logické, keďže sme si nič nezapísali, no zároveň nemáme ani čo čítať.

No netrápme sa a vložme do súboru kód pre funkciu zápisu, ako aj funkciu čítania z príkladu v technickej dokumentácii eeprom.c a odstráňte komentáre v anglickom jazyku a vložte tam komentáre v ruskom jazyku. Po všetkých opravách bude súbor vyzerať takto

#include"eeprom.h"

neplatnéEEPROM_write( nepodpísanéintuiAddress, nepodpísanécharucData)

{

zatiaľ čo( EECR& (1<< EEWE))

{}

EEAR= uiAddress; //Nastav adresu

EEDR= ucData; //Vkladáme údaje do registra

EECR|= (1<< EEMWE); //Povoliť nahrávanie

EECR|= (1<< EEWE); //Zapíšte bajt do pamäte

}

nepodpísanécharEEPROM_read( nepodpísanéintuiAddress)

{

zatiaľ čo( EECR& (1<< EEWE))

{} //čakajte na uvoľnenie príznaku konca poslednou operáciou pamäte

EEAR= uiAddress; //Nastav adresu

EECR|= (1<< EERE); //Spustenie operácie čítania z pamäte do dátového registra

vrátiťEEDR; //Vrátiť výsledok

}

Napíšme prototypy týchto funkcií do súboru eeprom.h

#include"hlavný.h"

neplatnéEEPROM_write( nepodpísanéintuiAddress, nepodpísanécharucData);

nepodpísanécharEEPROM_read( nepodpísanéintuiAddress);

Teraz zavolajme funkciu write vo funkcii main() a skúsme teda zapísať nejakú 8-bitovú hodnotu na adresu 1. Vo všeobecnosti sa adresovanie v tejto pamäti začína od 0

intHlavná( neplatné)

EEPROM_write(1, 120);

Zatiaľ čo(1)

Na experimenty používame rovnakú dosku na ladenie, bez toho, aby sme k nej niečo pripájali

Poďme zostaviť projekt a prejsť do programu firmvéru Avrdude.

Vyberme tam náš súbor firmvéru, potom sa pokúsime prečítať ovládač a potom všetko vymažeme pomocou tlačidla „vymazať všetko“

Aj v programe avrdude je ďalší riadok "Eeprom". Tento riadok môžeme použiť na zápis do tejto pamäte nie programovo, ale zo súboru. Ale budeme písať z nášho programu a tento riadok použijeme na načítanie pamäte EEPROM do súboru. Do tohto riadku môžete napísať cestu ručne a súbor sa vytvorí automaticky. Napíšme napríklad „C:\1\11111“ a kliknite na „Čítať“ a po tejto ceste sa všetky informácie z pamäte EEPROM zapíšu do určeného súboru

Môžete napísať akúkoľvek cestu, pokiaľ médium s týmto písmenom uvedeným vľavo existuje a je možné naň zapisovať. Je tiež lepšie vytvoriť priečinok vopred.

Teraz nájdime tento súbor na disku a otvorme ho v programe Poznámkový blok

Tento súbor má približne rovnaký formát ako súbor firmvéru. Najprv adresa, potom 32 bajtov informácií a potom kontrolný súčet pre týchto 32 bajtov. Ak sme nikdy nič nezapísali do pamäte EEPROM, potom budeme mať FF na všetkých adresách, to znamená, že máme jedničky vo všetkých pamäťových bitoch.

Zatvoríme súbor, pokúsime sa flashnúť ovládač, potom znova načítame pamäť EEPROM do súboru a otvoríme súbor

Vidíme, že do súboru bolo zapísané číslo „78“, čo znamená 120 v desiatkovom formáte.

Teraz skúsme stlačiť tlačidlo "Vymazať všetko", v tomto prípade by sa pamäť EEPROM nemala vymazávať.

Znovu načítame EEPROM do súboru, otvoríme súbor a vidíme, že pamäť bola vymazaná, opäť máme všade „FF“.

Prečo sa to stalo? Pretože treba nastaviť poistky. Čítacia poistka

Venujme pozornosť bitu EESAVE. Keď je tento bit jedna (ako máme, bity sú invertované), potom vynútime vymazanie pamäte EEPROM pri vypnutí napájania, ako aj pri vymazaní. A aby sa tomu zabránilo, je potrebné tento bit resetovať, to znamená začiarknuť ho a zablikať poistky.

Preblikneme poistky, vymažeme ovládač, preblikneme ovládač, znova vymažeme, načítame pamäť EEPROM do súboru a otvoríme. Teraz vidíme, že z nás nič nebolo vymazané

Teraz skúsme odpojiť ovládač od napájania a po chvíli znova zapnúť napájanie. Opäť načítame EEPROM do súboru, všetko je neporušené. Skvelé!

V ďalšej časti tutoriálu sa pokúsime programovo načítať dáta z pamäte EEPROM.

Pozrite si VIDEONÁVOD (kliknite na obrázok)

Zobrazenia príspevku: 7 259

Elektricky vymazateľné programovateľné pamäťové čipy (EEPROM) sú polovodičové počítačové čipy s oxidom kovu, ktoré sa používajú na doske s plošnými spojmi. Tento typ čipu je možné vymazať a preprogramovať pomocou silného elektronického signálu. Pretože to možno urobiť bez odstránenia čipu zo zariadenia, ku ktorému je pripojený, čipy EEPROM sa používajú v mnohých odvetviach.
Čip EEPROM obsahuje energeticky nezávislú pamäť, takže pri prerušení napájania čipu nedôjde k strate jeho údajov. Tento typ čipu je možné selektívne naprogramovať, čo znamená, že časť jeho pamäte môže byť zmenená novým prepísaním bez ovplyvnenia zvyšku pamäte. Informácie uložené vo vnútri čipu EEPROM sú trvalé, kým nie sú vymazané alebo preprogramované, čo z nich robí cennú súčasť v počítačoch a iných elektronických zariadeniach.

Čipy EEPROM sú založené na tranzistoroch s plávajúcim hradlom. Čip EEPROM je naprogramovaný pretláčaním programovateľnej informácie vo forme elektrónov cez oxid hradla. Plávajúca brána potom poskytuje úložisko pre tieto elektróny. Pamäťová bunka sa považuje za naprogramovanú, keď je nabitá elektrónmi, čo je znázornené nulou. Ak pamäťová bunka nie je nabitá, nie je naprogramovaná a je reprezentovaná jednotkou.

Široká škála zariadení vyžaduje pamäť, takže čipy EEPROM majú mnoho aplikácií v oblasti spotrebnej elektroniky. Používajú sa v herných systémoch, televízoroch a počítačových monitoroch. Čipy EEPROM využívajú aj načúvacie prístroje, digitálne fotoaparáty, technológia Bluetooth a herné systémy. Používajú sa v telekomunikáciách, zdravotníctve a vo výrobnom priemysle. Osobné a firemné počítače obsahujú EEPROM.

Čip EEPROM má tiež široké uplatnenie v automobilovom priemysle. Používa sa v protiblokovacích brzdových systémoch, airbagoch, elektronických systémoch riadenia stability, prevodovkách a riadiacich jednotkách motora. Čipy EEPROM sa používajú aj v klimatizačných jednotkách, displejoch prístrojových panelov, riadiacich moduloch karosérie a systémoch bezkľúčového vstupu. Tieto čipy pomáhajú sledovať spotrebu paliva a používajú sa aj v rôznych diagnostických systémoch.

Počet opakovaní, ktoré môže čip EEPROM prepísať, je obmedzený. Vrstva vo vnútri čipu sa postupne poškodzuje početnými prepismi. Nie je to veľký problém, pretože niektoré EEPROM čipy môžu byť modifikované až miliónkrát. Ďalší pokrok v technológii bude mať pravdepodobne pozitívny vplyv na to, čo dokážu pamäťové čipy v budúcnosti.

EEPROM je energeticky energeticky vymazateľná pamäť. Počet cyklov zápisu a vymazania v týchto mikroobvodoch dosahuje 1 000 000 krát. Rušiace bunky v nich, ako aj v pamätiach EPROM len na čítanie, sú implementované na báze tranzistorov s plávajúcim hradlom. Vnútorná štruktúra tejto pamäťovej bunky je znázornená na obrázku 1:


Obrázok 1. Elektricky vymazateľná pamäťová bunka ROM (EEPROM).

Pamäťová bunka EEPROM je tranzistor MOS, v ktorom je hradlo vyrobené z polykryštalického kremíka. Potom, počas výrobného procesu čipu, je táto brána oxidovaná a v dôsledku toho bude obklopená oxidom kremičitým, dielektrikom s vynikajúcimi izolačnými vlastnosťami. V tranzistore s plávajúcou bránou, keď je ROM úplne vymazaná, nie je v „plávajúcej“ bráne žiadny náboj, a preto tento tranzistor nevedie prúd. Pri programovaní sa na druhú bránu, umiestnenú nad plávajúcou bránou, privedie vysoké napätie a v dôsledku tunelovacieho efektu sa do nej indukujú náboje. Po odstránení programovacieho napätia zostáva indukovaný náboj na plávajúcom hradle a teda tranzistor zostáva vo vodivom stave. Náboj na jeho plávajúcej skrutke sa dá skladovať desiatky rokov.

Podobná pamäťová bunka bola použitá v ultrafialovom vymazateľnom ROM (EPROM). V pamäťovej bunke s elektrickým vymazávaním je možné informácie nielen zapisovať, ale aj vymazávať. Informácie sa vymažú privedením napätia opačného k záznamovému napätiu na programovacie hradlo. Na rozdiel od UV erase ROM je čas vymazania pamäte EEPROM približne 10 ms.

Bloková schéma energeticky nezávislej pamäte s elektrickým vymazávaním sa nelíši od blokovej schémy masky ROM. Jediný rozdiel je v tom, že namiesto tavnej prepojky sa používa vyššie opísaná bunka. Jeho zjednodušená bloková schéma je znázornená na obrázku 2.



Obrázok 2. Zjednodušená bloková schéma EEPROM

Ako príklad pamäťových čipov EEPROM môžeme uviesť domáce čipy 573РР3, 558РР3 a zahraničné mikroobvody radu AT28с010, AT28с040 od ​​Atmel, HN58V1001 od Hitachi Semiconductor, X28C010 od Intersil Corporation. Pamäť EEPROM najčastejšie ukladá používateľské údaje v mobilných zariadeniach, ktoré by sa nemali vymazávať pri vypnutí napájania (napríklad adresáre), konfiguračné informácie smerovačov alebo mobilných zariadení, menej často sa tieto čipy používajú ako konfiguračná pamäť FPGA alebo údaje DSP skladovanie. EEPROM sú znázornené v schémach zapojenia, ako je znázornené na obrázku 3.


Obrázok 3. Grafické označenie elektricky vymazateľného pamäťového zariadenia len na čítanie

Čítanie informácií z paralelnej pamäte EEPROM je podobné čítaniu z masky ROM. Najprv sa na adresovej zbernici v binárnom kóde A0...A9 nastaví adresa čítanej pamäťovej bunky, potom sa privedie čítací signál RD. Signál výberu čipu CS sa zvyčajne používa ako dodatočný adresný vodič na prístup k čipu. Časové diagramy signálov na vstupoch a výstupoch tohto typu ROM sú znázornené na obrázku 4.



Obrázok 4. Časové diagramy signálov na čítanie informácií z pamäte EEPROM

Obrázok 5 znázorňuje nákres typického krytu pre paralelný pamäťový čip EEPROM.


Obrázok 5. Výkres paralelného puzdra mikroobvodu EEPROM

Údaje uložené v EEPROM sa zvyčajne vyžadujú pomerne zriedka. Čas čítania v tomto prípade nie je rozhodujúci. Preto sa v niektorých prípadoch adresa a údaje prenášajú na čip a späť cez sériový port. To umožňuje zmenšiť veľkosť mikroobvodov znížením počtu vonkajších kolíkov. V tomto prípade sa používajú dva typy sériových portov - port SPI a port I2C (mikroobvody série 25cXX a 24cXX). Zahraničná séria 24cXX zodpovedá domácej sérii mikroobvodov 558PPX.

Vnútorná schéma mikroobvodov série 24cXX (napríklad AT24C01) je znázornená na obrázku 6.



Obrázok 6. Vnútorný obvod čipu AT24C01

Takéto čipy sú široko používané na ukladanie TV nastavení, ako plug and play pamäť v počítačoch a notebookoch, FPGA konfiguračná pamäť a signálové procesory (DSP). Použitie sériovej pamäte EEPROM výrazne znížilo cenu týchto zariadení a zvýšilo jednoduchosť používania. Príklad umiestnenia tohto čipu na doske s plošnými spojmi pamäťovej karty počítača je na obrázku 7.



Obrázok 7. EEPROM na doske s plošnými spojmi pamäťovej karty počítača

Obrázok 8 znázorňuje schému elektronickej karty s použitím externého čipu EEPROM.


Obrázok 8. Elektronický obvod karty využívajúci externú EEPROM

V tomto diagrame si mikrokontrolér PIC16F84 vymieňa dáta s pamäťou EEPROM 24LC16B. Zariadenia ako SIM karta už nepoužívajú externý pamäťový čip. SIM karty mobilných zariadení využívajú internú EEPROM pamäť jednočipového mikrokontroléra. To vám umožňuje čo najviac znížiť cenu tohto zariadenia.

Riadiaci obvod pre elektricky vymazateľné programovateľné ROM sa ukázal byť zložitý, takže sa objavili dva smery vývoja týchto mikroobvodov:

  1. EEPROM - elektricky vymazateľná programovateľná pamäť len na čítanie
  2. FLASH ROM

FLASH - ROM sa líšia od EEPROM tým, že vymazanie sa nevykonáva na každej bunke samostatne, ale na celom mikroobvode ako celku alebo bloku pamäťovej matice tohto mikroobvodu, ako to bolo urobené v EEPROM.


Obrázok 9. Grafické označenie pamäte FLASH

Pri prístupe k trvalému úložnému zariadeniu musíte najskôr nastaviť adresu pamäťovej bunky na adresovej zbernici a potom vykonať operáciu čítania z čipu. Tento časový diagram je znázornený na obrázku 11.



Obrázok 10. Časové diagramy signálov na čítanie informácií z ROM

Na obrázku 10 šípky znázorňujú poradie, v ktorom by sa mali generovať riadiace signály. Na tomto obrázku je RD čítaný signál, A je signál výberu adresy bunky (keďže jednotlivé bity v adresovej zbernici môžu nadobúdať rôzne hodnoty, sú zobrazené prechodové cesty do stavu jedna aj nula), D je načítaná výstupná informácia. z vybranej bunky ROM.

Literatúra:

Spolu s článkom „Pamäťové zariadenia iba na čítanie (ROM)“ si prečítajte:

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, že pamäť EEPROM je lepšie 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); pre prístup k údajom na konkrétnej adrese v energeticky nezávislej pamäti je potrebné vykonať určitú postupnosť akcií 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. napíšte novú adresu 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 dáta z registra EEDR (v skutočnosti sa pri presune požadovaných dát do dátového registra hardvérovo resetuje bit EERE; nie je však potrebné sledovať stav tohto bitu, keďže operácia čítania z EEPROM je vždy vykonávané 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ávislou pamäťou je časovo náročný proces; 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 sa samozrejme nepredpokladá žiadny virtuálny stroj pre EEPROM; Okrem toho stojí za zváženie, či je na prácu s energeticky nezávislou pamäťou potrebná samostatná knižnica - zaznamenávanie dôležitých nastavení je príliš „roztrúsené“ v programe; 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 vo virtuálnych počítačoch. 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ý!