Forum: Mikrocontroller und Digitale Elektronik Datalogger in AVR Flash


von Marko H. (vitis01)


Lesenswert?

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.

von Marko H. (vitis01)


Lesenswert?

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.

von Herr Mann (Gast)


Lesenswert?

Wie siehts mit einem seriellen eeprom aus. Kannste das nicht irgendwo am 
Board anschliessen ?

von Stefan K. (_sk_)


Lesenswert?

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

von Marko H. (vitis01)


Lesenswert?

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?

von D. G. (mandrake)


Lesenswert?

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!

von Marko (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.