Forum: Mikrocontroller und Digitale Elektronik Arduino EEPROM Kontrolle


von Condor (condor8)


Lesenswert?

Hallo, ich bin neu hier, weiß nicht, ob ich im richtigen Unterforum bin. 
In den einschlägigen Arduino - Foren habe ich nichts gefunden. Und ja - 
Tante Google habe ich auch bemüht.
Mein Problem ist folgendes: Ich stelle mit einem Rotary Encoder einen 
Wert ein, dieser soll bei Tastendruck in den EEPROM gespeichert werden. 
Ich nutze dazu eine If Abfrage und je nach Tasterzustand wird per 
EEPROM.put gespeichert oder eben nicht (der Wert ist in der Regel größer 
als 255). Der Wert wird selten geändert, deshalb steht das ganze in der 
Loop Methode. Der Befehl EEPROM.put sollte ja eigentlich wie 
EEPROM.update funktionieren, aber genau das will ich überprüfen. Meine 
Frage ist: wie kann ich feststellen, ob der EEPROM beschrieben wurde, 
obwohl der Wert sich nicht geändert hat und der Button nicht gedrückt 
wurde? Der Sketch funktioniert einwandfrei, deshalb muss ich den hier 
nicht unbedingt anhängen. Mir fehlt nur die eine Idee, festzustellen, ob 
der EEPROM beschrieben wurde - und zwar unabhängig vom Wert.
Danke für die Hilfe C.H.

von Manfred P. (pruckelfred)


Lesenswert?

In einer ähnlichen Anwendung habe ich mich an dieser orientiert:

http://shelvin.de/3-tasten-einen-wert-einstellen-und-im-eeprom-ablegen/

von Veit D. (devil-elec)


Lesenswert?

Hallo,

lies einmal die Dokumentation.
https://docs.arduino.cc/learn/built-in-libraries/eeprom
Oder
https://docs.arduino.cc/learn/programming/eeprom-guide

Wenn du dem immer noch nicht traust wirst entweder den Code lesen oder 
einen Ausführungsnachweis in write() einbauen müssen.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Tja, ein Hoch auf Assembler - da weiß man was der Prozessor tut.

Ist schon doof wenn man seine heißgeliebte Programmiersprache nicht 
versteht, weil man nichts anderes kann, als irgendwelche Bibliotheken 
aneinander zu klicken (und das dann "programmieren" nennt).

Ansonsten spielt es doch praktisch keine Rolle ob ein Wert mit einem 
identischen Wert überschrieben wurde oder nicht, außer daß es die 
Lebensdauer des EEPROMs reduziert. Eigentlich müsste man in dieser 
Konstellation eine Funktion bauen, die überprüft, ob der Wert überhaupt 
geändert wurde und ihn auch nur dann neu schreibt. EEPROM auslesen geht 
beim AVR auch sehr schnell, beim EEPROM schreiben ist er ziemlich lahm.

von Vanye R. (vanye_rijan)


Lesenswert?

> Mir fehlt nur die eine Idee, festzustellen, ob
> der EEPROM beschrieben wurde - und zwar unabhängig vom Wert.

Schreibe nicht nur einen einzelnen Wert sondern definiere dir
einen Struct wo die Variablen die du schreiben willst rein
kommen. Ausserdem kommt da eine weitere Variable mit einer
Pruefsumme rein.
Deine Leseroutine prueft dann erstmal diese Pruefsumme
und gibt dir einen Fehler zurueck wenn die nicht stimmt.
So weisst du immer ob du deinen Daten trauen kannst.

Vanye

von M. K. (sylaina)


Lesenswert?

Ben B. schrieb:
> Tja, ein Hoch auf Assembler - da weiß man was der Prozessor tut.

Das beißt sich ein wenig mit

Ben B. schrieb:
> Ist schon doof wenn man seine heißgeliebte Programmiersprache nicht
> versteht

denn wenn man ASM nicht versteht hat man das selbe Problem.

Condor schrieb:
> Der Befehl EEPROM.put sollte ja eigentlich wie
> EEPROM.update funktionieren, aber genau das will ich überprüfen.

Ähm...mal Hand aufs Herz: Warum schaust du dir die Klasse nicht an? Dann 
würdest du folgendes angezeigt bekommen
1
struct EEPROMClass{
2
3
    //Basic user access methods.
4
    EERef operator[]( const int idx )    { return idx; }
5
    uint8_t read( int idx )              { return EERef( idx ); }
6
    void write( int idx, uint8_t val )   { (EERef( idx )) = val; }
7
    void update( int idx, uint8_t val )  { EERef( idx ).update( val ); }
8
    
9
    //STL and C++11 iteration capability.
10
    EEPtr begin()                        { return 0x00; }
11
    EEPtr end()                          { return length(); } //Standards requires this to be the item after the last valid entry. The returned pointer is invalid.
12
    uint16_t length()                    { return E2END + 1; }
13
    
14
    //Functionality to 'get' and 'put' objects to and from EEPROM.
15
    template< typename T > T &get( int idx, T &t ){
16
        EEPtr e = idx;
17
        uint8_t *ptr = (uint8_t*) &t;
18
        for( int count = sizeof(T) ; count ; --count, ++e )  *ptr++ = *e;
19
        return t;
20
    }
21
    
22
    template< typename T > const T &put( int idx, const T &t ){
23
        EEPtr e = idx;
24
        const uint8_t *ptr = (const uint8_t*) &t;
25
        for( int count = sizeof(T) ; count ; --count, ++e )  (*e).update( *ptr++ );
26
        return t;
27
    }
28
};

und hier ran sieht man, dass im Falle eines Falles update() benutzt 
wird, d.h. ist der Wert, der geschrieben werden soll identisch mit dem, 
der schon im EEPROM steht, dann wird auch nichts ins EEPROM geschrieben. 
Verstehe hier das Problem nicht und verstehe auch nicht warum man 
grundsätzlich Zweifel an erprobten Funktionalitäten von Standardklassen 
hegt. Was genau hat dich zur Annahme verleitet, dass EEPROM.put() im 
Falle eines Falles doch kein update() macht sondern einen write() 
auslöst obwohl der Wert im EEPROM mit dem Wert, der geschrieben werden 
soll, identisch ist? Ich werde ja das Gefühl nicht los, dass das Problem 
ganz wo anders liegt.

von Condor (condor8)


Lesenswert?

Ben B. schrieb:
> Ist schon doof wenn man seine heißgeliebte Programmiersprache nicht
> versteht, weil man nichts anderes kann, als irgendwelche Bibliotheken
> aneinander zu klicken (und das dann "programmieren" nennt).

Stimmt, ich kann auch die ganzen "Autoschrauber" nicht verstehen, die 
ihr Getriebe auseinander nehmen und dann nicht wissen, wie rum ein Lager 
eingebaut wird.

> Ansonsten spielt es doch praktisch keine Rolle ob ein Wert mit einem
> identischen Wert überschrieben wurde oder nicht, außer daß es die
> Lebensdauer des EEPROMs reduziert.

Eben, genau darum geht es, man sollte schon wissen, wann und wie der 
EEPROM beschrieben wird!

Danke an alle anderen, für die hilfreichen Hinweise.

M. K. schrieb:
> Was genau hat dich zur Annahme verleitet, dass EEPROM.put() im
> Falle eines Falles doch kein update() macht sondern einen write()
> auslöst obwohl der Wert im EEPROM mit dem Wert, der geschrieben werden
> soll, identisch ist?

Grundsätzliches Misstrauen gegen jeden und alles was sich einer 
(einfachen) Überprüfung entzieht... Der Arduino ist Bestandteil einer 
kleinen, nach Gewicht und mit Schrittmotor gesteuerten automatischen 
Abfüllanlage, auf die ich später keinen Zugriff mehr habe. Das sollte 
also lange und stabil laufen - was bisher auch funktioniert.
Die Beiträge von M.K. und Veit D haben mich aber überzeugt - ich lass 
das jetzt einfach mal so laufen.
C.H.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Condor schrieb:
> Grundsätzliches Misstrauen gegen jeden und alles was sich einer
> (einfachen) Überprüfung entzieht...

Die Doku ist da eindeutig!
Der Code ist eindeutig.

Für "Grundsätzliches Misstrauen" gibt es ein Wort: "Paranoia".
Ins Besondere gilt das, wenn das Misstrauen anhält, obwohl die Quellen 
offen liegen, jederzeit einsehbar sind.

von M. K. (sylaina)


Lesenswert?

Condor schrieb:
> Grundsätzliches Misstrauen gegen jeden und alles was sich einer
> (einfachen) Überprüfung entzieht.

Aber das "Problem" hier entzieht sich ja keiner einfachen Überprüfung 
oder empfindest du den Quellcode, der offen vor dir liegt, nicht als 
einfach überprüfbar?

von Peter D. (peda)


Lesenswert?

Condor schrieb:
> Ich nutze dazu eine If Abfrage und je nach Tasterzustand wird per
> EEPROM.put gespeichert

Solange die Taste gedrückt ist, wirst Du dann ein ganzes Feuerwerk an 
Schreibaktionen auslösen. Da .update ausgeführt wird, stört das aber 
nicht.

Sauberer ist natürlich die Verwendung einer guten Entprell-Lib, um nur 
einmalig das Schreiben aufzurufen.

von Steve van de Grens (roehrmond)


Lesenswert?

Ben B. schrieb:
> Tja, ein Hoch auf Assembler - da weiß man was der Prozessor tut.
>
> Ist schon doof wenn man seine heißgeliebte Programmiersprache nicht
> versteht, weil man nichts anderes kann, als irgendwelche Bibliotheken
> aneinander zu klicken (und das dann "programmieren" nennt).

Vielleicht besser mal die Füße still halten, wenn man keine Ahnung hat. 
Arduino ist Open-Source. Wenn er den dokumentierten Quelltext nicht 
versteht, wird ihm das  in Assembler Projekten noch weniger gelingen.

> Eigentlich müsste man in dieser Konstellation eine Funktion bauen, die
> überprüft, ob der Wert überhaupt geändert wurde

Ach was, wirklich? Genau das macht die Arduino Bibliothek!

: Bearbeitet durch User
von Condor (condor8)


Lesenswert?

Arduino F. schrieb:
> Für "Grundsätzliches Misstrauen" gibt es ein Wort: "Paranoia".

Da muss ich dir leider komplett widersprechen. Eine "Paranoia" 
impliziert zwingend die Erwartung von etwas "Schlechtem", je nach 
Ausprägung sogar Gefahr für Leib und Leben. Ich jedoch wollte nur 
wissen, ob der "put" Befehl tatsächlich wie "update" funktioniert. Ich 
habe keine Angst, dass der mir mein Programm zerstört oder gar einen 
Virus in meine Haus IT einschleust! Dass jedoch Misstrauen, auch 
grundsätzliches, durchaus angebracht ist wird tagtäglich unter Beweis 
gestellt - sei es durch unsere Medien, in denen Personen unwidersprochen 
das Blaue vom Himmel runterlügen können oder sei es bei unseren 
hochausgereiften Konsumprodukten, bei denen der Kunde als Betatester 
missbraucht wird. C.H.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Ich danke dir dafür, dass du mich bestätigst!

: Bearbeitet durch User
von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

> Ach was, wirklich? Genau das macht die Arduino Bibliothek!
Na gugg. Wo ist dann das Problem?!

von Steve van de Grens (roehrmond)


Lesenswert?

Ben B. schrieb:
>> Ach was, wirklich? Genau das macht die Arduino Bibliothek!
> Na gugg. Wo ist dann das Problem?!

Dass du hier fleißig über die Programmiersprache und die Bibliothek 
abgelästert hast, obwohl sie in diesem Punkt tadellos sind und genau das 
tun, was sie deiner Meinung nach tun sollen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.