Sari la conținut
ELFORUM - Forumul electronistilor

Scriere/citire EEPROM la un Atmega32


Vizitator Fir3Splitter

Postări Recomandate

Vizitator Fir3Splitter

In primul rand as dori sa stiu daca aici(sectiune/forum) se pot discuta probleme legate de cod? Daca nu atunci rog frumos sa se stearga postul pentru a nu ocupa spatiu degeaba.Daca se poate, atunci as avea o mica dilema. Pentru citirea datelor din EEPROM folosesc codul: eeprom_read_block((void*)&emem, (const void*)1, 7); hr_set=emem[0]; eeprom_read_block((void*)&emem, (const void*)2, 7); min_set=emem[1]; eeprom_read_block((void*)&emem, (const void*)3, 7); hr_clr=emem[2]; eeprom_read_block((void*)&emem, (const void*)4, 7); min_clr=emem[3]; eeprom_read_block((void*)&emem, (const void*)5, 7); vol=emem[4]; eeprom_read_block((void*)&emem, (const void*)6, 7); ph_ref1=emem[5]; eeprom_read_block((void*)&emem, (const void*)7, 7); ph_ref2=emem[6];Iar pentru a le scrie in EEPROM folosesc secvente asemanatoare in diferite functii:De ex pentru setarea aprinderii la o anumita ora:Mem[0] = hr_set;Mem[1] = min_set;eeprom_write_block ((const void*)&Mem, (void *)1, 7);in alta functie pentru hr_clr si min_clr la fel, apoi in alte functii pentru vol si in alta functie pentru ph_ref1 si ph_ref2Problema este ca merge pe jumate. Adica...pentru hr_set,min_set,hr_clr,min_clr merge perfect, pentru orice altceva nu. Cele cu _set sunt in alta functie fata de cele cu_clr (o functie pentru timpul de pornire, alta pentru timpul de oprire). De exemplu pentru ph_ref1 si 2:Mem[5] = ph_ref1;Mem[6] = ph_ref2;eeprom_write_block ((const void*)&Mem, (void *)1, 7);Nu merge.Intrebare; De ce pentru primele merge si pentru celelalte nu merge? Are cineva o idee cum sa repar/ fac sa mearga cum trebuie?Multumesc anticipat.

Link spre comentariu
  • Răspunsuri 4
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • nana

    2

Vizitator sethab

desi nu prea am pus mana pe avr, pot sa iti doar o idee: verifica sa respectii timpii de citire/scriere in EEPROM....mai precis intre operatiile insiruite.eu foloseam ceva delay-uri intre operatii pe care le luam din datasheetul EEPROM-ului (fie intern sau extern)

Link spre comentariu

Pune si tu corpurile functilor ca sa vedem exact despre ce e vb.2 Nu cred ca e vb de timpi de acces al memoriei pentru ca daca ar fi de timp nu ar merge a 2 citire nu 3 merg si restul pauza, daca bucla se executa iterativ.

Link spre comentariu
Vizitator Fir3Splitter

Initial voiam sa folosesc functile din eeprom.h. Dar se pare ca nu am reusit sa ii dau de cap. Am rezolvat problema. Am lucrat cu registrii ca si in database si am rezolvat. Insa tot nu inteleg de ce nu mergea varianta anterioara.Pun in continuare o functie mai scurta, restul fiind de peste 100 de linii si nu am loc aici. Jos de tot e comentat cum scriam initial in EEPROM.void Macroset (){uint8_t sel=0;while(1){LCDClear();LCDWriteString("Cantitate: OK");LCDWriteIntXY(11,0,macro,3);//PointerLCDWriteStringXY((sel*2)+10,1,"^^");//Input Up keyif(GetKeyStatus(1)) { if(!GetPrevKeyStatus(1)) { if(sel==0) { if(macro==0) { macro=macro+10; } else { macro=macro+10; } } if(sel == 1) { //OK break; } }}//Input Downif(GetKeyStatus(0)) { if(!GetPrevKeyStatus(0)) { if(sel==0) { if(macro==0) { macro=0; } else { macro=macro-10; } } if(sel == 1) { //OK break; } }}if(GetKeyStatus(2)){if(!GetPrevKeyStatus(2)){//Change Selectionif(sel==1)sel=0;elsesel++;}}PREV_PINB=PINB;_delay_loop_2(30000);}//Save macro VOLUME to EEPROM——————————————————————Mem[7] = macro;//eeprom_write_block ((const void*)&Mem, (void *)1, 7); <----------------------------------------------Asta o foloseam inainteEEPROM_write(8,Mem[7]);LCDClear();LCDWriteString(" Message !");LCDWriteStringXY(0,1,"Volume set!");uint8_t i;for(i=0;i<10;i++)_delay_loop_2(0);}

Link spre comentariu
  • 2 luni mai târziu...

Scuze ca scriu in topicul tau dar ca sa nu mai deschid un topic aiurea ca sa incarc forumul ca si asa e destul de incarcat postez in acceasi sectiune ca si tine mai ales ca tine de un atmega32 si tot de eeprom.

 

Compilator folosit CodeVision

Ceea ce vreau sa realizez este o functie care accepta ca parametru de intrare un pointer la o structura de memorie creeata in eeprom, astfel aceea structura sa imi returneze dupa incrementarea adresei pointer-ului de apelare, pointer-ul catre urmatoare structura.

 

eeprom  struct alarma{    unsigned char activ;    unsigned char h,m,s,zz,ll,aa;    float T1,T2,T3;}alarm; unsigned char i;struct alarma eeprom *test(struct alarma eeprom *app){   app->h=i;    app->m=i+1;    app->activ=0x07;    i++;     return app++;    }struct alarma eeprom *ep,*aux;void main(void){      ep=&alarm;        ep->h=12;    ep->m=13;    ep->activ=0x07;    i=0;    while (i<10){    aux=&test(ep);  <- nu functioneaza     ep=aux;        }}

Orice alta metoda de abordare este de ajutor, fara variabile globale !!

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări