Hallo zusammen, ich benutze PonyProg zum Brennen von meinen Programmen in einen Mega16, und bin heute auf ein Problem gestossen. Und zwar, wie es in der Hilfe von PonyProg steht, ist der Programmspeicher alleine nicht beschreibbar bei AVR's, hier Zitat: "...The exception is the AVR device: to write the program memory an erase is needed, so the data memory is erased too." Das hat mich ein winig gewundert, weil ich an einem Datenlogger rumbastle und mir jeder EEPROM-Zugriff wert ist. Gibt es vielleicht irgendwelche Tricks oder andere Programmer, die bei AVR's nur den Programmspeicher beschreiben können oder ist es grundsätzlich nicht möglich? Was ist mit avrdude?
hm also ich wüsste nicht, dass man den flash nicht ohne erase beschreiben kann ... bei mir gings auch immer ohne (oder ponnyprog macht das einfach eigenwillig, ohne dass man es angeklickt hat) teste doch einfach mal: schreib irgendwas ins eeprom, dann flasht du beim 2. mal ein programm, dass dir z.b. über die serielle schnittstelle die daten ausgibt, wenn dann ichts ankommt, wird der eeprom mitgelöscht! Aber für nen datenlogger würde ich eh nen externes eeprom benutzen!
Danke, das war eine schnelle Antwort! :) Also wenn ich meine HEX-Datei in PonyProg öffne ("öffne Device Datei") und den Button "Schreibe Programmspeicher(FLASH)" anklicke, sollte eigentlich nur der Programmspeicher (im Hauptfenster grün dargestellt) und nicht der Datenspeicher (blau dargesstellt ganz unten) geschreieben werden. Nach dieser Aktion laufen meine Programme aber nicht mehr. Es werden nur paar komische zeichen ausgegeben. Also ich gehe davon aus, dass die beiden Speicher zusammen beschrieben werden müssen, selbst wenn nur der Code geändert wurde.
Hallo. Bei der Betrachtung deines Problems muss die Physik des Speichers berücksichtigt werden : Eine Speicherzelle kann nur programmiert oder gelöscht werden. Programmieren heißt dabei, sie von 1 auf 0 zu setzen. Durch das Löschen wird sie wieder auf 1 gesetzt. Programmiert man eine Zelle mehrmals, so wird sie vor jedem Schreibgang nicht gelöscht, sondern nur überschrieben. Im Endeffekt wird dabei ein AND durchgeführt. Eingespeichertes Bit AND neues Bit ergibt geschriebenes Bit. Ein Beispiel : Vorher : 11110000 Neues Byte : 10101010 Nachher : 10100000 Somit muss für einen erfolgreichen Schreibvorgang eine Zelle stets gelöscht werden, bevor sie geschrieben wird. Dies wird durch den Chip-Erase erreicht. Da das Löschen einige Zeit in Anspruch nimmt (einige ms) werden bei Classic-AVRs alle Zellen auf einmal gelöscht (Zeitersparnis), durch den Chip-Erase. Wen du dir das genauer anschauen willst, sieh in das Kapitel "Memory programming" im Datenblatt des jeweiligen AVRs nach. Bei den AVRs besitzt nur der EEPROM einen Auto-Erase. Somit muss bei der AT90Sxxxx-Reihe (Classic-AVRs) der Flash vor dem Programmieren gelöscht werden. Dies kann aber nur durch einen Chip-Erase gemacht werden. Somit führt PonyProg vor dem "Alles Schreiben" befehl einen Chip-Erase aus -> alles funktioniert. Die Option "Nur Flash schreiben" ist für die Geräte der ATMEGA-Reihe vorgesehen, die Selbstprogrammierbar sind und demzufolge eine Speicherzelle selbst neu beschreiben können (incl. Löschen). Dort ist ein Schreibvorgang ohne Chip-Erase möglich. Die ATMEGAs bieten ebenfalls eine EEPSAVE-Fuse, die den EEPROM vor dem Löschen bewahrt, was den Chip-Erase effekt auf Flash-Erase reduziert. (Ich bin mir nicht sicher, aber ein paar der Classic-AVRs könnten auch schon diese Fuse haben). Somit liefen auch deine Programme nicht, da im FLASH alter Code AND neuer Code geschrieben wurde. Für den EEPROM gibt es nur eine Möglichkeit : EEPROM lesen, dann erst Alles schreiben. Somit bleibt der EEP garantiert erhalten. Beim EEPROM wird vor dem Schreiben die einzelne Speicherzelle gelöscht, ohne das andere beeinflusst werden. (darum dauert das auch wesentlich länger. Intel hat einmal eine kurze Zusammenfassung der FLASH-Technologie in ein PDF-gepackt (siehe Anhang). Dort steht genau drin, wie Flash funktioniert, und warum nur Löschen und Programmieren möglich ist, und nicht Schreiben nach logischem Wert. Nachtrag : Bei den ATMEGAs werden erst eine bestimmte Anzahl Bytes in einen Seitenpuffer geschrieben, und dieser dann auf einmal Programmiert. Daher geht das Programmieren bei den MEGAs wesentlich schneller as bei den Classics, da nicht 128x sondern nur 1x 4,5ms gewartet werden muss, bis die Zelle gespeichert wurde. <haarspalt> Somit ist die Speciherorganisation des ATMEGA16s eigentlich nicht 8192x16 sondern 128x2048. </haarspalt> In der Hoffnung dir weitergeholfen zu haben freunliche Grüße versendend ... ein müder Christoph Wagner ;-)
EESAVE programmieren. In Ponyprog (Security and Configuration bits) EESAVE anklicken. Dann bleibt das EEPROM erhalten. Reiner
vielen Dank für die Infos, und mit EESAVE werd ich heute abend ausprobieren. anton
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.