Paměťový modul

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Paměťový modul

Příspěvek od ondraN » 15 led 2021, 07:59

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é.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Paměťový modul

Příspěvek od pavel1tu » 15 led 2021, 09:01

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ě ?

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
}
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
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

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

Re: Paměťový modul

Příspěvek od Patrik » 15 led 2021, 20:38

AstroMiK píše:
14 led 2021, 23:12
RAM 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.

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Paměťový modul

Příspěvek od AstroMiK » 16 led 2021, 06:01

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ě.

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

Re: Paměťový modul

Příspěvek od Patrik » 19 led 2021, 11:44

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í).

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

Re: Paměťový modul

Příspěvek od gilhad » 19 led 2021, 12:23

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.

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Paměťový modul

Příspěvek od AstroMiK » 19 led 2021, 12:29

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.

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

Re: Paměťový modul

Příspěvek od Patrik » 19 led 2021, 14:07

AstroMiK píše:
19 led 2021, 12:29
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.
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říspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Paměťový modul

Příspěvek od AstroMiK » 19 led 2021, 14:35

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:

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)
  {
    ...
    ...
    ...
    ...
  }



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

Re: Paměťový modul

Příspěvek od Patrik » 21 led 2021, 20:55

pavel1tu píše:
15 led 2021, 09:01
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ě ?

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
}
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

Pavle, zkoušel jsi to?

Odpovědět

Kdo je online

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