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 ;-)