Kako deluje eeprom? Kaj je pomnilniški čip in kako programirati mikrovezja. Primeri projektov in skic

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?
Poglejmo na primer Marlin Firmware, EEPROM se ne uporablja. Parametri konfiguratorja (Configuration.h), ki vključujejo možnost njegove 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 takega.

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 strojnega programa 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.

Lekcija 15

1. del

Notranji obstojni pomnilnik EEPROM

Mislim, da morda ne vsi, vendar mnogi vedo, da v krmilnikih AVR poleg glavnega pomnilnik z naključnim dostopom, kot tudi pomnilnik za shranjevanje vdelane programske opreme, obstaja tudi obstojni pomnilnik, kot je EEPROM. Ta pomnilnik je izdelan s tehnologijo električnega brisanja informacij, ki je za razliko od predhodnika EPROM, pri katerem se je brisanje izvajalo samo z uporabo ultravijoličnih žarkov, omogočila uporabo tovrstnega pomnilnika skoraj povsod. Kot vemo, obstaja tudi obstojni pomnilnik, kot je Flesh, ki je precej cenejši, a ima tudi precejšnjo pomanjkljivost. Tam ni mogoče izbrisati posameznega bajta, brisanje se izvaja samo v blokih, kar v nekaterih primerih ni povsem priročno, zlasti kadar je treba shraniti malo informacij in te informacije predstavljajo majhne nastavitvene parametre. Zato se moramo ustaviti tudi pri ta tip spomin. Pa ne samo zato, ker je prisoten v regulatorju, ampak zato, ker je zelo priročen za shranjevanje nekaterih količin, ki jih bomo potrebovali tudi po izpadu krmilnika.

Ker delamo s krmilnikom Atmega8A, bomo odprli tehnično dokumentacijo tega MK in tam videli, da imamo skupaj 512 bajtov takega pomnilnika. Vendar to ni tako malo. Če na primer programiramo nekakšno budilko, da se podatki o nastavitvah po izklopu ne izgubijo, se zlahka obrnemo na ta pomnilnik. To piše tudi v dokumentaciji dani spomin zajamčeno preživi 100.000 ciklov pisanja/branja.

Zdaj se postavlja vprašanje. Kako je organiziran proces dela s tem pomnilnikom v mikrokrmilniku? AVR? Kot vedno je Atmel poskrbel za to in ta proces organiziral na strojni ravni, kar je zelo razveseljivo, saj moramo nenehno varčevati z viri krmilnika. Za nadzor te ravni strojne opreme obstajajo določeni registri.

Eden od njih je registrski par EEAR. Zakaj par, ampak ker 512 naslovov ne bo ustrezalo 8 bitom, je potreben še en

Videli bomo, kako natančno se bomo lotili v procesu programiranja EEPROM.

Sledi register podatkov EADR

Podatke bomo zapisali v ta register, da jih zapišemo na določen naslov pomnilnika EEPROM, pa tudi za branje z določenega naslova istega pomnilnika.

No, kot običajno, skoraj nobena periferija ali tehnologija, organizirana na ravni strojne opreme, ne more brez nadzornega registra. Naš vodilni register je register EECR

Takoj spoznajmo delce tega registra.

bit EERE— bit, ki povzroči začetek procesa branja iz pomnilnika EEPROM. In takoj, ko so podatki prebrani in zapisani v podatkovni register, bo ta bit ponastavljen. Zato lahko ta bit štejemo ne samo za nadzorni bit, temveč tudi za statusni ali statusni bit.

bit EEWE— bit, katerega nastavitev ukaže krmilniku, da zapiše podatke iz podatkovnega registra na določen naslov EEPROM. Po končanem postopku zapisovanja se tudi ta bit samostojno ponastavi.

bit EEMWE— bit, ki omogoča (ne zažene) postopek snemanja.

bit JEZIČNO— bit, ki omogoča prekinitve.

No, zdaj pa preidimo na projekt. Projekt je bil ustvarjen na običajen standardni način in poimenovan Test13. Priložena je bila tudi datoteka glavna.h in datoteke so ustvarjene eeprom.h in eeprom.c.

Tukaj vir ustvarjenih datotek

Test13.c:

#vključi"main.h"

intglavni( praznina)

{

medtem(1)

{

}

}

#ifndefMAIN_H_

#definirajMAIN_H_

#definirajF_CPE8000000UL

#vključi

#vključi

#vključi

#vključi

#vključi

#vključi"eeprom.h"

 

#endif/* MAIN_H_ */

eeprom.h

#ifndefEEPROM_H_

#definirajEEPROM_H_

#vključi"main.h"

prazninaEEPROM_zapis( nepodpisanintuiAddress, nepodpisancharucData);

nepodpisancharEEPROM_branje( nepodpisanintuiAddress);

#endif/* EEPROM_H_ */

eeprom.c

#vključi"eeprom.h"

Najprej bomo v skladu s tem poskusili zapisati podatke v pomnilnik EEPROM. Pa saj je logično, saj če nismo nič zapisali, tudi nimamo kaj brati.

No, da se ne obremenjujemo in v datoteko vstavimo kodo za funkcijo pisanja, pa tudi funkcijo branja iz primera v tehnični dokumentaciji eeprom.c in odstranite komentarje v angleškem jeziku in tam vstavite komentarje v ruskem jeziku. Po vseh popravkih bo datoteka izgledala takole

#vključi"eeprom.h"

prazninaEEPROM_zapis( nepodpisanintuiAddress, nepodpisancharucData)

{

medtem( EECR& (1<< EEWE))

{}

EEAR= uiAddress; //Nastavite naslov

EEDR= ucData; //Vnašamo podatke v register

EECR|= (1<< EEMWE); //Dovoli snemanje

EECR|= (1<< EEWE); //Zapiši bajt v pomnilnik

}

nepodpisancharEEPROM_branje( nepodpisanintuiAddress)

{

medtem( EECR& (1<< EEWE))

{} // počakajte, da zadnja pomnilniška operacija sprosti končno zastavico

EEAR= uiAddress; //Nastavite naslov

EECR|= (1<< EERE); //Začetek branja iz pomnilnika v podatkovni register

vrnitevEEDR; //Vrni rezultat

}

Zapišimo prototipe za te funkcije v datoteko eeprom.h

#vključi"main.h"

prazninaEEPROM_zapis( nepodpisanintuiAddress, nepodpisancharucData);

nepodpisancharEEPROM_branje( nepodpisanintuiAddress);

Zdaj pa pokličimo funkcijo pisanja v funkciji main() in s tem poskusimo zapisati neko 8-bitno vrednost na naslov 1. Na splošno se naslavljanje v tem pomnilniku začne od 0

intglavni( praznina)

EEPROM_zapis(1, 120);

Medtem(1)

Za poskuse uporabljamo isto ploščo za odpravljanje napak, ne da bi nanjo sploh kaj povezali

Sestavimo projekt in pojdimo na program vdelane programske opreme Avrdude.

Tam izberimo našo datoteko vdelane programske opreme, nato poskusimo prebrati krmilnik in nato izbrišemo vse z gumbom "izbriši vse".

Tudi v programu avrdude je še ena vrstica "Eeprom". To vrstico lahko uporabimo za pisanje v ta pomnilnik ne programsko, ampak iz datoteke. Vendar bomo pisali iz našega programa in to vrstico bomo uporabili za branje pomnilnika EEPROM v datoteko. V to vrstico lahko ročno zapišete pot in datoteka bo ustvarjena samodejno. Napišemo na primer "C:\1\11111" in kliknemo "Preberi" in po tej poti bodo vse informacije iz pomnilnika EEPROM zapisane v določeno datoteko

Napišete lahko katero koli pot, če medij s to črko, navedeno na levi, obstaja in je zapisljiv. Prav tako je bolje ustvariti mapo vnaprej.

Zdaj poiščimo to datoteko na disku in jo odprimo v beležnici

Ta datoteka ima približno enako obliko kot datoteka vdelane programske opreme. Najprej naslov, nato 32 bajtov informacij in nato kontrolna vsota za teh 32 bajtov. Če v pomnilnik EEPROM še nikoli nismo nič zapisali, potem bomo imeli FF-je na vseh naslovih, torej imamo enice v vseh pomnilniških bitih.

Zapremo datoteko, poskusimo utripati krmilnik, nato znova preberemo pomnilnik EEPROM v datoteko in odpremo datoteko

Vidimo, da je bila v datoteko zapisana številka "78", kar pomeni 120 v decimalni obliki.

Zdaj pa poskusimo pritisniti gumb "Izbriši vse", v tem primeru pomnilnik EEPROM ne bi smel biti izbrisan.

Ponovno preberemo EEPROM v datoteko, odpremo datoteko in vidimo, da je pomnilnik izbrisan, spet imamo povsod "FF".

Zakaj se je to zgodilo? Ker morate prilagoditi varovalke. Bralna varovalka

Bodimo pozorni na bit EESAVE. Ko je ta bit ena (kot imamo, so biti obrnjeni), potem prisilno izbrišemo pomnilnik EEPROM, ko izklopimo napajanje, pa tudi, ko se izbriše. In da se to ne bi zgodilo, je treba ta bit ponastaviti, to je, da vanj postavite kljukico in utripate varovalke.

Utripamo varovalke, zbrišemo krmilnik, utripamo krmilnik, ponovno obrišemo, preberemo EEPROM pomnilnik v datoteko in jo odpremo. Zdaj vidimo, da nam ni nič izbrisano

Zdaj pa poskusimo odklopiti krmilnik iz napajanja in čez nekaj časa znova vključiti napajanje. Spet preberemo EEPROM v datoteko, vse je nedotaknjeno. Super!

V naslednjem delu vadnice bomo poskusili programsko prebrati podatke iz pomnilnika EEPROM.

Oglejte si VIDEO vadnico (kliknite na sliko)

Ogledi objave: 7.259

Električno izbrisljivi programabilni bralni pomnilnik (EEPROM) so polprevodniški računalniški čipi iz kovinskega oksida, ki se uporabljajo na plošči tiskanega vezja. To vrsto čipa je mogoče izbrisati in ponovno programirati z močnim elektronskim signalom. Ker je to mogoče storiti brez odstranitve čipa iz naprave, s katero je povezan, se čipi EEPROM uporabljajo v številnih panogah.
Čip EEPROM vsebuje obstojni pomnilnik, zato se njegovi podatki ne izgubijo, če je napajanje čipa prekinjeno. To vrsto čipa je mogoče selektivno programirati, kar pomeni, da je del njegovega pomnilnika mogoče spremeniti z novim prepisom, ne da bi to vplivalo na preostali del pomnilnika. Informacije, shranjene v čipu EEPROM, so trajne, dokler niso izbrisane ali ponovno programirane, zaradi česar so dragocena komponenta v računalnikih in drugih elektronskih napravah.

EEPROM čipi temeljijo na tranzistorjih s plavajočimi vrati. Čip EEPROM se programira tako, da programljive informacije v obliki elektronov potisnejo skozi oksid vrat. Lebdeča vrata nato zagotovijo shranjevanje teh elektronov. Pomnilniška celica se šteje za programirano, ko je napolnjena z elektroni, kar je predstavljeno z ničlo. Če pomnilniška celica ni napolnjena, ni programirana in je predstavljena z enico.

Številne naprave potrebujejo pomnilnik, zato imajo čipi EEPROM veliko aplikacij na področju potrošniške elektronike. Uporabljajo se v igralnih sistemih, televizorjih in računalniških monitorjih. Slušni aparati, digitalni fotoaparati, tehnologija Bluetooth in igralni sistemi prav tako uporabljajo čipe EEPROM. Uporabljajo se v telekomunikacijski, medicinski in proizvodni industriji. Osebni in poslovni računalniki vsebujejo EEPROM.

EEPROM čip ima tudi široko paleto aplikacij v avtomobilski industriji. Uporablja se v protiblokirnih zavornih sistemih, zračnih blazinah, elektronskih kontrolah stabilnosti, menjalnikih in krmilnih enotah motorja. EEPROM čipi se uporabljajo tudi v klimatskih napravah, zaslonih instrumentne plošče, modulih za nadzor karoserije in sistemih za vstop brez ključa. Ti čipi pomagajo spremljati porabo goriva in se uporabljajo tudi v različnih diagnostičnih sistemih.

Obstaja omejitev števila ponovitev, ki jih lahko prepiše čip EEPROM. Plast znotraj čipa se zaradi številnih prepisov postopoma poškoduje. To ni velik problem, ker je mogoče nekatere čipe EEPROM spremeniti do milijonkrat. Nadaljnji napredek v tehnologiji bo verjetno pozitivno vplival na to, kaj bodo pomnilniški čipi zmogli v prihodnosti.

EEPROM je obstojen električno izbrisljiv pomnilnik. Število ciklov pisanja in brisanja v teh mikrovezjih doseže 1.000.000-krat. Motilne celice v njih, kot tudi v bralnih pomnilnikih EPROM, so izvedene s pomočjo tranzistorjev s plavajočimi vrati. Notranja struktura te pomnilniške celice je prikazana na sliki 1:


Slika 1. Električno izbrisljiva pomnilniška celica ROM (EEPROM).

Pomnilniška celica EEPROM je tranzistor MOS, v katerem so vrata izdelana iz polikristalnega silicija. Nato se med proizvodnim procesom čipa ta vrata oksidirajo in posledično bodo obdana s silicijevim oksidom, dielektrikom z odličnimi izolacijskimi lastnostmi. V tranzistorju s plavajočimi vrati, ko je ROM popolnoma izbrisan, v "plavajočih" vratih ni naboja, zato ta tranzistor ne prevaja toka. Med programiranjem se na druga vrata, ki se nahajajo nad lebdečimi vrati, dovaja visoka napetost, zaradi tunelskega učinka pa se v njih inducirajo naboji. Po odstranitvi programske napetosti ostane inducirani naboj na plavajočih vratih in tako ostane tranzistor v prevodnem stanju. Naboj na njegovem plavajočem zaklepu se lahko hrani desetletja.

Podobna pomnilniška celica je bila uporabljena v ultravijolično izbrisljivem ROM-u (EPROM). V pomnilniško celico z električnim izbrisom je mogoče ne samo pisati, ampak tudi brisati informacije. Informacije se izbrišejo z uporabo napetosti, ki je nasprotna snemalni napetosti, na vrata za programiranje. Za razliko od ROM-a z UV brisanjem je čas brisanja pomnilnika EEPROM približno 10 ms.

Blokovni diagram obstojnega pomnilnika z električnim brisanjem se ne razlikuje od blokovnega diagrama maske ROM. Edina razlika je v tem, da se namesto taljivega mostička uporablja zgoraj opisana celica. Njegov poenostavljen blokovni diagram je prikazan na sliki 2.



Slika 2. Poenostavljen blokovni diagram EEPROM-a

Kot primer pomnilniških čipov EEPROM lahko navedemo domače čipe 573РР3, 558РР3 in tuja mikrovezja serije AT28с010, AT28с040 podjetja Atmel, HN58V1001 podjetja Hitachi Semiconductor, X28C010 podjetja Intersil Corporation. Pomnilnik EEPROM najpogosteje shranjuje uporabniške podatke v mobilnih napravah, ki se ne smejo izbrisati, ko je napajanje izklopljeno (na primer imeniki), informacije o konfiguraciji usmerjevalnikov ali mobilnih naprav, manj pogosto se ti čipi uporabljajo kot konfiguracijski pomnilnik FPGA ali podatki DSP shranjevanje. EEPROM-i so prikazani v shemah vezja, kot je prikazano na sliki 3.


Slika 3. Grafična oznaka električno izbrisljive pomnilniške naprave samo za branje

Branje informacij iz vzporednega pomnilnika EEPROM je podobno branju iz ROM-a maske. Najprej se naslov pomnilniške celice, ki se bere, nastavi na naslovnem vodilu v binarni kodi A0...A9, nato se uporabi bralni signal RD. Signal za izbiro čipa CS se običajno uporablja kot dodatna naslovna žica za dostop do čipa. Časovni diagrami signalov na vhodih in izhodih tega tipa ROM-a so prikazani na sliki 4.



Slika 4. Časovni diagrami signalov za branje informacij iz EEPROM pomnilnika

Slika 5 prikazuje risbo tipičnega ohišja za vzporedni pomnilniški čip EEPROM.


Slika 5. Risba ohišja paralelnega EEPROM mikrovezja

Običajno so podatki, shranjeni v EEPROM-u, potrebni precej redko. Čas branja v tem primeru ni kritičen. Zato se v nekaterih primerih naslov in podatki prenesejo na čip in nazaj prek serijskih vrat. To omogoča zmanjšanje velikosti mikrovezij z zmanjšanjem števila zunanjih zatičev. V tem primeru se uporabljata dve vrsti serijskih vrat - vrata SPI in vrata I2C (mikrovezja serije 25cXX oziroma 24cXX). Tuja serija 24cXX ustreza domači seriji mikrovezij 558PPX.

Notranji diagram mikrovezja serije 24cXX (na primer AT24C01) je prikazan na sliki 6.



Slika 6. Notranje vezje čipa AT24C01

Takšni čipi se pogosto uporabljajo za shranjevanje TV nastavitev, kot plug and play pomnilnik v računalnikih in prenosnih računalnikih, konfiguracijski pomnilnik FPGA in signalni procesorji (DSP). Uporaba serijskega pomnilnika EEPROM je znatno znižala stroške teh naprav in povečala enostavnost uporabe. Primer lokacije tega čipa na tiskanem vezju pomnilniške kartice računalnika je prikazan na sliki 7.



Slika 7. EEPROM na tiskanem vezju pomnilniške kartice računalnika

Slika 8 prikazuje diagram elektronske kartice, ki uporablja zunanji EEPROM čip.


Slika 8. Vezje elektronske kartice z uporabo zunanjega EEPROM-a

V tem diagramu si mikrokrmilnik PIC16F84 izmenjuje podatke z EEPROM pomnilnikom 24LC16B. Naprave, kot je kartica SIM, ne uporabljajo več zunanjega pomnilniškega čipa. Kartice SIM mobilnih naprav uporabljajo notranji pomnilnik EEPROM mikrokrmilnika z enim čipom. To vam omogoča, da čim bolj zmanjšate ceno te naprave.

Krmilno vezje za električno izbrisljive programabilne ROM-e se je izkazalo za kompleksno, zato sta se pojavili dve smeri razvoja teh mikrovezij:

  1. EEPROM - električno izbrisljiv programabilni bralni pomnilnik
  2. FLASH ROM

FLASH - ROM-i se od EEPROM-ov razlikujejo po tem, da se brisanje ne izvaja na vsaki celici posebej, temveč na celotnem mikrovezju kot celoti ali bloku pomnilniške matrike tega mikrovezja, kot je bilo storjeno v EEPROM-u.


Slika 9. Grafična oznaka pomnilnika FLASH

Ko dostopate do trajne pomnilniške naprave, morate najprej nastaviti naslov pomnilniške celice na naslovnem vodilu in nato izvesti operacijo branja s čipa. Ta časovni diagram je prikazan na sliki 11.



Slika 10. Časovni diagrami signalov za branje informacij iz ROM-a

Na sliki 10 puščice prikazujejo zaporedje, v katerem je treba generirati krmilne signale. Na tej sliki je RD signal za branje, A so signali za izbiro naslova celice (ker lahko posamezni biti v naslovnem vodilu zavzamejo različne vrednosti, so prikazane prehodne poti v eno in ničelno stanje), D je prebrana izhodna informacija iz izbrane celice ROM.

Literatura:

Skupaj s člankom "Pomnilniške naprave samo za branje (ROM)" preberite:

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 je pomnilnik EEPROM bolje obravnavati ne kot "samo pomnilnik", temveč 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. vpišite nov naslov v register EEAR (če je potrebno);
  4. zapišite 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 spremeni vsebine pomnilnika FLASH (ne pozabite, da ima avr harvardsko arhitekturo: 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 podatkovni register, strojna oprema ponastavi bit EERE; vendar ni potrebe po spremljanju stanja tega bita, saj je operacija branja iz EEPROM-a vedno izvaja v enem taktu).

Po nastavitvi bita v EERE na ena procesor preskoči 4 takte pred izvedbo naslednjega ukaza.
Kot lahko vidimo, je delo z obstojnim pomnilnikom dolgotrajen proces; č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 potem 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 seveda za EEPROM ni predviden noben virtualni stroj; Poleg tega je vredno razmisliti, ali je za delo z obstojnim pomnilnikom potrebna ločena knjižnica - snemanje pomembnih nastavitev je preveč "razpršeno" po programu; č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 virtualne stroje. 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. atMinTemperatureV alue; )

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!