Curs de formare avr

În acest articol vom examina eventualele probleme când lucrăm cu EEPROM. Unele dintre ele sunt asociate cu partea hardware a microcontrolerului, cum ar fi deteriorarea EEPROM la tensiune redusă și EEPROM de resurse limitate, precum și o parte cu software-ul, de exemplu, folosind întrerupe EEPROM. De asemenea, uita-te la modalitati de a aborda aceste probleme și metode pentru a îmbunătăți fiabilitatea de stocare a datelor în EEPROM.

Una dintre vechile probleme cu AVR este corupția datelor EEPROM cu puterea microcontrolerului. Acest lucru se poate întâmpla în două cazuri:

- Dacă tensiunea de alimentare este sub o anumită valoare, intrarea în EEPROM nu va fi executată corect.
- Cu o tensiune de alimentare mai mică, microcontrolerul nu poate executa corect comenzile.

Aceste deteriorări ale datelor EEPROM pot fi evitate prin respectarea următoarelor reguli:

- Este necesar să țineți microcontrolerul AVR într-o stare de resetare dacă tensiunea de alimentare este sub valoarea normală. Aveți posibilitatea să utilizați supraveghetorii externi de alimentare sau detectorul încorporat pentru a face acest lucru. Detectorul încorporat este controlat de baterii de siguranță ale microcontrolerului - BODEN și BODLEVEL. BODEN - permite / dezactivează funcționarea detectorului și BODLEVEL - determină nivelul său de funcționare.
Dacă resetarea microcontrolerului are loc în timpul procesului de înregistrare EEPROM, operația de scriere va fi terminată numai dacă nivelul de tensiune este suficient.

- De asemenea, mulți dezvoltatori recomandă să nu se folosească EEPROM-ul celulei 0, deoarece conținutul său este cel mai adesea deteriorat când sursa de alimentare a microcontrolerului scade.

Funcționarea scrierii pe EEPROM constă în mai mulți pași. Rețineți această secvență:

Bitul EEWE trebuie să fie setat în 4 cicluri de ceas după ce bitul EEMWE este setat. Dacă acest lucru nu se întâmplă din cauza întreruperilor, intrarea în EEPROM nu va fi efectuată. Acest lucru poate fi ușor evitat prin dezactivarea întreruperilor înainte de pasul 4, iar după al 5-lea, din nou pentru a le rezolva.

Cele de mai sus descriu procedura de citire a EEPROM.

Puteți trata acest lucru în următoarele moduri:

- Nu utilizați EEPROM citește și scrie în întreruperi.
Acest lucru este valabil mai ales pentru operația de scriere, deoarece este lentă și este efectuată utilizând un oscilator intern RC. De exemplu, pentru mega16 în fișa tehnică se indică faptul că atunci când se scrie în EEPROM un generator intern RC cu o frecvență de 1 MHz este utilizat (indiferent de setările de siguranțe ale biților CKSEL) și timpul de înregistrare este de 8,5 ms. Este nevoie de un timp foarte lung pentru a întrerupe.

- Împiedicați întreruperile în timpul întregii proceduri de scriere (citire) a EEPROM-ului, adică de la început.

- Utilizați steaguri (semaphore) pentru a semnala executarea lucrărilor cu EEPROM.
Înainte de a înregistra în bucla principală a programului (sau o sarcină, dacă este utilizat oc) instalat software-ul de pavilion, și să-și întrerupă (sau altă sarcină), pentru a verifica it.

EEPROM are o resursă limitată. Atmel asigură că numărul de cicluri de suprascriere EEPROM nu este mai mic de 100 000. Cifra este destul de mare, dar se poate obține dacă scrieți frecvent și mult timp în EEPROM.
Există două metode pentru "creșterea" resurselor EEPROM.
Prima este simplă și constă în scrierea de date către EEPROM numai dacă acestea și-au schimbat valoarea.

Al doilea este dificil și constă în stocarea datelor nu într-o singură celulă de memorie (sau într-un grup de celule, dacă este vorba de variabile multibyte), ci în mai multe și scrie-le la rândul lor.
Să presupunem că trebuie să stocăm un octet în EEPROM. Alocăm 8 octeți pentru el și scriem de fiecare dată către celula următoare, când ajungem la ultima celulă, apoi scriem la prima. Și așa într-un cerc, ca într-un tampon circular. Dacă fiecare celulă EEPROM are o resursă de 100.000, apoi scriem în 8 celule pe rând, obținem o resursă de suprascriere a octetului 800000.

Variabilele care sunt declarate, dar nu sunt utilizate sunt adesea șterse de către compilator în timpul procesului de optimizare. Dacă sunt necesare astfel de variabile, trebuie să adăugați cuvântul cheie volatil înaintea lor.

Dacă utilizați propriile funcții pentru a lucra cu EEPROM, este posibil să aveți probleme cu niveluri ridicate de optimizare a compilatorului. Compilatorul poate combina aceleași părți ale codului într-o singură subrutină și poate întrerupe logica funcției. Pentru a împiedica acest lucru, ar trebui fie să dezactivați optimizarea acestei funcții, fie să dezactivați optimizarea transversală pentru o funcție sau un fișier. Cum se face acest lucru depinde de compilator. De regulă, pentru asta există anumite chei și pragme.

Una dintre cele mai ușoare modalități de îmbunătățire a fiabilității stocării datelor în EEPROM este metoda rezervării majorității. Esența metodei constă în faptul că un număr impar de celule de memorie sunt alocate pentru stocarea datelor. Atunci când se salvează date, înregistrarea se face tuturor celulelor selectate. La citire - toate sunt citite, însă decizia privind conținutul este acceptată pe baza unor elemente de egalitate (N + 1) / 2.

Să considerăm un exemplu de rezervare majoritară triplă a octetului de date. Pentru a stoca un byte, se folosesc trei octeți de EEPROM, iar decizia de conținut se face pe baza egalității de 2 octeți. Codul este pentru compilatorul IAR AVR.

O altă metodă de îmbunătățire a fiabilității datelor stocate este utilizarea sumelor de control, de exemplu CRC. Nu am folosit această metodă în practica mea, așa că nu pot spune prea multe despre asta.

1. Deci, am scris despre asta.
2. Încerc să o adaug mai târziu. Și despre __root prea.
3. Nu am auzit despre astfel de subtilități.

1. Da, într-adevăr scrisă. Che-t ratat))


3. Există încă un aspect controversat și filosofic. Unii guru spun că EEPROM este același cu blițul. Adică, ele sunt scrise de pagini, sunt doar ascunse de noi de către controlerul EPROM. Și că conceptul numărului maxim de rescrieri 100000 nu se referă la fiecare octet, ci la pagină. Cu privire la acest subiect în perioada de apogeu a AVR, a existat o mare controversă, dar asta nu era punctul.


Atmelovskaya apronata (AVR101: Stocare EEPROM de înaltă rezistență) afirmă că folosirea unui buffer circular este posibil să crească resursa eeprom. Despre pagina nu se spune nimic. De ce să nu creadă?
P.S. În xmega eeprom este într-adevăr organizat de pagini.
Citat:


Linia de fund este că atunci majorizarea are sens doar atunci când celulele majore sunt situate "departe" unele de altele, evident în diferite "pagini".

Sentimentul de dominație nu este de a păstra resursa, și este garantat pentru a fi capabil de a restabili valoarea variabilei (sau să fie un semn că actualizarea a fost variabilă, în timpul căreia a avut loc eșecul).
Citat:

Acțiune îndoielnică. Da, și eeprom cu BOD-e și schema corectă nu zboară (după cum arată practica).

2. Nuno)) „Pe pagina nu spune nimic. De ce nu cred ei?“! Acesta este stilul Atmelovsky. Eu, de exemplu - nu cred. De aici avem aceeași foaie de date lor la Megu 644 (doc8272.pdf) și este ușor de a găsi o frază în secțiunea 27.7.5 Programarea EEPROM: „EEPROM-ul este organizat în pagini, a se vedea tabelul 27-8 de la pagina 301“. Și aproape placă: ATmega644A / ATme ga644PA dimensiune EEPROM: 2KBytes, EEPROMpagesize 8 octeți.
Deci nu este atât de ușor :)

Mai departe.
I: "Linia de jos este că atunci majorizarea are sens doar atunci când celulele majore sunt situate" departe "una de cealaltă, cu siguranță în diferite" pagini ".
---
Dumneavoastră: "Semnificația majorizării nu este de a salva resursa, ci de a putea garanta restaurarea"
.
Și eu vorbesc despre faptul că majorizarea salvează o resursă? Igde?)) Vreau să spun că majorizarea sinelui nu trebuie să depindă de rezistența paginii EEPROM.

Mai departe.
"Acțiunea îndoielnică: Da, și eeprom cu BOD-e și schema corectă nu este muște (așa cum arată practica)".

Din nou, nu acolo! Ce prind mâncarea? Este vorba despre coruperea celulelor de la rezistența paginii EEPROM! Cablarea corectă și rezistența CUM sunt legate? Cu BOD'am prea - cum?

Aparent, aveți o mulțime de "descoperiri"))

În opinia mea, este încă paranoia. Dacă cheltuiți o variabilă pe o pagină, capacitatea EEPROM scade pur și simplu după ordinele de mărime. Și în secțiunea a 27-a vorbim despre programare și EEPROM din exterior. Cine îi împiedică să facă programări externe, pagini de pagină și octeți octeți.

"Scrieți că fiecare octet poate fi suprascris și astfel de cicluri - 100K".


Aceasta este presupunerea ta. Acolo nu este scris.
Dacă acceptați declarația dvs. pentru adevăr, atunci resursa reală este eeprom 100K / 8, adică 12.5K. În programele mele nu există "zgârierea" datelor stocate pe pagini diferite. Și există date situate pe o singură pagină și adesea re-scriitoare (desigur, având în vedere resursa în 100K cicluri pe octet).
Cred că, timp de 10+ ani, că lucrez cu AVR, aș fi întâlnit de mai multe ori în respingerea eeprom-ului din cauza resursei din 12K. Dar nu, nu a făcut-o.
Pentru că - nu cred. Dacă nu scrieți o solicitare într-un suport. ci să scrie leneș despre burghez.

Tsytata de la sine:
Iată ce în datashit:
"EEPROM-ul este organizat în pagini".
Ce altceva nu este clar? ))

Nu este "înregistrat", nu "programat" - și inițial "organizat" ca pagină!

Să crezi că nu crezi este problema libertății conștiinței.
Pentru mine - dacă există mai multe interpretări ale situației - aplicați cel mai restrictiv.

Este bine că acest lucru este în concordanță cu opinia insiderilor - direct de la Atmel))

- De asemenea, mulți dezvoltatori recomandă să nu se folosească EEPROM-ul celulei 0, deoarece conținutul său este cel mai adesea deteriorat când sursa de alimentare a microcontrolerului scade.

N-am avut-o, dar nu folosesc microcontrolerul pentru muncă, deci nu este un indicator. Am auzit astfel de recomandări în multe forumuri.

Articole similare