Paměťový modul
Re: Paměťový modul
Knihovnu mám napsanou pro STM32 procesory a CubeIDE (Eclipse), takže není kompatibilní s arduinem. Ale stačí v podstatě napsat 4funkce pro práci s pamětí. Povolení a zakázání zápisu (zápis hodnoty do jednoho registru) a blokové čtení a zápis. Velikost bloku je zde neomezená, takže je to jednoduché. Funkce SPI je u všech arduin podporovaná knihovnou.
Pro I2C se dělají převážně malé kapacity pamětí, protože je to pomalé rozhraní a tahat přes něj velké objemy dat je nesmyslné.
Pro I2C se dělají převážně malé kapacity pamětí, protože je to pomalé rozhraní a tahat přes něj velké objemy dat je nesmyslné.
- pavel1tu
- Příspěvky: 2054
- Registrován: 26 říj 2017, 08:28
- Reputation: 0
- Bydliště: Trutnov
- Kontaktovat uživatele:
Re: Paměťový modul
Tak já tu mám někde SRAM, tehdy jsem do ní zapisoval přes funkce nějakého příkladu z internetu.
Takže se dá řící, že to bude fungovat obdobně ?
Někdo se tu ptal na kondenzátor - ten je externí.
A koukal jsem, že je tam příkaz (nebo nožička) na okamžitý zápis do EEPROM
Takže se dá řící, že to bude fungovat obdobně ?
Kód: Vybrat vše
//Byte transfer functions
uint8_t Spi23LC1024Read8(uint32_t address) {
uint8_t read_byte;
PORTB &= ~(1<<PORTB2); //set SPI_SS low
SPI.transfer(READ);
SPI.transfer((uint8_t)(address >> 16) & 0xff);
SPI.transfer((uint8_t)(address >> 8) & 0xff);
SPI.transfer((uint8_t)address);
read_byte = SPI.transfer(0x00);
PORTB |= (1<<PORTB2); //set SPI_SS high
return read_byte;
}
void Spi23LC1024Write8(uint32_t address, uint8_t data_byte) {
PORTB &= ~(1<<PORTB2); //set SPI_SS low
SPI.transfer(WRITE);
SPI.transfer((uint8_t)(address >> 16) & 0xff);
SPI.transfer((uint8_t)(address >> 8) & 0xff);
SPI.transfer((uint8_t)address);
SPI.transfer(data_byte);
PORTB |= (1<<PORTB2); //set SPI_SS high
}
A koukal jsem, že je tam příkaz (nebo nožička) na okamžitý zápis do EEPROM
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: Paměťový modul
AstroMiK píše: ↑14 led 2021, 23:12RAM v Arduinu bude fungovat pořád stejně.
Přídavná EERAM se navenek chová jako EEPROM, akorát má neomezený počet zápisů.
Předpokládám, že s EEPROM pracovat umíš, tak s EERAM to bude stejné.
Musíš si jen napsat podprogramy, které zapíšou na příslušnou adresu požadované číslo a podprogramy, které ze zadané adresy číslo přečtou.
To bude asi ta nejsložitější část, ale možná to někdo zvládne za tebe.
Takže potom místo EEPROM.write(123,100) budeš mít třeba EERAM.write(123,100).
A naopak - místo EEPROM.read(123), budeš mít EERAM.read(123).
Děkuji za vysvětlení. Myslíš, že bys mně tu mohl dát nějaký kód jako příklad? Také jaké konkrétní podprogramy máš na mysli, děkuji.
Re: Paměťový modul
Já tu SPI verzi paměti nemám, takže to nemám na čem vyzkoušet, ale Pavel o příspěvek výše má ty příklady podprogramů pro čtení a zápis v podstatě napsané.
Musí se tam jen nastavit správné konstatny:
WRITE = 2
READ = 3
A místo těch operací s registrem PORTB by stačilo něco jako:
digitalWrite(pin_SPI_SS, LOW)
digitalWrite(pin_SPI_SS, HIGH)
Jména funkcí pak přepsat na něco lepšího. Třeba:
uint8_t EERAM_read(uint32_t address)
void EERAM_write(uint32_t address, uint8_t data_byte)
U I2C verze jsem trochu bojoval s tím, že se musela při prvním použití zapnout ta funkce zálohování do EEPROM (AutoStore Enable) - bez toho se paměť chovala jako obyčejná RAM.
V SPI verzi by ale už mělo být to automatické zálohování do EEPROM zapnuté defaultně.
Musí se tam jen nastavit správné konstatny:
WRITE = 2
READ = 3
A místo těch operací s registrem PORTB by stačilo něco jako:
digitalWrite(pin_SPI_SS, LOW)
digitalWrite(pin_SPI_SS, HIGH)
Jména funkcí pak přepsat na něco lepšího. Třeba:
uint8_t EERAM_read(uint32_t address)
void EERAM_write(uint32_t address, uint8_t data_byte)
U I2C verze jsem trochu bojoval s tím, že se musela při prvním použití zapnout ta funkce zálohování do EEPROM (AutoStore Enable) - bez toho se paměť chovala jako obyčejná RAM.
V SPI verzi by ale už mělo být to automatické zálohování do EEPROM zapnuté defaultně.
Re: Paměťový modul
Děkuji za rady. Je to velmi zajímavé. Jen bych se chtěl zeptat, jestli se nedá udělat nějakým figlem to, aby při ztrátě napětí se data zapsaly do EEPROM... Bez tady toho chipu... Asi by to mělo jít, když to jde zde, ne? Do EEPROM v průběhu chodu data zapisovat nepotřebuji (pouze při ztrátě napětí).
Re: Paměťový modul
Ten trik spociva v tom, ze monitorujes to hlavni napajeci napeti a mas zalozni zdroj (at uz UPS, nebo kondik), ktery to udrzi v chodu, nez to do te EEPROM zapises. A samozrejme musi to napajeni udrzet bez vypadku, kdyz ten hlavni zdroj lehne, aby se ti to mezitim nerestartovalo.
Re: Paměťový modul
Samozřejmě, že by se to dalo. Akorát to bude výrazně složitější, dražší a nespolehlivější, než použít jeden osminohý obvod.
JInak jsi to možná špatně pochopil, ale do té EEPROM se normálně neukládá.
Využívá se jen při té ztrátě napájecího napětí (zápis) a při jeho obnovení (čtení).
Existuje sice možnost si speciálním příkazem ty data z EEPROM vyčíst nebo zapsat i při normálním provozu, ale to není hlavní účel.
JInak jsi to možná špatně pochopil, ale do té EEPROM se normálně neukládá.
Využívá se jen při té ztrátě napájecího napětí (zápis) a při jeho obnovení (čtení).
Existuje sice možnost si speciálním příkazem ty data z EEPROM vyčíst nebo zapsat i při normálním provozu, ale to není hlavní účel.
Re: Paměťový modul
Jo, tohle jsem pochopil. Dobře, zkusím to objednat. Pak si to napájím na desku a zkusím zapojit a poté naprogramovat. Spíš nerozumím tomu, jak to bude spolupracovat s SRAM paměti na Arduinu... Když jsi mi tusim před nedávnem psal, že ta paměť od Arduina se používat klasický bude... Chápu to správně tak, že pokud nepoužiji kód (jak jsi psal viz podobné ukládání do EEPROM, akorát se píše EERAM, že by se data uložila do SRAM arduina? Tzn. Mohu využívat i dvě tyto paměti (SRAM) , že? Mohu si rozdělit data která jsou pro mě důležitá, když vypadne napětí a ukládat do toho chipu a druhá data, která pro mě důležitá při ztrátě napětí nejsou a ukládat do SRAM arduina, je tak?AstroMiK píše: ↑19 led 2021, 12:29Samozřejmě, že by se to dalo. Akorát to bude výrazně složitější, dražší a nespolehlivější, než použít jeden osminohý obvod.
JInak jsi to možná špatně pochopil, ale do té EEPROM se normálně neukládá.
Využívá se jen při té ztrátě napájecího napětí (zápis) a při jeho obnovení (čtení).
Existuje sice možnost si speciálním příkazem ty data z EEPROM vyčíst nebo zapsat i při normálním provozu, ale to není hlavní účel.
Re: Paměťový modul
RAM v Arduinu je úplně nezávislá na té přídavné EERAM paměti.
EEPROM v Arduinu také.
Ta přídavná EERAM paměť je prostě jen odkládací prostor, kam si odkládáš čísla, o které nechceš přijít při výpadku napájení.
Je to úplně stejné jako ukázkové příklady práce s vnitřní EEPROM v Arduinu. Akorát ta přídavná EERAM se opakovaným zápisem neničí.
Příklad na odkládání nějakého důležitého čísla by mohl vypadat třeba takhle:
Musí se dodělat ty podprogramy EERAM_write() a EERAM_read().
Není to vyzkoušené a možná tam jsou i nějaké překlepy, ale jde o princip:
EEPROM v Arduinu také.
Ta přídavná EERAM paměť je prostě jen odkládací prostor, kam si odkládáš čísla, o které nechceš přijít při výpadku napájení.
Je to úplně stejné jako ukázkové příklady práce s vnitřní EEPROM v Arduinu. Akorát ta přídavná EERAM se opakovaným zápisem neničí.
Příklad na odkládání nějakého důležitého čísla by mohl vypadat třeba takhle:
Musí se dodělat ty podprogramy EERAM_write() a EERAM_read().
Není to vyzkoušené a možná tam jsou i nějaké překlepy, ale jde o princip:
Kód: Vybrat vše
byte hodnota; // tohle je ta důležitá hodnota, kterou si chceš zapamatovat
void setup(void)
{
Serial.begin(9600);
delay(1000); // chvíli pauza, aby se po zapnutí napájení stačily data z EEPROM přídavné paměti zkopírovat
// zpátky do její RAM oblasti (minimální čas je třeba najít v kat. listu)
hodnota = EERAM_read(1); // poslední hodnota, která byla v přídavné pameti na adrese 1 před výpadkem napájení se vrátí do proměnné
}
void loop(void)
{
hodnota ++; // ve smyččce se každou sekundu zvětšuje hodnota o +1
EERAM_write(1,hodnota); // na adresu 1 do přídavné EERAM se uloží aktuální hodnota (na rozdíl od zápisu do EEPROM je tady počet zápisů neomezený)
delay(1000);
Serial.println(hodnota);
}
// podprogramy pro práci s EERAM
void EERAM_vrite(unsigned int adresa, byte data)
{
...
...
...
...
}
byte EERAM_read(unsigned int adresa)
{
...
...
...
...
}
Re: Paměťový modul
pavel1tu píše: ↑15 led 2021, 09:01Tak já tu mám někde SRAM, tehdy jsem do ní zapisoval přes funkce nějakého příkladu z internetu.
Takže se dá řící, že to bude fungovat obdobně ?
Někdo se tu ptal na kondenzátor - ten je externí.Kód: Vybrat vše
//Byte transfer functions uint8_t Spi23LC1024Read8(uint32_t address) { uint8_t read_byte; PORTB &= ~(1<<PORTB2); //set SPI_SS low SPI.transfer(READ); SPI.transfer((uint8_t)(address >> 16) & 0xff); SPI.transfer((uint8_t)(address >> 8) & 0xff); SPI.transfer((uint8_t)address); read_byte = SPI.transfer(0x00); PORTB |= (1<<PORTB2); //set SPI_SS high return read_byte; } void Spi23LC1024Write8(uint32_t address, uint8_t data_byte) { PORTB &= ~(1<<PORTB2); //set SPI_SS low SPI.transfer(WRITE); SPI.transfer((uint8_t)(address >> 16) & 0xff); SPI.transfer((uint8_t)(address >> 8) & 0xff); SPI.transfer((uint8_t)address); SPI.transfer(data_byte); PORTB |= (1<<PORTB2); //set SPI_SS high }
A koukal jsem, že je tam příkaz (nebo nožička) na okamžitý zápis do EEPROM
Pavle, zkoušel jsi to?
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 7 hostů