Forum: Mikrocontroller und Digitale Elektronik AVR unbedingt löschen vorm Programmieren?


von J.P. (Gast)


Lesenswert?

Im Programmierdialog im Atmel Studio ist standardmässig eingestellt, 
dass der AVR vor dem Programmieren gelöscht wird.

Ist bzw. warum ist das unbedingt notwendig?

von Karl M. (Gast)


Lesenswert?

Nun weil du ein neues Programm einspielen möchtest.

Ich finde die Frage wirklich surreal !

Vielleicht pass dieses Gleichnis besser:
Ich kann ja auch nicht Atmen ohne Lauft über die Lungen auf zunehmen.

von Karl M. (Gast)


Lesenswert?

Vielleicht ist die der technische Vorgang nicht bekannt.

Schon beim EEprom Datenspeicher war es so, dass man erst mal alle Bits 
auf "1" stellen musste. Hier durch UV-Strahlung.
Danach konnte man diese wieder auf "0" setzen.

Für Flash Datenspeicher gilt das Vorgehen entsprechend.

Alles Klar ?

von Max D. (max_d)


Lesenswert?

Beim programmieren werden die Bits nur nach null geschaltet. Wenn bei 
dem bit einmal ne null drinsteht, dann wird daraus keine eins mehr, auch 
wenn du ne eins druberschreibst.
Erst beim Löschen werden alle Bits kollektiv wieder auf eins gesetzt.

Edit: zu spät

: Bearbeitet durch User
von Frank K. (fchk)


Lesenswert?

J.P. schrieb:
> Im Programmierdialog im Atmel Studio ist standardmässig eingestellt,
> dass der AVR vor dem Programmieren gelöscht wird.
>
> Ist bzw. warum ist das unbedingt notwendig?

Bei EPROM und Flash-Speicherzellen kannst Du nur 1-Bits auf 0 setzen, 
aber keine 0-Bits auf 1. Der Grund ist, dass 1 der ladungsfreie Zustand 
ist und beim Programmiervorgang selektiv Ladungen in die Speicherzelle 
hineingeschossen werden.

Zum Zurücksetzen muss ein Löschzyklus ausgeführt werden - bei EPROM per 
UV-Licht, bei Flash elektrisch. Der Löschzyklus lässt alle gespeicherten 
Ladungen abfließen, und anschließend sind alle Bits wieder auf 1.

Man kann prinzipiell auch mehrmals ein Byte programmieren und dabei 
jeweils weitere Bits von 1 auf 0 setzen. Das geht aber nur begrenzt, 
weil sonst die Lebensdauer der Zellen leidet. Im Datenblatt des 
jeweiligen Chips finden sich die Details.

fchk

von Stephan W. (swal)


Lesenswert?

Ich denke, mit der Frage ist gemeint, ob man das alte Programm nicht 
einfach überschreiben kann, ohne es zu löschen. Auf einer Festplatte 
wird üblicherweise auch nichts gelöscht, sondern einfach überschrieben.

Bei Flash Soeicher geht das nicht ganz so einfach. Beim Programmieren 
kann man Bits nur in eine Richtung kippen - typischerweise von Eins nach 
Null.  Will man irgendwo eine Eins haben, muss die vorher schon da 
stehen. Die Einsen erhält man beim löschen (leerer Flash -> alle Bytes 
0xFF). Und das funktioniert typischerweise nicht byteweise, sondern nur 
in größeren Arealen (Pages).

Es würde also reichen, statt den ganzen Flash zu löschen, nur die Pages 
zu löschen, die das neue Programm belegen soll. Stattdessen alles zu 
löschen ist halt einfacher, man muss weniger nachdenken. Und soweit ich 
weiß, geht es nicht auf die Lebensdauer des Flash, wenn eine vorhanden 
Eins gelöscht wird (es wird ja wieder Eins draus).

Wenn du den Flash von "innen" programmierst, also z.B. per Bootloader, 
kannst du sehr wohl bestimmen, welche Pages du löschen willst, und 
welche nicht.

Edit: Hm, wieder viel zu langsam...

: Bearbeitet durch User
von Carsten R. (kaffeetante)


Lesenswert?

Weil es ein Flashspeicher ist. Die kann man nicht einfach überschreiben.

Vereinfacht gesagt:

Von 0 nach 1 ist technisch ein anderer Vorgang als von 1 nach 0. Das 
Schreiben / Programmieren kann nur in die eine Richtung "kippen". Das 
löschen geht in die andere "Richtung".

Also löscht man vorher alle Bits und kippt erst danach beim 
Programmieren die passenden bits. Würde man vorher nicht löschen, sieht 
es so aus als hättest du zweimal auf das selbe Blatt Papier geschrieben. 
Das ergäbe nur Kauderwelsch.

Man könnte nun sagen:

Ist mir doch egal wenn die Vorgänge 0->1 und 1->0 technisch 
unterschiedlich sind. Das soll man hinter dem Interface verbergen.

Das wird teilweise auch so gemacht, auf highlevel/Softwareebene. Das 
bringt aber riesige Nachteile mit sich. Man kann beim Schreiben einzelne 
Bits kippen. Beim Löschen werden aber größere Sequenzen gelöscht, 
Blöcke, ganze Chips... wie auch iimmer die Unterteilung ist.

Man müßte also vorher immer den Block Zwischenpuffern, die Daten im 
Puffer Modifizieren, den Block löschen und dann die Daten erneut 
schreiben. Das bringt weitere Nachteile mit sich. Damit kann man Bücher 
fülllen.

Da ist es oft sinnvoll die Natur des Speichers nicht immer hinter einem 
Interface zu verbergen und die Unterschiedlichen Vorgänge Löschen und 
Schreiben auch unterschiedlich zu belassen.

von J.P. (Gast)


Lesenswert?

Bis auf den ersten Antworter: Danke an alle, das wollte ich wissen!

Schoenes Wochenende!

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.