Stránka 1 z 1

Ukladani/nacitani dat z/do EEPROM

Napsal: 26 bře 2010, 16:12
od frontm4n
zdravim....
..potreboval bych poradit jak ukladat nebo cist data do EEPROM za provozu.

KOnkretne mam vztvorenou structuru Profil, ktera obsahuje (nazev a 4 parametry)....a tu bych potreboval prekopirovat do EEPROM .....

Hodil by se nejaky priklad v Cecku pro EEPROM v ATMEGA16.

diky

Napsal: 26 bře 2010, 16:47
od Andrea

Napsal: 26 bře 2010, 16:52
od frontm4n
ten sem pred chvili taky nasel...jdu to prostudovat a snad to pochopim

Napsal: 26 bře 2010, 19:10
od frontm4n
Porad mi to nejde... :(

mam vytvorenou strukturu NEWp ktera obsahuje {pole1[9];pole2[1];pole3[2]; 2x promenna typu double} napocital sem 31 BYTU

...pouzil sem nasledujici makro:
eeprom_write_block((void*)&NEWp, (const void*)5, 31);

podle toho co sem nastudoval by to melo prekopirovat celou strukturu do eeprom ale nefunguje to... nakopiruje se jen obsah pole1 a dal uz je to pomatene

obdobna strukturu v eeprom zrejme vytvorit nejde nebo ano?

Jak byste to resili??
Dik za radu

Napsal: 26 bře 2010, 19:18
od GeorgeB
Já jsem na zálohu proměnných používal rozklad proměnné na jednotlivé byty a ty jsem ukládal.
Vypadalo to nějak takhle:
void long_save(long long_name, unsigned int eeprom_addr)
{
unsigned char* ukazatel;
unsigned char i;
i=0;
ukazatel = (unsigned char*)&long_name; //save
// prekopiruje bajt po bajtu do pole
for (i=0;i<4;i++)
{
eeprom_write_byte((unsigned char *)(eeprom_addr+i),*(ukazatel+i));
}
}

Napsal: 26 bře 2010, 19:24
od Andrea
C je vyšší programovací jazyk do značné míry strojově nezávislý. Programátor se nemusí starat, co je jak uložené v paměti, co má kolik bajtů a pod. Jako cenu za to platí to, že ani neví, jak to je v paměti uložené, co má kolik bytů, jak je to za sebou řazené... A tudíž by ani neměl psát program, který by na tom byl jakkoliv závislý.
V assembleru si všechno musíš hlídat, ale zase to máš všechno pod palcem.
Závěr: Použij nějaké jednoduché proměnné (byte, word, pole), u kterých je to uložení v paměti (snad) známé a ukládej každou takovou proměnnou zvlášť.

Napsal: 26 bře 2010, 20:20
od rnbw
Struktury v C sa daju pouzit tak, aby bolo definovane presne ulozenie v pamati - akurat treba vypnut zarovnanie. V GCC sa na to pouziva "__attribute__ ((packed))". Taketo struktury sa daju velmi pekne vyuzit a casto ich pouzitie rozhoduje o tom, ci je program pekny alebo humus.

Napsal: 26 bře 2010, 21:15
od frontm4n
ok, dik tohle ukladani sem uz po celodenni snaze vyresil....

Jeste by me zajimalo jak poresit aby pri prvnim spusteni prazdne profily neobsahovali nejake zmatene znaky,ale aby tam bylo napriklad <empty> a az se vytvori nejaky profil tak aby se uz nacetli pozadovane hodnoty.

Napsal: 26 bře 2010, 21:22
od GeorgeB
frontm4n píše:Jeste by me zajimalo jak poresit aby pri prvnim spusteni prazdne profily neobsahovali nejake zmatene znaky,ale aby tam bylo napriklad <empty> a az se vytvori nejaky profil tak aby se uz nacetli pozadovane hodnoty.

Řešení je asi mnoho. Fungovat by to mohlo na principu kontrolního součtu. Tedy mít vyhrazený jeden byte v eeprom právě pro CRC a při spuštění kontrolovat správnost. Jednodušší, ale né stoprocentní metoda je místo CRC bytu v eeprom mít jen nějaký příznakový byte, do kterého se po načtení správných "profilových" hodnot uloží nějaké specifické číslo. Je-li tam po špuštění jíné číslo(obdoba špatného crc), tak brát hodnoty v eeprom jako "empty"...