EEPROM löschen

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    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!

    • EEPROM löschen

      Hi,

      wenn ich versuche mein EEPROM (ATMEGA 1284) zu löschen mit:

      BASCOM Source Code

      1. Dim D As Byte : D = &HFF
      2. Dim I As Word
      3. For I = 0 To 4095
      4. Writeeeprom D , I
      5. Next
      dann funktioniert mein Programm nicht mehr richtig. Wenn ich einen leeren Controller programmiere dann schon. Mache ich was falsch? Wie löscht man es richtig?

      Gruß, Martin
    • Mit 'Clear Chip' ;)
      Dem Programm sollte das egal sein solange es keine Daten vom EEprom benötigt.
      Aus welchem Grund löscht man ein Eeprom? Die Zellen die beschrieben werden löschen sich kurz vorher selbst.
      Das ganz dauert eine Weile und sperrt die Interuppts bei jedem Schreibvorgang. Vielleicht mag Dein Code das nicht. Was genau geht den nicht richtig?
    • Pluto25 wrote:

      Aus welchem Grund löscht man ein Eeprom?
      Ich updaten den MC per Bootloader. Wenn beim Update neue EERAM Variablen dazukommen und welche weg fallen knallts. Deswegen wollte ich das EEPROM löschen. Wie gesagt, bei einem neuen Controller (Leeres EEPROM) läuft alles Prima.


      Pluto25 wrote:

      Was genau geht den nicht richtig?
      Es ist eine Statemachine (Steuerung). Sie reagiert nicht auf Tasten und steuert meine WS2812 auch nicht mehr an. Die serielle Kommunikation funktioniert weiterhin.

      Pluto25 wrote:

      Vielleicht mag Dein Code das nicht.
      Der Code zum löschen steht ganz am Anfang nach $regfile und so noch bevor ich irgendwas deklariere oder Interrupts frei gebe.
    • Ein Arduino Loader? Der kann auch nicht Eeprom ;(
      Wenn die serielle arbeitet sind die Interrupts doch wieder eingeschaltet? Heist das löschen sollte abgeschlossen sein.
      Die Tasten und das WS brauchen keine Eeprom Daten? Vielleicht eine Variable/Rgister nicht zurück gesetzt? Im Gegensatz zum Simulator sind die nicht immer 0 bzw wurden für's Löschen benutzt?
      Bisher habe ich nie darüber nachgedacht: Ich schalte immer als erstes die Fuse auf "beware Eeprom" damit ein Claer Chip es nicht löscht. Wenn jedoch der Brenner was reinschreibt wird es quasi sofort (ohne spürbare Zeit) komplett gelöscht. Ob man diese Anweisung auch per Software auslösen kann?
      Oder die Methode mit der ein Bootloader das können sollte: Pageweise löschen. Damit wäre Deine For mit 16 Durchläufen fertig.
      So ein Chip braucht fuchtbar lange eine Zelle neu zu beschreiben, vielleicht rennt sie zu schnell durch? Ein Waitms 2 könnte helfen (falls er ein 'fertig' Flag zu schnell setzt)
    • Watchdog aus.

      Versuche es mal zu beschreiben. Auf meinen Board wird zuerst der Bootloader von MSC installiert. Ab da werden die Updates nur noch über die Serielle gemacht. Deklariert werden die EEPROM Variablen so:

      BASCOM Source Code

      1. Dim Fahrerwunsch_ee As Eram Word
      2. Dim Sensor_nummer_ee As Eram Byte
      3. Dim Toleranz_prozent_ee As Eram Byte
      4. Dim Pumpzeit_ee As Eram Byte
      5. Dim Absenkversuche_ee As Eram Byte
      6. Dim Parkzeit_ee As Eram Byte
      Nun entdecke ich Fehler oder erweitere die Software. Solange sich an den Variablen nichts ändert ist alles OK. Wenn neue Variablen dazu kommen und andere entfallen stürzt mein Programm ab. Liegt wahrscheinlich da dran dass die neue Software nicht mehr das im EEPROM vorfindet was sie erwartet. Deswegen wollte ich das EEPROM mit obiger Routine löschen. Danach läuft mein Proggi aber nicht mehr richtig.

      Wäre es besser die Variablen an eine bestimmte Adresse zu schreiben und diese Adressen bei Programmänderungen einfach zu ignorieren falls die Variable nicht mehr benötigt wird?
    • Pac-Man wrote:

      und andere entfallen
      da liegt der Hase im Pfeffer. Ohne Angabe werden die Eram irgendwo vermutlich von 0 aus angelegt. Wenn nun eine fehlt bekommt die nächste ihren Platz. Dann muß quasi das ganze Eerom neu beschrieben werden (eine neue eep erstellt werden) damit die erwachteten Werte wieder an der gesuchten Stellen liegen. Ich arbeite ausschließlich mit Adressen. Zwingend nötig ist das nicht. Einfach darauf achten wenn eine wegfällt sie mit einer neuen gleicher Länge und gleicher Stelle in der Dim Reichenfolge belegt wird oder die alte als 'Karteileiche' belassen und die neue unten beischreiben.
    • Pluto25 wrote:

      oder die alte als 'Karteileiche' belassen
      Danke für die Aufklärung. Werde alles umschreiben.

      Trotzdem interessiert mich warum das Löschen so nicht richtig funktioniert. Bei einem Controller wo nur der Bootlaoder drauf ist klappt ja alles weil ich die Variablen initialisiere

      BASCOM Source Code

      1. 'unlogische werte korrigieren
      2. If Fahrerwunsch_ee > 60000 Then Fahrerwunsch_ee = 350 : Fahrerwunsch = Fahrerwunsch_ee
      3. If Sensor_nummer_ee > 200 Then Sensor_nummer_ee = 0 : Sensor_nummer = Sensor_nummer_ee
      4. If Toleranz_prozent_ee > 50 Then Toleranz_prozent_ee = 20 : Toleranz_prozent = Toleranz_prozent_ee
      5. If Pumpzeit_ee > 90 Then Pumpzeit_ee = 50 : Pumpzeit = Pumpzeit_ee
      6. If Absenkversuche_ee > 200 Then Absenkversuche_ee = 20 : Absenkversuche = Absenkversuche_ee
    • Es gibt aber auch eine andere Möglichkeit, ohne das EEProm zu löschen.

      Dazu verwende ich eine EEProm-Variable, die mir als "Magic-Byte" dient.

      Das funktioniert so.

      Die erste Variable im EEProm muss das Magic Byte sein. Ich benenne die meist
      Dim eeValidEEProm as EEPROM Byte

      Danach folgen die User-Variablen. Magic Byte ist also immer an EEProm-Adresse 0 wenn man so will.

      Im Programm selbst wird eine Constante definiert, die den Wert des Magic-Byte enthält.
      Const ValidEEProm = 1

      Wenn das Programm startet, wird geprüft, ob das Magic Byte aus dem EEProm dem Wert in der Konstante entspricht.
      Wenn ja, ist das EEProm gültig und das Programm startet durch.

      Wenn es hier einen Unterschied gibt, wird eine Routine aufgerufen, welche die Werte im EEProm neu setzt und schließlich das Magic-Byte im EEProm auf den Wert in ValidEEProm setzt.

      Sub InitEEProm()
      ' hier die EEProm Variablen auf default-Werte setzen.
      ' ..

      eeValidEEProm = ValidEEProm ' Magic-Byte neu setzen
      End Sub

      Wenn du also ein Update planst, bei dem sich das EEProm ändert,
      musst du nur die Konstante erhöhen.
      Const ValidEEProm = 2

      Dadurch wird nach dem Start des Programms EEProm das ungültig festgestellt (eeValidEEProm <> ValidEEProm) und die Defaultwerte neu gesetzt.

      Eine andere Möglichkeit ist, solange keine EEProm-Variablen wegfallen, neue EEProm-Variablen an die letzte anhängen und nicht dazwischen schreiben.

      Wenn eine EEProm-Variable wegfallen sollte, könnte man die auch als Reserved bezeichnen mit einer lfd. Nr. Also nicht löschen.
      Wenn dann eine gebraucht wird kann man die reservierten Variablen wieder einbinden.
    • Pac-Man wrote:

      warum das Löschen so nicht richtig funktioniert
      Gute Frage. Sollte das aber.
      Gibt es eine Möglichkeit den Inhalt ab zu fragen? Wie kann ich mir das Vorstellen? Hat Dein Code alle Möglichkeiten (Löschen/initialieseren/arbeiten) als Auswahl oder sind das je einzelne Programme die der Reihe nach per Bootloader gebrannt werden? Es wäre interessant zu sehen ob es wirklich nicht gelöscht wird (alle FF)
      Wenn es verschiedene sind könnte die Init von der späteren abweichen? Andere Variablen Reihenfoge?
      Wenn alles in einem Code ist sollte es kein Problem sein sie wild zu mischen, da ja jede neu belegt wird.
      Gibt es die Möglichkeit den Abgestürzten an einen ISP-Brenner zu hängen um das Eeprom aus zu lesen? Das sollte zeigen was falsch läuft. Die Adressen stehen in der Paport Datei (Programname.rpt)
      PS gibt es keine MSC Bootloader version die mit Eeprom arbeiten kann?