• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Żywotność EEPROM
#11
No to skąd będziesz wiedział, który z zapisanych adresów jest ten aktualny?  I tak musisz przeczytać cały zakres EEPROM by znaleźć ten największy, tylko że on nie musi być najbardziej aktualny, przecież co kilkaset minut zaczniesz zapisywać EEPROM od początku, skąd będzie wiadomo, czy minęło 100 minut czy 1500, adres może się zapisać prawidłowo, ale dane źle - CRC. To powinno być zrobione od razu OK, albo jest to tylko demo do testowania pod okiem twórcy.
Pomijając, że pewnie mylisz bity z bajtem, ale poza tym do opanowania zostało kilka instrukcji i funkcji, których przykładów jest na pęczki w necie. No i jak paczka danych ma stałe np. 4 bajty, to wystarczy je numerować 0-254 (255 to wartość czystej komórki pamięci, odczytujesz od index 0 do  index < EEPROM.length(),  index+=4, czyli tylko 1/4 bajtów, ustalasz początek, odczytujesz do struktury, sprawdzasz CRC, jeśli OK to używasz, jak nie to przesuwasz się o 4 bajty wcześniej, itd.
No albo zapisujesz cały EEPROM, kasujesz i od nowa, ale wtedy ilość/2.
A na elektrodzie jest prosty algorytm, ponoć szybki, do CRC8.
uint8_t CRC8(uint8_t *inData, uint8_t len)
{
  uint8_t crc;
  crc = 0;
  for(; len; len--)
  {
      crc ^= *inData++;
      crc ^= (crc << 3) ^ (crc << 4) ^ (crc << 6);
      crc ^= (crc >> 4) ^ (crc >> 5);
  }
  return crc;
}
Do użycia potrzebne są robaczki, chodzi o to, że argumentem funkcji musi być adres pamięci i ilość bajtów "do przerobienia", ale można to skopiować i nie wnikać w szczegóły.
Tak na czuja to numeracja zestawów powinna być tak dobrana, by było ich więcej niż zestawów zapisanych w pamięci, inaczej będzie ten sam problem jak z adresem, nie wiadomo który był ostatnio.
Tak mniej więcej wygląda zabawa z CRC8:
Kod:
uint8_t CRC8(uint8_t *inData, uint8_t len)
{
   uint8_t crc;
   crc = 0;
   for(; len; len--)
   {
      crc ^= *inData++;
      crc ^= (crc << 3) ^ (crc << 4) ^ (crc << 6);
      crc ^= (crc >> 4) ^ (crc >> 5);
   }
   return crc;
}

struct MyObject {
  uint8_t numer;
  byte pole1;
  byte pole2;
  uint8_t crc1;
};
MyObject str;

void setup() {
  // put your setup code here, to run once:
Serial.begin(115200);

//Serial.println((uint8_t)&str);

str.numer=44;
str.pole1=13;
str.pole2=33;
str.crc1 =219;
Serial.print("CRC struktury str wynosi: ");
Serial.println(CRC8(&str.numer,sizeof(str)-1));
if(CRC8(&str.numer,sizeof(str)-1)== str.crc1)
Serial.println("CRC zgadza się z zapisanym w str.crc1, dane mozna uzyc");
else  Serial.println("CRC nie zgadza się, dane do kosza");

str.crc1 =255;
if(CRC8(&str.numer,sizeof(str)-1)== str.crc1)
Serial.println("CRC zgadza się z zapisanym w str.crc1, dane mozna uzyc");
else  Serial.println("CRC nie zgadza się, dane do kosza");

str.crc1 =219;
if(CRC8(&str.numer,sizeof(str)-1)== str.crc1)
Serial.println("CRC zgadza się z zapisanym w str.crc1, dane mozna uzyc");
else  Serial.println("CRC nie zgadza się, dane do kosza");

str.pole1=12;
if(CRC8(&str.numer,sizeof(str)-1)== str.crc1)
Serial.println("CRC zgadza się z zapisanym w str.crc1, dane mozna uzyc");
else  Serial.println("CRC nie zgadza się, dane do kosza");
str.numer=45;
str.pole1=124;
str.pole2=211;
str.crc1=CRC8(&str.numer,sizeof(str)-1); //przypisanie nowej, wlasciwej wartosci CRC

Serial.print("CRC struktury str wynosi po zmianach: ");
Serial.println(CRC8(&str.numer,sizeof(str)-1));
if(CRC8(&str.numer,sizeof(str)-1)== str.crc1)
Serial.println("CRC zgadza się z zapisanym w str.crc1, dane mozna uzyc");
else  Serial.println("CRC nie zgadza się, dane do kosza"); 
//nowy zestaw danych
}

void loop() {
  // put your main code here, to run repeatedly:

}
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości