Ukladani/nacitani dat z/do EEPROM

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
frontm4n
Příspěvky: 62
Registrován: 15 říj 2009, 00:00

Ukladani/nacitani dat z/do EEPROM

#1 Příspěvek 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
Naposledy upravil(a) frontm4n dne 26 bře 2010, 16:24, celkem upraveno 2 x.
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#2 Příspěvek od Andrea »

Uživatelský avatar
frontm4n
Příspěvky: 62
Registrován: 15 říj 2009, 00:00

#3 Příspěvek od frontm4n »

ten sem pred chvili taky nasel...jdu to prostudovat a snad to pochopim
Uživatelský avatar
frontm4n
Příspěvky: 62
Registrován: 15 říj 2009, 00:00

#4 Příspěvek 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
Uživatelský avatar
GeorgeB
Příspěvky: 1248
Registrován: 21 lis 2005, 00:00
Bydliště: Pardubice
Kontaktovat uživatele:

#5 Příspěvek 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));
}
}
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#6 Příspěvek 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ášť.
Uživatelský avatar
rnbw
Příspěvky: 37419
Registrován: 21 bře 2006, 00:00
Bydliště: Bratislava

#7 Příspěvek 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.
Uživatelský avatar
frontm4n
Příspěvky: 62
Registrován: 15 říj 2009, 00:00

#8 Příspěvek 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.
Uživatelský avatar
GeorgeB
Příspěvky: 1248
Registrován: 21 lis 2005, 00:00
Bydliště: Pardubice
Kontaktovat uživatele:

#9 Příspěvek 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"...
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“