Uhrzeit sinnvoll im EEprom speichern

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Michael schrieb:

      Eine Zelle = ... = 2Bytes
      Dann wäre For l = 1 to 509 step 2 ?
      Es würde das Highbyte des words je 254 mal "umsonst" schreiben.
      Wie ist das physikalisch? Würde folgender code:

      Quellcode

      1. dim z as byte
      2. do
      3. for z = $FF to $F0 step -1
      4. writeeerom z , 1
      5. next
      6. loop
      7. end
      das byte1 des EErom zerschießen? oder nur die 4 lowbits oder wird immer eine Zelle geschrieben, bedeutet byte0 und 1 würden beschädigt oder byte1 und 2 ???

      six1 schrieb:

      Das EERAM ist nichtflüchtig.
      Bedeutet das es nicht aus dem Chip flüchtet :D
      Seine Daten behält es nur eine gewisse Zeit. Abhängig von Schreibzugriffen und Chiptemperatur liegt diese zwischen ein paar Tagen(bei Mißhandlung als 'ram') bis über 100Jahre (bei nur lesezugriffen und coolem (<25°) Chip)

      @Michael Der Beginn bei byte1 weil byte 0 instabil sein könnte? Vielleicht den Zähler auch in byte 0 schreiben dann wissen wir in xJahren ob es wirklich versagt hat wenn sein Wert<> Byte 511 ist.
      Ich erwachte Deinen Bericht auch noch wenn da 3 drinsteht ;)

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Pluto25 ()

    • Ich bin mir nicht sicher, ob die Lebensdauerberechnung so stimmt. Wie geschrieben, hängt das meiner Meinung nach von der HW-Implementierung des EEPROMS ab, meist sind die individuellen Bytes in Blöcken (Pages) zusammengefasst.
      Beispiel M32 (Datenblatt S. 265 - Programming EEPROM) hat 4-Byte Pages. Um ein Byte in der Page zu ändern, muss die ganze Page geschrieben werden.
    • zaubara schrieb:

      Ich bin mir nicht sicher, ob die Lebensdauerberechnung so stimmt. Wie geschrieben, hängt das meiner Meinung nach von der HW-Implementierung des EEPROMS ab, meist sind die individuellen Bytes in Blöcken (Pages) zusammengefasst.
      Beispiel M32 (Datenblatt S. 265 - Programming EEPROM) hat 4-Byte Pages. Um ein Byte in der Page zu ändern, muss die ganze Page geschrieben werden.
      um so wichtiger wäre es, nach dem Schreiben den Inhalt zu kontrollieren und bei Fehlern einen Pointer zu erhöhen. <--- Im EEPROM!

      EEPROM: Data retention: 20 years at 85°C/100 years at 25°C


      Edit: Ich habe mich oben verschrieben! (zu sehr von meinem 3D Drucker abgelenkt...) Es muss natürlich EEPROM heißen und nicht EERAM! :/
      Code first, think later - Natural programmer :D
    • Das schreiben eines Byte braucht 41 Take (incl Byte Variable einlesen (Writeeeprom 1,1 geht nicht a_67_e210de67 ) )
      Alle Ints werden abgeschaltet, die Adresse wird in High und Lowbyte ausgeführt und dann wird das byte (und die drei alten Werte der nächsten 3 geschrieben??) dann die Ints wieder eingeschaltet. Nun müsten vorhernoch die drei Byte eingelesen werden die nicht verändert werden sollen. Reichen dann die 41 Takte?
    • zaubara schrieb:

      Beispiel M32 (Datenblatt S. 265 - Programming EEPROM) hat 4-Byte Pages. Um ein Byte in der Page zu ändern, muss die ganze Page geschrieben werden.
      Guter Hinweis, wie sieht das beim Meag8 aus?

      Wenn ganze Pages geschrieben werden, aber davon nur einzelne Bits geändert, dann würde ja der Rest-Inhalt nicht umgeladen und damit auch weniger beschädigt werden?

      Pluto25 schrieb:

      Dann wäre For l = 1 to 509 step 2 ?

      Pluto25 schrieb:

      Der Beginn bei byte1 weil byte 0 instabil sein könnte?
      Irgendwie hast du Tomaten auf den Ohren.

      Dieses Stück Code findet den Index der ersten Speicherzelle (16Bit) , die zum Beschreiben geeignet ist.

      BASCOM-Quellcode

      1. Dim Ee_zeit(200) As Eram Word
      2. Dim Index As Byte
      3. Dim Temp As Word
      4. For Index = 1 To 200
      5. Temp = Ee_zeit(index)
      6. If Temp <= 15 Then
      7. Else
      8. Exit For
      9. End If
      10. Next
      Alles anzeigen
    • Sieht so aus, als ob der Page-Access von der CPU abstrahiert wird. Also aus Usersicht/Programm kann der EEPROM Byte-weise addressiert werden, aber intern (HW) werden Schreib/Löschzugriffe auf Page-Ebene gemacht. Atmel/Microchip lässt diese Details whs nicht unabsichtlich weg :)

      Im DB in der Sektion "AVR Memories" steht:

      Atmel schrieb:

      The ATmega32 contains 1024 bytes of data EEPROM memory. It is organized as a separatedata space, in which single bytes can be read and written. The EEPROM has an endurance of atleast 100,000 write/erase cycles. The access between the EEPROM and the CPU is describedin the following, specifying the EEPROM Address Registers, the EEPROM Data Register, andthe EEPROM Control Register.
      In "Memory Programming" (S. 265) ist dann eben die 4-Byte Page erwähnt.

      Beide Sektionen sind im DB wortgleich zum Mega8.

      Bits, deren Wert beim Schreibvorgang nicht verändert wird, sind meiner Meinung nach nicht vom Altern betroffen, wenn ich als Grundlage den Wikipedia-Artikel nehme (Bin also auch kein Experte auf dem Gebiet :D )

      Langer Thread über das Thema bei Mikrocontroller.net

      edit: Wenn aber das Überschreiben mit dem selben Wert kein Problem darstellen würde, wären die EEPROM-Funktionen in "avr/eeprom.h" (von Atmel), die vor dem Schreiben den Wert prüfen), unsinnig. Macht Bascom auch lt. Hilfe:

      Bascom-Hilfe schrieb:

      When you define a constant named UPDATEEPROM the eprom cells will be only written when the value differs. Instead of just writing the value, the EPROM content is first read and compared to the new value. Only when the new value differs the new value is written to the EEPROM. A memory location can be written to 100.000 times at least. The constant UPDATEEPROM can have any value. There is only a check if this constant is defined. So even : CONST UPDATEEPROM=0 will use the special update code.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von zaubara ()

    • zaubara schrieb:

      In "Memory Programming" (S. 265) ist dann eben die 4-Byte Page erwähnt.
      Das bezieht sich aber wohl eher auf das Programmieren über die ISP-Schnittstelle und Parallell-Programmieren.
      Das Beschreiben des EEProm vom Programm aus scheint wohl eher Byteweise zu sein.
      Zumindest interpretiere ich das Datenblatt so.

      Im Zweifelsfall müsste mal eben mal den Test machen.
      Immer EEProm-Adresse 0 beschreiben, bis die nicht mehr geht.
      Und dann schauen ob die Adresse 1 noch geht. Und dann diese Beschreiben, bis auch sie nicht mehr geht.
      Sind die Schreibzyklen z.B. bei der 1 Zelle 110000x erfolgreich, und die 2. Zelle würde wegen Page = 4 Byte ebenfalls immer mitbeschrieben, dürfte die 2. Zelle keine 100000 Schreibzyklem mehr schaffen.

      Ich denke vom Programm aus werden die Bytes einzeln beschrieben. So steht es im Datenblatt.

      Die Pagesize = 4 Byte bezieht sich auf den Zugriff von Außen beim Programmieren des EEProm via Schnittstelle.
    • Mitch64 schrieb:

      Das bezieht sich aber wohl eher auf das Programmieren über die ISP-Schnittstelle und Parallell-Programmieren.
      Das Beschreiben des EEProm vom Programm aus scheint wohl eher Byteweise zu sein.
      Zumindest interpretiere ich das Datenblatt so.
      Im Datenblatt steht, dass das EEprom Page-weise organisiert ist und es gibt sogar eine Codeanweisung, wie das gemacht werden muss (siehe Bild)

      EEprom_Page.png

      Mitch64 schrieb:

      Im Zweifelsfall müsste mal eben mal den Test machen.
      Immer EEProm-Adresse 0 beschreiben, bis die nicht mehr geht.
      Und dann schauen ob die Adresse 1 noch geht. Und dann diese Beschreiben, bis auch sie nicht mehr geht.
      Sind die Schreibzyklen z.B. bei der 1 Zelle 110000x erfolgreich, und die 2. Zelle würde wegen Page = 4 Byte ebenfalls immer mitbeschrieben, dürfte die 2. Zelle keine 100000 Schreibzyklem mehr schaffen.
      Ich hab da keine Zweifel und die nicht geänderten Bits sind nicht vom Altern betroffen.

      Mitch64 schrieb:

      Ich denke vom Programm aus werden die Bytes einzeln beschrieben. So steht es im Datenblatt.
      Hast du eine andere Quelle?
    • Nein eine andere Quelle habe ich nicht.

      Aber die Abbildung stammt aus dem Abschnitt "Programmieren des Speichers"
      Und nicht aus dem Abschnitt "EEProm beschreiben oder lesen.

      Ich sehe da einen Unterschied zwischen Programmieren und Speicher beschreiben.

      Aber selbst wenn das immer Pageweise beschrieben wird, die unveränderten Bytes in der Page aber nicht geschrieben werden, dann ist das ja sozusagen ein Byteweiser Zugriff.
      Bei einem reinen Pagezugriff müssten ja immer alle Bytes einer Page beschrieben werden. So ist es zumindest bei externen EEProms.
    • Michael schrieb:

      Dim Ee_zeit(200) As Eram Word
      belegt byte 0 . wenn dat ma gut geht.
      Die Tomaten kommen von den Eram Variablen. Die sind mir nicht geheur und damit hab ich ihre Existenz völlig verdrängt :D

      Michael schrieb:

      Ich hab da keine Zweifel und die nicht geänderten Bits sind nicht vom Altern betroffen.
      Vielleicht wenn sie FF sind. Aber was wenn sie z.b 55 sind. Es müßte gelöscht werden um 56 reinzukriegen. Heißt die cpu muß sie vorher auslesen um zu entscheiden 'was tun' . Das schafft sie in den 41 Takten sicher nicht. a_56_df238249
      Bascom hat da sogar eine Anweisung um nicht veränderte 'Stellen nicht zu beschreiben. Die wäre dann völlig unnötig.
      Im Datenblatt steht auch was vom effektiver Programmieren indem die FF übersprungen werden.
      Wie überspringt man ein Stückchen Page?
      Mir verschließt sich die ganz Logik hinter einer Page die an beliebiger Stelle beginnt. Würden sie jede 4Byte ansetzen 0,4,8.. könnte das AdressHigh byte eingespart werden aber so ?(
      Ist es beim Progrmmieren nicht so das nach der Adresse bis zu 256 Bytes gesendet werden? Und erst dann wieder eine neue Adresse?