Arduino Nano EEPROM schreiben Zeitdauer

OP #7668229
Lesenswert?

Hallo in die Runde,

Irgendwo hatte ich mal gelesen, dass das Schreiben 3 ms rum ungefähr dauern soll. Bei meinen Messungen dauert eine Long Zahl aber nur 20 us und ein Byte 10 us.

CH 1 ist der Trigger CH 2 eine LED für den Schreibzyklus

Hat jemand eine Idee oder Erklärung dafür?

Danke schon mal.

Angehängte Dateien:
(Firma: Gast) #7668246
Lesenswert?

Da steht aber auch, dass das schreiben noch lange nicht abgeschlossen ist, wenn dein Programm zurückkehrt. Deine Messung ist also unvollständig

The user should poll the EEPE bit before starting the read operation. If a write operation is in progress, it is neither possible to read the EEPROM, nor to change the EEAR Register

Das gilt natürlich auch für die nächste Schreiboperation

OP #7668250
Lesenswert?

Arduino F. schrieb:

Da steht aber auch, dass das schreiben noch lange nicht abgeschlossen ist, wenn dein Programm zurückkehrt. Deine Messung ist also unvollständig

The user should poll the EEPE bit before starting the read operation. If a write operation is in progress, it is neither possible to read the EEPROM, nor to change the EEAR Register

Das gilt natürlich auch für die nächste Schreiboperation

  1. Um das EEPE Bit zu Pollen müsste meine Main Loop ja fast leer sein oder die Messung wäre falsch… sehe ich das richtig ?

  2. Also pro Byte 3,3 ms und ein Long (aus 4 Byte) wären also 13,2 ms müssten eingeplant werden, korrekt?

Dankeschön 👍

#7668257
Lesenswert?

Daniel E. schrieb:

Würde ja auch bedeuten, dass ich vor der nächsten Zahl schreiben erst die Info brauche, ob die Zahl schon fertig geschrieben ist ?

Das machen die Funktionen der lib-c, wenn man sie denn richtig nutzt.

Bin grad bissl verdatellelt, da ich bisher der Annahme war, darum kümmert sich der Compiler ?

Welchen nutzt du? Ach so, jetzt sehe ich es. Arduino. Mit welchem genauen Typ? Aber so ein "Screenshot" ist eine FRECHHEIT! Häng den Quelltext einfach als Anhang an!

(Firma: Gast) #7668267
Lesenswert?

Daniel E. schrieb:

Bin grad bissl verdatellelt, da ich bisher der Annahme war, darum kümmert sich der Compiler ?

Die Lib tut das! Aber die wartet nach dem schreiben nicht bis fertig. Sondern sie wartet vor dem lesen oder schreiben, bis fertig. Da kommt auch deine Fehlmessung her.

1
#include <Streaming.h> // die Lib findest du selber ;-)
2
Print &cout = Serial; // cout Emulation für "Arme"
3

4
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
5
{
6
  /* Wait for completion of previous write */
7
  while(EECR & (1 << EEPE));
8
  /* Set up address and Data Registers */
9
  EEAR = uiAddress;
10
  EEDR = ucData;
11
  /* Write logical one to EEMPE */
12
  EECR |= (1 << EEMPE);
13
  /* Start eeprom write by setting EEPE */
14
  EECR |= (1 << EEPE);
15
  /* Wait for completion of previous write */
16
  while(EECR & (1 << EEPE));
17
}
18

19
void setup()
20
{
21
  Serial.begin(9600);
22
  cout << F("Start: ") << F(__FILE__) << endl;
23

24
  unsigned long start = micros();
25
  EEPROM_write(42, 'x');
26
  cout << (micros() - start) << endl;
27
}
28

29
void loop()
30
{
31

32
}

Sagt 3416 Also 3,4ms wie es in meinem Datenblatt steht. Und nicht 3,3ms wie in deinem

(Firma: Gast) #7668275
Lesenswert?

Steve van de Grens schrieb:

Wo ist denn der Quelltext davon? Finde ich nicht.

Einfach zu finden... https://github.com/vancegroup-mirrors/avr-libc/blob/06cc6ff5e6120b36f1b246871728addee58d3f87/avr-libc/libc/misc/eewr_byte.S

Steve van de Grens schrieb:

Ich kriege zum verrecken nicht heraus, ob Arduino nach jedem Schreibzugriff wartet, oder erst vor dem nächsten Schreibzugriff.

Natürlich wird davor geprüft und gewartet

Angehängte Dateien:
#7668342
Lesenswert?

Steve van de Grens schrieb:

Ich kriege zum verrecken nicht heraus, ob Arduino nach jedem Schreibzugriff wartet, oder erst vor dem nächsten Schreibzugriff.

In den meisten Fällen ist es doch absolut sinnlos, hinterher darauf zu warten, dass der EEPROM Schreibzugriff abgeschlossen wird. Nachdem der Controller die Daten übergeben hat, kann er sich besser anderen Dingen zuwenden.

Einzig in einer Schaltung, wo der uC sich selber den Strom abdreht, muss er warten, bis das EEPROM fertig ist.

Gast #7668352
Lesenswert?

Arduino F. schrieb:

Einfach zu finden...

Danke. Mein Fehler war, dass ich nur in C(++) Quelltexten gesucht habe.

Natürlich wird davor geprüft und gewartet

Ja, offensichtlich. Wenn man also nur einen einzelnen Schreibzugriff macht und dessen Zeit misst, sieht man von den erwarteten 3,3 ms nichts.

#7668354
Lesenswert?

Rainer W. schrieb:

In den meisten Fällen ist es doch absolut sinnlos, hinterher darauf zu warten, dass der EEPROM Schreibzugriff abgeschlossen wird.

Solange du immer nur 1 einzelnes Byte schreibst, ja. Aber das würde ich nicht zu "den meisten Fällen" zählen. Solche wie der TO hier, er schreibt einen Wert der aus mehreren Bytes besteht, kommen sicher häufiger vor.

Egal, grundsätzlich ist das Prüfen des Completion-Bits direkt vor dem nächsten Schreibvorgang sinnvoller. So kann er die Zeit, die er "hinterher" warten müsste ggfs. sinnvoller nutzen und nicht in einer Busy-Loop warten, bis das nächste Byte zur Verfügung steht.

OP #7668359
Lesenswert?

Einzig in einer Schaltung, wo der uC sich selber den Strom abdreht, muss er warten, bis das EEPROM fertig ist.

Guten morgen an alle.

Danke für die Rückmeldung. Das Strom abdrehen ist genau mein Anwendungsfall. Ein Unterspannungskomparator geht auf einen Interrupt Eingang und soll sichern, wenn Spannung weg. Für die Kapazitätsauslegung wollte ich wissen, wenn das Schreiben fertig ist.

Sind das grob für eine Long Zahl dann die 4x 3,4 ms ?

Danke und schönen Pfingstmontag.

#7668374
Lesenswert?

900ss schrieb:

Solange du immer nur 1 einzelnes Byte schreibst, ja. Aber das würde ich nicht zu "den meisten Fällen" zählen.

Quatsch - auch wenn man mehrere Bytes schreiben will, ist es sinnlos, NACH jedem Byte zu warten, dass der EEPROM-Schreibvorgang beendet ist. Da kann der Controller lieber sinnvolle Dinge tun und dann auch schon das nächste Byte bereit legen. In 3.4ms kann er einen Haufen nützlicheres Zeugs tun, als Däumchen drehend auf ein Ready-Bit zu warten, jedenfalls wenn der Programmierer in das Lage ist, die anstehenden Aufgaben passend zu strukturieren.

Du hast es richtig erkannt - warum widersprichst du dir also selbst.

#7668380
Lesenswert?

Daniel E. schrieb:

Das Strom abdrehen ist genau mein Anwendungsfall. ... Sind das grob für eine Long Zahl dann die 4x 3,4 ms ?

Salamischeibe - warum schreibst du nicht gleich, dass es um Dimensionierung für Stromausfall geht?

Steve van de Grens schrieb:

Danach kommt kein weiterer Schreibzugriff mehr, also kann es nicht länger dauern.

Die Schlussfolgerung ist falsch. Wenn vorher zufällig ein Schreibzugriff lief, muss der abgewartet werden. In diesem Worst-Case kann es sogar passieren, dass man 5x 3,4ms warten musst.

Beim Stromausfall musst du gucken, dass du den möglichst an einer Stelle in der Spannungsversorgung detektierst, die vor dem Speicherelko liegt und davon entkoppelt ist, um eine möglichst große Vorwarnzeit zu erreichen. Außerdem ist eine Prüfsumme für den EEPROM-Inhalt nicht die schlechteste Idee, damit du sicher sein kannst, dass die Daten vollständig geschrieben wurden.

OP #7668395
Lesenswert?

Quatsch - auch wenn man mehrere Bytes schreiben will, ist es sinnlos, NACH jedem Byte zu warten, dass der EEPROM-Schreibvorgang beendet ist. Da kann der Controller lieber sinnvolle Dinge tun und dann auch schon das nächste Byte bereit legen.

Kann er die nächsten Bytes alle unmittelbar direkt hintereinander legen oder muss er warten, bis das erste fertig geschrieben ist ?

Ich Frage wegen dem An/ Aus/ an / aus in meiner eeprom Routine.

Danke.

Gast #7668399
Lesenswert?

Daniel E. schrieb:

Kann er die nächsten Bytes alle unmittelbar direkt hintereinander legen oder muss er warten, bis das erste fertig geschrieben ist ?

Die Arduino EEPROM Klasse wartet, wenn nötig, vor jedem Schreibzugriff. Also ja, du kannst unmittelbar nacheinander ins EEPROM schreiben.

Aber sie wartet nicht nach dem (letzten) Schreibzugriff. Deswegen darfst du nicht sofort danach die Stromversorgung unterbrechen.

Das haben wir doch gerade geklärt!

Gast #7668417
Lesenswert?

Deine Frage ist unklar. Was meinst du mit "behandelt" und wer setzt was?

Schau doch ins Datenblatt, da ist beschrieben, was der Chip macht.

Und den Link zum Arduino Quellcode (Assembler) haben wir ja auch bekommen. Das siehst du, was er vor jedem Schreibzugriff macht.

#7668447
Lesenswert?

Rainer W. schrieb:

Quatsch - auch wenn man mehrere Bytes schreiben will, ist es sinnlos, NACH jedem Byte zu warten, dass der EEPROM-Schreibvorgang beendet ist.

Ach? Genau das hab ich doch beschrieben/gemeint. Aber du hast sicher nur die Hälfte gelesen und dann auf deine freundliche Art gleich losge- "quatscht" :)

900ss schrieb:

Egal, grundsätzlich ist das Prüfen des Completion-Bits direkt vor dem nächsten Schreibvorgang sinnvoller. So kann er die Zeit, die er "hinterher" warten müsste ggfs. sinnvoller nutzen und nicht in einer Busy-Loop warten, bis das nächste Byte zur Verfügung steht.

#7668452
Lesenswert?

Daniel E. schrieb:

Werden wohl mal ein Testprogramm schreiben, um das noch besser zu verstehen…

Am meisten würde zum Verstehen helfen, wenn du dir das Datenblatt des Controllers nimmst und dir eigene EEprom-Routinen schreibst. Danach hast du sicher vollständig verstanden, wie es funktioniert. Du kannst ja auch in Arduino die Register so ansprechen, als wenn du Arduino nicht hattest sondern "nur" die AVR GCC Toolchain. Dieses "Vorgekaute" versteckt halt sehr viel, was dir aber eigentlich helfen würde. Wenn man versteht was passiert ist das "Vorgekaute" natürlich sinnvoll und hilfreich.

(Firma: Gast) #7668493
Lesenswert?

Daniel E. schrieb:

Warum, wenn abgewartet wird, wird dann meine LED mehrfach AN/ AUS gesetzt?

Steh da grad etwas auf dem Schlauch.

Weil du Mist misst. Oder die Rechnung ohne den Wirt machst.

Klarer: Du verwendest EEPROM.put() EEPROM.put() verwendet intern EEPROM.update() Und EEPROM.update() prüft bevor es schreibt, ob sich die Daten unterscheiden. Bei gleichen Daten wird nicht geschrieben, also kehrt es auch sofort zurück. Also in dem Fall ist nix mit 3,4 ms

#7668542
Lesenswert?

Harald K. schrieb:

Ist eigentlich schon jemandem aufgefallen, daß der Code, der da im Eröffnungsscreenshot steht, eine ISR zu sein scheint?

Mir sind da hauptsächlich Aliasing Effekte wegen fehlendem Filter aufgefallen ;-)

Arduino F. schrieb:

Ja! Schien mir aber keine besondere Relevanz zu haben...

Normalerweise will man den µC nicht über etliche Millisekunden in einer ISR einsperren.

(Firma: Gast) #7668627
Lesenswert?

Harald K. schrieb:

Das da oben dient dann der "code obfuscation", oder was?

Woher soll ich das wissen?

Ich schätze eher, dass das alles eher mit Fantasie zu tun hat. Die ganze Frage scheint in die Richtung zu gehen.

Dabei ist die Realität doch recht klar. Klar im Datenblatt. Klar im Code.

Und leicht zu bestätigen, siehe: Beitrag "Re: Arduino Nano EEPROM schreiben Zeitdauer"

In diesem Fall gibt es keine Chance das Datenblatt in Frege zu stellen. Wenn dann nur in der Fantasie. Und wenn Fantasie auf die Realität trifft, kann das durchaus wie Obfuscation aussehen, ist aber eher Selbsttäuschung. Wissenslücken mit bunten Bildern ausgemalt.

Auch ist es schon mal so, dass Kommentare stehen bleiben, auch wenn sich der Kontext geändert hat. Hier, kann das keine ISR sein, vielleicht eine Funktion, welche von einer ISR aufgerufen wird, ok. Davon ist aber nichts zu sehen.

Der Grund: void EXT_ISR_6() Ist eine normale Funktion. Es fehlen alle Attribute, welche eine ISR benötigt.

ISR(EXT_ISR_6) so sieht der Kopf einer ISR mit allen nötigen Attributen aus. Wobei der m328p keinen solchen Vector hat.

(Firma: 1984now) #7668631
Lesenswert?

Harald K. schrieb:

Kann natürlich sein. Das da oben dient dann der "code obfuscation", oder was?

[...]

Jepp. Löst sich sehr wahrscheinlich dann auf, wenn man den Kontext vollständig kennt.

Könnte z.B. (einer der) tatsächlich ausgeführten Routinen sein, die über einen Selektor (einer Statemachine) oder Funktionszeiger aus der eigentlichen ISR angesprungen werden.

Beides ist ein recht übliches Konstrukt. Obfuskativ ist sicher nur die Benamsung und Kommentierung.

Aber: In einem offensichtlichen Troll-Posting ist das ja auch kaum anders erwartbar. Irgendwie müssen ja falsche Fährten gelegt werden, sonst wird der Thread viel zu kurz...

(Firma: Gast) #7668752
Lesenswert?

Ob S. schrieb:

Und Wissen läßt sich oft einfach aus eine Analyse des Bekannten extrahieren...

Das mit dem "einfach" glaube ich dir so einfach nicht nicht.

Eine Kohärenz lässt sich manchmal leicht finden. Die Kausalitäten zu finden ist manchmal deutlich schwieriger. Dann erst wird es mit dem Wissen auch was.

Menschen sind nicht so leicht zu durchschauen. Das macht aber nichts, denn dafür gibts ja Plattitüden und Vorurteile, die gleichen Wissen und Kausalität liebend gerne aus.

OP #7668753
Lesenswert?

Huch, soviel Gedanken zum Thema, auch dass der Nano einen internen Komparator hat, welchen ich nicht genommen habe, weil ich die Pins für was anderes gebraucht habe …

Ja, das ist eine ISR die aufgerufen wird, weil die Ladung im Elko begrenzt ist und ich nicht ewig warten kann zumal das Display auch etliche ms in der Main zu werkeln hat.

Ist da bitte was schlimmes dran und was soll das mit Troll Post ?

Danke an alle.

#7668943
Lesenswert?

Daniel E. schrieb:

Sind das grob für eine Long Zahl dann die 4x 3,4 ms ?

Wenn man den Bereich im Eeprom vorher schon löscht, dauert danach jedes Byte statt 3,4ms nur 1,8ms.

Den Flash-Speicher zu beschreiben könnte sogar noch schneller sein. Das dauert zwar etwas länger als ein einzelnes Eeprom-Byte, dafür bekommt man in der Zeit eine ganze Seite geschrieben.

HTH.

LG, Sebastian

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren