Jump to content
ELFORUM - Forumul Electronistilor
Sign in to follow this  
binox

Problema variabile stocate in EEPROM

Recommended Posts

Salut!

M-am lovit recent de o problemuta ciudata a carei cauza nu o inteleg.

E vorba de un proiect bazat pe ATMEGA64 la care am nevoie sa stochez niste variabile in EEPROM. Pana ieri aveam 10 variabile, 8 de tip char si 2 de tip unsigned int. Totul functiona normal. Ieri am vrut sa mai adaug inca o variabila char in EEPROM moment in care programul meu a inceput sa lucreze haotic. Am si un display cu un mic meniu si meniul e afisat aiurea, butoanele lucreaza aiurea.

Am tot dat undo pana am izolat problema.

Initial aveam asa:

char EEMEM EEtr,EEvitezatr,EEfinishtemp,EEmod,EElumina,EElimba,EEx,EEy;         uint EEMEM EErange1,EErange2;
si functioneaza totul OK.

Daca in schimb mai adaug o vraiabila,

char EEMEM EEtr,EEvitezatr,EEfinishtemp,EEmod,EElumina,EElimba,EEx,EEy,EEz;         uint EEMEM EErange1,EErange2;
totul o ia razna si nu inteleg de ce. Intre varianta functionala si cea nefunctionala asta-i singura diferenta, doar declararea lui EEz.

Programul il am scris in Atmel Studio, iar la output am asa pt varianta functionala:

Program Memory Usage : 17554 bytes 26.8 % Full

Data Memory Usage : 2158 bytes 52.7 % Full

EEPROM Memory Usage : 12 bytes 0.6 % Full

iar pt cea nefunctionala:

Program Memory Usage : 17554 bytes 26.8 % Full

Data Memory Usage : 2158 bytes 52.7 % Full

EEPROM Memory Usage : 13 bytes 0.6 % Full

Aveti idee care ar fi problema?

Share this post


Link to post
Share on other sites

Poate că EEz e vreun cuvînt rezervat. Încearcă un alt nume.

Share this post


Link to post
Share on other sites
:85 Înţeleg perfect numele acestei variabile. Da' ştii cum? PERFECT!În altă ordine de idei, fiecare accesare a unei variabile din EEPROM durează vreo 10ms. Poate ai vreo problemă cu timpii de execuţie.

Share this post


Link to post
Share on other sites

Pai la asta ultima nu e problema de accesare, e suficient sa o declar si-mi da peste cap tot programul. Doar am declarat-o n-am scris nimic in ea si nici n-am citit-o.Prima data am incercat varianta completa, adica am declarat-o ,am scris in ea si apoi am citit-o,dar cand am vazut ce balarii se intampla am inceput sa scot din cod sa vad care-i bucata care genereaza balariile, asa am izolat chestia cu declaratul. Oricum de citit le citesc pe toate o singura data la inceputul programului si gata.

Share this post


Link to post
Share on other sites

N-ar fi mai bine să-ţi faci propriile rutine de scris în EEPROM?

Share this post


Link to post
Share on other sites

Pai folosesc libraria continuta de Avrstudio care-i facuta de ei, sunt mult prea departe de nivelul la care as putea face o librarie mai buna decat cele facute de Atmel.

Share this post


Link to post
Share on other sites

A trebuit să sap ceva prin arhive, dar am găsit. Chiar dacă e pentru CodevVision, se paote modifica uşor şi pentru AVR GCC. Ia la tata:

//***************************************************************************************void eeprom_write(unsigned char address, unsigned char * source, unsigned char size){  unsigned char data;    // Write data in EEPROM  while (size--)  {    // Copy data to local buffer    data = *(source++);    // Wait until EEPROM is ready    while ((EECR & 0x02) !=0)    {    }    #asm("cli");    // Choose address and data    EEARL = address++;    EEARH = 0x00;  // High byte unused    EEDR  = data;        // Enable writing    EECR |= 0x04;    EECR |= 0x02;    #asm("sei");  }} // end function eeprom_write()//***************************************************************************************void eeprom_read(unsigned char address, unsigned char * destination, unsigned char size){  unsigned char data;    // Write data in EEPROM  while (size--)  {    // Wait to finish a possible write    while ((EECR & 0x02) !=0)    {    }    #asm("cli");    // Set address    EEARL = address++;    EEARH = 0x00;    // Enable reading    EECR |= 0x01;    // Read data    data = EEDR;    *(destination++) = data;    #asm("sei");  }} // end function eeprom_read()

Share this post


Link to post
Share on other sites

Pana sa incerc cu alte functii pt accesarea eeprom, am rezolvat cumva problema dar tot n-am inteles care-i faza...Cumva am rezolvat, dar tot n-am inteles cauza...Apasand haotic pe butoane la un moment dat si-a revenit meniul. M-am apucat si am verificat prin meniu toate variabilele din eeprom si le-am rescris manual pt ca aveau valori aiurea.Treaba e si mai ciudata pt ca atunci cand incarcam programul in mc modificam doar flash-ul nu si continutul eeprom (am selectat fusebiti ca sa se pastreze continutul eepromului in timpul programarii)Dupa ce am rescris prin intermediul meniului valorile din eeprom totul a inceput sa functioneze normal. Am mai scris o data flashul cu acelasi continut sa vad daca-mi altereaza din nou continutul eeprom dar nu a mai facut asta. Urmatorul pas a fost sa folosesc functiile de scriere si citire(cele din biblioteca atmel pe care le folosisem si inainte) si pt ultima variabila, cea care genera probleme, si deocamdata totul pare sa functioneze ok.

Share this post


Link to post
Share on other sites

În altă ordine de idei, fiecare accesare a unei variabile din EEPROM durează vreo 10ms. Poate ai vreo problemă cu timpii de execuţie.

Asta nu e chiar așa, citirea presupune 4 cicluri de clock, este foarte rapidă, scrierea însă durează vreo 8,5ms conform datașet.

Share this post


Link to post
Share on other sites

Aşa e, acum am citit şi eu. Era logic, de altfel.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.