Arduino Polska Forum
Zapis odczyt EEprom double, float - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Piaskownica (https://forum.arduinopolska.pl/dzial-piaskownica)
+--- Wątek: Zapis odczyt EEprom double, float (/watek-zapis-odczyt-eeprom-double-float)



Zapis odczyt EEprom double, float - iwi - 10-03-2018

Witajcie.

Znalazłem taką funkcję
Kod:
//======================== EEPROM
void EEPROMWritelong(int address, long value)
     {
     //Decomposition from a long to 4 bytes by using bitshift.
     //One = Most significant -> Four = Least significant byte
     byte four  = (value & 0xFF);
     byte three = ((value >> 8) & 0xFF);
     byte two   = ((value >> 16) & 0xFF);
     byte one   = ((value >> 24) & 0xFF);

     //Write the 4 bytes into the eeprom memory.
     EEPROM.write(address    , four);
     EEPROM.write(address + 1, three);
     EEPROM.write(address + 2, two);
     EEPROM.write(address + 3, one);
     }

//This function will return a 4 byte (32bit) long from the eeprom
//at the specified address to address + 3.
long EEPROMReadlong(long address)
     {
     //Read the 4 bytes from the eeprom memory.
     long four = EEPROM.read(address);
     long three = EEPROM.read(address + 1);
     long two = EEPROM.read(address + 2);
     long one = EEPROM.read(address + 3);

     //Return the recomposed long by using bitshift.
     return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF);
     }

Problem w tym, że nie mogę tymi funkcjami prawidłowo zapisać danych współrzędnych GPSa

Mam zmienne pozycja_LAT i pozycja_LON typu float oraz flat i flon - dane z GPSu
dołożyłem dwie zmienne pomocnicze llat i llon typu long i teraz tak dokonuję zapis do EEPROM


Kod:
         EEPROMWritelong(121,flat*1000000);
         EEPROMWritelong(125,flon*1000000);

Kod:
    llat        = EEPROMReadlong(121); //EEPROMWritelong(121,50052254);    
    llon        = EEPROMReadlong(125); //EEPROMWritelong(125,20076146);
    pozycja_LAT = (float)(llat/1000000);
    pozycja_LON = (float)(llon/1000000);

Próbowałem też na siłę wrzucić dane ale to nic nie daje. Cały czas w EEpromie jest tylko 50,0 i 20,0

Mnożenie przez 1000000 wykonuję żeby pozbyć się przecinka i potem dzielę żeby ten przecinek odzyskać

Wszystko fajnie tylko że to nie działa


RE: Zapis odczyt EEprom double, float - kaczakat - 10-03-2018

Wczoraj opisałem float w eeprom tu: https://forum.arduinopolska.pl/watek-jak-zapisa%C4%87-w-eeprom-float-nie-dzia%C5%82a-mi-put-get - to w całości rozwiąże problem.
Jest w AVR coś takiego jak domyślna promocja do INT, jeśli w wyrażeniu używasz float i 1000, to 1000 lepiej zapisać tak 1000.0. Obawiam się, że zapis (float)(Ilat/1000000) powoduje rzutowanie na float już wyniku obciętego do liczb całkowitych. Dla pewności wyrzuć sobie te dane na serial i oczkami zobacz, czy efekt jest taki jak zaplanowany.


RE: Zapis odczyt EEprom double, float - iwi - 10-03-2018

Wystarczyło zmienić albo dopisać rzutowanie
Kod:
   pozycja_LAT = (float)((float)llat/1000000);
   pozycja_LON = (float)((float)llon/1000000);
przed zmienną long a nie przed wyrażeniem.
Ale jeszcze napomknę że z terminalem to nie jest taka prosta sprawa (jest prosta, ale trzeba wiedzieć) ponieważ domyślnie daje tylko 2 miejsca po przecinku. Ale wystarczy dodać po zmiennej drugą wartość i już jest ok
Kod:
Serial.print(pozycja_LAT,6);
Serial.print(pozycja_LON,6);



RE: Zapis odczyt EEprom double, float - kaczakat - 11-03-2018

Oczywiście, można pozycja_LAT = (float)((float)llat/1000000), można też pozycja_LAT = ((float)llat/1000000.0), Serial.print(llat/1000000.0,6) zadziała, można też użyć istniejących funkcji put/get typowych dla arduino (a dla wielu zmiennych połączonych w strukturę) lub eeprom_update_block()/eeprom_read_block() przygotowanych w AVR <avr/eeprom.h>. Dla każdej filozofii programowania odpowiednie rozwiązanie. Można też grzebnąć w bibliotece, bo ta zmienna jest w GPS przechowywana jako liczby całkowite i taka konwersja w te i wewte jest po prostu zadziwiająca.