Stránka 1 z 1

F-Ram Uložení velkého čísla

Napsal: 05 bře 2021, 18:24
od paycz
Ahoj, používám modul F-ram od Adafruit s jejich knihovnou, ale po uložení čísla většího jak 4000 se mi v sériovém monitoru zobrazí záporné číslo. Zkoušel jsem mnoho variant a u všech stejný výsledek :oops:

úprava před uložením/ po čtení

Kód: Vybrat vše

float FRamReadBank(unsigned int Address)
{
  float EEPROMReadBankResult = ReadFromFRam(Address);
  EEPROMReadBankResult = EEPROMReadBankResult / 10;
  return EEPROMReadBankResult;
}



float FRamWriteBank(unsigned int Address, float Number)
{
  // Serial.print("float number ");
  //Serial.println(Number, 5);
 unsigned int EEPROMBuffer = Number * 10;
  //Serial.println(EEPROMBuffer, DEC);
  WriteToFRam(Address, EEPROMBuffer);
}
read/write

Kód: Vybrat vše

int ReadFromFRam(int Address)
{
  byte byte1 = fram.read8(Address);
  byte byte2 = fram.read8(Address + 1);
  return (byte1 << 8) + byte2;
}

int WriteToFRam(int Address, int Number)
{
  fram.write8(Address, (Number >> 8)  );
  fram.write8(Address + 1, (Number & 0xFF)); 
}

Re: F-Ram Uložení velkého čísla

Napsal: 05 bře 2021, 18:57
od paycz
Zkoušel jsem zapsat číslo na přímo.

Kód: Vybrat vše

 WriteToFRam(1,65000);
 Serial.println(ReadFromFRam(1));
výstup sériového monitoru: -536

Re: F-Ram Uložení velkého čísla

Napsal: 05 bře 2021, 19:06
od jankop
Vidím tady nějaký rozpor:

Kód: Vybrat vše

int ReadFromFRam(int Address)
{
  byte byte1 = fram.read8(Address);
  byte byte2 = fram.read8(Address + 1);
  return (byte1 << 8) + byte2;
}

int WriteToFRam(int Address, int Number)
{
  fram.write8(Address, (Number >> 8)  );
  fram.write8(Address + 1, (Number & 0xFF)); 
}
Co se stane, když odrotuješ byte 8x doleva? Použil bych integer.

Re: F-Ram Uložení velkého čísla

Napsal: 05 bře 2021, 19:19
od paycz
rozdělím 2byte --->> 16bitů na 2x 1byte 8bitů. Kód je správně, ale v datových typech jsem měl bordel takže mi přetíkal :lol: :lol: :lol:

Kód: Vybrat vše

float FRamReadBank(unsigned int Address)
{
  unsigned int EEPROMReadBankResultUI = ReadFromFRam(Address);
  float EEPROMReadBankResult = EEPROMReadBankResultUI / 10;
  return EEPROMReadBankResult;
}



float FRamWriteBank(unsigned int Address, float Number)
{
 unsigned int EEPROMBuffer = Number * 10;
  WriteToFRam(Address, EEPROMBuffer);
}

int ReadFromFRam(int Address)
{
  byte byte1 = fram.read8(Address);
  byte byte2 = fram.read8(Address + 1);
  return (byte1 << 8) + byte2;
}

int WriteToFRam(int Address,unsigned int Number)
{
  fram.write8(Address, (Number >> 8)  );
  fram.write8(Address + 1, (Number & 0xFF)); 
}
přiložil jsem funkční kód kdyby se v tom někdo také zamotal :D

Re: F-Ram Uložení velkého čísla

Napsal: 05 bře 2021, 22:03
od jankop
Sice jsi vůbec nepochopil, co jsem ti chtěl říct, ale hlavně, že ti to funguje.

Re: F-Ram Uložení velkého čísla

Napsal: 06 bře 2021, 00:25
od paycz
vyzkoušej mi více popsat svojí myšlenku. Rád bych se něco nového naučil

Re: F-Ram Uložení velkého čísla

Napsal: 07 bře 2021, 18:11
od ondraN

Kód: Vybrat vše

return (byte1 << 8) + byte2;
To je z toho prvního kódu. Byte má 8 bitů. Když jakékoli osmibitové číslo posuneš o 8bitů, je to VŽDY nula.
Správně by to mělo být takhle

Kód: Vybrat vše

return ((int)byte1 << 8) + byte2;