28.   Programmierung des Speichers

28.1   Sperrbits für Programm- und Datenspeicher

Der ATmega48 hat zwei, der ATmega88/168/328 sechs Sperrbits, die unprogrammiert, also 1, bleiben können oder mit einer 0 programmiert werden können, um die gewünschten zusätzlichen Funktionen zu nutzen, siehe Tabelle 28-2. Die Sperrbits können nur mit dem Chip-Lösch-Befehl gelöscht werden.

Der ATmega48 hat keinen separaten Urlader-Bereich, und der SPM-Befehl kann den gesamten Flash-Speicher verändern, wenn die SELFPRGEN-Fuse programmiert (= 0) ist. Andernfalls ist der SPM-Befehl wirkungslos.

Tabelle 28-1: Sperrbit-Byte(1)
Sperrbit-NameBitnummerBeschreibungVorgabe
71 (unprogrammiert)
61 (unprogrammiert)
BLB12(2)5Urlader-Sperrbit1 (unprogrammiert)
BLB11(2)4Urlader-Sperrbit1 (unprogrammiert)
BLB02(2)3Urlader-Sperrbit1 (unprogrammiert)
BLB01(2)2Urlader-Sperrbit1 (unprogrammiert)
LB21Sperrbit1 (unprogrammiert)
LB10Sperrbit1 (unprogrammiert)
Hinweise:
  1. „1“ bedeutet unprogrammiert, „0“ bedeutet programmiert
  2. Nur bei ATmega88/168/328
Tabelle 28-2: Sperrbit-Schutzmodi(1)(2)
Speicher-SperrbitsSchutzart
LB-ModusLB2LB1
111Kein Speicherschutz aktiviert
210Schreibschutz: Weitere Programmierung von Flash und EEPROM ist im seriellen und parallelen Programmiermodus gesperrt. Die Fuse-Bits sind sowohl im seriellen als auch im parallelen Programmiermodus gesperrt.(1)
300Kopierschutz: Weitere Programmierung und Überprüfung von Flash und EEPROM sind im seriellen und parallelen Programmiermodus gesperrt. Die Fuse-Bits sind sowohl im seriellen als auch im parallelen Programmiermodus gesperrt.(1)
Hinweise:
  1. Die Fuse-Bits und Urlader-Sperrbits müssen vor dem Programmieren der Sperrbits LB1 und LB2 programmiert werden.
  2. „1“ bedeutet unprogrammiert, „0“ bedeutet programmiert
Urlader-Sperrbits regeln den Speicherschutz beim kreuzweisen Zugriff zwischen Anwender- und Urlader-Bereich. Beachte, dass die Größe des Urlader-Bereichs festliegt, während die Größe des Urladers — manifestiert durch die Lage des Reset- und der Interruptvektoren — kleiner ausfallen darf und mittels Fuse-Bits programmiert werden kann.
Tabelle 28-3: Urlader-Sperrbit-Schutzmodi(1)(2) — Nur ATmega88/168/328
BLB0-ModusBLB02BLB01
111Keine Einschränkungen für SPM und LPM beim Zugriff auf den Anwenderbereich
210Schreibschutz: SPM ist nicht erlaubt, in den Anwenderbereich zu schreiben
300Vollschutz: SPM ist nicht erlaubt, in den Anwenderbereich zu schreiben und LPM ist nicht erlaubt aus dem Applikationssktor zu lesen, wenn LPM aus dem Urlader-Bereich ausgeführt wird. Wenn die Interruptvektoren in den Urlader-Bereich gelegt wurden, sind die Interrupts gesperrt, wenn sie aus dem Anwenderbereich ausgeführt werden.
401Kopierschutz: LPM ist nicht erlaubt aus dem Applikationssktor zu lesen, wenn LPM aus dem Urlader-Bereich ausgeführt wird. Wenn die Interruptvektoren in den Urlader-Bereich gelegt wurden, sind die Interrupts gesperrt, wenn sie aus dem Anwenderbereich ausgeführt werden.
BLB1-ModusBLB12BLB11
111Keine Einschränkungen für SPM und LPM beim Zugriff auf den Urlader-Bereich.
210Schreibschutz: SPM ist nicht erlaubt, in den Urlader-Bereich zu schreiben
300Vollschutz: SPM ist nicht erlaubt, in den Urlader-Bereich zu schreiben und LPM ist nicht erlaubt aus dem Urlader-Bereich zu lesen, wenn LPM aus dem Anwenderbereich ausgeführt wird. Wenn die Interruptvektoren in den Anwenderbereich gelegt wurden, sind die Interrupts gesperrt, wenn sie aus dem Urlader-Bereich ausgeführt werden.
401Kopierschutz: LPM ist nicht erlaubt aus dem Urlader-Bereich zu lesen, wenn LPM aus dem Anwenderbereich ausgeführt wird. Wenn die Interruptvektoren in den Anwenderbereich gelegt wurden, sind die Interrupts gesperrt, wenn sie aus dem Urlader-Bereich ausgeführt werden.
Hinweise:
  1. Die Fuse-Bits und Urlader-Sperrbits müssen vor dem Programmieren der Sperrbits LB1 und LB2 programmiert werden.
  2. „1“ bedeutet unprogrammiert, „0“ bedeutet programmiert

28.2   Fuse-Bits

Fuse bedeutet Schmelzsicherung. In der Anfangszeit der programmierbaren Schaltkreisentwicklung wurden die Daten tatsächlich durch Durchbrennen von Metallisierungen eingebracht. Heutzutage erledigt dies eine elektrisch löschbare Floating-Gate-Speicherzelle.
Eine Fuse im AVR-Kontext ist ein Steuerbit, welches außerhalb des Programmspeichers liegt und bestimmte Eigenschaften bereits vor dem Ausführen von Programmkode festlegt.
Der Schaltkreis hat drei Fuse-Bytes. Die nachfolgenden Tabellen geben einen kurzen Überblick über die Funktion der Fuse Bits und deren Lage innerhalb der Fuse-Bytes. Man beachte, dass Fuse Bits, die programmiert sind als logisch 0 gelesen werden.
Tabelle 28-4: Erweitertes Fuse-Byte — ATmega48
Erweitertes Fuse-BitBitnummerBeschreibungVorgabe
71
61
51
41
31
21
11
SELFPRGEN0Freigabe der Selbstprogrammierung1 (unprogrammiert)
Tabelle 28-5: Erweitertes Fuse-Byte — ATmega88/168
Erweitertes Fuse-BitBitnummerBeschreibungVorgabe
71
61
51
41
31
BOOTSZ12 Auswahl der Urlader-Größe
(siehe Tabelle 27-7 und Tabelle 27-10)
0 (programmiert)(1)
BOOTSZ01 0 (programmiert)(1)
SELFPRGEN0Freigabe der Selbstprogrammierung1 (unprogrammiert)
Hinweis:
  1. Die Vorgabe für BOOTSZ[1:0] führt zur maximalen Größe des Urladers.
Tabelle 28-6: Erweitertes Fuse-Byte — ATmega328
Erweitertes Fuse-BitBitnummerBeschreibungVorgabe
71
61
51
41
31
BODLEVEL2(1)2 Auslöseschwelle des Unterspannungsdetektors 1 (unprogrammiert)
BODLEVEL1(1)1 1 (unprogrammiert)
BODLEVEL0(1)01 (unprogrammiert)
Hinweis:
  1. Siehe Tabelle 29-12 für die Wertzuweisung an BODLEVEL
Tabelle 28-7: High-Fuse-Byte — ATmega48/88/168
High-Fuse-BitBitnummerBeschreibungVorgabe
RSTDISBL(1)7Deaktivierung externes Reset1 (unprogrammiert)
DWEN6Freigabe von debugWIRE1 (unprogrammiert)
SPIEN(2)5Freigabe der seriellen Programmierung0 (programmiert, SPI-Programmierung möglich)
WDTON(3)4Watchdog immer ein1 (unprogrammiert)
EESAVE3EEPROM-Speicher beim Chip-Löschen erhalten1 (unprogrammiert), EEPROM wird gelöscht
BODLEVEL2(41)2 Auslöseschwelle des Unterspannungsdetektors 1 (unprogrammiert)
BODLEVEL1(4)1 1 (unprogrammiert)
BODLEVEL0(4)01 (unprogrammiert)
Hinweise:
  1. Siehe Alternative Funktionen von Port C zur Beschreibung der RSTDISBL-Fuse
  2. Die SPIEN-Fuse ist bei serieller Programmierung nicht erreichbar.
  3. Siehe WDTCR — Watchdog-Zeitgeber-Kontrolle für Details
  4. Siehe Tabelle 29-12 für die Wertzuweisung an BODLEVEL
Tabelle 28-8: High-Fuse-Byte — ATmega328
High-Fuse-BitBitnummerBeschreibungVorgabe
RSTDISBL(1)7Deaktivierung externes Reset1 (unprogrammiert)
DWEN6Freigabe von debugWIRE1 (unprogrammiert)
SPIEN(2)5Freigabe der seriellen Programmierung0 (programmiert, SPI-Programmierung möglich)
WDTON(3)4Watchdog immer ein1 (unprogrammiert)
EESAVE3EEPROM-Speicher beim Chip-Löschen erhalten1 (unprogrammiert), EEPROM wird gelöscht
BOOTSZ12 Auswahl der Urlader-Größe
(siehe Tabelle 27-13)
0 (programmiert)(1)
BOOTSZ01 0 (programmiert)(1)
SELFPRGEN0Freigabe der Selbstprogrammierung1 (unprogrammiert)
Hinweise:
  1. Siehe Alternative Funktionen von Port C zur Beschreibung der RSTDISBL-Fuse
  2. Die SPIEN-Fuse ist bei serieller Programmierung nicht erreichbar.
  3. Siehe WDTCR — Watchdog-Zeitgeber-Kontrolle für Details
  4. Die Vorgabe für BOOTSZ[1:0] führt zur maximalen Größe des Urladers.
Tabelle 28-9: Low-Fuse-Byte
Low-Fuse-BitBitnummerBeschreibungVorgabe
CKDIV8(4)7Taktteiler durch 80 (programmiert)
CKOUT(3)6Taktausgang1 (unprogrammiert)
SUT15Auswahl der Hochlaufzeit1 (unprogrammiert)(1)
SUT040 (programmiert)(1)
CKSEL33Taktquellen-Auswahl0 (programmiert)(2)
CKSEL220 (programmiert)(2)
CKSEL111 (unprogrammiert)(2)
CKSEL000 (programmiert)(2)
Hinweise:
  1. Die Vorgabe von SUT[1:0] führt zur maximalen Hochlaufzeit der vorgegebenen Taktquelle (RC-Oszillator). Siehe Tabelle 9-12
  2. Die Vorgabe von CKSEL[3:0] führt zum internen RC-Oszillator mit 8 MHz. Siehe Tabelle 9-11
  3. Die CKOUT-Fuse legt den Systemtakt auf PORTB0. Siehe Taktausgabepuffer
  4. Siehe Systemtakt-Vorteiler
Der Zustand der Fuse-Bits wird durch einen Chip-Lösch-Befehl nicht verändert. Man beachte, dass alle Fuse-Bits blockiert sind, wenn das Sperrbit 1 (LB1) programmiert ist. Daher müssen die Fuse-Bits programmiert werden, bevor die Sperrbits programmiert werden.

28.2.1   Zwischenspeichern der Fuses

Der Wert der Fuses wird beim Eintreten in einen Programmiermodus zwischengespeichert. Änderungen an den Fuses wirken sich erst dann aus, wenn der Programmiermodus wieder verlassen wird. Dies gilt allerdings nicht für die EESAVE-Fuse, die sich auswirkt, sobald sie programmiert wird. Die Fuses werden auch beim Hochfahren im normalen Modus zwischengespeichert.

28.3   Signatur-Bytes

Alle Atmel-Mikrocontroller haben einen drei Byte langen Signatur-Code, der die Schaltkreis identifiziert. Dieser Code kann sowohl im seriellen als auch im parallelen Modus ausgelesen werden, selbst dann, wenn der Schaltkreis insgesamt gesperrt ist. Diese drei Bytes sind in einem separaten Adressraum untergebracht. Siehe folgende Tabelle.
Tabelle 28-10: Schaltkreis-ID
SchaltkreisAdresse des Signatur-Bytes
0x000
(Hersteller)
0x001
(Flash-Größe)
0x002
(lfd. Nummer)
ATmega48A0x1E0x920x05
ATmega48PA0x1E0x920x0A
ATmega88A0x1E0x930x0A
ATmega88PA0x1E0x930x0F
ATmega168A0x1E0x940x06
ATmega168PA0x1E0x940x0B
ATmega3280x1E0x950x14
ATmega328P0x1E0x950x0F

28.4   Kalibrier-Byte

Der Schaltkreis beinhaltet einen Kalibrierwert für den internen RC-Oszillator. Dieses Byte ist im oberen Byte der ersten Signatur-Bytes an der Adresse 0x000 abgelegt. Bei Reset wird der Wert automatisch in das OSCCAL-Register geschrieben.

28.5   Seitengröße

Tabelle 28-11: Anzahl 16-Bit-Worte pro Seite und Anzahl Seiten im Flash-Speicher
SchaltkreisFlash-GrößeSeitengrößePCWORDAnzahl SeitenPCPAGEPCMSB
ATmega48A2 KWord
(4 KByte)
32 WordPC[4:0]64PC[10:5]10
ATmega48PA
ATmega88A4 KWord
(8 KByte)
128PC[11:5]11
ATmega88PA
ATmega168A8 KWord
(16 KByte)
64 WordPC[5:0]PC[12:6]12
ATmega168PA
ATmega32816 KWord
(32 KByte)
256PC[13:6]13
ATmega328P
Tabelle 28-12: Anzahl 16-Bit-Worte pro Seite und Anzahl Seiten im EEPROM-Speicher
SchaltkreisEEPROM-GrößeSeitengrößePCWORDAnzahl SeitenPCPAGEEEAMSB
ATmega48A256 Byte4 ByteEEA[1:0]64EEA[7:2]7
ATmega48PA
ATmega88A512 Byte128EEA[8:2]8
ATmega88PA
ATmega168A
ATmega168PA
ATmega3281 KByte256EEA[9:2]9
ATmega328P

28.6   Parallele Programmierung

Nachfolgend wird beschrieben, wie der Flash, der EEPROM, die Sperr- und Fuse-Bits programmiert werden. Dabei wird vorausgesetzt, dass sämtliche Pulse mindestens 250 ns lang sind, wenn nichts anderes angegeben ist.

28.6.1   Signalnamen

In this section, some pins of the ATmegaX8 are referenced by signal names describing their functionality during parallel programming, see Figure 28-1 and Table 28-13. Pins not described in the following table are referenced by pin names.

The XA1/XA0 pins determine the action executed when the XTAL1 pin is given a positive pulse. The bit coding is shown in Table 28-15.

When pulsing WR or OE, the command loaded determines the action executed. The different Commands are shown in Table 28-16.

Bild 28-1: Parallele Programmierung
Hinweis:
  1. UCC - 0,3 V < AUCC < UCC + 0,3 V, allerdings sollte AUCC im Bereich 4,5 - 5,5 V liegen
Tabelle 28-13: Pinzuordnung
Signalname im ProgrammiermodusPin-NameI/OFunktion
RDY/BSYPD1O0: Schaltkreis beschäftigt mit Programmierung,
1: Schaltkreis bereit für neues Kommando
OEPD2IAusgangs-Freigabe (low-aktiv)
WRPD3ISchreibimpuls (low-aktiv)
BS1PD4IByte-Auswahl 1 (0 = Low-Byte, 1 = High-Byte)
XA0PD5IQuarz-Aktionsbit 0
XA1PD6IQuarz-Aktionsbit 1
PAGELPD7IProgrammspeicher- und EEPROM-Speicher laden
BS2PC2IByte-Auswahl 2 (0 = Low-Byte, 1 = zweites High-Byte)
DATA{PC[1:0]:PB[5:0]}I/OBidirektionaler Datenbus (Ausgang wenn OE low)
Tabelle 28-14: Pin-Werte beim Einstieg in den Programmiermodus
PinSymbolWert
PAGELProg_enable[3]0
XA1Prog_enable[2]0
XA0Prog_enable[1]0
BS1Prog_enable[0]0
Tabelle 28-15: Kodierung von XA1 und XA0
XA1XA0Aktion bei Puls an XTAL1
00Lade Flash- oder EEPROM-Adresse (High- oder Low-Teil je nach BS1).
01Lade Daten (High- oder Low-Byte für Flash je nach BS1).
10Lade Kommando
11Keine Aktion, Ruhezustand
Tabelle 28-16: Kommandobyte-Kodierung
KommandobyteAusgeführtes Kommando
1000 0000Chip löschen
0100 0000Fuse-Bits schreiben
0010 0000Sperrbits schreiben
0001 0000Flash schreiben
0001 0001EEPROM schreiben
0000 1000Signatur-Bytes und Kalibrierbyte lesen
0000 0100Fuse- und Sperrbits lesen
0000 0010Flash lesen
0000 0011EEPROM lesen

28.7   Parallel programmieren

28.7.1   Programmiermodus aktivieren

The following algorithm puts the device in Parallel (High-voltage) Programming mode:
  1. Set Prog_enable pins listed in Tabelle 28-14 to “0000”, RESET pin to 0 V and UCC to 0 V.
  2. Apply 4,5 - 5,5 V between UCC and GND. Ensure that UCC reaches at least 1,8 V within the next 20 µs.
  3. Wait 20 - 60 µs, and apply 11,5 - 12,5 V to RESET.
  4. Keep the Prog_enable pins unchanged for at least 10 µs after the High-voltage has been applied to ensure the Prog_enable Signature has been latched.
  5. Wait at least 300 µs before giving any parallel programming commands.
  6. Exit Programming mode by power the device down or by bringing RESET pin to 0 V.
If the rise time of the UCC is unable to fulfill the requirements listed above, the following alternative algorithm can be used.
  1. Set Prog_enable pins listed in Tabelle 28-14 to “0000”, RESET pin to 0V and UCC to 0V.
  2. Apply 4,5 - 5,5 V between UCC and GND.
  3. Monitor UCC, and as soon as UCC reaches 0,9 - 1,1 V, apply 11,5 - 12,5 V to RESET.
  4. Keep the Prog_enable pins unchanged for at least 10µs after the High-voltage has been applied to ensure the Prog_enable Signature has been latched.
  5. Wait until UCC actually reaches 4,5 - 5,5 V before giving any parallel programming commands.
  6. Exit Programming mode by power the device down or by bringing RESET pin to 0 V.

28.7.2   Überlegungen für effizientes Programmieren

The loaded command and address are retained in the device during programming. For efficient programming, the following should be considered.

28.7.3   Chip löschen

The Chip Erase will erase the Flash and EEPROM(1) memories plus Lock bits. The Lock bits are not reset until the program memory has been completely erased. The Fuse bits are not changed. A Chip Erase must be performed before the Flash and/or EEPROM are reprogrammed.
Hinweis:
  1. The EEPRPOM memory is preserved during Chip Erase if the EESAVE Fuse is programmed.
Load Command “Chip Erase”
  1. Set XA1, XA0 to “10”. This enables command loading.
  2. Set BS1 to “0”.
  3. Set DATA to “1000 0000”. This is the command for Chip Erase.
  4. Give XTAL1 a positive pulse. This loads the command.
  5. Give WR a negative pulse. This starts the Chip Erase. RDY/BSY goes low.
  6. Wait until RDY/BSY goes high before loading a new command.

28.7.4   Flash-Speicher programmieren

The Flash is organized in pages, see Table 28-11. When programming the Flash, the program data is latched into a page buffer. This allows one page of program data to be programmed simultaneously. The following procedure describes how to program the entire Flash memory:
  1. Load Command “Write Flash”
    1. Set XA1, XA0 to “10”. This enables command loading.
    2. Set BS1 to “0”.
    3. Set DATA to “0001 0000”. This is the command for Write Flash.
    4. Give XTAL1 a positive pulse. This loads the command.
  2. Load Address Low byte
    1. Set XA1, XA0 to “00”. This enables address loading.
    2. Set BS1 to “0”. This selects low address.
    3. Set DATA = Address low byte (0x00 - 0xFF).
    4. Give XTAL1 a positive pulse. This loads the address low byte.
  3. Load Data Low Byte
    1. Set XA1, XA0 to “01”. This enables data loading.
    2. Set DATA = Data low byte (0x00 - 0xFF).
    3. Give XTAL1 a positive pulse. This loads the data byte.
  4. Load Data High Byte
    1. Set BS1 to “1”. This selects high data byte.
    2. Set XA1, XA0 to “01”. This enables data loading.
    3. Set DATA = Data high byte (0x00 - 0xFF).
    4. Give XTAL1 a positive pulse. This loads the data byte.
  5. Latch Data
    1. Set BS1 to “1”. This selects high data byte.
    2. Give PAGEL a positive pulse. This latches the data bytes. (See Figure 28-3 for signal waveforms)
  6. Repeat B through E until the entire buffer is filled or until all data within the page is loaded.
While the lower bits in the address are mapped to words within the page, the higher bits address the pages within the FLASH. This is illustrated in Figure 28-2. Note that if less than eight bits are required to address words in the page (pagesize < 256), the most significant bit(s) in the address low byte are used to address the page when performing a Page Write.
  1. Load Address High byte
    1. Set XA1, XA0 to “00”. This enables address loading.
    2. Set BS1 to “1”. This selects high address.
    3. Set DATA = Address high byte (0x00 - 0xFF).
    4. Give XTAL1 a positive pulse. This loads the address high byte.
  2. Program Page
    1. Give WR a negative pulse. This starts programming of the entire page of data. RDY/BSY goes low.
    2. Wait until RDY/BSY goes high (See Figure 28-3 for signal waveforms).
  3. Repeat B through H until the entire Flash is programmed or until all data has been programmed.
  4. End Page Programming
    1. Set XA1, XA0 to “10”. This enables command loading.
    2. Set DATA to “0000 0000”. This is the command for No Operation.
    3. Give XTAL1 a positive pulse. This loads the command, and the internal write signals are reset.
Bild 28-2: Addressing the Flash Which is Organized in Pages(1)
Hinweis:
  1. PCPAGE und PCWORD siehe Tabelle 28-11
Bild 28-3: Programming the Flash Waveforms(1)
Hinweis:
  1. “XX” is don’t care. The letters refer to the programming description above.

28.7.5   EEPROM programmieren

The EEPROM is organized in pages, see Table 28-12. When programming the EEPROM, the program data is latched into a page buffer. This allows one page of data to be programmed simultaneously. The programming algorithm for the EEPROM data memory is as follows (refer to ”Programming the Flash” for details on Command, Address and Data loading):
  1. A Load Command “0001 0001”.
  2. G Load Address High Byte (0x00 - 0xFF).
  3. B Load Address Low Byte (0x00 - 0xFF).
  4. C Load Data (0x00 - 0xFF).
  5. E Latch data (give PAGEL a positive pulse).
  6. K Repeat 3 through 5 until the entire buffer is filled.
  7. L Program EEPROM page
    1. Set BS1 to “0”.
    2. Give WR a negative pulse. This starts programming of the EEPROM page. RDY/BSY goes low.
    3. Wait until to RDY/BSY goes high before programming the next page (See Figure 28-4 for signal waveforms).
Bild 28-4: Programming the EEPROM Waveforms

28.7.6   Flash-Speicher lesen

The algorithm for reading the Flash memory is as follows (refer to ”Programming the Flash” for details on Command and Address loading):
  1. A Load Command “0000 0010”.
  2. G Load Address High Byte (0x00 - 0xFF).
  3. B Load Address Low Byte (0x00 - 0xFF).
  4. Set OE to “0”, and BS1 to “0”. The Flash word low byte can now be read at DATA.
  5. Set BS1 to “1”. The Flash word high byte can now be read at DATA.
  6. Set OE to “1”.

28.7.7   EEPROM lesen

The algorithm for reading the EEPROM memory is as follows (refer to ”Programming the Flash” for details on Command and Address loading):
  1. A Load Command “0000 0011”.
  2. G Load Address High Byte (0x00 - 0xFF).
  3. B Load Address Low Byte (0x00 - 0xFF).
  4. Set OE to “0”, and BS1 to “0”. The EEPROM Data byte can now be read at DATA.
  5. Set OE to “1”.

28.7.8   Low-Fuse-Bits setzen

The algorithm for programming the Fuse Low bits is as follows (refer to ”Programming the Flash” for details on Command and Data loading):
  1. A Load Command “0100 0000”.
  2. C Load Data Low Byte. Bit n = “0” programs and bit n = “1” erases the Fuse bit.
  3. Give WR a negative pulse and wait for RDY/BSY to go high.

28.7.9   High-Fuse-Bits setzen

The algorithm for programming the Fuse High bits is as follows (refer to ”Programming the Flash” for details on Command and Data loading):
  1. A Load Command “0100 0000”.
  2. C Load Data Low Byte. Bit n = “0” programs and bit n = “1” erases the Fuse bit.
  3. Set BS1 to “1” and BS2 to “0”. This selects high data byte.
  4. Give WR a negative pulse and wait for RDY/BSY to go high.
  5. Set BS1 to “0”. This selects low data byte.

28.7.10   Erweiterte Fuse-Bits setzen

The algorithm for programming the Extended Fuse bits is as follows (refer to ”Programming the Flash” for details on Command and Data loading):
  1. A Load Command “0100 0000”.
  2. C Load Data Low Byte. Bit n = “0” programs and bit n = “1” erases the Fuse bit.
  3. Set BS1 to “0” and BS2 to “1”. This selects extended data byte.
  4. Give WR a negative pulse and wait for RDY/BSY to go high.
  5. Set BS2 to “0”. This selects low data byte.
Bild 28-5: Programming the Fuses Waveforms

28.7.11   Sperrbits setzen

The algorithm for programming the Lock bits is as follows (refer to ”Programming the Flash” for details on Command and Data loading):
  1. A Load Command “0010 0000”.
  2. C Load Data Low Byte. Bit n = “0” programs the Lock bit. If LB mode 3 is programmed (LB1 and LB2 is programmed), it is not possible to program the Boot Lock bits by any External Programming mode.
  3. Give WR a negative pulse and wait for RDY/BSY to go high. The Lock bits can only be cleared by executing Chip Erase.

28.7.12   Fuse- und Sperrbits lesen

The algorithm for reading the Fuse and Lock bits is as follows (refer to ”Programming the Flash” for details on Command and Data loading):
  1. A Load Command “0000 0100”.
  2. Set OE to “0”, BS2 to “0” and BS1 to “0”. The status of the Fuse Low bits can now be read at DATA (“0” means programmed).
  3. Set OE to “0”, BS2 to “1” and BS1 to “1”. The status of the Fuse High bits can now be read at DATA (“0” means programmed).
  4. Set OE to “0”, BS2 to “1”, and BS1 to “0”. The status of the Extended Fuse bits can now be read at DATA (“0” means programmed).
  5. Set OE to “0”, BS2 to “0” and BS1 to “1”. The status of the Lock bits can now be read at DATA (“0” means programmed).
  6. Set OE to “1”.
Bild 28-6: Mapping Between BS1, BS2 and the Fuse and Lock Bits During Read

28.7.13   Signatur-Bytes lesen

The algorithm for reading the Signature bytes is as follows (refer to ”Programming the Flash” for details on Command and Address loading):
  1. A Load Command “0000 1000”.
  2. B Load Address Low Byte (0x00 - 0x02).
  3. Set OE to “0”, and BS1 to “0”. The selected Signature byte can now be read at DATA.
  4. Set OE to “1”.

28.7.14   Kalibrier-Byte lesen

The algorithm for reading the Calibration byte is as follows (refer to ”Programming the Flash” for details on Command and Address loading):
  1. A Load Command “0000 1000”.
  2. B Load Address Low Byte, 0x00.
  3. Set OE to “0”, and BS1 to “1”. The Calibration byte can now be read at DATA.
  4. Set OE to “1”.

28.7.15   Kennwerte

For characteristics of the Parallel Programming, see ”Parallel Programming Characteristics”.

28.8   Seriell programmieren

Sowohl der Flash als auch das EEPROM können über das SPI programmiert werden, während RESET auf GND gehalten wird. Das serielle Interface besteht aus den Pins SCK, MOSI (Input) und MISO (Output). Nachdem RESET auf Low gesetzt ist, muss erst ein Programmierfreigabe-Befehl ausgeführt werden, bevor eine Programmier- oder Löschoperation durchgeführt werden kann. Die Pinbelegung, die nachfolgend abgebildet ist, gilt nicht für alle AVR-Controller.
Bild 28-7: Serielle Programmierung und Überprüfung
Hinweise:
  1. Wenn der Schaltkreis vom internen Oszillator getaktet wird, ist keine Taktquelle an XTAL1 erforderlich
  2. UCC – 0,3 V < AUCC < UCC + 0,3 V, allerdings sollte AUCC stets im Bereich 1,8 … 5,5 V sein
Für das EEPROM ist ein automatischer Löschzyklus in den Schreibbefehl implementiert (nur im seriellen Programmiermodus), so dass der Chip vorher nicht extra gelöscht werden muss. Das Chip-Löschen setzt die Speicherzellen von Programm- und EEPROM-Speicher auf den Wert 0xFF.

Anhängig von den CKSEL-Fuses muss ein gültiger Takt vorhanden sein. Die minimale Low- und High-Zeit für den seriellen Takt Eingang (SCK) ist wie folgt definiert: Low: > 2 CPU-Takte bei fck < 12 MHz und 3 CPU Takte bei fck ≥ 12 MHz. High: > 2 CPU-Takte bei fck < 12 MHz und 3 CPU Takte bei fck ≥ 12 MHz.

28.8.1   Pinbelegung zur Programmierung

Tabelle 28-17: Pinzuordnung
SymbolPinI/OBeschreibung
MOSIPB3ISerieller Dateneingang
MISOPB4OSerieller Datenausgang
SCKPB5ISerieller Takt (Eingang)

28.8.2   Programmier-Algorithmus

Wenn Daten seriell geschrieben werden, werden diese mit der steigenden Flanke des SCK getaktet.

Wenn Daten aus dem Baustein ausgelesen werden, so werden diese mit der fallenden Flanke des SCK-Signals getaktet. Siehe Bild 28-9 zum Timing.

Für die Programmierung und Überprüfung im seriellen Programmiermodus wird folgender Ablauf empfolen (Siehe Tabelle 28-19):

  1. Spannung einschalten:
    1. Anlegen der Spannung zwischen UCC und GND während Reset und SCK auf 0 liegen
    2. Wenn das Programmiergerät nicht sicherstellen kann, dass SCK während des Einschaltens der Spannungsversorgung auf Low gehalten werden kann, dann muss auf Reset ein positiver Impuls von mindestens 2 MCU-Takten Dauer gegeben werden, nachdem SCK auf 0 gesetzt wurde.
  2. Warten für mindestens 20 ms und Freigeben des Programmiermodus durch Senden des Programmierfreigabe Befehls an den MOSI Pin.
  3. Die Programmierbefehle werden nicht ausgeführt, wenn die Kommunikation zwischen Baustein und Programmiergerät nicht sauber synchronisiert ist. Wenn beide synchron sind, wird das zweite Byte des Programmierfreigabe-Befehls (53h) zurückgegeben, während das dritte Byte des Befehls gesendet wird. Egal ob dieses Byte zurückgegeben wird, die vier Byte des Befehls müssen auf jeden Fall an den Baustein gesendet werden. Wenn das Byte (53h) nicht zurückgegeben wird, dann gibt man RESET einen positiven Impuls und versucht erneut den Programmierfreigabe-Befehl zu senden.
  4. Der Flash wird seitenweise programmiert. Die Seitengröße ist in Tabelle 93 angegeben. Die Speicherseite wird byteweise geladen, indem die 5 LSB der Adresse zusammen mit den Daten in einem Load Programm Memory Page Befehl übergeben werden. Um sicherzustellen, dass die Seite korrekt geladen wird, muss erst das Daten Low Byte geladen werden, bevor das Daten High Byte der Adresse übergeben wird. Die Seite wird gespeichert, indem ein Write Program Memory Page Befehl zusammen mit den 7 MSB der Adresse geladen wird. Wenn kein Polling genutzt wird, muss der Anwender mindestens die Zeit tWD_FLASH warten, bis die nächste Seite programmiert werden kann.
    1. Der EEPROM wird byteweise programmiert, wobei sowohl die Adresse und die Daten zusammen in dem entsprechenden Schreibbefehl erwartet werden. Eine EEPROM-Speicherzelle wird zuerst automatisch gelöscht, bevor sie neu beschrieben wird. Man kann durch Pollen ermitteln, wann das nächste Byte in den Flash oder EEPROM geschrieben werden kann. Das Pollen ist unnötig, wenn man die Zeit tWD_EEPROM wartet, bevor der nächste Befehl übermittel wird. In einem gelöschten Baustein brauchen die Werte FFh im Datenspeicher nicht extra programmiert zu werden.
    2. Der EEPROM wird seitenweise programmiert.
  5. Jede Speicherzelle kann überprüft werden, indem mit dem Lesebefehl der Inhalt der Speicherzelle der aktuellen Adresse über den MISO-Pin ausgegeben wird.
  6. Am Ende der Programmierung kann RESET auf High gelegt werden, um die normale Schaltkreisfunktion zu starten.
  7. Abschalten der Spannung (wenn benötigt):
Tabelle 28-18: Typische Wartezeiten, bevor die nächste Flash- oder EEPROM-Schreiboperation starten darf
SymbolMinimale Wartezeit
tWD_FLASH4,5 ms
tWD_EEPROM3,6 ms
tWD_ERASE9,0 ms
tWD_FUSE4,5 ms

28.8.3   Befehlssatz zur seriellen Programmierung

Die Tabelle 28-19 und das Bild 28-8 beschreiben den Befehlssatz.
Tabelle 28-19: Befehlssatz bei serieller Programmierung
BefehlBefehlsformat
Byte 1Byte 2Byte 3Byte 4
Programmierfreigabe0xAC0x530x000x00
Chip löschen (Programmspeicher und ggf. EEPROM)0xAC0x800x000x00
Abfrage RDY/BSY0xF00x000x00data byte out
Ladebefehle
Lade Erweitertes Adressbyte(1)0x4D0x00Extended adr0x00
Lade Programmspeicherseite, High-Byte0x480x00adr LSBhigh data byte in
Lade Programmspeicherseite, Low-Byte0x400x00adr LSBlow data byte in
Lade EEPROM-Speicherseite0xC10x000000 000aadata byte in
Lesebefehle
Lese Programmspeicher, High-Byte0x28adr MSBadr LSBhigh data byte out
Lese Programmspeicher, Low-Byte0x20adr MSBadr LSBlow data byte out
Lese EEPROM-Speicher0xA00000 00aaaaaa aaaadata byte out
Lese Sperrbits0x580x000x00data byte out
Lese Signatur-Byte0x300x000000 000aadata byte out
Lese Low-Fuse-Bits0x500x000x00data byte out
Lese High-Fuse-Bits0x580x080x00data byte out
Lese Erweiterte Fuse-Bits0x500x080x00data byte out
Lese Kalibrier-Byte0x380x000x00data byte out
Schreibbefehle(6)
Schreibe Programmspeicher-Seite0x4Cadr MSB(8)adr LSB(8)0x00
Schreibe EEPROM-Byte0xC00000 00aaaaaa aaaadata byte in
Schreibe EEPROM-Seite0xC20000 00aaaaaa aa000x00
Schreibe Sperrbits0xAC0xE00x00data byte in
Schreibe Low-Fuse-Bits0xAC0xA00x00data byte in
Schreibe High-Fuse-Bits0xAC0xA80x00data byte in
Schreibe Erweiterte Fuse-Bits0xAC0xA40x00data byte in
Hinweise:
  1. Nicht alle Befehle sind für alle AVR-Typen gültig; nicht für diese ATmegaX8
  2. a = Adressbit
  3. „1“ bedeutet unprogrammiert, „0“ bedeutet programmiert
  4. Für künftige Kompatibilität sollten ungenztzte Fuses unprogrammiert („1“) belassen werden
  5. Siehe entsprechenden Abschnitt zu Fuse- und Sperrbits, Kalibrier- und Signaturbytes sowie Seitengrößen
  6. Befehle zum Zugriff auf den Programmspeicher benutzen eine Wortadresse. Diese Adresse darf wahlfrei innerhalb der aktuellen Seite sein.
  7. Siehe Atmel-Website für Anwender-Hinweise zum Programmieren und zu Programmiergeräten
  8. 16-Bit-Worte
Solange das Bit 0 im RDY/BSY-Datenbyte = 1 ist, ist eine Programmieroperation in Gange. Warte bis dieses Bit = 0 wird vor dem nächsten Befehl.

Innerhalb derselben Speicherseite muss das Low-Byte vor dem High-Byte geladen werden.

Nachdem die Daten in den Seitenpuffer geladen wurden, kann die EEPROM-Seite wie im folgenden Bild programmiert werden.

Bild 28-8: Beispiel zu seriellen Programmierung

28.8.4   SPI-Kennwerte zur Programmierung

Bild 28-9: Zeitlicher Ablauf der SPI-Programmierung
Für Zeiten siehe Kennwerte der SPI-Schnittstelle