Skip to content

Versions Upgrade und Übertragung der Einstellungen

Oliver Köster edited this page Jul 13, 2023 · 8 revisions

Einleitung

Wenn du dich fragst, ob du eine Firmwareversion einfach updaten kannst, oder bei dem Update deine Einstellungen verlierst, gibt es darauf eine ganz klare Antwort: Jein.

Bei jedem neuen Release wird weise ich darauf hin, dass die Standardeinstellungen der Firmware erst geladen und danach in das EEPROM gespeichert werden müssen, damit dies initialisiert wird. Aber warum das Ganze? Warum gibt es kein Update/Upgrade?

Das Problem liegt in der Aufteilung des Speichers bei Mikrocontrollern. Dort gibt es

  • ROM (read-only-memory), also ein Speicher, der nur gelesen werden kann. Dies bezieht sich jedoch auf die Laufzeit, also wenn der Drucker eingeschaltet und das Mainboard normal mit Strom versorgt wird. In diesem Bereich befindet sich die Firmware inklusive aller Standardeinstellungem. Man kann diesen Speicher beschreiben - allerdings erfordert das immer externen Zugriff, da dieser Speicher geschützt ist und sich nicht selbst verändern kann/darf.
  • RAM (random-access-memory) ist ein flüchtiger Speicher, in dem zur Laufzeit Daten abgelegt, also geschrieben und gelesen werden können. Dies ist ein recht schneller Speicher, der allerdings bei Unterbrechung der Stromversorgung geleert wird. Hier speichert die Firmware alles, was zwischendurch gerade benötigt und eingestellt wird. Zudem wird hier der zu druckende gcode zwischengespeichert.
  • EEPROM (electrically erasable programmable read-only memory) ist ein Speicher, welcher zur Laufzeit beschrieben werden kann und welcher seinen Zustand auch behält, wenn der Strom abgeschaltet wird. Hier werden die Einstellungen gesichert, die nicht vorher im ROM vorhanden waren oder verändert wurden. Beispielweise die Mesh-Level Daten oder die E-Steps.

Jetzt könnte man denken: "Ja prima. Dann ändere ich einfach das ROM und lese den Kram aus dem EEPROM wieder aus".

Klingt auch nach einer guten Idee, doch das EEPROM ist so winzig klein (nur 4 Kilobyte), dass kein Platz für ein Dateisystem ist. Ohne Dateisystem gibt es nur die Möglichkeit, direkt auf die Adressen des Speichers zuzugreifen, denn der ist quasi durchnummeriert.

Möchte man also beispielsweise den Wert für die E-Steps auslesen, muss man die Adresse und die Länge des Bereichs kennen, in dem diese Zahl zu finden ist. Steht dort etwas anderes oder ist die Zahl in einem Format, welches man nicht erwartet, kann das ganze Programm, also die Firmware, abstürzen und sich unvorhergesehen verhalten. Es ist daher absolut essenziell, dass die Struktur mit der erwarteten Struktur übereinstimmt. Es darf nicht mehr und nicht weniger im EEPROM stehen, als genau das, was man erwartet.

Hier setzt das Update-Problem ein.

Wenn die neue Firmware auch nur ein einziges Zeichen im EEPROM an einer anderen Stelle erwartet, funktioniert das gesamte Konzept nicht mehr und es ist erforderlich, dass man lieber den gesamten Speicher neu anlegt, um sicher sein zu können, dass alles an Ort und Stelle ist.

"Aber bei einigen Firmwares bleiben die Einstellungen trotz Update erhalten, wie kann das sein? Ich konnte von der 1.2.0 auf die 1.3.1 Updaten, ohne das EEPROM initialisieren zu müssen."

Ja, richtig. Das liegt daran, dass der "Unterbau" der Firmware gleich geblieben ist, und sich nur Funktional einiges geändert hat. Es war also möglich, die Einstellungen über mehrere Firmwareversionen hinweg beizubehalten. Allerdings sei hier angemerkt, dass sich im Laufe der Zeit auch die Grundeinstellungen teilweise geändert haben und übernommenen Einstellungen eventuell nicht ideal für den Drucker waren. Funktioniert hat es jedoch.

Möglicher Upgrade-Pfad

Welche Firmware kann ich denn nun updaten ohne die Einstellungen zu verlieren? Kann ich das herausfinden?

Ja, kannst du. Und zwar gibt es in jeder Firmwareversion eine Datei, in der die benötigte EEPROM-Version steht. Diese Version steht im EEPROM und in der Firmware, und wenn beide identisch sind, so dürfen die Einstellungen gelesen und geschrieben werden, ohne dass man etwas vorher initialisieren muss.

Die Datei ist unter dem Pfad /Marlin/src/module/settings.cpp zu finden und beinhaltet alle Funktionen für das EEPROM und relativ weit oben den Eintrag EEPROM_VERSION mit einer Zahl dahinter. Diese Zahl ist die Versionsnummer, beispielsweise V87, also Version 87. Bei jeder Änderung der EEPROM Struktur wird diese Zahl erhöht und somit ist für die Firmware im ROM klar, wann sie kompatibel ist und wann nicht.

Ein Beispiel der Version 1.5.1 ist hier zu finden (klick mich)

Man muss also nur nach einem Release in den Quellcode an genau diese Stelle schauen um zu wissen, ob das EEPROM kompatibel ist, oder nicht.

Upgrade mit neuer EEPROM Version

Wenn die neue Firmware ein neues EEPROM nutzt, führt kein Weg an einer erneuten Initialisierung (Load FW Defaults + Save EEPROM) vorbei. Man kann sich aber alle gespeicherten Werte als Test auf der Konsole ausgeben lassen und erhält damit GCODE Befehle, welche man nach dem Flashen der neuen Firmware einfach wieder einspielen kann.

Der magische Befehl dafür lautet M503 - Report Settings

Ein Auszug aus einem I3 MEGA S mit BLTouch sieht so aus:

M503
echo:; Linear Units:
echo:  G21 ; (mm)
echo:; Temperature Units:
echo:  M149 C ; Units in Celsius
echo:; Filament settings (Disabled):
echo:  M200 S0 D1.75
echo:; Steps per unit:
echo:  M92 X80.00 Y80.00 Z400.00 E393.00
echo:; Max feedrates (units/s):
echo:  M203 X500.00 Y500.00 Z6.00 E40.00
echo:; Max Acceleration (units/s2):
echo:  M201 X3000.00 Y2000.00 Z60.00 E10000.00
echo:; Acceleration (units/s2) (P<print-accel> R T):
echo:  M204 P1500.00 R1500.00 T3000.00
echo:; Advanced (B S T X Y Z E):
echo:  M205 B20000.00 S0.00 T0.00 X8.00 Y8.00 Z0.40 E10.00
echo:; Home offset:
echo:  M206 X0.00 Y0.00 Z0.00
echo:; Auto Bed Leveling:
echo:  M420 S1 Z0.00 ; Leveling ON
echo:  G29 W I0 J0 Z-0.13250
echo:  G29 W I1 J0 Z-0.20000
echo:  G29 W I2 J0 Z0.08750
echo:  G29 W I3 J0 Z-0.12250
echo:  G29 W I4 J0 Z-0.17250
echo:  G29 W I0 J1 Z0.21250
echo:  G29 W I1 J1 Z-0.15750
echo:  G29 W I2 J1 Z-0.06000
echo:  G29 W I3 J1 Z0.03250
echo:  G29 W I4 J1 Z0.16500
echo:  G29 W I0 J2 Z0.20000
echo:  G29 W I1 J2 Z-0.19750
echo:  G29 W I2 J2 Z-0.12000
echo:  G29 W I3 J2 Z-0.02250
echo:  G29 W I4 J2 Z0.27250
echo:  G29 W I0 J3 Z0.10000
echo:  G29 W I1 J3 Z-0.27250
echo:  G29 W I2 J3 Z-0.08500
echo:  G29 W I3 J3 Z0.07000
echo:  G29 W I4 J3 Z0.11500
echo:  G29 W I0 J4 Z-0.19250
echo:  G29 W I1 J4 Z-0.12500
echo:  G29 W I2 J4 Z0.14750
echo:  G29 W I3 J4 Z0.03500
echo:  G29 W I4 J4 Z0.19250
echo:; Endstop adjustment:
echo:  M666 Z0.00
echo:; Hotend PID:
echo:  M301 P12.28 I0.75 D50.06
echo:; Bed PID:
echo:  M304 P251.78 I49.57 D319.73
echo:; Z-Probe Offset:
echo:  M851 X-2.00 Y-25.00 Z-0.40 ; (mm)
echo:; Linear Advance:
echo:  M900 K0.00
echo:; Filament load/unload:
echo:  M603 L538.00 U555.00 ; (mm)
echo:; Filament runout sensor:
echo:  M412 S1 ; Sensor ON
ok

Wie man sehen kann, stehen dort nicht nur Überschriften zu den einzelnen Werten, sondern auch gleich eine völlig korrekte GCODE Zeile, welche man direkt übernehmen kann.

Das Beispiel der E-Steps findet sich hier:

echo:; Steps per unit:
echo:  M92 X80.00 Y80.00 Z400.00 E393.00

Wir können und also einfach die Zeile

M92 X80.00 Y80.00 Z400.00 E393.00

kopieren, und direkt nach dem Flashen der neuen Firmware einfügen. Genauso funktioniert das bei allen anderen Punkten. Selbst das Mesh besteht nur aus einer Reihe G29 Befehlen (für jeden Punkt auf dem Bett einen), welche man sich speichern kann.

Das funktioniert übrigens auch, indem man nur einzelne Befehle abfragt! Wenn man beispielweise genau weiß, dass man nur den Z-Offset seines BLTouch Sensors auslesen möchte, kann man auch einfach M851 eingeben und erhält nur diese eine spezifische Zeile:

echo:  M851 X-2.00 Y-25.00 Z-0.40 ; (mm)

So müssen wir und nicht durch das komplette EEPROM wühlen. Man kann sich also auch einfach ein paar benötigte Werte zusammensuchen und sich für spätere Versionen abspeichern.

Wenn alle Werte wieder an den Drucker übertragen wurden, müssen sie nur noch mit einem M500 - Save Settings gespeichert werden und sind dann auch nach einem Neustart im Drucker verfügbar und werden immer wieder beim Start ausgelesen und genutzt.