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.
In einer ähnlichen Anwendung habe ich mich an dieser orientiert: http://shelvin.de/3-tasten-einen-wert-einstellen-und-im-eeprom-ablegen/
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.
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.
> 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
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.
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.
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.
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?
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.
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!
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.
> Ach was, wirklich? Genau das macht die Arduino Bibliothek!
Na gugg. Wo ist dann das Problem?!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.