EEPROM problemen.

Arduino specifieke Software
Berichten: 3
Geregistreerd: 01 Nov 2018, 20:45

EEPROM problemen.

Berichtdoor dippides » 02 Nov 2018, 14:59

Hoi,

Ben met mijn derde Arduino projectje bezig, dus ben nog niet heel ervaren. EEPROM had ik nog niet gebruikt. Nu wil ik voor mijn huidige projectje (Tuinverlichting) een tweetal waarden opslaan op de interne EEPROM.

Ik heb een RTC klokje in het project dat ik als een schakelklokje wil gebruiken. Daartoe wil ik de starttijd en de tijdsduur dat aangeschakeld wordt opslaan op de EEPROM. Beide waarden zijn in seconden.

Als ik dit stukje code gebruik:

Code: Alles selecteren
   else if (user_input == 'S') { //Set klok starttijd
      KlokStart = Serial.parseInt();
      Serial.println(KlokStart, 10);
      EEPROM.put(0, KlokStart);
      EEPROM.get(0, KlokStart);
      Serial.println(KlokStart, 10);



En ik tik in de seriële monitor: S57200, dan wordt twee maal 57200 geprint in de uitvoer.

Als ik echter update wil gebruiken i.p.v. put, dan komen er vreemde waarden uit.

Code: Alles selecteren
   else if (user_input == 'S') { //Set klok starttijd
      KlokStart = Serial.parseInt();
      Serial.println(KlokStart, 10);
      EEPROM.update(0, KlokStart);
      EEPROM.get(0, KlokStart);
      Serial.println(KlokStart, 10);


Als ik dan S57200 tik, dan komt er in eerste instantie hetzelfde resultaat als boven. Maar als ik vervolgens S57000 tik dan is het eerste getal 57000, maar het tweede getal 57256. Dus de update lijkt de waarde aan te passen.


Nu hoef ik die klok niet zo vaak te verzetten dat ik me zorgen moet maken om de levensduur van de EEPROM, dus eigenlijk kan ik gewoon put gebruiken i.p.v. update. Maar ik zou toch graag willen weten wat hier gebeurt.


Groeten.

Advertisement

Gebruikers-avatar
Berichten: 4890
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: EEPROM problemen.

Berichtdoor nicoverduin » 02 Nov 2018, 16:05

Update werkt maar 1 byte bij. En dat is anders als je een unsigned int gebruikt. Je kan dus beter EEPROM_Anything gebruiken
vb.

cpp code
#include "Arduino.h"
#include <EEPROM.h>
#include <EEPROMAnything.h>

void setup()
{
Serial.begin(9600);
unsigned long klokStart = 0;

Serial.println("Test1");
while (Serial.available() == 0) {};
char c = Serial.read();
if (c == 'S') {
klokStart = Serial.parseInt();
Serial.println(klokStart, 10);
EEPROM_writeAnything(0, klokStart);
EEPROM_readAnything(0, klokStart);
Serial.println(klokStart, 10);
}
}

void loop()
{
}
Docent HBO Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 1853
Geregistreerd: 06 Aug 2016, 01:03

Re: EEPROM problemen.

Berichtdoor Koepel » 02 Nov 2018, 16:57

@nico, wat dacht je hier van:

cpp code
template< typename T > const T &put( int idx, const T &t ){
EEPtr e = idx;
const uint8_t *ptr = (const uint8_t*) &t;
for( int count = sizeof(T) ; count ; --count, ++e ) (*e).update( *ptr++ );
return t;
}

https://github.com/arduino/ArduinoCore-avr/blob/master/libraries/EEPROM/src/EEPROM.h#L137

De EEPROM_Anything is in de EEPROM library gestopt, en dat zijn de EEPROM.put() en EEPROM.get() functies.
De EEPROM.put() heeft zelfs al een "update" en geen "write".

Ik heb mijn spielerei (https://github.com/Koepel/CommonSensorClass/blob/master/CommonSensorClass.h) op de nieuwe EEPROM.put() gebaseerd.

@dippides, De referentie van de EEPROM functies schiet te kort.
https://www.arduino.cc/en/Reference/EEPROM

Er zijn oude functies (EEPROM.write, EEPROM.read, EEPROM.update) die iets met één byte per keer doen. En er zijn nieuwe functies (EEPROM.put, EEPROM.get) die de lengte van de variabele gebruiken.

Wanneer die verschillende soorten door elkaar heen gebruikt worden, dan gaat het mis.
Je kunt bijvoorbeeld "unsigned long klokStart" gebruiken met EEPROM.put() en EEPROM.get() en dan worden er 4 bytes geschreven en gelezen.

Berichten: 3
Geregistreerd: 01 Nov 2018, 20:45

Re: EEPROM problemen.

Berichtdoor dippides » 02 Nov 2018, 17:14

Bedankt.

Koepel schreef:Er zijn oude functies (EEPROM.write, EEPROM.read, EEPROM.update) die iets met één byte per keer doen. En er zijn nieuwe functies (EEPROM.put, EEPROM.get) die de lengte van de variabele gebruiken.

Wanneer die verschillende soorten door elkaar heen gebruikt worden, dan gaat het mis.
Je kunt bijvoorbeeld "unsigned long klokStart" gebruiken met EEPROM.put() en EEPROM.get() en dan worden er 4 bytes geschreven en gelezen.


Begrijp ik dan goed dat put nu equivalent is aan update?

Gebruikers-avatar
Berichten: 1853
Geregistreerd: 06 Aug 2016, 01:03

Re: EEPROM problemen.

Berichtdoor Koepel » 02 Nov 2018, 17:36

De EEPROM.put() kan meerdere bytes schrijven en kijkt (voor ieder byte afzonderlijk) eerst of het gewijzigd is, voordat het wordt geschreven, omdat de EEPROM.put() functie zelf de EEPROM.update() aanroept (voor ieder byte afzonderlijk).

In de sketch kun je beter de EEPROM.update() niet mengen met EEPROM.put(). Dat zijn twee verschillende soorten.

Je kunt gewoon EEPROM.put() en EEPROM.get() gebruiken, en dan heb je precies wat je wilt. Het EEPROM wordt alleen geschreven als er iets gewijzigd is.

Kun je misschien je sketch laten zien om twee waarden op te slaan ?

Als jouw 'klokStart' uit 4 byte bestaat, dan kun je de ene op locatie 0 schrijven en de volgende op locatie 4. Bij EEPROM.put() en EEPROM.get() zul je dus altijd zelf bij moeten houden hoeveel bytes er werkelijk geschreven en gelezen worden.

Berichten: 3
Geregistreerd: 01 Nov 2018, 20:45

Re: EEPROM problemen.

Berichtdoor dippides » 05 Nov 2018, 20:05

Koepel schreef:Kun je misschien je sketch laten zien om twee waarden op te slaan ?


Code: Alles selecteren
   else if (user_input == 'S') { //Set klok starttijd
      KlokStart = Serial.parseInt();
      EEPROM.put(0, KlokStart);
   }
   else if (user_input == 'T') { //Set klok tijdsduur
      KlokDuur = Serial.parseInt();
      EEPROM.put(sizeof(long), KlokDuur);
   }

Gebruikers-avatar
Berichten: 1853
Geregistreerd: 06 Aug 2016, 01:03

Re: EEPROM problemen.

Berichtdoor Koepel » 05 Nov 2018, 20:56

Dat is correct :D
Je kunt ook de "int16_t" en "uint32_t" dingen gebruiken, dan is het altijd van een bepaald aantal bytes.

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Google [Bot] en 2 gasten