I2C FRAM Breakout

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
Patrik
Příspěvky: 199
Registrován: 02 dub 2020, 09:58
Reputation: 0

I2C FRAM Breakout

Příspěvek od Patrik » 18 bře 2021, 09:25

Ahoj,

chtěl bych se zeptat, dlouho hledám nějakou příručku na programování paměti I2C FRAM Breakout 32 KB a to zápis a čtení dat. Nemohu však na Internetu nic smysluplného najít... Dále bych se chtěl zeptat, do FRAM paměti chci zapisovat čísla od 0 do 50 (tzn. vlezu se do osmibitového čísla). Je však nějak možné zapisovat do této paměti i delší číslo? např. 32 bit? Děkuji.

Uživatelský avatar
Caster
Příspěvky: 380
Registrován: 11 zář 2019, 09:02
Reputation: 0

Re: I2C FRAM Breakout

Příspěvek od Caster » 18 bře 2021, 12:56

Overview | Adafruit I2C FRAM Breakout | Adafruit Learning. Kliknutím na zelené tlačítko "Download Adafruit_FRAM_I2C Library" si stáhni knihovnu, kde máš příklady kódu k otestování paměti.

Patrik
Příspěvky: 199
Registrován: 02 dub 2020, 09:58
Reputation: 0

Re: I2C FRAM Breakout

Příspěvek od Patrik » 24 bře 2021, 11:17

Děkuji mockrát 😊

Patrik
Příspěvky: 199
Registrován: 02 dub 2020, 09:58
Reputation: 0

Re: I2C FRAM Breakout

Příspěvek od Patrik » 28 bře 2021, 21:27

Chtěl jsem se zeptat, jelikož se do jedné paměťové buňky vejde číslo 0-255 je nějakým způsobem možné uložit číslo delší? Např. 1234567?? Děkuji.

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: I2C FRAM Breakout

Příspěvek od gilhad » 29 bře 2021, 00:29

Zajiste - ulozit ho po jednotlivych bytech (idealne stejne jako to mas v pameti)

Kód: Vybrat vše

	int START_IN_FRAM = 0x20; // nebo kam to chci ulozit
	unsigned long long VeryLongVar = 0x12345678; // nebo libovolna jina promenna a hodnota
...
	byte *p=(uint8_t *)VeryLongVar; // co chci psat
	byte size=sizeof(VeryLongVar); // jak je to dlouhe
	int addr=START_IN_FRAM; // kam to chci psat
	
	for(int i=0; i<size; i++, p++) {fram.write8(addr+i,*p);}; // zapis po bytech
	
	int next_addr=addr+size; // kam muzu psat neco dalsiho

Patrik
Příspěvky: 199
Registrován: 02 dub 2020, 09:58
Reputation: 0

Re: I2C FRAM Breakout

Příspěvek od Patrik » 06 dub 2021, 23:47

Děkuji za radu.. A jak to prosím tě přečíst? Už se o to snažím 2 hodiny a vždy mi to načte úplně jiné číslo... Chci uložit jen hodnotu integer. (bude tam číslo do 2000)

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: I2C FRAM Breakout

Příspěvek od gilhad » 07 dub 2021, 00:58

Uplne stejne, jen misto zapisu cteni

Kód: Vybrat vše

int START_IN_FRAM = 0x20; // nebo kde to je
	unsigned long long VeryLongVar = 0; // teoreticky nulovani neni potreba
...
	byte *p=(uint8_t *)VeryLongVar; // co chci cist
	byte size=sizeof(VeryLongVar); // jak je to dlouhe
	int addr=START_IN_FRAM; // kam to chci psat
	
	for(int i=0; i<size; i++, p++) {*p=fram.read8(addr+i);}; // cteni po bytech
	
	
	

Patrik
Příspěvky: 199
Registrován: 02 dub 2020, 09:58
Reputation: 0

Re: I2C FRAM Breakout

Příspěvek od Patrik » 07 dub 2021, 07:33

Děkuji za radu, pak vyzkouším... Moc nechápu ten ukazatel... Mohl bys mně prosím to nějak jednodušeji vysvětlit? A je možno místo unsigned long long použít int, když nechci ukládat větší číslo, než 65 tisíc?

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: I2C FRAM Breakout

Příspěvek od gilhad » 07 dub 2021, 07:50

Muzes pouzit libovolny typ.
Trik je v tom, ze pamet je vlastne pole bytu (bunek o velikosti jeden byte) a do ni se vsechno uklada.
Takze kdyz si vezmes ukazatel na 1 byte, tak ukazuje prave na jednu bunku pameti (a to na co ukazuje je nutne cislo od 0 do 255). Kdyz ten ukazatel (nikoli to na co ukazuje) zvysis o jedna (p++), tak ukazuje na dalsi bunku v pameti.
Takze kdyz ho nechas ukazovat na zacatek nejake promenne a pak ho postupne zvysujes o jedna (posouvas na dalsi bunku) tolikrat, kolik bytu ta promenna zabira, tak postupne ukazuje na jeji jednotlive casti, jak jsou ulozeny v pameti.
A kdyz vezmes na co prave ukazuje (jeden byte), tak to muzes vzit a ulozit treba do nejake bunky v te FRAM. A kdyz to same udelas s dalsi a dalsi bunkou, tak tam postupne preneses celou tu promennou.
A prenos zpatky zase funguje tak, ze z FRAM vezmes 1. byte a das ho tam, kam ukazuje ten ukazatel, pak posunes ukazatel, vezmes dalsi byte a das ho na to dalsi misto, az postupne slozis cely obsah te puvodni promenne.

Idealne si to nakresli na kostickovany papir, nebo tak neco, je to vlastne velice jednoduche, primocare a intuitivni - kdyz si predstavis, ze mas z jednoho sloupecku prekopirovat obsah do druheho, ale smis naraz kopirovat jen jeden ctverecek, tak to budes delat presne stejne. A nazpatek taky.

Patrik
Příspěvky: 199
Registrován: 02 dub 2020, 09:58
Reputation: 0

Re: I2C FRAM Breakout

Příspěvek od Patrik » 08 dub 2021, 20:08

Děkuji za rozsáhlý popis, budu si to muset nakreslit, pac to moc stále nechápu 😁 dnes jsem to zkusil zadat do programu a nějak mi to stále nefunguje.. Respektive po vypnutí napětí mi to čte úplně jiná data.. A neprepisuji si buňku, schválně jsem zvolil adresu kde jistě nezapisuji... Prostě mám číslo od 0 do 1500 a toto číslo zvyšují o 1 každou minutu a chtěl bych to číslo zapsat do FRAM a potom z té FRAM přečíst do proměnné.. Aha možná jsem přišel na chybu kterou jsem udělal 😳😁 ale nemám kontroler doma, tak to nemám možnost vyzkoušet... Ale jen bych to chtěl popsat a chtěl bych si být už jistý, že to bude fungovat a nejlépe bych to chtěl i pochopit... Prostě to číslo od 0 zvyšují každou minutu o 1 až do 1500 pak dojde v rámci cyklu k vynulovani a děje se tak pořád.. Tzn každou minutu musí být zápis do FRAM a po každé ztrátě napětí musí být nactena tato hodnota do proměnné minuty...

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 26 hostů