11.   Systemkontrolle und Reset

11.1   Reset = Neustart

Während eines Resets werden alle I/O-Register auf ihre Initialwerte eingestellt und das Programm wird ab der Adresse des Reset-Vektors gestartet. Für ATmega168/328 muss der Befehl am Reset-Vektor ein JMP-Befehl sein, der zum Initialisierunskode springt. Für ATmega48/88 muss der Befehl ein RJMP-Befehl sein. Wenn das Programm keinerlei Interrupts verwendet, kann regulärer Programmkode an der Adresse des Reset-Vekotrs beginnen. Dies gilt auch in den Fällen, in denen der Reset-Vektor im Applikations-Sektor und die Interrupt-Vektoren im Boot-Sektor liegen bzw. umgekehrt (nur ATmega88/168/328). Die Schaltung im Bild 11-1 zeigt die Reset-Logik. Tabelle 29-11 definiert elektrische Parameter der Reset-Schaltung.

Das Zurücksetzen der I/O-Register auf ihre Resetwerte geschieht unmittelbar durch den Reset, die verschiedenen Takte müssen dafür nicht aktiv sein.

Nachdem die Resetbedingungen aller Resetquellen verschwunden sind, wird ein interner Verzögerungszähler gestartet, der den internen Rest verlängert. Dadurch kann die Versorgungsspannung einen stabilen Pegel erreicht, bevor mit der normalen Abarbeitung des Programms begonnen wird. Die Verzögerungszeit des Verzögerungszählers wird mit den CKSEL-Fuses eingestellt — siehe Auswahl der Taktquellen.

11.2   Reset-Quellen

Der Schaltkreis hat vier verschiedene Resetquellen:
Bild 11-1: Reset-Logik

11.3   Power-on-Reset (POR)

Ein Power-on-Reset-Impuls wird durch eine Schaltung auf dem Chip erzeugt. Die nominellen Schwellwerte sind in System- und Reset-Kennwerte dargestellt. Ein POR wird immer dann erzeugt, wenn UCC unterhalb der Schwellwerte liegt. Die POR-Schaltung kann genutzt werden, um einen Hochlauf-Reset auszulösen, aber auch, um ein Fehlen der Versorgungsspannung zu erkennen.

Die Power-on-Reset-Schaltung stellt sicher, dass der Baustein einen sauberen Reset beim Einschalten der Versorgungsspannung ausführt. Wird die Power-on-Schwellwertspannung erreicht, wird ein Verzögerungszähler gestartet, der die Verzögerung bestimmt, für die der Baustein nach dem Einschalten der Versorgungsspannung im Reset bleibt. Das Reset-Signal wird wiederholt und ohne Verzögerung erzeugt, wenn UCC unter den Auslösepegel sinkt.

Bild 11-2: Mikrocontroller-Hochlauf, RESET an UCC angeschlossen
Bild 11-3: Mikrocontroller-Hochlauf, RESET extern verlängert

11.4   Externer Reset

Ein externer Reset wird durch einen Low-Pegel am RESET-Pin ausgelöst. Reset-Pulse länger als die bei System- und Reset-Kennwerte angegebenen lösen einen Reset aus, auch dann, wenn keine Takte laufen. Kürzere Pulse führen nicht garantiert zu einem Reset. Wenn das Reset-Signal am Eingang bei seiner positiven Flanke die Reset-Schwellwertspannung URST erreicht, wird der Verzögerungszeitgeber gestartet, so dass der Controller nach der Zeit tTOUT die Arbeit beginnt. Der externe Reset kann durch Programmieren der RSTDISBL-Fuse deaktiviert werden, siehe Tabelle 28-7.
Bild 11-4: Externer Reset

11.5   Unterspannungs-Reset

Der Schaltkreis hat einen Unterspannungsdetektor eingebaut, die den Pegel der Versorgungsspannung überwacht, indem diese mit einem festen Triggerpegel verglichen wird. Der Triggerpegel kann durch die BODLEVEL-Fuses festgelegt werden. Der Triggerpegel hat eine Hysterese, um eine störspitzenfreie Spannungsüberwachung zu gewährleisten. Die Hysterese der Triggerpegel kann interpretiert werden als UBOT+ = UBOT + UHYST/2 und UBOT– = UBOT – UHYST/2. Wenn BODLEVEL programmiert ist und UCC unter den Triggerpegel (UBOT– im Bild 11-5), wird ein Unterspannungs-Reset ausgelöst. Wenn UCC über den Triggerpegel steigt (UBOT+ im Bild 11-5), startet der Verzögerungszähler und danach der Mikrocontroller nach Ablauf von tTOUT.

Der Unterspannungsdetektor kann nur einen Spannungsabfall unter dem Triggerpegel detektieren, wenn dieser länger als tBOD vorliegt. Die Zeit ist bei System- und Reset-Kennwerte angegeben.

Bild 11-5: Unterspannungs-Detektor-Reset

11.6   Watchdog-Reset

Wenn der Watchdog-Zeitgeber überläuft, wird ein Reset-Impuls von der Dauer eines Taktes erzeugt. Mit der fallenden Flanke dieses Impulses wird der Verzögerungszähler gestartet, der die Verzögerungszeit tTOUT erzeugt. Weiteres zu Watchdog steht weiter hinten.
Bild 11-6: Watchdog-Reset

11.7   Interne Spannungsreferenz

Der Controller hat eine interne Bandgap-Referenzspannungsquelle. Diese Referenzspannung wird für die Unterspannungs-Erkennung verwendet und kann auch als Eingang für den Analogvergleicher oder den Analog/Digital-Wandler benutzt werden.

11.7.1   Freigabesignale und Hochlaufzeiten

Die Referenzspannungsquelle hat eine Hochlaufzeit, die Einfluss darauf hat, bis sie benutzt werden kann. Die Zeit ist bei System- und Reset-Kennwerte angegeben. Um Strom zu sparen ist die Referenzspannungsquelle nicht immer aktiv. Sie wird nur in folgenden Fällen aktiviert:
  1. Wenn BOD durch Programmierung der BODLEVEL[2:0]-Fuses freigegeben ist
  2. Wenn die Referenzspannungsquelle mit dem Analogvergleicher verbunden ist (durch Setzen von ACBG im ACSR)
  3. Wenn der ADU freigegeben ist
Das heißt, wenn BOD nicht freigegeben ist und das ACGB-Bit gesetzt wird oder des ADC aktiviert wird, muss der Anwender also die Start-up Zeit abwarten, bis der Analog Comparator oder der Analog-Digitalwandler genutzt werden kann. Um im Leistung-weg-Energiesparmodus Strom zu sparen, muss der Anwender vermeiden, dass einer der drei oben genannten Fälle auftritt, indem er die Referenzspannungsquelle ausschaltet.

11.8   Watchdog-Zeitgeber

11.8.1   Features

11.8.2   Übersicht

Der Chip hat einen erweiterten Watchdog-Zeitgeber (WDT). Er wird von einem separaten 128-kHz-Oszillator getaktet. Der Watchdog kann einen Interrupt oder ein Reset auslösen, wenn eine Zeitüberschreitung erreicht wird. Im Normalfall wird der Befehl WDR (Watchdog Reset) benutzt, um den Zeitgeber neu zu starten, bevor es zur Zeitüberschreitung kommt. Andernfalls wird ein Interrupt oder Reset ausgelöst.
Bild 11-7: Watchdog-Timer
Im Interruptbetrieb gibt der WDT einen Interrupt, wenn der Zeitgeber abläuft. Der Interrupt kann genutzt werden, um den Chip vom Schlafmodus aufzuwecken, oder als allgemeiner Zeitgeber. Ein Beispiel ist es, die Dauer einer bestimmten Rechenoperation zu begrenzen, indem ein Interrupt auftaucht, wenn die Operation länger als erwartet dauert. Im Reset-Betrieb gibt der WDT einen Reset, wenn der Zeitgeber abläuft. Dies wird typischerweise eingesetzt, um Aufhänger durch Endlos-Kode abzubrechen. Die dritte Betriebsart, Interrupt- und Reset-Betrieb, kombiniert beides indem zuerst ein Interrupt ausgelöst wird und dann zum Reset-Betrieb gewechselt wird. Diese Betriebsart ermöglicht beispielsweise ein geordnetes Herunterfahren unter Speichern von kritischen Parametern, bevor es zum Reset kommt.

Die WDTON-Fuse (Watchdog immer an), falls programmiert, zwingt den Watchdog in den Reset-Modus. Nur das Timeout kann noch eingestellt werden. In diesem Fall ist das Bits WDE stets 1 und WDIE stets 0. Für erhöhte Programmsicherheit müssen Änderungen am Watchdog durch eine zeitbegrenzte Sequenz ausgeführt werden. Die Sequenz zum Löschen von WDE oder dem Ändern der Zeiten ist wie folgt:

  1. In einem Befehl muss gleichzeitig eine 1 in die Bits WDCE und WDE geschrieben werden. Die 1 muss — unabhängig vom vorherigen Zustand von WDE — in WDE geschrieben werden.
  2. Innerhalb der nächsten vier Taktzyklen muss die 0 in das WDE-Bit oder die neuen Vorteiler-Bits WDP[3:0] geschrieben werden.
Der folgende Beispielkode zeigt eine Assembler- und eine C-Funktion, um den Watchdog-Zeitgeber abzuschalten. Die Beispiele verlassen sich darauf, dass Interrupts abgeschaltet sind oder nicht auftreten.
Falsch! Interrupts werden zu Fuß gesperrt und wieder freigegeben.
Beispiel in Assembler (1)
WDT_off:
	cli			; Interrupts global sperren
	wdr			; Watchdog rücksetzen
	in	r16,MCUSR	; WDRF in MCUSR löschen
	andi	r16,~(1<<WDRF)
	out	MCUSR, r16
; Schreibe 1-Bits nach WDCE und WDE
; Alten Vorteiler behalten, um unerwartete Zeitüberschreitung zu vermeiden
	lds	r16,WDTCSR
	ori	r16,(1<<WDCE)|(1<<WDE)
	sts	WDTCSR, r16
	ldi	r16,0
	sts	WDTCSR, r16	; Watchdog ausschalten (nach 3 Takten)
	sei			; Interrupts global freigeben
	ret
Beispiel in C (1)
void WDT_off(void) {
  __disable_interrupt();
  __watchdog_reset();
  MCUSR &= ~(1<<WDRF);		/* WDRF in MCUSR löschen */
/* Schreibe 1-Bits nach WDCE und WDE */
/* Alten Vorteiler behalten, um unerwartete Zeitüberschreitung zu vermeiden */
  WDTCSR |= (1<<WDCE) | (1<<WDE);
  WDTCSR = 0x00;		/* Watchdog ausschalten */
  __enable_interrupt();
}
Hinweis: Ist der Watchdog unerwartet freigegeben, etwa durch einen unkontrollierten Kode-Ablauf oder bei Unterspannung, gibt es einen Reset, und der Watchdog bleibt scharf. Wenn Kode den Watchdog nicht behandelt, kann das zu einer endlosen Reset-Schleife führen. Um diese Situation zu vermeiden, sollte die Anwendungssoftware stets die Bits WDRF und WDE in der Initialisierungsroutine löschen, sogar wenn der Watchdog gar nicht benutzt wird.

Der folgende Beispielkode zeigt eine Assembler- und eine C-Funktion, um den Zeitüberschreitungswert (Vorteiler) des Watchdogs zu ändern.

Beispiel in Assembler (1)
WDT_Prescaler_Change:
	cli			; Interrupts global sperren
	wdr			; Watchdog rücksetzen
	lds	r16,WDTCSR	; Zeitbegrenzte Sequenz starten
	ori	r16,(1<<WDCE)|(1<<WDE)
	sts	WDTCSR,r16
; Von hier aus haben wir 4 Takte Zeit
; Neuer Vorteiler auf = 64K (≈0,5 s)
	ldi	r16,(1<<WDE)|(1<<WDP2)|(1<<WDP0)
	sts	WDTCSR,r16
; Fertig mit 3 Takten (STS benötigt 2 Takte)
	sei			; Interrupts global freigeben
	ret
Beispiel in C (1)
void WDT_Prescaler_Change(void) {
  __disable_interrupt();
  __watchdog_reset();
/* Zeitbegrenzte Sequenz starten */
  WDTCSR |= (1<<WDCE) | (1<<WDE);
/* Neuer Vorteiler auf = 64K (≈0,5 s) */
  WDTCSR  = (1<<WDE) | (1<<WDP2) | (1<<WDP0);
  __enable_interrupt();
}
Hinweis:
  1. Siehe „Über Kode-Beispiele“.
Hinweis: Der Watchdog sollte unmittelbar vor dem Ändern der Vorteiler-Bits mittels WDR-Befehl beruhigt werden, da ansonsten beim Verkürzen der Zeit eine Zeitüberschreitung auftreten könnte.

11.9   Register-Beschreibung

11.9.1   MCUSR — Mikrocontroller-Status

Bit76543210
(0x54)----WDRFBORFEXTRFPORFMCUCSR
ZugriffRRRRR/WR/WR/WR/W
Startwert0000Siehe Bit-Beschreibung
Diese Bits sind reserviert und werden immer als 0 gelesen. Dieses Bit wird gesetzt „1“, wenn ein Watchdog-Reset auftrat. Es wird durch ein Power-on-Reset gelöscht oder wenn es mit einer logischen „0“ beschrieben wird. Dieses Bit wird gesetzt „1“, wenn ein Unterspannungs-Reset auftrat. Es wird durch eine Power-on-Reset gelöscht oder wenn es mit einer logischen „0“ beschrieben wird. Dieses Bit wird gesetzt „1“, wenn ein externer Reset auftrat. Es wird durch eine Power-on-Reset gelöscht oder wenn es mit einer logischen „0“ beschrieben wird. Dieses Bit wird gesetzt „1“, wenn ein Power-on-Reset auftrat. (Die drei anderen Bits sind dann konsequenterweise Null.) Diese Bit kann nur gelöscht werden, indem es mit einer logischen „0“ beschrieben wird.

Die Reset-Flags können ausgewertet werden, um die Ursache eines Resets festzustellen. Dabei sollte das MCUSR so früh wie möglich im Programm ausgewertet und anschließend gelöscht werden.

11.9.2   WDTCR — Watchdog-Zeitgeber-Kontrolle

Bit76543210
(0x60)WDIFWDIEWDP3WDCEWDEWDP2WDP1WDP0WDTCR
ZugriffR/W!R/W↓R/WR/WR/WR/WR/WR/W
Startwert0000X000
Dieses Bit ist gesetzt, wenn der Watchdog-Zeitgeber überläuft und der Watchdog auf Interrupt konfiguriert ist. WDIF wird durch die Hardware gelöscht, wenn der Watchdog-Interrupt zur Ausführung kommt. Alternativ kann WDIF durch Schreiben einer Eins gelöscht werden. Wenn das I-Bit in SREG und WDIE gesetzt sind, wird der Watchdog-Interrupt ausgeführt.

Wenn dieses Bit und das I-Bit im Statusregister gesetzt ist, ist der Watchdog-Interrupt freigegeben. Wird WDE gemeinsam mit dem Setzen dieses Bits gelöscht, befindet sich der Watchdog im Interrupt-Betrieb, und der zugehörige Interruptvektor wird bei Zeitgeber-Überlauf ausgelöst. Ist sowohl WDIE als auch WDE gesetzt, befindet sich der Watchdog im Interrupt- und im Reset-Betrieb. Die erste Zeitüberschreitung setzt WDIF. Die Ausführung des Interruptsvektors löscht sowohl WDIE als auch WDIF durch die Hardware, der Watchdog ist nunmehr im Reset-Betrieb. Dies ist sinnvoll wenn Watchdog-Sicherheit gemeinsam mit Interrupts verwendet werden soll. Um im Interrupt- und Reset-Betrieb zu bleiben, muss nach Interruptroutine WDIE gesetzt werden. Das sollte jedoch nicht innerhalb der Interruptroutine geschehen, da dies die Sicherheitsfunktion des Watchdogs kompromittiert. Kommt die Interruptroutine nicht zur Ausführung bis zur zweiten Zeitüberschreitung, wird ein Reset ausgelöst.
Tabelle 11-1: Watchdog-Zeitgeber-Konfiguration
WDTON(1)WDEWDIEBetriebsartAktion bei Zeitüberschreitung
100inaktivkeine
101Interrupt-BetriebInterrupt
110Reset-BetriebReset
111Interrupt- und Reset-BetriebInterrupt, dabei Wechsel zu Reset-Betrieb
0xxReset-BetriebReset
Hinweis:
  1. WDTON-Fuse = „0“ bedeutet programmiert und „1“ bedeutet unprogrammiert.
Dieses Bit muss gesetzt sein, wenn das WDE-Bit gelöscht oder Vorteiler-Bits geändert werden sollen. Wenn das WDCE-Bit gesetzt wurde, wird es durch die Hardware nach vier Taktzyklen wieder gelöscht. WDE wird durch WDRF im MCUSR übergangen. Das bedeutet, WDE ist immer gesetzt wenn WDRF gesetzt ist. Um WDE zu löschen, muss erst WDRF gelöscht werden. Dieses Feature sichert mehrere Resets bei verursachten Watchdog-Zeitüberschreitungen, und ein sicheren Hochlauf nach dem Problem. Diese Bits definieren den Vorteiler des Watchdog-Zeitgebers, wenn dieser freigegeben ist. Die Einstellmöglichkeiten und die dazugehörigen Zeitüberschreitungs-Zeiten sind in nachfolgender Tabelle dargestellt.
Tabelle 11-2: Watchdog-Zeitgeber-Vorteiler-Auswahl
WDP3WDP2WDP1WDP0WDT-Oszillator-ZyklenTypische Zeitüberschreitung bei UCC = 5,0 V
00002K (2048)16 ms
00014K (4096)32 ms
00108K (8192)64 ms
001116K (16384)0,125 s
010032K (32768)0,25 s
010164K (65536)0,5 s
0110128K (131072)1 s
0111256K (262144)2 s
1000512K (524288)4 s
10011024K (1048576)8 s
1010reserviert
1011
1100
1101
1110
1111