Hallo Forum, ich habe da ein Problem. Folgende Situation: Ich habe eine Schaltung mit nem Mega128, die ich nicht selbst entworfen habe. Die Leiterplatte ist 4-Lagig und mit diversen Bauteilen vorbestückt. Der Entwickler hat aber für mein Projekt das EEPROM vergessen mit vorzusehen, eine nachträgliche Bestückung ist nicht möglich ... leider. Nun müsste ich aber in meiner Anwendung 32KB Daten dauerhaft abspeichern Sad An Flash hab ich noch einiges frei, würde sich also anbieten, das Problem ist nur, dass aus dem Programm heraus nicht direkt auf das Programm Memory zugreifen lässt, außer das Programm ist halt n Bootloader, das dann auch im Bootloaderbereich liegen muss. Also vom Bootloader kann man Daten ins Progmem legen, vom Progmem ins Progmem geht nicht. Vom Progmem in den Bootloader geht auch soweit ich weiß, bin mir da aber nicht 100% sicher. Wenn ich nun in meinem Programm eine Subroutine als Hex ablege, diese beim Programmstart in den Bootloader schreibe und dann vom Programm aus anspringe, dann sollte diese doch, da der AVR ja nun im Bootloader ist, Daten ins Progmem schreiben können, oder? Von der Subroutine aus sollte ich doch auch wieder zurück ins Progmem springen können, denke ich, oder hab ich da nen Denkfehler? Hat von Euch schonmal jemand sowas gemacht? Will keinen Code, nur Tips zur Herangehensweise währen doll.
PS: weiß jemand ob bei dem hin und her gespringe der SRAM erhalten bleibt oder muss ich da über nen Reset gehen? Mir ist auch klar, dass ich mit SPM Pages von 64 Bytes löschen und auch schreiben muss, einzelne Bytes gehen nicht und auch wenn der Speicher wordweise ist gehen auch words nicht, nur pages laut Datenblatt. Aber das sollte kein Problem sein. auch die 10000 Zyklen sind kein Problem.
Wie siehts mit einem seriellen eeprom aus. Kannste das nicht irgendwo am Board anschliessen ?
Du kannst eine Routine zum Beschreiben des Flash im Bootloader-Bereich speichern. Diese rufst Du ganz normal von Deiner Applikation aus auf. Du musst allerdings aufpassen: während dem Programmiervorgang (ca. 5ms) ist das Applikation-Flash nicht ansprechbar, d.h. auch kein Programmcode kann während dieser Zeit aus diesem Flash-Bereich laufen! Deine Programmier-Funktion muss also warten, bis das Flash programmiert ist, und erst dann zum aufrufenden Programm zurückkehren. Wenn Deine komplette Firmware nichtr besonders groß ist, bzw. wenn sie komplett in den Bootload-Bereich passt, dann speicherst Du einfach die konmplette App in den BL-Bereich und hast keinerlei Probleme. Ein Problem bei der Verwendung des Flash: wenn etwas schief geht und Deine Firmware (von sich selbst) versehentlich überschrieben wird, dann ist es vorbei ... Gruß, Stefan
Die Firmware ist leider zu groß für in den bootloader, passt da echt nicht rein und externes EEPROM geht wie beschrieben wirklich nicht. Also folgender Ablauf währe dann wohl machbar: 256 Byte in SRAM mit Daten füllen, Register 1-32 pushen, dann schreibe Z-Register in Hauptprogramm mit Zieladresse im Progmem, springe nach bootloader, dort dann SPM und warten bis spmcr.rwwsb clear ist, oder? Muss der Puffer an ner bestimmten SRAM Stelle stehen?
Was ein Murks... Ich würde einen seriellen EEPROM (gibt es im SO8 Gehäuse) mit einem Tropfen Heißkleber auf die CPU kleben und dann mit Fädeldraht anschließen. Dann Funktionstest und das Ganze anschließend mit etwas Heißkleber eingießen damit die Drähte zugentlastet sind. Falls das nicht geht würde ich die ganze Platine neu machen, denn so ein gemurkse mit dem Bootloader wäre mir doch zu joker. Einwandfreie Funktion höchst fragwürdig. Und überhaupt: Wie kann man bei einem !Datenlogger! vergessen einen Flash oder EEPROM mit in die Schaltung zu nehmen? Das Wort impliziert doch schon, dass da was gespeichert werden muss. Ist der Entwickler schlecht informiert worden? Oder ist ein Fehler bei der Entwicklung gemacht worden? Bei letzterem würde ich dem Entwickler das Teil hinlegen und ihm sagen, dass er sich damit einen schönen Tag machen kann weil das Ding wertlos ist. Also Neumachen!
naja, es ist insgesamt ne recht komplexe Beschaltung und einiges an Peripherie. Das ganze Ding ist Bestandteil einer größeren Messanordnung und diese Messwerte sollen halt auch aufgezeichnet werden. Doch dies ist nur ein Teil der vorgesehenen Funktion. Es sollten verschiedene Bestückungsoptionen vorgesehen werden. z.T. auch mit analogen Teilen Opamp etc. in der Fülle der Aufgaben hat der Layouter halt den eeprom vergessen, kann ich ja verstehen, nur, die Platten wurden halt bestellt ohne dass ich nochmal die Pläne einsehen konnte aufs geradewohl hin und nun sind sie halt so. Bin auch nicht begeistert und es sind halt auch keine Einzelstücke, sondern ne Kleinserie ... ziemlicher Mist, aber, es lebe der Workaround. Ich möchts aber dennoch auf die Flash-Variante versuchen, ist doch mal auch ne interessante Herausforderung. Also folgender Ablauf währe dann wohl machbar: 256 Byte in SRAM mit Daten füllen, Register 1-32 pushen, dann schreibe Z-Register in Hauptprogramm mit Zieladresse im Progmem, springe nach bootloader, dort dann SPM und warten bis spmcr.rwwsb clear ist, oder? Muss der Puffer an ner bestimmten SRAM Stelle stehen? Dann wider Rücksprung und R1 bis R31 Pop, oder?
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.