Vizitator Fir3Splitter Postat Ianuarie 4, 2011 Partajează Postat Ianuarie 4, 2011 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
Vizitator sethab Postat Ianuarie 6, 2011 Partajează Postat Ianuarie 6, 2011 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
nana Postat Ianuarie 6, 2011 Partajează Postat Ianuarie 6, 2011 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 Postat Ianuarie 8, 2011 Partajează Postat Ianuarie 8, 2011 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
nana Postat Martie 11, 2011 Partajează Postat Martie 11, 2011 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
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum