Zdravím,
dělám přístroj s LCD displejem řízený MCU ATmega8. Bohužel jsem zjistil že se mi celý program nevejde do programové paměti z důvodu že asi 1KB který ještě potřebuju, zabírají znakové řetězce které se vypisují na onen displej. Proto jsem se rozhodl použít I2C EEPROM 24LC16B, z důvodu že při návrhu řídící desky, jsem myslel doředu a vyvedl si TWI a USART na konektory, což se mi teď hodí. Přes PonyProg jsem do paměti natáhl HEX soubor s znakama, takže řeším jen čtení.
Bohužel s TWI i s EEPROM dělám poprvé, což vede k tomu že pokud něco nejde tak nevím jestli mám chybu v programu nebo v komunikaci.
Pro úplnost control byte (slave adresa) vypadá takto:
1|0|1|0|B2|B1|B0|R/W, kde B0 až B2 je adresa stránky.
(Organizace 8x256B = 2KB = 16Kbit) - tak jsem to pochopil ze sheetu.
Protože mám k dispozici LCD displej, zobrazuju na něm stavové kódy z registru TWSR. Dále mám k dispozici knížku od Davida Matouška - Práce s mikrokontroléry Atmel AVR ATmega16 se kterou jsem se v programu dopracoval do toho stavu:
Odešlu start bit, vrácen kód 0x08 - OK;
Odešlu slave adresu 0b10100000 - vrácen kód 0x18 - OK;
Odešlu offset 0b00000000 - vrácen kód 0x28 - OK;
Odešlu start bit, vrácen kód 0x10 - KO;
Odešlu slave adresu 0b10100001 - vrácen kód 0x40; - nevím jestli dobře nebo špatně
Nyní předpokládám že mi EEPROM začne valit data bajt po bajtu dokud nevgeneruji stopbit.
Dále jsem postupoval tak že jsem vynuloval TWINT čekal na nastaveni (cekani na prijem), přečetl TWDR, uložil si přijatou hodontu takto to udělal 16x v cyklu a poté zobrazil na displeji kde se zobrazuji paznaky protože je něco špatně. Ikdyž mi ponyprog tvrdí že texty začínají od adresy 0, kterou se snažím nastavit a číst z ní. Do těla cyklu jsem dal kod ktery mi rovněž vypisoval stavovy kod, ve vysledku se mi displej pomaloval napisy 0x50 coz svedci o tom ze z te EEPROMky nějaka data lezou, ale špatna. Podprogram pro vypis řadku na displej mám odladěný.
Je tu prosím někdo kdo těm EEPROMkám řady 24XXXXX rozumí a poradil by mi nebo spíš prozradil co dělám špatně?
Ano použil jsem vnitřní pull-upy, bohužel deska je již vyrobená, a použití vnější EEPROM se mi zdá jako nejjednoduší řešení co se týče konstrukce.
Přesně takový postup používám, ale data která přečtu neodpovídají. Ještě zkontroluji program. V zapojení podle mne chyba není protože ta paměť se mnou komunikuje, stavové kody to potvrzují. Spíš by mě zajímalo jestli je správně kód 0x10 a 0x40.
Děkuji za rozšíření obzoru. O těchto typech jsem neměl tušení.
Bohužel nejbližší kamenný obchod s elektronikou tyto typy nemá v nabídce, a objednávat se mi ho nechce. Ale díky za tip. Určitě je to řešení a pokud selže EEPROM, toto řešení použiji. První jsem myslel že ATmega168 je úplně jiná ale jak název napovídá je to atmega 8 s větší FLASH. Děkuji za info.
Pull-upy dám vnější, a vnitřní zakážu, doufám že už to půjde.
Nevím přesně,( nechce se mi to hledat) jaký odpor mají vnitřní pullupy, ale rozhodně bude mnohem vyšší než 4k7 doporučované pro I2C - z vlastní zkušenosti vím, že při PU 47k už to nefunguje.
Jen připomínka k tvým příspěvkům - pokud možno neupravuj své starší příspěvky pozpátku, když už za nima je plno reakcí - někdo, kdo si otevře třeba až dnes v tom bude mít docela “hokej” že ti radíme to , co jsi vlastně udělal - třeba ty pullupy - reaguješ úpravou příspěvku na odpovědi na něj.
Rozdíl je opravdu FF, ale adresa 0x0200 v této paměti neexistuje.
Paměť je rozdělená do osmi stránek po 256 bajtech.
Adresu stránky nastavíme pomocí bitů 3,2,1 ve “slave_address”.
Adresu bajtu ve stránce určuje “adresa_v_eeprom”, která má rozsah 0-FFh.
Při zápisu musíme určit stránku i adresu ve stránce
//zápis do stránky 0
slave_address = 0b10100000;
i2c_start();
i2c_write(slave_address+Write); //stránka
i2c_write(adresa_v_eeprom); //adresa ve stránce
…
//zápis do stránky 1
slave_address = 0b10100010;
i2c_start();
i2c_write(slave_address+Write);
i2c_write(adresa_v_eeprom);
…
Ještě bych poznamenal, že za zhruba stejný peníz se dá koupit
24c32 nebo 64, které jsou adresovány souvisle dvoubajtovou adresou.