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

Odpovědět
paycz
Příspěvky: 4
Registrován: 18 kvě 2018, 16:23
Reputation: 0

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

Příspěvek od paycz » 05 bře 2021, 18:24

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

paycz
Příspěvky: 4
Registrován: 18 kvě 2018, 16:23
Reputation: 0

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

Příspěvek od paycz » 05 bře 2021, 18:57

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

jankop
Příspěvky: 1026
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

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

Příspěvek od jankop » 05 bře 2021, 19:06

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.

paycz
Příspěvky: 4
Registrován: 18 kvě 2018, 16:23
Reputation: 0

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

Příspěvek od paycz » 05 bře 2021, 19:19

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

jankop
Příspěvky: 1026
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

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

Příspěvek od jankop » 05 bře 2021, 22:03

Sice jsi vůbec nepochopil, co jsem ti chtěl říct, ale hlavně, že ti to funguje.

paycz
Příspěvky: 4
Registrován: 18 kvě 2018, 16:23
Reputation: 0

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

Příspěvek od paycz » 06 bře 2021, 00:25

vyzkoušej mi více popsat svojí myšlenku. Rád bych se něco nového naučil

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

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

Příspěvek od ondraN » 07 bře 2021, 18:11

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;

Odpovědět

Kdo je online

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