Přístup do sériový Eeprom 24LC64

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

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
Celeron
Příspěvky: 20517
Registrován: 02 dub 2011, 00:00
Bydliště: Nový Bydžov

Přístup do sériový Eeprom 24LC64

#1 Příspěvek od Celeron »

Potřebuju k Atmelu přibastlit cca 6KB paměti na tabulky a občasný uložení nových dat a aby to přežilo vypnutí. Napadla mě 8KB 24LC64. Je I2C, procík ji ale nemá. Nikdy jsem s sériovkama nic nedělal a s I2C taky. Jde I2C simulovat prostým setováním a resetováním vývodů SDA a SCL, nebo je v tom nějaký zádrhel? Předpokládám, že adresy A0, A1, A2 a WP používat nebudu.
Je tu někdo, kdo si s I2C paměťma hrál? Jde mi o to, abych to nemusel celý číst a pak nezjistil, že je s tím problém...
Díky
Jirka
Uživatelský avatar
Jodr
Příspěvky: 1412
Registrován: 20 led 2008, 00:00
Bydliště: na vejminku

#2 Příspěvek od Jodr »

Vezmi k ruce datasheet paměti a najdi si jak se pamět nastaví pro zápis, čtení a jak se adresuje odkud kam má R/W probíhat. Je možné určit třeba jen bajt, nebo blok bajtů. Nic složitého. V dřevních dobách nemaje programátor, jsem to realizoval na LPT portu PC .
Uživatelský avatar
vlado5
Příspěvky: 157
Registrován: 19 črc 2011, 00:00
Bydliště: Trenčín

#3 Příspěvek od vlado5 »

Nie je s tým žiadny problém. Ak sa nevyužité vstupy pripoja na GND, treba ju len adresovať (hodnota A0h) aktivovať a posielať-čítať data. Veľmi podrobne popísané na www.dhservis.cz. Asi pred týždňom som dokončíl rutinu na 24C128 prepracovanú na procesor 8748-na vylepšenie stavebnice
PETR48, ak budem mať čas, zverejním na svetelektro.com
Uživatelský avatar
Celeron
Příspěvky: 20517
Registrován: 02 dub 2011, 00:00
Bydliště: Nový Bydžov

#4 Příspěvek od Celeron »

Díky za odkaz!
Jirka
Uživatelský avatar
Celeron
Příspěvky: 20517
Registrován: 02 dub 2011, 00:00
Bydliště: Nový Bydžov

#5 Příspěvek od Celeron »

Znáš EC1045.01 z Brna? Taky se dost snaží kolem Petra. Snad dělá, nebo chce dělat repliky.http://sapi.cz/petr/petr.php
Já to mám s tou 24LC64 trochu komplikovaný, protože nemám k dispozici žádnej bididekt port Atmela. Asi budu muset přes třístavový registr zapisovavat na jednom portu SDA a SCL a na druhým portu přes třístavový odělovač číst SDA.
Nenapadá tě prosím něco lepšího?
Díky
Jirka
Uživatelský avatar
lesana87
Příspěvky: 4403
Registrován: 20 zář 2014, 00:00

#6 Příspěvek od lesana87 »

Čemu říkáš Atmel? Řada 51 má všechny porty obousměrné s otevřeným drainem a I2C je právě potřebuje, takže z HW hlediska máš, co potřebuješ, je to jen o SW.
Uživatelský avatar
vlado5
Příspěvky: 157
Registrován: 19 črc 2011, 00:00
Bydliště: Trenčín

#7 Příspěvek od vlado5 »

Menovaného EC1045.01 osobne nepoznám, ale čítam jeho stránky. Výborne spracoval pôvodnú dokumentáciu a to nielen od PETRA ale aj od iných 8-bitov. Kto má záujem o pôvodnú dokumentáciu, je na stránkach www.litildivil.cz, s ktorým komunikujem a ktorý mi poskytol monitor tejto stavebnice v čase, keď ešte nebol nikde dostupný.
Čo sa týka ďalšieho Vášho dotazu, celkom som nepochopil čo znamená bididekt, ale pokiaľ už sú všetky porty obsadené, nezostáva nič iné, len použiť lacht.
Myslím si, že pokiaľ to zvládol procesor zo 48 rady, s ATMELOM rady 51 je to omnoho jednoduhšie, vzhľadom k jeho lepšiemu inštrukčnému súboru.
Tu je odkaz na moju nostalgickú skladačku:
http://svetelektro.com/Forum/petr-48-mini-t36310.html
Uživatelský avatar
Celeron
Příspěvky: 20517
Registrován: 02 dub 2011, 00:00
Bydliště: Nový Bydžov

#8 Příspěvek od Celeron »

lesana87 píše:Čemu říkáš Atmel? Řada 51 má všechny porty obousměrné s otevřeným drainem a I2C je právě potřebuje, takže z HW hlediska máš, co potřebuješ, je to jen o SW.

Ano, A51. Je to ale "velkej" systém, kde je datová a adresová sběrna a externí Eprom27C256, 82C55 a Timekeeper s 2KB RAM, takže P0 a P2 není. P1 je na 16 tlačítek maticový klávesnice a P3 je komplet využitý. Takže se to musí pověsit na datovou sběrnici. Adresovej dekodér je na GALu a jsou tam k dispozici 3 výstupy. Na čtení SDA stačí 1/4 74LS125 ale co tam dát na zápis SDA? Na SCL stačí 74LS74 ale pokud vím, něco s funkcí 74LS74 s třístavovým výstupem nebo aspoň otevřeným kolektorem není. Jedině za 74LS74 nabastlit tranzistor jako otevřený kolektor.
Jirka
Uživatelský avatar
lesana87
Příspěvky: 4403
Registrován: 20 zář 2014, 00:00

#9 Příspěvek od lesana87 »

Když máš 3 výstupy na GALu, tak v něm máš i 3 registry, tak pokud máš k dispozici 4 volné sousední adresy, nepotřebuješ 7474, za GAL dáš druhý dvě čtvrtiny 74125 a je to. :)
Uživatelský avatar
vlado5
Příspěvky: 157
Registrován: 19 črc 2011, 00:00
Bydliště: Trenčín

#10 Příspěvek od vlado5 »

No, v takomto zložitom systéme, kde dochádzajú HW možnosti, je každá rada dobrá. Takže možnosti sú: Ak sú volné aspon 2 porty na 82C55, je možno ju pripojiť tam. Ďalšia možnosť je použiť obvod 74HC573, ktorý je obojsmerný oddelovací register, adresovať ho cez jeden z voľných adr. výstupov GAL-u. Po prečítaní softverovo odfiltrovať nevyužité vývody, pri výstupe meniť iba adresovaný vývod (napr. D0, D1-podľa toho, kde bude zapojená EEPROM. Tretia možnosť je softverovo najkomplikovanejšia, ale
videl som aj také riešenie: Zapojiť EEPROM na niektorý vstup a výstup klávesnice. Tých pár milisekúnd obsluhy EEPROM užívateľ ani nezbadá pri zadávaní z klávesnice. Výhoda použitia I2C na EEPROM je tá, že pri činnosti klávesnice by nemala EEPROM reagovať, pokiaľ nebude aktivovaná správnym adresovaním (postupných sériových dát). Uvediem príklad symbolického zápisu čítania SDA:

stĺpec matice (1) daj do "L"
čítaj riadok 1 (tam je zapojený aj SDA) -teraz testuje stlačenie klávesy
čítaj riadok 2
. atd
.
stĺpec matice daj do "H"
čítaj riadok 1 - toto je dôležité, lebo v tomto okamžiku testuje SDA
na budenie stlpcov by bolo dobre použiť oddelovacie R,
aby pri prípadnom stlačení tlač. neovplyvňoval SDA
stĺpec matice (2) daj do "L"
.
.atd
Uživatelský avatar
Celeron
Příspěvky: 20517
Registrován: 02 dub 2011, 00:00
Bydliště: Nový Bydžov

#11 Příspěvek od Celeron »

Co třeba tohle? Při zápisu do EEPROM se SDA řídí zápisem do bitu DB0 a SCL do DB1. V klidu je I2C v High, při čtení, zápisu a clock se stahuje do Low. Takže pokud se nezapisují data , tak je IC13A ve 3. stavu. Pokud se čte, tak jde jen SCL a data jdou na DB0. Aktivní je ta EEPROM, co zkomparuje adresu 0 nebo 1.
Bude to chodit, nebo jsem něco nedomyslel?
Díky
Jirka

to vlado5: 74573 je jednostrannej trojstavovej Latch, oboustrannej je asi jen
74ls646

to lesana 87: registrovej mód Galu nejde použít, je na něm 10 vstupů.
Přílohy
EEPR.pdf
(12.45 KiB) Staženo 97 x
Uživatelský avatar
vlado5
Příspěvky: 157
Registrován: 19 črc 2011, 00:00
Bydliště: Trenčín

#12 Příspěvek od vlado5 »

Omlúvam sa, napísal som to v rýchlosti (z hlavy) ten 74573 je jednostranný.
Tie dve EEPROM, čo tam máte zapojené, je treba adresovať aj hardverovo.
To znamená kombinovať (H alebo L) vstupy A0,A1,A2-podľa dataseetu. Pri jej výbere ju treba aj softverovo adresovať. Ukážka rutín v asm:

WRADRE: CLR EMOD ;rezim PAGEWRITE
ACALL STARTE ;START podminka
ACALL EADRS ;vyber pameti pro zapis adresy!!!!
ACALL WBYTEE ;zapis
JC WRADRE ;opakuj je BUSY
MOV A,R2 ;zapis adresy
ACALL WBYTEE ;zapis

RDADRE: ACALL STARTE ;START podminka
ACALL EADRS ;vyber pameti pro zapis adresy!!!!!
ACALL WBYTEE ;zapis
JC RDADRE ;opakuj je BUSY
MOV A,R2 ;zapis adresy
ACALL WBYTEE ;zapis
ACALL STARTE ;restart
ACALL EADRS ;inicializace pameti
SETB ACC.0 ;pro cteni
ACALL WBYTEE ;zapis

Adresa je (pre pamete EEPROM A0h), pokiaľ sú adresné vstupy na GND
aj toto je v datašite-prvý byte zápisu

Teraz pozerám na schému druhý krát a vidím že to máte aj hardwarovo
rozlíšené. No zas ma moje myšlienky predbiehajú. Mohlo by to tak fungovať. Pri použití toho obojsmerného lachtu by sa ušetrilo miesto- o jedeno púzdro menej. No a teraz sa pustiť do vývoja SW- uff, držím palce!!
Uživatelský avatar
Celeron
Příspěvky: 20517
Registrován: 02 dub 2011, 00:00
Bydliště: Nový Bydžov

#13 Příspěvek od Celeron »

Zkusím to nadrátovat. Půlka 74125 tam je volná, takže by mělo stačit přeprogramovat GAL a přidat na prcíře 7474 nad některou DIL14 a vydrátovat.
Akorát mám trochu problém s adresací těch dvou EEPROM. Na DHSERVISu píšou, že starší Microchip má nohy A0-A2 bez funkce? Předpokládám, že se konkrétní EEPROM (1 z 8) vybere podle shody HW adresy a SW adresy poslaný v Slave adres po Start byte. Pokud ale nohy A0 - A1 nemají funkci, tak se nemá SW adresa s čím komparovat a bude stále vybíraná stejná EEPROM a tudíž může být osazená pouze jedna?

Slave adresa je mi snad jasná:
-pokud budu zapisovat do EEPROM 7 tak pošlu 1010 1110, pak adresu H a adresu L a datový byte. Těch můžu poslat kolik chci, adresa v EEPROM se sama inkrementuje. Skončí se stop bitem.

-pokud budu číst z EEPROM 0 tak pošlu 1010 0000, pak adresu H a adresu L. Pak tomu dál moc nerozumím. Při čtení se posílá další start bit a control byte 1010 0001 a teprve pak jdou z EEPROM čtený byte??? Těch zase můžu číst kolik chci, adresa v EEPROM se sama inkrementuje. Skončí se zase stop bitem.
Načetl jsem to z šítu Microchip. Překvapuje mě, že to je při čtení složitější než při zápisu, třeba u Flash je to opačně, pro zápis se posílá hromada řídících slov.
Jo a ještě na závěr, předpokládám, že adresa v EEPROM a data jsou z hlediska co pošlu nebo přijmu vše inverzní, je to tak?

Díky za pomoc.
Jirka
Uživatelský avatar
Celeron
Příspěvky: 20517
Registrován: 02 dub 2011, 00:00
Bydliště: Nový Bydžov

#14 Příspěvek od Celeron »

Zkusím to nadrátovat. Půlka 74125 tam je volná, takže by mělo stačit přeprogramovat GAL a přidat na prcíře 7474 nad některou DIL14 a vydrátovat.
Akorát mám trochu problém s adresací těch dvou EEPROM. Na DHSERVISu píšou, že starší Microchip má nohy A0-A2 bez funkce? Předpokládám, že se konkrétní EEPROM (jedna z osmi) vybere podle shody HW adresy a SW adresy poslaný v Slave adres po Start bit. Pokud ale nohy A0 - A1 nemají funkci, tak se nemá SW adresa s čím komparovat a bude stále vybíraná stejná EEPROM a tudíž může být osazená pouze jedna?

Slave adresa je mi snad jasná:
-pokud budu zapisovat do EEPROM 7 tak pošlu 1010 1110, pak adresu H a adresu L a datový byte a po každé čekám na ACK bit. Datových byte můžu poslat kolik chci, adresa v EEPROM se sama inkrementuje. Skončí se Stop bitem po posledním ACK.

-pokud budu číst z EEPROM 0 tak pošlu 1010 0000, pak adresu H a adresu L. Pak tomu dál moc nerozumím. Při čtení se posílá další Start bit a control byte 1010 0001 (pro EEPROM 0) a teprve pak jdou z EEPROM čtený byte??? Těch zase můžu číst kolik chci, adresa v EEPROM se sama inkrementuje. Skončí se zase stop bitem ale bez předchozího ACK.
Načetl jsem to z šítu Microchip. Překvapuje mě, že to je při čtení složitější než při zápisu, třeba u Flash je to opačně, pro zápis se posílá hromada řídících slov.
Jo a ještě na závěr, předpokládám, že adresa v EEPROM a data jsou z hlediska co pošlu nebo přijmu vše inverzní, je to tak?

Díky za pomoc.
Jirka
Uživatelský avatar
vlado5
Příspěvky: 157
Registrován: 19 črc 2011, 00:00
Bydliště: Trenčín

#15 Příspěvek od vlado5 »

Dostal som sa až teraz na forum. Čo sa týka pamätí 24CXX, štúdiu ich datašitov som venoval asi týždeň. Píšem to preto, lebo si treba uvedomiť, že nie všetky sa obsluhujú rovnako-čo sa týka adresácie čipu a adresy čítania-zápisu. Preto sú aj na stránke dh.servis rozdelené na typy 02-16 a 64 a viac. Je to preto, lebo typ 24C16 má v device addres byte aj najvyššie 3 bity adresy (asi preto nie sú u tohoto typu zapojené, lebo adr. bity nie je kde umiestniť), ďalšie slovo obsahuje nižšiu časť adresy. Typy 24C64 a viac majú device addres, first word addres a second word addres. Ďalej je treba si uvedomiť, že zápis aj čítanie z pamätí je možné buďto na danú adresu (alebo z adresy), alebo sekvenčné čítanie (od zadanej adresy) do ukončenia stop bitom a na to pozor, pri zápise je možný zápis max. po blokoch, ktoré závisia od použitej EEPROM. Píšem to preto, lebo na začiatku ste spomínal 24C64 a schéme máte 24C16. Takže pamäť ktorá nemá od výroby zapojené adr. bity je možné použiť len jednu na zbernici. Pamäť 24C256 má zapojené len A0 a A1.
To je na vysvetlenie prvých dvoch otázok. Na otázku, či sú adresa a data
inverzné, môžem odpovedať že nie. Zadávajú a čítajú sa v pôvodnom stave.
Príklad: všetky adresové vstupy uzemnené - pvrý byte: 1010 0000
adresový vstup A0 EEPROM na "H" - prvý byte: 1010 0010

Ja som si pomohol aj týmto:
http://winide51.wz.cz/downloads/51/mit_cviceni.pdf

a odniekal som stiahol aj programy k tomu, prikladám obsluhu EEPROM a displeja. Tu je jasne vidieť, ako pracuje s device addres:
Přílohy
M019_1.asm
(5.96 KiB) Staženo 96 x
Odpovědět

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