Features
  • Atmel® AVR® 8-Bit-Mikrocontroller-Familie mit hoher Leistung und geringem Energiebedarf
  • Fortgeschrittene RISC-Architektur
    • 131 Befehle – die meisten benötigen nur einen Taktzyklus
    • 32 8-bit-breite allgemeine Arbeitsregister
    • Komplett statischer Betrieb
    • Bis zu 20 MIPS Durchsatz bei 20 MHz
    • Integrierter Multiplizierer mit 2 Taktzyklen
  • Nichtflüchtige Speicherbereiche mit hoher Datenhaltefähigkeit
    • 4/8/16/32 KBytes In-System- und selbstprogrammierbarer Flash-Programmspeicher
    • 256/512/512/1 KBytes EEPROM
    • 512/1K/1K/2 KBytes interner statischer RAM
    • Schreib- und Lösch-Zyklen: 10.000 Flash / 100.000 EEPROM
    • Garantierte Datenhaltezeit: 20 Jahre bei 85 °C / 100 Jahre bei 25 °C(1)
    • Optionaler Kodebereich für einen Urlader mit gesonderten Sperrbits
      • In-System-Programmierung durch eingebauten Urlader
      • Echter Lesen-während-Schreiben-Betrieb
    • Programmiersperre für Software-Sicherheit
  • Unterstützung durch die Atmel® QTouch®-Bibliothek
    • Kapazitive Berührtasten, Schieber und Drehräder
    • QTouch- und QMatrix®-Erfassung
    • Bis zu 64 Abfragekanäle
  • Features der Peripherie
    • Zwei 8-bit Zähler/Zeitgeber mit separatem Vorteiler und Compare-Modus
    • Ein 16-bit Zähler/Zeitgeber mit separatem Vorteiler, Capture- und Compare-Modus
    • Echtzeituhr-Zähler mit separatem Oszillator
    • Sechs PWM-Ausgänge
    • 10-bit Analog-Digital-Wandler (ADU) mit 8 Eingängen in den SMD-Gehäusen
      • Temperaturmessung
    • 10-bit Analog-Digital-Wandler (ADU) mit 6 Eingängen im DIL-Gehäuse
      • Temperaturmessung
    • Programmierbare asynchrone oder synchrone serielle Schnittstelle (USART)
    • Serielle SPI-Schnittstelle mit Master- und Slave-Betrieb
    • Byteorientierte Zweidraht-Schnittstelle (kompatibel zu Philips I²C)
    • Programmierbarer Watchdog-Zeitgeber mit separatem, eingebauten Oszillator
    • Eingebauter Analogvergleicher
    • Interrupt und Aufwecken bei Pegelwechseln an Portpins
  • Spezielle Mikrocontroller-Features
    • Resetgenerator bei Spannungszuschaltung sowie programmierbarer Unterspannungsdetektor
    • Interner kalibierter RC-Oszillator
    • Externe und interne Interruptquellen
    • Sechs Schlafmodi: Leerlauf, ADU-Störunterdrückung, Leistung sparen, Leistung weg, Bereitschaft und Erweiterte Bereitschaft
  • Ein-/Ausgabeleitungen und Gehäuse
    • 23 programmierbare Ein-/Ausgänge
    • Gehäuse DIL mit 28 Anschlussbeinen, TQFP mit 32 Anschlüssen, QFN/MLF mit 28 oder 32 Lötflächen
  • Speisespannungsbereich:
    • 1,8 - 5,5 V
  • Temperaturbereich:
    • -40 bis 85 °C
  • Geschwindigkeitsklassen:
    • 0 - 4 MHz bei 1,8 - 5,5 V, 0 - 10 MHz bei 2,7 - 5,5 V, 0 - 20 MHz bei 4,5 - 5,5 V
  • Stromaufnahme bei 1 MHz, 1,8 V, 25 °C
    • In Betrieb: 0,2 mA
    • Schlafmodus Leistung weg: 0,1 µA
    • Schlafmodus Leistung sparen: 0,75 µA (bei laufender 32-kHz-Echtzeituhr)
Atmel-8271J-AVR-ATmega-Datasheet_11/2015


Anschlussbelegung

1. Anschlussbelegung

Bild 1-1: Anschlussbelegungen
Tabelle 1-1: Anschlussbelegung beim 32-poligen UFBGA-Gehäuse
 | 1 | 2 | 3 | 4 | 5 | 6
A | PD2 | PD1 | PC6 | PC4 | PC2 | PC1
B | PD3 | PD4 | PD0 | PC5 | PC3 | PC0
C | GND | GND |  |  | ADC7 | GND
D | VDD | VDD |  |  | AREF | ADC6
E | PB6 | PD6 | PB0 | PB2 | AVDD | PB5
F | PB7 | PD5 | PD7 | PB1 | PB3 | PB4

1.1 Pin-Beschreibung

1.1.1 UCC

Digitale positive Versorgungsspannung (1,8 .. 5,5 Volt)

1.1.2 GND

Masse-Anschluss

1.1.3 Port B (PB7:0) XTAL1, XTAL2, TOSC1, TOSC2

Port B ist ein 8 Bit breiter bidirektionaler I/O-Port mit internen Pullup-Widerständen, die für jeden Portpin einzeln ein- und ausgeschaltet werden können. Die Ausgangspuffer von Port B sind symmetrisch und liefern sowohl positive als auch negative Ströme. Wenn die Portpins als Eingang geschaltet sind und auf Masse gelegt werden, liefern sie einen Strom über die internen Pullup-Widerstände, wenn diese eingeschaltet sind. Während und nach Reset werden die Portpins hochohmig geschaltet, auch wenn kein Takt anliegt.

Abhängig von der Programmierung der Fuse-Bits kann das Pin PB6 (XTAL1) als Eingang für den invertierenden Oszillatorverstärker oder als Eingang für den internen Taktgenerator genutzt werden.

PB7 (XTAL2) bildet, abhängig von der Programmierung der Fuse-Bits, den Ausgang des invertierenden Oszillatorverstärkers.

Wenn der interne RC-Oszillator als Taktquelle verwendet wird, können die Pins PB6 und PB7 auch als Eingänge TOSC1 und TOSC2 für den asynchronen Zähler/Zeitgeber 2 verwendet werden.

Eine genaue Beschreibung der speziellen Möglichkeiten von Port B findet sich unter Alternative Funktionen von Port B und Taktversorgung.

1.1.4 Port C (PC5:0)

Port C ist ein 7 Bit breiter bidirektionaler I/O-Port mit internen Pullup-Widerständen, die für jeden Portpin einzeln ein- und ausgeschaltet werden können. Die Ausgangspuffer von Port C sind symmetrisch und liefern sowohl positive als auch negative Ströme. Wenn die Portpins als Eingang geschaltet sind und auf Masse gelegt werden, liefern sie einen Strom über die internen Pullup-Widerstände, wenn diese eingeschaltet sind. Während und nach Reset werden die Portpins hochohmig geschaltet, auch wenn kein Takt anliegt.

1.1.5 PC6 / RESET

Wenn die RSTDISBL-Fuse programmiert ist, wird Pin PC6 als normaler I/O-Pin verwendet. Allerdings sind die elektrischen Eigenschaften von Pin PC6 in diesem Falle anders als bei den übrigen Pins von Port C.

Wenn die RSTDISBL-Fuse nicht programmiert ist, dann ist der PC6-Pin der Reset-Eingang des Bausteins. Ein Low-Pegel an diesem Pin wird dann, wenn dieser länger als die minimale Pulslänge anliegt, einen Reset auslösen, auch wenn der Takt nicht läuft.

Eine genaue Beschreibung der speziellen Möglichkeiten von Port C findet sich unter Alternative Funktionen von Port C.

1.1.6 Port D (PD7:0)

Port D ist ein 8 Bit breiter bidirektionaler I/O-Port mit internen Pullup-Widerständen, die für jeden Portpin einzeln ein- und ausgeschaltet werden können. Die Ausgangspuffer von Port D sind symmetrisch und liefern sowohl positive als auch negative Ströme. Wenn die Portpins als Eingang geschaltet sind und auf Masse gelegt werden, liefern sie einen Strom über die internen Pullup-Widerstände, wenn diese eingeschaltet sind. Während und nach Reset werden die Portpins hochohmig geschaltet, auch wenn kein Takt anliegt.

Eine genaue Beschreibung der speziellen Möglichkeiten von Port D findet sich unter Alternative Funktionen von Port D.

1.1.7 AUCC

Ist der Anschluss für die (analoge) Versorgungsspannung des Analog-Digital-Wandlers (PC3:0 und ADC7:6). Wenn dieser nicht verwendet wird, muss der Anschluss an UCC angeschlossen werden. Wird der Analog-Digital-Wandler in der Schaltung verwendet, so kann der Anschluss über einen Tiefpassfilter mit UCC verbunden werden. Die Portpins PC6:4 verwenden stets die digitale Versorgungsspannung UCC.

1.1.8 AREF

Hier kann eine Referenzspannung für den Analog-Digital-Wandler angelegt werden, wenn nicht die interne Referenzspannung verwendet werden soll.

1.1.9 ADC7:6 (nur bei SMD-Gehäusen)

In den Bausteinen im TQFP- und QFN/MLF-Gehäuse stehen zwei weitere Anschlüsse zur Verfügung. ADC7 und ADC6 arbeiten als weitere Eingänge für den Analog-Digital-Wandler. Sie arbeiten ebenfalls mit der analogen Versorgungsspannung und mit 10 Bit Auflösung.


Übersicht

2. Übersicht

Der ATmega48/88/168/328 ist ein Energie sparender 8-Bit-Mikrocontroller in CMOS-Technik, der auf der AVR-RISC-Architektur basiert. Dadurch, dass die Befehle in einem einzigen Taktzyklus abgearbeitet werden, erreicht der ATmega einen Durchsatz von 1 MIPS pro MHz Taktfrequenz. Dies erlaubt es dem Systementwickler, das Verhältnis zwischen Stromverbrauch und Verarbeitungsgeschwindigkeit zu optimieren.

2.1 Blockschaltbild

Bild 2-1: Blockschaltbild
Der AVR-Kern kombiniert einen großen Befehlsvorrat mit 32 Registern, die für die allgemeine Verwendung zur Verfügung stehen. Alle 32 Register sind direkt mit der Arithmetik-Logik-Einheit (ALU) verbunden. Dadurch können zwei unabhängige Register in einem einzigen Befehl miteinander verknüpft werden, die Abarbeitung des Befehls geschieht in einem Takt-Zyklus. Die sich ergebende Architektur ist wesentlich effizienter als die in einem konventionellen CISC-Mikrocontroller.

Der ATmega bietet die folgenden Features: 4/8/16/32 KByte Flash-Speicher, 256/512/512/1024 Byte EEPROM, 0,5/1/1/2 KByte SRAM, 23 allgemeine Ein-/Ausgabepins, 32 allgemeine Arbeitsregister, drei flexible Zähler/Zeitgeber mit Compare-Modi, interne und externe Interrupts, eine serielle Schnittstelle (USART), eine byte-orientierte Zweidraht-Schnittstelle, einen seriellen SPI-Anschluss, einen 6- oder 8-Kanal-A/D-Wandler mit 10 Bit Auflösung, einen programmieren Watchdog mit gesondertem, eingebauten Oszillator und fünf auswählbaren Stromspar-Betriebsarten. Der Leerlauf-Modus hält nur die CPU an. Der Leistung-weg-Modus schaltet alle (synchronen) Takte ab, sodass der Chip bis zum nächsten Interrupt oder Reset abgeschaltet bleibt. Der Leistung-spar-Modus ermöglicht den asynchonen Zeitgeberbetrieb des Zählers 2 für eine Echtzeituhr. Der ADU-Störunterdrückungs-Modus hält alles an, außer dem Zähler/Zeitgeber 2, die Takterzeugung sowie den A/D-Wandler, um möglicht wenig interne Störeinflüsse auf das A/D-Wandlungsergebnis zu haben. Die beiden Bereitschafts-Modi unterscheiden sich von den vorangegangenen durch einen durchlaufenden Quarzoszillator. Damit kann eine kurze Hochlaufzeit realisiert werden.

Atmel® bietet die QTouch®-Bibliothek für die Implementierung von kapazitiven Berührtasten, Schiebern und Drehrädern in AVR®-Mikrocontrollern an. Die patentetierte Ladungstransfer-Signalerfassung bietet zuverlässige Berührerkennung an und schließt komplett entprellte Reports von Tastendrücken sowie die Nachbartastenunterdrückung-Technologie (Adjacent Key Suppression® AKS™) für zweifelsfreie Erkennung von Eingabeereignissen ein. Die einfach anwendbare QTouch-Suite erlaubt es, die eigene Touch-Anwendung zu erkunden, zu entwickeln und zu debuggen.

Der Baustein wird mit Atmels nichtflüchtiger Speichertechnologie mit hoher Dichte hergestellt. Der Flash-Programmspeicher kann im System über das serielle Programmier-Interface programmiert werden oder durch einen Urlader, das in dem Mikrocontroller implementiert werden kann. Der Urlader kann jede Schnittstelle nutzen, um die Anwendung in den Flash-Speicher zu laden. Software, die sich im Urlader-Bereich des Flash-Speichers befindet, kann weiterlaufen, während der Anwendungs-Flash-Bereich gerade gelöscht oder programmiert wird, mithin echte Lesen-während-Schreiben-Funktionalität. Die Kombination der 8-Bit-RISC-CPU mit dem Flash-Speicher auf einem Chip ergibt einen leistungsfähigen Mikrocontroller, der höchste Flexibilität bei geringen Kosten für viele eingebettete Steuerungsanwendungen bietet.

Für den Entwickler stehen eine Vielzahl von Entwicklungstools zur Verfügung, angefangen vom Mako-Assembler über Programm-Debugger und -Simulator, Emulatoren bis hin zu kompletten Entwicklungs-Kits.

2.2. Vergleich der Controller

Die ATmega48/88/168/328 unterscheiden sich im Speicherausbau, der Urlader-Unterstützung und der Größe der Interruptvektoren. Tabelle 2-1 fasst die Unterschiede zusammen.
Table 2-1. Zusammenfassung der Speichergrößen
Baustein | Flash | EEPROM | RAM | Größe des Interruptvektors
ATmega48A ATmega48PA | 4 KByte | 256 Byte | 512 Byte | 1 Befehlswort pro Vektor
ATmega88A ATmega88PA | 8 KByte | 512 Byte | 1 KByte
ATmega168A ATmega168PA | 16 KByte |  |  | 2 Befehlsworte pro Vektor
ATmega328 ATmega328P | 32 KByte | 1 KBytes | 2 KByte
Die Typen ATmega88/168/328 bieten einen echten Lesen-während-Schreiben-Selbstprogrammiermechanismus. Dabei gibt es einen separaten Urlader-Bereich; der SPM-Befehl muss in diesem Fall von dort ausgeführt werden. Der ATmega48 hat keinen derartigen Mechanismus und keinen gesonderten Urlader-Bereich. Der SPM-Befehl kann vom gesamten Flash-Speicher aus ausgeführt werden.


Der Kern der AVR-CPU

7. Der Kern der AVR-CPU

7.1 Übersicht

In diesem Abschnitt wird die Architektur des AVR-Kerns allgemein beschrieben. Die Hauptfunktion des CPU-Kerns ist, die korrekte Ausführung von Programmen sicherzustellen. Hierfür muss die CPU auf die Speicher zugreifen können, Berechnungen durchführen, die peripheren Funktionen steuern und auf Interrupts reagieren.
Bild 7-1: Blockschaltbild der AVR-CPU-Architektur
Vor dem Hintergrund einer Maximierung der Leistung und der Parallelisierung nutzt der AVR-Controller die Harvard-Architektur mit separaten Speichern und Bussen für Programm und Daten. Der Programmspeicher ist mit einer zweistufigen Pipeline verbunden. D.h., dass während ein Befehl noch abgearbeitet wird, der nächste schon aus dem Programmspeicher „vorausgelesen“ wird. Dies ermöglicht, dass ein Befehl innerhalb eines Taktzyklus bearbeitet wird. Der Programmspeicher besteht aus einem „im-System-programmierbaren“ Flash-Speicher.

Auf alle Register (32 Stück, 8 Bit breit) kann die ALU innerhalb eines Befehles zugreifen. Das heißt, dass während der Abarbeitung eines Befehls zwei Operanden aus den Registern geholt werden können, die dann dem Befehl entsprechend verarbeitet werden und das Ergebnis anschließend wieder in einem Register abgelegt wird. Das ganze geschieht innerhalb nur eines Takt-Zyklus.

Sechs der Register können zu drei 16-Bit-Registern zusammengeschlossen werden, die als Zeiger für den indirekten Speicherzugriff auf den Datenspeicher dienen. Einer der Zeiger (Z) kann auch für die indirekte Adressierung von Speicherzellen im Programmspeicher verwendet werden. Diese Zeiger werden X, Y und Z genannt.

Die ALU unterstützt arithmetische und logische Funktionen, die mit zwei Registern oder mit einem Register und einer Konstante ausgeführt werden können. Befehle, die nur ein Register betreffen, werden natürlich auch in der ALU ausgeführt. Nach der Ausführung arithmetischer Befehle wird das Status-Register aktualisiert und enthält somit weitere Informationen zu den Ergebnissen der Operation.

Der Programmablauf wird durch bedingte und unbedingte Sprünge und Unterprogrammaufrufe unterstützt, die den gesamten zur Verfügung stehenden Programmspeicher adressieren können. Die meisten AVR-Befehle haben ein 16-Bit-Word-Format. Jeder Programmspeicherplatz enthält einen 16- oder 32-Bit-Befehl.

Der Programmspeicher ist in zwei Bereiche unterteilt, dem Urlader-Bereich und den Anwender-Bereich. Beide Bereiche haben eigene Sperrbits, mit denen Schreib- und Lesesperren programmiert werden können. Der SPM-Befehl, der in den Anwender-Bereich schreibt, muss im Boot-Bereich liegen.

Während Interrupt- und Unterprogrammaufrufen wird die Rücksprungadresse des Programzählers PC im Kellerspeicher (Stapelspeicher) gesichert. Der Stapel ist im SRAM realisiert und wird daher in seiner Größe nur durch den zur Verfügung stehenden Platz im SRAM bestimmt. Alle Anwenderprogramme müssen den Stapelzeiger, also den Zeiger auf die nächste freie Stapel-Adresse, im Rahmen der Reset-Routine initialisieren. Der Stapelzeiger ist im I/O-Adressraum hinterlegt und kann sowohl beschrieben als auch gelesen werden. Auf den SRAM kann mit fünf verschiedenen Adressierungsmöglichkeiten zugegriffen werden.

Die flexiblen Interruptmöglichkeiten werden über verschiedene Kontrollregister im I/O-Adressraum und in Verbindung mit einer globalen Interruptfreigabe gehandhabt. Jeder Interrupt hat eine eigene Einsprungadresse. Ferner haben alle Interrupts unterschiedliche Prioritäten. Allgemein gilt, dass die Priorität eines Interrupts umso höher ist, je niedriger seine Einsprungadresse ist.

Der I/O-Adressraum umfasst 64 Adressen, in denen die peripheren Funktionen wie Kontrollregister, SPI und andere I/O-Funktionen hinterlegt sind. Auf den I/O-Adressraum kann direkt zugegriffen werden oder er wird über die Adressen 0x20 bis 0x5F im Datenadressraum adressiert. Ein weiterer, Erweiterter I/O-Adressraum befindet sich im Bereich 0x60 bis 0xFF, bei dem der Zugriff mit mit den ST/STS/STD- und LD/LDS/LDD-Befehlen möglich ist.

7.2 ALU — Arithmetisch-logische Einheit

Die AVR-ALU arbeitet in direkter Verbindung mit den 32 allgemeinen Registern. Innerhalb eines System-Taktes werden die Operationen zwischen zwei Registern in dem Registerspeicher ausgeführt. Die ALU-Operationen können in drei Kategorien unterteilt werden: arithmetische, logische und Bit-bezogene Befehle. Einige Mikrocontroller der AVR-Familie haben einen Hardware-Multiplizierer im arithmetischen Teil der ALU implementiert, mit dem vorzeichenlose, vorzeichenbehaftete und gebrochene Zahlen multipliziert werden können. Siehe Befehlssatz für eine detaillierte Beschreibung.

7.3 Statusregister

Das Status-Register enthält Informationen über das Ergebnis der zuletzt ausgeführten arithemtischen Operation. Diese Informationen können genutzt werden, um alternative Programmabläufe zu gestalten. Zu beachten ist, dass das Status-Register nach jeder Operation der ALU aktualisiert wird, wie in der Befehlsbeschreibung angegeben ist. Dadurch benötigt man in vielen Fällen keine separaten Vergleichsbefehle wodurch schnellere und kompaktere Programme möglich sind.

Das Status-Register wird beim Aufruf einer Interruptroutine nicht automatisch in den Stapel gesichert oder nach dessen Beendigung aus dem Stapel zurückgeholt. Beides muss durch die Interruptroutine sichergestellt werden.

7.3.1 SREG

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x5F) | I | T | H | S | V | N | Z | C | SREG
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7 — I: Globale Interruptfreigabe
Das Global Interrupt-Enable-Bit muss gesetzt (auf 1) werden, um alle Interrupts zunächst global freizugeben. Die individuelle Kontrolle der einzelnen Interrupts aus den verschiedenen Interrupt-Quellen erfolgt durch separate Kontroll-Register. Wenn das I-Bit gelöscht ist, sind alle Interrupts unabhängig von den Werten in den anderen Kontroll-Registern gesperrt. Das I-Bit wird beim Auftreten eines Interrupts durch die Hardware gelöscht, so dass weitere Interrupts zunächst nicht ausgeführt werden. Das Bit wird durch einen RETI-Befehl, der eine Interrupt-Routine beendet, automatisch gesetzt, so dass weitere Interrupts wieder ausgeführt werden. Mit den SEI- und CLI-Befehlen kann das I-Bit jederzeit gesetzt und gelöscht werden.

  • Bit 6 — T: Bitspeicher
Die Bit-Kopier-Befehle BLD (Bit LoaD) und BST (Bit STore) benutzen das T-Bit als Quelle und Ziel für ihre Operation. Mit dem BST-Befehl kann ein Bit aus einem Register in das T-Bit kopiert werden, mit dem BLD-Befehl wird das T-Bit in ein Bit in einem der Register kopiert.

  • Bit 5 — H: Halbbyte-Übertrag
Das H-Bit signalisiert einen Übertrag vom vierten zum fünften Bit bei einigen arithmetischen Befehlen. Dieses ist nützlich für BCD-Arithmetik. Siehe Befehlsbeschreibung.
  • Bit 4 — S: Vorzeichen, S = N ⊕ V
Das S-Bit ist stets eine Exklusiv-Oder-Verknüpfung zwischen dem Negativ-Flag N und dem Zweierkomplement-Überlaufbit V. Siehe Befehlsbeschreibung.
  • Bit 3 — V: Zweierkomplement-Überlauf
Das Zweierkomplement-Überlaufbit unterstützt die Zweierkomplement-Arithmetik. Siehe Befehlsbeschreibung.
  • Bit 2 — N: Negativ
Das N-Bit signalisiert ein negatives Ergebnis nach verschiedenen arithmetischen und logischen Befehlen. Siehe Befehlsbeschreibung.
  • Bit 1 — Z: Null
Das Z-Bit signalisiert das Ergebnis Null nach verschiedenen arithmetischen und logischen Befehlen. Siehe Befehlsbeschreibung.
  • Bit 0 — C: Übertrag
Das C-Bit signalisiert einen (vorzeichenlosen) Übertrag nach verschiedenen arithmetischen und logischen Befehlen. Siehe Befehlsbeschreibung.

7.4 Allgemeine Register

Die Anordnung der Register ist für die Befehlsausführung der AVR-RISC-Controller optimiert. Um die erforderliche Leistung und Flexibilität zu erreichen, werden folgende Ein-/Ausgabemöglichkeiten bei der Abarbeitung von Befehlen durch die Register-Anordnung unterstützt:
  • Ein 8-Bit-Register und ein 8-Bit-Ergebnis
  • Zwei 8-Bit-Register und ein 8-Bit-Ergebnis
  • Zwei 8-Bit-Register und ein 16-Bit-Ergebnis
  • Ein 16-Bit-Registerpaar und ein 16-Bit—Ergebnis
Folgendes Bild zeigt die Struktur der 32 allgemeinen Register in der CPU.
Bild 7-2: Allgemeine Register
Allzweck- Arbeits- register | 7 |  | 0 | Adresse
 |  | R0 |  | 0x00
 |  | R1 |  | 0x01
 |  | R2 |  | 0x02
 |  | ... |
 |  | R13 |  | 0x0D
 |  | R14 |  | 0x0E
 |  | R15 |  | 0x0F
 |  | R16 |  | 0x10
 |  | R17 |  | 0x11
 |  | R18 |  | 0x12
 |  | ... |
 |  | R26 |  | 0x1A | X-Register, Low-Byte (XL)
 |  | R27 |  | 0x1B | X-Register, High-Byte (XH)
 |  | R28 |  | 0x1C | Y-Register, Low-Byte (YL)
 |  | R29 |  | 0x1D | Y-Register, High-Byte (YH)
 |  | R30 |  | 0x1E | Z-Register, Low-Byte (ZL)
 |  | R31 |  | 0x1F | Z-Register, High-Byte (ZH)
Die meisten Befehle, die die Register verwenden, können direkt auf diese zugreifen und werden in einem Takt ausgeführt.

Wie in der obigen Abbildung zu sehen, repräsentiert jedes Register auch eine Adresse im Datenspeicher; somit sind alle Register auch im unteren Bereich des Datenspeichers abgebildet. Obwohl die Register nicht physikalisch im SRAM realisiert sind, wird durch diese Organisation des Speichers eine große Flexibilität hinsichtlich des Zugriffs auf die Register erreicht, da diese auch über X, Y und Z indiziert werden können.

7.4.1 Zeigerregister X, Y und Z

Die Register R26 bis R31 haben neben ihren allgemeinen Funktionen noch zusätzliche Funktionen. Diese Register bilden 16-Bit-Zeiger, die für die indirekte Adressierung des Datenspeichers verwendet werden. Die drei Zeiger-Register sind wie folgt definiert:
Bild 7-3: Zeigerregister X, Y und Z
 | 15 | XH |  |  | XL | 0
Registerpaar X | 7 |  | 0 | 7 |  | 0
 | R27 (0x1B) |  |  | R26 (0x1A)
 | 15 | YH |  |  | YL | 0
Registerpaar Y | 7 |  | 0 | 7 |  | 0
 | R29 (0x1D) |  |  | R28 (0x1C)
 | 15 | ZH |  |  | ZL | 0
Registerpaar Z | 7 |  | 0 | 7 |  | 0
 | R31 (0x1F) |  |  | R30 (0x1E)
In den verschiedenen Adressierungsarten arbeiten diese Adresszeiger mit festem Versatz, mit automatischem Inkrement oder mit automatischem Dekrement (siehe Befehlsbeschreibung).

7.5 Stapelzeiger

Der Stapel (Stack) wird hauptsächlich benutzt, um temporäre oder lokale Daten zu speichern und um Rücksprungadressen bei der Ausführung von Interruptrouinen und Unterprogrammen zu sichern. Der Stapelzeiger zeigt immer auf die nächste freie Speicherstelle im Stapel. Der Stapel ist so aufgebaut, dass der von hohen Speicheradressen hin zu niedrigen wächst. Das bedeutet, dass beim Sichern eines Datenbytes in den Stapel (PUSH-Befehl) der Stapelzeiger dekrementiert wird.

Der Stapelzeiger zeigt auf eine Speicherstelle im SRAM, diese muss durch das Programm zunächst bestimmt werden, bevor ein erstes Unterprogramm ausgeführt wird oder die Interrupts freigegeben werden. Der Initialisierunswert des Stapelzeigers entspricht der letzten RAM-Adresse. Der Zeiger muss stets größer als der RAM-Anfang sein, siehe Tabelle 8-3.

Siehe folgende Tabelle für Details.

Tabelle 7-1: Befehle mit Stapelzeiger
Befehl | Stapelzeiger | Beschreibung
PUSH | Vermindert um 1 | Daten werden im Stapel abgelegt
CALL ICALL RCALL | Vermindert um 2 | Rückkehradresse wird bei Unterprogrammaufruf oder Interrupt im Stapel abgelegt
POP | Erhöht um 1 | Daten werden vom Stapel abgeholt
RET RETI | Erhöht um 2 | Rückkehradresse wird vom Stapel abgeholt
Der Stapelzeiger besteht aus zwei 8-Bit-Registern im I/O-Adressraum. Die Anzahl der Bits, die wirklich für die Adressierung verwendet werden, hängt von der Größe des zu adressierenden Speicherbereiches ab. In einigen AVR-Controllern ist der Speicherbereich so klein, dass nur das Low-Byte des Stapelzeigers verwendet wird. In diesen Fällen ist das High-Byte gar nicht implementiert.

7.5.1 SPH und SPL

Bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8
(0x5E) | SP15 | SP14 | SP13 | SP12 | SP11 | SP10 | SP9 | SP8 | SPH
(0x5D) | SP7 | SP6 | SP5 | SP4 | SP3 | SP2 | SP1 | SP0 | SPL
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
 | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | RAMEND | RAMEND | RAMEND | RAMEND | RAMEND | RAMEND | RAMEND | RAMEND
 | RAMEND | RAMEND | RAMEND | RAMEND | RAMEND | RAMEND | RAMEND | RAMEND
Bei diesen Controllern muss der Stapelzeiger nicht mehr vom Hochlauf-Kode initialisiert werden, im Gegensatz zu älteren AVR-Mikrocontrollern.

7.6 Zeitverhalten

Nachfolgend wird das allgemeine Konzept der Zugriffszeiten bei der Ausführung von Befehlen beschrieben. Die AVR-CPU wird durch den CPU-Takt clkCPU getaktet, der direkt aus der ausgewählten Taktquelle abgeleitet wird, ohne vorher geteilt zu werden.

Die nachfolgende Abbildung zeigt das parallele Auslesen und Ausführung von Befehlen, was durch die Harvard-Architektur und den Direktzugriff auf die Register ermöglicht wird. Aufgrund dieses Konzeptes kann ein Durchsatz von 1 MIPS pro MHz erreicht werden.

Bild 7-4: Zeitablauf beim Befehl lesen und ausführen
Das Timing bei der Abarbeitung eines Befehles zeigt folgende Abbildung. In einem Takt-Zyklus werden bis zu zwei Register gelesen, die Operation in der ALU ausgeführt und das Ergebnis zurück in ein Register geschrieben.
Bild 7-5: Zeitablauf ALU-Operation

7.7 Reset- und Interruptverhalten

Der ATmega8 bietet eine Vielzahl verschiedener Interruptquellen. Diese Interruptquellen haben ebenso wie der Reset-Vektor separate Einsprungadressen im Programmspeicher. Alle Interrupts können separat freigegeben werden, indem sie mit einer logischen 1 in den dazugehörigen Registern beschrieben werden. Außerdem müssen alle Interrupts durch Setzen des Globalen Interrupt-Freigabe-Bits im Status-Register freigegeben sein. Abhängig vom Wert des Programmzähler (PC) werden Interrupts automatsich gesperrt, wenn die Lock-Bits BLB02 oder BLB12 programmiert sind. Dadurch kann eine höhere Softwaresicherheit erreicht werden. Siehe Programmieren des Speichers.

Die unteren Adressen im Programmspeicher sind als Reset- und Interrupt-Vektoren voreingestellt. Die vollständige Liste der Einsprungadressen und der Interrupt-Prioritäten sind bei Interrupts beschrieben. Allgemein gilt, dass die niedrigsten Einsprungadressen die höchste Priorität haben. Somit hat der Reset mit der Einsprungadresse 0x0000 die höchste Priorität. Die nächsthöhere Priorität hat der externe Interrupt 0. Die Interrupt-Vektoren können an den Beginn des Boot-Sektors verschoben werden, indem das Interrupt-Vektor-Auswahl-Bit (IVSEL) im Mikrocontroller-Steuerregister (MCUCR) gesetzt wird. Siehe Interrupts für weitere Infos. Der RESET-Vektor kann ebenfalls zum Anfang des Urlader-Bereichs umgesetzt werden, dies durch Programmieren der BOOTRST-Fuse. Siehe Urlader-Unterstützung.

Wenn ein Interrupt auftritt, wird das Global Interrupt Freigabe Bit (I-Bit) automatisch gelöscht, so dass keine weiteren Interrupts akzeptiert werden. Wenn das I-Bit durch die Software wieder auf 1 gesetzt wird, können weitere Interrupts die laufende Interrupt-Routine unterbrechen. Das I-Bit wird durch das Beenden einer Interrupt-Routine (RETI-Befehl) automatisch wieder gesetzt.

Man unterscheidet grundsätzlich zwei Arten von Interrupts. Die erste wird durch ein Ereignis getriggert und setzt dadurch ein Interrupt-Flag. In diesem Fall wird der Programmzähler mit dem dazugehörigen Interrupt-Vektor geladen um die Interrupt-Routine auszuführen. Gleichzeitig wird das dazugehörige Interrupt-Flag durch die Hardware wieder gelöscht. Das Interrupt-Flag kann aber auch dadurch gelöscht werden, indem eine 1 an die Position des Flags geschrieben wird. Wenn ein Interrupt auftritt, während der dazugehörige Interrupt gesperrt ist, wird das Interrupt-Flag trotzdem gesetzt. Es speichert demnach so lange an das aufgetrete Ereignis, bis der Interrupt freigegeben wird oder das Flag durch die Software gelöscht wird. Das gleiche gilt für Interrupts, die auftreten, während alle Interrupts global gesperrt sind. In diesem Fall werden nach der globalen Freigabe alle zwischenzeitlich aufgetretenen Interrupts entsprechend ihrer Priorität abgearbeitet.

Die zweite Art von Interrupts hat nur für die Dauer des Auftretens ihres auslösenden Ereignisses Gültigkeit. Diese Interrupts haben nicht notwendigerweise ein Interrupt-Flag. Somit wird ein Interrupt nicht ausgeführt, wenn das Ereignis wieder verschwindet, bevor der dazugehörige Interrupt freigegeben wird.

Wenn eine Interrupt-Routine beendet wird, wird das unterbrochene Programm wieder aufgerufen und mindestens ein weiterer Befehl des Programms ausgeführt, bevor ein wartender Interrupt abgearbeitet wird.

Das Status-Register wird beim Aufruf der Interrupt-Routine nicht automatsich gesichert, daher muss dies durch die Software sichergestellt werden.

Wenn der CLI-Befehl verwendet wird, um die Interrupts zu sperren, dann wirkt diese Sperre sofort, so dass keine weiteren Interrupts ausgeführt werden, auch dann nicht, wenn der Interrupt zeitgleich mit dem CLI-Befehl auftritt. Das folgende Beispiel zeigt, wie Interrupts während des Schreibens des EEPROMs vermieden werden.

Beispiel in Assembler
    in	r16, SREG	; SREG retten
    cli			; Interrupts für die zeitlich limitierte Sequenz sperren
    sbi	EECR, EEMPE	; EEPROM schreiben starten
    sbi	EECR, EEPE
    out	SREG, r16	; SREG wiederherstellen (I-Bit)
Beispiel in C
    char cSREG;
    cSREG = SREG;		/* SREG retten */
    _CLI();			/* Interrupts für die zeitlich limitierte Sequenz sperren */
    EECR |= (1<<EEMPE);	/* EEPROM schreiben starten */
    EECR |= (1<<EEPE);
    SREG = cSREG;		/* SREG wiederherstellen (I-Bit) */
Wenn der SEI-Befehl ausgeführt wird, um die Interrupts global freizugeben, dann wird auf jeden Fall erst noch der Befehl nach dem SEI-Befehl ausgeführt, bevor ein wartender Interrupt behandelt wird.
Beispiel in Assembler
    sei			; Globale Interruptfreigabe setzen
    sleep			; Schlafmodus starten und auf Interrupt warten
    ; Hinweis: Erst wird der sleep-Befehl ausgeführt, dann Interrupts bedient
Beispiel in C
    __enable_interrupt();	/* Globale Interruptfreigabe setzen */
    __sleep();		/* Schlafmodus starten und auf Interrupt warten */
    /* Hinweis: Erst wird der sleep-Befehl ausgeführt, dann Interrupts bedient */

7.7.1 Interrupt-Reaktionszeit

Die Reaktionszeit für die AVR-Interruptausführung beträgt mindestens 4 Takte. Nach diesen 4 Takten ist der Interruptvektor in den Programmzähler (PC) geladen, der vorherige Inhalt des Programmzählers auf dem Stapel abgelegt, und der Befehl auf dem Interruptvektor kommt zur Abarbeitung. Der Vektor ist normalerweise ein Sprung zur Interruptroutine, welcher weitere 3 Takte benötigt. Tritt die Interruptanforderung während der Ausführung eines Mehrzyklen-Befehls auf, wird der Befehl komplett ausgeführt, bevor die Anforderung bedient wird. Befindet sich der Controller im Schlafmodus, dauert die Reaktion auf die Interruptanforderung 4 weitere Takte länger. Zuzüglich kommen Verzögerungen durch die verschiedenen Hochlaufzeiten des ausgewählten Schlafmodus'.

Die Rückkehr von der Interruptroutine zum unterbrochenen Programm dauert 4 Takte. Während der 4 Takte wird der Programmzähler (PC; 2 Bytes) vom Stapel geholt, der Stapelzeiger um 2 erhöht und das I-Bit in SREG gesetzt.


Speicherarten

8. Speicherarten

8.1 Übersicht

Dieser Abschnitt beschreibt die verschiedenen Speicher des ATmegaX8. Die AVR-Architektur enthält zwei Hauptspeicher, den Datenspeicher und den Programmspeicher. Zusätzlich steht noch ein EEPROM-Speicher für die dauerhafte Sicherung von Daten zur Verfügung. Alle drei Speicherbereiche sind linear und regulär.

8.2 Programmspeicher

Der ATmegaX8 enthält 4/8/16/32 KByte Programmspeicher, der als Flash ausgeführt ist und im System programmiert werden kann. Da alle AVR-Befehle 16 oder 32 Bit lang sind, ist der Programmspeicher in 2/4/8/16 K Speicherzellen mit je 16 Bit organisiert. Aus Gründen der Softwaresicherheit ist der Programmspeicher beim ATmega88/168/328 in zwei Bereiche unterteilt, den Urlader-Bereich und dem Anwendungs-Bereich. Siehe SPMEM-Register-Beschreibung.

Der Flash hat eine Haltbarkeit von mindestens 10.000 Schreib-/Löschzyklen. Der Programmzähler (PC) ist 11/12/13/14 Bit breit. Damit können alle Speicherzellen im Programmspeicher adressiert werden. Die Funktionen des Urlader-Bereichs und den dazugehörigen Urlader-Sperrbits sind für ATmega48 sowie ATmega88/168/328 getrennt beschrieben. Die Programmierung des Programmspeichers im SPI- und Parallel-Modus ist ebenfalls in einem hinteren Kapitel beschrieben.

Datentabellen können im gesamten Programmspeicherbereich hinterlegt werden (siehe LPM-Befehl).

Die Zeitabläufe für das Auslesen und Ausführen von Befehlen sind in den Seiten zuvor abgebildet.

Bild 8-1: Programmspeicher des ATmega48
Bild 8-2: Programmspeicher des ATmega88/168/328

8.3 Datenspeicher

Bild 8-3 zeigt, wie der Datenspeicher (SRAM) aufgeteilt ist.

Dieser Controller hat mehr Peripherie als es die 64 Bytes I/O-Adressraum der AVR-Struktur zulässt. Daher gibt es Erweiterten I/O-Adressraum im Adressbereich 0x60..0xFF im SRAM, mit dem auf die Peripherie nur mit den Befehlen ST/STS/STD und LD/LDS/LDD zugegriffen werden kann.

Die 768/1280/2303 Zellen des Datenspeichers enthalten die 32 Register, den I/O-Adressraum, den Erweiterten I/O-Adressraum und den eigentlichen internen SRAM-Datenspeicher. Die ersten 32 Zellen adressieren die Register, weitere 64 den I/O-Adressraum, weitere 160 den Erweiterten I/O-Adressraum, und schließlich 512/1024/2048 Bytes Datenspeicher.

Es gibt fünf verschiedene Möglichkeiten die Speicherzellen zu adressieren: Direkt, indirekt mit Versatz, indirekt, indirekt mit vorherigem Dekrement und indirekt mit anschließendem Inkrement. Die Register R26 bis R31 bilden die Zeiger für die vier indirekten Adressierungsarten.

Mit der direkten Adressierung kann der gesamte Speicher angesprochen werden.

Mit der Methode der indirekten Adressierung mit Versatz können, ausgehend von der Basisadresse, die durch das Y- oder Z-Register vorgegeben ist, 63 Speicherzellen adressiert werden.

Wenn die Methode der indirekten Adressierung mit vorherigem Dekrement oder anschließendem Inkrement genutzt werden, bilden das X-, Y- oder Z-Register den Adresszeiger, der inkrementiert bzw. dekrementiert wird.

Die 32 Register, die 64 I/O-Speicher und die 1024 Byte des internen Datenspeichers können mit allen Adressierungsarten angesprochen werden.

Bild 8-3: Daten-Adressraum-Aufteilung
Datenspeicher
32 Register | 0x0000 - 0x001F
64 I/O-Register | 0x0020 - 0x005F
160 Erweiterte I/O-Register | 0x0060 - 0x00FF
Interner SRAM 512/1024/2048 × 8 | 0x0100
 | 0x02FF/0x04FF/0x08FF

8.3.1 Zugriffszeiten

Auf den internen SRAM-Datenspeicher wird in zwei Zyklen des Systemtaktes clkCPU zugegriffen.
Bild 8-4: Taktzyklen beim Zugriff auf den internen SRAM

8.4 EEPROM-Speicher

Der Controller enthält 256/512/1024 Byte EEPROM-Speicher, der in einem separaten Adressraum organisiert ist. Jedes Byte des EEPROM kann einzeln gelesen oder geschrieben werden. Die Haltbarkeit des EEPROM beträgt mindestens 100.000 Schreib-/Löschzyklen. Das Zusammenspiel zwischen CPU und EEPROM wird nachfolgend beschrieben. Dafür werden das EEPROM-Adressregister, das EEPROM-Datenregister und das EEPROM-Kontrollregister verwendet, die im I/O-Adressraum untergebracht sind.

Das EEPROM kann ähnlich wie der Programmspeicher auch durch die ISP oder im parallelen Programmiermodus programmiert werden, siehe Programmieren des Speichers.

Praxistipp: Beim Compiler avrgcc stehen in der Kopfdatei „avr/eeprom.h“ Routinen zum Lese- und Schreibzugriff zur Verfügung, beispielsweise eeprom_read_block(). Dabei ist es häufig günstig, im RAM eine Kopie des EEPROM-Speicherbereiches zu halten, der zur allgemeinen Konfiguration dient. Das Rückschreiben von Änderungen kann dann die Hauptschleife „nebenbei“ erledigen, indem sie Byte für Byte vergleicht (geht schnell) und bei Ungleichheit ein Byte schreibt (dauert lange) und sofort zurückkehrt. So hält die Hauptschleife RAM und EEPROM auf Dauer konsistent, ohne sich um jedes einzelne Byte kümmern zu müssen oder gar zu blockieren. (Hierfür steht leider keine avr-libc-Funktion zur Verfügung.)

8.4.1 Lese- und Schreibzugriff

Die Register für den EEPROM Zugriff liegen im I/O-Adressraum.

Die Zeit für den schreibenden Zugriff auf das EEPROM ist in nachfolgender Tabelle angegeben. Mit selbst programmierten Zeitfunktionen kann die Anwendersoftware überwachen, ob ein Schreibvorgang abgeschlossen wurde und somit das nächste Byte in den EEPROM geschrieben werden kann. Wenn das EEPROM genutzt wird, sind ein paar Vorsichtsmaßnahmen zu beachten. In stark gefilterten Spannungsversorgungen neigt UCC dazu, sehr langsam zu steigen bzw. zu fallen, wenn die Spannungsversorgung ein- bzw. ausgeschaltet wird. Das heißt, dass der Baustein für eine gewisse (verhältnismäßig lange) Zeit in einem Spannungsbereich arbeitet, der kleiner als das spezifizierte Minimum ist, in der der Takt arbeitet. Wie in solchen Fällen ein Fehlverhalten verhindert werden kann, ist unter Schutzmaßnahmen beschrieben.

Ferner ist, um das ungewollte Beschreiben des EEPROMs zu verhindern, ein Schreibvorgang nur in zwei Schritten durchführbar (siehe EEPROM-Kontrollregister).

Wenn der EEPROM gelesen wird, wird die CPU für vier Taktzyklen angehalten, bevor der nächste Befehl ausgeführt wird. Beim Schreiben des EEPROM wird die CPU für zwei Taktzyklen angehalten, bevor der nächste Befehl ausgeführt wird.

8.4.2 Verfälschten EEPROM vermeiden

In Zuständen, in denen UCC zu niedrig ist, um die CPU und das EEPROM richtig arbeiten zu lassen, können die EEPROM-Daten verfälscht werden. Dies gilt auch für externe EEPROMs. Daher sind in beiden Fällen die gleichen schaltungstechnischen Lösungen erforderlich.

Ein Verfälschen der EEPROM-Daten kann durch zwei Situationen ausgelöst werden, in denen UCC zu niedrig ist. Erstens benötigt ein regulärer Schreibvorgang eine Mindestspannung, um einen korrekten Schreibvorgang durchzuführen. Zweitens kann es dazu kommen, dass die CPU selbst in der Ausführung der Befehle unsauber arbeitet, wenn die Versorgungsspannung zu gering ist.

Das Verfälschen der EEPROM-Daten kann auf einfache Weise verhindert werden, wenn folgende Design-Empfehlungen angewendet werden.

Den RESET-Eingang auf Low halten, solange die Spannungsversorgung unzureichend ist. Dies kann durch einen externen Resetbaustein erfolgen oder durch die interne Unterspannungsüberwachung. Wenn der Level der internen Unterspannungsdetektors nicht ausreicht, kann auch eine externe Resetschaltung verwendet werden, die einen Spannungsabfall erkennt. Wenn ein Reset während eines laufenden Schreibvorganges auftritt, so wird dieser noch zu Ende geführt, vorausgesetzt die Versorgungsspannung ist noch ausreichend.

8.5 I/O-Adressraum

Die Belegung des I/O-Adressraum ist in dieser Zusammenfassung dargestellt.

Alle I/O-Funktionen und peripheren Einheiten sind im I/O-Speicher platziert. Auf die I/O-Speicher wird mit den IN- und OUT-Befehlen zugegriffen, die Daten zwischen den Registern und den I/O-Speicherzellen transportieren. Die I/O-Speicher im Adressbereich zwischen 0x00 (0x20) und 0x1F (0x3F) sind bitadressierbar. Das heißt, dass einzelne Bits in diesen Speichern mit den SBI- und CBI-Befehlen gesetzt oder gelöscht werden können. Der Zustand der einzelnen Bits kann mit den Befehlen SBIS und SBIC abgefragt werden.

Wenn die I/O-Speicher mit den IN- und OUT-Befehlen angesprochen werden, dann müssen die Adressen 0x00 bis 0x3F verwendet werden. Wenn die I/O-Speicher mit den Befehlen LD und ST über die Adressen des Datenspeichers angesprochen werden, so muss der Wert 0x20 zu den ursprünglichen Adressen hinzuaddiert werden (Adressen 20h bis 5Fh im Datenspeicher). Dieser Controller hat mehr Peripherie als es die 64 Bytes I/O-Adressraum der AVR-Struktur zulässt. Auf den Erweiterten I/O-Adressraum im Adressbereich 0x60..0xFF kann nur mit den Befehlen ST/STS/STD und LD/LDS/LDD zugegriffen werden kann.

Um die Kompatibilität mit zukünftigen Bausteinen zu gewährleisten, werden reservierte Bits als Null gelesen, wenn auf diese zugegriffen wird. Reservierte Adressen im I/O-Adressraum dürfen nicht beschrieben werden.

Einige Statusbits können gelöscht werden, indem sie mit einer logischen 1 beschrieben werden. Dass heißt, dass durch Zurückschreiben einer 1 in ein Bit, das zuvor als 1 gelesen wurde, dieses Bit gelöscht wird. Im Gegensatz zu anderen AVR-Controllern kann dies auch mit den Befehlen SBI und CBI geschehen.

Die Übersicht über alle I/O-Register ist gegen Ende des Dokumentes abgebildet.

8.5.1 Allgemeine I/O-Register

Der Mikrocontroller enthält drei allgemeine I/O-Register namens GPIOR0, GPIOR1 und GPIOR2. Diese können zur Speicherung irgendwelcher Daten verwendet werden. Dabei ist GPIOR0 bitadressierbar mit den Befehlen SBI, CBI, SBIS und CBIS.

6 Register-Beschreibung

8.6.1 EEAR — EEPROM-Adresse

Bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8
(0x42) | - | - | - | - | - | - | EEAR9(1) | EEAR8(1) | EEARH
(0x42) | EEAR7 | EEAR6 | EEAR5 | EEAR4 | EEAR3 | EEAR2 | EEAR1 | EEAR0 | EEARL
 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
Zugriff | R | R | R | R | R | R | R/W | R/W
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | X | X
 | X | X | X | X | X | X | X | X
  • Bit 15:10 — reserviert
Diese Bits sind reserviert und werden immer als 0 gelesen.
  • Bit 9:0 — EEAR[9:0]: EEPROM-Adresse
In den EEPROM-Address-Registern steht die Adresse des Bytes, auf das im EEPROM zugegriffen werden soll. Die 256/512/1024 Byte sind linear im Adressraum von 0 bis 255/511/1023 verteilt. Beim Einschalten der Versorgungsspannung ist der Wert der Adress-Bits undefiniert. Es muss also auf jeden Fall erst eine Adresse in die Register geschrieben werden, bevor auf den EEPROM zugegriffen werden kann.
Hinweis:
    EEAR9 und EEAR8 sind beim ATmega48 nicht implementiert und müssen mit Null beschrieben werden.

8.6.2 EEDR — EEPROM-Daten

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x40) | MSB |  |  |  |  |  |  | LSB | EEDR
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7:0 — EEDR[7:0]: EEPROM-Daten
Dieses Register enthält die Daten, die in das EEPROM geschrieben oder aus diesem ausgelesen werden. In beiden Fällen muss zuvor die Adresse der Speicherzelle im EEPROM, in die geschrieben bzw. aus der gelesen werden soll, in EEAR angegeben werden.

8.6.3 EECR — EEPROM-Kontrolle

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x3F) | - | - | EEPM1 | EEPM0 | EERIE | EEMPE | EEPE | EERE | EECR
Zugriff | R | R | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | X | X | 0 | 0 | X | 0
  • Bit 7:6 — reserviert
Diese Bits sind reserviert und werden immer als 0 gelesen.
  • Bit 5:4 — EEPM[1:0]: EEPROM-Programmiermodus-Auswahl
Diese Bits wählen aus, welche Aktion vom Bit EEPE ausgelöst wird. Es ist möglich, ein EEPROM-Byte in einer atomaren Operation zu löschen und zu schreiben oder diese beiden Funktionen aufzuteilen. Die Ausführungszeiten sind in Tabelle 8-1 aufgeführt. Solange EEPE gesetzt ist, wird der Schreibzugriff auf EEPMn ignoriert. Nach Reset sind diese Bits Null, es sei denn, der EEPROM war mit Programmieren beschäftigt.
EEPM1 | EEPM0 | Programmierzeit | Operation
0 | 0 | 3,4 ms | Löschen und Schreiben in einer atomaren Operation
0 | 1 | 1,8 ms | nur löschen
1 | 0 | 1,8 ms | nur schreiben
1 | 1 | – | reserviert für später
  • Bit 3 — EERIE: EEPROM Ready Interrupt Enable
Wenn das I-Bit im SREG-Register und das EERIE-Bit gesetzt sind, ist der EEPROM-bereit-Interrupt freigegeben. Wenn das Bit gelöscht ist, dann ist der Interrupt gesperrt. Der EEPROM-bereit-Interrupt generiert eine permanente Interruptanforderung, wenn das EEPE-Bit gelöscht ist.
  • Bit 2 — EEMPE: Freigabe der EEPROM-Schreibfreigabe
Dieses Bit muss gesetzt werden, wenn das EEPE-Bit zum Beschreiben des EEPROM gesetzt werden soll. Wenn EEMPE gesetzt ist, bewirkt das Setzen des EEPE-Bits, dass die Daten im EEDR-Register in die Adresse, die im EEAR-Register steht, geschrieben werden. Wenn das EEMPE-Bit gesetzt wurde, wird es durch die Hardware nach 4 Taktzyklen automatisch wieder gelöscht. Es bleibt also nur ein kleines Zeitfenster, um den eigentlichen Schreibvorgang zu starten.
  • Bit 1 — EEPE: EEPROM-Schreibfreigabe
Wenn die Adresse und die Daten korrekt eingestellt wurden, muss das EEPE-Bit gesetzt werden, um den Schreibvorgang zu starten, mit dem die Daten in das EEPROM geschrieben werden. Bevor das EEPE-Bit gesetzt wird, muss vorher das EEMPE-Bit auf 1 gesetzt werden, da ansonsten kein Schreibvorgang stattfindet. Der nachfolgende Ablauf muss eingehalten werden, wenn das EEPROM beschrieben werden soll (Die Schritte 3 und 4 sind von der Reihenfolge her egal und können auch schon vorher ausgeführt werden.)
  1. Warten, bis das EEPE-Bit Null wird
  2. Warten, bis das SPMEN-Bit im SPMCR-Register Null wird
  3. Schreiben der EEPROM-Adresse in EEAR (bei Bedarf)
  4. Schreiben der EEPROM-Daten in EEDR (bei Bedarf)
  5. Schreiben einer 1 in das EEMPE-Bit
  6. Schreiben einer 1 in das EEPE-Bit innerhalb von 4 Taktzyklen
Der EEPROM kann nicht programmiert werden, während die CPU in den Flash-Speicher schreibt. Die Software muss also überprüfen, ob die Programmierung des Flash-Speichers abgeschlossen ist, bevor ein EEPROM-Schreibvorgang gestartet werden kann. Schritt 2 ist daher nur relevant, wenn die Software im Boot-Sektor erlaubt, den Flash-Speicher zu beschreiben. Wenn in der Software das Beschreiben des Flash-Speichers nicht vorkommen kann, dann kann Schritt 2 entfallen.

Achtung: Ein Interrupt zwischen Schritt 5 und 6 wird zu einem fehlerhaften Schreibversuch führen, da das Zeitfenster von EEMPE dann überschritten wird. Wenn eine Interruptroutine auf das EEPROM zugreift, wird dadurch ein laufender Zugriff unterbrochen, die Register EEAR und EEDR werden verändert und der durch den Interrupt unterbrochene Zugriff misslingt. Es ist daher zu empfehlen, die Interrupts während der Schritte 4 und 5 global zu sperren.

Wenn der Schreibvorgang beendet ist, wird das EEPE-Bit durch die Hardware automatisch gelöscht. Der Zustand des Bits kann also durch die Software permanent abgefragt werden, um das Ende des Schreibvorganges zu erkennen. Wenn das EEPE-Bit mit einer 1 gesetzt wurde, wird die CPU für zwei Takte angehalten, bevor der nächste Befehl ausgeführt wird.

  • Bit 0 — EERE: EEPROM-Lesefreigabe
Wenn die Adresse korrekt eingestellt wurde, muss das EERE-Bit gesetzt werden, um den Lesevorgang zu starten. Das Bit wird durch die Hardware gelöscht, wenn die Daten ausgelesen und im EEDR abgelegt wurden. Wenn das EERE-Bit gesetzt wurde (also das Auslesen beginnt) wartet die CPU 4 Taktzyklen lang bevor der nächste Befehl ausgeführt wird.

Der Anwender sollte das EEPE-Bit abfragen, bevor ein Lesevorgang gestartet wird. Während eines laufenden Schreibvorganges ist es nicht möglich, den EEPROM zu lesen oder das EEPROM-Daten-Register zu ändern.

Nachfolgende Tabelle zeigt die typischen Programmierzeiten des EEPROMs, die zeitliche Steuerung erfolgt durch den kalibrierten RC-Oszillator.

Tabelle 8-2: EEPROM-Programmierzeit
Parameter | Anzahl der RC-Oszillator-Takte | Typische Programmierzeit
EEPROM schreiben (von CPU) | 26.368 | 3,3 ms
Im Gegensatz zu älteren AVR-Mikrocontrollern mit knapp 10 ms EEPROM-Programmierzeit ist hier die Schreibzeit deutlich kürzer.
Die folgenden Programmbeispiele zeigen den Schreibvorgang für das EEPROM. Die Beispiele unterstellen, dass keine Interrupts auftreten können und der Flash nicht durch ein Programm im Urlader-Bereich beschrieben wird. Falls doch muss die EEPROM-Schreibroutine auf das Ende einer SPM-Schreiboperation warten.
Beispiel in Assembler
EEPROM_write:
    sbic	EECR,EEPE	; Warte bis vorheriges Schreiben fertig
     rjmp	EEPROM_write
    out	EEARH,r18	; Lade Adresse (r18:r17)
    out	EEARL,r17
    out	EEDR,r16	; Lade Datenbyte (r16)
    sbi	EECR,EEMPE	; Setze EEMPE-Bit
    sbi	EECR,EEPE	; EEPROM schreiben starten durch Setzen des EEPE-Bits
    ret
Beispiel in C
void EEPROM_write(unsigned uiAddress, unsigned char ucData) {
  while (EECR & (1<<EEPE));	/* Warte bis vorheriges Schreiben fertig */
  EEAR = uiAddress;			/* Lade Adresse und Datenbyte */
  EEDR = ucData;
  EECR |= (1<<EEMPE);	/* Setze EEMPE-Bit */
  EECR |= (1<<EEPE);	/* EEPROM schreiben starten durch Setzen des EEPE-Bits */
}
Das nächste Beispiel zeigt den Lesevorgang des EEPROMs. Dabei ist wieder unterstellt, dass keine Interrupts auftreten können.
Beispiel in Assembler
EEPROM_read:
    sbic	EECR,EEPE	; Warte bis vorheriges Schreiben fertig
     rjmp	EEPROM_read
    out	EEARH,r18	; Lade Adresse (r18:r17)
    out	EEARL,r17
    sbi	EECR,EERE	; Starte EEPROM lesen
    in	r16,EEDR	; Lese Datenbyte
    ret
Beispiel in C
unsigned char EEPROM_read(unsigned uiAddress) {
  while (EECR & (1<<EEPE));	/* Warte bis vorheriges Schreiben fertig */
  EEAR = uiAddress;		/* Lade Adresse */
  EECR |= (1<<EERE);		/* Starte EEPROM lesen */
  return EEDR;			/* Lese Datenbyte */
}

8.6.4 GPIOR2 — Freies I/O-Register 2

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x4B) | MSB |  |  |  |  |  |  | LSB | GPIOR2
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0

8.6.5 GPIOR1 — Freies I/O-Register 1

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x4A) | MSB |  |  |  |  |  |  | LSB | GPIOR1
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0

8.6.6 GPIOR0 — Freies I/O-Register 0

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x3E) | MSB |  |  |  |  |  |  | LSB | GPIOR0
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0


Systemtakt und Takteinstellungen

9. Systemtakt und Takteinstellungen

9.1 Taktdomänen und ihre Verteilung

Das nachfolgende Bild zeigt das Prinzip des Taktsystems und dessen Verteilung. Nicht alle Takte müssen zur gleichen Zeit aktiv sein. Um den Stromverbrauch zu reduzieren können Takte für verschiedene Module durch Verwenden der unterschiedlichen Sleep-Modi abgeschaltet werden.
Taktverteilung

9.1.1 CPU-Takt — clkCPU

Der CPU-Takt ist mit allen Teilen des Bausteins verbunden, die mit dem AVR-Kern zusammenarbeiten. Beispielhaft sind hier zu nennen: Die allgemeinen Register, das Status-Register und der Datenspeicher, der den Stack enthält. Das Anhalten des CPU-Taktes verhindert weitere Operationen des CPU-Kerns.

9.1.2 I/O-Takt — clkI/O

Der I/O-Takt wird für die meisten I/O-Module wie etwa die Zähler/Zeitgeber, das SPI und die USART verwendet. Der I/O-Takt wird auch für das Modul der externen Interrupts verwendet, wobei zu beachten ist, dass einige externe Interrupts durch eine asynchrone Logik erkannt werden und somit auch dann verwendet werden können, wenn der I/O-Takt abgeschaltet ist. Zu beachten ist ferner, dass die Adresserkennung im TWI Modul asynchron durchgeführt wird, wenn der I/O-Takt abgeschaltet ist. Somit ist der Empfang von Adressen in allen Sleep-Modi möglich.

9.1.3 Flash-Takt — clkFLASH

Der Flash-Takt kontrolliert die Operationen mit dem Flash-Speicher. Der Flash-Takt ist gewöhnlich immer dann aktiv, wenn der CPU-Takt auch aktiv ist.

9.1.4 Takt des asynchronen Zeitgebers - clkASY

Der asynchrone Timer-Takt ermöglicht das Takten des asynchronen Zähler/Zeitgebers mit einer externen Quarzfrequenz von 32 kHz. Da diese Taktung auch dann funktioniert, wenn sich der ATmega8 in einem Sleep-Modus befindet, kann der asynchrone Zähler/Zeitgeber als Echtzeituhr verwendet werden. Der asynchrone Zähler/Zeitgeber verwendet die gleichen XTAL-Pins wie der Haupttakt der CPU. Daher kann er nur verwendet werden, wenn für die CPU der interne RC-Oszillator verwendet wird. Die Frequenz des CPU-Taktes muss mindestens viermal so groß sein, wie die Frequenz des Oszillators für den asynchronen Timer-Takt.

9.1.5 ADU-Takt - clkADC

Der Takt für den Analog-Digitalwandler wird unabhängig von den anderen Takten erzeugt. Dadurch ist es möglich, den CPU- und I/O-Takt anzuhalten, während eine AD-Wandlung durchgeführt wird. Somit werden Störungen durch die digitalen Schaltkreise vermieden, die das Wandlungsergebnis beeinflussen können.

9.2 Taktquellen

Der Chip kann aus verschiedenen Quellen getaktet werden, die mit den Fuse-Bits ausgewählt werden. Der Takt der ausgewählten Quelle bildet den Input für den Taktgenerator des Bausteins und ist mit den entsprechenden Modulen verbunden.

Optionen der Taktung (1)
Taktung des Bausteins | CKSEL3:0
Externer Quarz/Keramik-Resonator | 1111 - 1010
Externer Quarz niedrige Frequenz | 1001
Externer RC Oszillator | 1000 — 0101
Kalibirierter interner RC Oszillator | 0100 — 0001
Externer Takt | 0000
Hinweis
  1. „1“ bedeutet nicht programmiert, „0“ bedeutet programmiert.

9.2.1 Vorgegebene Taktquelle

Der Baustein wird ausgeliefert mit CKSEL = „0010“ und SUT = „10“ (interner RC-Oszillator mit 8 MHz, langsam ansteigende Versorgungsspannung). Dazu ist die CLKDIV-Fuse gesetzt, d.h. der Systemtakt beträgt 1 MHz.

9.2.2 Takthochlauf-Sequenz

Jede Taktquelle benötigt eine ausreichende Speisespannung UCC sowie eine minimale Anzahl von Schwingungen, bevor sie ausreichend stabil läuft.

Wenn die CPU aus dem Leistung-weg- oder Leistung-spar-Modus aufwacht, bestimmt die ausgewählte Taktquelle die Aufwachzeit und stellt einen stabilen Takt sicher, bevor der erste Befehl ausgeführt wird. Wenn die CPU nach einem Reset startet, verlängert sich die Verzögerung, damit ein stabiler Pegel der Versorgungsspannung erreicht wird, bevor mit der Abarbeitung des Programms begonnen wird.

Der Watchdog-Oszillator wird verwendet, um den Echtzeit-Anteil der Aufwachzeit zu bestimmen. Die Anzahl der Zyklen des Watchdog-Zeitgebers wird für jede Verzögerung benutzt. Die Frequenz des Watchdog-Oszillators ist von der Betriebsspannung abhängig (siehe Typische Charakteristik des ATmega8).

Anzahl der Zyklen des Watchdog-Oszillators
Typische Zeitüberschreitung (UCC = 5,0 V) | Typische Zeitüberschreitung (UCC = 3,0 V) | Anzahl der Zyklen
0 ms | 0 ms | 0
4,1 ms | 4,3 ms | 512
65 ms | 69 ms | 8 K (8.192)

9.3 Energiespar-Quarzoszillator

Anschluss des Quarzoszillators
Betriebsarten des Energiespar-Quarzoszillators (3)
Frequenzbereich | Empfohlener Bereich für Kondensatoren C1 and C2 | CKSEL[3:1] (1)
0.4 - 0.9 MHz | – | 100 (2)
0.9 - 3.0 MHz | 12 - 22 pF | 101
3.0 - 8.0 MHz | 12 - 22 pF | 110
8.0 - 16.0 MHz | 12 - 22 pF | 111
Hinweise:
  1. Dies sind die empfohlenen CKSEL-Einstellungen für verschiedene Frequenzbereiche.
  2. Diese Option sollte nicht für Quarze verwendet werden, sondern nur für Keramikresonatoren.
  3. Falls die Quarzfrequenz die Grenzwerte des Chips (abhängig von UCC) übersteigt, kann die CKDIV8-Fuse programmiert werden, um die interne Frequenz durch 8 zu teilen. Es muss sichergestellt werden, dass der geteilte Takt den Taktgrenzwert des Chips einhält.
Hochlaufzeiten für den Energiespar-Quarzoszillator
Oszillator-Typ, Spannungsbedingung | Hochlufzeit vom Leistung-weg und Leistung-spar-Modus | Zusätzliche Verzögerung von Reset (UCC = 5.0 V) | CKSEL0 | SUT[1:0]
Keramikresonator, schneller Spannungsanstieg | 258 Takte | 14 Takte + 4,1 ms (1) | 0 | 00
Keramikresonator langsamer Spannungsanstieg | 258 Takte | 14 Takte + 65 ms (1) | 0 | 01
Keramikresonator, Unterspannungsdetektor aktiv | 1K Takte | 14 Takte (2) | 0 | 10
Keramikresonator, schneller Spannungsanstieg | 1K Takte | 14 Takte + 4.1 ms (2) | 0 | 11
Keramikresonator, langsamer Spannungsanstieg | 1K Takte | 14 Takte + 65 ms (2) | 1 | 00
Quarzoszillator, Unterspannungsdetektor aktiv | 16K Takte | 14 Takte | 1 | 01
Quarzoszillator, schneller Spannungsanstieg | 16K Takte | 14 Takte + 4.1 ms | 1 | 10
Quarzoszillator, langsamer Spannungsanstieg | 16K Takte | 14 Takte + 65 ms | 1 | 11
Hinweise:
  1. These options should only be used when not operating close to the maximum frequency of the device, and only if frequency stability at start-up is not important for the application. These options are not suitable for crystals.
  2. These options are intended for use with ceramic resonators and will ensure frequency stability at start-up. They can also be used with crystals when not operating close to the maximum frequency of the device, and if frequency stability at start-up is not important for the application.

9.4 Normaler Quarzoszillator

Die Pins XTAL1 und XTAL2 sind der Eingang und Ausgang eines invertierenden Verstärkers, der als Oszillator verwendet werden kann. Es können Quarz- oder Keramik- Resonatoren verwendet werden. Mit der CKOPT-Fuse kann zwischen zwei verschiedenen Betriebsarten des Oszillator Verstärkers ausgewählt werden. Wenn die CKOPT-Fuse programmiert ist, dann arbeitet der Oszillator mit einer voll getriebenen Ausgangsschwingung. Dieser Modus ist zu empfehlen, wenn in einer störanfälligen Umgebung gearbeitet wird oder der Ausgang XTAL2 einen weiteren externen Baustein taktet. In diesem Modus ist ein weiter Frequenzbereich möglich.

Wenn die CKOPT-Fuse nicht programmiert ist, dann arbeitet der Oszillator mit einer kleineren Ausgangsschwingung. Dadurch ist auch der Stromverbrauch geringer. Dieser Modus hat einen eingeschränkten Frequenzbereich, außerdem können keine weiteren externen Bausteine getaktet werden.

Anschluss des Quarzoszillators

Für alle Resonatoren gilt als maximale Frequenz 8 MHz bei unprogrammierter CKOPT-Fuse und 16 MHz bei programmierter CKOPT-Fuse. Die Kondensatoren C1 und C2 sollten immer gleich groß sein, unabhängig davon, welcher Typ von Resonator verwendet wird. Der optimale Wert für die Kondensatoren hängt von dem verwendeten Resonator, den Streukapazitäten und den elektromagnetischen Einflüssen der Umgebung ab. Einige Richtwerte für die Größe der Kondensatoren bei der Verwendung von Quarzen sind in nachfolgender Tabelle angegeben. Bei keramischen Resonatoren können die empfohlenen Kapazitätswerte der jeweiligen Hersteller herangezogen werden. Bei dreipoligen Resonatoren sind diese häufig bereits eingebaut.

Der Oszillator kann in drei verschiedenen Modi betrieben werden, die jeweils für bestimmte Frequenzbereiche optimiert sind. Der Arbeitsmodus wird mit den Fuses CKSEL3 bis CKSEL1 eingestellt.

Arbeitsmodi mit Quarzen
CKOPT | CKSEL3 .. 1 | Frequenzbereich (MHz) | Empfohlene Werte für C1 und C2 bei Quarzen
1 | 101(1) | 0,4 — 0,9 | -
1 | 110 | 0,9 — 3,0 | 12 pF — 22 pF
1 | 111 | 3,0 — 8,0 | 12 pF — 22 pF
0 | 101, 110, 111 | 1,0 ≤ | 12 pF — 22 pF
Hinweis:
  1. Diese Option sollte nicht bei Quarzen verwendet werden, nur bei keramischen Resonatoren.

Die CKSEL0-Fuse bestimmt zusammen mit den SUT1- und SUT0-Fuses die Start-Up Zeit wie in nachfolgender Tabelle angegeben.

CKSEL0 | SUT1 .. 0 | Start-up Zeit von Power-down und Power-save | Zusätzliche Verzögerung von Reset (VCC=5,0V) | Empfohlene Verwendung
0 | 00 | 258 CK (1) | 4,1 ms | Keramikresonator, schneller Spannungsanstieg
0 | 01 | 258 CK (1) | 65 ms | Keramikresonator, langsamer Spannungsanstieg
0 | 10 | 1k CK (2) | - | Keramikresonator, BOD freigegeben
0 | 11 | 1k CK (2) | 4,1 ms | Keramikresonator, schneller Spannungsanstieg
1 | 00 | 1k CK (2) | 65 ms | Keramikresonator, langsamer Spannungsanstieg
1 | 01 | 16k CK | - | Quarz, BOD freigegeben
1 | 10 | 16k CK | 4,1 ms | Quarz, schneller Spannungsanstieg
1 | 11 | 16k CK | 65 ms | Quarz, langsamer Spannungsanstieg
Hinweise:
  1. Diese Optionen sollten nur verwendet werden, wenn der Baustein nicht in der Nähe seiner maximalen Frequenz betrieben wird und beim Starten noch keine große Frequenzstabilität für die Applikation erforderlich ist. Diese Option ist auch nicht für Quarze geeigent.
  2. Diese Optionen sind für die Verwendung von keramischen Resonatoren gedacht und stellen eine hohe Frequenzstabilität beim Starten sicher. Sie können auch mit Quarzen verwendet werden, wenn der Baustein nicht in der Nähe seiner maximalen Frequenz betrieben wird und beim Starten noch keine große Frequenzstabilität für die Applikation erforderlich ist.

9.5 Tieffrequenz-Quarzoszillator

Wenn ein 32.768-kHz-Uhrenquarz als Taktquelle für den Baustein verwendet wird, dann muss der Quarzoszillator für kleine Frequenzen durch Setzen der CKSEL-Fuses auf „1001“ ausgewählt werden. Der Quarz kann wie in obigem Abbild angeschlossen werden. Durch Programmieren der CKOPT-Fuses können interne Kapazitäten mit einem Wert von 36pF an XTAL1 und XTAL2 geschaltet werden, wodurch das Anschalten der externen Kapazitäten entfällt.

Wenn dieser Oszillator verwendet wird, ergibt sich die Hochlaufzeit durch die Programmierung der SUT-Fuses wie in nachfolgender Tabelle aufgeführt.

SUT1 .. 0 | Hochlaufzeit von Leistung-weg und Leistung-sparen | Zusätzliche Verzögerung von Reset (VCC=5,0V) | Empfohlene Verwendung
00 | 1k CK (1) | 4,1 ms | Schneller Spannungsanstieg oder BOD freigegeben
01 | 1k CK (1) | 65 ms | Langsamer Spannungsanstieg
10 | 32k CK | 65 ms | Stabile Frequenz beim Hochlauf
11 | Reserviert
Hinweis:
  1. Diese Option sollte nur gewählt werden, wenn die Applikation keine hohe Frequenzstabilität beim Einschalten erfordert.

9.6 Kalibrierter interner RC-Oszillator

Der interne RC-Oszillator bietet eine feste Frequenz von 8 MHz. Alle nominellen Frequenzen beziehen sich auf 5 V und 25 °C. Die CKOPT-Fuse bleibt bei der Verwendung des internen RC-Oszillators immer unprogrammiert. Während eines Resets lädt die Hardware ein Werkskalibrierungs-Byte in das OSCCAL-Register, wodurch der Oszillator automatisch kalibriert wird. Bei 5 V und 25 °C kann durch das Kalibrieren eine Frequenz mit einer Abweichung von ±1 % erreicht werden. Auch wenn der interne RC-Oszillator als Taktquelle verwendet wird, wird der Watchdog-Oszillator weiterhin für den Watchdog-Timer und für den Reset-Time-out verwendet. Siehe auch Kalibrierungs-Byte.

Wird zudem der Zeitgeber2-Oszillator verwendet, kann mit diesem der RC-Oszillator mit einer PLL in Software auf die gewünschte Frequenz quarzgenau gezogen und gehalten werden.

Arbeitsmodi mit dem internen RC-Oszillator
CKSEL 3 … 0 | Frequenzbereich in MHz
0010 (1) | 7,3 .. 8,1
Hinweis:
  1. Der Baustein wird mit dieser Einstellung ausgeliefert.

Die Hochlaufzeit ergibt sich durch die Programmierung der SUT-Fuses wie in nachfolgender Tabelle aufgeführt. Die Anschlusspins PB6 (XTAL1/TOSC1) und PB7 (XTAL2/TOSC2) können dann als normale I/O-Pins oder als Zeitgeber-Oszillator-Pins verwendet werden.

Hochlaufzeiten für internen RC-Oszillator
SUT1 .. 0 | Hochlaufzeit von Leistung-weg und Leistung-sparen | Zusätzliche Verzögerung von Reset (UCC = 5,0 V) | Empfohlene Verwendung
00 | 6 CK | 14 CK (1) | BOD freigegeben
01 | 6 CK | 14 CK + 4,1 ms | Schneller Spannungsanstieg
10 (2) | 6 CK | 14 CK + 65 ms | Langsamer Spannungsanstieg
11 | Reserviert
Hinweise:
  1. Bei programmierter RSTDISBL-Fuse erhöht sich die Hochlaufzeit auf 14 CK + 4,1 ms, um sicherzustellen, dass der Programmiermodus erreicht werden kann.
  2. Der Baustein wird mit dieser Einstellung ausgeliefert.

9.7 Interner 128-kHz-Oszillator

Dieser Oszillator liefert einen 128-kHz-Takt bei minimalem Energiebedarf. Die nominelle Frequenz gilt für 3 V und 25 °C. Die Auswahl dieses Oszillators erfolgt durch Setzen der CKSEL-Fuses auf „0011“.

Arbeitsmodi
CKSEL3 … 0 | Nominelle Frequenz (1)
0011 | 128 kHz
Hinweis:
  1. Dieser 128-kHz-Oszillator ist auf geringe Leistungsaufnahme und nicht auf Präzision optimiert.

Wenn dieser Oszillator verwendet wird, ergibt sich die Hochlaufzeit durch die Programmierung der SUT-Fuses wie in nachfolgender Tabelle aufgeführt.

Hochlaufzeiten für internen RC-Oszillator
SUT1 .. 0 | Start-up Zeit von Power-down und Power-save | Zusätzliche Verzögerung von Reset (VCC=5,0V) | Empfohlene Verwendung
00 | 6 CK | 14 CK 1 | BOD freigegeben
01 | 6 CK | 14 CK + 4,1 ms | Schneller Spannungsanstieg
10 | 6 CK | 14 CK + 64 ms | Langsamer Spannungsanstieg
11 | reserviert
Hinweis:
  1. Bei programmierter RSTDISBL-Fuse erhöht sich die Hochlaufzeit auf 14 CK + 4,1 ms, um sicherzustellen, dass der Programmiermodus erreicht werden kann.

9.8 Externe Taktspeisung

Wenn der Chip von einer externen Quelle getaktet werden soll, so ist diese wie nachfolgend abgebildet an das Pin XTAL1 anzuschließen, die CKSEL-Fuses sind mit „0000“ zu programmieren.

Frequenzbereich der externen Taktspeisung
CKSEL3..0 | Frequenz
0000 | 0 - 20 MHz
Anschluss der externen Taktspeisung

Wenn dieser Oszillator verwendet wird, ergibt sich die Hochlaufzeit durch die Programmierung der SUT-Fuses wie in nachfolgender Tabelle aufgeführt.

Hochlaufzeiten für externe Taktspeisung
SUT1 .. 0 | Start-up Zeit von Power-down und Power-save | Zusätzliche Verzögerung von Reset (VCC=5,0V) | Empfohlene Verwendung
00 | 6 CK | 14 CK | BOD freigegeben
01 | 6 CK | 14 CK + 4,1 ms | Schneller Spannungsanstieg
10 | 6 CK | 14 CK + 65 ms | Langsamer Spannungsanstieg
11 | Reserviert

Wenn eine externe Taktquelle verwendet wird, so müssen plötzliche Frequenzänderungen unterbunden werden, um ein stabiles Arbeiten der CPU sicherzustellen. Eine Abweichung der Frequenz von mehr als 2% von einem Takt zum nächsten kann zu unvorhersehbaren Verhalten des Bausteins führen. Wenn eine Veränderung der Taktfrequenz vorgenommen werden soll, so muss die CPU währenddessen auf Reset gehalten werden.

9.9 Taktausgabe

Der Chip kann den Systemtakt am Pin CLKO ausgeben. Um den Ausgang zu aktivieren muss die CKOUT-Fuse programmiert werden. Dies ist vorteilhaft um andere Chips synchron mit Takt zu versorgen, zur Kalibrierung mittels Frequenzmesser oder zur Fehlersuche. Sogar während RESET wird der Takt an diesem Pin ausgegeben, weil die normale Portfunktion durch eine Fuse (und nicht durch Programmkode) überschrieben wird. Jede Taktquelle inklusive interne RC-Oszillatoren können als Takt für den Ausgang CLKO genutzt werden. Bei Verwendung des Systemtaktteilers wird der geteilte Takt am Ausgang wirksam.

9.10 Zeitgeber2-Oszillator

Bei diesem Mikrocontroller kann ein Quarz direkt zwischen TOSC1 und TOSC2 angeschlossen werden. Durch Programmieren der CKOPT-Fuse können interne Kondensatoren an die Anschlüsse XTAL1 und XTAL2 geschaltet werden, so dass diese nicht extern angeschlossen werden müssen. Der Oszillator ist für die Verwendung eines 32,768-kHz-Uhrenquarzes optimiert. Das Anlegen einer externen Taktquelle an den Anschluss TOSC1 ist möglich, wenn das Bit EXTCLK in ASSR gesetzt wird.

Dieser Oszillator kann nicht als Systemtaktgenerator dienen! Sondern nur für den Zeitgeber 2 im asynchronen Betrieb. Da die Pins TOSC und XTAL zusammenfallen, kommen für den Systemtakt nur interne RC-Oszillatoren in Frage, entweder 8 MHz oder 128 kHz. Da der Systemtakt mindestens das Vierfache dieser Oszillatorfrequenz sein muss, kommt der 128-kHz-Oszillator nur bei Quarzen mit deutlich weniger als 32 kHz in Frage.

9.11 Systemtakt-Vorteiler

The chip has a system clock prescaler, and the system clock can be divided by setting the ”CLKPR – Clock Prescale Register” on page 377. This feature can be used to decrease the system clock frequency and the power consumption when the requirement for processing power is low. This can be used with all clock source options, and it will affect the clock frequency of the CPU and all synchronous peripherals. clk I/O , clk ADC , clk CPU , and clk FLASH are divided by a factor as shown in Table 29-11 on page 305. When switching between prescaler settings, the System Clock Prescaler ensures that no glitches occurs in the clock system. It also ensures that no intermediate frequency is higher than neither the clock frequency corresponding to the previous setting, nor the clock frequency corresponding to the new setting. The ripple counter that implements the prescaler runs at the frequency of the undivided clock, which may be faster than the CPU's clock frequency. Hence, it is not possible to determine the state of the prescaler - even if it were readable, and the exact time it takes to switch from one clock division to the other cannot be exactly predicted. From the time the CLKPS values are written, it takes between T1 + T2 and T1 + 2 * T2 before the new clock frequency is active. In this interval, 2 active clock edges are produced. Here, T1 is the previous clock period, and T2 is the period corresponding to the new prescaler setting. To avoid unintentional changes of clock frequency, a special write procedure must be followed to change the CLKPS bits:
  1. Write the Clock Prescaler Change Enable (CLKPCE) bit to one and all other bits in CLKPR to zero.
  2. Within four cycles, write the desired value to CLKPS while writing a zero to CLKPCE.
Interrupts must be disabled when changing prescaler setting to make sure the write procedure is not interrupted.

9.12 Register-Beschreibung

9.12.1 OSCCAL — Oszillator-Kalibrierung

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x66) | CAL7 | CAL6 | CAL5 | CAL4 | CAL3 | CAL2 | CAL1 | CAL0 | OSCCAL
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | Einzelchip-spezifischer Kalibrierwert

Indem das Kalibrierungs-Byte in das Register geschrieben wird, wird die Frequenz des internen Oszillators justiert, um dadurch die durch die Herstellung bedingt Ungenauigkeiten auszugleichen. Während eines Resets wird der Kalibrierungswert für die Frequenz von 1MHz, der im High-Byte der Signatur-Reihe (Adresse 00) hinterlegt ist, automatisch geladen und in das OSCCAL-Register geschrieben. Auch die Kalibrierungswerte für die Frequenzen von 2, 4, und 8 MHz sind in der Signaturreihe abgelegt. Soll der interne RC-Oszillator mit einer dieser Frequenz betrieben werden, so muss das Kalibrierungsbyte manuell geladen werden. Dies kann dadurch geschehen, indem man zunächst das Kalibrierungsbyte mit dem AVR-Studio ausliest und den Wert im Programm- oder EEPROM-Speicher hinterlegt. Die Software muss dann diesen Wert abholen und in das OSCCAL-Register schreiben.

Wenn das OSCCAL auf 00h steht, ist die niedrigste Frequenz ausgewählt. Werte größer als Null erhöhen die Frequenz des internen Oszillators, bei FFh ist die maximale Frequenz erreicht. Wenn die Applikationssoftware das EEPROM oder den Flash-Speicher beschreibt, sollte die eingestellte Frequenz nicht mehr als 10% über ihrem nominalen Wert liegen. Andernfalls können Fehler beim Schreiben des EEPROM oder Flash auftreten. Man sollte beachten, dass der Oszillator nur für das Kalibrieren auf 1, 2, 4 oder 8 MHz vorgesehen ist. Das Justieren anderer Werte ist nicht garantiert, so wie in nachfolgender Tabelle angegeben.

OSCCAL Wert | Min Frequenz in Prozent der nominalen Frequenz (%) | Max Frequenz in Prozent der nominalen Frequenz (%)
00h | 50 | 100
7Fh | 75 | 150
FFh | 100 | 200

9.12.2 CLKPR — Taktvorteiler

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x61) | CLKPCE | - | - | - | CLKPS3 | CLKPS2 | CLKPS1 | CLKPS0 | GLKPR
Zugriff | R/W! | R | R | R | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | CKDIV8 | CKDIV8
• Bit 7 – CLKPCE: Clock Prescaler Change Enable
The CLKPCE bit must be written to logic one to enable change of the CLKPS bits. The CLKPCE bit is only updated when the other bits in CLKPR are simultaneously written to zero. CLKPCE is cleared by hardware four cycles after it is written or when CLKPS bits are written. Rewriting the CLKPCE bit within this time-out period does neither extend the time-out period, nor clear the CLKPCE bit.
• Bits 3:0 – CLKPS[3:0]: Clock Prescaler Select Bits 3 - 0
These bits define the division factor between the selected clock source and the internal system clock. These bits can be written run-time to vary the clock frequency to suit the application requirements. As the divider divides the master clock input to the MCU, the speed of all synchronous peripherals is reduced when a division factor is used. The division factors are given in Table 9-17 on page 38. The CKDIV8 Fuse determines the initial value of the CLKPS bits. If CKDIV8 is unprogrammed, the CLKPS bits will be reset to “0000”. If CKDIV8 is programmed, CLKPS bits are reset to “0011”, giving a division factor of 8 at start up. This feature should be used if the selected clock source has a higher frequency than the maximum frequency of the device at the present operating conditions. Note that any value can be written to the CLKPS bits regardless of the CKDIV8 Fuse setting. The Application software must ensure that a sufficient division factor is chosen if the selected clock source has a higher frequency than the maximum frequency of the device at the present operating conditions. The device is shipped with the CKDIV8 Fuse programmed.
Taktvorteiler-Auswahl
CLKPS3..0 | Teilerfaktor
0000 (0x00) | 1
0001 (0x01) | 2
0010 (0x02) | 4
0011 (0x03) | 8
0100 (0x04) | 16
0101 (0x05) | 32
0110 (0x06) | 64
0111 (0x07) | 128
1000 (0x08) | 256
1001 (0x09) | reserviert
1010 (0x0A)
1011 (0x0B)
1100 (0x0C)
1101 (0x0D)
1110 (0x0E)
1111 (0x0F)


Energiehaushalt und Schlafmodi

10. Energiehaushalt und Schlafmodi

Die Schlafmodi ermöglichen der Applikation die unbenutzten Module des Mikrocontrollers abzuschalten und dadurch den Stromverbrauch zu senken. Der AVR-Mikrocontroller enthält fünf verschiedene Schlafmodi, um den Erfordernissen an den Stromverbrauch gerecht zu werden.

Wenn aktiviert, bleibt der Unterspannungsdetektor während des Schlafmodus' aktiv. Um die Stromaufnahme im Schlafmodus weiter abzusenken, besteht die Möglichkeit, in einigen Schlafmodi den Unterspannungsdetektor abzuschalten. Siehe unten für Details.

10.1 Schlafmodi

Bild 9-1 zeigt die verschiedenen Taktdomänen des ATmegaX8 und deren Verteilung. Das Bild ist hilfreich, um den passenden Schlafmodus auszuwählen. Tabelle 10-1 zeigt die verschiedenen Schlafmodi, deren Aufwecker und die Möglichkeit, den Unterspannungsdetektor abzuschalten.

Hinweis:
  1. Die Deaktivierung des Unterspannungsdetektors ist nur bei den PicoPower-AVRs möglich, nämlich ATmega48PA, ATmega88PA, ATmega168PA und ATmega32P.
Tablelle 10-1: Aktive Taktdomänen und Aufwecker der verschiedenen Schlafmodi
 | Aktive Taktdomänen clkXXX |  |  |  |  | Oszillatoren |  | Aufwecker |  |  |  |  |  |  | Unterspannungs-Detektor abschaltbar?
 | CPU | FLASH | IO | ADC | ASY | Haupttakt | Zeitgeber | INT1 INT0 Pin- Pegelwechsel | TWI Adresstreffer | Zeitgeber 2 | SPM EEPROM bereit | ADU | Watchdog | sonstige I/O
Idle |  |  | X | X | X | X | X(2) | X | X | X | X | X | X | X |
ADU-Störreduktion |  |  |  | X | X | X | X(2) | X(3) | X | X(2) | X | X | X |  |
Leistung weg |  |  |  |  |  |  |  | X(3) | X |  |  |  | X |  | ja
Leistung sparen |  |  |  |  | X |  | X(2) | X(3) | X | X |  |  | X |  | ja
Standby(1) |  |  |  |  |  | X |  | X(3) | X |  |  |  | X |  | ja
Erweitertes Standby(1) |  |  |  |  | X(2) | X | X(2) | X(3) | X | X |  |  | X |  | ja
Hinweise:
  1. Nur empfohlen für externen Quarz oder Keramikresonator als Taktquelle
  2. Falls Zähler/Zeitgeber 2 im asynchronen Betrieb läuft
  3. Für INT1 und INT0: Nur Pegel-Interrupt
Um einen der sechs Schlafmodi zu aktivieren muss das SE-Bit im MCUCR-Register mit einer logischen 1 beschrieben werden und ein SLEEP-Befehl ausgeführt werden. Die Bits SM2, SM1 und SM0 des MCUCR-Registers bestimmen, welcher Schlafmodus (Idle, ADU-Störreduktion, Leistung weg, Leistung sparen, Standby oder Erweitertes Standby) durch den SLEEP-Befehl aktiviert wird. Siehe Tabelle 10-2.

Wenn ein freigegebener Interrupt auftritt, während sich der Controller in einem Schlafmodus befindet, so wacht der Controller wieder auf. Der Controller wird dann für vier Takte und die Hochlaufzeit angehalten und führt anschließend die Interruptroutine aus. Nach dem Abschluss der Interruptroutine wird das Programm mit dem Befehl fortgesetzt, der dem SLEEP-Befehl folgt. Der Inhalt der Register und des SRAM werden durch das Aufwachen nicht verändert. Wenn während eines SLEEP-Modus ein Reset auftritt, wacht der Controller ebenfalls auf und führt das Programm ab dem Reset-Vektor aus.

10.2 BOD-Deaktivierung(1)

Wenn der Unterspannungs-Detektor (= BOD) durch Programmieren der BODLEVEL-Fuses aktiviert ist, siehe Tabelle 28-7 und folgende, ist dieser auch im Schlafmodus aktiv. Um die Stromaufnahme im Schlafmodus weiter abzusenken, besteht die Möglichkeit, in einigen Schlafmodi den Unterspannungsdetektor abzuschalten, siehe Tabelle 10-1 oben. Dann ist die Stromaufnahme im Schlafmodus genauso gering wie ohne programmierten Unterspannungsdetektor. Wenn durch Software kontrolliert, wird der Unterspannungsdetektor automatisch mit dem Eintritt in den Schlafmodus abgeschaltet und beim Verlassen reakitiviert. Dies stellt sicheren Betrieb nach Rückkehr aus dem Schlafmodus sicher, falls inzwischen die Speisespannung zu weit abgesunken ist.

War der Unterspannungsdetektor während des Schlafmodus' abgeschaltet, verlängert sich die Aufweckzeit um weitere ≈60 µs, um den korrekten Betrieb des Unterspannungsdetektors sicherzustellen, bevor Kode ausgeführt wird.

Die BOD-Deaktivierung wird durch das Bit 6, BODS (BOD Sleep) im Steuerregister MCUCR gesteuert, siehe MCUCR — Mikrocontroller-Kontrolle unten. Eine Eins aktiviert das BOD-Deaktivierungs-Feature, eine Null hält den Unterspannungsdetektor aktiv. Vorgabe ist ein permanent aktiver Unterspannungsdetektor, also BODS = 0.

Der Schreibzugriff auf BODS ist nur durch eine zeitbegrenzte Sequenz möglich, siehe unten.

Hinweis:
  1. Die BOD-Deaktivierung ist nur bei den PicoPower-AVRs ATmega48PA, ATmega88PA, ATmega168PA und ATmega32P möglich.

10.3 Idle

Wenn SM[2:0] auf 000 konfiguriert sind, zwingt ein Sleep-Befehl den Controller in den Idle-Mode. Dadurch wird die CPU gestoppt, aber sämtliche Peripherie wie das SPI, die USART, der ADU, der Analogvergleicher, die Zweidraht-Schnittstelle, die Zähler/Zeitgeber, der Watchdog und das Interruptsystem arbeiten weiter. Dieser Sleep-Modus hält lediglich den CPU-Takt clkCPU und den Flash-Takt clkFLASH an, während alle anderen Takte weiter laufen.

Das erlaubt dem Controller sowohl durch externe Ereignisse wie externe Interrupts als auch durch interne Ereignisse wie Zählerüberlauf, USART-Interrupt oder Watchdog wieder erweckt zu werden. Wenn das Aufwecken durch den Analogvergleicher unerwünscht ist, so kann dieser abgeschaltet werden, indem das ACD-Bit im ACSR-Register gesetzt wird. Dadurch kann man weiteren Strom im Idle-Modus sparen. Wenn der ADU freigegeben ist, wird eine Wandlung automatisch gestartet, wenn in den Idle-Modus geschaltet wird.

10.4 ADU-Störreduktion

Wenn SM[2:0] auf 001 konfiguriert sind, zwingt ein Sleep-Befehl den Controller in den ADU-Störreduktions-Modus. Dadurch wird die CPU gestoppt, aber der ADU, der externe Interrupteingang, die TWI-Adressüberwachung, der Zähler/Zeitgeber 2 und der Watchdog arbeiten weiter (wenn sie freigegeben sind). Dieser Sleep-Modus schaltet die Takte clkI/O, clkCPU und clkFLASH ab, während alle anderen Takte weiter laufen.

Das verbessert die Messumgebung des ADU und ermöglicht so Messungen mit höherer Auflösung. Wenn der ADU freigegeben ist, wird durch Einschalten des ADU-Störreduktions-Modus automatisch eine Wandlung gestartet. Abgesehen vom ADU-fertig-Interrupt können nur ein externer Reset, der Watchdog, ein Unterspannungs-Reset, eine TWI-Adressübereinstimmung, der Zähler/Zeitgeber 2, ein SPM/EEPROM-fertig-Interrupt, ein externer Pegel-Interrupt an INT0 oder INT1 oder ein Pegelwechsel-Interrupt den Controller vom ADU-Störreduktions-Modus aufwecken.

10.5 Leistung weg

Wenn SM[2:0] auf 010 konfiguriert sind, zwingt ein Sleep-Befehl den Controller in den Leistung-weg-Modus. In diesem Modus wird der externe Oszillator gestoppt, während die externen Interrupts, die TWI-Adressüberwachung und der Watchdog ihre Arbeit fortsetzen (sofern sie freigegeben sind).

Nur ein externer Reset, der Watchdog, ein Unterspannungs-Reset, eine TWI-Adressübereinstimmung, ein externer Pegel-Interrupt an INT0 oder INT1 oder ein Pegelwechsel-Interrupt können den Controller aus dem Leistung-weg-Modus aufwecken. Dieser Sleep Modus hält alle generierten Takte an, so dass nur noch die asynchronen Module arbeiten.

Hinweis:
  • Wenn der Controller durch einen Pegel-Interrupt geweckt werden soll, muss der entsprechende Zustand an den Pins so lange anliegen, bis der Controller seine Hochlaufzeit hinter sich hat. Verschwindet der Interrupt auslösende Pegel, bevor die Hochlaufzeit abgelaufen ist, wird der Befehl nach SLEEP abgearbeitet, ohne die Interruptroutine ausgeführt zu haben. Siehe Externe Interrupts. Die Hochlaufzeit ist durch die SUT- und CKSEL-Fuses festgelegt, siehe Systemtakt und Takteinstellungen.
    • Beim Aufwachen tritt eine Verzögerung entsprechend den Aufwachkonditionen auf, bis das Aufwachen abgeschlossen ist. In dieser Zeit wird der Takt neu gestartet und stabilisiert sich. Die Aufwachzeit wird mit den gleichen CKSEL-Fuses definiert wie die Hochlaufzeit nach Reset, siehe Taktquellen.

    10.6 Leistung sparen

    Wenn SM[2:0] auf 011 konfiguriert sind, zwingt ein Sleep-Befehl den Controller in den Leistung-spar-Modus. Dieser Modus ist mit einer Ausnahme identisch mit dem Power-down Modus:

    Wenn der Zähler/Zeitgeber 2 asynchron getaktet wird, d.h. das AS2 Bit im ASSR Register ist gesetzt, läuft er auch im Power-save Modus weiter. Der Controller kann also entweder durch einen Zählerüberlauf oder durch einen Output Compare aufgeweckt werden, wenn die entsprechenden Interrupts im TIMSK-Register freigegeben sind und das Globale Interrupt Flag im Statusregister gesetzt ist.

    Wenn der asynchrone Timer nicht läuft, dann ist der Leistung-weg-Modus dem Leistung-spar-Modus vorzuziehen.

    Der Zähler/Zeitgeber 2 kann im Leistung-Spar-Modus synchron oder asynchron getaktet werden. Wenn nicht der asynchrone Takt verwendet wird, wird der Zähler/Zeitgeber 2 bei Sleep automatisch gestoppt. Wenn nicht der synchrone Takt verwendet wird, wird dit Taktquelle bei Sleep angehalten. Selbst wenn der synchrone Takt im Leistung-weg-Modus läuft, ist der Takt nur für Zähler/Zeitgeber 2 verfügbar.

    Was für ein Wirrwarr! Merke: Power-Save wird nur benötigt, wenn Zähler/Zeitgeber 2 — typischerweise mit einem 32768-Hz-Uhrenquarz — als Echtzeituhr verwendet wird, sonst nie.

    10.7 Standby

    Wenn SM[2:0] auf 110 konfiguriert sind und ein Quarz- oder Keramikresonator-Oszillator ausgewählt wurde, zwingt ein Sleep-Befehl den Controller in den Standby-Modus. Dieser Modus ist mit der Ausnahme, dass der Oszillator weiter läuft, identisch mit dem Leistung-weg-Modus. Aus dem Standby-Modus wacht die CPU innerhalb von sechs Taktzyklen auf.
    Der asynchrone Takt für Zähler/Zeitgeber 2 ist abgeschaltet, sodass dieser Modus für den Betrieb jenes Zählers als Echtzeituhr nicht in Frage kommt. Die Hauptanwendung dieses Schlafmodus' dürften kurze Unterbrechungen bei vergleichsweise niedrigen Quarzfrequenzen sein.

    10.8 Erweitertes Standby

    Wenn SM[2:0] auf 111 konfiguriert sind und ein Quarz- oder Keramikresonator-Oszillator ausgewählt wurde, zwingt ein Sleep-Befehl den Controller in den Erweiterten Standby-Modus. Dieser Modus ist mit der Ausnahme, dass der Oszillator weiter läuft, identisch mit dem Leistung-spar-Modus. Aus dem Erweiterten Standby-Modus wacht die CPU innerhalb von sechs Taktzyklen auf.
    Der asynchrone Takt für Zähler/Zeitgeber 2 bleibt laufen, sodass dieser Modus für den Betrieb jenes Zählers als Echtzeituhr das Richtige ist, sonst nicht. Die Hauptanwendung dieses Schlafmodus' dürften kurze Unterbrechungen bei vergleichsweise niedrigen Quarzfrequenzen sein.

    10.9 Das Leistungs-Reduktions-Register

    Das Leistungs-Reduktions-Register PRR bietet die Möglichkeit, einzelne Peripheriebaugruppen von der Taktversorgung abzutrennen und die Stromaufnahme weiter zu reduzieren. Der momentane Zustand des Peripheriemoduls wird eingefroren und die I/O-Register können weder gelesen noch beschrieben werden. Ressourcen, die durch die Baugruppe eingenommen wurden bleiben okkupiert. Daher ist empfohlen, die entsprechende Baugruppe vor dem Abtrennen des Takts zu deaktivieren. Das Wiederanschließen des Takts durch Löschen des zugehörigen Bits im PRR bringt die Baugruppe in den selben Zustand wie vor der Taktabtrennung.

    Taktabtrennung kann im Idle-Modus und aktiven Betrieb die Gesamtstromaufnahme deutlich absenken. In allen übrigen Schlafmodi ist der Takt bereits angehalten.

    10.10 Minimieren des Stromverbrauchs

    Es sind verschiedene Möglichkeiten zu betrachten, wenn der Stromverbrauch im AVR-System gesenkt werden soll. Grundsätzlich können so oft wie möglich die verschiedenen Schlafmodi verwendet werden, wobei diese so ausgewählt werden können, dass so wenig wie möglich Funktionen des Bausteins aktiv sind. D.h. alle Funktionen, die nicht benötigt werden, sollten abgeschaltet werden. Im Einzelfall müssen für nachfolgende Module spezielle Betrachtungen durchgeführt werden, um den geringsten möglichen Stromverbrauch zu erreichen.

    10.10.1 Analog-Digital-Wandler

    Wenn der ADU freigegeben ist, so arbeitet er auch in allen Sleep-Modi. Um den Stromverbrauch zu reduzieren muss der ADU also vor dem Eintritt in einen Sleep-Modus deaktiviert werden. Beim Wiedereinschalten des ADU wird die erste Wandlung eine erweiterte Wandlung sein, so wie es bei Analog-Ditital-Wandler beschrieben wird.

    10.10.2 Analogvergleicher

    Im Idle- und im ADU-Störunterdrückungs-Modus kann der Analogvergleicher abgeschaltet werden, in allen anderen Schlafmodi ist er automatisch abgeschaltet. Wenn die interne Spannungsreferenz für den Analogvergleicher verwendet wird, kann der Analogvergleicher in allen Modi abgeschaltet werden, andernfalls ist die interne Spannungsreferenz in allen Modi aktiviert. Details sind bei Analogvergleicher beschrieben.

    10.10.3 Unterspannungsdetektor

    Wenn der Unterspannungsdetektor in der Schaltung nicht verwendet wird, so kann dieses Modul abgeschaltet werden. Die Freigabe der Unterspannungserkennung geschieht durch Programmieren der BOLEVEL-Fuses, somit ist die Spannungsabfallerkennung in allen Sleep-Modi aktiv, d.h. sie verbraucht permanent Strom. In den unteren Sleep-Modi bedeutet dies, dass ein signifikanter Anteil des gesamten Stromverbrauchs auf die Spannungsabfallerkennung entfällt. Siehe Unterspannungs-Reset.

    10.10.4 Interne Spannungsreferenz

    Die interne Spannungsreferenz kann für die Unterspannungserkennung, den Analogvergleicher und den Analog-Digital-Wandler verwendet werden. Wenn diese Module wie zuvor beschrieben abgeschaltet werden, so kann auch die interne Spannungsreferenz abgeschaltet werden, um den Stromverbrauch weiter zu reduzieren. Beim Wiedereinschalten benötigt die interne Spannungsreferenz eine gewisse Zeit zur Stabilisierung. Bleibt sie während eines Sleep-Modus eingeschaltet, so kann sie nach dem Aufwachen sofort wieder verwendet werden. Siehe Interne Spannungsreferenz unten.

    10.10.5 Watchdog-Zeitgeber

    Wenn der Watchdog in einer Applikation nicht benötigt wird, so sollte der Watchdog abgeschaltet werden. Andernfalls ist der Watchdog Timer auch in allen Sleep-Modi aktiv und verbraucht somit permanent Strom. In den unteren Sleep-Modi kann dies einen großen Anteil des gesamten Stromverbrauchs ausmachen. Siehe Watchdog-Zeitgeber unten.

    10.10.6 Portpins

    Wenn ein Schlafmodus eingeschaltet wird, können alle Port Pins so eingestellt werden, dass sie möglichst wenig Strom verbrauchen. Am wichtigsten dürfte dabei sein, dass die Port Pins keine ohmschen Lasten treiben. In den Schlafmodi, in denen der I/O-Takt cklI/O und der ADU-Takt clkADC angehalten werden, werden auch die Eingangspuffer des Bausteins abgeschaltet. Dadurch ist sichergestellt, dass kein Strom durch die Eingangslogik verbraucht wird, wenn es nicht notwendig ist. In einigen Fällen wird die Eingangslogik aber benötigt, um Aufwachbendingungen zu erkennen und bleibt daher eingeschaltet. Im Punkt Freigabe digitaler Eingänge und Schlafmodi sind weitere Details beschrieben. Wenn der Eingangspuffer freigegeben ist und das Eingangssignal ständig schwankt oder ein Analogsignal mit einer Spannung über UCC/2 ist, dann verbrauchen die digitalen Eingangspuffer sehr viel Strom.

    Für analoge Eingangspins sollten die digitalen Eingangspuffer grundsätzlich abgeschaltet werden. Ein Analogsignal bei ungefähr halber Betriebsspannung berursacht erheblichen Strom sogar im aktiven Betrieb. Digitale Eingangspuffer können durch Beschreiben von DIDR1 und DIDR0 deaktiviert werden.

    10.10.7 Integriertes Debug-System

    Wenn das integrierte Debug-System durch Programmieren der DWEN-Fuse aktiviert wurde und die Software einen Schlafmodus aktiviert, läuft der Haupttakt dennoch weiter und verbraucht Strom. In tieferen Schlafmodi ist dieser Anteil signifikant gegenüber der Gesamtstromaufnahme.

    11 Register-Beschreibung

    11.1 SMCR — Schlafmodus-Kontrolle

    Das Schlafmodus-Kontrollregister enthält Steuerbits für die Leistungsmanagement.

    Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x53) | - | - | - | - | SM2 | SM1 | SM0 | SE | SMCR
Zugriff | R | R | R | R | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
    • Bit 7:4 — reserviert
    Diese Bits sind ungenutzt und werden immer als 0 gelesen.
    • Bit 3:1 — SM[2:0]: Schlafmodus-Auswahlbits
    Mit diesen Bits wird eingestellt, in welchen Schlafmodus geschaltet werden soll.
    Tabelle 10-2: Schlafmodus-Auswahl
    SM2 | SM1 | SM0 | Schlafmodus
0 | 0 | 0 | Idle
0 | 0 | 1 | ADU-Störreduktion
0 | 1 | 0 | Leistung weg
0 | 1 | 1 | Leistung sparen
1 | 0 | 0 | reserviert
1 | 0 | 1
1 | 1 | 0 | Standby(1)
1 | 1 | 1 | Erweitertes Standby(1)
    Hinweis:
    1. Standby-Modi sind nur verfügbar, wenn Quarze oder Resonatoren verwendet werden.
    • Bit 0 — SE: Sleep-Freigabe
    Das SE-Bit muss gesetzt werden, um den Controller in den Schlafmodus zu setzen, wenn der Sleep-Befehl ausgeführt wird. Um zu verhindern, dass der Schlafmodus unkontrolliert eingeschaltet wird, sollte das Bit erst unmittelbar vor dem Sleep-Befehl gesetzt und nach dem Aufwachen gelöscht werden.

    11.2 MCUCR — Mikrocontroller-Kontrolle

    Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x55) | - | BODS(1) | BODSE(1) | PUD | - | - | IVSEL | IVCE | MCUCR
Zugriff | R | R/W↓ | R/W | R/W | R | R | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
    • Bit 6 — BODS: Unterspannungsdetektor-Schlaf(1)
    BODS muss auf 1 gesetzt werden, um den Unterspannungsdetektor während des Schlafmodus' auszuschalten, siehe Tabelle 10-1. Das Schreiben des BODS-Bits ist durch eine zeitbeschränkte Sequenz mit einem Freigabe-Bit, BODSE, eingeschränkt. Um den Unterspannungsdetektor in den relevanten Schlafmodi zu deaktivieren, muss zunächst sowohl BODS als auch BODSE auf 1 gesetzt werden. Dann muss, um BODS zu setzen, BODSE innerhalb von vier Taktzyklen auf 0 gesetzt werden.

    Das BODS-Bit ist drei Taktzyklen nach dem Setzen aktiv. Innerhalb dieser Zeit muss der Sleep-Befehl ausgeführt werden, damit der Unterspannungsdetektor schließlich abgeschaltet wird. BODS löscht sich automatisch nach drei Takten.

    • Bit 5 — BODSE: Unterspannungsdetektor-Schlaf-Freigabe(1)
    BODSE gibt den Schreibzugriff auf das BODS-Bit frei, wie oben bei BODS angegeben. Die Aktivierung des Unterspannungsdetektor-Schlafs ist durch eine zeitbegrenzte Sequenz auszuführen.
    Hinweis:
    1. BODS und BODSE sind nur bei den PicoPower-AVRs ATmega48PA, ATmega88PA, ATmega168PA und ATmega32P verfügbar.

    11.3 PRR — Leistungs-Reduktion

    Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x64) | PRTWI | PRTIM2 | PRTIM0 | - | PRTIM1 | PRSPI | PRUSART0 | PRADC | PRR
Zugriff | R/W | R/W | R/W | R | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
    • Bit 7 — PRTWI: Leistungsreduktion Zweidraht-Schnittstelle
    Eine logische Eins in PRTWI hält die Zweidraht-Schnittstelle an, indem die Taktversorgung abgetrennt wird. Bei Reaktivierung sollte die Schnittstelle für korrekte Funktion reinitialisiert werden.
    • Bit 6 — PRTIM2: Leistungsreduktion Zähler/Zeitgeber 2
    Eine logische Eins in PRTIM2 hält den Zähler/Zeitgeber 2 im synchronen Betrieb (AS = 0) an. Bei Reaktivierung setzt dieser an der Stelle vor dem Anhalten fort.
    • Bit 5 — PRTIM0: Leistungsreduktion Zähler/Zeitgeber 0
    Eine logische Eins in PRTIM0 hält den Zähler/Zeitgeber 0 an. Bei Reaktivierung setzt dieser an der Stelle vor dem Anhalten fort.
    • Bit 4 — reserviert
    Dieses Bit sind reserviert und wird stets als 0 gelesen.
    • Bit 3 — PRTIM1: Leistungsreduktion Zähler/Zeitgeber 1
    Eine logische Eins in PRTIM1 hält den Zähler/Zeitgeber 1 an. Bei Reaktivierung setzt dieser an der Stelle vor dem Anhalten fort.
    • Bit 2 — PRSPI: Leistungsreduktion SPI = Synchron-serielle Schnittstelle
    Wenn debugWire verwendet wird, sollte dieses Bit nie auf Eins gesetzt werden. Eine logische Eins in PRSPI hält die SPI-Schnittstelle an, indem die Taktversorgung abgetrennt wird. Bei Reaktivierung sollte die Schnittstelle für korrekte Funktion reinitialisiert werden.
    • Bit 1 — PRUSART0: Leistungsreduktion serielle Schnittstelle
    Eine logische Eins in PRUSART0 hält die serielle Schnittstelle an, indem die Taktversorgung abgetrennt wird. Bei Reaktivierung sollte die Schnittstelle für korrekte Funktion reinitialisiert werden.
    • Bit 0 — PRADC: Leistungsreduktion Analog-Digital-Wandler
    Eine logische Eins in PRADC hält den A/D-Wandler an. Vorher muss der A/D-Wandler ausgeschaltet sein (ADEN = 0). Der Analogvergleicher kann den Eingangsmultiplexer des A/D-Wandlers nicht verwenden, wenn der A/D-Wandler mit diesem Bit angehalten ist.


Systemkontrolle und Reset

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:
  • Power-on Reset. Der Controller wird neu gestartet, wenn die Versorgungsspannung unterhalb des Power-on-Reset Schwellwertes UPOT liegt.
  • Externer Reset. Der Controller wird neu gestartet, wenn ein Low-Pegel am RESET-Pin für länger als die minimale Länge eines Taktpulses anliegt.
  • Watchdog Reset. Der Controller wird neu gestartet, wenn bei freigeschaltetem Watchdog der Watchdog-Timer überläuft.
  • Brown-out Reset. Der Controller wird neu gestartet, wenn bei freigeschalteter Unterspannungserkennung die Versorgungsspannung unter den Unterspannungsdetektor-Schwellwert UBOT absinkt.
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

  • Getaktet von einem separaten On-Chip-Oszillator
  • 3 Betriebsarten
    • Interrupt
    • Reset
    • Interrupt und Reset
  • Auswählbare Zeitüberschreitung von 16 ms bis 8 s
  • Möglichkeit des Zwangs zum Watchdog mittels WDTON-Fuse für fehlersicheren Betrieb

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

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x54) | - | - | - | - | WDRF | BORF | EXTRF | PORF | MCUCSR
Zugriff | R | R | R | R | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | Siehe Bit-Beschreibung
  • Bit 7:4 — Res: Reservierte Bits
Diese Bits sind reserviert und werden immer als 0 gelesen.
  • Bit 3 — WDRF: Watchdog-Reset-Flag
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.
  • Bit 2 — BORF: Unterspannungs-Reset-Flag
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.
  • Bit 1 — EXTRF: Externer-Reset-Flag
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.
  • Bit 0 — PORF: Power-on-Reset-Flag
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

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x60) | WDIF | WDIE | WDP3 | WDCE | WDE | WDP2 | WDP1 | WDP0 | WDTCR
Zugriff | R/W! | R/W↓ | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | X | 0 | 0 | 0
  • Bit 7 — WDIF: Watchdog-Interrupt anhängig
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.

  • Bit 6 — WDIE: Watchdog-Interrupt-Freigabe
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) | WDE | WDIE | Betriebsart | Aktion bei Zeitüberschreitung
1 | 0 | 0 | inaktiv | keine
1 | 0 | 1 | Interrupt-Betrieb | Interrupt
1 | 1 | 0 | Reset-Betrieb | Reset
1 | 1 | 1 | Interrupt- und Reset-Betrieb | Interrupt, dabei Wechsel zu Reset-Betrieb
0 | x | x | Reset-Betrieb | Reset
Hinweis:
  1. WDTON-Fuse = „0“ bedeutet programmiert und „1“ bedeutet unprogrammiert.
  • Bit 4 — WDCE: Freigabe des Watchdog-Änderns
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.
  • Bit 3 — WDE: Watchdog-Freigabe
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.
  • Bit 5,[2:0] — WDP[3:0]: Watchdog-Zeitgeber-Vorteiler
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
WDP3 | WDP2 | WDP1 | WDP0 | WDT-Oszillator-Zyklen | Typische Zeitüberschreitung bei UCC = 5,0 V
0 | 0 | 0 | 0 | 2K (2048) | 16 ms
0 | 0 | 0 | 1 | 4K (4096) | 32 ms
0 | 0 | 1 | 0 | 8K (8192) | 64 ms
0 | 0 | 1 | 1 | 16K (16384) | 0,125 s
0 | 1 | 0 | 0 | 32K (32768) | 0,25 s
0 | 1 | 0 | 1 | 64K (65536) | 0,5 s
0 | 1 | 1 | 0 | 128K (131072) | 1 s
0 | 1 | 1 | 1 | 256K (262144) | 2 s
1 | 0 | 0 | 0 | 512K (524288) | 4 s
1 | 0 | 0 | 1 | 1024K (1048576) | 8 s
1 | 0 | 1 | 0 | reserviert
1 | 0 | 1 | 1
1 | 1 | 0 | 0
1 | 1 | 0 | 1
1 | 1 | 1 | 0
1 | 1 | 1 | 1


Interrupts

12. Interrupts

Dieser Abschnitt beschreibt die Behandlung der Interrupts.

Hinweise:

  1. Wenn die BOOTRST-Fuse programmiert ist, dann springt der Baustein an die Reset-Adresse im Urlader-Bereich
  2. Wenn das IVSEL-Bit im GICR-Register gesetzt ist, werden alle Interrupt-Vektoren an den Beginn des Boot-Sektors verschoben. Die Einsprungadresse der Interrupts ergibt sich dann aus der angegebenen Adresse plus der Startadresse des Urlader-Bereiches.
Die nachfolgenden Tabellen zeigen die Lage der Interrupt- und des Reset-Vektors bei den verschiedenen Kombinationen der BOOTRST- und IVSEL-Einstellungen. Wenn ein Programm nie Interrupts freigibt, so werden die Interrupt-Vektoren nicht benötigt, und das Hauptprogramm kann ab der Reset-Adresse liegen. Das gilt auch für den Fall, in dem der Reset-Vektor im Applikationsbereich und die Interrupt-Vektoren im Urlader-Bereich liegen bzw. umgekehrt.

12.1 Interruptvektoren im ATmega48

Tabelle 12-1: Reset- und Interruptvektoren im ATmega48
Vektor-Nr. | Flash-Adresse | Quelle | Definition
1 | 0x000 | RESET | External Pin, Power-on Reset, Brown-out Reset and Watchdog System Reset
2 | 0x001 | INT0 | Externer Interrupt 0
3 | 0x002 | INT1 | Externer Interrupt 1
4 | 0x003 | PCINT0 | Pegelwechsel-Interrupt 0
5 | 0x004 | PCINT1 | Pegelwechsel-Interrupt 1
6 | 0x005 | PCINT2 | Pegelwechsel-Interrupt 2
7 | 0x006 | WDT | Watchdog Time-out Interrupt
8 | 0x007 | TIMER2 COMPA | Zähler/Zeitgeber2 Compare Match A
9 | 0x008 | TIMER2 COMPB | Zähler/Zeitgeber2 Compare Match B
10 | 0x009 | TIMER2 OVF | Zähler/Zeitgeber2 Overflow
11 | 0x00A | TIMER1 CAPT | Zähler/Zeitgeber1 Capture Event
12 | 0x00B | TIMER1 COMPA | Zähler/Zeitgeber1 Compare Match A
13 | 0x00C | TIMER1 COMPB | Zähler/Zeitgeber1 Compare Match B
14 | 0x00D | TIMER1 OVF | Zähler/Zeitgeber1 Overflow
15 | 0x00E | TIMER0 COMPA | Zähler/Zeitgeber0 Compare Match A
16 | 0x00F | TIMER0 COMPB | Zähler/Zeitgeber0 Compare Match B
17 | 0x010 | TIMER0 OVF | Zähler/Zeitgeber0 Overflow
18 | 0x011 | SPI, STC | SPI Serielle Aussendung beendet
19 | 0x012 | USART, RX | USART: Datenbyte empfangen
20 | 0x013 | USART, UDRE | USART: Datenregister leer
21 | 0x014 | USART, TX | USART: Datenbyte gesendet
22 | 0x015 | ADC | Analog-Digital-Wandlung beendet
23 | 0x016 | EE READY | EEPROM bereit
24 | 0x017 | ANALOG COMP | Flanke am Analogvergleicher
25 | 0x018 | TWI | 2-wire Serial Interface
26 | 0x019 | SPM READY | Store Program Memory Ready

Typischerweise sieht es in einem Programm wie folgt aus:

Adresse	Marken	Kode			Kommentar
0x000		rjmp	RESET		; Reset-Behandler
0x001		rjmp	EXT_INT0	; IRQ0-Behandler
0x002		rjmp	EXT_INT1	; IRQ1-Behandler
0x003		rjmp	TIM2_COMP	; Timer2-Vergleich-Behandler
0x004		rjmp	TIM2_OVF	; Timer2-Überlauf-Behandler
0x005		rjmp	TIM1_CAPT	; Timer1-Schnappschuss-Behandler
0x006		rjmp	TIM1_COMPA	; Timer1-VergleichA-Behandler
0x007		rjmp	TIM1_COMPB	; Timer1-VergleichB-Behandler
0x008		rjmp	TIM1_OVF	; Timer1-Überlauf-Behandler
0x009		rjmp	TIM0_OVF	; Timer0-Überlauf-Behandler
0x00a		rjmp	SPI_STC		; Behandler bei SPI Übertragung komplett
0x00b		rjmp	USART_RXC	; USART-Empfang-Behandler
0x00c		rjmp	USART_UDRE	; UDR-leer-Behandler
0x00d		rjmp	USART_TXC	; USART-Gesendet-Behandler
0x00e		rjmp	ADC		; ADU-fertig-Behandler
0x00f		rjmp	EE_RDY		; EEPROM-fertig-Behandler
0x010		rjmp	ANA_COMP	; Analogvergleicher-Behandler
0x011		rjmp	TWSI		; TWI-Behandler
0x012		rjmp	SPM_RDY		; Behandler für SPM-Befehl fertig
;
0x013	RESET:	ldi	r16,high(RAMEND); Start des Hauptprogramms
0x014		out	SPH,r16		; Stapelzeiger auf RAM-Ende setzen
0x015		ldi	r16,low(RAMEND)
0x016		out	SPL,r16
0x017		sei			; Interrupts freigeben
0x018		<instr>	xxx
...		...	...

12.2 Interruptvektoren im ATmega88

Tabelle 12-2: Reset- und Interruptvektoren im ATmega88
Vektor-Nr. | Flash-Adresse(2) | Quelle | Definition
1 | 0x000(1) | RESET | External Pin, Power-on Reset, Brown-out Reset and Watchdog System Reset
2 | 0x001 | INT0 | Externer Interrupt 0
3 | 0x002 | INT1 | Externer Interrupt 1
4 | 0x003 | PCINT0 | Pegelwechsel-Interrupt 0
5 | 0x004 | PCINT1 | Pegelwechsel-Interrupt 1
6 | 0x005 | PCINT2 | Pegelwechsel-Interrupt 2
7 | 0x006 | WDT | Watchdog Time-out Interrupt
8 | 0x007 | TIMER2 COMPA | Zähler/Zeitgeber2 Compare Match A
9 | 0x008 | TIMER2 COMPB | Zähler/Zeitgeber2 Compare Match B
10 | 0x009 | TIMER2 OVF | Zähler/Zeitgeber2 Overflow
11 | 0x00A | TIMER1 CAPT | Zähler/Zeitgeber1 Capture Event
12 | 0x00B | TIMER1 COMPA | Zähler/Zeitgeber1 Compare Match A
13 | 0x00C | TIMER1 COMPB | Timer/Coutner1 Compare Match B
14 | 0x00D | TIMER1 OVF | Zähler/Zeitgeber1 Overflow
15 | 0x00E | TIMER0 COMPA | Zähler/Zeitgeber0 Compare Match A
16 | 0x00F | TIMER0 COMPB | Zähler/Zeitgeber0 Compare Match B
17 | 0x010 | TIMER0 OVF | Zähler/Zeitgeber0 Overflow
18 | 0x011 | SPI, STC | SPI Serial Transfer Complete
19 | 0x012 | USART, RX | USART Rx Complete
20 | 0x013 | USART, UDRE | USART, Data Register Empty
21 | 0x014 | USART, TX | USART, Tx Complete
22 | 0x015 | ADC | ADC Conversion Complete
23 | 0x016 | EE READY | EEPROM Ready
24 | 0x017 | ANALOG COMP | Analog Comparator
25 | 0x018 | TWI | 2-wire Serial Interface
26 | 0x019 | SPM READY | Store Program Memory Ready
Hinweise:
  1. Wenn die BOOTRST-Fuse programmiert ist, beginnt die Programmabarbeitung nach Reset an der Startadresse des Urlader-Bereiches. Siehe „Urlader-Unterstützung“
  2. Wenn das IVSEL-Bit im MCUCR gesetzt ist, befinden sich die Interruptvektoren am Beginn des Urlader-Bereichs. Die Adresse jedes Vektors ist dann um die Adresse am Beginn des Urlader-Bereichs verschoben.
Tabelle 12-3: Reset- und Interruptvektoren im ATmega88
BOOTRST | IVSEL | Reset-Adresse | Startadresse der Interruptvektoren
1 | 0 | 0x000 | 0x001
1 | 1 | 0x000 | Urlader-Reset-Adresse + 0x001
0 | 0 | Urlader-Reset-Adresse | 0x001
0 | 1 | Urlader-Reset-Adresse | Urlader-Reset-Adresse + 0x001
Hinweis:
  1. Die Urlader-Reset-Adresse ist in Table 27-7 zu sehen. Für die BOOTRST-Fuse gilt wie für alle Fuses: „1“ bedeutet unprogrammiert und „0“ bedeutet programmiert.

Wenn die BOOTRST-Fuse unprogrammiert ist, die Größe des Boot-Sektors 2 KByte beträgt und das IVSEL-Bit im GICR-Register gesetzt wird, bevor irgendein Interrupt freigegeben wird, dann sieht ein typisches Programm etwa so aus:

Adresse	Marken	Kode			Kommentar
0x000		rjmp	RESET		; Reset-Behandler
;
0x001	RESET:	ldi	r16,high(RAMEND); Start des Hauptprogramms
0x002		out	SPH,r16		; Stapelzeiger auf RAM-Ende setzen
0x003		ldi	r16,low(RAMEND)
0x004		out	SPL,r16
0x005		sei			; Interrupts freigeben
0x006		<instr>  xxx
;
.org 0xc01
0xc01		rjmp	EXT_INT0	; IRQ0-Behandler
0xc02		rjmp	EXT_INT1	; IRQ1-Behandler
...		...	...		;
0xc12		rjmp	SPM_RDY		; Behandler für SPM-Befehl fertig

Wenn die BOOTRST-Fuse programmiert ist und der Boot-Sektor eine Größe von 2 KByte hat, dann sieht eine Programm typischerweise so aus:

Adresse	Marken	Kode			Kommentar
.org 0x001
0x001		rjmp	EXT_INT0	; IRQ0-Behandler
0x002		rjmp	EXT_INT1	; IRQ1-Behandler
...		...	...		;
0x012		rjmp	SPM_RDY		; Behandler für SPM-Befehl fertig
;
.org 0xc00
0xc00		rjmp	RESET		; Reset-Behandler
;
0xc01	RESET:	ldi	r16,high(RAMEND); Start des Hauptprogramms
0xc02		out	SPH,r16		; Stapelzeiger auf RAM-Ende setzen
0xc03		ldi	r16,low(RAMEND)
0xc04		out	SPL,r16
0xc05		sei			; Interrupts freigeben
0xc06		<instr>  xxx

Wenn die BOOTRST-Fuse programmiert ist, die Größe des Boot-Sektors 2 KByte beträgt und das IVSEL-Bit im GICR-Register gesetzt wird, bevor irgendein Interrupt freigegeben wird, dann sieht ein typisches Programm etwa so aus:

Adresse	Marken	Kode			Kommentar
.org 0xc00
0xc00		rjmp	RESET		; Reset-Behandler
0xc01		rjmp	EXT_INT0	; IRQ0-Behandler
0xc02		rjmp	EXT_INT1	; IRQ1-Behandler
...		...	...		;
0xc12		rjmp	SPM_RDY		; Behandler für SPM-Befehl fertig
0xc13	RESET:	ldi	r16,high(RAMEND); Start des Hauptprogramms
0xc14		out	SPH,r16		; Stapelzeiger auf RAM-Ende setzen
0xc15		ldi	r16,low(RAMEND)
0xc16		out	SPL,r16
0xc17		sei			; Interrupts freigeben
0xc18		<instr>  xxx

12.3 Interruptvektoren im ATmega168

Tabelle 12-4: Reset- und Interruptvektoren im ATmega168
Vektor-Nr. | Flash-Adresse(2) | Quelle | Definition
1 | 0x000(1) | RESET | External Pin, Power-on Reset, Brown-out Reset and Watchdog System Reset
2 | 0x002 | INT0 | Externer Interrupt 0
3 | 0x004 | INT1 | Externer Interrupt 1
4 | 0x006 | PCINT0 | Pegelwechsel-Interrupt 0
5 | 0x008 | PCINT1 | Pegelwechsel-Interrupt 1
6 | 0x00A | PCINT2 | Pegelwechsel-Interrupt 2
7 | 0x00C | WDT | Watchdog Time-out Interrupt
8 | 0x00E | TIMER2 COMPA | Zähler/Zeitgeber2 Compare Match A
9 | 0x010 | TIMER2 COMPB | Zähler/Zeitgeber2 Compare Match B
10 | 0x012 | TIMER2 OVF | Zähler/Zeitgeber2 Overflow
11 | 0x014 | TIMER1 CAPT | Zähler/Zeitgeber1 Capture Event
12 | 0x016 | TIMER1 COMPA | Zähler/Zeitgeber1 Compare Match A
13 | 0x018 | TIMER1 COMPB | Timer/Coutner1 Compare Match B
14 | 0x01A | TIMER1 OVF | Zähler/Zeitgeber1 Overflow
15 | 0x01C | TIMER0 COMPA | Zähler/Zeitgeber0 Compare Match A
16 | 0x01E | TIMER0 COMPB | Zähler/Zeitgeber0 Compare Match B
17 | 0x020 | TIMER0 OVF | Zähler/Zeitgeber0 Overflow
18 | 0x022 | SPI, STC | SPI Serial Transfer Complete
19 | 0x024 | USART, RX | USART Rx Complete
20 | 0x026 | USART, UDRE | USART, Data Register Empty
21 | 0x028 | USART, TX | USART, Tx Complete
22 | 0x02A | ADC | ADC Conversion Complete
23 | 0x02C | EE READY | EEPROM Ready
24 | 0x02E | ANALOG COMP | Analog Comparator
25 | 0x030 | TWI | 2-wire Serial Interface
26 | 0x032 | SPM READY | Store Program Memory Ready
Hinweise:
  1. Wenn die BOOTRST-Fuse programmiert ist, beginnt die Programmabarbeitung nach Reset an der Startadresse des Urlader-Bereiches. Siehe „Urlader-Unterstützung“
  2. Wenn das IVSEL-Bit im MCUCR gesetzt ist, befinden sich die Interruptvektoren am Beginn des Urlader-Bereichs. Die Adresse jedes Vektors ist dann um die Adresse am Beginn des Urlader-Bereichs verschoben.
Tabelle 12-5: Reset- und Interruptvektoren im ATmega168
BOOTRST | IVSEL | Reset-Adresse | Startadresse der Interruptvektoren
1 | 0 | 0x000 | 0x002
1 | 1 | 0x000 | Urlader-Reset-Adresse + 0x002
0 | 0 | Urlader-Reset-Adresse | 0x002
0 | 1 | Urlader-Reset-Adresse | Urlader-Reset-Adresse + 0x002
Hinweis:
  1. Die Urlader-Reset-Adresse ist in Table 27-7 zu sehen. Für die BOOTRST-Fuse gilt wie für alle Fuses: „1“ bedeutet unprogrammiert und „0“ bedeutet programmiert.

12.4 Interruptvektoren im ATmega328

Tabelle 12-6: Reset- und Interruptvektoren im ATmega328
Vektor-Nr. | Flash-Adresse(2) | Quelle | Definition
1 | 0x000(1) | RESET | External Pin, Power-on Reset, Brown-out Reset and Watchdog System Reset
2 | 0x002 | INT0 | Externer Interrupt 0
3 | 0x004 | INT1 | Externer Interrupt 1
4 | 0x006 | PCINT0 | Pegelwechsel-Interrupt 0
5 | 0x008 | PCINT1 | Pegelwechsel-Interrupt 1
6 | 0x00A | PCINT2 | Pegelwechsel-Interrupt 2
7 | 0x00C | WDT | Watchdog Time-out Interrupt
8 | 0x00E | TIMER2 COMPA | Zähler/Zeitgeber2 Compare Match A
9 | 0x010 | TIMER2 COMPB | Zähler/Zeitgeber2 Compare Match B
10 | 0x012 | TIMER2 OVF | Zähler/Zeitgeber2 Overflow
11 | 0x014 | TIMER1 CAPT | Zähler/Zeitgeber1 Capture Event
12 | 0x016 | TIMER1 COMPA | Zähler/Zeitgeber1 Compare Match A
13 | 0x018 | TIMER1 COMPB | Timer/Coutner1 Compare Match B
14 | 0x01A | TIMER1 OVF | Zähler/Zeitgeber1 Overflow
15 | 0x01C | TIMER0 COMPA | Zähler/Zeitgeber0 Compare Match A
16 | 0x01E | TIMER0 COMPB | Zähler/Zeitgeber0 Compare Match B
17 | 0x020 | TIMER0 OVF | Zähler/Zeitgeber0 Overflow
18 | 0x022 | SPI, STC | SPI Serial Transfer Complete
19 | 0x024 | USART, RX | USART Rx Complete
20 | 0x026 | USART, UDRE | USART, Data Register Empty
21 | 0x028 | USART, TX | USART, Tx Complete
22 | 0x02A | ADC | ADC Conversion Complete
23 | 0x02C | EE READY | EEPROM Ready
24 | 0x02E | ANALOG COMP | Analog Comparator
25 | 0x030 | TWI | 2-wire Serial Interface
26 | 0x032 | SPM READY | Store Program Memory Ready
Hinweise:
  1. Wenn die BOOTRST-Fuse programmiert ist, beginnt die Programmabarbeitung nach Reset an der Startadresse des Urlader-Bereiches. Siehe „Urlader-Unterstützung“
  2. Wenn das IVSEL-Bit im MCUCR gesetzt ist, befinden sich die Interruptvektoren am Beginn des Urlader-Bereichs. Die Adresse jedes Vektors ist dann um die Adresse am Beginn des Urlader-Bereichs verschoben.
Tabelle 12-7: Reset- und Interruptvektoren im ATmega328
BOOTRST | IVSEL | Reset-Adresse | Startadresse der Interruptvektoren
1 | 0 | 0x000 | 0x002
1 | 1 | 0x000 | Urlader-Reset-Adresse + 0x002
0 | 0 | Urlader-Reset-Adresse | 0x002
0 | 1 | Urlader-Reset-Adresse | Urlader-Reset-Adresse + 0x002
Hinweis:
  1. Die Urlader-Reset-Adresse ist in Table 27-7 zu sehen. Für die BOOTRST-Fuse gilt wie für alle Fuses: „1“ bedeutet unprogrammiert und „0“ bedeutet programmiert.
A.d.Ü.: Das Laden von SPH und SPL (Stapelzeiger) nach RESET ist unnötig, da RESET bereits SPH und SPL korrekt initialisiert.

12.5 Register-Beschreibung

12.5.1 Interruptvektoren zwischen Anwender- und Urlader-Region umsetzen

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x55) | - | -BODS(1) | -BODSE(1) | PUD | – | – | IVSEL | IVCE | MCUCR
Zugriff | R | R/W | R/W | R/W | R | R | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Hinweis:
  1. BODS und BODSE sind nur in den PicoPower-Controllern ATmega48PA/88PA/168PA/32P verfügbar.
  • Bit 1 — IVSEL: Interruptvektor-Auswahl
Wenn das IVSEL-Bit gelöscht ist, liegen alle Interrupt-Vektoren am Anfang des Programmspeichers. Wenn das Bit auf 1 gesetzt wird, liegen alle Interrupt-Vektoren am Anfang des Urlader-Bereichs. Die tatsächliche Adresse des Anfangs des Urlader-Bereichs wird durch die BOOTSZ-Fuses bestimmt. Siehe Urlader-Unterstützung. Um unkontrollierte Verschiebungen der Interrupt-Vektoren zu verhindern, ist eine spezielle Sequenz für das Ändern des IVSEL-Bist erforderlich:
  1. Schreiben einer 1 in das IVCE-Bit
  2. Innerhalb von vier Taktzyklen den neuen Wert für das ICSEL-Bit einschreiben bei gleichzeitigem Löschen des IVCE-Bits.
Die Interrupts werden automatisch gesperrt, während diese Sequenz ausgeführt wird. Die Sperre beginnt mit dem Setzen des IVCE-Bits und sie bleibt so lange erhalten, bis der neue Wert in des ICSEL-Bit geschrieben wurde oder die vier Taktzyklen vorüber sind. Dass I-Bit im Status-Register bleibt von diesen Vorgängen unberührt.

Hinweis:
Wenn die Interrupt-Vektoren im Bootbereich liegen und das Boot-Sperr-Bit BLB02 programmiert ist, sind die Interrupts gesperrt, während der Programmteil im Applikationsbereich ausgeführt wird. Umgekehrt gilt, dass, wenn die Interrupt-Vektoren im Applikationsbereich liegen und das Boot-Sperr-Bit BLBV12 programmiert ist, die Interrupts gesperrt sind, wenn ein Programmteil im Bootbereich abgearbeitet wird.
  • Bit 0 — IVCE: Interruptvektor-Wechsel-Freigabe
Das Bit IVCE muss mit einer 1 beschrieben werden, um das Ändern des IVSEL-Bits freizugeben. Das IVCE-Bit wird durch die Hardware automatisch gelöscht, wenn nach dem Setzen des Bits vier Taktzyklen vergangen sind oder das ICSEL-Bit beschrieben wird. Durch das Setzen des IVCE-Bits werden alle Interrupts wie in den Erklärungen zum IVSEL-Bit beschrieben, gesperrt.
Beispiel in Assembler
Move_interrupts:
    ; Wechsel der Interruptvektoren erlauben
    ldi  r16, (1<<IVCE)
    out  GICR, r16
    ; Interruptvektoren zum Boot-Bereich umsetzen
    ldi  r16, (1<<IVSEL)
    out  GICR, r16
    ret
Beispiel in C
void Move_interrupts(void) {
  /* Wechsel der Interruptvektoren erlauben */
  GICR = (1<<IVCE);
  /* Interruptvektoren zum Boot-Bereich umsetzen */
  GICR = (1<<IVSEL);
}


Externe Interrupts

13. Externe Interrupts

Externe Interrupts können über die Eingänge INT0 und INT1 sowie einen Pegelwechsel an PCINT0 bis PCINT23 getriggert werden. Die Triggerung erfolgt auch dann, wenn die Pins als Ausgang konfiguriert sind. Dadurch können diese Interrupts auch per Software ausgelöst werden. Der Pegelwechsel-Interrupt 2 wird ausgelöst, wenn ein Pin aus PCINT[23:16] kippt. Der Pegelwechsel-Interrupt 1 wird ausgelöst, wenn ein Pin aus PCINT[14:8] kippt. Der Pegelwechsel-Interrupt 0 wird ausgelöst, wenn ein Pin aus PCINT[7:0] kippt. Die Maskierungsregister PCMSK2, PCMSK1 und PCMSK0 steuern schließlich, welche Pins zum Interrupt führen. Pegelwechsel-Interrupts an PCINT[23:0] sind asynchron und können dazu verwendet werden, den Chip aus einem Schlafmodus „tiefer“ als Idle zu wecken.

Die (althergebrachten) externen Interrupts INT0 und INT1 können durch eine fallende oder steigende Flanke oder durch einen Low-Pegel ausgelöst werden. Die entsprechende Einstellung erfolgt im Register EICRA. Wenn ein externer Interrupt freigegeben und als Low-Pegel-aktiv konfiguriert ist, dann wird der Interrupt so lange gehalten, wie der Low-Pegel am Pin anliegt. Das Erkennen von Interrupts mit fallender oder steigender Flanke setzt voraus, dass der I/O-Takt aktiv ist. Low-Pegel-Interrupts an INT0 und INT1 werden hingegen auch asynchron erkannt. Das bedeutet, dass diese Interrupts verwendet werden können, um den Chip aus allen Schlafmodi „tiefer“ als Idle aufzuwecken. Der I/O-Takt wird in allen Schlafmodi angehalten, außer bei Idle.

Hinweis
Zu beachten ist, dass, wenn ein Pegel-Interrupt dazu verwendet wird, den Chip aus dem Schlafmodus Leistung-weg aufzuwecken, der Pegel so lange gehalten werden muss, dass der Controller komplett aufwachen kann, um einen Interrupt auszulösen. Wenn der Pegel verschwindet, bevor die Hochlaufzeit abgelaufen ist, dann wird der Controller trotzdem aufwachen, aber keinen Interrupt generieren. Die Hochlaufzeit wird durch die SUT- und CKSEL-Fuses wie unter „Taktsystem“ beschrieben festgelegt.

13.1 Pegelwechsel-Zeiten

Bild 13-1: Zeitverlauf beim Pegelwechsel-Interrupt

13.2 Register-Beschreibung

13.2.1 EICRA — Kontrollregister A

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x69) | - | - | - | - | ISC11 | ISC10 | ISC01 | ISC00 | EICRA
Zugriff | R | R | R | R | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7:4 — reserviert
  • Bit 3, 2 — ISC1[1:0]: INT1-Auslöser Bit 1 und 0
Der externe Interrup1 wird über den Pin INT1 aktiviert, wenn das I-Bit im Statusregister und das dazugehörige Interrupt-Masken-Bit im GICR-Register gesetzt sind. Die Pegel und Flanken, die am INT1 Pin einen Interrupt auslösen, sind in nachfolgender Tabelle beschrieben. Der Wert des INT1 Pins wird abgetastet, bevor eine Flanke erkannt wird. Wenn Flanken oder wechselnde Pegel als den Interrupt auslösendes Ereignis ausgewählt werden, so müssen diese länger als eine Taktperiode andauern, damit sie einen Interrupt erzeugen. Kürzere Impulse führen nicht garantiert zum Auslösen eines Interrupts. Wenn Low-Pegel als auslösendes Ereignis ausgewählt wurde, so muss dieser mindestens so lange anliegen, bis der gerade ausgeführt Befehl komplett abgearbeitet ist.
Tabelle 13-1: Auslöser-Einstellungen für INT1
ISC11 | ISC10 | Modus
0 | 0 | Low-Pegel am INT1-Pin löst Interrupt aus
0 | 1 | Jeder logische Wechsel am INT1-Pin löst Interrupt aus
1 | 0 | Eine fallende Flanke am INT1-Pin löst Interrupt aus
1 | 1 | Eine steigende Flanke am INT1-Pin löst Interrupt aus
  • Bit 1, 0 — ISC0[1:0]: INT0-Auslöser Bit 1 und 0
Der externe Interrupt0 wird über den Pin INT0 aktiviert, wenn das I-Bit im Statusregister und das dazugehörige Interrupt-Masken-Bit im GICR Register gesetzt sind. Die Pegel und Flanken, die am INT0 Pin einen Interrupt auslösen, sind in nachfolgender Tabelle beschrieben. Der Wert des INT0 Pins wird abgetastet, bevor eine Flanke erkannt wird. Wenn Flanken oder wechselnde Pegel als den Interrupt auslösendes Ereignis ausgewählt werden, so müssen diese länger als eine Taktperiode andauern, damit sie einen Interrupt erzeugen. Kürzere Impulse führen nicht garantiert zum Auslösen eines Interrupts. Wenn Low-Pegel als auslösendes Ereignis ausgewählt wurde, so muss dieser mindestens so lange anliegen, bis der gerade ausgeführt Befehl komplett abgearbeitet ist.

Tabelle 13-2: Auslöser-Einstellungen für INT0
ISC01 | ISC00 | Modus
0 | 0 | Low-Pegel am INT0-Pin löst Interrupt aus
0 | 1 | Jeder logische Wechsel am INT0-Pin löst Interrupt aus
1 | 0 | Eine fallende Flanke am INT0-Pin löst Interrupt aus
1 | 1 | Eine steigende Flanke am INT0-Pin löst Interrupt aus

13.2.2 EIMSK — Interrupt-Maske

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x3D) | - | - | – | – | – | – | INT1 | INT0 | EIMSK
Zugriff | R | R | R | R | R | R | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
  • Bit 7:2 — reserviert
Diese Bits sind ungenutzt und werden immer als 0 gelesen.
  • Bit 1 — INT1: Externer Interrupt 1 Freigabe
Wenn das INT1-Bit gesetzt ist und das I-Bit in Status-Register (SREG) ebenfalls gesetzt ist, dann ist der externe Interrupt1 freigegeben. Mit den Interrupt Sense Control1 Bits 1 und 0 (ISC11 und ISC10) im General Control Register (MCUCR) wird festgelegt, bei welcher Bedingung ein externer Interrupt erkannt wird. Möglich sind: Steigende oder fallende Flanke, bei Pin-Wechsel oder bei Low-Pegel am INT1-Pin. Die Bedingungen am Pin INT1 werden auch dann eine Interruptanforderung veranlassen, wenn INT1 als Output konfiguriert ist. Die Interruptadresse für den Interrupt ist der Interrupt Vektor INT1.

  • Bit 0 — INT0: Externer Interrupt 0 Freigabe
Wenn das INT0-Bit gesetzt ist und das I-Bit in Status-Register (SREG) ebenfalls gesetzt ist, dann ist der externe Interrupt0 freigegeben. Mit den Interrupt Sense Control0 Bits 1 und 0 (ISC01 und ISC00) im General Control Register (MCUCR) wird festgelegt, bei welcher Bedingung ein externer Interrupt erkannt wird. Möglich sind: Steigende oder fallende Flanke, bei Pin-Wechsel oder bei Low-Pegel am INT0-Pin. Die Bedingungen am Pin INT0 werden auch dann eine Interruptanforderung veranlassen, wenn INT0 als Output konfiguriert ist. Die Interruptadresse für den Interrupt ist der Interrupt Vektor INT0.

13.2.3 EIFR — Interrupt-Flags

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x3C) | - | - | – | – | – | – | INTF1 | INTF0 | EIFR
Zugriff | R | R | R | R | R | R | R/W! | R/W!
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
  • Bit 7:2 — reserviert
Diese Bits sind ungenutzt und werden immer als 0 gelesen.
  • Bit 1 — INTF1: Externer Interrupt Flag1
Eine Flanke oder ein logischer Wechsel am INT1-Pin triggert eine Interruptanforderung und das INTF1-Bit wird gesetzt. Wenn das I-Bit im SREG und das INT1-Bit im GICR Register gesetzt sind, wird der Controller zum Interruptvektor INT1 springen. Das Flag wird gelöscht, wenn die Interrupt-Routine ausgeführt wurde. Alternativ kann das Flag gelöscht werden, indem man eine logische 1 in das Flag schreibt. Das Flag ist immer gelöscht, wenn INT1 als Pegel-Interrupt (Low-Pegel) eingestellt ist.

  • Bit 0 — INTF0: Externer Interrupt Flag0
Eine Flanke oder ein logischer Wechsel am INT0-Pin triggert eine Interruptanforderung und das INTF0-Bit wird gesetzt. Wenn das I-Bit im SREG und das INT0-Bit im GICR Register gesetzt sind, wird der Controller zum Interruptvektor INT0 springen. Das Flag wird gelöscht, wenn die Interrupt-Routine ausgeführt wurde. Alternativ kann das Flag gelöscht werden, indem man eine logische 1 in das Flag schreibt. Das Flag ist immer gelöscht, wenn INT0 als Pegel-Interrupt (Low-Pegel) eingestellt ist.

13.2.4 PCICR — Pegelwechselinterrupt-Kontrolle

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x68) | - | - | – | – | – | PCIE2 | PCIE1 | PCIE0 | PCICR
Zugriff | R | R | R | R | R | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
  • Bit 7:3 — reserviert
Diese Bits sind ungenutzt und werden immer als 0 gelesen.
  • Bit 2: PCIE2: Pegelwechsel-Interruptfreigabe 2
Wenn dieses Bit gesetzt ist und das I-Bit im Statusregister SREG gesetzt ist, löst ein Pegelwechsel an einem freigegebenen PCINT[23:16] einen Interrupt aus. Die Programmausführung verzweigt dann zum Interruptvektor PCI2. Jedes einzelne Pin kann im Register PCMSK2 freigegeben werden.
  • Bit 1: PCIE2: Pegelwechsel-Interruptfreigabe 1
Wenn dieses Bit gesetzt ist und das I-Bit im Statusregister SREG gesetzt ist, löst ein Pegelwechsel an einem freigegebenen PCINT[14:8] einen Interrupt aus. Die Programmausführung verzweigt dann zum Interruptvektor PCI1. Jedes einzelne Pin kann im Register PCMSK1 freigegeben werden.
  • Bit 0: PCIE2: Pegelwechsel-Interruptfreigabe 0
Wenn dieses Bit gesetzt ist und das I-Bit im Statusregister SREG gesetzt ist, löst ein Pegelwechsel an einem freigegebenen PCINT[7:0] einen Interrupt aus. Die Programmausführung verzweigt dann zum Interruptvektor PCI0. Jedes einzelne Pin kann im Register PCMSK0 freigegeben werden.

13.2.5 PCIFR — Pegelwechselinterrupt-Flags

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x3B) | - | - | – | – | – | PCIF2 | PCIF1 | PCIF0 | PCIFR
Zugriff | R | R | R | R | R | R/W! | R/W! | R/W!
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
  • Bit 7:3 — reserviert
Diese Bits sind ungenutzt und werden immer als 0 gelesen.
  • Bit 2: PCIF2: Pegelwechsel-Interrupt 2 anhängig
Ein Pegelwechsel an einem freigegebenen PCINT[23:16] löst eine Interruptanforderung aus, indem das zugehörige Bit aud Eins gesetzt wird. Wenn das Maskenbit PCIE2 und das I-Bit im Statusregister SREG gesetzt ist, verzweigt die Programmausführung zum Interruptvektor PCI2. Bei Ansprung der Interruptbehandlungsroutine wird das Bit automatisch gelöscht. Alternativ kann das Bit durch Schreiben einer Eins gelöscht werden.
  • Bit 1: PCIF2: Pegelwechsel-Interrupt 1 anhängig
Ein Pegelwechsel an einem freigegebenen PCINT[14:8] löst eine Interruptanforderung aus, indem das zugehörige Bit aud Eins gesetzt wird. Wenn das Maskenbit PCIE1 und das I-Bit im Statusregister SREG gesetzt ist, verzweigt die Programmausführung zum Interruptvektor PCI1. Bei Ansprung der Interruptbehandlungsroutine wird das Bit automatisch gelöscht. Alternativ kann das Bit durch Schreiben einer Eins gelöscht werden.
  • Bit 0: PCIF2: Pegelwechsel-Interrupt 0 anhängig
Ein Pegelwechsel an einem freigegebenen PCINT[7:0] löst eine Interruptanforderung aus, indem das zugehörige Bit aud Eins gesetzt wird. Wenn das Maskenbit PCIE0 und das I-Bit im Statusregister SREG gesetzt ist, verzweigt die Programmausführung zum Interruptvektor PCI0. Bei Ansprung der Interruptbehandlungsroutine wird das Bit automatisch gelöscht. Alternativ kann das Bit durch Schreiben einer Eins gelöscht werden.

13.2.6 PCMSK2 — Pegelwechsel-Maske 2

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x6D) | PCINT23 | PCINT22 | PCINT21 | PCINT20 | PCINT19 | PCINT18 | PCINT17 | PCINT16 | PCMSK2
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
  • Bit 7:0 — PCINT[23:16]: Pinweise Freigabe der Pegelwechsel-Erkennung
Jedes der Bits gibt die Logik zur Erkennung von Pegelwechseln frei (wenn Eins) oder sperrt diese (wenn Null). Ein erkannter Pegelwechsel führt zum Setzen der Interruptanforderung PCIE2 in PCICR und schließlich zum Interrupt, wenn freigegeben.

13.2.7 PCMSK1 — Pegelwechsel-Maske 1

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x6C) | - | PCINT14 | PCINT13 | PCINT12 | PCINT11 | PCINT10 | PCINT9 | PCINT8 | PCMSK1
Zugriff | R | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
  • Bit 7 — reserviert
Dieses Bit ist ungenutzt und wird immer als 0 gelesen.
  • Bit 6:0 — PCINT[14:8]: Pinweise Freigabe der Pegelwechsel-Erkennung
Jedes der Bits gibt die Logik zur Erkennung von Pegelwechseln frei (wenn Eins) oder sperrt diese (wenn Null). Ein erkannter Pegelwechsel führt zum Setzen der Interruptanforderung PCIE1 in PCICR und schließlich zum Interrupt, wenn freigegeben.

13.2.8 PCMSK0 — Pegelwechsel-Maske 0

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x6B) | PCINT7 | PCINT6 | PCINT5 | PCINT4 | PCINT3 | PCINT2 | PCINT1 | PCINT0 | PCMSK0
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
  • Bit 7:0 — PCINT[7:0]: Pinweise Freigabe der Pegelwechsel-Erkennung
Jedes der Bits gibt die Logik zur Erkennung von Pegelwechseln frei (wenn Eins) oder sperrt diese (wenn Null). Ein erkannter Pegelwechsel führt zum Setzen der Interruptanforderung PCIE0 in PCICR und schließlich zum Interrupt, wenn freigegeben.


I/O Ports

14. I/O-Ports

14.1 Übersicht

Alle AVR-Ports bieten eine echte lesen–verändern–schreiben-Funktion, wenn sie als allgemeine digitale I/O-Ports verwendet werden. Das bedeutet, dass die Richtung eines einzelnen Port-Pins verändert werden kann, ohne dass die Richtung der anderen Pins beeinflusst wird, wenn man die SBI- und CBI-Befehle verwendet. Das gleiche gilt für das Ändern der Ausgangszustände einzelner Pins (wenn diese als Ausgang konfiguriert sind) oder für das Ein- und Ausschalten der Pullup-Widerstände, wenn die Pins als Eingänge fungieren. Jeder Pin hat einen symmetrischen Treiber, der sowohl positive als auch negative Ströme liefert, so dass an jeden Pin eine LED direkt angeschlossen werden kann. Alle Pins haben einen einzeln an- und abschaltbaren Pullup-Widerstand dessen Größe unabhängig von der Versorgungsspannung ist. Ferner haben alle Portpins zwei Schutzdioden die gegen UCC und Masse geschaltet sind. Siehe Elektrische Eigenschaften.
Bild 14-1: I/O-Pin-Beschaltung
Alle Ports und deren Pins werden nachfolgend allgemein beschrieben. Der Index „x“ steht für die Bezeichnung des Ports, der Index „n“ für die Nummer des Pins. In einem Programm müssen die Port- und Pin-Angaben in präziser Form angegeben werden. PORTB3 steht also für das Bit 5 von Port B. Die entsprechenden Register sind unter Registerbeschreibung gelistet.

Für jeden Port stehen drei Register im I/O-Speicher zur Verfügung. Ein Daten-Register (PORTx), ein Richtungs-Register (DDRx) und eins für die Port Eingang-Pins (PINx). Die Port Eingang-Pin Register können nur gelesen werden, während die Daten- und die Richtungs-Register gelesen und beschrieben werden können. Zusätzlich können mit dem Pullup-Disable-Bit (PUD) im SFIOR-Register alle Pullup-Widerstände ausgeschaltet werden.

Die Verwendung der Portpins als digitale Ein- und Ausgänge wird nachfolgend beschrieben. Darüber hinaus haben viele Pins noch alternative Funktionen, die die periphere Funktionen des Bausteins unterstützen. Wie die alternativen Funktionen mit den Portpins zusammenhängen, wird im folgenden beschrieben, die detaillierten Funktionen sind dann in den Kapiteln zu den peripheren Modulen beschrieben. Das Verwenden eines Portpins mit seiner alternativen Funktion hat keinen Einfluss auf die anderen Pins eines Ports, die als digitale Ein- Ausgänge verwendet werden.

14.2 Ports als digitale Ein- und Ausgänge

Die Ports sind bidirektionale I/O-Ports mit optional zuschaltbaren internen Pullup-Widerständen. Nachfolgende Abbildung zeigt die interne Schaltung eines Portpins.
Bild 14-2: Digitale Port-Pins
Hinweis:
  1. WPx, WDx, RRx, RPx und RDx sind mit allen Pins eines Ports verbunden, clkI/O, SLEEP und PUD sind mit allen Ports verbunden.

14.2.1 Konfiguration der Pins

Jeder Port Pin korrespondiert mit drei Bits in den drei Registern DDRx, PORTx und PINx.

Das DDxn-Bit im DDRx-Register legt die Richtung des Pins fest. Wenn das DDxn-Bit mit einer logischen 1 beschrieben wird, dann ist der Pin als Ausgang konfiguriert. Ist das DDxn-Bit gelöscht, so arbeitet das Pin als Eingang.

Wenn das PORTxn-Bit mit einer logischen 1 beschrieben wird und das Pin als Eingang konfiguriert ist, dann sind die internen Pullup-Widerstände eingeschaltet. Um die Pullup-Widerstände auszuschalten, muss das PORTxn-Bit mit einer Null beschrieben werden oder das Pin als Ausgang konfiguriert werden. Die Portpins gehen in Tristate, wenn ein Reset auftritt, auch wenn keiner der Takte läuft.

Wenn das PORTxn-Bit mit einer logischen 1 beschrieben wird und der Pin als Ausgang konfiguriert ist, so wird der Port Pin auf High gesetzt. Umgekehrt wird der Port Pin auf Low gesetzt, wenn das PORTxn-Bit mit einer Null beschrieben wird während der Pin als Ausgang konfiguriert ist.

14.2.2 Pin kippen

Das Schreiben einer logischen Eins auf PINxn kippt den Wert von PORTxn, unabhängig vom Wert in DDRxn. Ein SBI-Befehl kann verwendet werden, um ein einzelnes Bit an einem Port zu kippen.
Der AVR muss dazu eine spezielle Befehlsabarbeitungslogik für SBI auf PINx-Register haben. Normalerweise würde man erwarten, dass SBI auf PINx zusätzlich alle PORTxn-Bits kippt, wo PINxn Eins ist.

14.2.3 Wechseln zwischen Ein- und Ausgang

Wenn ein Port Pin zwischen Tristate (DDxn, PORTxn = 00) und Ausgang mit High (DDxn, PORTxn = 11) umgeschaltet werden soll, so muss ein Zwischenschritt eingeführt werden, in dem entweder die Pullup-Widerstände eingeschaltet werden (DDxn, PORTxn = 01) oder der Ausgang zunächst auf Low geschaltet wird (DDxn, PORTxn = 10). Normalerweise ist das Einschalten der Pullup-Widerstände ausreichend, wenn die angeschlossene Schaltung so hochohmig ist, dass ein echtes High am Port Pin keinen Unterschied zu einem High über einen Pullup-Widerstand darstellt. Wenn dies nicht der Fall ist, können die Pullup-Widerstände mit dem PUD-Bit im SFIOR-Register für alle Ports ausgeschaltet werden.

Ein Umschalten zwischen Eingang mit Pullup-Widerstand und Ausgang mit Low-Pegel stellt das gleiche Problem dar. Hier muss der Anwender einen Zwischenschritt über Tristate (DDxn, PORTxn = 00) oder Ausgang mit High-Pegel (DDxn, PORTxn = 11) durchführen.

Tabelle 14-1: Konfiguration eines Portpins
DDxn | PORTxn | PUD(im MCUCR) | I/O | Pullup | Kommentar
0 | 0 | X | Eingang | Nein | hochohmig (Tristate, Hi-Z)
0 | 1 | 0 | Eingang | Ja | Pxn liefert Strom wenn von außen nach Low gezogen
0 | 1 | 1 | Eingang | Nein | hochohmig (Tristate, Hi-Z)
1 | 0 | X | Ausgang | Nein | Ausgang Low (Stromsenke)
1 | 1 | X | Ausgang | Nein | Ausgang High (Stromquelle)

14.2.4 Pinzustand lesen

Unabhängig davon, ob ein Pin als Ausgang oder als Eingang konfiguriert ist, kann der Portpin über das PINxn Register Bit eingelesen werden. Wie aus der internen Schaltung eines Port Pins ersichtlich wird, bilden das PINxn Register Bit und das vorgeschaltete Latch einen Synchronisierer. Dieser ist erforderlich um unstabile Zustände zu vermeiden, wenn der physikalische Port seinen Wert in der Nähe einer Flanke des internen Taktes ändert. Allerdings wird dadurch auch eine Verzögerung verursacht. Das nachfolgende Bild zeigt das Zeitdiagramm beim Lesen eines extern angelegten Pinzustandes. Die maximal und minimal auftretende Verzögerung werden als tpdmax und tpdmin bezeichnet.
Bild 14-3: Synchronisation beim Lesen des Pinzustands
Man beachte, dass die Taktperiode unmittelbar nach der fallenden Flanke des Systemtaktes beginnt. Das Latch ist geschlossen, solange der Takt auf Low ist, und wird transparent, wenn der Takt auf High ist, was durch die schraffiert Fläche angedeutet ist. Der Eingangszustand des Pins wird dann mit der fallenden Flanke des Systemtaktes in das Latch gespeichert und mit der darauffolgenden positiven Flanke in das PINxn Register übernommen. Dadurch wird die Übernahme eines neuen Zustandes an einem Portpin mit einer Verzögerung zwischen ½ und 1½ Takten durchgeführt.

Wenn der durch die Software eingestellte Wert des Pins ausgelesen werden soll, muss ein NOP-Befehl wie nachfolgend dargestellt eingefügt werden, bevor der Wert wieder ausgelesen werden kann. Der OUT-Befehl setzt das SYNC LATCH Signal mit der positiven Flanke des Taktes, erst bei der darauf folgenden positiven Flanke wird der Wert dann in das PINxn Register übernommen und kann wieder ausgelesen werden. In diesem Fall beträgt die Verzögerung tpd durch den Synchronisierer 1 Taktzyklus.

Bild 14-4: Synchronisation beim Rücklesen eines Ausgabeports
Das nachfolgende Beispiel zeigt, wie die Pins 0 und 1 von Port B auf High sowie die Pins 2 und 3 auf Low gesetzt werden. Gleichzeitig werden die Pins 4 bis 7 als Eingänge konfiguriert und die Pins 6 und 7 mit den internen Pullup-Widerständen versehen. Die Werte der Pins werden zurückgelesen, nachdem wie zuvor besprochen ein NOP-Befehl ausgeführt wurde.
Beispiel in Assembler
    ...
    ; Define pull-ups and set outputs high
    ; Define directions for port pins
    ldi  r16,(1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0)
    ldi  r17,(1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0)
    out  PORTB,r16
    out  DDRB,r17
    ; Insert nop for synchronization
    nop
    ; Read port pins
    in   r16,PINB
    ...
Beispiel in C
unsigned char i;
  ...
  /* Define pull-ups and set outputs high */
  /* Define directions for port pins */
  PORTB = (1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0);
  DDRB = (1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0);
  /* Insert nop for synchronization */
  __no_operation();
  /* Read port pins */
  i = PINB;
  ...
Hinweis:
  1. Die temporären Register R16 und R17 werden verwendet, um die Zeit zu minimieren, in der die Pullup-Widerstände an den Pins 0, 1, 6 und 7 gesetzt werden und während die Richtungsbits korrekt eingestellt sind und die Bits 2 und 2 als Low und die Bits 0 und 1 als High getriebene Ausgänge eingestellt werden.

14.2.5 Freigabe Digitale Eingang und Sleep Modi

Wie in der internen Schaltung des Pins zu sehen ist, kann das digitale Eingangssignal am Eingang des Schmitt-Triggers an Masse geschaltet werden. Dieses Signal ist in der Schaltung mit SLEEP bezeichnet und wird durch den Controller im Power-down, ower-save und Standby-Modus erzeugt, um in diesen Modi einen hohen Stromverbrauch zu verhindern, der durch schwankende Eingangssignale oder analoge Eingangssignale über UCC/2 entstehen kann.

SLEEP wird bei Port Pins, die als externer Interrupt freigegeben sind, außer Kraft gesetzt. Wenn der externe Interrupt nicht freigegeben ist, beeinflusst das SLEEP Signal auch diese Pins. Das SLEEP Signal wird ebenfalls nicht wirksam, wenn die alternativen Funktionen des Port Pins verwendet werden.

Wenn ein logischer High-Pegel bei einem als asynchroner externer Interrupt konfigurierten Pin, mit Interrupt bei steigender oder fallender Flanke oder bei Wechsel der logischen Zustandes am Pin, während der externe Interrupt nicht freigegeben ist anliegt, wird das dazugehörige Interrupt Flag gesetzt, wenn aus den o.g. Sleep Modi zurückgekehrt wird und diese das Festhalten von Pegeländerungen beinhalten.

14.2.6. Unbenutzte Pins

Wenn Pins nicht verwendet werden, so sollten diese auf einen definierten Pegel gelegt werden. Selbst wenn die meisten digitalen Eingänge in den unteren Sleep-Modi wie oben beschrieben abgeschaltet sind, sollten offene Eingänge vermieden werden, um den Stromverbrauch in den anderen Modi, in denen die Eingänge eingeschaltet sind, zu reduzieren.

Die einfachste Möglichkeit, einen definierten Pegel an einem unbeschalteten Eingang zu erreichen, ist das Einschalten der internen Pullup-Widerstände. In diesem Fall werden die internen Pullup-Widerstände aber während eines Resets abgeschaltet. Wenn ein geringer Stromverbrauch während eines Resets notwendig ist, dann sollten also besser externe Pullup- oder Pulldown-Widerstände verwendet werden. Die ungenutzten Pins direkt mit UCC oder GND zu verbinden ist nicht empfehlenswert, da in den Fällen, in denen sie versehentlich als Ausgänge konfiguriert werden, sehr hohe Ströme fließen können.

14.3 Alternative Port-Funktionen

Die meisten Portpins haben zusätzlich zu ihren digitalen Funktionen noch weitere alternative Funktionen. Die nachfolgende Abbildung zeigt die Kontrollsignale für die Portpins, die die alternativen Funktionen bedienen. Die die digitalen Funktionen überlagernden Signale sind nicht an allen Portpins präsent, die Abbildung zeigt daher lediglich die allgemeine Schaltung zur Steuerung der alternativen Funktionen der AVR Controller.
Bild 14-5: Alternative Port-Funktionen(1)
Hinweis:
  1. WPx, WDx, RRx, RPx und RDx sind mit allen Pins eines Ports verbunden, clkI/O, SLEEP und PUD sind mit allen Ports verbunden.
Die nachfolgende Tabelle fasst die Funktionen der überschreibenden Signale zusammen. Die Pin- und Port-Indizes vom Bild oben sind nicht dargestellt. Die überschreibenden Signale werden intern durch die Module mit den alternativen Funktionen erzeugt.

Tabelle 14-2: Allgemeine Beschreibung der überschreibenden Signalee für alternative Port-Funktionen
Signalname | Bedeutung | Beschreibung
PUOE | Pullup Override Freigabe | Wenn dieses Signal gesetzt ist, wird die Freigabe der Pull-up-Widerstände durch das Signal PUOV kontrolliert. Wenn dieses Signal gelöscht ist, sind die Pull-up Widerstände freigegeben, wenn DDxn, PORTxn, PUD = 010 sind.
PUOV | Pullup Override Wert | Wenn PUOE gesetzt ist, werden die Pull-up Widerstände freigegeben/gesperrt, wenn PUOV gesetzt/gelöscht ist, unabhängig vom Zustand der DDxn, PORTxn und PUD Register Bits.
DDOE | Datenrichtungs-Überschreib-Freigabe | Wenn dieses Signal gesetzt ist, wird die Freigabe des Ausgangstreibers mit dem DDOV-Signal kontrolliert. Wenn das DDOE Signal gelöscht ist, wird der Ausgangstreiber durch das DDxn Bit freigegeben.
DDOV | Datenrichtungs-Überschreib-Wert | Wenn DDOE gesetzt ist, werden die Ausgangstreiber freigegeben/gesperrt, wenn das DDOV-Signal gesetzt/gelöscht ist, unabhängig vom Zustand der DDxn Register Bits.
PVOE | Port-Ausgabe-Überschreib-Freigabe | Wenn dieses Signal gesetzt ist und der Ausgangstreiber freigegeben ist, wird der Zustand des Ports durch das PVOV Signal kontrolliert. Ist das PVOE Signal gelöscht und der Ausgangstreiber freigegeben, so wird der Zustand des Ports über die PORTxn Register Bits kontrolliert.
PVOV | Port-Ausgabe-Überschreib-Wert | Wenn PVOE gesetzt ist, dann wird der Zustand des Ports durch das PVOV Signal bestiummt, unabhängig von den Einstellungen des PORTxn Register Bits.
DIEOV | Digitale Eingangsfreigabe-Überschreib-Freigabe | Wenn dieses Bit gesetzt ist, wird die Freigabe der digitalen Eingänge durch das DIEOV Signal gesteuert. Wenn das Signal gelöscht ist, wird die Freigabe der digitalen Eingänge dadurch bestimmt, ob sich der Controller im normalen Modus befindet oder in einem Sleep Modus.
DIEOV | Digitale Eingangsfreigabe-Überschreib-Wert | Wenn das DIEOE Signal gesetzt ist, werden die digitalen Eingänge freigegeben/gesperrt, wenn das DIEOV Signal gesetzt/gelöscht ist, unabhängig davon, ob sich der Controller im normalen Modus befindet oder in einem Sleep Modus.
DI | Digitaler Eingang | Dies ist der digitale Eingang für die alternativen Funktionen. Die Schaltung zeigt, dass dieses Signal am Ausgang des Schmitt-Triggers aber vor dem Synchronisierer abgegriffen wird. Außer wenn der digitale Eingang als Taktquelle verwendet wird, benutzen die alternativen Funktionen einen eigenen Synchronisierer.
AIO | Analoger Ein-/Ausgang | Dies ist der analoge Eingang/Ausgang zu/von den alternativen Funktionen. Das Signal ist direkt mit dem Pin verbunden und kann bidirektional verwendet werden.
Nachfolgend wird ein kurzer Überblick über die alternativen Funktionen der einzelnen Port Pins und den dazugehörigen übergeordneten Signalen gegeben. Eine ausführlichere Beschreibung der alternativen Funktionen geben die einzelnen Kapitel.

14.3.1 Alternative Funktionen von Port B

Port B bietet folgende alternative Funktionen:
Tabelle 14-3: Port B Alternative Funktionen
Portpin | Alternative Funktionen
PB7 | XTAL2 (Chip Clock Oszillator-Ausgang) TOSC2 (Zähler/Zeitgeber2 Oszillator-Ausgang) PCINT7 (Pegelwechselinterrupt 7)
PB6 | XTAL1 (Chip Clock Oszillator-Eingang oder externer Takteingang) TOSC1 (Zähler/Zeitgeber2 Oszillator-Eingang) PCINT6 (Pegelwechselinterrupt 6)
PB5 | SCK (SPI Bus Master Takteingang) PCINT5 (Pegelwechselinterrupt 5)
PB4 | MISO (SPI Bus Master Eingang / Slave Ausgang) PCINT4 (Pegelwechselinterrupt 4)
PB3 | MOSI (SPI Bus Master Ausgang / Slave Eingang) OC2A (Zähler/Zeitgeber2 Ausgang Compare Match A) PCINT3 (Pegelwechselinterrupt 3)
PB2 | SS (SPI Bus Master Slave select) OC1B (Zähler/Zeitgeber1 Ausgang Compare Match B) PCINT2 (Pegelwechselinterrupt 2)
PB1 | OC1A (Zähler/Zeitgeber1 Ausgang Compare Match A) PCINT1 (Pegelwechselinterrupt 1)
PB0 | ICP1 (Zähler/Zeitgeber1 Capture-Eingang) CLKO (Geteilter Systemtakt-Ausgang) PCINT0 (Pegelwechselinterrupt 0)
Die alternativen Funktionen sind wie folgt:
  • PB7 — XTAL2/TOSC2/PCINT7:
XTAL2: Wird als Pin für externe Quarzoszillatoren verwendet. Wenn dieser Pin als Takt Pin verwendet wird, kann er nicht als digitaler I/O-Pin verwendet werden.

TOSC2: Wird nur verwendet, wenn der interne RC-Oszillator als Taktquelle für den Baustein ausgewählt wurde und der asynchrone Zeitgeber durch die richtigen Einstellungen im ASSR Register freigegeben wurde. Wenn das AS2 Bit im ASSR Register gesetzt ist um die asynchrone Taktung von Zähler/Zeitgeber2 freizugeben, wird PB7 von dem Port getrennt und wird zum invertierenden Ausgang des Oszillatorverstärkers. In diesem Modus wird ein Quarzoszillator an den Pin angeschlossen, der Pin kann dann nicht als digitaler I/O verwendet werden.

Wenn PB7 als Taktpin verwendet wird, werden DDB7, PORTB7 und PINB7 immer als 0 gelesen.

PCINT7: Pegelwechsel-Interruptquelle Nummer 7. Das Pin kann als externe Interruptquelle dienen.

  • PB6 — XTAL1/TOSC1/PCINT6:
XTAL1: Wird als Pin für alle Taktquellen des Bausteins, außer den internen RC-Oszillator verwendet. Wenn dieser Pin als Takt Pin verwendet wird, kann er nicht als digitaler I/O-Pin verwendet werden.

TOSC1: Wird nur verwendet, wenn der interne RC-Oszillator als Taktquelle für den Baustein ausgewählt wurde und der asynchrone Zeitgeber durch die richtigen Einstellungen im ASSR Register freigegeben wurde. Wenn das AS2 Bit im ASSR Register gesetzt ist um die asynchrone Taktung von Zähler/Zeitgeber2 freizugeben, wird PB6 von dem Port getrennt und wird zum Eingang des invertierenden Oszillatorverstärkers. In diesem Modus wird ein Quarzoszillator an den Pin angeschlossen, der Pin kann dann nicht als digitaler I/O verwendet werden.

Wenn PB6 als Takt Pin verwendet wird, werden DDB6, PORTB6 und PINB6 immer als 0 gelesen.

PCINT6: Pegelwechsel-Interruptquelle Nummer 6. Das Pin kann als externe Interruptquelle dienen.

  • PB5 — SCK/PCINT5:
SCK: Master Clock Ausgang, Slave Clock Eingang für den SPI Kanal. Wenn die SPI als Slave freigegeben ist, ist dieser Pin als Eingang konfiguriert, unabhängig von den Einstellungen des DDB5 Bits. Wenn die SPI als Master freigegeben ist, wird die Datenrichtung dieses Pins mit dem DDB5 Bit kontrolliert. Wenn dieser Pin durch die SPI als Eingang verwendet wird, kann der pull-up Widerstand weiterhin mit dem PORTB5 Bit ein- und ausgeschaltet werden.

PCINT5: Pegelwechsel-Interruptquelle Nummer 5. Das Pin kann als externe Interruptquelle dienen.

  • PB4 — MISO/PCINT4:
MISO: Master Data Eingang, Slave Data Ausgang für den SPI Kanal. Wenn die SPI als Master freigegeben ist, ist dieser Pin als Eingang konfiguriert, unabhängig von den Einstellungen des DDB4 Bits. Wenn die SPI als Slave freigegeben ist, wird die Datenrichtung dieses Pins mit dem DDB4 Bit kontrolliert. Wenn dieser Pin durch die SPI als Eingang verwendet wird, kann der pull-up Widerstand weiterhin mit dem PORTB4 Bit ein und ausgeschaltet werden.

PCINT4: Pegelwechsel-Interruptquelle Nummer 4. Das Pin kann als externe Interruptquelle dienen.

  • PB3 — MOSI/OC2A/PCINT3:
MOSI: Master Data Ausgang, Slave Data Eingang für den SPI Kanal. Wenn die SPI als Slave freigegeben ist, ist dieser Pin als Eingang konfiguriert, unabhängig von den Einstellungen des DDB3 Bits. Wenn die SPI als Master freigegeben ist, wird die Datenrichtung dieses Pins mit dem DDB3 Bit kontrolliert. Wenn dieser Pin durch die SPI als Eingang verwendet wird, kann der pull-up Widerstand weiterhin mit dem PORTB3 Bit ein und ausgeschaltet werden.

OC2: (Output Compare 2) Das Pin kann als Ausgang für den Zähler/Zeitgeber2 Compare Match dienen. Damit kann dieses PWM-Signale ausgeben. Das Pin muss hierfür als Ausgang konfiguriert werden (DDB3 auf 1 setzen).

PCINT3: Pegelwechsel-Interruptquelle Nummer 3. Das Pin kann als externe Interruptquelle dienen.

  • PB2 — SS/OC1B/PCINT2:
SS: (Slave Select) Wenn das SPI als Slave freigegeben ist, ist dieser Pin als Eingang konfiguriert, unabhängig von den Einstellungen des DDB2 Bits. Als Slave wird die SPI aktiviert, wenn dieser Pin auf Low gesetzt wird. Wenn die SPI als Master freigegeben ist, wird die Datenrichtung dieses Pins durch das DDB2-Bit kontrolliert. Wenn dieser Pin durch die SPI als Eingang verwendet wird, kann der Pullup-Widerstand weiterhin mit dem PORTB2-Bit ein und ausgeschaltet werden.

OC1B: (Output Compare 1 B) Das Pin kann als Ausgang für den Zähler/Zeitgeber1 Compare Match B dienen. Damit kann dieses PWM-Signale ausgeben. Das Pin muss hierfür als Ausgang konfiguriert werden (DDB2 auf 1 setzen).

PCINT2: Pegelwechsel-Interruptquelle Nummer 2. Das Pin kann als externe Interruptquelle dienen.

  • PB1 — OC1A/PCINT1:
OC1A: (Output Compare 1 A) Das Pin kann als Ausgang für den Zähler/Zeitgeber1 Compare Match A dienen. Damit kann dieses PWM-Signale ausgeben. Das Pin muss hierfür als Ausgang konfiguriert werden (DDB1 auf 1 setzen).

PCINT1: Pegelwechsel-Interruptquelle Nummer 1. Das Pin kann als externe Interruptquelle dienen.

  • PB0 — ICP1/CLKO/PCINT0:
ICP1: (Input Capture 1) Capture-Eingang. Der PB0 Pin kann als Eingangspin für die Capture-Funktion des Zähler/Zeitgeber1 verwendet werden.

Die nachfolgenden Tabellen zeigen die alternativen Funktionen von Port B und deren übergeordneten Signale. SPI MSTR INPUT und SPI SLAVE OUTPUT bilden das MISO Signal, während das MOSI Signal in SPI-Master-Ausgang und SPI-Slave-Eingang aufgeteilt wird.

PCINT0: Pegelwechsel-Interruptquelle Nummer 0. Das Pin kann als externe Interruptquelle dienen.

Tabelle 14-4 und Tabelle 14-5 setzen die alternativen Functionen von Port B in Verhältnis zu den überschreibenden Signalen im Bild 14-5. SPI-Master-Eingang und SPI-Slave-Ausgang bilden das MISO-Signal, während MOSI entweder SPI-Master-Ausgang und SPI-Slave-Eingang ist.

Tabelle 14-4: Überschreibende Signale für alternative Funktionen für PB7..PB4
Signalname | PB7/XTAL2/ TOSC2/PCINT7(1) | PB6/XTAL1/ TOSC1/PCINT6(1) | PB5/SCK/ PCINT5 | PB4/MISO/ PCINT4
PUOE | INTRC • EXTCK + AS2 | INTRC + AS2 | SPE • MSTR | SPE • MSTR
PUOV | 0 | 0 | PORTB5 • PUD | PORTB4 • PUD
DDOE | INTRC • EXTCK + AS2 | INTRC + AS2 | SPE • MSTR | SPE • MSTR
DDOV | 0 | 0 | 0 | 0
PVOE | 0 | 0 | SPE • MSTR | SPE • MSTR
PVOV | 0 | 0 | SCK-Ausgang | SPI-Slave-Ausgang
DIEOE | INTRC • EXTCK + AS2 + PCINT7 • PCIE0 | INTRC + AS2 + PCINT6 • PCIE0 | PCINT5 • PCIE0 | PCINT4 • PCIE0
DIEOV | (INTRC + EXTCK) • AS2 | INTRC • AS2 | 1 | 1
DI | PCINT7-Eingang | PCINT6-Eingang | PCINT5-Eingang SCK-Eingang | PCINT4-Eingang SPI-Master-Eingang
AIO | Oszillator-Ausgang | Oszillator/Takt-Eingang | – | –
Hinweis:
  1. INTRC bedeutet dass einer der internen RC-Oszillatoren ausgewählt wurde (durch CKSEL-Fuses), EXTCK bedeutet dass externe Taktversorgung ausgewählt wurde (durch CKSEL-Fuses).
Tabelle 14-5: Überschreibende Signale für alternative Funktionen für PB3..PB0
Signalname | PB3/MOSI/ OC2/PCINT3 | PB2/SS/ OC1B/PCINT2 | PB1/OC1A/ PCINT1 | PB0/ICP1/ PCINT0
PUOE | SPE • MSTR | SPE • MSTR | 0 | 0
PUOV | PORTB3 • PUD | PORTB2 • PUD | 0 | 0
DDOE | SPE • MSTR | SPE • MSTR | 0 | 0
DDOV | 0 | 0 | 0 | 0
PVOE | SPE • MSTR + OC2A-Freigabe | OC1B-Freigabe | OC1A-Freigabe | 0
PVOV | SPI-Master-Ausgang + OC2A | OC1B | OC1A | 0
DIEOE | PCINT3 • PCIE0 | PCINT2 • PCIE0 | PCINT1 • PCIE0 | PCINT0 • PCIE0
DIEOV | 1 | 1 | 1 | 1
DI | PCINT3-Eingang SPI-Slave-Eingang | PCINT2-Eingang SPI SS | PCINT1-Eingang | PCINT0-Eingang ICP1-Eingang
AIO | – | – | – | –

14.3.2 Alternative Funktionen von Port C

Port C bietet folgende alternative Funktionen:
Tabelle 14-6: Port C Alternative Funktionen
Portpin | Alternative Funktionen
PC6 | RESET (Reset-Pin) PCINT14 (Pegelwechselinterrupt 14)
PC5 | ADC5 (ADU-Eingang Kanal 5) SCL (Zweidraht-Bus-Taktleitung) PCINT13 (Pegelwechselinterrupt 13)
PC4 | ADC4 (ADU-Eingang Kanal 4) SDA (Zweidraht-Bus-Datenleitung) PCINT12 (Pegelwechselinterrupt 12)
PC3 | ADC3 (ADU-Eingang Kanal 3) PCINT11 (Pegelwechselinterrupt 11)
PC2 | ADC2 (ADU-Eingang Kanal 2) PCINT10 (Pegelwechselinterrupt 10)
PC1 | ADC1 (ADU-Eingang Kanal 1) PCINT9 (Pegelwechselinterrupt 9)
PC0 | ADC0 (ADU-Eingang Kanal 0) PCINT8 (Pegelwechselinterrupt 8)
Die alternativen Funktionen sind wie folgt:
  • PC6 — RESET/PCINT14
RESET: Reset-Anschluss. Wenn die RSTDISBL-Fuse programmiert ist, hat dieser Pin die Funktion eines normalen I/O-Pins. In diesem Fall sind der Power-on-Reset und der Brown-out-Reset die Resetquellen des Bausteins. Wenn die RSTDISBL Fuse nicht programmiert ist, ist die Resetschaltung mit dem Pin verbunden und er kann nicht als I/O-Pin verwendet werden.

Wenn PC6 als Reseteingang verwendet wird, werden die Bits DDC6, PORTC6 und PINC6 immer als 0 gelesen.

PCINT14: Pegelwechsel-Interruptquelle Nummer 14. Das Pin kann als externe Interruptquelle dienen.

  • PC5 — SCL/ADC5/PCINT13:
SCL: Two-wire Serial Interface Clock: Wenn das TWEN Bit im TWCR Register gesetzt ist und somit das TWI freigegeben ist, wird der PC5 Pin von dem Port getrennt und wird zum Takteingang bzw. -ausgang für das TWI. In diesem Modus ist ein Spitzenfilter mit dem Pin verbunden, der Spitzen die kürzer als 50 ns lang sind aus dem Eingangssignal ausfiltert. Der Pin wird durch einen Open-Drain-Treiber mit einer begrenzten Anstiegsgeschwindigkeit getrieben. ADC5: ADU-Eingangskanal 5: Alternativ kann der Pin PC5 auch als Eingangskanal Nummer 5 für den Analog-Digitalwandler verwendet werden. Der Kanal 5 des ADU verwendet die digitale Versorgungsspannung.

PCINT13: Pegelwechsel-Interruptquelle Nummer 13. Das Pin kann als externe Interruptquelle dienen.

  • PC4 — SDA/ADC4/PCINT12:
SDA: Two-wire Serial Interface Data: Wenn das TWEN Bit im TWCR Register gesetzt ist und somit das TWI freigegeben ist, wird der PC4 Pin von dem Port getrennt und wird zum Dateneingang bzw. -ausgang für das TWI. In diesem Modus ist ein Spitzenfilter mit dem Pin verbunden, der Spitzen die kürzer als 50 ns lang sind aus dem Eingangssignal ausfiltert. Der Pin wird durch einen Open-Drain-Treiber mit einer begrenzten Anstiegsgeschwindigkeit getrieben. ADC4: ADU-Eingangskanal 4: Alternativ kann der Pin PC4 auch als Eingangskanal Nummer 4 für den Analog-Digitalwandler verwendet werden. Der Kanal 4 des ADU verwendet die digitale Versorgungsspannung.

PCINT12: Pegelwechsel-Interruptquelle Nummer 12. Das Pin kann als externe Interruptquelle dienen.

  • PC3 — ADC3/PCINT11:
ADC3: ADU-Eingangskanal 3: Der Pin PC3 kann auch als Eingangskanal Nummer 3 für den Analog-Digitalwandler verwendet werden. Der Kanal 3 des ADU verwendet die analoge Versorgungsspannung.

PCINT11: Pegelwechsel-Interruptquelle Nummer 11. Das Pin kann als externe Interruptquelle dienen.

  • PC2 — ADC2/PCINT10:
ADC2: ADU-Eingangskanal 2: Der Pin PC2 kann auch als Eingangskanal Nummer 2 für den Analog-Digitalwandler verwendet werden. Der Kanal 2 des ADU verwendet die analoge Versorgungsspannung.

PCINT10: Pegelwechsel-Interruptquelle Nummer 10. Das Pin kann als externe Interruptquelle dienen.

  • PC1 — ADC1/PCINT9:
ADC1: ADU-Eingangskanal 1: Der Pin PC1 kann auch als Eingangskanal Nummer 1 für den Analog-Digitalwandler verwendet werden. Der Kanal 1 des ADU verwendet die analoge Versorgungsspannung.

PCINT9: Pegelwechsel-Interruptquelle Nummer 9. Das Pin kann als externe Interruptquelle dienen.

  • PC0 — ADC0/PCINT8:
ADC0: ADU-Eingangskanal 0: Der Pin PC0 kann auch als Eingangskanal Nummer 0 für den Analog-Digitalwandler verwendet werden. Der Kanal 0 des ADU verwendet die analoge Versorgungsspannung.

PCINT8: Pegelwechsel-Interruptquelle Nummer 8. Das Pin kann als externe Interruptquelle dienen.

Die nachfolgenden Tabellen zeigen die alternativen Funktionen von Port C und deren überschreibenden Signale.

Tabelle 14-7: Überschreibende Signale für alternative Funktionen für PC7..PC4(1)
Signalname | PC6/RESET/ PCINT14 | PC5/SCL/ADC5/ PCINT13 | PC4/SDA/ADC4/PCINT12
PUOE | RSTDISBL | TWEN | TWEN
PUOV | 1 | PORTC5 • PUD | PORTC4 • PUD
DDOE | RSTDISBL | TWEN | TWEN
DDOV | 0 | SCL_OUT | SDA_OUT
PVOE | 0 | TWEN | TWEN
PVOV | 0 | 0 | 0
DIEOE | RSTDISBL + PCINT14 • PCIE1 | PCINT13 • PCIE1 + ADC5D | PCINT12 • PCIE1 + ADC4D
DIEOV | RSTDISBL | PCINT13 • PCIE1 | PCINT12 • PCIE1
DI | PCINT14-Eingang | PCINT13-Eingang | PCINT12-Eingang
AIO | RESET-Eingang | ADC5-Eingang / SCL-Eingang | ADC4-Eingang / SDA-Eingang
Hinweis:
  1. When eingeschaltet, aktiviert die Zweidraht-Schnittstelle die Anstiegszeitkontrolle an den Ausgängen PC4 und PC5. Dies ist im Bild nicht eingezeichnet. Außerdem sind Störimpulsunterdrückungen zwischen den AIO-Ausgängen und der digitalen Logik des TWI-Moduls eingebaut.
Tabelle 14-8: Überschreibende Signale für alternative Funktionen für PC3..PC0
Signalname | PC3/ADC3/ PCINT11 | PC2/ADC2/ PCINT10 | PC1/ADC1/ PCINT9 | PC0/ADC0/ PCINT8
PUOE | 0 | 0 | 0 | 0
PUOV | 0 | 0 | 0 | 0
DDOE | 0 | 0 | 0 | 0
DDOV | 0 | 0 | 0 | 0
PVOE | 0 | 0 | 0 | 0
PVOV | 0 | 0 | 0 | 0
DIEOE | PCINT11 • PCIE1 + ADC3D | PCINT10 • PCIE1 + ADC2D | PCINT9 • PCIE1 + ADC1D | PCINT8 • PCIE1 + ADC0D
DIEOV | PCINT11 • PCIE1 | PCINT10 • PCIE1 | PCINT9 • PCIE1 | PCINT8 • PCIE1
DI | PCINT11-Eingang | PCINT10-Eingang | PCINT9-Eingang | PCINT8-Eingang
AIO | ADC3-Eingang | ADC2-Eingang | ADC1-Eingang | ADC0-Eingang

14.3.3 Alternative Funktionen von Port D

Port D bietet folgende alternative Funktionen:
Tabelle 14-9: Port D Alternative Funktionen
Portpin | Alternative Funktionen
PD7 | AIN1 (Analogvergleicher, negativer Eingang) PCINT23 (Pegelwechselinterrupt 23)
PD6 | AIN0 (Analogvergleicher, positiver Eingang) OC0A (Zähler/Zeitgeber0: Ausgang für Compare Match A) PCINT22 (Pegelwechselinterrupt 22)
PD5 | T1 (Zähler/Zeitgeber1 Zähleingang) OC0B (Zähler/Zeitgeber0: Ausgang für Compare Match B) PCINT21 (Pegelwechselinterrupt 21)
PD4 | XCK (USART Taktein-/-ausgang) T0 (Zähler/Zeitgeber0 Zähleingang) PCINT20 (Pegelwechselinterrupt 20)
PD3 | INT1 (Eingang Interrupt 1) OC2B (Zähler/Zeitgeber2: Ausgang für Compare Match B) PCINT19 (Pegelwechselinterrupt 19)
PD2 | INT0 (Eingang Interrupt 0) PCINT18 (Pegelwechselinterrupt 18)
PD1 | TXD (USART Datenausgang) PCINT17 (Pegelwechselinterrupt 17)
PD0 | RXD (USART Dateneingang) PCINT16 (Pegelwechselinterrupt 16)
Die alternativen Funktionen sind wie folgt:
  • PD7 — AIN1/PCINT23
AIN1: Analogvergleicher, Negativer Eingang: Negativer Eingang für den Analogvergleicher. Dafür muss der Pin als Eingang konfiguriert werden. Die internen Pullup-Widerstände müssen ausgeschaltet sein, damit die digitale Funktion des Pins die analoge nicht beeinflusst.

PCINT23: Pegelwechsel-Interruptquelle Nummer 23. Das Pin kann als externe Interruptquelle dienen.

  • PD6 — AIN0/PCINT22:
AIN0: Analogvergleicher, Positiver Eingang: Positiver Eingang für den Analogvergleicher. Dafür muss der Pin als Eingang konfiguriert werden. Die internen Pullup-Widerstände müssen ausgeschaltet sein, damit die digitale Funktion des Pins die analoge nicht beeinflusst.

PCINT22: Pegelwechsel-Interruptquelle Nummer 22. Das Pin kann als externe Interruptquelle dienen.

  • PD5 — T1/OC2B/PCINT21:
T1: Externe Quelle für den Zähler 1

OC0B: (Output Compare 0 B) Das Pin kann als Ausgang für den Zähler/Zeitgeber0 Compare Match B dienen. Damit kann dieses PWM-Signale ausgeben. Das Pin muss hierfür als Ausgang konfiguriert werden (DDD5 auf 1 setzen).

PCINT21: Pegelwechsel-Interruptquelle Nummer 21. Das Pin kann als externe Interruptquelle dienen.

  • PD4 — XCK/T0/PCINT20:
XCK: Externer Takteingang für USART

T0: Externe Quelle für den Zähler 0

PCINT20: Pegelwechsel-Interruptquelle Nummer 20. Das Pin kann als externe Interruptquelle dienen.

  • PD3 — INT1/OC2B/PCINT19:
INT1: External Interrupt Source 1: Das Pin kann als Eingang für einen externen Interrupt 1 dienen.

OC2B: (Output Compare 2 B) Das Pin kann als Ausgang für den Zähler/Zeitgeber2 Compare Match B dienen. Damit kann dieses PWM-Signale ausgeben. Das Pin muss hierfür als Ausgang konfiguriert werden (DDD3 auf 1 setzen).

PCINT19: Pegelwechsel-Interruptquelle Nummer 19. Das Pin kann als externe Interruptquelle dienen.

  • PD2 — INT0/PCINT18:
INT0: External Interrupt Source 0: Das Pin kann als Eingang für einen externen Interrupt 0 dienen.

PCINT18: Pegelwechsel-Interruptquelle Nummer 18. Das Pin kann als externe Interruptquelle dienen.

  • PD1 — TXD/PCINT17:
TXD: Transmit Data (Datenausgang für den USART). Wenn der USART-Sender freigegeben ist, ist dieser Pin als Ausgang konfiguriert, unabhängig von den Werten des DDD1-Bits.

PCINT17: Pegelwechsel-Interruptquelle Nummer 17. Das Pin kann als externe Interruptquelle dienen.

  • PD0 — RXD/PCINT16:
RXD: Receive Data (Data Eingang Pin für die USART). Wenn der USART Empfänger freigegeben ist, ist dieser Pin als Eingang konfiguriert, unabhängig von den Werten des DDD0 Bits. Wenn die USART den Pin als Eingang verwendet, kann der pull-up Widerstand weiterhin durch das PORTD0 Bit ein- und ausgeschaltet werden.

PCINT16: Pegelwechsel-Interruptquelle Nummer 16. Das Pin kann als externe Interruptquelle dienen.

Die nachfolgenden Tabellen zeigen die alternativen Funktionen von Port D und deren überschreibenden Signale.

Tabelle 14-10: Überschreibende Signale für alternative Funktionen für PD7..PD4
Signalname | PD7/AIN1/ PCINT23 | PD6/AIN0/OC0A/ PCINT22 | PD5/T1/OC0B/ PCINT21 | PD4/XCK/T0/ PCINT20
PUOE | 0 | 0 | 0 | 0
PUO | 0 | 0 | 0 | 0
DDOE | 0 | 0 | 0 | 0
DDOV | 0 | 0 | 0 | 0
PVOE | 0 | OC0A-Freigabe | OC0B-Freigabe | UMSEL
PVOV | 0 | OC0A | OC0B | XCK-Ausgang
DIEOE | PCINT23 • PCIE2 | PCINT22 • PCIE2 | PCINT21 • PCIE2 | PCINT20 • PCIE2
DIEOV | 1 | 1 | 1 | 1
DI | PCINT23-Eingang | PCINT22-Eingang | PCINT21-Eingang T1-Eingang | PCINT20-Eingang XCK-Eingang T0-Eingang
AIO | AIN1-Eingang | AIN0-Eingang | – | –
Tabelle 14-11: Überschreibende Signale für alternative Funktionen für PD3..PD0
Signalname | PD3/OC2B/INT1/ PCINT19 | PD2/INT0/ PCINT18 | PD1/TXD/ PCINT17 | PD0/RXD/ PCINT16
PUOE | 0 | 0 | TXEN | RXEN
PUO | 0 | 0 | 0 | PORTD0 • PUD
DDOE | 0 | 0 | TXEN | RXEN
DDOV | 0 | 0 | 1 | 0
PVOE | OC2B-Freigabe | 0 | TXEN | 0
PVOV | OC2B | 0 | TXD | 0
DIEOE | INT1-Freigabe + PCINT19 • PCIE2 | INT0-Freigabe + PCINT18 • PCIE1 | PCINT17 • PCIE2 | PCINT16 • PCIE2
DIEOV | 1 | 1 | 1 | 1
DI | PCINT19-Eingang INT1-Eingang | PCINT18-Eingang INT0-Eingang | PCINT17-Eingang | PCINT16-Eingang RXD
AIO | – | – | – | –

14.4 Registerbeschreibung

14.4.1 MCUCR — Mikrocontroller-Steuerregister

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x55) | - | BODS | BODSE | PUD | - | - | IVSEL | IVCE | MCUCR
Zugriff | R | R/W | R/W | R/W | R | R | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 4 — PUD: Pullup-Deaktivierung
Wenn dieses Bit mit einer Eins beschrieben wird, sind die internen Pullup-Widerstände für die I/O-Ports gesperrt, auch dann, wenn die DDRx- und PORTx-Register so konfiguriert sind, dass die Pullups freigegeben sind. Siehe Pin-Konfiguration oben für Erläuterungen.

14.4.2 PORTB — Treiberausgang Port B

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x25) | PORTB7 | PORTB6 | PORTB5 | PORTB4 | PORTB3 | PORTB2 | PORTB1 | PORTB0 | PORTB
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0

14.4.3 DDRB — Datenrichtung Port B

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x24) | DDB7 | DDB6 | DDB5 | DDB4 | DDB3 | DDB2 | DDB1 | DDB0 | DDRB
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0

14.4.4 PINB — Eingangspins Port B

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x23) | PINB7 | PINB6 | PINB5 | PINB4 | PINB3 | PINB2 | PINB1 | PINB0 | PINB
Zugriff | R | R | R | R | R | R | R | R
Startwert | - | - | - | - | - | - | - | -

14.4.5 PORTC — Treiberausgang Port C

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x28) | - | PORTC6 | PORTC5 | PORTC4 | PORTC3 | PORTC2 | PORTC1 | PORTC0 | PORTC
Zugriff | R | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0

14.4.6 DDRC — Datenrichtung Port C

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x27) | - | DDC6 | DDC5 | DDC4 | DDC3 | DDC2 | DDC1 | DDC0 | DDRC
Zugriff | R | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0

14.4.7 PINC — Eingangspins Port C

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x26) | - | PINC6 | PINC5 | PINC4 | PINC3 | PINC2 | PINC1 | PINC0 | PINC
Zugriff | R | R | R | R | R | R | R | R
Startwert | 0 | - | - | - | - | - | - | -

14.4.8 PORTD — Treiberausgang Port D

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x2B) | PORTD7 | PORTD6 | PORTD5 | PORTD4 | PORTD3 | PORTD2 | PORTD1 | PORTD0 | PORTD
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0

14.4.9 DDRD — Datenrichtung Port D

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x2A) | DDD7 | DDD6 | DDD5 | DDD4 | DDD3 | DDD2 | DDD1 | DDD0 | DDRD
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0

14.4.10 PIND — Eingangspins Port D

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x29) | PIND7 | PIND6 | PIND5 | PIND4 | PIND3 | PIND2 | PIND1 | PIND0 | PIND
Zugriff | R | R | R | R | R | R | R | R
Startwert | - | - | - | - | - | - | - | -


8-bit Zähler/Zeitgeber0

15. 8-bit Zähler/Zeitgeber 0 mit PWM

15.1 Features

  • Zwei unabhängige Output-Compare-Einheiten
  • Doppelt gepuffertes Output-Compare-Register
  • Verkürzter Zählzyklus bei Vergleichstreffer (CTC-Modus)
  • Glitchfreier phasenkorrekter Pulsweitenmodulator (PWM)
  • Einstellbare PWM-Periodendauer
  • Frequenzgenerator
  • Drei unabhängige Interruptquellen (TOV0, OCF0A und OCF0B)

15.2 Übersicht

Der Zähler/Zeitgeber0 ist ein allgemeines, 8-bit-Zähler/Zeitgeber-Modul mit zwei Output-Compare-Einheiten und PWM-Unterstützung. Das erlaubt genaues Messen von Programmlaufzeiten (zum Ereignismanagement) und Schwingungserzeugung.

Ein einfaches Blockschaltbild des 8-bit-Zähler/Zeitgeber ist nachfolgend dargestellt. Die Platzierung der Anschlüsse muss im Bild 1-1 nachgesehen werden. Register, die durch die CPU erreichbar sind, sind fett dargestellt. Die chipspezifischen I/O-Register sind unter Register-Beschreibung aufgeführt.

Das PRTIM0-Bit im Register zur Leistungsreduktion muss Null sein, damit der Zähler/Zeitgeber 0 freigegeben ist.

Bild 15-1: Blockschaltbild 8 Bit Timer

15.2.1 Definitionen

Viele Register und Bits in diesem Dokument werden allgemein beschrieben. Der Index n steht für die Nummer des Zähler/Zeitgeber, in diesem Fall also für eine 0. Ein kleines x steht für eine Output-Compare-Einheit, hier demnach A oder B. In einem Programm müssen immer die präzisen Bezeichnungen angegeben werden, also z.B. TCNT0 um auf den Wert des Zähler/Zeitgeber 0 zuzugreifen.

Definitionen für Zählendwerte sind in der folgenden Tabelle dargestellt:

Tabelle 15-1: Definitionen
BOTTOM | Der Zähler erreicht BOTTOM, wenn er 0x00 wird.
MAX | Der Zähler erreicht sein MAXimum, wenn er 0xFF (255 dezimal) wird.
TOP | Der Zähler erreicht TOP, wenn er den höchsten Wert der Zählsequenz erreicht. Er kann fest 0xFF (= MAX) oder einstellbar im Register OCR0A sein. Die Zuweisung hängt von der Betriebsart ab.

15.2.2 Register

Das Zählregister TCNT0 und die Output-Compare-Register OCR0A und OCR0B sind 8 Bit breit. Das Signal zur Interruptanforderung wird im Zeitgeber-Interrupt-Flagregister TFIR sichtbar. Alle Interrupts können individuell im Zeitgeber-Interrupt-Maskenregister TIMSK ausgeblendet werden. Die Register TIFR0 und TIMSK0 sind in obigen Abbild nicht eingezeichnet.

Der Zähler/Zeitgeber0 kann intern, über einen Vorteiler oder durch eine externe Taktquelle am T0-Pin getaktet werden. Die Taktauswahl-Logik gibt vor, durch welchen Takt und mit welcher Flanke der Timer seinen Wert inkrementiert (oder dekrementiert). Der Zähler/Zeitgeber ist inaktiv, wenn keine Taktquelle ausgewählt wurde. Der Ausgang der Taktauswahl-Logik wird als Zähltakt clkT0 bezeichnet.

Die zweifach gepufferten Output-Compare-Register OCR0A und OCR0B werden ständig mit dem Zählregister TCNT0 (auf Gleichheit) verglichen. Das Vergleichsergebnis kann den Schwingungsgeneratoren zur Frequenz- und/oder Pulsbreitenfestlegung zugeführt werden, was an den Ausgängen OC0A und OC0B erscheint. Siehe „Die Output-Compare-Einheit verwenden“ für Details. Das Ereignis der Gleichheit setzt außerdem die Compare-Flags OCF0A bzw. OCF0B, was wiederum zur Erzeugung einer Output-Compare-Interruptanforderung verwendet werden kann.

15.3 Taktquellen

Der Zähler/Zeitgeber kann durch eine interne oder durch eine externe Quelle getaktet werden. Die Taktquelle wird mit den Taktauswahl-Bits CS02 bis CS00 im Zähler/Zeitgeber-Steuerregister TCCR0 festgelegt. Details zu den Taktquellen und dem Vorteiler finden sich im Kapitel Vorteiler für Zähler/Zeitgeber 0 und 1.

15.4 Zählereinheit

Den Hauptbestandteil des 8-bit-Zähler/Zeitgeber 0 bildet die programmierbare Zählereinheit. Die nachfolgende Abbildung zeigt deren Blockdiagramm und Umgebung.
Bild 15-2: Blockschaltbild der Zählereinheit
Beschreibung der internen Signale:
count | Inkrementiert TCNT0 um 1
clkTn | Takt für den Zähler/Zeitgeber, nachfolgend clkT0
max | Signalisiert, dass TCNT0 seinen maximalen Wert erreicht hat
Der Zähler wird bei jedem Takt von clkT0 um 1 erhöht. Der Takt clkT0 kann durch eine interne oder externe Quelle erzeugt werden, die mit den Bits CS02 bis CS00 ausgewählt wird. Wenn keine Taktquelle ausgewählt ist (CS02 bis CS00 = 0), wird der Zähler/Zeitgeber angehalten. Unabhängig davon, ob der Takt läuft oder nicht, kann die CPU zu jeder Zeit auf den Wert des TCNT0-Registers zugreifen. Ein Schreiben der CPU in das TCNT0-Register hat Vorrang vor allen Lösch- und Zähl-Operationen.

15.5 Output Compare

Bild 15-3: Blockschaltbild der Output-Compare-Einheit

15.5.1 Output Compare erzwingen

In Nicht-PWM-Modi kann der Übereinstimmungsausgang des Vergleiches auch erzwungen werden, indem man eine 1 in das Force Output Compare (FOC0x) Bit schreibt. Bei der erzwungenen Vergleichsübereinstimmung wird weder das OCF0x-Flag gesetzt noch der Timer gelöscht oder neu geladen. Allerdings wird der OCP0x-Pin aktualisiert, so als sei eine echte Vergleichsübereinstimmung aufgetreten. Ob der OCP0x Pin gelöscht, gesetzt oder gewechselt wird, wird durch die Einstellungen der COM0x1- bis COM0x0-Bits festgelegt.

15.5.2 Blockade von Output-Compare beim Schreiben auf TCNT0

Alle Schreibversuche der CPU in das TCNT0-Register blockieren eine Vergleichsübereinstimmung, die im nächsten Taktzyklus auftritt, auch wenn der Timer gestoppt ist. Dadurch ist des möglich, die OCR0x-Register mit den gleichen Werten wie das TCNT0-Register zu beschreiben, ohne dass dadurch ein Interrupt ausgelöst wird.

15.5.3 Nutzung der Output-Compare-Einheit

Da das Beschreiben des TCNT0-Registers in jedem Modus die Vergleichsübereinstimmung für einen Timertakt blockiert, entstehen gewisse Risiken beim Verändern von TCNT0, wenn einer der Output-Compare-Kanäle verwendet wird, unabhängig davon, ob der Timer läuft oder nicht. Wenn ein Wert in das TCNT0 geschrieben wird, der dem Wert eines OCR0x entspricht, wird die Vergleichsübereinstimmung ausbleiben, wodurch eine unkorrekte Ausgangsform erzeugt wird. Das TCNT0 sollte daher in PWM-Modi mit variablen TOP-Werten nicht mit dem TOP-Wert beschrieben werden. Die Vergleichsübereinstimmung beim TOP-Wert würde ignoriert und der Zähler bis zum Maximalwert FFFF weiterzählen. Umgekehrt gilt, dass TCNT0 nicht mit dem BOTTOM-Wert beschrieben werden sollte, wenn der Zähler rückwärts läuft.

Das Einstellen der OC0x Register sollte vorgenommen werden, bevor der entsprechende Portpin als Ausgang konfiguriert wird. Der einfachste Weg, den OC0x-Wert zu setzen, ist die Verwendung des Force-Output-Compare-Bits (FOC0x) im normalen Modus. Die OCR0x-Register behalten ihren Wert auch dann, wenn zwischen den Kurvenform-Erzeugungsmodi umgeschaltet wird.

Zu beachten ist, dass die COM0x1 bis COM0x0 Bits nicht zweifach gepuffert sind. Daher wirken sich Veränderungen dieser Bits unmittelbar aus.

15.6 Compare-Match

Die Compare-Output-Modusbits COM0x1 und COM0x0 haben zwei Funktionen. Zum einen verwendet der Waveform-Generator die beiden Bits, um den Zustand des OCR0x-Registers bei der nächsten Vergleichsübereinstimmung festzulegen. Und zweitens kontrollieren die Bits die Ausgangsquelle des OC0x-Pins. Das nachfolgende Bild zeigt das einfache Blockschaltbild der Logik, die durch die COM0x1- und COM0x0-Bits beeinflusst wird. Die I/O-Register, die I/O-Bits und die I/O-Pins sind fett dargestellt, wobei von den Portkontrollregistern DDR und PORT nur der durch die Bits beeinflusste Teil dargestellt ist. Wenn auf den Zustand des OCR0x verwiesen wird, so ist damit das interne Register OCR0x gemeint und nicht das OC0x-Pin. Bei einem Systemreset wird das OCR0x-Register auf 0 gesetzt.
Bild 15-4: Schaltbild der Compare-Match-Einheit
Die allgemeine I/O Portfunktion wird durch den Output-Compare (OC0x) überschrieben, wenn eines der beiden Bits COM0x1 oder COM0x0 gesetzt ist. Allerdings wird die Richtung des OC0x-Pins (Eingang oder Ausgang) nach wie vor durch durch das Datenrichtungsregister (DDR) bestimmt. Das Richtungsbit für die OC0x-Pins (DDR_OC0x) muss als Ausgang gesetzt werden, bevor der Wert von OC0x am Ausgang sichtbar wird. Die überschreibende Funktion ist grundsätzlich unabhängig von dem ausgewählten Waveform-Generator-Modus. Allerdings gibt es einige Ausnahmen, die in den nachfolgenden Tabellen ersichtlich sind.

Das Design der Output-Compare-Pinlogik erlaubt das Initialisieren des OC0x-Zustandes, bevor der Ausgang freigegeben wird. Einige COM0x1/COM0x0-Kombinationen sind für spätere Funktionen reserviert (siehe Beschreibung der Register).

15.6.1 Compare Output und Kurvenform-Erzeugung

15.7 Betriebsmodi

Die Zählrichtung ist immer aufwärts (inkrementieren), ein Löschen des Zählers ist nicht möglich. Der Zähler läuft über, wenn er seinen maximalen Wert (FFh) überschreitet und er beginnt dann erneut von seinem niedrigsten Wert (00h) zu zählen. Im normalen Fall wird das Zähler/Zeitgeber Overflow Flag (TOV0) in dem Moment gesetzt, in dem das TCNT0-Register Null wird. Man kann in diesem Fall das Überlaufbit TOV0 als neuntes Bit des Zählers betrachten, dass allerdings durch den Zähler nur gesetzt, aber nicht gelöscht wird. In Verbindung mit dem Timer-Überlauf Interrupt, der das TOV0 Bit automatisch löscht, kann die Auflösung des Timers durch die Software erweitert werden. Der Zähler kann zu jeder Zeit mit einem neuen Wert beschrieben werden.

15.7.1 Normalmodus

15.7.2 Verkürzter Zählzyklus

Bild 15-5: Zeitverlauf beim Verkürzten Zählzyklus
fOCnx = fclk_I/O
2 ∙ N ∙ (1 + OCRnx)

15.7.3 Schnelle PWM

Bild 15-6: Zeitverlauf bei schneller PWM
fOCnxPWM = fclk_I/O
N ∙ 256

15.7.4 Phasenrichtige PWM

Bild 15-7: Zeitverlauf bei phasenrichtiger PWM
fOCnxPWM = fclk_I/O
N ∙ 510

15.8 Zeitdiagramme

Der Zähler/Zeitgeber ist synchron ausgelegt, daher ist der Timer-Takt clkT0 nachfolgend als Takt-Freigabe Signal dargestellt. Die Abbildungen zeigen auch, zu welchem Zeitpunkt das Interrupt-Flag gesetzt wird. Die erste Abbildung zeigt die grundlegende Zähler/Zeitgeber Funktion in dem Augenblick, in dem der Zähler seinen Maximalwert überschreitet.
Bild 15-8: Zeitdiagramm ohne Vorteiler
Nachfolgende Abbildung zeigt das Zeitdiagramm mit einem Vorteiler, der den I/O-Takt durch 8 teilt.
Bild 15-9: Zeitdiagramm mit Vorteiler
Folgende Abbildung zeigt das Setzen von OCF0A in allen Zählmodi außer dem verkürzten Zählumfang, wobei OCR0A = TOP ist.
Bild 15-10: Zeitdiagramm, Setzen von OCF0x, mit Vorteiler (fckl_I/O/8)
Bild 15-11 zeigt das Setzen von OCF0A und das Löschen von TCNT0 bei verkürztem Zählumfang, wobei OCR0A = TOP ist.
Bild 15-11: Zeitdiagramm bei verkürztem Zählumfang, mit Vorteiler (fckl_I/O/8)

15.9 Register-Beschreibung

15.9.1 TCCR0A — Kontrollregister A

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x44) | COM0A1 | COM0A0 | COM0B1 | COM0B0 | - | - | WGM01 | WGM00 | TCCR0A
Zugriff | R/W | R/W | R/W | R/W | R | R | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7:6 — COM0A[1:0]: Compare Match Output A Modus
These bits control the Output Compare pin (OC0A) behavior. If one or both of the COM0A1:0 bits are set, the OC0A output overrides the normal port functionality of the I/O pin it is connected to. However, note that the Data Direction Register (DDR) bit corresponding to the OC0A pin must be set in order to enable the output driver.

When OC0A is connected to the pin, the function of the COM0A1:0 bits depends on the WGM02:0 bit setting. Table 15-2 shows the COM0A1:0 bit functionality when the WGM02:0 bits are set to a normal or CTC mode (non-PWM).

Tabelle 15-2: Compare-Output-Modi im Nicht-PWM-Betrieb
COM0A1 | COM0A0 | Beschreibung
0 | 0 | Normale Portfunktion, OC0A abgetrennt
0 | 1 | Pegelwechsel an OC0A bei Compare-Match
1 | 0 | Löschen von OC0A bei Compare-Match
1 | 1 | Setzen von OC0A bei Compare-Match
Table 15-3 shows the COM0A1:0 bit functionality when the WGM01:0 bits are set to fast PWM mode.
Tabelle 15-3: Compare-Output-Modi im schnellen PWM-Betrieb (1)
COM0A1 | COM0A0 | Beschreibung
0 | 0 | Normale Portfunktion, OC0A abgetrennt
0 | 1 | WGM02 = 0: Normale Portfunktion, OC0A abgetrennt WGM02 = 1: Pegelwechsel an OC0A bei Compare-Match
1 | 0 | Löschen von OC0A bei Compare-Match Setzen von OCR0A bei BOTTOM (= nichtinvertierter Modus)
1 | 1 | Setzen von OC0A bei Compare-Match Löschen von OCR0A bei BOTTOM (= invertierter Modus)
Hinweis
  1. A special case occurs when OCR0A equals TOP and COM0A1 is set. In this case, the Compare Match is ignored, but the set or clear is done at BOTTOM. See ”Fast PWM Mode” for more details.
Table 15-4 shows the COM0A1:0 bit functionality when the WGM02:0 bits are set to phase correct PWM mode.
Tabelle 15-4: Compare-Output-Modi im phasenrichtigen PWM-Betrieb (1)
COM0A1 | COM0A0 | Beschreibung
0 | 0 | Normale Portfunktion, OC0A abgetrennt
0 | 1 | WGM02 = 0: Normale Portfunktion, OC0A abgetrennt WGM02 = 1: Pegelwechsel an OC0A bei Compare-Match
1 | 0 | Löschen von OC0A bei Compare-Match und Hochzählen Setzen von OCR0A bei Compare-Match und Runterzählen
1 | 1 | Setzen von OC0A bei Compare-Match Löschen von OCR0A bei Compare-Match und Runterzählen
Hinweis
  1. A special case occurs when OCR0A equals TOP and COM0A1 is set. In this case, the Compare Match is ignored, but the set or clear is done at TOP. See ”Phase Correct PWM Mode” for more details.
  • Bit 5:4 — COM0B[1:0]: Compare Match Output B Modus
Wie oben
  • Bit 3:2 — reserviert
Diese Bits sind reserviert und werden immer als 0 gelesen.
  • Bit 1:0 — WGM0[1:0]: PWM-Betriebsart
Tabelle 15-8: Bit-Beschreibung zur Art der Schwingungserzeugung
Modus | WGM02 | WGM01 | WGM00 | PWM-Betriebsart | TOP | Wann Aktualisierung von OCRx? | Wann TOV-Flag gesetzt? (1) (2)
0 | 0 | 0 | 0 | Normal | 0xFF | sofort | MAX
1 | 0 | 0 | 1 | Phasenrichtige PWM | 0xFF | TOP | BOTTOM
2 | 0 | 1 | 0 | Verkürzter Zählumfang | OCRA | sofort | MAX
3 | 0 | 1 | 1 | Schnelle PWM | 0xFF | BOTTOM | MAX
4 | 1 | 0 | 0 | reserviert | – | – | –
5 | 1 | 0 | 1 | Phasenrichtige PWM | OCRA | TOP | BOTTOM
6 | 1 | 1 | 0 | reserviert | – | – | –
7 | 1 | 1 | 1 | Schnelle PWM | OCRA | BOTTOM | TOP
Hinweise
  1. MAX = 0xFF
  2. BOTTOM = 0x00

15.9.2 TCCR0B — Kontrollregister B

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x45) | FOC0A | FOC0B | - | - | WGM02 | CS02 | CS01 | CS00 | TCCR0B
Zugriff | W | W | R | R | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7 — FOC0A: Output-Compare A erzwingen
  • Bit 6 — FOC0B: Output-Compare B erzwingen
  • Bit 5:4 — reserviert
Diese Bits sind reserviert und werden immer als 0 gelesen.
  • Bit 3 — WGM02: PWM-Betriebsart
Siehe TCCR0A und Tabelle oben.
  • Bit 2:0 — CS0[2:0]: Taktauswahl
Diese Bits wählen die Taktquelle für den Zähler/Zeitgeber 0 aus.
Tabelle 15-9: Bits zur Taktauswahl
CS02 | CS01 | CS00 | Beschreibung
0 | 0 | 0 | Stop, der Zähler/Zeitgeber0 wird angehalten
0 | 0 | 1 | clkI/O (kein Vorteiler)
0 | 1 | 0 | clkI/O/8
0 | 1 | 1 | clkI/O/64
1 | 0 | 0 | clkI/O/256
1 | 0 | 1 | clkI/O/1024
1 | 1 | 0 | Speisung von Pin T0, fallende Flanke
1 | 1 | 1 | Speisung von Pin T0, steigende Flanke
Wenn die externen Pin Modi genutzt werden, um den Zähler/Zeitgeber zu takten, dann wird ein Übergang am T0 Pin auch dann zum zählen des Zähler/Zeitgeber0 führen, wenn der Pin als Output konfiguriert ist. Damit ist des möglich, das Zählen über die Software zu steuern.

15.9.3 TCNT0 — Zählregister

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x46) | TCNT0[7:0] |  |  |  |  |  |  |  | TCNT0
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0

Das Register gibt sowohl beim Lesen als auch beim Schreiben einen direkten Zugriff auf das 8-bit Zählregister.

15.9.4 OCR0A — Vergleichsregister A

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x47) | OCR0A[7:0] |  |  |  |  |  |  |  | OCR0A
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0

15.9.5 OCR0B — Vergleichsregister B

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x48) | OCR0B[7:0] |  |  |  |  |  |  |  | OCR0B
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0

15.9.6 TIMSK0 — Interrupt-Maske

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x6E) | - | - | - | - | - | OCIE0B | OCIE0A | TOIE0 | TIMSK0
Zugriff | R | R | R | R | R | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7:3 — reserviert
Diese Bits sind reserviert und werden immer als 0 gelesen.
  • Bit 2 — OCIE0B: Zähler/Zeitgeber 0 Interrupt-Freigabe für Output-Compare-Match B
  • Bit 1 — OCIE0A: Zähler/Zeitgeber 0 Interrupt-Freigabe für Output-Compare-Match A
  • Bit 0 — TOIE0: Zähler/Zeitgeber 0 Überlauf-Interrupt-Freigabe
Wenn das TOIE0-Bit gesetzt ist und das I-Bit in Status-Register (SREG) ebenfalls gesetzt ist, dann ist der Zähler/Zeitgeber0 Overflow Interrupt freigegeben. Die dazugehörige Interrupt-Routine wird ausgeführt, wenn ein Überlauf im Zähler/Zeitgeber0 aufgetreten ist und somit das TOV0-Bit im TIFR-Register gesetzt wurde.

15.9.7 TIFR0 — Interrupt-Flags

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x35) | - | - | - | - | - | OCF0B | OCF0A | TOV0 | TIFR0
Zugriff | R | R | R | R | R | R/W! | R/W! | R/W!
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7:3 — reserviert
Diese Bits sind reserviert und werden immer als 0 gelesen.
  • Bit 2 — OCIE0B: Zähler/Zeitgeber 0 Interrupt anhängig für Output-Compare-Match B
  • Bit 1 — OCIE0A: Zähler/Zeitgeber 0 Interrupt anhängig für Output-Compare-Match A
  • Bit 0 — TOIE0: Zähler/Zeitgeber 0 Überlauf-Interrupt anhängig
Das TOV0-Bit wird gesetzt, wenn ein Überlauf in Zähler/Zeitgeber0 auftritt. Das Bit wird automatisch gelöscht, wenn die dazugehörige Interrupt-Routine ausgeführt wird. Alternativ kann das Flag gelöscht werden, in dem man eine logische „1“ in das Flag schreibt. Der Interrupt wird ausgeführt, wenn das I-Bit in SREG und das TOIE0-Bit im TIMSK gesetzt sind und das TOV0-Flag durch den Überlauf gesetzt wird.


16-bit-Zähler/Zeitgeber 1

16. 16-bit-Zähler/Zeitgeber 1

16.1 Features

  • Echtes 16-bit Design
  • Zwei unabhängige Output Compare Einheiten
  • Zweifach gebufferte Output Compare Register
  • Eine Input Capture Einheit
  • Input Capture Rauschunterdrückung
  • Löschen des Timers bei Compare Match (auto Reload)
  • Glitch-freier, phasenkorrekter Pulsweitenmodulator (PWM)
  • Variable PWM Frequenz
  • Frequenzgenerator
  • Externer Ereigniszähler
  • Vier unabhängige Interruptquellen (TOV1, OCF1A, OCF1B und ICF1)

16.2 Übersicht

Viele Register und Bits in diesem Dokument werden allgemein beschrieben. Der Index „n“ steht für die Nummer des Zähler/Zeitgeber, in diesem Fall also für eine 1, und der Index „x“ steht für den Kanal der Output Compare Einheit. In einem Programm müssen aber immer die präzisen Bezeichnungen angegeben werden, also z.B. TCNT1 um auf den Wert des Zähler/Zeitgeber1 zuzugreifen.

Ein einfaches Blockschaltbild des 16-bit Zähler/Zeitgeber ist nachfolgend dargestellt. Die Nummern der Pins sind von der Gehäuseform des Bausteins abhängig (siehe Anschlussbelegung). Die I/O-Register, die dazugehörigen I/O-Bits und die I/O-Pins, auf die die CPU direkt zugreifen kann, sind fett dargestellt.

Blockdiagramm Zähler/Zeitgeber 1(1)
Hinweis:
  1. Siehe Bild 1-1, Tabelle 14-3 und Tabelle 14-9 für Pin-Zuordnung und -Funktion.

16.2.1 Register

Das Zähler/Zeitgeber Register (TCNT1), die Output Compare Register (OCR1A/B) und das Input Capture Register (ICR1) sind alle 16-bit Register. Der Zugriff auf diese Register erfordert eine besondere Vorgehensweise, wie sie im Kapitel „Zugriff auf die 16-bit Register“ beschrieben wird. Die Zähler/Zeitgeber Control Register (TCCR1A/B) sind 8-bit Register, auf die die CPU normal zugreifen kann. Die Signale der Interruptanforderungen (im Blockschaltbild als Int.Req. bezeichnet) sind im Timer Interrupt Flag Register (TIFR) sichtbar. Alle Interrupts können individuell im Timer Interrupt Mask Register (TIMSK) maskiert werden. Die beiden letztgenannten Register sind im Blockschaltbild nicht abgebildet, da sie auch die Bits für andere Timer-Einheiten enthalten.

Der Zähler/Zeitgeber kann intern, über einen Vorteiler oder durch eine externe Taktquelle am T1 Pin getaktet werden. Die Taktauswahl-Logik gibt vor, durch welchen Takt und mit welcher Flanke der Timer seinen Wert inkrementiert oder dekrementiert. Der Zähler/Zeitgeber ist inaktiv, wenn keine Taktquelle ausgewählt wurde. Der Ausgang der Taktauswahl-Logik wird als Timer-Takt clkT1 bezeichnet.

Die zweifach gebufferten Output Compare Register (OCR1A/B) werden ständig mit dem Wert des Timers verglichen. Das Ergebnis dieses Vergleiches kann vom Wellenformerzeuger genutzt werden, um eine PWM oder eine variable Frequenz am Ausgang des Output Compare Pins (OC1A/B) zu erzeugen. Das Ereignis der Vergleichsübereinstimmung setzt außerdem das Compare Match Flag (OCF1A/B), das genutzt werden kann, um einen Output Compare Interrupt auszulösen.

Das Input Capture Register kann den Wert des Zähler/Zeitgebers vorgeben, wenn ein externes Ereignis an dem Input Capture Pin (ICP1) oder den Analog-Comparator Pins dies antriggert. Die Input Capture Einheit beinhaltet einen digitalen Filter, um Spitzen bei Wertveränderungen zu unterdrücken.

Der Top-Wert oder der Maximal-Wert des Timers kann in einigen Betriebsmodi durch das OCR1A Register, das ICR1 Register oder durch einen festen Wert vorgegeben werden. Wenn das OCR1A Register als Top-Wert im PWM-Modus verwendet wird, kann es nicht mehr verwendet werden, um den PWM Ausgang zu erzeugen. Der Top-Wert wird in diesen Fällen zweifach gebuffert und kann daher auch während des Laufens verändert werden. Wenn ein fester Top-Wert erforderlich ist, kann das ICR1 Register verwendet werden, wodurch das OCR1A Register für den PWM-Ausgang zur Verfügung steht.

16.2.2 Definitionen

BOTTOM | Der Zähler erreicht BOTTOM, wenn er 0000 wird.
MAX | Der Zähler erreicht sein MAXimum, wenn er FFFFh (65535 dezimal) wird
TOP | Der Zähler erreicht TOP, wenn die Zählung einen oberen Grenzwert erreicht. Als oberer Wert kann 00FF, 01FF und 03FF oder der Wert im OCR1A bzw. ICR1 Register festgelegt werden. Diese Festlegung ist vom Operationsmodus abhängig.

16.3 Zugriff auf 16-Bit-Register

Das TCNT1, die OCR1A/B und das ICR1 Register sind 16-bit Register, auf die die CPU über den 8-bit Datenbus zugreift. Der Zugriff muss also in zwei Schreib- oder Lesebefehlen erfolgen. Daher hat der 16-bit Timer ein 8-bit Zwischenspeicher, in dem das High-Byte des 16-bit Zugriffes temporär zwischengespeichert wird. Dieses eine Schattenregister wird für alle 16-bit-Register des Timers verwendet. Der Zugriff auf das Low-Byte triggert den 16-bit-Lese- oder -Schreibbefehl. Wenn das Low-Byte eines 16-bit Registers durch die CPU geschrieben wird, wird im gleichen Taktzyklus auch der High-Teil aus dem Schattenregister in das 16-bit Register geschrieben. Wenn das Low-Byte eines 16-bit Registers gelesen wird, wird im gleichen Taktzyklus das High-Byte aus dem Register in das Schattenregister kopiert.

Nicht alle 16-bit-Zugriffe verwenden das Schattenregister für das High-Byte: Beim Lesen der OCR1A/B-Register wird das Schattenregister nicht verwendet.

Bei einem 16-bit Schreibvorgang muss erst das High-Byte geschrieben werden, bevor das Low-Byte geschrieben wird. Bei einem 16-bit Lesevorgang wird erst das Low-Byte gelesen, anschließend das High-Byte.

Das folgende Beispiel zeigt den Zugriff auf das 16-bit Timer Register, wobei unterstellt wird, dass ein zwischenzeitlicher Interrupt das Schattenregister nicht verändern kann. Das gleiche Prinzip kann auch beim Zugriff auf die OCR1A/B Register oder das ICR1 Register angewandt werden. Bei dem „C“ Beispiel handelt es sich um eine 16-bit Adresse.

Kodebeispiel in Assembler
    ...
    ; Setze TCNT1 auf 0x01FF
    ldi  r17,0x01
    ldi  r16,0xFF
    out  TCNT1H,r17
    out  TCNT1L,r16
    ; Lese TCNT1 nach r17:r16
    in   r16,TCNT1L
    in   r17,TCNT1H
    ...
Kodebeispiel in C
  unsigned int i;
  ...
  /* Setze TCNT1 auf 0x01FF */
  TCNT1 = 0x1FF;
  /* Lese TCNT1 nach i */
  i = TCNT1;
  ...
Hinweis:
  1. See ”About Code Examples” on page 8. For I/O Registers located in extended I/O map, “IN”, “OUT”, “SBIS”, “SBIC”, “CBI”, and “SBI” instructions must be replaced with instructions that allow access to extended I/O. Typically “LDS” and “STS” combined with “SBRS”, “SBRC”, “SBR”, and “CBR”.
Es ist wichtig zu beachten, dass die Zugriffe auf das Low- und High-Byte zwei zusammenhängende Befehle sind. Tritt während der beiden Befehle, mit denen auf das 16-bit Register zugegriffen wird, ein Interrupt auf, in dessen Bearbeitung ebenfalls auf eines der 16-bit Register zugegriffen wird, so wird der durch den Interrupt unterbrochene Zugriff fehlerhaft werden. Daher sollte in den Fällen, in denen das Hauptprogramm und eine Interruptroutine auf die 16-bit Register zugreifen, im Hauptprogramm die Interrupts vor dem Zugriff gesperrt werden.

Das nachfolgende Beispiel zeigt die beiden zusammenhängenden Befehle zum Auslesen des TCNT1 Registers. Das Auslesen der OCR1A/B und des ICR1 Registers kann nach dem gleichen Prinzip erfolgen.

Kodebeispiel in Assembler
TIM16_ReadTCNT1:
    ; Globales Interruptflag retten
    in   r18,SREG
    ; Interrupts sperren
    cli
    ; Lese TCNT1 nach r17:r16
    in   r16,TCNT1L
    in   r17,TCNT1H
    ; Globales Interruptflag wiederherstellen
    out  SREG,r18
    ret
Kodebeispiel in C
unsigned int TIM16_ReadTCNT1(void) {
  unsigned char sreg;
  unsigned int i;
  /* Globales Interruptflag retten */
  sreg = SREG;
  /* Interrupts sperren */
  _CLI();
  /* Lese TCNT1 nach i */
  i = TCNT1;
  /* Globales Interruptflag wiederherstellen */
  SREG = sreg;
  return i;
}
Hinweis:
  1. See ”About Code Examples” on page 8. For I/O Registers located in extended I/O map, “IN”, “OUT”, “SBIS”, “SBIC”, “CBI”, and “SBI” instructions must be replaced with instructions that allow access to extended I/O. Typically “LDS” and “STS” combined with “SBRS”, “SBRC”, “SBR”, and “CBR”.
Das Assembler Beispiel schreibt den Wert des TCNT1 in das Registerpaar R17:R16 zurück.

Das nachfolgende Beispiel zeigt die beiden zusammenhängenden Befehle zum Schreiben des TCNT1 Registers. Das Schreiben der OCR1A/B und des ICR1 Registers kann nach dem gleichen Prinzip erfolgen.

Kodebeispiel in Assembler
TIM16_WriteTCNT1:
    ; Globales Interruptflag retten
    in   r18,SREG
    ; Interrupts sperren
    cli
    ; Setze TCNT1 auf r17:r16
    out  TCNT1H,r17
    out  TCNT1L,r16
    ; Globales Interruptflag wiederherstellen
    out  SREG,r18
    ret
Kodebeispiel in C
void TIM16_WriteTCNT1(unsigned int i) {
  unsigned char sreg;
  unsigned int i;
  /* Globales Interruptflag retten */
  sreg = SREG;
  /* Interrupts sperren */
  _CLI();
  /* Setze TCNT1 auf i */
  TCNT1 = i;
  /* Globales Interruptflag wiederherstellen */
  SREG = sreg;
}
Hinweis:
  1. See ”About Code Examples” on page 8. For I/O Registers located in extended I/O map, “IN”, “OUT”, “SBIS”, “SBIC”, “CBI”, and “SBI” instructions must be replaced with instructions that allow access to extended I/O. Typically “LDS” and “STS” combined with “SBRS”, “SBRC”, “SBR”, and “CBR”.
Das Assembler Beispiel unterstellt, dass im Registerpaar R17:R16 der Wert enthalten ist, der in das TCNT1 Register schrieben werden soll.

Wenn mehrere 16-bit Register nacheinander beschrieben werden sollen und das High-Byte in allen Fällen gleich ist, so muss das High-Byte nur einmal beschrieben werden.

16.3.1 Mehrfachnutzung des Schattenregisters

Falls mehrere 16-Bit-Register mit dem gleichen High-Byte geschrieben werden müssen, muss das Schattenregister nur einmal geladen werden. Jedoch muss weiterhin darauf geachtet werden, dass Interrupts nicht das Schattenregister zwischendurch verändern, entweder indem alle freigegebenen Interruptroutinen das Schattenregister unberührt lassen oder indem die Sequenz von Schreibzugriffen mit abgeschalteten Interrupts (cli/sei) ausgeführt wird.

16.4 Taktquellen

Der Zähler/Zeitgeber kann durch eine interne oder durch eine externe Quelle getaktet werden. Die Taktquelle wird mit den Taktauswahl-Bits CS12 bis CS10 im Zähler/Zeitgeber Control Register B (TCCR1B) festgelegt. Details zu den Taktquellen und dem Vorteiler finden sich unter dem Kapitel „Vorteiler für Zähler/Zeitgeber0 und 1“.

16.5 Zählereinheit

Der Hauptteil des Zähler/Zeitgeber1 ist die programmierbare 16-bit bidirektionale Zählereinheit. Das Blockschaltbild zeigt die Zählereinheit mit ihrer Umgebung.
Bild 16-2: Blockschaltbild des Zählers
Beschreibung der internen Signale:

count | Inkrementiert oder dekrementiert TCNT1 um 1
direction | Auswahl zwischen Inkrement und Dekrement
clear | Löscht TCNT1 (alle Bits Null)
clkT1 | Zähler/Zeitgeber-Takt
TOP | Signalisiert, dass TCNT1 den Maximalwert erreicht hat
BOTTOM | Signalisiert, dass TCNT1 den Minimalwert (Null) erreicht hat

Der 16-bit Zähler ist in zwei 8-bit I/O-Speicher aufgeteilt: Counter high (TCNT1H) enthält die oberen acht Bits des Zählers, Counter low (TCNT1L) enthält die unteren acht Bits des Zählers. Auf das TCNT1H Register kann die CPU nur indirekt, nämlich über das Schattenregister TEMP zugreifen. Das Schattenregister wird mit dem Wert von TCNT1H gefüllt, wenn TCNT1L gelesen wird und das TCNT1H Register wird mit dem Wert des Schattenregisters gefüllt, wenn TCNT1L geschrieben wird. Dadurch ist es für die CPU möglich, alle 16 Bits des Zählers innerhalb des gleichen Taktzyklus über einen 8-bit Datenbus zu verändern. (A.d.Ü.: Der C-Compiler kann 16-Bit-Register direkt in einem Stück ansprechen, hier über das Symbol TCNT1.) Es ist wichtig zu wissen, dass es beim Beschreiben des TCNT1 Registers während der Zähler läuft, spezielle Fälle gibt, in denen das Ergebnis unvorhersehbar wird. Diese Fälle werden an den entsprechenden Stellen erläutert.

Abhängig vom gewählten Arbeitsmodus wird der Zähler mit Takt des Timer Clock clkT1 gelöscht, inkrementiert oder dekrementiert. Der Takt clkT1 kann durch eine externe oder interne Quelle erzeugt werden, die Einstellung erfolgt mit den Clock Select Bits CS12 bis CS10. Wenn keine Taktquelle ausgewählt ist CS12 bis CS10 =000, dann wird der Zähler gestoppt. Auf den Wert von TCNT1 kann aber jederzeit zugegriffen werden, unabhängig davon, ob der Takt clkT1 vorhanden ist oder nicht. Das Beschreiben des Zählers durch die CPU hat Vorrang vor allen Lösch- und Zähl-Operationen des Zählers.

Eine Zählsequenz wird durch die Einstellungen des Waveform Generation Mode Bits (WGM13 bis WGM10) in den TCCR1A und TCCR1B Registern bestimmt. Es besteht ein fester Zusammenhang zwischen der Arbeitsweise des Zählers und der erzeugten Wellenform am Output Compare Ausgang OC1x.

Das Timer Counter Overflow Flag (TOV1) wird den Einstellungen der WGM1x Bits entsprechend gesetzt. Es kann genutzt werden, um einen Interrupt auszulösen.

16.6 Input Capture

Der Zähler/Zeitgeber arbeitet mit einer Input Capture Einheit zusammen, mit der externe Ereignisse erfasst und mit einem Zeitstempel versehen werden können. Das externen Signal kennzeichnet ein oder mehrer externe Ereignisse das über den ICP1 Pin angelegt werden kann oder alternativ aus der Analogvergleicher Einheit stammen kann. Der Zeitstempel kann dann genutzt werden, um die Frequenz, das Tastverhältnis oder andere Eigenschaften des externen Signals zu ermitteln. Außerdem können die Zeitstempel auch verwendet werden, um eine Aufzeichnung der eingetretenen Ereignisse zu erstellten.

In nachfolgendem Abbild ist die Input Capture Einheit dargestellt. Die Elemente, die nicht unmittelbar zur Input Capture Einheit gehören sind grau schattiert. Das „n“ in den Registern und Bitnamen steht für die Nummer des Zähler/Zeitgebers.

Bild 16-3: Blockschaltbild Input-Capture-Einheit
Wenn ein Wechsel des logischen Pegels (Ereignis) am Input Capture Pin (ICP1) oder am Analogvergleicher Output (ACO) auftritt, und diese Wechsel mit den Einstellungen des Flankendetektors zusammepassen, dann wird die Erfassung getriggert. Wenn die Erfassung getriggert wird, wird der aktuelle 16-bit Wert des Zählers (TCNT1) in das Input Capture Register (ICR1) geschrieben. Das Input Capture Flag (IVF1) wird im selben Taktzyklus gesetzt, in dem der Wert von TCNT1 in das ICR1 Register kopiert wird. Wenn freigegeben (TICIE1=1) erzeugt das Input Capture Flag einen Interrupt. Das ICF1 Flag wird automatisch gelöscht, wenn die Interruptroutine ausgeführt wird. Alternativ kann das ICF1 Flag auch dadurch gelöscht werden, indem eine logische 1 in das Flag geschrieben wird.

Das Auslesen des 16-bit Wertes aus dem Input Capture Register (ICR1) erfolgt, indem zunächst das Low-Byte (ICR1L) und danach das High-Byte (ICR1H) gelesen wird. In dem Moment, in dem das Low-Byte gelesen wird, wird das High-Byte in das Schattenregister (TEMP) kopiert. Wenn dann das High-Byte gelesen wird, greift die CPU auf dieses Schattenregister zu.

Das ICR1-Register kann nur beschrieben werden, wenn ein Waveform Generation Modus benutzt wird, der das ICR1-Register zum Festlegen des TOP-Wertes für den Zähler/Zeitgeber verwendet. In diesem Fällen müssen die Waveform Generation Modus Bits WGM13 bis WGM10 gesetzt werden, bevor der Wert in das ICR1-Register geschrieben werden kann. Beim Schreiben wird zunächst das High-Byte geschrieben und im Schattenregister abgelegt. Beim Schreiben des Low-Byte werden beiden Bytes in das ICR1-Register übernommen.

16.6.1 Triggerquelle

Die Haupt-Triggerquelle für die Input Capture Einheit ist der Input Capture Pin (ICP1). Der Zähler/Zeitgeber 1 kann aber alternativ auch den Ausgang des Analogvergleichers verwenden, um die Input Capture Einheit zu triggern. Der Analogvergleicher wird das Triggerquelle ausgewählt, indem das Analogvergleicher Input Capture Bit (ACIC) im Analogvergleicher Control und Status Register (ACSR) gesetzt wird. Das Umschalten zwischen den Triggerquellen kann zu einer Erfassung führen. Daher muss das Input Capture Flag nach einem Wechsel der Triggerquelle gelöscht werden.

Beide, der Input Capture Pin und der Analogvergleicher Ausgang werden mit der gleichen Technik abgetastet wie das T1-Pin (siehe Seiten vorher). Auch der Flankenerkenner ist identisch. Wenn auch der Störungsunterdrücker freigeschaltet ist, wird zusätzliche Logik vor den Flankenerkenner geschaltet, die eine zusätzliche Verzögerung von vier Takten verursacht. Der Eingang des Störungsunterdrückers und des Flankenerkenners sind immer freigeschaltet außer wenn der Timer/Counter in einem Waveform Generation Modus arbeitet, der ICR1 als TOP Wert für den Zähler verwendet.

Ein Erfassung kann auch durch die Software getriggert werden, indem an den Pin ICP1 der entsprechende Pegel ausgegeben wird.

16.6.2 Störunterdrückung

Der Störunterdrückung verbessert die Rauschfestigkeit durch einen einfachen digitalen Filter. Der Eingang des Störunterdrückungs wird für vier Takte untersucht und muss in allen vier Takten gleich sein, um den Ausgang zum Flankenerkenner zu ändern.

Der Störunterdrückung wird freigegeben, indem das Input Capture Noise Canceler Bit (ICNC1) im Timer/Counter Control Register B (TCCR1B) gesetzt wird. Wenn der Rauchunterdrücker freigegeben ist, erzeugt er eine zusätzliche Verzögerung von (mindestens) vier Takten zwischen dem Auftreten des Ereignisses am Eingang und der Übernahme des Zählerwertes in das ICR1 Register. Die Störunterdrückung verwendet den Systemtakt und wird daher nicht durch den Vorteiler beeinflusst.

16.6.3 Anwendung des Input-Capture

Die größte Herausforderung bei der Verwendung der Input Capture Einheit liegt darin, ausreichend Prozessorkapazität zur Verfügung zu stellen, um die eingehenden Ereignisse zu bearbeiten. Vor allem die Zeit zwischen zwei auftretenden Ereignissen ist kritisch. Wenn der Prozessor den erfassten Wert im ICR1 Register noch nicht gelesen hat, bevor das nächste Ereignis auftritt, so wird das ICR1 Register mit dem neuen Wert überschrieben. In diesem Fall wird das Ergebnis also unbrauchbar.

Wenn der Input Capture Interrupt verwendet wird, muss der Wert des ICR1 Registers so früh wie möglich in den Interruptroutine gelesen werden. Auch wenn der Input Capture Interrupt eine relativ hohe Priorität hat, ist die maximale Antwortzeit von der maximalen Länge der anderen Interruptroutinen abhängig.

Es wird nicht empfohlen, die Input Capture Einheit zu verwenden, wenn der TOP Wert aktiv während der Arbeit verändert wird.

Messungen von Pulsweiten externe Signale erfordert, dass die Flankenerkennung nach jeder Erfassung umgeschaltet wird. Das Umschalten der Flankenrichtung muss so früh wie möglich nach dem Auslesen des ICR1 Registers erfolgen. Nach dem Ändern der Flankenrichtung muss das Input Capture Flag (ICF1) durch die Software gelöscht werden. Wenn nur die Frequenz des externen Signals gemessen werden soll, so muss das ICF1 Bit nicht durch die Software gelöscht werden, wenn die entsprechende Interruptroutine verwendet wird.

16.7 Output Compare

Der 16-bit Vergleicher vergleicht kontinuierlich den Wert des TCNT1 Registers mit den Output Compare Register OCR1A und OCR1B. Wenn die Werte von TCNT1 und OCR1x gleich sind, signalisiert der Vergleicher die Übereinstimmung. Durch die Übereinstimmung wird das Output Compare Flag (OPCF1x) mit dem nächsten Timer Takt gesetzt. Wenn freigegeben (OCIE1x = 1), erzeugt das Output Compare Flag einen Interrupt. Das Flag wird automatisch gelöscht, wenn die Interruptroutine ausgeführt wird. Es kann aber auch per Software gelöscht werden, indem eine logische 1 in das Bit geschrieben wird. Der Waveform-Generator verwendet das Übereinstimmungssginal, um ein Ausgangssignal entsprechend der Einstellungen der Waveform Generation Mode Bits (WGM13 bis WGM10) und der Compate Output Mode Bits (COM1x1 bis COM 1x0) zu erzeugen. Das TOP- und BOTTOM-Signal wird vom Waveform-Generator verwendet um die besonderen Fälle von extremen Werten in einigen Betriebsmodi zu handhaben.

Die besonderen Eigenschaften der Output Compare Einheit A erlaubt es, den TOP Wert (das heißt die Auflösung) des Zähler/Zeitgeber zu bestimmen. In Zusammenhang mit der Auflösung des Zählers bestimmt der TOP Wert die Periodendauer des Ausgangssignals, das der Waveform-Generator erzeugt.

Das nachfolgende Bild zeigt das Blockschaltbild der Output Compare Einheit. Das „n“ steht für die Nummer des Zähler/Zeitgebers (also 1), das „x“ steht für die beiden Output Compare Einheiten A und B. Die Teile, die nicht unmittelbar zur Output Compare Einheit gehören, sind grau schattiert.

Bild 16-4: Blockschaltbild der Output-Compare-Einheit
Die OCR1x Register sind zweifach gepuffert, wenn einer der zwölf PWM Modi verwendet wird. Im normalen Clear Timer on Compare (CTC) Modus ist die zweifache Bufferung ausgeschaltet. Die zweifache Bufferung dient zur Synchronisation der laufenden Zählung mit sich verändernden TOP und BOTTOM Werten in den Registern ORC1x. Die Synchronisation verhindert das Auftreten von unsymmetrischen PWM Pulsen und macht den Ausgang glitch frei.

Der Zugriff auf die OCR1x Register sieht kompliziert aus, ist es aber nicht. Wenn die Bufferung freigegeben ist, dann greift die CPU auf die ORC1x-Buffer Register zu, wenn die Bufferung ausgeschaltet ist, dann greift die CPU direkt auf die OCR1x Register zu. Der Inhalt der OCR1x Register kann nur durch einen Schreibbefehl geändert werden, er wird nicht wie das TCNT1 oder das ICR1 Register automatisch durch den Zähler aktualisiert. Daher muss das High-Byte auch nicht über ein Schattenregister gelesen werden. Allerdings ist es gute Praxis, beim Zugriff auf 16-bit Register stets das Low-Byte zuerst zu lesen. Das Schreiben der OCR1x Register erfolgt aber über das Schattenregister, da der Vergleich aller 16 Bit kontinuierlich läuft. Das High-Byte (OCR1xH) muss als erstes geschrieben werden und wird dabei im Schattenregister (TEMP) abgelegt. Wenn anschließend das Low-Byte in das OCR1xL Register geschrieben wird, wird gleichzeitig auch der Wert aus dem TEMP Register in das OCR1xH Register kopiert.

Der C-Compiler realisiert die 16-Bit-Zugriffe automatisch richtig beim Ansprechen des Symbols OCR1x.

16.7.1 Output Compare erzwingen

In nicht PWM-Modi kann der Übereinstimmungsausgang des Vergleiches auch erzwungen werden, indem man eine 1 in das Force Output-Compare-Bit FOC1x schreibt. Bei der erzwungenen Vergleichsübereinstimmung wird weder das OCF1x-Flag gesetzt noch der Timer gelöscht oder neu geladen. Allerdings wird das OCP1x-Pin aktualisiert, so als sei eine echte Vergleichsübereinstimmung aufgetreten. Ob das OCP1x-Pin gelöscht, gesetzt oder gewechselt wird, wird durch die Einstellungen der COM1x1- bis COM1x0-Bits festgelegt.

16.7.2 Blockade von Output Compare beim Schreiben auf TCNT1

Alle Schreibversuche der CPU in das TCNT1-Register blockieren eine Vergleichsübereinstimmung, die im nächsten Taktzyklus auftritt, auch wenn der Timer gestoppt ist. Dadurch ist des möglich, die OCR1x-Register mit den gleichen Werten wie das TCNT1-Register zu beschreiben, ohne dass dadurch ein Interrupt ausgelöst wird.

16.7.3 Nutzung der Output-Compare-Einheit

Da das Beschreiben des TCNT1-Registers in jedem Modus die Vergleichsübereinstimmung für einen Timertakt blockiert, entstehen gewisse Risiken beim Verändern von TCNT1, wenn einer der Output-Compare-Kanäle verwendet wird, unabhängig davon, ob der Timer läuft oder nicht. Wenn ein Wert in das TCNT1 geschrieben wird, der dem Wert eines OCR1x entspricht, wird die Vergleichsübereinstimmung ausbleiben, wodurch eine unkorrekte Ausgangsform erzeugt wird. Das TCNT1 sollte daher in PWM-Modi mit variablen TOP-Werten nicht mit dem TOP-Wert beschrieben werden. Die Vergleichsübereinstimmung beim TOP-Wert würde ignoriert und der Zähler bis zum Maximalwert FFFF weiterzählen. Umgekehrt gilt, dass TCNT1 nicht mit dem BOTTOM-Wert beschrieben werden sollte, wenn der Zähler rückwärts läuft.

Das Einstellen der OC1x Register sollte vorgenommen werden, bevor der entsprechende Portpin als Ausgang konfiguriert wird. Der einfachste Weg, den OC1x-Wert zu setzen, ist die Verwendung des Force-Output-Compare-Bits (FOC1x) im normalen Modus. Die OCR1x-Register behalten ihren Wert auch dann, wenn zwischen den Kurvenform-Erzeugungsmodi umgeschaltet wird.

Zu beachten ist, dass die COM1x1 bis COM1x0 Bits nicht zweifach gepuffert sind. Daher wirken sich Veränderungen dieser Bits unmittelbar aus.

16.8 Compare-Match

Die Compare-Output-Modusbits COM1x1 und COM1x0 haben zwei Funktionen. Zum einen verwendet der Waveform-Generator die beiden Bits, um den Zustand des OCR1x-Registers bei der nächsten Vergleichsübereinstimmung festzulegen. Und zweitens kontrollieren die Bits die Ausgangsquelle des OC1x-Pins. Das nachfolgende Bild zeigt das einfache Blockschaltbild der Logik, die durch die COM1x1- und COM1x0-Bits beeinflusst wird. Die I/O-Register, die I/O-Bits und die I/O-Pins sind fett dargestellt, wobei von den Portkontrollregistern DDR und PORT nur der durch die Bits beeinflusste Teil dargestellt ist. Wenn auf den Zustand des OCR1x verwiesen wird, so ist damit das interne Register OCR1x gemeint und nicht das OC1x-Pin. Bei einem Systemreset wird das OCR1x-Register auf 0 gesetzt.
Bild 16-5: Blockschaltbild der Compare-Match-Output-Einheit
Die allgemeine I/O Portfunktion wird durch den Output-Compare (OC1x) überschrieben, wenn eines der beiden Bits COM1x1 oder COM1x0 gesetzt ist. Allerdings wird die Richtung des OC1x-Pins (Eingang oder Ausgang) nach wie vor durch durch das Datenrichtungsregister (DDR) bestimmt. Das Richtungsbit für die OC1x-Pins (DDR_OC1x) muss als Ausgang gesetzt werden, bevor der Wert von OC1x am Ausgang sichtbar wird. Die überschreibende Funktion ist grundsätzlich unabhängig von dem ausgewählten Waveform-Generator-Modus. Allerdings gibt es einige Ausnahmen, die in den nachfolgenden Tabellen ersichtlich sind.

Das Design der Output-Compare-Pinlogik erlaubt das Initialisieren des OC1x-Zustandes, bevor der Ausgang freigegeben wird. Einige COM1x1/COM1x0-Kombinationen sind für spätere Funktionen reserviert (siehe Beschreibung der Register). Die beiden COM1x-Bits haben keinen Einfluss auf die Input Capture Einheit.

16.8.1 Compare Output und Kurvenform-Erzeugung

Der Waveform-Generator verwendet die COM1x1 und COM1x0 Bits in den Modi normal, CTC und PWM unterschiedlich. In allen Fällen wird bei einer Vergleichsübereinstimmung keine Aktion ausgelöst, wenn beide Bits auf 0 gesetzt sind. Weitere Details in den späteren Tabellen.

16.9 Betriebsarten

Die Betriebsart, das heißt das Verhalten des Zähler/Zeitgebers und des Output Compare Pins, wird durch die Kombination der Waveform Generation Mode Bits (WGM13 bis WGM10) und den Compare Output Mode Bits (COM1x1 bis COM1x0) bestimmt. Die Compare Output Mode Bits beeinflussen die Zählsequenz nicht, die Waveform Generation Mode Bits hingegen schon. Die COM1x1 und COM1x0 Bits legen fest, ob der PWM Ausgang invertiert sein soll oder nicht. In nicht PWM Modi legen die COM1x1 und COM1x0 Bits fest, ob der Ausgang gelöscht, gesetzt oder gewechselt werden soll, wenn eine Vergleichsübereinstimmung auftritt.

16.9.1 Normalmodus

Der einfachste Betriebsmodus ist der normale Modus (WGM13 bis WGM10 = 000). In diesem Modus zählt der Zähler immer vorwärts (inkrementieren) und wird nicht gelöscht. Wenn der Zähler seinen maximalen Wert erreicht (FFFF) läuft er über und beginnt erneut bei seinem BOTTOM Wert 0000. Im normalen Modus wird das Timer Overflow Flag (TOV1) in dem Augenblick gesetzt, in dem das TCNT1 Register wieder 0000 wird. Das TOV1 Flag kann in diesem Fall wie ein 17 Bit betrachtet werden, dass aber nur gesetzt und nicht automatisch gelöscht wird. In Kombination mit dem Timer Overflow Interrupt, der das TOV1 Flag automatisch löscht, kann also die Auflösung des Timers durch die Software erheblich erweitert werden. Im normalen Modus sind keine Besonderheiten zu beachten, der Wert des TCNT1 Registers kann jederzeit überschrieben werden.

Die Input Capture Einheit ist im normalen Modus einfach zu verwenden. Es ist darauf zu achten, dass die maximale Zeit zwischen zwei externen Ereignissen nicht außerhalb der Auflösung des Timer/Counters liegt. Wenn dieses Intervall zu lang ist, so kann der Timer Overflow Interrupt oder der Vorteiler verwendet werden, um die Auflösung für die Capture Einheit zu vergrößern.

Die Output Compare Einheit kann verwendet werden, um Interrupts beim jeweiligen Zählerstand zu erzeugen. Das Erzeugen von Ausgangsfrequenzen im normal Modus wird nicht empfohlen, da dafür zu viel Prozessorkapazität verbraucht wird.

16.9.2 Verkürzter Zählzyklus

Im Clear Timer on Compare Modus (CTC) (WGM13 bis WGM10 = 4 oder 12) werden die Register OCR1A oder ICR1 dazu verwendet, die Auflösung des Timers zu manipulieren. Im CTC Modus wird der Zähler gelöscht, wenn der Wert des Zählers (TNCT1) entweder mit dem des OCR1A Registers (WGM13 bis WGM10 = 4) oder dem des ICR1 Registers (WGM13 bis WGM10 = 12) übereinstimmt. Die beiden Register OCR1A und ICR1 bestimmen also den Maximalwert des Zählers und somit seine Auflösung. Dieser Modus erlaubt eine größere Kontrolle der Compare Match Ausgangsfrequenz. Er vereinfacht auch das Zählen externer Ereignisse.

Das Zeitdiagramm des CTC Modus ist nachfolgend abgebildet. Der Wert des Zählers (TCNT1) wächst so lange bis eine Vergleichsgleichheit mit dem OCR1A oder ICR1 auftritt, dann wird der Zähler (TCNT1) gelöscht.

Bild 16-6: Zeitverlauf bei verkürztem Zählzyklus
Durch die Flags OCF1A oder ICF1 kann ein Interrupt generiert werden, zu jedem Zeitpunkt, wenn der Wert des Zählers den TOP Wert erreicht, der durch das OCR1A oder ICR1 Register vorgegeben ist. Wenn der Interrupt freigegeben ist, kann die Interruptroutine dazu verwendet werden, um den TOP Wert zu verändern. Das Einstellen des TOP Wertes in die Nähe des BOTTOM Wertes muss mit Vorsicht geschehen, wenn der Zähler ohne oder mit einem geringen Vorteiler betrieben wird, da der CTC Modus keine Zweifachbuffer Eigenschaft hat. Wenn ein neuer Wert in das OCR1A oder ICR1 Register geschrieben wird, der kleiner als der aktuelle Wert des TCNT1 ist, so wird zunächst keine Vergleichsübereinstimmung erkannt. Der Zähler wird dann zunächst bis zu seinem maximalen Wert (FFFF) laufen und von 0000 erneut starten, erst dann kann eine Vergleichsübereinstimmung erkannt werden. In vielen Fällen ist dieses Verhalten nicht wünschenswert. Eine Alternative ist dann die Verwendung des Fast PWM Modus, in dem OCR1A den TOP Wert bildet, der zweifach gebuffert ist.

Beim Generieren einer Ausgangsfrequenz im CTC Modus kann der OC1A Ausgang so eingestellt werden, dass er seinen Zustand bei jeder Vergleichsübereinstimmung wechselt, indem die COM1A1 und COM1A0 Bits auf 1 gesetzt werden. Der OC1A Wert wird nicht am Port Pin erscheinen, wenn die Datenrichtung nicht auf Ausgang (DDR_OC1A = 1) eingestellt ist. Die erzeugte Ausgangswelle kann eine maximale Frequenz von fOC1A = fclk_I/O/2 haben, wenn OCR1A auf 0000 gesetzt wird. Allgemein wird die Ausgangsfrequenz mit folgender Gleichung bestimmt: Die Variable N steht für den Faktor des Vorteilers (1, 8, 64, 256 oder 1024).

fOCnA = fclk_I/O
2·N·(1+OCRnA)
Im normalen Modus wird das TOV1 Flag in dem selben Taktzyklus gesetzt, in dem der Zähler von seinem MAX Wert auf 0000 wechselt.

16.9.3 Schnelle Pulsweitenmodulation (PWM)

Der Fast PWM Modus (WGM13 bis WGM10 = 5, 6, 7, 14 oder 15) bietet eine hochfrequente Ausgangswelle. Der Fast PWM Modus unterscheidet sich von den anderen PWM Modi durch seine einfache Impulsflanke. Der Zähler zählt vom BOTTOM Wert bis zum TOP Wert und beginnt danach wieder mit dem BOTTOM Wert. Im nicht invertierenden Compare Output Mode wird der Output Compare (OC1x) gesetzt, wenn eine Vergleichsübereinstimmung zwischen dem TCNT1 und OCR1x auftritt und wird gelöscht, wenn der TOP Wert erreicht ist. Im invertierenden Output Compare Modus ist es genau umgekehrt. Durch die einfache Impulsflanke kann die Frequenz im Fast PWM Modus doppelt so hoch sein wie in den anderen PWM Modi, die mit einer doppelten Impulsflanke arbeiten. Die hohe Frequenz des PWM Signals ist günstig bei der Verwendung als Spannungsregulierung, Gleichrichtung und ähnlichen Digital-Analogwandler Anwendungen. Hohe Frequenzen erlauben kleine externe Komponenten (Spulen, Kondensatoren) wodurch die Systemkosten reduziert werden können. Die PWM Auflösung im Fast PWM Modus kann fest eingestellt werden auf 8-, 9- oder 10-bit, oder durch das ICR1 oder OCR1A festgelegt werden. Die minimale Auflösung beträgt 2 Bit (ICR1 oder OCR1A auf 0003 eingestellt), die maximale Auflösung beträgt 16 Bit (ICR1 oder OCR1A auf MAX eingestellt). Die Auflösung der PWM in Bits kann mit folgender Formel berechnet werden:
RFPWM = log(TOP+1)
log(2)
Im Fast PWM Modus wird der Zähler so lange inkrementiert, bis der Zähler entweder einen der festen Werte 00FFh, 01FFh oder 03FFh (WGM13 bis WGM10 = 5, 6, oder 7) oder den Wert des ICR1 (WGM13 bis WGM10 = 14) bzw. den Wert des OCR1A (WGM13 bis WGM10 = 15) erreicht. Der Zähler wird dann mit dem folgenden Zyklus des Timertaktes gelöscht. Das Zeitdiagramm des Fast PWM Modus ist im nachfolgenden Bild zu sehen. Es zeigt den Fall, in dem ICR1 bzw. OCR1A den TOP Wert vorgeben. Der Wert des TCNT1 ist als Histogramm dargestellt, um die einfache Impulsflanke darzustellen. Auch der invertierende und der nicht invertierende Ausgang sind dargestellt. Die kleinen horizontalen Linien an der TCNT1 Flanke kennzeichnen die Vergleichsübereinstimmung zwischen OCR1x und TCNT1. Das OC1x Interrupt Flag wird gesetzt, wenn eine Vergleichsübereinstimmung auftritt.
Bild 16-7: Zeitverlauf bei schneller Pulsweitenmodulation
Das Timer/Counter Overflow Flag (TOV1) wird jedes Mal gesetzt, wenn der Zähler seinen TOP Wert erreicht. Zusätzlich werden auch das OCF1A bzw. das ICF1 Flag gesetzt, wenn das OCR1A oder das ICR1 Register den TOP Wert bestimmen. Wenn einer der Interrupts freigegeben ist, kann die Interruptroutine dazu verwendet werden, die TOP und Vergleichswerte zu aktualisieren.

Wenn der TOP Wert geändert wird, muss das Programm sicherstellen, dass der neue TOP Wert größer oder gleich dem Wert aller Vergleichsregister ist. Ist der neue TOP Wert kleiner, so kann keine Vergleichsübereinstimmung zwischen TCNT1 und OCR1x auftreten. Wenn die festen TOP Werte verwendet werden, werden die ungenutzten Bits mit 0 maskiert wenn eines der OCR1x Register beschrieben wird.

Das Vorgehen bei der Aktualisierung des ICR1 Registers unterscheidet sich von der Aktualisierung des OCR1A Registers, wenn diese dazu verwendet werden, den TOP Wert festzulegen. Das ICR1 Register ist nicht zweifach gebuffert. Das bedeutet, dass, wenn das ICR1 in einen kleinen Wert verändert wird und der Zähler mit keinem oder einen kleinen Vorteiler betrieben wird, ein Risiko besteht, dass der neue ICR1 Wert kleiner ist als der aktuelle Wert von TCNT1. Das Ergebnis wird sein, dass der Zähler keine Vergleichsübereinstimmung erreicht bevor er den TOP Wert erreicht. Der Zähler wird dann bis zum maximalen Wert FFFF laufen, überlaufen und bei 0000 neu beginnen, bevor eine Vergleichsübereinstimmung auftritt. Das OCR1A Register hingegen ist zweifach gebuffert. Diese Eigenschaft erlaubt es das OCR1A Register jederzeit zu beschreiben. Der neue Wert des OCR1A wird zunächst in das Buffer Register geschrieben und erst mit dem Taktzyklus in das OCR1A Vergleichsregister übernommen, der auf das Erreichen des TOP Wertes durch den TCNT1 folgt. Die Übernahme des neuen Wertes erfolgt im gleichen Augenblick in dem das TCNT1 gelöscht und das TOV1 Flag gesetzt wird.

Das ICR1 Register für das Definieren des TOP Wertes zu verwenden ist ähnlich sinnvoll wie das Arbeiten mit den festen Werten. Wenn das ICR1 Register für den TOP Wert verwendet wird, steht das OCR1A Register zur Verfügung, um den PWM Ausgang an OC1A zu generieren. Wann immer die Basisfrequenz des PWM Signals während des laufenden Betriebes verändert werden soll, so ist es besser das OCR1A Register als TOP Wert zu verwenden, da es zweifach gebuffert ist.

Im Fast PWM Modus erlauben die Vergleichseinheiten das Erzeugen von PWM Signalen an den OC1x Pins. Durch Setzen der COM1x1 und COM1x0 Bits auf 2 wird ein nicht invertiertes PWM-Signal erzeugt. Ein invertiertes PWM-Signal kann erzeugt werden, indem COM1x1 und COM1x0 auf 3 gesetzt werden. Um das PWM Signal am Port Pin sichtbar zu machen muss dieser als Ausgang konfiguriert werden (DDR_OC1X = 1). Das PWM Signal wird erzeugt indem das OC1x Register gesetzt (gelöscht) wird, wenn eine Vergleichsübereinstimmung zwischen OCR1x und TCNT1 besteht und das OC1x Register in dem Taktzyklus gelöscht (gesetzt) wird, in dem der Zähler durch den Wechsel von TOP zu BOTTOM gelöscht wird.

Die Frequenz des Ausgangssignals kann mit folgender Formel berechnet werden:

fOCnxPWM = fclk_I/O
2·N·(1+TOP)
Die Variable N steht für den Faktor des Vorteilers (1, 8, 64, 256 oder 1024). Extreme Werte der OCR1x Register stellen spezielle Fälle bei der Erzeugung des PWM Signals im Fast PWM Modus dar. Wenn ein OCR1x Register auf den gleichen Wert wie BOTTOM (also 0000) eingestellt wird, wird eine schmale Spitze am Ausgang erzeugt, die mit jedem TOP+1 Takt auftritt. Das Setzen des OCR1x Registers auf den TOP Wert wird zu einem konstanten Low- oder High-Pegel am Ausgang führen (abhängig ob invertierender oder nicht invertierender Ausgang eingestellt).

Eine Frequenz mit einem Tastverhältnis von 50% kann im Fast PWM Modus dadurch erreicht werden, indem man OC1A so einstellt, dass es seinen Pegel bei jeder Vergleichsübereinstimmung wechselt (COM1x1 und COM1x0 Bits auf 1). Das kann aber nur erreicht werden, wenn OCR1A zum definieren des TOP Wertes verwendet wird. Die erzeugte Ausgangswelle kann eine maximale Frequenz von fOC1A = fclk_I/O/2 haben, wenn OCR1A auf 0000 gesetzt wird. Diese Eigenschaft ist gleich dem OC1A Toggel im CTC Modus, mit der Ausnahme, dass die zweifach gebufferte Output Compare Einheit im Fast PWM Modus zur Verfügung steht.

16.9.4 Phasenrichtige PWM

Der Phase Correct PWM Modus (WGM13 bis WGM10 = 1, 2, 3, 10 oder 11) bietet eine phasenkorrekte Ausgangswelle mit hoher Auflösung. Der Phase correct PWM Modus basiert, wie der phase an frequenzy correct PWM Modus, auf einer zweifachen Impulsflanke. Der Zähler zählt vom BOTTOM Wert bis zum TOP Wert und wieder zurück vom TOP zum BOTTOM Wert. Im nicht invertierenden Compare Output Mode wird der Output Compare (OC1x) gelöscht, wenn beim Hochzählen eine Vergleichsübereinstimmung zwischen dem TCNT1 und OCR1x auftritt und wird gesetzt wenn beim Runterzählen eine Vergleichsübereinstimmung auftritt. Im invertierenden Output Compare Modus ist es genau umgekehrt. Durch die zweifache Impulsflanke ist die Frequenz im phase correct PWM Modus niedriger als in den PWM Modi, die mit einer einfachen Impulsflanke arbeiten. Wegen der symmetrischen Eigenschaften der PWM Modi mit zweifacher Impulsflanke eigenen sich diese besonders für die Steuerung von Motoren.

Die PWM Auflösung im Phase Correct PWM Modus kann fest eingestellt werden auf 8-, 9- oder 10-bit, oder durch das ICR1 oder OCR1A festgelegt werden. Die minimale Auflösung beträgt 2 Bit (ICR1 oder OCR1A auf 0003 eingestellt), die maximale Auflösung beträgt 16 Bit (ICR1 oder OCR1A auf MAX eingestellt). Die Auflösung der PWM in Bits kann mit folgender Formel berechnet werden:

RPCPWM = log(TOP+1)
log(2)
Im Phase Correct PWM Modus wird der Zähler so lange inkrementiert, bis der Zähler entweder einen der festen Werte 00FF, 01FF oder 03FF (WGM13 bis WGM10 = 1, 2, oder 3) oder den Wert des ICR1 (WGM13 bis WGM10 = 10) bzw. den Wert des OCR1A (WGM13 bis WGM10 = 11) erreicht. Der Zähler hat dann den TOP Wert erreicht und ändert daraufhin seine Zählrichtung. Der Wert von TCNT1 wird für einen Takt lang gleich dem ausgewählten TOP Wert sein. Das Zeitdiagramm des Phase Correct PWM Modus ist im nachfolgenden Bild zu sehen. Es zeigt den Fall, in dem ICR1 bzw. OCR1A den TOP Wert vorgeben. Der Wert des TCNT1 ist als Histogramm dargestellt, um die zweifache Impulsflanke darzustellen. Auch der invertierende und der nicht invertierende Ausgang sind dargestellt. Die kleinen horizontalen Linien an der TCNT1 Flanke kennzeichnen die Vergleichsübereinstimmung zwischen OCR1x und TCNT1. Das OC1x Interrupt Flag wird gesetzt, wenn eine Vergleichsübereinstimmung auftritt.
Bild 16-8: Zeitverlauf bei phasenrichtiger PWM
Das Timer/Counter Overflow Flag (TOV1) wird jedes Mal gesetzt, wenn der Zähler seinen BOTTOM Wert erreicht. Wenn das OCR1A oder das ICR1 Register den TOP Wert bestimmen werden dementsprechend auch das OCF1A bzw. das ICF1 Flag gesetzt in dem gleichen Timertakt in dem das OCR1x Register mit dem zweifach gebufferten Wert upgedatet wird (bei TOP). Die Interrupt Flags können genutzt werden, um einen Interrupt bei jedem Erreichen des TOP oder BOTTOM Wertes durch den Zähler zu erzeugen.

Wenn der TOP Wert geändert wird, muss das Programm sicherstellen, dass der neue TOP Wert größer oder gleich dem Wert aller Vergleichsregister ist. Ist der neue TOP Wert kleiner, so kann keine Vergleichsübereinstimmung zwischen TCNT1 und OCR1x auftreten. Wenn die festen TOP Werte verwendet werden, werden die ungenutzten Bits mit 0 maskiert wenn eines der OCR1x Register beschrieben wird. Wie in der dritten Periode in dem Zeitdiagramm zu sehen, kann das Verändern des TOP Wertes während des laufenden Betriebes zu einem unsymmetrischen Ausgang führen. Der Grund hierfür liegt in der Zeit, in der das OCR1x Register aktualisiert wird. Weil das OCR1x Register bei Erreichen des TOP Wertes aktualisiert wird, beginnt und endet eine Periode am TOP Wert. Das hat zur Folge, dass die Länge der fallenden Flanke durch den alten TOP Wert bestimmt wird, während sich die Länge der steigenden Flanke aus dem neuen TOP Wert ergibt. Wenn diese beiden Werte unterschiedlich sind unterscheidet sich auch die Länge der beiden Flanken. Der Unterschied in der Länge führt dann zu dem unsymmetrischen Ausgangssignal.

Es wird empfohlen den Phasen und Frequenzkorrekten PWM Modus zu verwenden, wenn der TOP Wert während des laufenden Zählers verändert werden soll. Wenn ein fester TOP Wert verwendet wird, unterscheiden sich diese beiden Modi nicht.

Im Phase correct PWM Modus erlauben die Vergleichseinheiten das Erzeugen von PWM Signalen an den OC1x Pins. Durch Setzen der COM1x1 und COM1x0 Bits auf 2 wird ein nicht invertiertes PWM-Signal erzeugt. Ein invertiertes PWM-Signal kann erzeugt werden, indem COM1x1 und COM1x0 auf 3 gesetzt werden. Um das PWM Signal am Port Pin sichtbar zu machen muss dieser als Ausgang konfiguriert werden (DDR_OC1X = 1). Das PWM Signal wird erzeugt indem das OC1x Register gesetzt (gelöscht) wird, wenn beim Hochzählen eine Vergleichsübereinstimmung zwischen OCR1x und TCNT1 besteht und das OC1x Register wird gelöscht (gesetzt) wird, wenn beim Runterzählen eine Vergleichsübereinstimmung zwischen OCR1x und TCNT1 besteht. Die Frequenz des Ausgangssignals kann mit folgender Formel berechnet werden:

fOCnxPCPWM = fclk_I/O
2·N·TOP
Die Variable N steht für den Faktor des Vorteilers (1, 8, 64, 256 oder 1024). Extreme Werte der OCR1x Register stellen spezielle Fälle bei der Erzeugung des PWM Signals im Phase correct PWM Modus dar. Wenn ein OCR1x Register auf den gleichen Wert wie BOTTOM eingestellt wird, bleibt der Ausgang permanant auf Low-Pegel Das Setzen des OCR1x Registers auf den TOP Wert wird zu einem konstanten High-Pegel am Ausgang führen (beim invertierenden Modus ist es dann genau anders herum).

Wenn das OCR1A verwendet wird, um den TOP Wert festzulegen (WGM13 bis WGM10 = 11) und COM1A1 und COM1A0 auf 1 sind, dann wechselt der OC1A Ausgang mit einem Tastverhältnis von 50%.

16.9.5 Phasen- und frequenzrichtige PWM

Der Phase and Frequency Correct PWM Modus (WGM13 bis WGM10 = 8 oder 9) bietet eine phasen- und frequenzkorrekte Ausgangswelle mit hoher Auflösung. Der Phase and Frequency correct PWM Modus basiert, wie der phase correct PWM Modus, auf einer zweifachen Impulsflanke. Der Zähler zählt vom BOTTOM Wert (0000) bis zum TOP Wert und wieder zurück vom TOP zum BOTTOM Wert. Im nicht invertierenden Compare Output Mode wird der Output Compare (OC1x) gelöscht, wenn beim Hochzählen eine Vergleichsübereinstimmung zwischen dem TCNT1 und OCR1x auftritt und wird gesetzt wenn beim Runterzählen eine Vergleichsübereinstimmung auftritt. Im invertierenden Output Compare Modus ist es genau umgekehrt. Durch die zweifache Impulsflanke ist die Frequenz im phase and Frequency correct PWM Modus niedriger als in den PWM Modi, die mit einer einfachen Impulsflanke arbeiten. Wegen der symmetrischen Eigenschaften der PWM Modi mit zweifacher Impulsflanke eigenen sich diese besonders für die Steuerung von Motoren.

Der wesentliche Unterschied zwischen dem phasenkorrekten und dem phasen- und frequenzkorrekten PWM Modus ist der Augenblick, in dem das OCR1x Register mit dem Wert aus dem OCR1x Buffer-Register aktualisiert wird.

Die PWM Auflösung im Phase and Frequency PWM Modus kann durch das ICR1 oder das OCR1A festgelegt werden. Die minimale Auflösung beträgt 2 Bit (ICR1 oder OCR1A auf 0003 eingestellt), die maximale Auflösung beträgt 16 Bit (ICR1 oder OCR1A auf MAX eingestellt). Die Auflösung der PWM in Bits kann mit folgender Formel berechnet werden:

RPFCPWM = log(TOP+1)
log(2)
Im Phase and Frequency Correct PWM Modus wird der Zähler so lange inkrementiert, bis der Zähler den Wert des ICR1 (WGM13 bis WGM10 = 8) bzw. den Wert des OCR1A (WGM13 bis WGM10 = 9) erreicht. Der Zähler hat dann den TOP Wert erreicht und ändert daraufhin seine Zählrichtung. Der Wert von TCNT1 wird für einen Takt lang gleich dem ausgewählten TOP Wert sein. Das Zeitdiagramm des Phase and Frequency Correct PWM Modus ist im nachfolgenden Bild zu sehen. Es zeigt den Fall, in dem ICR1 bzw. OCR1A den TOP Wert vorgeben. Der Wert des TCNT1 ist als Histogramm um die zweifache Impulsflanke darzustellen. Auch der invertierende und der nicht invertierende Ausgang sind dargestellt. Die kleinen horizontalen Linien an der TCNT1 Flanke kennzeichnen die Vergleichsübereinstimmung zwischen OCR1x und TCNT1. Das OC1x Interrupt Flag wird gesetzt, wenn eine Vergleichsübereinstimmung auftritt.
Bild 16-9: Zeitverlauf bei phasen- und frequenzrichtiger PWM
Das Timer/Counter Overflow Flag (TOV1) wird jedes Mal gesetzt, wenn das OCR1x Register mit dem Wert aus dem Buffer aktualisiert wird (beim BOTTOM Wert). Wenn das OCR1A oder das ICR1 Register den TOP Wert bestimmen werden dementsprechend auch das OCF1A bzw. das ICF1 Flag gesetzt wenn TCNT1 den TOP Wert erreicht hat. Die Interrupt Flags können genutzt werden, um einen Interrupt bei jedem Erreichen des TOP oder BOTTOM Wertes durch den Zähler auszulösen.

Wenn der TOP Wert geändert wird, muss das Programm sicherstellen, dass der neue TOP Wert größer oder gleich dem Wert aller Vergleichsregister ist. Ist der neue TOP Wert kleiner, so kann niemals eine Vergleichsübereinstimmung zwischen TCNT1 und OCR1x auftreten.

Die Abbildung zeigt, dass der Ausgang im Gegensatz zum phasenCorrecten PWM Modus in allen Perioden symmetrisch ist. Weil das OCR1x Register aktualisiert wird, wenn BOTTOM erreicht ist, ist die Länge der fallenden und der steigenden Impulsflanke immer gleich. Daraus ergibt sich eine symmetrische Ausgangswelle, die immer frequenzkorrekt ist.

Das ICR1 Register für das Definieren des TOP Wertes zu verwenden ist ähnlich sinnvoll wie das Arbeiten mit den festen Werten. Wenn das ICR1 Register für den TOP Wert verwendet wird, steht das OCR1A Register zur Verfügung, um den PWM Ausgang an OC1A zu generieren. Wann immer die Basisfrequenz des PWM Signals während des laufenden Betriebes verändert werden soll, so ist es besser das OCR1A Register als TOP Wert zu verwenden, da es zweifach gebuffert ist.

Im Phase and Frequency correct PWM Modus erlauben die Vergleichseinheiten das Erzeugen von PWM Signalen an den OC1x Pins. Durch Setzen der COM1x1 und COM1x0 Bits auf 2 wird ein nicht invertiertes PWM-Signal erzeugt. Ein invertiertes PWM-Signal kann erzeugt werden, indem COM1x1 und COM1x0 auf 3 gesetzt werden. Um das PWM Signal am Port Pin sichtbar zu machen muss dieser als Ausgang konfiguriert werden (DDR_OC1X = 1). Das PWM Signal wird erzeugt indem das OC1x Register gesetzt (gelöscht) wird, wenn beim Hochzählen eine Vergleichsübereinstimmung zwischen OCR1x und TCNT1 besteht und das OC1x Register gelöscht (gesetzt) wird, wenn beim Runterzählen eine Vergleichsübereinstimmung zwischen OCR1x und TCNT1 besteht.

Die Frequenz des Ausgangssignals kann mit folgender Formel berechnet werden:

fOCnxPFCPWM = fclk_I/O
2·N·TOP
Die Variable N steht für den Faktor des Vorteilers (1, 8, 64, 256 oder 1024). Extreme Werte der OCR1x Register stellen spezielle Fälle bei der Erzeugung des PWM Signals im Phase and frequency correct PWM Modus dar. Wenn ein OCR1x Register auf den gleichen Wert wie BOTTOM eingestellt wird, bleibt der Ausgang permanent auf Low-Pegel Das Setzen des OCR1x Registers auf den TOP Wert wird zu einem konstanten High-Pegel am Ausgang führen (beim invertierenden Modus ist es dann genau anders herum). Wenn das OCR1A verwendet wird, um den TOP Wert festzulegen (WGM13 bis WGM10 = 9) und COM1A1 und COM1A0 auf 1 sind, dann wechselt der OC1A Ausgang mit einem Tastverhältnis von 50%.

16.10 Zeitdiagramme

Der Zähler/Zeitgeber ist synchron aufgebaut, daher ist das Taktsignal clkT1 in den folgenden Abbildungen als ein den Takt freigebendes Signal dargestellt. Die Abbildungen zeigen auch, wann die Interrupt Flags gesetzt werden und die OCR1x Register mir den Werten aus dem Buffer Register aktualisiert werden (nur in Modi, die die zweifache Bufferung verwenden).

Die nachfolgende Abbildung zeigt das Setzen des OCF1x

Bild 16-10: Zeitverlauf, Setzen vom OCF1x, ohne Vorteiler
Die nachfolgende Abbildung zeigt den gleichen Vorgang, jedoch mit Vorteiler
Bild 16-11: Zeitverlauf, Setzen vom OCF1x, mit Vorteiler (fclk_I/O/8)
Die nachfolgende Abbildung zeigt eine Zählsequenz bis zum TOP Wert in verschiedenen Modi. Wenn der phasen und frequenzkorrekte PWM Modus genutzt wird, wird das OCR1x Register bei BOTTOM aktualisiert. Das Zeitdiagramm ist das gleiche, allerdings muss TOP durch BOTTOM ersetzt, TOP-1 durch BOTTOM+1 usw. Das Umbenennen trifft auch auf die Modi zu, die das TOV1 Flag bei BOTTOM setzen.
Bild 16-12: Zeitdiagramm beim Zählerüberlauf, ohne Vorteiler
Die nachfolgende Abbildung zeigt den gleichen Vorgang, jedoch mit Vorteiler
Bild 16-13: Zeitdiagramm beim Zählerüberlauf, mit Vorteiler (fclk_I/O/8)

16.11 Register-Beschreibung

16.11.1 TCCR1A — Kontrollregister A

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x80) | COM1A1 | COM1A0 | COM1B1 | COM1B0 | - | - | WGM11 | WGM10 | TCCR1A
Zugriff | R/W | R/W | R/W | R/W | R | R | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7 und 6 – COM1A1 und COM1A0: Compare Output Mode für Kanal A
  • Bit 5 und 4 – COM1B1 und COM1B0: Compare Output Mode für Kanal B
Die beiden Bits COM1A1/COM1A0 sowie COM1B1/COM1B0 kontrollieren das Verhalten der beiden Output Compare Pins OC1A und OC1B. Wenn eines der beiden Bits gesetzt ist, überlagert das OC1x-Signal die normale I/O-Funktion des Pins. Im Data Direction Register (DDR) müssen die entsprechenden Bits für OC1A bzw. OC1B so gesetzt sein, dass die Pins als Ausgang konfiguriert sind.

Wenn OC1A oder OC1B als Ausgangsfunktion verwendet werden, ist deren Funktion von den Einstellungen der WGM-Bits abhängig. Nachfolgende Tabelle zeigt die Funktionen der COM1nx-Bits, wenn die WGM-Bits auf den normalen oder den CTC-Modus eingestellt sind.

Tabelle 16-1: Aktion bei Output Compare in Nicht-PWM-Betriebsarten
COM1A1/COM1B1 | COM1A0/COM1B0 | Funktion
0 | 0 | Normale Portfunktion, OC1A/OC1B abgeschaltet
0 | 1 | Wechsel an OC1A/OC1B bei Compare Match
1 | 0 | Löschen von OC1A/OC1B bei Compare Match (Low-Pegel)
1 | 1 | Setzen von OC1A/OC1B bei Compare Match (High-Pegel)
Tabelle 16-2: Aktion bei Output Compare bei schneller PWM(1)
COM1A1/COM1B1 | COM1A0/COM1B0 | Funktion
0 | 0 | Normale Portfunktion, OC1A/OC1B abgeschaltet
0 | 1 | WGM = 15: Wechsel an OC1A bei Compare Match, OC1B abgeschaltet (Normale Portfunktion)
1 | 0 | Löschen von OC1A/OC1B bei Compare Match, Setzen von OC1A/OC1B bei TOP
1 | 1 | Setzen von OC1A/OC1B bei Compare Match, Löschen von OC1A/OC1B bei TOP
Hinweis:
  1. Ein Sonderfall tritt ein wenn OCR1A/OCR1B gleich TOP und COM1A1/COM1B1 gesetzt. In diesem Fall wird das Compare-Match-Ereignis ignoriert, jedoch das Löschen oder Setzen auf BOTTOM vollzogen. Siehe oben für Details.
Tabelle 16-3: Aktion bei Output Compare bei phasen- und/oder frequenzrichtiger PWM(1)
COM1A1/COM1B1 | COM1A0/COM1B0 | Funktion
0 | 0 | Normale Portfunktion, OC1A/OC1B abgeschaltet
0 | 1 | WGM = 9 oder 14: Wechsel an OC1A bei Compare Match, OC1B abgeschaltet (Normale Portfunktion)
1 | 0 | Löschen von OC1A/OC1B bei Compare Match beim Hochzählen, Setzen von OC1A/OC1B bei Compare Match beim Runterzählen
1 | 1 | Setzen von OC1A/OC1B bei Compare Match beim Hochzählen, Löschen von OC1A/OC1B bei Compare Match beim Runterzählen
Hinweis:
  1. Ein Sonderfall tritt ein wenn OCR1A/OCR1B gleich TOP und COM1A1/COM1B1 gesetzt. Siehe oben für Details.
  • Bit 1 und 0 – WGM11 und WGM10: Waveform Generation Mode
Diese Bits sind in Kombination mit den WGM-Bits, die im TCCR1B-Register zu finden sind, zu verwenden. Die WGM-Bits kontrollieren die Zählsequenz des Zählers, die Quelle für den Maximalwert (TOP) des Zählers und die Art der generierten Ausgangswelle. Die vom Zähler/Zeitgeber 1 unterstützend Arbeitsmodi sind: Normal, Verkürzter Zählumfang (CTC) und drei verschiedene PWM-Modi.
Tabelle 16-4: Bit-Beschreibung zur Art der Schwingungserzeugung(1)
Modus | WGM13 | WGM12 | WGM11 (CTC1) (PWM11) | WGM10 (PWM10) | PWM-Betriebsart | TOP | Wann Aktualisierung von OCR1x? | Wann TOV-Flag gesetzt?
0 | 0 | 0 | 0 | 0 | Normal | 0xFF | sofort | MAX
1 | 0 | 0 | 0 | 1 | Phasenrichtige PWM 8 Bit | 0x00FF | TOP | BOTTOM
2 | 0 | 0 | 1 | 0 | Phasenrichtige PWM 9 Bit | 0x01FF
3 | 0 | 0 | 1 | 1 | Phasenrichtige PWM 10 Bit | 0x03FF
4 | 0 | 1 | 0 | 0 | Verkürzter Zählumfang | OCR1A | sofort | MAX
5 | 0 | 1 | 0 | 1 | Schnelle PWM 8 Bit | 0x00FF | BOTTOM | TOP
6 | 0 | 1 | 1 | 0 | Schnelle PWM 9 Bit | 0x01FF
7 | 0 | 1 | 1 | 1 | Schnelle PWM 10 Bit | 0x03FF
8 | 1 | 0 | 0 | 0 | Phasen- und frequenzrichtige PWM | ICR1 | BOTTOM | BOTTOM
9 | 1 | 0 | 0 | 1 |  | OCR1A
10 | 1 | 0 | 1 | 0 | Phasenrichtige PWM | ICR1 | TOP | BOTTOM
11 | 1 | 0 | 1 | 1 |  | OCR1A
12 | 1 | 1 | 0 | 0 | Verkürzter Zählumfang | ICR1 | sofort | MAX
13 | 1 | 1 | 0 | 1 | reserviert | - | - | -
14 | 1 | 1 | 1 | 0 | Schnelle PWM | ICR1 | BOTTOM | TOP
15 | 1 | 1 | 1 | 1 |  | OCR1A
Hinweis:
  1. Die Bitnamen CTC1 und PWM[1:0] sind obsolet und zum Erhalt der Kompatibilität zu älterem Quellkode. In neuer Software sollten die neuen Bitnamen WGM1[3:0] benutzt werden.

16.11.2 TCCR1B — Kontrollregister B

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x81) | ICIC1 | ICES1 | - | WGM13 | WGM12 | CS12 | CS11 | CS10 | TCCR1B
Zugriff | R/W | R/W | R | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7 – ICNC1: Störunterdrückung für Input-Capture
Wenn dieses Bit gesetzt ist, ist die Störunterdrückung aktiviert. Wenn die Störunterdrückung aktiviert ist, wird der Eingang des Input-Capture-Pins gefiltert. Die Filterfunktion erfordert vier erfolgreiche gleiche Wertabtastungen des ICP1-Pins, um seinen Ausgang zu ändern. Der Input-Capture ist daher um vier Takte verzögert, wenn der Störunterdrückung freigegeben ist.
  • Bit 6 – ICES1: Flankenauswahl für Input-Capture
Dieses Bit bestimmt, welche Flanke am Input-Capture-Pin ICP1 notwendig ist, um ein Capture Ereignis zu triggern. Wenn das ICES1 Bit auf 0 gesetzt wird, wird eine negative/fallende Flanke als Trigger verwendet, wenn das ICES1 Bit auf 1 gesetzt ist, wird eine positive/steigende Flanke als Trigger verwendet.

Wenn ein Trigger entsprechend der Einstellung des Bits erfolgt, wird der Wert des Zählers in das Input-Capture-Register ICR1 kopiert. Das Ereignis setzt ebenfalls das Input-Capture-Flag ICF1, das verwendet werden kann, um einen Interrupt auszulösen, wenn dieser freigegeben ist.

Wenn das ICR1-Register als TOP-Wert (siehe WGM-Bits) verwendet wird, ist der ICP1-Pin abgeschaltet und somit die Input-Capture-Funktion gesperrt.

  • Bit 5 – Res: Reserviertes Bit
Dieses Bit ist reserviert und wird immer als 0 gelesen. Um die Kompatibilität mit zukünftigen Bausteinen sicherzustellen, sollte das Bit immer mit 0 beschrieben werden, wenn das TCCR1B Register beschrieben wird.
  • Bit 4:3 – WGM1[3:2]: Betriebsart der Schwingungserzeugung
Siehe Beschreibung des Registers TCCR1A.
  • Bit 2:0 – CS1[2:0]: Taktauswahl
Diese Bits bestimmen die Vorteilerquelle für Zähler/Zeitgeber 1, siehe Bild 16-10 und Bild 16-11.
Tabelle 16-5: Taktauswahl-Bitbeschreibung
CS12 | CS11 | CS10 | Beschreibung
0 | 0 | 0 | Zähler/Zeitgeber 1 ist gestoppt
0 | 0 | 1 | clkI/O/1 (kein Vorteiler)
0 | 1 | 0 | clkI/O/8 (mit Vorteiler)
0 | 1 | 1 | clkI/O/64 (mit Vorteiler)
1 | 0 | 0 | clkI/O/256 (mit Vorteiler)
1 | 0 | 1 | clkI/O/1024 (mit Vorteiler)
1 | 1 | 0 | Externe Quelle am T1 Pin, fallende Flanke
1 | 1 | 1 | Externe Quelle am T1 Pin, steigende Flanke
Wenn eine externe Quelle zum Takten des Zähler/Zeitgeber 1 verwendet wird, so funktioniert die Taktung auch, wenn der Pin als Ausgang konfiguriert ist. Damit ist es möglich die Zählfunktion per Software zu steuern.

16.11.3 TCCR1C — Kontrollregister C

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x82) | FOC1A | FOC1B | - | - | - | - | - | - | TCCR1C
Zugriff | R/W | R/W | R | R | R | R | R | R
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7 – FOC1A: Erzwinge Output-Compare für OC1A
  • Bit 6 – FOC1B: Erzwinge Output-Compare für OC1B
Die beiden Bits FOC1A und FOC1B sind nur aktiv, wenn die WGM-Bits einen Nicht-PWM-Modus auswählen. Um die Kompatibilität mit zukünftigen Bausteinen sicherzustellen, müssen diese Bits auf 0 gesetzt werden, wenn der Zähler in einem PWM-Modus betrieben wird. Wenn eine logische 1 in die FOC1A- bzw. FOC1B-Bits geschrieben wird, wird unmittelbar ein Compare-Match erzwungen. Die OC1A- bzw. OC1B-Ausgänge ändern sich dann den Einstellungen der COM-Bits entsprechend. Zu beachten ist, dass die FOC-Bits im Sinne von Freigabebits implementiert sind, so dass das Verhalten beim erzwungenen Compare-Match durch die COM-Bits bestimmt wird.

Ein erzwungener Compare-Match generiert keine Interrupts und löscht den Timer nicht. Die FOC-Bits werden immer als 0 gelesen.

16.11.4 TCNT1 — Zählregister

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x85) | TCNT1[15:8] |  |  |  |  |  |  |  | TCNT1H
(0x84) | TCNT1[7:0] |  |  |  |  |  |  |  | TCNT1L
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
Die beiden I/O-Register TCNT1H und TCNT1L, die zusammen den Zähler/Zeitgeber 1 TCNT1 darstellen, geben einen direkten Zugriff auf den 16-bit-Zähler bei Lese- und Schreiboparationen. Um sicherzustellen, dass das Low- und High-Byte zeitgleich gelesen und geschrieben werden, wenn die CPU darauf zugreift, wird für das High-Byte ein Schattenregister (TEMP) verwendet. Dieses Schattenregister wird auch von den anderen 16-bit-Registern verwendet.

Ein Verändern des Zählers (TCNT1) während der Zähler läuft, führt zu dem Risiko, dass ein Compare-Match zwischen TCNT1 und den OCR1x-Registern ausgelassen wird.

Beim Schreiben in das TCNT1-Register werden die Compare-Match im nächsten Takt bei allen Vergleichseinheiten blockiert.

16.11.5 OCR1A — Vergleichsregister A

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x89) | OCR1A[15:8] |  |  |  |  |  |  |  | OCR1AH
(0x88) | OCR1A[7:0] |  |  |  |  |  |  |  | OCR1AL
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
Der Wert in OCR1A wird ständig mit dem Zählregister TCNT1 verglichen. Bei Gleichheit kann ein Compare-Match-Interrupt ausgelöst und/oder ein Signalverlauf am OC1A-Pin generiert werden.

16.11.6 OCR1B — Vergleichsregister B

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x8B) | OCR1B[15:8] |  |  |  |  |  |  |  | OCR1BH
(0x8A) | OCR1B[7:0] |  |  |  |  |  |  |  | OCR1BL
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
Die Output Compare Register enthalten einen 16-bit Wert, der permanent mit dem Wert des Zählers (TCNT1) verglichen wird. Eine Übereinstimmung kann dazu genutzt werden, einen Interrupt auszulösen oder eine Ausgangswelle am OC1x Pin zu erzeugen.

Die Output Compare Register sind 16-bit breit. Um sicherzustellen, dass das Low- und High-Byte zeitgleich gelesen und geschrieben werden, wenn die CPU darauf zugreift, wird für das High-Byte ein Schattenregister (TEMP) verwendet. Dieses Schattenregister wird auch von den anderen 16-bit Registern verwendet.

16.11.7 ICR1 — Input-Capture-Register

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x87) | ICR1[15:8] |  |  |  |  |  |  |  | ICR1H
(0x86) | ICR1[7:0] |  |  |  |  |  |  |  | ICR1L
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
Das Input Capture Register wird immer dann mit dem Wert des Zählers aktualisiert, wenn ein Ereignis am ICP1 Pin oder am Ausgang des Analogvergleichers auftritt. Das Input Capture Register kann auch verwendet werden, um den TOP Wert für den Zähler festzulegen.

Das Input Capture Register ist 16-bit breit. Um sicherzustellen, dass das Low- und High-Byte zeitgleich gelesen und geschrieben werden, wenn die CPU darauf zugreift, wird für das High-Byte ein Schattenregister (TEMP) verwendet. Dieses Schattenregister wird auch von den anderen 16-bit Registern verwendet. Siehe 16-Bit-Registerzugriff.

16.11.8 TIMSK1 — Interrupt-Maske

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x6F) | - | - | ICIE1 | - | - | OCIE1B | OCIE1A | TOIE1 | TIMSK1
Zugriff | R | R | R/W | R | R | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7:6,4:3 – reserviert
Diese Bits sind reserviert und werden immer als 0 gelesen.
  • Bit 5 – TICIE1: Zähler/Zeitgeber 1 Interruptfreigabe für Input-Capture
Wenn das TICIE1-Bit gesetzt ist und das I-Bit in Status-Register (SREG) ebenfalls gesetzt ist, ist der Zähler/Zeitgeber 1 Input Capture Interrupt freigegeben. Die dazugehörige Interrupt-Routine wird ausgeführt, wenn das ICF1-Bit im TIFR1-Register gesetzt wird.
  • Bit 2 – OCIE1B: Zähler/Zeitgeber 1 Interruptfreigabe für Output-Compare B
Wenn das OCIE1B-Bit gesetzt ist und das I-Bit in Status-Register (SREG) ebenfalls gesetzt ist, ist der Zähler/Zeitgeber 1 Output Compare B Match Interrupt freigegeben. Die dazugehörige Interrupt-Routine wird ausgeführt, wenn das OCF1B-Bit im TIFR1-Register gesetzt wird.
  • Bit 1 – OCIE1A: Zähler/Zeitgeber 1 Interruptfreigabe für Output-Compare A
Wenn das OCIE1A-Bit gesetzt ist und das I-Bit in Status-Register (SREG) ebenfalls gesetzt ist, ist der Zähler/Zeitgeber 1 Output Compare A Match Interrupt freigegeben. Die dazugehörige Interrupt-Routine wird ausgeführt, wenn das OCF1A-Bit im TIFR1-Register gesetzt wird.
  • Bit 0 – TOIE1: Zähler/Zeitgeber 1 Interruptfreigabe für Zählerüberlauf
Wenn das TOIE1-Bit gesetzt ist und das I-Bit in Status-Register (SREG) ebenfalls gesetzt ist, ist der Zähler/Zeitgeber 1 Overflow Interrupt freigegeben. Die dazugehörige Interrupt-Routine wird ausgeführt, wenn ein Überlauf im Zähler/Zeitgeber 1 aufgetreten ist und somit das TOV1-Bit im TIFR1-Register gesetzt wird.

16.11.9 TIFR1 — Interrupt-Flags

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x36) | - | - | ICF1 | - | - | OCF1B | OCF1A | TOV1 | TIFR1
Zugriff | R | R | R/W | R | R | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7:6,4:3 – reserviert
Diese Bits sind reserviert und werden immer als 0 gelesen.
  • Bit 5 – ICF1: Zähler/Zeitgeber 1 Flagge für Input-Capture
Das ICF1-Bit wird gesetzt, wenn ein Capture-Ereignis am ICP1-Pin auftritt. Wenn das ICR1-Register für den TOP-Wert des Zählers verwendet wird, wird das ICF1-Flag immer dann gesetzt, wenn der Zähler den TOP-Wert erreicht.

Das Bit wird automatisch gelöscht, wenn die dazugehörige Interrupt-Routine ausgeführt wird. Alternativ kann das Flag gelöscht werden, in dem man eine logische „1“ in das Flag schreibt.

  • Bit 2 – OCF1B: Zähler/Zeitgeber 1 Flagge für Output-Compare B
Das OCF1B-Bit wird in dem Taktzyklus gesetzt, nachdem der Zähler TCNT1 den Wert des Output-Compare-Register B (OCR1B) erreicht hat. Ein erzwungener Output-Compare (FOC1B) setzt das OCF1B-Flag hingegen nicht.

Das Bit wird automatisch gelöscht, wenn die dazugehörige Interrupt-Routine ausgeführt wird. Alternativ kann das Flag gelöscht werden, in dem man eine logische „1“ in das Flag schreibt.

  • Bit 1 – OCF1A: Zähler/Zeitgeber 1 Flagge für Output-Compare A
Das OCF1A-Bit wird in dem Taktzyklus gesetzt, nachdem der Zähler TCNT1 den Wert des Output-Compare-Register A (OCR1A) erreicht hat. Ein erzwungener Output-Compare (FOC1A) setzt das OCF1A-Flag hingegen nicht.

Das Bit wird automatisch gelöscht, wenn die dazugehörige Interrupt-Routine ausgeführt wird. Alternativ kann das Flag gelöscht werden, in dem man eine logische „1“ in das Flag schreibt.

  • Bit 0 – TOV1: Zähler/Zeitgeber 1 Flagge für Überlauf
Das Setzen dieses Flags ist abhängig von den Einstellungen der WGM-Bits. Im normalen und im verkürzten Zählumfang wird das TOV1-Bit gesetzt, wenn ein Überlauf in Zähler/Zeitgeber 1 auftritt; im Fall des verkürzten Zählumfangs bei Überlauf jenseits des Vergleichswertes. Siehe Tabellen auf den Seiten zuvor für das Verhalten des Flags in den anderen Fällen.

Das Bit wird automatisch gelöscht, wenn die dazugehörige Interrupt-Routine ausgeführt wird. Alternativ kann das Flag gelöscht werden, in dem man eine logische „1“ in das Flag schreibt.


Vorteiler für Zähler/Zeitgeber 0 und 1

17. Vorteiler für Zähler/Zeitgeber 0 und 1

Die Zähler/Zeitgeber 0 und 1 verwenden das gleiche Vorteilermodul, können aber unterschiedliche Vorteilereinstellungen haben. Die Nachfolgende Beschreibung gilt für beide Zähler/Zeitgeber.

17.1 Interne Taktquelle

Die Zähler/Zeitgeber können direkt durch den Systemtakt getaktet werden (CSn2 bis CSn0 = 001). Dies ist die schnellste Arbeitsweise mit der maximalen Taktfrequenz für den Zähler/Zeitgeber, die der Frequenz des Systemtaktes fCLK_I/O entspricht. Alternativ können vier Stufen des Vorteilers als Taktquelle verwendet werden. Der Vorteiler liefert Frequenzen von fCLK_I/O/8, fCLK_I/O/64, fCLK_I/O/256 und fCLK_I/O/1024.

17.2 Vorteiler-Reset

Der Vorteiler ist freilaufend, d.h. er arbeitet unabhängig von der Taktauswahllogik des Zähler/Zeitgebers und wird von Zähler/Zeitgeber0 und Zähler/Zeitgeber1 gemeinsam genutzt. Da der Vorteiler nicht durch die Taktauswahllogik beeinflusst wird, kann der Vorteiler in einem beliebigen Zustand sein, wenn er als Taktquelle für einen Zähler/Zeitgeber ausgewählt wird. D.h. im Moment des Einschaltens als Taktquelle kann der Vorteiler einen beliebigen Zählerstand zwischen 1 und N+1 (mit N = 8, 64, 256 oder1024) haben.

Es ist also wichtig, den Vorteiler zu reseten, um ihn mit der Programmausführung zu synchronisieren. Auf jeden Fall muss mit der notwendigen Vorsicht bedacht werden, dass beide Zähler/Zeitgeber den Vorteiler gemeinsam nutzten. Ein Reset des Vorteilers wirkt sich auf alle Zähler/Zeitgeber aus, die mit ihm verbunden sind.

17.3 Externe Taktquelle

Eine externe Taktquelle an den Pins T0 und T1 kann verwendet werden, um als Takt clkT0 und clkT1 für die Zähler/Zeitgeber zu dienen. Die T0/T1 Pins werden einmal während jedes Systemtaktes durch die Synchronisationslogik abgetastet. Das synchronisierte (abgetastete) Signal wird dann an einen Flankenerkenner weitergeleitet. Das nachfolgende Abbild zeigt das Blockdiagramm der Synchronisation und Flankenerkennung. Die Register werden durch die positive Flanke des internen Systemtaktes clkI/O. Das Latch ist während der positiven Periode des internen Systemtaktes transparent.

Der Flankenerkenner generiert einen Puls der clkT1/clkT0 Takte bei jeder positiven (CSn2 bis CSn0 = 111) bzw. negativen (CSn2 bis CSn0 = 110) Flanke, die er erkennt.

Bild 17-1: Pin Sampling T1/T0
Die Synchronisation und die Flankenerkennung erzeugen eine Verzögerung von 2,5 bis 3,5 Systemtakten zwischen dem Auftreten der Flanke am T9/T1 Pin und dem Inkrementieren des Zählers.

Das Freigeben und Sperren des Takteinganges muss ausgeführt werden, solange T1/T0 für mindestens einen Systematakt stabil sind, da andernfalls ein ungewollter Taktimpuls für den Zähler/Zeitgeber erzeugt werden kann.

Jede Hälfte des externen Taktsignals muss länger sein, als ein Zyklus des internen Taktsignals um ein korrektes Abtasten des Signals sicherzustellen. Die Frequenz des externen Signals darf maximal halb so groß sein wie die Frequenz des internen Systemtaktes, wenn das Puls-Pausenverhältnis 1:1 beträgt (Abtasttheorem). Da es immer Toleranzen beim Systemtakt selbst wie auch bei dem externen Takt geben kann, sollte die Frequenz des externen Signals kleiner als fclk_I/O/2,5 sein. Ein externes Signal kann nicht vorgeteilt werden.

Bild 17-2: Vorteiler Timer0/Timer1

17.4 Registerberschreibung

17.4.1 GTCCR — Allgemeines Zähler/Zeitgeber-Kontrollregister

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x43) | TSM | - | - | - | - | - | PSRASY | PSRSYNC | GTCCR
Zugriff | R/W | R | R | R | R | R | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7 — TSM: Synchronisationsmodus
Eine Eins aktiviert den Synchronisationsmodus für die Zeitgeber 0 und 1. In diesem Fall werden die Bits PSRASY und PSRSYNC gehalten und damit ein gegebenes Rücksetzsignal gehalten. Damit werden die Zeitgeber angehalten und können ohne die Gefahr eintreffender Zählimpulse konfiguriert werden. Wird TSM gelöscht, werden in Folge die Bits PSRASY und PSRSYNC gelöscht, und die beiden Zeitgeber starten exakt gleichzeitig.
In der Zählerbetriebsart ist der Vorteiler ohne Effekt.
  • Bit 0 — PSRSYNC: Vorteiler rücksetzen
Wenn dieses Bit mit einer 1 beschrieben wird, wird der Vorteiler für Zähler/Zeitgeber 0 und 1 zuückgesetzt. Das Bit wird durch die Hardware automatisch wieder gelöscht, wenn der Reset ausgeführt wurde. Dies geschieht sofort, außer wenn das TSM-Bit gesetzt ist. Man beachte, dass die Zähler/Zeitgeber 0 und 1 den Vorteiler gemeinsam verwenden, und ein Rücksetzen betrifft beide Zähleinheiten.


8-bit Zähler/Zeitgeber 2

18. 8-bit Zähler/Zeitgeber 2

18.1 Features

  • Einkanal-Zähler
  • Löschen des Zählers bei Gleichheit mit Vergleichsregister = CTC-Modus (= einstellbare PWM-Frequenz)
  • Glitchfreier, optional phasenkorrekter Pulsweitenmodulator (PWM)
  • Frequenzgenerator
  • 10-bit-Vorteiler
  • Drei Interruptquellen (TOV2, OCF2A und OCF2B)
  • Taktung durch externen 32-kHz-Uhrenquarz unabhängig vom Systemtakt möglich

18.2 Übersicht

Ein einfaches Blockschaltbild des 8-bit Zähler/Zeitgeber ist nachfolgend dargestellt. Die Nummern der Pins sind von der Gehäuseform des Bausteins abhängig (siehe Anschlussbelegung). Die I/O-Register, die dazugehörigen I/O-Bits und die I/O-Pins, auf die die CPU direkt zugreifen kann, sind fett dargestellt.

Blockschaltbild des Timer 2

18.2.1 Register

Das Zähler/Zeitgeber Register (TCNT2) und die Output Compare Register OCR2A und OCR2B sind 8-bit Register. Die Signale der Interruptanforderungen sind im Timer Interrupt Flag Register (TIFR) sichtbar. Alle Interrupts können individuell im Timer Interrupt Mask Register (TIMSK) maskiert werden. Die beiden letztgenannten Register sind im Blockschaltbild nicht abgebildet, da sie auch die Bits für andere Timer-Einheiten enthalten.

Der Zähler/Zeitgeber kann intern, über einen Vorteiler oder durch eine asynchrone externe Taktquelle an den TOSC1/2 Pins getaktet werden. Die asynchronen Operationen werden durch das Asynchronous Status Register kontrolliert. Die Taktauswahl-Logik gibt vor, durch welchen Takt der Timer seinen Wert inkrementiert oder dekrementiert. Der Zähler/Zeitgeber ist inaktiv, wenn keine Taktquelle ausgewählt wurde. Der Ausgang der Taktauswahl-Logik wird als Timer-Takt clkT2 bezeichnet.

Das zweifach gebufferte Output Compare Register (OCR2) wird ständig mit dem Wert des Timers verglichen. Das Ergebnis dieses Vergleiches kann vom Wellenformerzeuger genutzt werden, um eine PWM oder eine variable Frequenz am Ausgang des Output Compare Pins (OC2) zu erzeugen. Das Ereignis der Vergleichsübereinstimmung setzt außerdem das Compare Match Flag (OCF2), das genutzt werden kann, um einen Output Compare Interrupt auszulösen.

18.2.2 Definitionen

Viele Register und Bits in diesem Dokument werden allgemein beschrieben. Der Index „n“ steht für die Nummer des Zähler/Zeitgeber, in diesem Fall also für eine 2. In einem Programm müssen aber immer die präzisen Bezeichnungen angegeben werden, also z.B. TCNT2 um auf den Wert des Zähler/Zeitgeber2 zuzugreifen.
Definitionen
BOTTOM | Der Zähler erreicht BOTTOM, wenn er 0x00 wird.
MAX | Der Zähler erreicht sein MAXimum, wenn er 0xFF (255 dezimal) wird
TOP | Der Zähler erreicht TOP, wenn die Zählung einen oberen Grenzwert erreicht. Als oberer Wert kann 0xFF oder der Wert im OCR2A-Register festgelegt werden. Diese Festlegung ist vom Betriebsmodus abhängig.

18.3 Taktquellen

Der Zähler/Zeitgeber kann durch eine interne synchrone oder durch eine externe asynchrone Quelle getaktet werden. Die Taktquelle clkT2 ist auf den MCU Takt clkI/O voreingestellt. Wenn das AS2 Bit im ASSR Register mit einer 1 beschrieben wird, wird die Taktquelle verwendet, die vom Oszillator stammt, der an TOSC1 / TOSC2 angeschlossen ist.

18.4 Zählereinheit

Der Hauptteil des Zähler/Zeitgeber2 ist die programmierbare 8-bit bidirektionale Zählereinheit. Das Blockschaltbild zeigt die Zählereinheit mit ihrer Umgebung.
Zählereinheit Timer 2
Beschreibung der internen Signale:
count | Inkrementiert oder dekrementiert TCNT2 um 1
direction | Auswahl zwischen Inkrement und Dekrement
clear | Löscht TCNT2 (alle Bits Null)
clkT2 | Zähler/Zeitgeber Takt
TOP | Signalisiert, dass TCNT2 den Maximalwert erreicht hat
BOTTOM | Signalisiert, dass TCNT2 den Minimalwert (Null) erreicht hat

Abhängig vom gewählten Arbeitsmodus wird der Zähler mit Takt des Timer Clock clkT2 gelöscht, inkrementiert oder dekrementiert. Der Takt clkT2 kann durch eine externe oder interne Quelle erzeugt werden, die Einstellung erfolgt mit den Clock Select Bits CS22 bis CS20. Wenn keine Taktquelle ausgewählt ist (CS22 bis CS20 =000), dann wird der Zähler gestoppt. Auf den Wert von TCNT2 kann aber jederzeit zugegriffen werden, unabhängig davon, ob der Takt clkT2 vorhanden ist oder nicht. Das Beschreiben des Zählers durch die CPU hat Vorrang vor allen Lösch- und Zähl-Operationen des Zählers.

Eine Zählsequenz wird durch die Einstellungen des Waveform Generation Mode Bits (WGM21 bis WGM20) in dem TCCR2 Register bestimmt. Es besteht ein fester Zusammenhang zwischen der Arbeitsweise des Zählers und der erzeugten Wellenform am Output Compare Ausgang OC2.

Das Timer Counter Overflow Flag (TOV2) wird den Einstellungen der WGM2x Bits entsprechend gesetzt. Es kann genutzt werden, um einen Interrupt auszulösen.

18.5 Output Compare

Die 8-bit-Vergleicher vergleichen kontinuierlich den Wert des TCNT2-Registers mit den Output Compare Registern OCR2A und OCR2B. Wenn die Werte von TCNT2 und OCR2x gleich sind, signalisiert der Vergleicher die Übereinstimmung. Durch die Übereinstimmung wird das Output Compare Flag (OCF2x) mit dem nächsten Timer-Takt gesetzt. Wenn freigegeben (OCIE2x = 1), erzeugt das Output Compare Flag einen Interrupt. Das Flag wird automatisch gelöscht, wenn die Interruptroutine ausgeführt wird. Es kann aber auch per Software gelöscht werden, indem eine 1 in das Bit geschrieben wird. Der Waveform Generator verwendet das Übereinstimmungssginal, um ein Ausgangssignal entsprechend der Einstellungen der Waveform Generation Mode Bits (WGM21 bis WGM20) und der Compate Output Mode Bits (COM21 und COM20) zu erzeugen. Das TOP- und BOTTOM-Signal wird vom Waveform-Generator verwendet um die besonderen Fälle von extremen Werten in einigen Betriebsmodi zu handhaben.

Output Compare Timer2

Die Register OCR2A und OCR2B sind zweifach gepuffert, wenn einer der PWM-Modi verwendet wird. Im normalen Clear Timer on Compare (CTC) Modus ist die zweifache Pufferung ausgeschaltet. Die zweifache Pufferung dient zur Synchronisation der laufenden Zählung mit sich verändernden TOP- und BOTTOM-Werten in den OCR2x-Registern. Die Synchronisation verhindert das Auftreten von unsymmetrischen PWM-Pulsen und macht den Ausgang glitchfrei.

Der Zugriff auf die OCR2x-Register sieht kompliziert aus, ist es aber nicht. Wenn die Pufferung freigegeben ist, dann greift die CPU auf das ORC2x-Pufferregister zu, wenn die Pufferung ausgeschaltet ist, dann greift die CPU direkt auf das OCR2-Register zu.

18.5.1 Output Compare erzwingen

In Nicht-PWM-Modi kann der Übereinstimmungsausgang des Vergleiches auch erzwungen werden, indem man eine 1 in das Force Output Compare (FOC2) Bit schreibt. Bei der erzwungenen Vergleichsübereinstimmung wird weder ein OCF2x-Flag gesetzt noch der Timer gelöscht oder neu geladen. Allerdings wird der OC2x-Pin aktualisiert so als sei eine echte Vergleichsübereinstimmung aufgetreten. Ob das OC2x-Pin gelöscht, gesetzt oder gewechselt wird, wird durch die Einstellungen der Bits COM2x1 und COM2x0 festgelegt.

18.5.2 Blockade von Output Compare beim Schreiben auf TCNT2

Alle Schreibversuche der CPU in das TCNT2-Register blockieren eine Vergleichsübereinstimmung die im nächsten Taktzyklus auftritt, auch wenn der Timer gestoppt ist. Dadurch ist des möglich, die OCR2-Register mit den gleichen Werten wie das TCNT2-Register zu beschreiben, ohne dass dadurch ein Interrupt ausgelöst wird.

18.5.3 Nutzung der Output-Compare-Einheit

Since writing TCNT2 in any mode of operation will block all compare matches for one timer clock cycle, there are risks involved when changing TCNT2 when using the Output Compare channel, independently of whether the Timer/Counter is running or not. If the value written to TCNT2 equals the OCR2x value, the compare match will be missed, resulting in incorrect waveform generation. Similarly, do not write the TCNT2 value equal to BOTTOM when the counter is downcounting. The setup of the OC2x should be performed before setting the Data Direction Register for the port pin to output. The easiest way of setting the OC2x value is to use the Force Output Compare (FOC2x) strobe bit in Normal mode. The OC2x Register keeps its value even when changing between Waveform Generation modes. Be aware that the COM2x1:0 bits are not double buffered together with the compare value. Changing the COM2x1:0 bits will take effect immediately.

18.6. Compare Match

Die Compare Output Mode Bits COM21 und COM20 haben zwei Funktionen. Zum einen verwendet der Waveform Generator die beiden Bits, um den Zustand des OC2 Registers bei der nächsten Vergleichsübereinstimmung festzulegen. Und zweitens kontrollieren die Bits die Ausgangsquelle des OC2 Pins. Das nachfolgende Bild zeigt das einfache Blockschaltbild der Logik, die durch die COM21 und COM20 Bits beeinflusst wird. Die I/O Register, die I/O Bits und die I/O Pins sind fett dargestellt, wobei von den Portkontrollregistern DDR und PORT nur der durch die Bits beeinflusste Teil dargestellt ist. Wenn auf den Zustand des OC2 verwiesen wird, so ist damit das interne Register OC2 gemeint und nicht der OC2 Pin.
Blockschaltbild Compare Match Output
Die allgemeine I/O Portfunktion wird durch den Output Compare (OC2) überschrieben, wenn eines der beiden Bits COM21 oder COM20 gesetzt ist. Allerdings wird Richtung des OC2 Pins (Eingang oder Ausgang) nach wie vor durch das Data Direction Register (DDR) bestimmt. Das Richtungsbit für die OC2 Pins (DDR_OC2) muss als Ausgang gesetzt werden, bevor der Wert von OC2 am Ausgang sichtbar wird. Die überschreibende Funktion ist unabhängig von dem ausgewählten Waveform Generator Modus.

Das Design der Output Compare Pin Logik erlaubt das Initialisieren des OC2 Zustandes bevor der Ausgang freigegeben wird. Einige COM21 / COM20 Kombinationen sind für spätere Funktionen reserviert (siehe Beschreibung der Register).

18.6.1 Compare Output und Kurvenform-Erzeugung

Der Waveform Generator verwendet die COM21 und COM20 Bits in den Modi normal, CTC und PWM unterschiedlich. In allen Fällen wird bei einer Vergleichsübereinstimmung keine Aktion ausgelöst, wenn beide Bits auf 0 gesetzt sind. Weitere Details in den späteren Tabellen.

18.7 Betriebsmodi

Der Operationsmodus, das heißt das Verhalten des Zähler/Zeitgebers und des Output Compare Pins, wird durch die Kombination der Waveform Generation Mode Bits (WGM21 bis WGM20) und den Compare Output Mode Bits (COM21 bis COM20) bestimmt. Die Compare Output Mode Bits beeinflussen die Zählsequenz nicht, die Waveform Generation Mode Bits allerdings schon. Die COM21 und COM20 Bits legen fest, ob der PWM Ausgang invertiert sein soll oder nicht. In nicht PWM Modi legen die COM21 und COM20 Bits fest, ob der Ausgang gelöscht, gesetzt oder gewechselt werden soll, wenn eine Vergleichsübereinstimmung auftritt.

18.7.1 Normalmodus

Der einfachste Betriebsmodus ist der normale Modus (WGM21 und WGM20 = 00). In diesem Modus zählt der Zähler immer vorwärts (inkrementieren) und wird nicht gelöscht. Wenn der Zähler seinen maximalen Wert erreicht (FFh) läuft er über und beginnt erneut bei seinem BOTTOM Wert 00h. Im normalen Modus wird das Timer Overflow Flag (TOV2) in dem Augenblick gesetzt, in dem das TCNT2 Register wieder 00 h wird. Das TOV2 Flag kann in diesem Fall wie ein 9 Bit betrachtet werden, dass aber nur gesetzt und nicht automatisch gelöscht wird. In Kombination mit dem Timer Overflow Interrupt, der das TOV2 Flag automatisch löscht, kann also die Auflösung des Timers durch die Software erheblich erweitert werden. Im normalen Modus sind keine Besonderheiten zu beachten, der Wert des TCNT2 Registers kann jederzeit überschrieben werden.

Die Output Compare Einheit kann verwendet werden, um Interrupts beim jeweiligen Zählerstand zu erzeugen. Das Erzeugen von Ausgangsfrequenzen im normal Modus wird nicht empfohlen, da dafür zu viel Prozessorkapazität verbraucht wird.

18.7.2 Verkürzter Zählzyklus

Im Clear Timer on Compare Modus (CTC) (WGM21 und WGM20 = 2) wird das Register OCR2 dazu verwendet, die Auflösung des Timers zu manipulieren. Im CTC Modus wird der Zähler gelöscht, wenn der Wert des Zählers (TNCT2) mit dem des OCR2 Registers übereinstimmt. Das Register OCR2 bestimmen also den Maximalwert des Zählers und somit seine Auflösung. Dieser Modus erlaubt eine größere Kontrolle der Compare Match Ausgangsfrequenz. Er vereinfacht auch das Zählen externer Ereignisse.

Das Zeitdiagramm des CTC Modus ist nachfolgend abgebildet. Der Wert des Zählers (TCNT2) wächst so lange bis eine Vergleichsgleichheit mit dem OCR2 auftritt, dann wird der Zähler (TCNT2) gelöscht.

Durch das OCF2 Flag kann ein Interrupt generiert werden, zu jedem Zeitpunkt, wenn der Wert des Zählers den TOP Wert erreicht, der durch das OCR2 Register vorgegeben ist. Wenn der Interrupt freigegeben ist, kann die Interruptroutine dazu verwendet werden, um den TOP Wert zu verändern. Das Einstellen des TOP Wertes in die Nähe des BOTTOM Wertes muss mit Vorsicht geschehen, wenn der Zähler ohne oder mit einem geringen Vorteiler betrieben wird, da der CTC Modus keine Zweifachbuffer Eigenschaft hat. Wenn ein neuer Wert in das OCR2 Register geschrieben wird, der kleiner als der aktuelle Wert des TCNT2 ist, so wird zunächst keine Vergleichsübereinstimmung erkannt. Der Zähler wird dann zunächst bis zu seinem maximalen Wert (FFh) laufen und von 00h erneut starten, erst dann kann eine Vergleichsübereinstimmung erkannt werden.

Beim Generieren einer Ausgangsfrequenz im CTC Modus kann der OC2 Ausgang so eingestellt werden, dass er seinen Zustand bei jeder Vergleichsübereinstimmung wechselt, indem die COM21 und COM20 Bits auf 1 gesetzt werden. Der OC2 Wert wird nicht am Port Pin erscheinen, wenn die Datenrichtung nicht auf Ausgang (DDR_OC2 = 1) eingestellt ist. Die erzeugte Ausgangswelle kann eine maximale Frequenz von fOC2 = fclk_I/O/2 haben, wenn OCR2 auf 00 gesetzt wird. Allgemein wird die Ausgangsfrequenz mit folgender Gleichung bestimmt:

fOCn = fclk_IO
2 * N * (1 + OCR2A)

Die Variable N steht für den Faktor des Vorteilers (1, 8, 32, 64, 128, 256 oder 1024).

Im normalen Modus wird das TOV2 Flag in dem selben Taktzyklus gesetzt, in dem der Zähler von seinem MAX Wert auf 0x00 wechselt.

18.7.3 Schnelle Pulsweitenmodulation (PWM)

Der Fast PWM Modus (WGM21 bis WGM20 = 3) bietet eine hochfrequente Ausgangswelle. Der Fast PWM Modus unterscheidet sich von den anderen PWM Modi durch seine einfache Impulsflanke. Der Zähler zählt vom BOTTOM Wert bis zum TOP Wert und beginnt danach wieder mit dem BOTTOM Wert. Im nicht invertierenden Compare Output Mode wird der Output Compare (OC2) gelöscht, wenn eine Vergleichsübereinstimmung zwischen dem TCNT2 und OCR2 auftritt und wird gesetzt, wenn der BOTTOM Wert erreicht ist. Im invertierenden Output Compare Modus ist es genau umgekehrt. Durch die einfache Impulsflanke kann die Frequenz im Fast PWM Modus doppelt so hoch sein wie in den anderen PWM Modi, die mit einer doppelten Impulsflanke arbeiten. Die hohe Frequenz des PWM Signals ist günstig bei der Verwendung als Spannungsregulierung, Gleichrichtung und ähnlichen Digital-Analogwandler Anwendungen. Hohe Frequenzen erlauben kleine externe Komponenten (Spulen, Kondensatoren) wodurch die Systemkosten reduziert werden können.

Im Fast PWM Modus wird der Zähler so lange inkrementiert, bis der Zähler den MAX Wert erreicht. Der Zähler wird dann mit dem folgenden Zyklus des Timertaktes gelöscht. Das Zeitdiagramm des Fast PWM Modus ist im nachfolgenden Bild zu sehen. Der Wert des TCNT2 ist als Histogramm um die einfache Impulsflanke darzustellen. Auch der invertierende und der nicht invertierende Ausgang sind dargestellt. Die kleinen horizontalen Linien an der TCNT2 Flanke kennzeichnen die Vergleichsübereinstimmung zwischen OCR2 und TCNT2.

Das Timer/Counter Overflow Flag (TOV2) wird jedes Mal gesetzt, wenn der Zähler seinen MAX Wert erreicht. Wenn der Interrupt freigegeben ist, kann die Interruptroutine dazu verwendet werden, um den Vergleichswerte zu aktualisieren.

Im Fast PWM Modus erlauben die Vergleichseinheiten das Erzeugen von PWM Signalen an dem OC2 Pins. Durch Setzen der COM21 und COM20 Bits auf 2 wird ein nicht invertiertes PWM-Signal erzeugt. Ein invertiertes PWM-Signal kann erzeugt werden, indem COM21 und COM20 auf 3 gesetzt werden. Um das PWM Signal am Port Pin sichtbar zu machen muss dieser als Ausgang konfiguriert werden (DDR_OC2 = 1). Das PWM Signal wird erzeugt indem das OC2 Register gesetzt (gelöscht) wird, wenn eine Vergleichsübereinstimmung zwischen OCR2 und TCNT2 besteht und das OC2 Register in dem Taktzyklus gelöscht (gesetzt) wird, in dem der Zähler durch den Wechsel von MAX zu BOTTOM gelöscht wird.

Die Frequenz des Ausgangssignals kann mit folgender Formel berechnet werden:

fOCnPWM = fclk_IO
N * 256

Die Variable N steht für den Faktor des Vorteilers (1, 8, 32, 64,128, 256 oder 1024).

Extreme Werte des OCR2 Register stellen spezielle Fälle bei der Erzeugung des PWM Signals im Fast PWM Modus dar. Wenn das OCR2 Register auf den gleichen Wert wie BOTTOM (also 00h) eingestellt wird, wird eine schmale Spitze am Ausgang erzeugt, die mit jedem MAX+1 Takt auftritt. Das Setzen des OCR2 Registers auf den MAX Wert wird zu einem konstanten High- oder Low-Pegel am Ausgang führen (abhängig ob invertierender oder nicht invertierender Ausgang eingestellt).

Eine Frequenz mit einem Tastverhältnis von 50% kann im Fast PWM Modus dadurch erreicht werden, indem man OC2 so einstellt, dass es seinen Pegel bei jeder Vergleichsübereinstimmung wechselt (COM21 und COM20 Bits auf 1). Die erzeugte Ausgangswelle kann eine maximale Frequenz von fOC2 = fclk_I/O/2 haben, wenn OCR2 auf 00 gesetzt wird. Diese Eigenschaft ist gleich dem OC2 Toggel im CTC Modus, mit der Ausnahme, dass die zweifach gebufferte Output Compare Einheit im Fast PWM Modus zur Verfügung steht.

18.7.4 Phasenrichtige PWM

Der Phase Correct PWM Modus (WGM21 bis WGM20 = 1) bietet eine phasenkorrekte Ausgangswelle mit hoher Auflösung. Der Phase correct PWM Modus basiert auf einer zweifachen Impulsflanke. Der Zähler zählt vom BOTTOM Wert bis zum MAX Wert und wieder zurück vom MAX zum BOTTOM Wert. Im nicht invertierenden Compare Output Mode wird der Output Compare (OC2) gelöscht, wenn beim Hochzählen eine Vergleichsübereinstimmung zwischen dem TCNT2 und OCR2 auftritt und wird gesetzt wenn beim Runterzählen eine Vergleichsübereinstimmung auftritt. Im invertierenden Output Compare Modus ist es genau umgekehrt. Durch die zweifache Impulsflanke ist die Frequenz im phase correct PWM Modus niedriger als in den PWM Modi, die mit einer einfachen Impulsflanke arbeiten. Wegen der symmetrischen Eigenschaften der PWM Modi mit zweifacher Impulsflanke eigenen sich diese besonders für die Steuerung von Motoren.

Die PWM Auflösung im Phase Correct PWM Modus liegt fest bei 8 Bit. Im Phase Correct PWM Modus wird der Zähler so lange inkrementiert, bis der Zähler den festen Wert MAX erreicht. Wenn der Zähler den MAX Wert erreicht hat, ändert er daraufhin seine Zählrichtung. Der Wert von TCNT2 wird für einen Takt lang gleich dem MAX Wert sein. Das Zeitdiagramm des Phase Correct PWM Modus ist im nachfolgenden Bild zu sehen. Der Wert des TCNT2 ist als Histogramm abgebildet, um die zweifache Impulsflanke darzustellen. Auch der invertierende und der nicht invertierende Ausgang sind dargestellt. Die kleinen horizontalen Linien an der TCNT2 Flanke kennzeichnen die Vergleichsübereinstimmung zwischen OCR2 und TCNT2.

as Timer/Counter Overflow Flag (TOV2) wird jedes Mal gesetzt, wenn der Zähler seinen BOTTOM Wert erreicht. Das Interrupt Flag kann genutzt werden, um einen Interrupt bei jedem Erreichen des BOTTOM Wertes durch den Zähler auszulösen.

Im Phase correct PWM Modus erlauben die Vergleichseinheiten das Erzeugen von PWM Signalen an den OC2 Pins. Durch Setzen der COM21 und COM20 Bits auf 2 wird ein nicht invertiertes PWM-Signal erzeugt. Ein invertiertes PWM-Signal kann erzeugt werden, indem COM21 und COM20 auf 3 gesetzt werden. Um das PWM Signal am Port Pin sichtbar zu machen muss dieser als Ausgang konfiguriert werden (DDR_OC2 = 1). Das PWM Signal wird erzeugt indem das OC2 Register gelöscht (gesetzt) wird, wenn beim Hochzählen eine Vergleichsübereinstimmung zwischen OCR2 und TCNT2 besteht und das OC2 Register wird gesetzt (gelöscht) wird, wenn beim Runterzählen eine Vergleichsübereinstimmung zwischen OCR2 und TCNT2 besteht.

Die Frequenz des Ausgangssignals kann mit folgender Formel berechnet werden:

fOCnPWM = fclk_IO
N * 510

Die Variable N steht für den Faktor des Vorteilers (1, 8, 32, 64, 128, 256 oder 1024).

Extreme Werte des OCR2 Register stellen spezielle Fälle bei der Erzeugung des PWM Signals im Phase correct PWM Modus dar. Wenn ein OCR2 Register auf den gleichen Wert wie BOTTOM eingestellt wird, bleibt der Ausgang permanant auf Low-Pegel Das Setzen des OCR2 Registers auf den MAX Wert wird zu einem konstanten High-Pegel am Ausgang führen (beim invertierenden Modus ist es dann genau anders herum).

Am Beginn der Periode 2 in obigen Abbild hat OC2 einen Wechsel von High nach Low, obwohl kein Compare Match auftritt. Der Grund für diesen Wechsel ist die erforderliche Symmetrie um den BOTTOM Punkt. Es kann zwei Fälle geben, in denen ein Wechsel ohne Compare Match auftritt:

  • OCR2 wechselt seinen Wert von MAX auf einen kleineren Wert. Wenn der OCR2 Wert gleich MAX ist, hat der OC2 Pin immer der Wert, den er bei einer Vergleichsübereinstimmung beim Herunterzählen hat. Um sicherzustellen, dass das Signal um den BOTTOM Punkt symmetrisch ist, muss der OCR2 Wert bei MAX zu dem Ergebnis einer Vergleichsübereinstimmung beim Hochzählen passen.
  • Der Zähler startet von einem Wert, der größer ist als der im OCR2, es fehlt also die Vergleichsübereinstimmung und daher wird OC2 so gesetzt, als ob die Vergleichsübereinstimmung beim Hochzählen stattgefunden hätte.

18.8 Zeitdiagramme

Die folgenden Abbildungen zeigen den Zähler/Zeitgeber im synchronen Modus, daher ist das Taktsignal clkT2 in den Abbildungen als ein den Takt freigebendes Signal dargestellt. Im asynchronen Modus muss clkI/O durch den Takt des Oszillators ersetzt werden. Die Abbildungen zeigen auch, wann die Interrupt Flags gesetzt werden.

Die nachfolgende Abbildung zeigt die grundsätzliche Arbeitsweise des Zähler/Zeitgeber. Sie zeigt die Zählsequenz bis zum MAX Wert, der in allen Modi außer dem Phase correct PWM Modus stattfindet.

Zeitdiagramm Zähler/Zeitgeber 2
Die nachfolgende Abbildung zeigt den gleichen Vorgang, jedoch mit Vorteiler
Zeitdiagramm mit Vorteiler Zähler/Zeitgeber 2
Die nachfolgende Abbildung zeigt das Setzen des OCF2 Flags in allen Modi außer dem CTC Modus. (mit Vorteiler)
Zeitdiagramm mit Vorteiler Setzen des OCF2 Flags
Die nachfolgende Abbildung zeigt das Setzen des OCF2 Flags und das Löschen des TCNT2 im CTC Modus.
Zeitdiagram CTC Modus

18.9 Asynchroner Betrieb

Der 8-bit Zähler/Zeitgeber2 kann asynchron betrieben werden.
  • Ein Umschalten zwischen dem synchronen und dem asynchronen Modus wird den Inhalt der Register TCNT2, OCR2x und TCCR2x zerstören. Um dies zu verhindern kann folgende sichere Vorgehensweise gewählt werden:
    1. Sperren der Timer/Counter2 Interrupts durch Löschen der OCIE2x und TOIE2 Bits.
    2. Wechseln der Taktquelle durch Setzen des AS2 Bits auf den neuen Wert.
    3. Schreiben neuer Werte in die Register TCNT2, OCR2x und TCCR2x.
    4. Bei Wechsel in den asynchronen Modus: Warten bis Update Busy Flags gelöscht sind.
    5. Löschen der Timer/Counter Interrupt Flags.
    6. Freigeben der Interrupts wenn notwendig
  • Der Oszillator ist für die Verwendung eines 32,768 kHz Uhrenquarzes optimiert. Die Frequenz des CPU Haupttaktes muss mindestens vier mal so groß sein wie die Frequenz des Oszillators.
  • Wenn in die Register TCNT2, OCR2x und TCCR2x geschrieben wird, wird der Wert zunächst in die temporären Register transferiert und nach zwei positiven Flanken an TOSC1 in die Register übernommen. Man sollte keine neuen Werte schreiben, bevor nicht der Inhalt der temporären Register in das Zielregister übernommen wurde. Jedes der drei Register hat sein eigenes temporäres Register, was bedeutet, dass beispielsweise ein laufender Schreibprozess des TCNT2 durch einen Schreibvorgang in das OCR2 Register nicht gestört wird. Um zu überprüfen, ob ein Transfer in das Zielregister abgeschlossen ist, wurde das Asynchronous Status Register ASSR implementiert.
  • Bei den Energiesparmodi Leistung-sparen oder A/D-Wandler-Störunterdrückung (RC-Oszillator läuft durch), nachdem ein Schreiben in die TCNT2, OCR2x und TCCR2x-Register durchgeführt wurde, muss gewartet werden, bis der Schreibvorgang abgeschlossen ist, wenn Timer/Counter2 benutzt wird, um den Baustein aufzuwecken. Andernfalls geht die CPU in den Sleep Modus bevor die neuen Werte effektiv werden. Dies ist besonders wichtig, wenn der Output Compare 2 Interrupt zum Aufwecken des Bausteins verwendet wird, da die Output Compare Funktion ausgeschaltet wird, während in das OCR2 oder TCNT2 Register geschrieben wird. Wenn der Schreibzyklus nicht beendet wird und die CPU in den Sleep Modus geht, bevor das OCR2UB Bit wieder Null ist, wird der Baustein niemals einen Compare Match Interrupt auslösen und der Baustein demzufolge nicht aufwachen.
  • Wenn der Timer/Counter2 verwendet wird, um den Baustein aus Leistung-sparen aufzuwecken, sind einige Vorsichtsmaßnahmen notwendig, wenn wieder in einen solchen Modus gewechselt werden soll: Die Interruptlogik benötigt einen TOSC1 Taktzyklus um resetet zu werden. Wenn die Zeit zwischen dem Aufwecken und dem Wiedereintritt in den Sleep-Modus kürzer ist als ein TOSC1 Zyklus, dann wird kein Interrupt auftreten und der Baustein wird nicht aufgeweckt werden können. Wenn man im Zweifel ist, ob die Zeit vor dem Wiedereintritt in den Modi Leistung-sparen oder A/D-Störunterdrückung ausreicht, kann der folgende Algorithmus verwendet werden, um sicherzustellen, dass TOSC1 einen Taktzyklus durchgeführt hat:
    1. Schreiben eines Wertes in TCNT2, OCR2x oder TCCR2x
    2. Warten, bis das dazugehörige Busy-Flag auf Null geht
    3. Einschalten des Power-save oder Erweiterten Standby Modus
  • Wenn der asynchrone Modus ausgewählt wurde, läuft der 32,768 kHz Oszillator für Timer/Counter2 immer, außer bei Leistung-weg und Standby. Nach einem Power-on Reset oder dem Aufwachen aus dem Power-down oder im Standby Modus benötigt der Oszillator ca. eine Sekunde um sich zu stabilisieren. Der Anwender ist also angehalten, mindestens eine Sekunde zu warten, bevor der Timer/Counter2 nach dem Power-up oder dem Aufwachen aus dem Power-down oder dem Standby Modus benutzt wird. Der Inhalt aller Timer/Counter2 Register kann als ungültig betrachtet werden nach dem Aufwachen aus dem Power-down oder dem Standby Modus, aufgrund des unstabilen Taktsignals während des start-up, unabhängig davon, ob der Oszillator oder ein Taktsignal am TOSC1 Pin benutzt wird.
  • Beschreibung des Aufwachens aus dem Power-save oder erweiterten Standby Modus wenn der Timer asynchron getaktet wird: Wenn eine Interruptbedingung auftritt, startet der Aufwachprozess mit dem folgenden Zyklus des Timertaktes. D.h der Timer hat mindestens schon um eins weitergezählt, bevor der Prozessor den Wert des Zählers lesen kann. Nach dem Aufwachen wird die MCU für vier Taktzyklen angehalten, führt die Interruptroutine aus und setzt die Ausführung mit dem Befehl fort, der nach dem SLEEP-Befehl kommt.
  • Das Lesen des TCNT2 Registers kurz nach dem Aufwachen aus dem Power-save kann zu unkorrekten Resultaten führen. Da TCNT2 durch den asynchronen TOSC Takt getaktet wird und das Lesen des TCNT2 durch ein Register erfolgt, das mit dem internen I/O Takt synchronisiert wird. Die Synchronisation wird an jeder steigenden Flanke des TOSC1 durchgeführt. Wenn das Auswachen aus dem Power-save Modus erfolgt und der I/O Takt wieder aktiv wird, wird so lange der alte Wert von TCNT2 gelesen, bis die nächste steigende Flanke des TOSC1 aufgetreten ist. Die Phase des TOSC Taktes ist nach dem Aufwachen aus dem Power-save Modus nicht vorhersehbar, weil sie von der Aufwachzeit abhängt. Es wird folgende Vorgehensweise empfohlen, um das TCNT2 auszulesen:
    1. Schreiben eines Wertes in TCNT2, OCR2x oder TCCR2x
    2. Warten, bis das dazugehörige Busy-Flag auf Null geht
    3. Lesen des TCNT2
  • Im asynchronen Operationsmodus dauert die Synchronisation der Interruptflags für den asynchronen Timer drei Prozessortakte plus einen Timertakt. Der Timer hat daher mindestens um eins weiter gezählt bevor der Prozessor den Zählerwert auslesen kann, der zum Setzen des Interruptflags geführt hat. Der Output Compare Pin wechselt mit dem Timertakt und ist nicht mit dem Prozessortakt synchronisiert.

18.10 Vorteiler

Vorteiler für Zähler/Zeitgeber2

Die Taktquelle für Zähler/Zeitgeber2 wird mit clkT2S bezeichnet. Der Takt clkT2S ist standardmäßig mit dem I/O Takt clkI/O verbunden. Durch Setzen des AS2 Bits im ASSR Register wird der Zähler/Zeitgeber2 asynchron durch den Takt am TOSC1 Pin getaktet. Dadurch kann Zähler/Zeitgeber2 als Echtzeitzähler verwendet werden. Wenn das AS2 Bit gesetzt ist, sind die Pins TOSC1 und TOSC2 vom Port B getrennt. Ein Quarz kann dann zwischen diesen beiden Pins angeschlossen werden und als unabhängige Taktquelle für Zähler/Zeitgeber2 dienen. Der Oszillator ist für Quarze mit einer Frequenz von 32,768 kHz optimiert. Das Anlegen eines externen Signals an TOSC1 wird nicht empfohlen.

Für Zähler/Zeitgeber2 sind folgende Auswahlmöglichkeiten für den Vorteiler vorhanden: clkT2S/8, clkT2S/32, clkT2S/64, clkT2S/128, clkT2S/256, clkT2S/1024. Zusätzlich kann clkT2S als 0 (Stopp) ausgewählt werden. Das Setzen des PSR2 Bits im SFIOR Regsiter resetet den Vorteiler. Dadurch kann mit einem vorhersehbaren Vorteiler gearbeitet werden.

18.11 Register-Beschreibung

Der 8-bit Zähler/Zeitgeber2 verwendet mehrere Register, die nachfolgend beschrieben werden.

18.11.1 TCCR2A — Kontrollregister A

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0xB0) | COM2A1 | COM2A0 | COM2B1 | COM2B0 | - | - | WGM21 | WGM20 | TCCR2A
Zugriff | R/W | R/W | R/W | R/W | R | R | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
Bit 7 und 6 – COM2A1 und COM2A0: Compare Match Output Mode
Die beiden Bits kontrollieren das Verhalten des Output Compare Pins OC2A. Wenn eines der beiden Bits gesetzt ist, überlagert das OC2A-Signal die normale I/O Funktion des Pins. Im Data Direction Register DDRB muss das Bit 3 für OC2A gesetzt sein, damit das Pin als Ausgang konfiguriert ist.

Wenn OC2A als Ausgangsfunktion verwendet werden, ist die Funktion der COM-Bits von den Einstellungen der WGM-Bits abhängig. Nachfolgende Tabelle zeigt die Funktionen der COM2Ax Bits, wenn die WGM-Bits auf den normalen oder den CTC-Modus eingestellt sind.

Normaler oder CTC Modus
COM2A1 .. COM2A0 | Funktion
00 | Normale Portfunktion, OC2A abgeschaltet
01 | Wechsel an OC2A bei Compare Match
10 | Löschen von OC2A bei Compare Match (Low-Pegel)
11 | Setzen von OC2A bei Compare Match (High-Pegel)
Fast PWM Modus (1)
COM2A1 .. COM20 | Funktion
00 | Normale Portfunktion, OC2A abgeschaltet
01WGM22 = 0: Normal Port Operation, OC0A Disconnected.
WGM22 = 1: Toggle OC2A on Compare Match.
10 | Löschen von OC2A bei Compare Match, Setzen von OC2A bei TOP
11 | Setzen von OC2A bei Compare Match, Löschen von OC2A bei TOP
Note:
  1. A special case occurs when OCR2A equals TOP and COM2A1 is set. In this case, the Compare Match is ignored, but the set or clear is done at BOTTOM. See ”Fast PWM Mode” on page 147 for more details.
Phase correct PWM Modus
COM2A1 .. COM2A0 | Funktion
00 | Normale Portfunktion, OC2A abgeschaltet
01WGM22 = 0: Normal Port Operation, OC2A Disconnected.
WGM22 = 1: Toggle OC2A on Compare Match.
10 | Löschen von OC2A bei Compare Match beim Hochzählen, Setzen von OC2A bei Compare Match beim Runterzählen
11 | Setzen von OC2A bei Compare Match beim Hochzählen, Löschen von OC2A bei Compare Match beim Runterzählen
Bit 5 und 4 – COM2B1 und COM2B0: Compare Match Output Mode
Die beiden Bits kontrollieren das Verhalten des Output Compare Pins OC2B. Wenn eines der beiden Bits gesetzt ist, überlagert das OC2B-Signal die normale I/O Funktion des Pins. Im Data Direction Register DDRD muss das Bit 3 für OC2B gesetzt sein, damit das Pin als Ausgang konfiguriert ist.

Wenn OC2B als Ausgangsfunktion verwendet werden, ist die Funktion der COM-Bits von den Einstellungen der WGM-Bits abhängig. Die vorhergehenden Tabellen gelten entsprechend für COM2Bx.

Bit 1 und 0 – WGM21 und WGM20: Waveform Generation Mode
Die WGM-Bits kontrollieren die Zählsequenz des Zählers, die Quelle für den Maximalwert (MAX) des Zählers und die Art der generierten Ausgangswelle. Die vom Timer/Counter2 unterstützend Arbeitsmodi sind: Normaler Modus (Zähler), Clear Timer on Compare (CTC) Modus und zwei verschiedene PWM Modi. Das Bit WGM22 liegt im zweiten Kontrollregister TCCR2B.
Waveform Generation Mode Bit Description
WGM22 .. WGM20 | Betriebsart | TOP | Aktualisierung von OCRxn | Setzen von TOV
000 (0x00) | normal | 0xFF | sofort | 0xFF
001 (0x01) | Phasenrichtige PWM | 0xFF | 0xFF | 0x00
010 (0x02) | CTC | OCR2A | sofort | 0xFF
011 (0x03) | Schnelle PWM | 0xFF | 0x00 | 0xFF
100 (0x04) | reserviert
101 (0x05) | Phasenrichtige PWM | OCR2A | 0xFF | 0x00
110 (0x06) | reserviert
111 (0x07) | Schnelle PWM | OCR2A | 0x00 | 0xFF

18.11.2 TCCR2B — Kontrollregister B

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0xB1) | FOC2A | FOC2B | - | - | WGM22 | CS22 | CS21 | CS20 | TCCR2B
Zugriff | W | W | R | R | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
Bit 7 – FOC2A: Force Output Compare A
Das FOC2A-Bit ist nur aktiv, wenn die WGM-Bits einen Nicht-PWM Modus auswählen. Um die Kompatibilität mit zukünftigen Bausteinen sicherzustellen, muss dieses Bit auf 0 gesetzt werden, wenn das TCCR2 in einem PWM Modus beschrieben wird. Wenn eine 1 in das FOC2A Bit geschrieben wird, wird unmittelbar ein Compare Match erzwungen. Der OC2A-Ausgang ändern sich dann den Einstellungen der COM-Bits entsprechend. Zu beachten ist, dass das FOC2 Bit im Sinne von Freigabebits implementiert ist, so dass das Verhalten beim erzwungenen Compare Match durch die COM-Bits bestimmt wird.

Ein erzwungener Compare Match generiert keine Interrupts und löscht den Timer nicht. Das FOC2A-Bit wird immer als 0 gelesen.

Bit 6 – FOC2B: Force Output Compare B
Das FOC2B-Bit ist nur aktiv, wenn die WGM-Bits einen Nicht-PWM Modus auswählen. Um die Kompatibilität mit zukünftigen Bausteinen sicherzustellen, muss dieses Bit auf 0 gesetzt werden, wenn das TCCR2 in einem PWM Modus beschrieben wird. Wenn eine 1 in das FOC2B Bit geschrieben wird, wird unmittelbar ein Compare Match erzwungen. Der OC2B-Ausgang ändern sich dann den Einstellungen der COM-Bits entsprechend. Zu beachten ist, dass das FOC2B-Bit im Sinne von Freigabebits implementiert ist, so dass das Verhalten beim erzwungenen Compare Match durch die COM-Bits bestimmt wird.

Ein erzwungener Compare Match generiert keine Interrupts und löscht den Timer nicht. Das FOC2B-Bit wird immer als 0 gelesen.

Bit 3 – WGM22: Drittes Bit für Signalerzeugung
Siehe Kontrollregister TCCR2A
Bit 2 bis 0 – CS22, CS21, CS20: Clock Select Bits 2, 1, 0
Diese Bits bestimmen die Vorteilerquelle für Timer/Counter2
Taktauswahl-Bits
CS22 .. CS20 | Beschreibung
000 | Zägler ist angehalten
001 | clkT2S (ohne Vorteiler)
010 | clkT2S/8
011 | clkT2S/32
100 | clkT2S/64
101 | clkT2S/128
110 | clkT2S/256
111 | clkT2S/1024

18.11.3 TCNT2 — Zählregister

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0xB2) | TCNT2[7:0] |  |  |  |  |  |  |  | TCNT2
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0

Das Timer/Counter Register gibt einen direkten Zugriff auf den 8-bit Zähler bei Lese- und Schreiboparationen. Ein Verändern des Zählers (TCNT2) während der Zähler läuft, führt zu dem Risiko, dass ein Compare Match zwischen dem TCNT2 und den OCR2 Registern ausgelassen wird. Beim Schreiben in das TCNT2 Register werden die Compare Match im Folgetakt bei allen Vergleichseinheiten blockiert.

18.11.4 OCR2A — Vergleichsregister A

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0xB3) | OCR2A[7:0] |  |  |  |  |  |  |  | OCR2A
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0

Das Output Compare Register enthält einen 8-bit Wert, der permanent mit dem Wert des Zählers (TCNT2) verglichen wird. Eine Übereinstimmung kann dazu genutzt werden, einen Interrupt auszulösen und/oder ein Ausgangssignal am Pin OC2A zu erzeugen.

18.11.5 OCR2B — Vergleichsregister B

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0xB4) | OCR2B[7:0] |  |  |  |  |  |  |  | OCR2B
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0

Das Output Compare Register enthält einen 8-bit Wert, der permanent mit dem Wert des Zählers (TCNT2) verglichen wird. Eine Übereinstimmung kann dazu genutzt werden, einen Interrupt auszulösen und/oder ein Ausgangssignal am Pin OC2B zu erzeugen.

18.11.6 TIMSK2 — Interrupt-Maske

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x70) | - | - | - | - | - | OCIE2B | OCIE2A | TOIE2 | TIMSK2
Zugriff | R | R | R | R | R | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
Bit 2 – OCIE2B: Timer/Counter2 Output Compare Match B Interrupt Enable
Wenn das OCIE2B-Bit gesetzt ist und das I-Bit in Status-Register (SREG) ebenfalls gesetzt ist, ist der Timer/Counter2 Output Compare Match Interrupt freigegeben. Die Interrupt-Routine TIMERB_COMPA_vect wird ausgeführt, wenn das OCF2B-Bit im TIFR2-Register von der Hardware gesetzt wird.
Bit 1 – OCIE2A: Timer/Counter2 Output Compare Match A Interrupt Enable
Wenn das OCIE2A-Bit gesetzt ist und das I-Bit in Status-Register (SREG) ebenfalls gesetzt ist, ist der Timer/Counter2 Output Compare Match Interrupt freigegeben. Die Interrupt-Routine TIMER2_COMPA_vect wird ausgeführt, wenn das OCF2A-Bit im TIFR2-Register von der Hardware gesetzt wird.
Bit 0 – TOIE2: Timer/Counter2 Overflow Interrupt Enable
Wenn das TOIE2-Bit gesetzt ist und das I-Bit in Status-Register (SREG) ebenfalls gesetzt ist, ist der Timer/Counter2 Overflow Interrupt freigegeben. Die Interrupt-Routine TIMER2_OVF_vect wird ausgeführt, wenn in Folge eines Überlaufs im Timer/Counter2 das TOV2-Bit im TIFR-Register gesetzt wird.

18.11.7 TIFR2 — Interrupt-Flags

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x37) | - | - | - | - | - | OCF2B | OCF2A | TOV2 | TIFR2
Zugriff | R | R | R | R | R | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
Bit 2 – OCF2B: Timer/Counter2 Output Compare B Flag
Das OCF2B-Bit wird gesetzt, nachdem der Zähler TCNT2 den Wert des Output Compare Register OCR2B erreicht hat. Ein erzwungener Output Compare (FOC2B) setzt das OCF2B-Flag hingegen nicht. Das Bit wird automatisch gelöscht, wenn die Interrupt-Routine TIMER2_COMPB_vect ausgeführt wird. Alternativ kann das Flag gelöscht werden, in dem man eine „1“ in das Flag schreibt.
Bit 1 – OCF2A: Timer/Counter2 Output Compare A Flag
Das OCF2A-Bit wird gesetzt, nachdem der Zähler TCNT2 den Wert des Output Compare Register OCR2A erreicht hat. Ein erzwungener Output Compare (FOC2A) setzt das OCF2A-Flag hingegen nicht. Das Bit wird automatisch gelöscht, wenn die Interrupt-Routine TIMER2_COMPA_vect ausgeführt wird. Alternativ kann das Flag gelöscht werden, in dem man eine „1“ in das Flag schreibt.
Bit 0 – TOV2: Timer/Counter2 Overflow Flag
Dieses Flag wird gesetzt, wenn ein Überlauf in Timer/Counter2 auftritt. Das Bit wird automatisch gelöscht, wenn die Interrupt-Routine TIMER2_OVF_vect ausgeführt wird. Alternativ kann das Flag gelöscht werden, in dem man eine „1“ in das Flag schreibt.

Im PWM Modus wird das Bit gesetzt, wenn Timer/Counter2 seine Zählrichtung bei 0x00 umdreht.

18.11.8 ASSR — Asynchrones Statusregister

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0xB6) | - | EXCLK | AS2 | TCN2UB | OCR2AUB | OCR2BUB | TCR2AUB | TCR2BUB | ASSR
Zugriff | R | R/W | R/W | R | R | R | R | R
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
• Bit 6 – EXCLK: Enable External Clock Input
When EXCLK is written to one, and asynchronous clock is selected, the external clock input buffer is enabled and an external clock can be input on Timer Oscillator 1 (TOSC1) pin instead of a 32kHz crystal. Writing to EXCLK should be done before asynchronous operation is selected. Note that the crystal Oscillator will only run when this bit is zero.
• Bit 5 – AS2: Asynchronous Timer/Counter2
When AS2 is written to zero, Timer/Counter2 is clocked from the I/O clock, clk I/O . When AS2 is written to one, Timer/Counter2 is clocked from a crystal Oscillator connected to the Timer Oscillator 1 (TOSC1) pin. When the value of AS2 is changed, the contents of TCNT2, OCR2A, OCR2B, TCCR2A and TCCR2B might be corrupted.
• Bit 4 – TCN2UB: Timer/Counter2 Update Busy
When Timer/Counter2 operates asynchronously and TCNT2 is written, this bit becomes set. When TCNT2 has been updated from the temporary storage register, this bit is cleared by hardware. A logical zero in this bit indicates that TCNT2 is ready to be updated with a new value.
Bit 3 – AS2: Asynchronous Timer/Counter2
Wenn das AS2 Bit auf 0 gesetzt ist, wird der Timer/Counter2 durch den I/O Takt clkI/O getaktet. Wenn AS2 auf 1 gesetzt ist, wird Timer/Counter2 von dem Quarzoszillator am TOSC1 Pin getaktet. Wenn der Zustand von AS2 verändert wird, können die Werte der TCNT2, OCR2 und TCCR2 Register zerstört werden.
Bit 2 – TCN2UB: Timer/Counter2 Update Busy
Wenn der Timer/Counter2 asynchron betrieben wird und das TCNT2 beschrieben wird, geht dieses Bit auf 1. Wenn das TCNT2 den Wert aus dem temporären Register übernommen hat, wird das Bit durch die Hardware wieder gelöscht. Eine 0 in diesem Bit zeigt also, dass das TCNT2 bereit ist, auf einen neuen Wert gesetzt zu werden.
Bit 1 – OCR2UB: Output Compare Register2 Update Busy
Wenn der Timer/Counter2 asynchron betrieben wird und das OCR2 beschrieben wird, geht dieses Bit auf 1. Wenn das OCR2 den Wert aus dem temporären Register übernommen hat, wird das Bit durch die Hardware wieder gelöscht. Eine 0 in diesem Bit zeigt also, dass das OCR2 bereit ist, auf einen neuen Wert gesetzt zu werden.
Bit 0 – TCR2UB: Timer/Counter Control Register2 Update Busy
Wenn der Timer/Counter2 asynchron betrieben wird und das TCCR2 beschrieben wird, geht dieses Bit auf 1. Wenn das TCCR2 den Wert aus dem temporären Register übernommen hat, wird das Bit durch die Hardware wieder gelöscht. Eine 0 in diesem Bit zeigt also, dass das TCCR2 bereit ist, auf einen neuen Wert gesetzt zu werden.

Solange ein Schreibvorgang läuft und das Busy-Flag des Timers gesetzt ist, wird ein weiterer Schreibversuch den neuen Wert zerstören und einen ungewollten Interrupt auslösen.

Die Mechanismen zum Lesen der TCNT2, ORC2 und TCCR2 Register sind anders. Wenn das TCNT2 Register gelesen wird, wird immer der Zähler gelesen, wenn die anderen beiden Register gelesen werden wird immer der Wert aus dem temporären Register gelesen.

18.11.9 GTCCR — Allgemeines Zähler/Zeitgeber-Kontrollregister

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x43) | TSM | - | - | - | - | - | PSRASY | PSRSYNC | GTCCR
Zugriff | R/W | R | R | R | R | R | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
Bit 1 — PSR2: Prescaler Reset Zähler/Zeitgeber2
Wenn dieses Bit mit einer 1 beschrieben wird, wird der Vorteiler für Zähler/Zeitgeber2 resetet. Das Bit wird durch die Hardware automatisch wieder gelöscht, wenn der Reset ausgeführt wurde. Das Schreiben einer 0 in dieses Bit hat keine Auswirkungen. Das Bit wird immer als 0 gelesen, wenn Zähler/Zeitgeber2 durch den internen Takt getaktet wird. Wenn das Bit beschrieben wird, wenn Zähler/Zeitgeber2 im asynchronen Modus arbeitet, wird das Bit so lange 1 bleiben bis der Vorteiler resetet ist.


SPI: Synchron-serielle Schnittstelle

19. SPI: Synchron-serielle Schnittstelle

19.1 Features

  • Synchroner, vollduplexfähiger Datentransfer mit drei Leitungen
  • Master- oder Slave-Funktion: Taktgeber oder Fremdtaktung
  • Datentransfer mit tiefstwertigem oder höchstwertigem Bit beginnend auswählbar
  • Sieben programmierbare Bitraten
  • Interrupt bei Ende der Übertragung
  • Schutz vor Schreibkollision
  • Aufwachen aus dem Idle-Mode
  • Master-SPI-Modus mit doppelter Geschwindigkeit (CK/2)

19.2 Überblick

Das serielle Peripherie-Interface (SPI) realisiert synchronen Datentransfer mit hoher Geschwindigkeit zwischen dem Controller und peripheren Bausteinen oder zwischen zwei AVR-Mikrocontrollern.

Auch die USART kann als SPI-Master verwendet werden, siehe USART im SPI-Modus. Das Bit PRSPI im Leistungsreduktions-Register muss gelöscht sein, damit das SPI-Modul funktioniert.

Bild 19-1: SPI-Blockdiagramm
Die Zusammenarbeit zwischen Master- und Slave-CPUs wird im Bild 19-2 dargestellt. Das System besteht aus zwei Schieberegistern und einem Master-Taktgenerator. Der SPI-Master initiiert einen Kommunikationszyklus, indem der den SS-Pin (Slave Select) des gewünschten Slaves auf Low-Pegel zieht. Der Master und der Slave bereiten die zu übertragenden Daten in ihren entsprechenden Schieberegistern vor und der Master generiert die erforderlichen Taktpulse auf der SCK-Leitung, damit die Daten ausgetauscht werden. Die Daten werden vom Master zum Slave immer über die „Master out Slave in“-Leitung (MOSI) geschoben und vom Slave zum Master über die „Master in Slave out“-Leitung (MISO). Nach jedem übertragenen Datenpaket synchronisiert der Master den Slave, indem die „Slave Select“-Leitung (SS) auf High-Potential legt.

Wenn der Baustein als Master konfiguriert ist, so hat das SPI keine automatische Kontrolle über die SS-Leitung. Sie muss durch die Software gesteuert werden um eine Kommunikation zu starten. Wenn dies geschehen ist, startet das Schreiben eines Bytes in das SPI-Datenregister SPDR den SPI-Taktgenerator und die Hardware schiebt die acht Bits in den Slave. Nachdem die acht Bits geschoben wurden, stoppt der SPI-Taktgenerator und das End of Transmission Flag (SPIF) wird gesetzt. Wenn das SPI-Interruptfreigabe-Bit (SPIE) im Register SPCR gesetzt ist, wird dann ein Interrupt ausgeführt. Der Master kann dann die Kommunikation fortsetzen, indem er ein weiteres Byte in das SPDR-Register schreibt. Oder er beendet die Kommunikation, indem er die „Slave Select“-Leitung (SS) auf High-Pegel zieht. Das zuletzt eingegangene Byte verbleibt im Puffer-Register und kann dort abgeholt werden.

Wenn der Baustein als Slave konfiguriert ist, schläft das SPI-Interface mit MISO im hochohmigen Zustand, solagne die SS-Leitung auf High gehalten wird. Die Software kann Daten in das SPI-Datenregister SPDR schreiben, allerdings werden die Daten nicht durch die am SCK-Pin eingehenden Takte ausgeschoben, bis der SS Pin auf Low gelegt wurde. Wenn ein Byte komplett geschoben wurde, wird das „End of Transmission“-Bit (SPIF) gesetzt. Wenn das SPI-Interruptfreigabebit (SPIE) im SPCR-Register gesetzt ist, wird ein Interrupt ausgeführt. Der Slave kann weitere Daten in SPDR schreiben, bevor die eingegangenen Daten gelesen wurden. Das zuletzt eingegangene Byte verbleibt im Puffer-Register und kann dort abgeholt werden.

Bild 19-2: Zusammenarbeit Master und Slave
Das System ist in Senderichtung einfach und in Empfangsrichtung zweifach gepuffert. Das bedeutet, dass ein zu übertragenes Byte erst dann in das SPI-Datenregister geschrieben werden kann, wenn eine laufende Übertragung komplett angeschlossen ist. Beim Empfangen von Daten muss ein empfangenes Byte gelesen werden, bevor die Übertragung des folgenden Bytes abgeschlossen ist. Andernfalls geht das zuerst empfangene Byte verloren.

Im Slave-Modus tastet die Kontrolllogik das ankommende Signal am SCK-Pin ab. Um ein korrektes Abtasten zu gewährleisten, sollte die Frequenz des SCK-Taktes nicht größer sein als fOSC/4.

Wenn das SPI freigegeben ist, stellt sich die Datenrichtung der Pins MOSI, MISO, SCK und SS wie folgt ein:

Tabelle 19-1: SPI Pinfunktionen
Pin | Richtung als SPI-Master | Richtung als SPI-Slave
MOSI | benutzerdefiniert | Eingang
MISO | Eingang | benutzerdefiniert
SCK | benutzerdefiniert | Eingang
SS | benutzerdefiniert | Eingang
Das nachfolgende Beispiel zeigt das Initialisieren des SPI als Master und eine einfache Datenübertragung. DDR_SPI aus dem Beispiel muss durch das aktuelle Datenrichtungsregister ersetzt werden, das die SPI-Pins kontrolliert. DD_MOSI, DD_MISO und DD_SCK muss ersetzt werden durch die aktuellen Datenrichtungsbits für diese Pins. Beispiel: Wenn MOSI an Pin PB5 liegt, dann DD_MOSI durch DDB5 ersetzen und DDR_SPI durch DDRB.
Kodebeispiel in Assembler
SPI_MasterInit:
    ; Setze MOSI und SCK als Ausgang, alles andere als Eingang
    ldi	r17,(1<<DD_MOSI)|(1<<DD_SCK)
    out	DDR_SPI,r17
    ; SPI-Master freigeben, Taktfrequenz = fck/16
    ldi	r17,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
    out	SPCR,r17
    ret
SPI_MasterTransmit:	; Starte Daten-Senden (r16)
    out	SPDR,r16
Wait_Transmit:		; Warte bis Senden fertig
    in	r16, SPSR
    sbrs	r16, SPIF
     rjmp	Wait_Transmit
    ret
Kodebeispiel in C
void SPI_MasterInit(void) {
/* Setze MOSI und SCK als Ausgang, alles andere als Eingang */
  DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
/* SPI-Master freigeben, Taktfrequenz = fck/16 */
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
void SPI_MasterTransmit(char cData) {
/* Starte Daten-Senden */
  SPDR = cData;
/* Warte bis Senden fertig */
  while (!(SPSR & (1<<SPIF)));
}
Das folgende Beispiel zeigt das Initialisieren des SPI als Slave und einen einfachen Empfang von Daten.
Kodebeispiel in Assembler
SPI_SlaveInit:
    ; Setze MISO als Ausgang, alles andere als Eingang
    ldi	r17,(1<<DD_MISO)
    out	DDR_SPI,r17
    ldi	r17,(1<<SPE)
    out	SPCR,r17	; SPI freigeben
    ret
SPI_SlaveReceive:	; Warte bis Empfang fertig
    in	r16, SPSR
    sbrs	r16, SPIF
     rjmp	SPI_SlaveReceive
    in	r16,SPDR	; Lese empfangenes Datenbyte
    ret
Kodebeispiel in C
void SPI_SlaveInit(void) {
/* Setze MISO als Ausgang, alles andere als Eingang */
  DDR_SPI = (1<<DD_MISO);
/* SPI freigeben */
  SPCR = (1<<SPE);
}
char SPI_SlaveReceive(void) {
/* Warte bis Empfang fertig */
  while (!(SPSR & (1<<SPIF)));
/* Lese empfangenes Datenbyte */
  return SPDR;
}

19.3 SS-Pinfunktion

Nachfolgend wird die Funktion des SS-Pins in den verschiedenen Betriebsmodi beschrieben.

19.3.1 Slave-Modus

Wenn das SPI als Slave konfiguriert ist, ist das SS-Pin immer ein Eingang. Wenn SS auf Low gehalten wird, wird das SPI aktiviert und MISO wird zum Ausgang, wenn er durch den Anwender so konfiguriert wurde. Alle anderen Pins sind Eingänge. Wenn SS auf High gelegt wird, werden alle Pins Eingänge und das SPI wird deaktiviert, d.h. es kann keine Daten mehr empfangen. Man beachte, dass die SPI-Logik zurückgesetzt wird, wenn das SS-Pin auf High gelegt wird.

Das SS-Pin ist hilfreich für die Paket- oder Bytesynchronisation indem der Slave-Bitzähler synchron mit dem Master-Taktgenerator gehalten wird. Wenn das SS-Pin auf High liegt, setzt der SPI-Slave die Sende- und Empfangslogik zurück und verwirft alle teilweise empfangenen Daten.

19.3.2 Master-Modus

Wenn das SPI als Master konfiguriert ist (MSTR im SPCR gesetzt), kann der Anwender die Richtung des SS-Pins bestimmen.

Wenn SS als Ausgang konfiguriert ist, ist es ein allgemeines Ausgangspin, der die Funktion des SPI nicht beeinflusst. Gewöhnlich wird das Pin mit dem SS-Pin eines Slaves verbunden.

Wenn SS als Eingang konfiguriert ist, muss es auf High gehalten werden, um die Masterfunktion sicherzustellen. Wenn das SS-Pin durch die Peripherie auf Low gezogen wird, während SPI als Master mit SS-Pin als Eingang konfiguriert ist, wird das SPI-System dies so interpretieren, als sei sie von einem anderen Master als Slave angesprochen worden und damit beginnen, Daten an den vermeintlichen Master zu senden. Um Buskollisionen zu vermeiden, führt das SPI-System dann folgende Aktionen durch:

  1. Das MSTR-Bit im SPCR-Register wird gelöscht, folglich wird das SPI-System zum Slave. Damit werden die Pins MOSI und SCK zu Eingängen
  2. Das SPIF-Flag im SPSR wird gesetzt, und wenn der SPI-Interrupt freigegeben ist — und das I-Bit im SREG gesetzt ist — wird die Interruptroutine ausgeführt.
Wenn also eine interruptgesteuerte SPI-Übertragung im Mastermodus verwendet wird und die Möglichkeit besteht, dass das SS-Pin auf Low gezogen wird, so muss die Interruptroutine immer überprüfen, ob das MSTR-Bit noch gesetzt ist. Wenn das MSTR-Bit durch einen externen Slave Select gelöscht wurde, so muss es durch die Software wieder gesetzt werden, um den SPI Mastermodus zu reaktivieren.

19.4 Datenmodi

Es gibt vier verschiedene Kombinationen der SCK-Phase und -Polarität mit Bezug auf die seriellen Daten, die durch die CPHA- und CPOL-Bits festgelegt werden. Das Format des SPI-Datentransfers ist in den Timingdiagrammen dargestellt. Die Datenbits werden mit entgegengesetzten Flanken von SCK geschoben und übernommen, damit ausreichend Zeit für die Stabilisierung des Daten bleibt. Dies wird aus folgender Tabelle deutlich.
Tabelle 19-2: SPI-Datenmodi
Datenmodus | Bedingung | Erste Flanke | Zweite Flanke
0 | CPOL=0, CPHA=0 | abtasten (steigend) | setzen (fallend)
1 | CPOL=0, CPAH=1 | setzen (steigend) | abtasten (fallend)
2 | CPOL=1, CPHA=0 | abtasten (fallend) | setzen (steigend)
3 | CPOL=1, CPHA=1 | setzen (fallend) | abtasten (steigend)
Bild 19-3: SPI-Übertragung mit CPHA=0
Bild 19-4: SPI-Übertragung mit CPHA=1

19.5 Register-Beschreibung

19.5.1 SPCR — Kontrollregister

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x4C) | SPIE | SPE | DORD | MSTR | CPOL | CPHA | SPR1 | SPR0 | SPCR
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7 — SPIE: SPI Interrupt Enable
Wenn dieses Bit mit einer 1 beschrieben wird, ist der SPI-Interrupt freigegeben. Der Interrupt wird ausgeführt, wenn das I-Bit im SREG gesetzt ist und das SPIF Flag im SPSR Register gesetzt wird.
  • Bit 6 — SPE: SPI Enable
Wenn dieses Bit mit einer 1 beschrieben wird, ist das SPI freigegeben. Es muss gesetzt werden um alle SPI-Operationen freizugeben.
  • Bit 5 — DORD: Data Order
Wenn dieses Bit mit einer 1 beschrieben ist, werden die Daten mit dem LSB voran übertragen. Wenn dieses Bit gelöscht ist, werden die Daten mit dem MSB voran übertragen.
  • Bit 4 — MSTR: Master / Slave Select
Wenn dieses Bit mit einer 1 beschrieben ist, ist der Mastermodus ausgewählt, wenn es gelöscht ist, arbeitet die SPI im Slave-Modus. Wenn SS als Eingang konfiguriert ist und im Mastermodus auf Low gezogen wird, wird das MSTR-Bit gelöscht und SPIF im SPSR wird gesetzt. Der Anwender muss dann das MSTR-Bit wieder setzen um den Mastermodus zu reaktivieren.
  • Bit 3 — CPOL: Clock Polatity
Wenn dieses Bit mit einer 1 beschrieben ist, ist SCK auf High, wenn er nicht benutzt wird. Ist das Bit gelöscht, so ist SCK auf Low, wenn er nicht benutzt wird. Siehe Timingdiagramme. Zusammengefasst ist die CPOL Funktion wie folgt:
Tabelle 19-3: CPOL-Funktion
CPOL | Vorderflanke | Rückflanke
0 | steigend | fallend
1 | fallend | steigend
  • Bit 2 — CPHA: Clock Phase
Dieses Bit legt fest, ob die Daten mit der Vorder- oder Rückflanke von SCK abgetastet werden. Siehe Timingdiagramme. Zusammengefasst ist die CPHA-Funktion wie folgt:
Tabelle 19-4: CPHA-Funktion
CPHA | Vorderflanke | Rückflanke
0 | abtasten | setzen
1 | setzen | abtasten
  • Bit 1, 0 — SPR1, SPR0: SPI Clock Rate Select 1 und 0
Dieses beiden Bits kontrollieren die Taktrate an SCK des Bausteins, wenn er im Mastermodus arbeitet. SPR1 und SPR0 haben keine Auswirkungen im Slavemodus. Die Beziehung zwischen SCK und der Oszillator Taktfrequenz fOSC ist nachfolgend dargestellt:
Tabelle 19-5: Beziehung zwischen SCK und Oszillatorfrequenz
SPI2X | SPR1 | SPR0 | SCK-Frequenz
0 | 0 | 0 | fOSC/4
0 | 0 | 1 | fOSC/16
0 | 1 | 0 | fOSC/64
0 | 1 | 1 | fOSC/128
1 | 0 | 0 | fOSC/2
1 | 0 | 1 | fOSC/8
1 | 1 | 0 | fOSC/32
1 | 1 | 1 | fOSC/64
Das SPI2X-Bit befindet sich im SPI-Statusregister (SPSR)

19.5.2 SPSR — Statusregister

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x4D) | SPIF | WCOL | - | - | - | - | - | SPI2X | SPSR
Zugriff | R | R | R | R | R | R | R | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7 — SPIF: SPI Interrupt Flag
Wenn eine serielle Übertragung komplett ist, wird dieses Bit gesetzt. Ein Interrupt wird ausgeführt, wenn SPIE in SPCR gesetzt ist und die Interrupts global freigegeben sind. Wenn SS im Mastermodus als Eingang definiert ist und auf Low gezogen wird, wird das Flag ebenfalls gesetzt. Das SPIF wird durch die Hardware automatisch gelöscht, wenn die dazugehörige Interruptroutine ausgeführt wird. Alternativ kann das Flag auch gelöscht werden, wenn zunächst das SPI-Statusregister mit gesetztem SPIF gelesen wird und danach ein Zugriff auf das SPI-Datenregister (SPDR) erfolgt.
  • Bit 6 — WCOL: Write Collision Flag
Das WCOL-Bit wird gesetzt, wenn in das SPI-Datenregister während einer laufenden Übertragung geschrieben wird. Das WCOL-Bit (und SPIF) werden gelöscht, wenn zunächst das SPI-Statusregister mit gesetztem WCOL gelesen wird und danach ein Zugriff auf das SPI-Datenregister (SPDR) erfolgt.
  • Bit 5:1 — reserviert
Diese Bits sind reserviert und werden immer als 0 gelesen.
  • Bit 0 — SPI2X: Double SPI Speed Bit
Wenn dieses Bit gesetzt wird, verdoppelt sich die Taktfrequenz SCK, wenn SPI im Mastermodus betrieben wird. Das bedeutet, dass die maximale SCK-Frequenz halb so groß wie die Frequenz des CPU-Taktes sein kann. Wenn SPI im Slave-Modus arbeitet, ist das korrekte Arbeiten allerdings nur mit einer Frequenz kleiner fOSC/4 garantiert.

19.5.3 SPDR — Datenregister

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x4E) | MSB |  |  |  |  |  |  | LSB | SPDR
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | X | X | X | X | X | X | X | X | undefiniert

Das SPI Data Register ist ein Schreib/Lese-Register, das für den Datenaustausch zwischen den Registern und dem SPI Schieberegister verwendet wird. Das Schreiben in das Register startet eine Datenübertragung. Beim Lesen wird auf einen Eingangspuffer des Schieberegisters zugegriffen.


USART

20. USART

20.1 Features

  • Gegensprechen, d.h. unabhängiges Senden und Empfangen
  • Asynchroner und synchroner Betrieb
  • Synchroner Betrieb als Master oder Slave
  • Baudraten-Generator mit hoher Auflösung
  • Unterstützt serielle Rahmen mit 5, 6, 7, 8, oder 9 Datenbits und 1 oder 2 Stoppbits
  • Erzeugen von geraden und ungeraden Paritätsbits und Paritätsprüfung durch die Hardware
  • Datenüberlauf-Erkennung
  • Rahmenfehler-Erkennung
  • Störungsfilter mit Erkennung falscher Startbits und digitaler Tiefpassfilter
  • Drei separate Interrupts bei Senden fertig, Senderegister leer und Empfangsdaten vorhanden
  • Multiprozessor-Kommunikationsmodus
  • Asynchroner Modus mit doppelter Geschwindigkeit

20.2 Übersicht

Der universelle synchrone und asynchrone serielle Empfänger und Sender (USART) ist ein hochflexibler serieller Baustein.

Der USART0 kann auch als SPI-Master verwendet werden, siehe gesondertes Kapitel. Das Bit PRUSART0 im Leistungsreduktionsregister PRR muss gelöscht sein, um den USART zu nutzen.

Das Bild 20-1 zeigt das vereinfachte Blockschaltbild des USART. I/O-Register und I/O-Pins, auf die die CPU zugreifen kann, sind fett dargestellt.

Die gestrichelten Kästen im Blockschaltbild zeigen die drei separaten Hauptbestandteile des USART: Taktgenerator, Sendeeinheit und Empfangseinheit. Die Kontrollregister werden von allen drei Teilen genutzt. Die Logik des Taktgenerators besteht aus einer Synchronisationslogik, für den externen Takteingang, der im synchronen Slavemodus verwendet wird, und dem Baudratengenerator. Das XCK-Pin (Transfer-Takt) wird nur im synchronen Übertragungsmodus verwendet. Der Sender besteht aus einem einfachen Schreibpuffer, dem seriellen Schieberegister, dem Paritätsgenerator und einer Kontrolllogik zum Handhaben der verschiedenen Rahmenformate. Der Schreibpuffer erlaubt einen kontinuierlichen Datentransfer ohne Verzögerung zwischen den Datenrahmen. Der Empfänger ist der komplexeste Teil des USART mit seinen Takt- und Datenwiederherstellungs-Einheiten. Die Wiederherstellungseinheiten werden beim asynchronen Datenempfang benutzt. Zusätzlich zu den Wiederherstellungseinheiten besteht der Empfänger aus einem Paritätsprüfer, der Kontrolllogik, einem Schieberegister und einem zweifachen Empfangspuffer (UDR). Der Empfänger unterstützt die gleichen Rahmenformate wie der Sender und kann Rahmenfehler, Datenüberläufe und Paritätsfehler erkennen.

Bild 20-1: Blockschaltbild USART
Hinweis:
  1. Siehe Bild 1-1 und Tabelle 14-9 für die Platzierung der Anschlüsse

20.3 Takterzeugung

Die Takterzeugungslogik generiert den Basistakt für den Sender und Empfänger. Der USART unterstützt vier Taktmodi: den normalen asynchronen Modus, den asynchronen Modus mit doppelter Geschwindigkeit, den synchronen Mastermodus und den synchronen Slavemodus. Das UMSELn-Bit im USART-Steuerregister C (UCSRC) wählt zwischen dem asynchronen und dem synchronen Modus aus. Die doppelte Geschwindigkeit (nur asynchron) kann mit dem U2X-Bit im UCSRnA-Register ausgewählt werden. Wenn ein synchroner Modus (UMSEL = 1) benutzt wird, kontrolliert das Datenrichtungsregister für das XCK-Pin (DDR_XCK) ob die Taktquelle intern (Mastermodus) oder extern (Slavemodus) ist. Das XCK-Pin ist nur in den synchronen Modi aktiv. Das nachfolgende Bild zeigt das Blockdiagramm der Takterzeugungslogik.

Bild 20-2: Blockschaltbild Takterzeugung

Beschreibung der Signale:

txclk | Sendetakt (internes Signal)
rxclk | Empfänger-Basistakt (internes Signal)
xcki | Eingang vom XCK-Pin (internes Signal), verwendet im synchronen Slavemodus
xcko | Taktausgang zum XCK-Pin (internes Signal), verwendet im synchronen Mastermodus
fosc | Systemtaktfrequenz, typischerweise Quarzfrequenz

20.3.1 Interner Takt

Die interne Takterzeugung wird für die asynchronen und den synchronen Mastermodus verwendet. Die Beschreibung bezieht sich auf das Bild zuvor.

Das USART-Baudratenregister (UBRR) und der Rückwärtszähler arbeiten zusammen als programmierbarer Vorteiler bzw. als Baudratengenerator. Der Rückwärtszähler, der mit dem Systemtakt (fosc) getaktet wird, wird jedes Mal wenn der Zähler bei Null angelangt ist oder das UBRR beschrieben wird, mit dem Wert aus dem UBRR geladen. Ein Takt wird jedes Mal erzeugt, wenn der Zähler bei Null angelangt. Dieser Takt ist der Baudratengenerator-Ausgangstakt (= fosc/(UBRR+1)). Der Sender teilt den Baudraten-generator-Ausgangstakt durch 2, 8 oder 16, abhängig vom Modus. Der Baudraten-generatorausgang wird direkt vom Empfängertakt und den Datenwiederherstellungseinheiten verwendet. Die Wiederherstellungseinheiten verwenden eine Takterzeugung die 2, 8, oder 16 Zustände benutzt, unabhängig von dem Modus, der durch die UMSEL, U2X und DDR_XCK-Bits eingestellt ist.

Tabelle 20-1: Baudraten ermitteln
BetriebsartGleichung
Baudrate aus UBRRn		Gleichung
UBRRn aus Baudrate
Asynchron, normal
U2Xn = 0
BAUD = fOSC
16·(UBRRn – 1)
UBRRn = fOSC – 1
16·BAUD
Asynchron, doppelt schnell
U2Xn = 1
BAUD = fOSC
8·(UBRRn – 1)
UBRRn = fOSC – 1
8·BAUD
Synchron, Master
BAUD = fOSC
2·(UBRRn – 1)
UBRRn = fOSC – 1
2·BAUD
Hinweis:
  1. Die Baudrate ist die Symbolrate in baud
Betriebsart: normal doppelt synchron Fehler =
 | BAUD | Baudrate in baud (Symbol oder Schritt pro Sekunde)
 | fosc | Frequenz des Systemtaktes
 | UBRRn | Inhalt des Doppelregisters, aus UBRRnH und UBRRnL zusammengesetzt (0 – 4095)

Einige Beispiele für UBRR-Werte und Frequenzen des Systemtaktes sind in Tabellen unten abgebildet.

20.3.2 Doppelte Geschwindigkeit

Die Datentransferrate kann verdoppelt werden, wenn das U2X-Bit im UCSRA gesetzt wird. Das Setzen dieses Bits wirkt sich nur im asynchronen Modus aus. Wenn ein synchroner Modus verwendet wird, sollte das Bit gelöscht bleiben.

Das Setzen des Bits reduziert den Divisor des Baudratenteilers von 16 auf 8, was einer Verdopplung der Transferrate für die asynchrone Kommunikation entspricht. Man beachte, dass der Empfänger in diesem Fall nur die halbe Anzahl von Abtastungen (8 statt 16) bei der Datenerfassung und Taktwiederherstellung verwendet wird und daher genauere Baudrateneinstellungen und Systemtakte erforderlich sind, wenn dieser Modus verwendet wird. Für den Sender gibt es keine Beeinträchtigungen.

20.3.3 Externer Takt

Die externe Taktung wird im synchronen Slavemodus verwendet. Die Beschreibung bezieht sich auf das Abbild zuvor.

Der externe Takt vom XCK-Pin wird durch ein Synchronisationsregister abgetastet. Der Ausgang des Synchronisationsregisters muss durch einen Flankenerkenner bevor er für den Sender und Empfänger verwendet werden kann. Dieser Vorgang leitet eine Verzögerung von zwei CPU-Takten ein, daher ist die maximale externe Taktfrequenz von XCK begrenzt auf:

fXCK < fOSC
4
Man beachte, dass fosc von der Stabilität der Quelle des Systemtaktes abhängt. Es wird daher empfohlen, einigen Spielraum einzukalkulieren, um den möglichen Datenverlust durch Veränderungen der Frequenz zu vermeiden.

20.3.4 Synchrone Taktung

Wenn ein synchroner Modus ausgewählt wurde (USEL=1), dann wird der XCK-Pin entweder als Takteingang (Slave) oder als Taktausgang verwendet. Der Zusammenhang zwischen den Taktflanken, den Datenabtasten oder Datenänderungen ist der gleiche. Das grundsätzliche Prinzip ist, dass der Dateneingang (RxD) mit der gegenüberliegenden Flanke des XCK-Taktes abgetastet wird als bei der Flanke, zu dem der Datenausgang (TxD) wechselt.

Bild 20-3: Zeitdiagramm synchroner Takt

Das UCPOL-Bit im UCRSC-Register legt fest, welche XCK-Taktflanke für das Abtasten der Daten verwendet wird und welche für den Datenwechsel. Wie in obiger Abbildung zu sehen werden die Daten bei UCPOL=0 mit der steigenden Flanke von XCK gewechselt und mit der fallenden Flanke abgetastet. Bei UCPOL = 1 werden die Daten mit der fallenden Flanke gewechselt und mit der steigenden Flanke abgetastet.

20.4. Rahmenformate

Ein serieller Rahmen ist definiert als ein Zeichen mit Daten mit Synchronisationsbits (Start- und Stoppbits) und einem optionalen Paritätsbit für die Fehlererkennung. Die USART akzeptiert alle 30 Kombinationen aus dem Folgenden als gültige Rahmenformate:

  • 1 Startbit
  • 5, 6, 7, 8 oder 9 Datenbits
  • kein, gerades oder ungerades Paritätsbit
  • 1 oder 2 Stoppbits

Ein Rahmen beginnt mit dem Startbit, gefolgt von dem LSB-Datenbit. Anschließend folgen die anderen bis zu insgesamt neun Datenbits, mit dem MSB endend. Wenn freigegeben wird ein Paritätsbit nach den Datenbits eingefügt, bevor dann die Stoppbits folgen. Wenn ein vollständiger Rahmen übertragen wurde kann direkt ein weiterer Rahmen folgen oder die Kommunikationsverbindung kann in einen idle (High) Zustand gesetzt werden. Das nachfolgende Bild zeigt die möglichen Rahmenformate, die Bits in Klammern sind optional.

Bild 20-4: Rahmenformate
St | Startbit (immer Low)
(n) | Datenbits (0 bis 8)
P | Paritätsbit, gerade oder ungerade
Sp | Stoppbit (immer High)
IDLE | Keine Übertragung auf der Kommunikationsleitung (RxD oder TxD). Eine IDLE-Leitung muss immer High sein.

Das Rahmenformat, das die USART verwendet, wird durch die Bits UCSZ2 bis UCSZ0, UPM1 bis UPM0 und das USBS-Bit in den Registern UCSRB und UCSRC eingestellt. Der Empfänger und der Sender verwenden die gleichen Einstellungen. Zu beachten ist, dass ein Verändern dieser Bits alle laufenden Übertragungen des Senders und Empfängers unbrauchbar macht.

Die Bits UCSZ2 bis UCSZ0 legen die Anzahl der Datenbits im Rahmen fest. Die Bits UPM1 bis UPM0 geben das Paritätsbit und dessen Art frei. Die Auswahl zwischen einem oder zwei Stoppbits erfolgt mit dem Bit USBS. Der Empfänger ignoriert ein zweites Stoppbit. Ein Rahmenfehler wird daher nur in den Fällen erkannt, in denen das erste Stoppbit Null ist.

20.4.1 Paritätsbit-Berechnung

Die Parität ist die Exklusiv-ODER-Verknüpfung aller Datenbits. Bei ungerader Parität wird davon die Invertierung verwendet. Die Beziehung zwischen Datenbits und Parität ist folgende:
Pgerade | = | dn-1 ⊕…⊕ d3 ⊕ d2 ⊕ d1 ⊕ d0 ⊕ 0
Pungerade | = | dn-1 ⊕…⊕ d3 ⊕ d2 ⊕ d1 ⊕ d0 ⊕ 1
Peven | Parity bit using even parity
Podd | Parity bit using odd parity
dn | Data bit n of the character

Wenn benutzt liegt das Paritätsbit stets zwischen dem letzten Datenbit (MSB) und dem ersten Stoppbit.

20.5 Initialisierung

Die USART muss initialisiert werden, bevor irgendeine Datenübertragung stattfinden kann. Die Initialisierungssequenz besteht normalerweise aus dem Einstellen des Baudratengenerators, dem Einstellen des Rahmenformates und der Freigabe des Senders und Empfängers abhängig davon, welcher benötigt wird. Bei interruptgetriebener USART-Arbeitsweise muss das globale Interruptflag während der Initialisierung des USART gelöscht (und damit alle Interupts gesperrt) sein.

Bevor eine erneute Initialisierung mit Verändern der Baudrate oder des Rahmenformates vorgenommen wird, muss man sich vergewissern, dass keine Übertragung läuft, während die Register geändert werden. Das TXC-Flag kann genutzt werden, um zu prüfen, ob der Sender alle Übertragungen abgeschlossen hat und das RXD-Flag kann verwendet werden, um zu prüfen, ob keine ungelesenen Daten im Empfangspuffer liegen. Man beachte, dass das TXC-Flag vor jeder Übertragung (also bevor in das UDR geschrieben wird) gelöscht werden muss, wenn es in diesem Sinne verwendet werden soll.

Das folgende einfache Beispiel zur Initialisierung des USART ist in Assembler und C identisch. Die Beispiele setzen voraus, dass mit einem Polling und nicht mit Interrupts gearbeitet wird und ein festes Rahmenformat verwendet wird. Die Baudrate wird als Parameter der Funktion übergeben. Im Assemblercode wird angenommen, dass der Baudraten-Parameter in den Registern R25:R24 abgelegt ist. Wenn die Funktion in das UCSRC-Register schreibt, muss das URSEL-Bit (MSB) gesetzt sein, da sich UBRRH und UCSRC eine I/O-Speicherzelle teilen.

Kodebeispiel in Assembler(1)
USART_Init:
    ; Baudrate setzen
    sts	UBRR0H,r25
    sts	UBRR0L,r24
    ; Sender und Empfänger freigeben
    ldi	r24,1<<RXEN0 | 1<<TXEN0
    sts	UCSR0B,r24
    ; Rahmenformat setzen: 8 Datenbits, 2 Stoppbits, keine Parität
    ldi	r24,1<<USBS0 | 3<<UCSZ00
    sts	UCSR0C,r24
    ret
Kodebeispiel in C(1)
#define F_CPU 1843200	// Taktfrequenz, kann auch vom Makefile kommen
#define BAUD 9600
void main(void) {
  ...
  /* Dieser Ausdruck rundet korrekt und generiert eine Konstante */
  USART_Init((unsigned)(F_CPU/16.0/BAUD-0.5));
  ...
}
void USART_Init(unsigned ubrr) {
  /* Baudrate setzen */
  UBRR0 = ubrr;
  /* Sender und Empfänger freigeben */
  UCSR0B = (1<<RXEN0)|(1<<TXEN0);
  /* Rahmenformat setzen: 8 Datenbits, 2 Stoppbits, keine Parität */
  UCSR0C = (1<<USBS0)|(3<<UCSZ00);
}
Hinweis:
  1. Siehe „Über Kode-Beispiele“

Weiter fortgeschrittene Initialisierungsroutinen können so ausgelegt sein, dass auch das Rahmenformat als Parameter übergeben wird und die Interrupts automatisch gesperrt und freigegeben werden usw. Viele Applikationen verwenden allerdings feste Einstellungen für die Baudrate und die Kontrollregister, so das für diese Arten von Applikation das Beispiel direkt in das Programm übernommen werden kann.

20.6 Daten senden

Der Sender der USART wird durch Setzen des Bits Transmit Enable (TXEN) im UCSRB-Register freigegeben. Wenn der Sender freigegeben ist, wird die normale Portfunktion des TxD-Pins durch die USART überschrieben und hat die Funktion als Ausgang des seriellen Senders. Die Baudrate, der Operationsmodus und das Rahmenformat müssen zunächst eingestellt werden, bevor eine Übertragung stattfinden kann. Wenn die synchrone Arbeitsweise verwendet wird, wird der Takt am XCK Pin als Sendetakt verwendet.

20.6.1 5-8 Datenbits

Eine Übertragung wird dadurch gestartet, indem der Sendepuffer mit den zu sendenden Daten geladen wird. Die CPU lädt den Sendebuffer, indem UDR beschrieben wird. Die gepufferten Daten im Sendepuffer werden in das Schieberegister transportiert, wenn das Schieberegister zum Senden eines neuen Rahmens bereit ist. Das Schieberegister wird geladen, wenn es im Idle-Zustand ist (d.h. keine laufende Übertragung) oder unmittelbar nachdem das letzte Stoppbit vom vorherigen Rahmen übertragen wurde. Wenn das Schieberegister mit neuen Daten geladen wird, wird ein kompletter Rahmen mit einer Rate, die durch das Baudratenregister, das U2X-Bit oder den XCK-Takt abhängig vom Betriebsmodus vorgegeben wird, übertragen.

Das folgende Programmbeispiel zeigt eine einfache USART-Sendefunktion, die auf dem Pollen des Flags „Datenregister leer“ UDRE basiert. Wenn Rahmen mit weniger als 8 Datenbits verwendet werden, werden die MSB, die ins UDR geschrieben wurden, ignoriert. Die USART muss initialisiert werden, bevor die Funktion genutzt werden kann. Im Assemblercode wird vorausgesetzt, dass die zu sendenden Daten im Register R24 stehen.

Kodebeispiel in Assembler(1)
USART_Transmit:
    ; Warte bis Sendepuffer frei
    lds	r25, UCSR0A
    sbrs	r25, UDRE0
     rjmp	USART_Transmit
    ; Put data (r24) into buffer, sends the data
    sts	UDR0,r24
    ret
Kodebeispiel in C(1)
void USART_Transmit(unsigned char data) {
  /* Warte bis Sendepuffer frei */
  while ( !( UCSRnA & (1<<UDREn)) ) ;
  /* Put data into buffer, sends the data */
  UDR0 = data;
}
Hinweis:
  1. Siehe „Über Kode-Beispiele“

Die Funktion wartet, bis der Sendepuffer leer ist, indem es das UDRE-Flag abfragt, bevor er mit den neuen zu sendenden Daten geladen wird. Wenn der entsprechende Interrupt verwendet wird, schreibt die Interruptroutine die Daten in den Sendepuffer.

20.6.2 9 Datenbits

Wenn 9-Bit Zeichen verwendet werden (UCSZ = 7), wird das neunte Bit in das TXB8-Bit im UCSRB Register geschrieben, bevor das Low-Byte des Zeichens in UDR geschrieben wird. Das folgende Programmbeispiel zeigt die Funktion für das Senden eine 9-Bit-Zeichens. Im Assemblerbeispiel wird vorausgesetzt, dass die zu sendenden Daten in den Registern R25 und R24 stehen.

Kodebeispiel in Assembler(1) (2)
USART_Transmit:
    bst	r25,0		;Datenbit 8 nach T retten
    ; Warte bis Sendepuffer frei (ohne ein weiteres Register zu verwenden)
0:	lds	r25,UCSR0A
    sbrs	r25,UDRE0
     rjmp	0b		;0b = gcc-Sprung zu lokalem Ziel: Zurück (back)
; Kopiere neuntes Datenbit nach TXB8
    lds	r25,UCSR0B
    bld	r25,TXB8	;hier T einsetzen
    sts	UCSR0B,r25
; Low-Teil in Puffer einsetzen und damit 9 Bit Daten senden
    sts	UDR0,r24
    ret
Kodebeispiel in C(1) (2)
void USART_Transmit(int data) {
  /* Warte bis Sendepuffer frei */
  while ( !( UCSR0A & (1<<UDRE0))) );
  /* Kopiere neuntes Datenbit nach TXB8 */
  UCSR0B = UCSR0B&~1 | data>>8&1;
  /* Low-Teil in Puffer einsetzen und damit 9 Bit Daten senden */
  UDR0 = (unsigned char)data;
}
Hinweise:
  1. Die Sendefunktion ist allgemein gehalten. Sie kann dahingehend optimiert werden, dass der Inhalt des UCSR0B-Registers statisch ist. Beispielsweise könnte das TXB8-Bit einmalig in der Initialisierung geladen werden.
  2. Siehe „Über Kode-Beispiele“

Das neunte Bit kann dazu verwendet werden, um ein Adressframe bei der Multiprozessor-Kommunikation zu kennzeichnen oder für andere Protokollaufgaben wie z.B. zur Synchronisation.

20.6.3 Sendeflags und Interrupts

Der USART Sender hat zwei Flags, die folgende Stati kennzeichnen: USART Data Register Empty (UDRE) und Transmit Complete (TXC). Beide Flags können zum Erzeugen eines Interrupts verwendet werden.

Das Data Register Empty Flag (UDRE) signalisiert, dass der Sendebuffer zur Aufnahmen neuer Daten bereit ist. Dieses Bit wird gesetzt, wenn der Sendebuffer leer ist und wird gelöscht, wenn der Sendebuffer zu sendende Daten enthält, die noch nicht in das Schieberegister übernommen wurden. Um die Kompatibilität zu zukünftigen Bausteinen sicherzustellen, sollte das Bit immer auf Null gesetzt werden, wenn in das UCSRA Register geschrieben wird.

Wenn das Data Register Empty Interrupt Enable (UDRIE) Bit im UCSRB Register auf 1 gesetzt wird, wird der entsprechende Interrupt so lange ausgeführt wie das UDRE Flag gesetzt ist, vorausgesetzt, dass die Interrupts global freigegeben sind. Das UDRE Falg wird gelöscht, indem in das UDR geschrieben wird. Wenn eine Interruptgesteuerte Datenübertragung verwendet wird, muss die Interrupt Routine entweder ein neues Datum in das UDR schreiben um das UDRE Flag zu löschen oder den Data Register Empty Interrupt sperren, da sonst ein neuer Interrupt ausgelöst wird, sobald die Interruptroutine beendet wurde.

Das Transmit Complete (TXC) Flag wird gesetzt, wenn ein vollständiger Frame aus dem Schieberegister des Senders übertragen wurde und keine weiteren Daten im Sendebuffer vorhanden sind. Das TXC Flag wird automatisch gelöscht, wenn der Transmit Complete Interrupt ausgeführt wird, oder indem einen 1 in das Bit geschrieben wird. Das TXC Bit ist hilfreich bei halb-duplex Schnittstellen (wie dem RS485 Standard), bei denen die sendende Einheit in den Empfangsmodus gehen muss um den Kommunikationsbus im Anschluss an eine erfolgte Übertragung freizugeben.

Wenn das Transmit Complete Interrupt Enable (TXCIE) Bit im UCSRB gesetzt ist, wird der USART Transmit Complete Interrupt ausgeführt, sobald das TXC Flag gesetzt wird, vorausgesetzt, die Interrupts sind global freigegeben. Wenn der Interrupt verwendet wird, muss die Interruptroutine des TXC Falg nicht extra löschen, da dies automatisch geschieht, wenn die Interruptroutine ausgeführt wird.

20.6.4 Paritätsgenerator

Der Parity Generator berechnet das Paritätsbit für die seriellen Framedaten. Wenn das Paritybit freigegeben ist (UPM1 = 1), dann fügt die Sender Kontrolllogik das Paritätsbit zwischen dem letzten Datenbit und dem ersten StoppBit des Frames ein, der gesendet wird.

20.6.5 Deaktivierung des Senders

Das Sperren des Senders durch Setzen des TXEN auf Null, wird nicht wirksam, bis eine laufende bzw. anstehende Übertragung abgeschlossen ist. D.h. die Sperre wird erst wirksam, wenn das Schieberegister des Senders und der Sendebuffer keine zu sendenden Daten mehr enthalten. Wenn der Sender gesperrt ist, wird er den TxD Pin nicht mehr überlagern.

20.7 Daten empfangen

Der USART Empfänger wird freigegeben, indem das Receive Enable (RXEN) Bit im UCSRB Register auf 1 gesetzt wird. Wenn der Empfänger freigegeben ist, wird die normale Funktion des RxD Pins durch die Funktion des USART Empfänger Eingangs überschrieben. Die Baudrate, der Operationsmodus und das Rahmen Format muss eingestellt werden, bevor der erste serielle Empfang stattfinden kann. Wenn der synchrone Modus verwendet wird, wird der Takt vom XCK Pin als Übertragungstakt verwendet.

20.7.1 5-8 Datenbits

Der Empfänger startet einen Datenempfang, wenn er ein gültiges Startbit erkennt. Jedes Bit das darauf folgt, wird mit der Baudrate oder dem XCK Takt abgetastet und in das Empfangsschieberegister geschoben bis das erste Stoppbit des Frames empfangen wird. Das zweite Stoppbit wird vom Empfänger ignoriert. Wenn das erste Stoppbit empfangen wurde, d.h. ein komplettes serielles Frame liegt im Eingangsbuffer, wird der Inhalt des Schieberegisters in den Empfangsbuffer geschoben. Der Empfangsbuffer kann dann ausgelesen werden, indem die UDR I/O Speicherzelle gelesen wird.

Das folgende Programmbeispiel zeigt eine einfache USART Empfangsfunktion, die auf dem Pollen des Receive Complete (RXC) Flags basiert. Wenn Frames mit weniger als 8 Datenbits verwendet werden, werden die MSB, die aus dem UDR gelesen werden mit Null maskiert. Die USART muss initialisiert werden, bevor die Funktion genutzt werden kann.
Kodebeispiel in Assembler(1)
USART_Receive:
    ; Wait for data to be received
    lds	r16,UCSR0A
    sbrs	r16,UDRE0
     rjmp	USART_Receive
    ; Get and return received data from buffer
    lds	r16,UDR0
    ret
Kodebeispiel in C(1)
unsigned char USART_Receive(void) {
  /* Wait for data to be received */
  while (!(UCSR0A & (1<<RXC0)));
  /* Get and return received data from buffer */
  return UDR0;
}
Hinweis:
  1. Siehe „Über Kode-Beispiele“
Die Funktion wartet bis Daten im Empfangsbuffer vorliegen, indem es permanent das RXC Flag abfragt, bevor es den Buffer ausliest.

20.7.2 9 Datenbits

Wenn 9-bit Zeichen verwendet werden (UCSZ = 7) muss das neunte Bit aus dem RXB8 Bit im UCSRB Register gelesen werden bevor das Low-Byte aus dem UDR gelesen wird. Diese Regel gilt auch für das FE, DOR und PE Status Flag. Erst den Status von UCSRA lesen, dann die Daten vom UDR. Das Lesen der UDR I/O Speicherzelle verändert den Status des Empfangsbuffer FIFO und somit werden auch die TXB8, FE, DOR und PE Bits, die im FIFO gespeichert sind, verändert.

Das folgende Programmbeispiel zeigt eine einfache USART Empfangsfunktion, das die Statusbits und das 9-bit Zeichen handhabt.
Kodebeispiel in Assembler(1)
USART_Receive:
    ; Wait for data to be received
    lds	r16,UCSR0A
    sbrs	r16,RXC0
     rjmp	USART_Receive
    ; Get status and 9th bit, then data from buffer
    lds	r18,UCSR0A
    lds	r17,UCSR0B
    lds	r16,UDR0
    ; If error, return -1
    andi	r18,(1<<FE0)|(1<<DOR0)|(1<<UPE0)
    breq	USART_ReceiveNoError
    ldi	r17, HIGH(-1)
    ldi	r16, LOW(-1)
USART_ReceiveNoError:
    ; Filter the 9th bit, then return
    lsr	r17
    andi	r17,0x01
    ret
Kodebeispiel in C(1)
unsigned int USART_Receive(void) {
  unsigned char status,resh,resl;
  /* Wait for data to be received */
  while (!(UCSR0A & (1<<RXC0)));
  /* Get status and 9th bit, then data from buffer */
  status = UCSR0A;
  resh = UCSR0B;
  resl = UDR0;
  /* If error, return -1 */
  if (status & (1<<FEn)|(1<<DORn)|(1<<UPEn))  return -1;
  /* Filter the 9th bit, then return */
  resh = (resh >> 1) & 0x01;
  return ((resh << 8) | resl);
}
Hinweis:
  1. Siehe „Über Kode-Beispiele“
    For I/O Registers located in extended I/O map, “IN”, “OUT”, “SBIS”, “SBIC”, “CBI”, and “SBI” instructions must be replaced with instructions that allow access to extended I/O. Typically “LDS” and “STS” combined with “SBRS”, “SBRC”, “SBR”, and “CBR”.
Die Empfangsfunktion liest alle I/O Register in das Register File bevor eine weitere Berechnung erfolgt. Das gibt eine optimale Ausnutzung des Empfangsbuffers, da der Empfangsbuffer durch das Auslesen geleert wird und daher so früh wie möglich für die Aufnahme neuer Daten bereit steht.

20.7.3 Empfangs-komplett-Flag und Interrupt

Das USART hat ein Flag, das seinen Zustand signalisiert. Das Receive Complete Flag (RXC) zeigt an, dass ungelesene Daten im Empfangsbuffer stehen. Das Bit ist 1, wenn ungelesene Daten im Empfangsbuffer liegen und es ist 0, wenn der Empfangsbuffer leer ist, d.h. wenn er keine ungelesenen Daten enthält. Wenn der Empfänger gesperrt wird (RXEN = 0), dann wird der Empfangsbuffer geleert und konsequenter Weise wird das RXC Bit gelöscht.

Wenn das Receive Complete Interrupt Enable (RXCIE) Bit im UCSRB Register gesetzt ist, wird der USART Receive Complete Interrupt so lange ausgeführt wie das RXC Flag gesetzt ist, vorausgesetzt, die Interrupts sind global freigegeben. Wenn eine Interruptgesteuerter Datenempfang verwendet wird, muss die Interruptroutine die empfangenen Daten aus dem UDR Register auslesen, um das RXC Flag zu löschen. Andernfalls tritt nach dem Beenden der Interruptroutine sofort ein neuer Interrupt auf.

20.7.4 Empfangsfehler-Flags

Der USART Empfänger hat drei Fehler Flags: Frame Error (FE), Data OverRun (DOR) und Parity Error (PE). Auf alle Flags kann durch Lesen des UCSRA Registers zugegriffen werden. Die Fehler Flags werden im Eingangsbuffer zusammen mit dem Frame, für den sie den Fehlerstatus signalisieren, abgelegt. Da auch die Fehler Flags gebuffert werden, muss das UCSRA Register ausgelesen werden, bevor der Empfangsbuffer (UDR) gelesen wird, da das Lesen des UDR I/O Speicherzelle die Bufferlesestelle verändert. Eine andere Eigenschaft der Fehler Flags ist, dass sie durch das Beschreiben durch die Software nicht verändert werden können. Trotzdem müssen alle Flags beim Schreiben in das UCSRA Register auf Null gesetzt sein, um die Kompatibilität zu zukünftigen USART Erweiterungen sicherzustellen. Keines der Fehler Flags löst einen Interrupt aus.

Das Frame Error (FE) Flag zeigt des Status des ersten Stoppbits des als nächstes auszulesenden Frames an, der im Empfangsbuffer steht. Das FE Bit ist null, wenn das Stoppbit korrekt (als 1) gelesen wurde und das Bit ist eins, wenn das Stoppbit falsch (also 0) war. Dieses Bit kann also verwendet werden, um Synchronisationsfehler, Abbrüche oder Protokollfehler zu erkennen. Das FE Flag wird durch das Setzen des USBS Bits im UCSRC Register nicht beeinflusst, da der Empfänger alle Stoppbits außer dem ersten ignoriert. Um die Kompatibilität zu zukünftigen Bausteinen zu gewährleisten, sollte das Bit beim Schreiben in das UCSRA Register auf 0 gesetzt sein.

Das Data OverRun Flag (DOR) signalisiert einen Datenverlust durch den Überlauf des Empfangsbuffers. Ein Datenüberlauf tritt auf, wenn der Empfangsbuffer voll ist (also zwei Zeichen enthält), ein neues Zeichen im Empfangsschieberegister wartet und ein neues Startbit erkannt wird. Wenn das DOR Flag gesetzt ist, sind also ein oder mehrere Frames zwischen dem zuletzt gelesenen Frame und dem nächsten Frame, des aus dem UDR gelesen werden kann, verloren gegangen. Um die Kompatibilität zu zukünftigen Bausteinen zu gewährleisten, sollte das Bit beim Schreiben in das UCSRA Register auf 0 gesetzt sein. Das DOR Flag wird gelöscht, wenn ein empfangenes Frame erfolgreich aus dem Schieberegister in den Eingangsbuffer transportiert wurde.

Das Parity Error Flag (PE) zeigt an, dass der nächste Frame im Empfangsbuffer einen Paritätsfehler beim Empfangen hatte. Wenn der Paritätscheck nicht freigegeben ist, wird das PE Bit immer als 0 gelesen. Um die Kompatibilität zu zukünftigen Bausteinen zu gewährleisten, sollte das Bit beim Schreiben in das UCSRA Register auf 0 gesetzt sein.

20.7.5 Paritätsprüfer

Der Paritätsprüfer ist aktiv, wenn das obere USART Parity Mode Bit (UPM1) gesetzt ist. Die Art des Paritätschecks (gerade oder ungerade) wird durch das UPM0 Bit festgelegt. Wenn freigegeben, berechnet der Paritätsprüfer die Parität der Datenbits des einkommenden Frames und vergleicht das Ergebnis mit dem Paritätsbit des Frames. Das Ergebnis des Vergleiches wird zusammen mit den empfangenen Daten und Stoppbits im Empfangsbuffer gespeichert. Das Parity Error Flag (PE) kann dann durch die Software ausgelesen werden, um zu überprüfen, ob das Frame einen Paritätsfehler hat.

Das PE Bit ist gesetzt, wenn das nächste Zeichen, das aus dem Empfangsbuffer ausgelesen werden kann, beim Empfang einen Paritätsfehler hatte und in diesem Augenblick der Paritätscheck freigegeben war (UPM1 = 1). Das Bit ist so lange gültig, bis der Empfangsbuffer gelesen wird.

20.7.6 Deaktivierung des Empfängers

Im Gegensatz zum Sender wirkt das Sperren des Empfängers sofort. Die Daten eines laufenden Empfanges gehen daher verloren. Wenn der Empfänger gesperrt wird (RXEN wird auf 0 gesetzt), dann überschreibt der Empfänger nicht länger die normale Funktion des RxD Portpins. Der Empfängerbuffer FIFO wird gespült wenn der Empfänger gesperrt wird. Die übrig bleibenden Daten im Buffer werden gelöscht.

20.7.7 Ausräumen des Empfangspuffers

Der Empfängerbuffer FIFO wird geleert, wenn der Empfänger gesperrt wird, d.h. der Buffer wird von seinem Inhalt entleert. Ungelesene Daten gehen dadurch verloren. Wenn der Buffer während des normalen Betriebes geleert werden soll, zum Beispiel aufgrund eines Fehlers, so sollte das UDR I/O Register gelesen werden, bis das RXD Flag Null wird. Das folgende Beispiel zeigt, wie der Eingangsbuffer geleert werden kann.
Kodebeispiel in Assembler(1)
USART_Flush:
    lds	r16,UCSR0A
    sbrs	r16,RXC0
     ret
    lds	r16,UDR0
    rjmp	USART_Flush
Kodebeispiel in C(1)
void USART_Flush(void) {
  unsigned char dummy;
  while (UCSR0A & (1<<RXC0)) dummy=UDR0;
}
Hinweis:
  1. Siehe „Über Kode-Beispiele“
    For I/O Registers located in extended I/O map, “IN”, “OUT”, “SBIS”, “SBIC”, “CBI”, and “SBI” instructions must be replaced with instructions that allow access to extended I/O. Typically “LDS” and “STS” combined with “SBRS”, “SBRC”, “SBR”, and “CBR”.

20.8 Asynchroner Datenempfang

Der USART enthält eine Takt- und Datenwiederherstellungseinheit, um den asynchronen Datenempfang zu handhaben. Die Taktwiederherstellungslogik wird verwendet, um den internen Takt des Baudratengenerators mit dem am RxD Pin eingehenden seriellen Rahmen zu synchronisieren. Die Datenwiederherstellungslogik tastet jedes eingehende Bit ab und filtert es in einem Tiefpass. Dadurch verbessert sich die Störanfälligkeit es Empfängers. Der Arbeitsbereich beim asynchronen Empfang hängt von der Genauigkeit des internen Baudraten Taktes, der Genauigkeit der ankommenden Rahmens und der Anzahl der Bits pro Rahmen ab.

20.8.1 Asynchrone Taktregenerierung

Die Taktwiederherstellungslogik synchronisiert den internen Takt mit dem eingehenden seriellen Frame. Das nachfolgende Bild zeigt den Abtastvorgang des Startbits eines ankommenden Frames. Die Abtastrate ist im normalen Modus das 16-fache und im Modus mit doppelter Geschwindigkeit das 8-fache der Baudrate. Die Pfeile zeigen die Synchronisationsabweichungen im Abtastprozess. Zu beachten ist die größere Zeitabweichung wenn der Modus mit doppelter Geschwindigkeit verwendet wird (U2X = 1). Die Abtastungen, die mit Null bezeichnet sind, sind Abtastungen, die ausgeführt wurden, als die RxD Leitung inaktiv war.
Bild 20-5: Startbit-Erfassung
Wenn die Taktwiederherstellungslogik einen High (inaktiv) zu Low (Startbit) Übergang auf der RxD Leitung erkennt, beginnt die Sequenz zur Startbiterkennung. Gehen wir davon aus, dass die Abtastung 1 die erste Nullabtastung war. Dann verwendet die Taktwiederherstellungslogik im normalen Modus die 8, 9 und 10 Abtastung, um zu entscheiden, ob ein gültiges Startbit empfangen wurde. Im Modus mit doppelter Geschwindigkeit werden die Abtastungen 4, 5 und 6 verwendet. Wenn zwei oder mehr der drei Abtastungen als High erkannt werden, wird das Startbit als Störspitze interpretiert und der Empfänger wartet auf das Erkennen des nächsten High-Low Übergangs. Immer wenn ein gültiges Startbit erkannt wurde, ist die Taktwiederherstellungslogik synchronisiert und die Datenwiederherstellung kann beginnen. Der Synchronisationsvorgang wird bei jedem Startbit wiederholt.

20.8.2 Asynchrone Datenregenerierung

Wenn der Empfängertakt durch das Startbit synchronisiert ist, kann die Datenwiederherstellung beginnen. Auch die Datenwiederherstellungseinheit tastet im normalen Modus 16 mal und im Modus mit doppelter Geschwindigkeit 8 mal ab. Das nachfolgende Bild zeigt das Abtasten eines Datenbits oder des Paritätsbits. Jeder Abtastung wird eine Nummer gegeben, die mit dem Status der Wiederherstellungseinheit übereinstimmt.
Bild 20-6: Daten- und Paritätsbit-Erfassung
Die Entscheidung über den logischen Pegel des empfangenen Bits treffen die drei Abtastungen in der Mitte (Nummer in einem Kästchen) der Abtastsequenz durch Mehrheitsentscheidung. Die Mehrheitsentscheidung läuft wie folgt: Haben zwei oder alle Abtastungen High-Pegel, so wird das empfangene Bit als 1 erkannt, haben zwei oder alle Abtastungen Low-Pegel, so wird das empfangene Bit als 0 erkannt. Der Prozess der Mehrheitsentscheidung arbeitet wie ein Tiefpassfilter für die über den RxD Pin ankommenden Signale. Der Wiederherstellungsvorgang wird so lange wiederholt, bis ein vollständiger Frame empfangen wurde, inklusive des ersten Stoppbits. Man beachte: Der Empfänger wertet nur das erste Stoppbit aus.

Das nachfolgende Bild zeigt die Abtastung des Stoppbits und den frühstmöglichen Beginn des Startbits vom nächsten Frame.
Bild 20-7: Stoppbit- und Nächstes-Startbit-Erfassung
Die Mehrheitsentscheidung läuft beim Stoppbit genauso ab, wie bei den anderen Bits eines Frames. Wenn das Stopbit als 0 erkannt wird, wird das Frame Error (FE) Flag gesetzt.

Ein neuer High-Low Übergang der das Startbit eines neuen Frames anzeigt, kann unmittelbar nach dem letzten Bit, das für die Mehrheitsentscheidung benötigt wird, kommen. Im normalen Modus kann der erste Low-Pegel am Punkt (A) abgetastet werden. Im Modus mit Doppelter Geschwindigkeit muss der erste Low-Pegel bis zum Punkt (B) warten. Der Punkt (C) kennzeichnet ein Stoppbit mit voller Länge. Die frühe Startbiterkennung hat Einfluss auf den Arbeitsbereich des Empfängers.

20.8.3 Asynchroner Arbeitsbereich

Der Arbeitsbereich des Empfängers ist von der Fehlabweichung zwischen der empfangenen Bitrate und der internen Baudrate abhängig. Wenn der Sender die Frames mit zu großer oder zu kleiner Bitrate sendet oder die interne Baudrate des Empfängers nicht die gleiche Basisfrequenz aufweist, ist es dem Empfänger nicht möglich die Frames mit den Startbit zu synchronisieren. Die folgenden Gleichungen können verwendet werden, um das Verhältnis der ankommenden Datenrate zu der internen Baudrate zu berechnen.
Rlangsam = (D + 1)·S
S - 1 + D·S + SF
Rschnell = (D + 2)·S
(D + 1)·S + SM
D | Summe aus Zeichengröße und Größe des Paritätsbits
S | Abtastungen pro Bit (S=16 im normalen Modus, S=8 im Modus mit doppelter Geschwindigkeit)
SF | Nummer der ersten Abtastung für die Mehrheitsentscheidung (SF=8 im normalen Modus, SF=4 im Modus mit doppelter Geschwindigkeit)
SM | Nummer der mittleren Abtastung für die Mehrheitsentscheidung (SM=9 im normalen Modus, SM=5 im Modus mit doppelter Geschwindigkeit)
Rlangsam | ist das Verhältnis der kleinsten eingehenden Datenrate, die akzeptiert werden kann zur Baudrate des Empfängers
Rschnell | ist das Verhältnis der größten eingehenden Datenrate, die akzeptiert werden kann zur Baudrate des Empfängers

Die nachfolgenden Tabellen zeigen den maximalen Fehler des Baudrate des Empfängers, der toleriert werden kann. Man beachte, dass im normalen Modus größere Abweichungen der Baudrate toleriert werden.

Tabelle 20-2: Empfohlener maximaler Empfängerbaudratenfehler für normale Geschwindigkeit
Daten- + Paritätsbits | Rlangsam in % | Rschnell in % | Max. Gesamtfehler in % | Empfohlener max. Fehler in %
5 | 93,20 | 106,67 | +6,67/-6,8 | ± 3,0
6 | 94,12 | 105,79 | +5,79/-5,88 | ± 2,5
7 | 94,81 | 105,11 | +5,11/-5,19 | ± 2,0
8 | 95,36 | 104,58 | +4,58/-4,54 | ± 2,0
9 | 95,81 | 104,14 | +4,14/-4,19 | ± 1,5
10 | 96,17 | 103,78 | +3,78/-3,83 | ± 1,5
Tabelle 20-3: Empfohlener maximaler Empfängerbaudratenfehler für doppelte Geschwindigkeit
Daten- + Paritätsbits | Rlangsam in % | Rschnell in % | Max. Gesamtfehler in % | Empfohlener max. Fehler in %
5 | 94,12 | 105,66 | +5,66/-5,88 | ± 2,5
6 | 94,92 | 104,92 | +4,92/-5,08 | ± 2,0
7 | 95,52 | 104,35 | +4,35/-4,48 | ± 1,5
8 | 96,00 | 103,90 | +3,90/-4,00 | ± 1,5
9 | 96,39 | 103,53 | +3,53/-3,61 | ± 1,5
10 | 96,70 | 103,23 | +3,23/-3,30 | ± 1,0
Die Empfehlungen für den maximalen Baudratenfehler des Empfängers wurden unter der Voraussetzung berechnet, dass Sender und Empfänger den maximalen Fehler gleichermaßen teilen.

Es gibt zwei wichtige Quellen für den Baudratenfehler des Empfängers. Der Systemtakt (XTAL) des Empfängers hat immer geringe Instabilitäten im Spannungs- und Temperaturbereich. Wenn ein Quarz zum Erzeugen des Systemtaktes verwendet wird, ist dies selten ein Problem. Aber bei einem Resonator kann der Systemtakt schon mal um 2% abweichen, was von der Toleranz des Resonators abhängt. Die zweite Quelle für Fehler lässt sich besser kontrollieren. Der Baudratengenerator kann den Systemtakt nicht immer exakt auf die gewünschte Baudrate runterteilen. In diesem Fall kann ein UBRR Wert genommen werden, der eine akzeptabel kleine Abweichung bringt.

20.9 Multiprozessor-Kommunikation

Das Setzen des Multi-Prozessor Communikaton Mode (MPCM) Bits im UCSRA Register schaltet eine Filterfunktion für die vom USART empfangenen Rahmens ein. Rahmens, die keine Adressinformationen enthalten werden ignoriert und nicht in den Empfangspuffer übernommen. Dies reduziert die Anzahl der eingehenden Rahmens, die in einem System mit einer Kommunikation mehrerer MCUs über den selben Datenbus, von der CPU zu behandelnden sind. Der Sender wird von den Einstellungen des MPCM Bits nicht beeinflusst, er muss aber anders verwendet werden, wenn er Bestandteil eines Multiporzessor Kommunikationssystems ist.

Wenn der Empfänger zum Empfangen von Rahmens mit 5 bis 8 Datenbits eingestellt ist, zeigt das erste Stoppbit an, ob der Rahmen Daten- oder Adressinformationen enthält. Wenn der Empfänger aus Rahmens mit 9 Datenbits eingestellt ist, so wird das neunte Bit (RXB8) verwendet, um Adress- und Dateninformationen zu unterscheiden. Wenn das Rahmen Type Bit (erstes Stoppbit bzw. neuntes Bit) auf 1 ist, enthält der Rahmen eine Adresse, wenn der Rahmen Type 0 ist, enthält der Rahmen Daten.

Der Multiprozessor Kommunikations Modus ermöglicht mehreren Slave MCUs Daten von der Master MCU zu empfangen. Dies ist möglich, da zuerst das Adressframe dekodiert wird, um zu ermitteln, welche MCU adressiert wurde. Wenn ein bestimmter Slave MCU addressiert wurde, wird der die folgenden Datenrahmens normal empfangen, während die anderen Slave MCUs diese ignorieren bis ein weiteres Adressframe empfangen wird.

20.9.1 Anwendung der Multiprozessor-Kommunikation

Eine MCU, die als Master MCU arbeitet, kann das 9-bit Zeichen Frame Format (UCSZ = 7) verwenden. Das neunte Bit (TXB8) muss gesetzt werden, wenn ein Adressframe (TXB8 = 1) oder gelöscht werden, wenn ein Datenframe (TXB8 = 0) gesendet wird. Die Slave MCUs müssen in diesem Fall ebenfalls in das 9-bit Zeichen Frame Format eingestellt sein.

Die folgende Prozedur sollte beim Austausch von Daten im Multiprozessor Modus verwendet werden:
  1. Alle Slaves in den Multiprozessor Modus setzen (MPCM im UCSRA auf 1)

  2. Der Master MCU sendet ein Adressframe, das alle Slaves empfangen und lesen. In den Slave MCU wird das RXD Flag im OCSRC Register wie gewöhnlich gesetzt.

  3. Jeder Slave liest das UDR Register und bestimmt, ob er angesprochen wurde. Wenn ja, so löscht er das MPCM Bit im PCSRA Register, wenn nein, so wartet er auf das nächste Adress Byte und behält die MPCM Einstellungen.

  4. Die adressierte MCU empfängt alle Datenfarmes, bis ein neues Adressframe empfangen wird. Die anderen Slave MCUs, bei denen das MPCM Bit nach wie vor gesetzt ist, ignorieren die Datenfarmes.

  5. Wenn das letzte Datenframe durch die adressierte MCU empfangen wurde, setzt auch die adressierte MCU das MPCM Bit wieder auf 1 und wartet auf das nächste Adressframe vom Master. Der Vorgang wiederholt sich dann ab Schritt 2.
Das Verwenden von 5 bis 8-bit Zeichen Frame Formaten ist zwar möglich, aber unpraktisch, da der Empfänger zwischen der Verwendung von n und n+1 Zeichen Frame Format umschalten muss. Das macht voll-duplex Operationen schwierig, da der Sender und der Empfänger die gleichen Zeichenbreiten Einstellungen haben müssen. Wenn 5 bis 8-bit Zeichen Frame Formate verwendet werden, muss der Sender auf zwei Stoppbits (USBS = 1) eingestellt werden, da das erste Stoppbit zum Kennzeichnen des Frametypes verwendet wird.

Man sollte keine Lesen-Ändern-Schreiben Befehle (SBI und CBI) zum Setzen und Löschen des MPCM Bits verwenden. Das MPCM Bit ist in der gleichen I/O Speicherzelle untergebracht wie das TXC Flag und dieses kann versehentlich gelöscht werden, wenn ein SBI oder CBI Befehl ausgeführt wird.

20.10 Beispiele für die Baudraten Einstellung

Für Standard-Quarz- und Resonator-Frequenzen können die am häufigsten verwendeten Baudraten in asynchronen Modus durch die Einstellungen des UBRR wie in folgenden Tabellen erzeugt werden. UBRR-Werte, deren prozentuale Abweichung von der exakten Baudrate weniger als 0,5 % beträgt sind fett dargestellt. Höhere Fehlerraten können akzeptiert werden, allerdings hat der Empfänger dann eine schlechtere Störungssicherheit, besonders bei langen seriellen Rahmen (siehe asynchrone Arbeitsweise). Der Fehlerwert kann mit folgender Formel berechnet werden:
Fehler [%] = ( Baudratenächster Wert -1)· 100 %
Baudrate

20.11 Register-Beschreibung

20.11.1 UDRn — Bidirektionales Datenregister

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0xC6) | RxB[7:0] |  |  |  |  |  |  |  | UDR0 (Lesen)
(0xC6) | TxB[7:0] |  |  |  |  |  |  |  | UDR0 (Schreiben)
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0

Das USART Sender Daten Buffer Register und das Empfänger Daten Buffer Register teilen sich die gleiche I/O Speicherstelle, die mit USART Data Register oder UDR bezeichnet wird. Das Sender Data Buffer Register (TXB) ist das Ziel für Daten, die in das UDR geschrieben werden. Das Lesen des UDR Registers wird den Inhalt des Empfänger Daten Buffer Registers (RXB) zurückgeben. Bei 5, 6 oder 7 Bit Zeichen werden die oberen, ungenutzten Bits vom Sender ignoriert und vom Empfänger auf Null gesetzt.

Der Sendebuffer kann nur beschrieben werden, wenn das UDRE Flag im UCSRC Register gesetzt ist. Daten, die in das UDR geschrieben werden, wenn das UDRE Flag nicht gesetzt ist, werden durch den Sender ignoriert. Wenn Daten in den Senderbuffer geschrieben wurden und der Sender freigegeben ist, wird der Sender die Daten in das Schieberegister laden, sobald das Schieberegister leer ist. Dann werden die Daten seriell über den TxD Pin ausgesendet.

Der Empfängerbuffer besteht aus zwei FIFOs. Die FIFOs ändern ihren Status, wenn auf den Empfängerbuffer zugegriffen wird. Aufgrund dieses Verhaltens des Empfängerbuffers sollten keine Lesen-Ändern-Schreiben Befehle auf diese Speicherstelle angewendet werden. Man muss auch vorsichtig bei der Verwendung von Bit-Test Befehlen sein, da diese ebenfalls den Status des FIFO verändern.

20.11.2 UCSRnA — Kontroll- und Statusregister A

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0xC0) | RXC0 | TXC0 | UDRE0 | FE0 | DOR0 | UPE0 | U2X0 | MPCM0 | UCSR0A
Zugriff | R | R/W | R | R | R | R | R/W | R/W
Startwert | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0
  • Bit 7 – RXC: USART Receive Complete
Dieses Bit ist gesetzt, wenn ungelesenen Daten im Empfängerbuffer vorliegen und das Bit wird gelöscht, wenn der Empfängerbuffer leer ist, d.h. keine ungelesenen Daten enthält. Wenn der Empfänger gesperrt wird, wird der Empfängerbuffer gelöscht und somit auch das RXC Bit auf Null gesetzt. Das RXC Falg kann genutzt werden, um einen Receive Complete Interrupt auszulösen (siehe RXCIE Bit).
  • Bit 6 – TXC: USART Transmit Complete
Dieses Bit ist gesetzt, wenn ein Frame im Senderschieberegister vollständig ausgeschoben wurde und keine weiteren Daten im Senderbuffer (UDR) warten. Das TXC Flag wird automatisch gelöscht, wenn der Transmit Complete Interrupt ausgeführt wird oder eine logische 1 in dieses Bit geschrieben wird. Das TXC Falg kann genutzt werrden, um einen Transmit Complete Interrupt auszulösen (siehe TXCIE Bit).
  • Bit 5 – UDRE: USART Data Register Empty
Das UDER Flag zeigt an, dass der Senderbuffer zur Aufnahme neuer Daten bereit ist. Wenn UDRE auf 1 ist, ist der Buffer leer und kann somit mit neuen Daten beschrieben werden. Das UDRE Falg kann genutzt werrden, um einen Data Register Empty Interrupt auszulösen (siehe UDRIE Bit). Nach einem Reset wird das UDRE Bit gesetzt und zeigt an, dass der Sender fertig ist.
  • Bit 4 – FE: Frame Error
Dieses Bit ist gesetzt, wenn das nächste Zeichen im Empfängerbuffer einen Framefehler beim Empfangen hatte, d.h wenn das erster Stoppbit des nächten Zeichens im Empfängerbuffer Null war. Dieses Bit ist so lange gültig, bis der Empfangsbuffer gelesen wird. Das FE Bit ist Null, wenn das Stoppbit der empfangenen Daten 1 war. Das Bit sollte immer auf 0 gesetzt werden, wenn in das UCSRA Register geschrieben wird.
  • Bit 3 – DOR: Data OverRun
Dieses Bit wird gesetzt, wenn eine Datenüberlaufbedingung erkannt wurde. Ein Datenüberlauf tritt auf, wenn der Empfangsbuffer voll ist (zwei Zeichen enthält), ein weiteres Zeichen im Empfangsschieberegister wartet und eine neue Startbedingung erkannt wird. Dieses Bit ist so lange gültig, bis der Empfangsbuffer gelesen wird. Das Bit sollte immer auf 0 gesetzt werden, wenn in das UCSRA Register geschrieben wird.
  • Bit 2 – PE: Parity Error
Dieses Bit ist gesetzt, wenn das nächste Zeichen im Empfangsbuffer einen Paritätsfehler beim Empfang hatte und der Paritätscheck zu diesem Zeitpunkt freigegeben war (UPM = 1). Dieses Bit ist so lange gültig, bis der Empfangsbuffer gelesen wird. Das Bit sollte immer auf 0 gesetzt werden, wenn in das UCSRA Register geschrieben wird.
  • Bit 1 – U2X: Double the USART Transmission speed
Dieses Bit hat nur im asynchronen Modus Auswirkungen. Das Bit sollte im synchronen Modus auf Null gesetzt sein. Wird das Bit mit einer 1 beschrieben, so wird der Teiler des Baudratengenerators von 16 auf 8 gesetzt, was eine Verdopplung der Übertragungsrate im asynchronen Modus zur Folge hat.
  • Bit 0 – MPCM: Multi-Prozessor Communication Mode
Dieses Bit gibt die Multiprozessor Kommunikation frei. Wenn das MPCM Bit auf 1 gesetzt ist, werden alle ankommenden Frames, die keine Adressinformationen vom USART Empfänger ignoriert. Der Sender wird durch das MPCM Bit nicht beeinflusst.

20.11.3 UCSRnB — Kontroll- und Statusregister B

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0xC1) | RXCIE0 | TXCIE0 | UDRIE0 | RXEN0 | TXEN0 | UCSZ02 | RXB80 | TXB80 | UCSR0B
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7 – RXCIE: USART RX Complete Interrupt Enable
Das Setzen dieses Bits auf 1 gibt den Interrupt für das RXC Flag frei. Der USART Receive Complete Interrupt wird nur ausgeführt, wenn RXCIE auf 1 steht, die Interrupts global freigegeben sind und das RXC Flag im UCSRA gesetzt wird.
  • Bit 6 – TXCIE: TX Complete Interrupt Enable
Das Setzen dieses Bits auf 1 gibt den Interrupt für das TXC Flag frei. Der USART Transmit Complete Interrupt wird nur ausgeführt, wenn TXCIE auf 1 steht, die Interrupts global freigegeben sind und das TXC Flag im UCSRA gesetzt wird.
  • Bit 5 – UDRIE: USART Data Register Empty Interrupt Enable
Das Setzen dieses Bits auf 1 gibt den Interrupt für das UDRE Flag frei. Ein Data Register Empty Interrupt wird nur ausgeführt, wenn UDRIE auf 1 steht, die Interrupts global freigegeben sind und das UDRE Flag im UCSRA gesetzt wird.
  • Bit 4 – RXEN: Receiver Enable
Das Setzen dieses Bits auf 1 gibt den USART Empfänger frei. Der Empfänger überschreibt die normale Portfunktion des RxD Pins, wenn er freigegeben ist. Das Sperren des Empfängers löscht den Empfängerbuffer und macht die FE, DOR und PE Flags ungültig.
  • Bit 3 – TXEN: Transmitter Enable
Das Setzen dieses Bits gibt den USART Sender frei. Der Sender überschreibt die normale Portfunktion des TxD Pins, wenn er freigegeben ist. Das Sperren des Senders (TXEN auf 0 setzen) wird erst wirksam, wenn laufende und wartende Übertragungen abgeschlossen sind, d.h. wenn das Senderschieberegister und der Senderbuffer keine noch zu übertragenden Daten mehr enthalten. Nach dem Sperren wird der TxD Port nicht meht überschrieben.
  • Bit 2 – UCSZ2: Character Size 2
Dieses Bit legt zusammen mit den UCSZ1 und UCSZ0 Bits im UCSRC Register die Anzahl der Bits pro Zeichen in einem Frame für den Empfänger und den Sender fest.
  • Bit 1 – RXB8: Receive Data Bit 8
Das RXB8 Bit ist das neunte Datenbit des empfangenen Zeichens, wenn mit Frames mit neun Datenbits gearbeitet wird. Es muss gelesen werden bevor die unteren Bits aus dem UDR Register gelesen werden.
  • Bit 0 – TXB8: Transmit Data Bit 8
Das TXB8 Bit ist das neunte Datenbit des zu sendenden Zeichens, wenn mit Frames mit neun Datenbits gearbeitet wird. Es muss geschrieben werden bevor die unteren Bits in das UDR Register geschrieben werden.

20.11.4 UCSRnC — Kontroll- und Statusregister C

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0xC2) | UMSEL01 | UMSEL00 | UPM01 | UPM00 | USBS0 | UCSZ01 | UCSZ00 | UCPOL0 | UCSR0C
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0
Diese Bit wählt zwischen einem Zugriff auf das UCSRC oder dass UBRRH Register aus. Es wird als 1 gelesen, wenn das UCSRC Register gelesen wird. Das URSEL Bit muss 1 sein, wenn in das UCSRC Register geschrieben wird.
  • Bit 6 – UMSEL: USART Mode Select
Dieses Bit wählt zwischen dem asynchronen und dem synchronen Betriebsmodus aus. Bei UMSEL = 0 ist der asynchrone, bei UMSEL = 1 der synchrone Betriebsmodus ausgewählt.
Tabelle 20-8: Werte für UMSELn-Bits
UMSELn1 | UMSELn0 | Modus
0 | 0 | Anynchrone USART (also ART)
0 | 1 | Synchrone USART (also SRT)
1 | 0 | reserviert
1 | 1 | SPI-Master (MSPIM)(1)
Hinweis:
  1. Siehe USART im SPI-Modus zur Beschreibung der SPI-Master-Betriebsart
  • Bit 5 und 4 – UPM1, UPM0: Parity Mode
Diese Bits geben den Paritätscheck frei und setzen seinen Typ. Wenn freigegeben, erzeugt und sendet der Sender automatisch die Parität der gesendeten Daten in jedem Frame. Der Empfänger erzeugt den Paritätswert für die ankommenden Daten und vergleicht diesen mit den Einstellungen des UPM0 Bits. Wenn keine Übereinstimmung erkannt wird, wird das PE Flag im UCSRA Register gesetzt.
Tabelle 20-9: Werte für UPMn-Bits
UPMn1 | UPMn0 | Paritäts-Modus
0 | 0 | Kein Paritätsbit
0 | 1 | reserviert
1 | 0 | Gerade Parität
1 | 1 | Ungerade Parität
  • Bit 3 – USBS: Stop Bit Select
Dieses Bit legt die Anzahl der Stoppbits fest, die vom Sender eingefügt werden. Bei USBS = 0 wird ein Stoppbit, bei USBS = 1 werden zwei Stoppbits eingefügt. Der Empfänger ignoriert die Einstellungen des USBS Bits.
Tabelle 20-10: Werte für das USBS-Bit
USBSn | Stoppbits
0 | 1 Bitzeit
1 | 2 Bitzeiten
  • Bit 2 und 1 – UCSZ1, UCSZ0: Character Size 1 und 0
Diese Bits legt zusammen mit dem UCSZ2 Bits im UCSRB Register die Anzahl der Bits pro Zeichen in einem Frame für den Empfänger und den Sender fest.
Tabelle 20-11: Werte für UCSZn-Bits
UCSZn2 | UCSZn1 | UCSZn0 | Zeichenlänge
0 | 0 | 0 | 5 Bit
0 | 0 | 1 | 6 Bit
0 | 1 | 0 | 7 Bit
0 | 1 | 1 | 8 Bit
1 | 0 | 0 | reserviert
1 | 0 | 1 | reserviert
1 | 1 | 0 | reserviert
1 | 1 | 1 | 9 Bit
  • Bit 0 – UCPOL: Taktpolarität

Dieses Bit wird nur im synchronen Modus verwendet. Im asynchronen Modus muss das Bit mit einer Null beschrieben werden. Das UCPOL-Bit legt die Beziehung zwischen dem Wechsel der Ausgangsdaten und dem Abtasten der Eingangsdaten und dem synchronen Taktsignal (XCK) fest.

20.11.5 UBRRn — Baudraten-Register

Bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8
(0xC5) | - | - | - | - | UBRR0[11:8] |  |  |  | UBRR0H
(0xC4) | UBRR0[7:0] |  |  |  |  |  |  |  | UBRR0L
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
Zugriff | R | R | R | R | R/W | R/W | R/W | R/W
 | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
    Bit 15 bis 12 – Res: Reservierte Bits
Dieses Bits sind für zukünftige Erweiterungen reserviert. Um die Kompatibilität sicherzustellen müssen diese Bits mit Null beschrieben werden, wenn UBRRH beschrieben wird.
  • Bit 11 bis 0 – UBRR11 bis UBRR0: USART Baud Rate Register
Dieses Bits bilden zusammen ein 12-bit Register, welches die USART-Baudrate beinhaltet. Das UBRRH enthält die vier obersten Bits, das UBRRL die acht unteren Bits der USART-Baudrate. Laufende Übertragungen des Senders und Empfängers werden unbrauchbar, wenn die Baudrate verändert wird. Ein Schreiben in das UBRRL-Register hat eine unmittelbare Aktualisierung des Baudraten-Vorteilers zur Folge.


USART im SPI-Modus

21. USART im SPI-Modus

21.1 Features

  • Vollduplex, Synchroner Datentransfer mit drei Leitungen
  • Master-Betrieb „MSPIM“
  • Unterstützt alle vier SPI-Modi (Modus 0, 1, 2 und 3)
  • LSB oder MSB zuerst (konfigurierbare Bitreihenfolge)
  • Doppelt gepufferte Datenwarteschlange
  • Hohe Auflösung des Baudratengenerators
  • Hochgeschwindigkeits-Betriebsmodus (fXCKmax = fCK/2)
  • Flexible Interrupterzeugung

21.2 Übersicht

Der universelle serielle Datensender/-empfänger (USART) kann in einen SPI-kompatiblen Master-Betriebsmodus versetzt werden. Werden beide UMSELn1:0-Bits gesetzt, wird die USART-interne MSPIM-Logik aktiviert. In dieser Betriebsart übernimmt die SPI-Master-Steuerlogik die Kontrolle über die USART-Ressourcen. Die Ressourcen umfassen die Sende- und Empfangsschieberegister und -Puffer sowie den Baudraten-Generator. Der Paritätsgenerator und -prüfer, die Daten- und Taktwiederherstellungslogik sowie die RX- und TX-Steuerlogik sind abgeschaltet. Die USART-eigene RX- und TX-Steuerlogik wird durch eine gemeinsame SPI-Transfersteuerlogik ersetzt. Andererseits ist die Pin-Steuerlogik und Interrupterzeugungslogik identisch in beiden Betriebsmodi. Die Lage der I/O-Register ist die gleich in beiden Betriebsmodi, aber ein Teil der Funktionalität der Steuerregister ändert sich bei Nutzung des MSPIM.

21.3 Takterzeugung

Die Takterzeugungslogik generiert den Basistakt für den Sender und Empfänger. Für USART-MSPIM wird nur die interne Takterzeugung unterstützt, mithin nur der Master-Modus. Die Datenrrichtungsregister für das XCKn-Pin (DDR_XCKn) muss daher auf Eins (Ausgang) gesetzt werden, damit der USART-MSPIM richtig funktioniert. Bevorzugt sollte DDR_XCKn gesetzt werden, bevor MSPIM aktiviert wird (d.h. TXENn- und RXENn-Bit auf Eins gesetzt). Die interne Takterzeugung im MSPIM-Modus ist identisch zum synchronen USART-Master-Modus. Die Baudrate oder UBRRn-Einstellung kann daher durch die gleichen Gleichungen berechnet werden, siehe folgende Tabelle:
Tabelle 21-1: Gleichungen zwischen Baudrate und Baudraten-Register
Betriebsart Baudrate aus UBRRn(1) UBRRn aus Baudrate
Synchroner Master-Modus
BAUD = fOSC
2·(UBRRn+1)
UBRRn = fOSC -1
2·BAUD
Hinweis
  1. Die Baudrate ist die Symbolrate in Bit pro Sekunde (bps)
BAUD | Baudrate (in Bits pro Sekunde, bps)
fOSC | Taktfrequenz des Hauptoszillators
UBRRn | Inhalt des Registers, aus UBRRnH und UBRRnL zusammengesetzt (0-4095)

21.4 SPI-Datenmodi und -Zeiten

Es gibt vier Kombinationen der Phase und Polarität von XCKn (SCK) im Bezug zu den seriellen Daten, welche durch die Steuerbits UCPHAn und UCPOLn festgelegt werden. Das Datentransfer-Zeitdiagramm ist im Bild 21-1 dargestellt. Die Datenbits werden an entgegengesetzten Flanken des XCKn-Signals herausgeschoben bzw. abgetastet, so dass genügend Zeit für die Stabilisierung des Daten-Signalpegels bleibt. Die Funktion von UCPOLn und UCPHAn ist in Tabelle 21-2 zusammengefasst. Das Ändern eines der beiden Bits während einer laufenden Kommunikation bringt sowohl Sender als auch Empfänger durcheinander.
Tabelle 21-2: Funktion von UCPOLn und UCPHAn
UCPOLn | UCPHAn | SPI-Modus | Erste Flanke | Zweite Flanke
0 | 0 | 0 | Abtasten (steigend) | Ausgeben (fallend)
0 | 1 | 1 | Ausgeben (steigend) | Abtasten (fallend)
1 | 0 | 2 | Abtasten (fallend) | Ausgeben (steigend)
1 | 1 | 3 | Ausgeben (fallend) | Abtasten (steigend)
Bild 21-1: Zeitdiagramme für die vier Kombinationen aus UCPHAn und UCPOLn

21.5 Rahmenformate

Ein serieller Rahmen für MSPIM ist definiert als ein Zeichen von 8 Datenbits. Der USART im MSPIM-Modus hat zwei gültige Rahmenformate:
  • 8 Bit Data mit MSB zuerst
  • 8 Bit Data mit LSB zuerst
Ein Rahmen beginnt mit dem niedrigst- oder höchstwertigen Datenbit. Dann folgen die nächsten Datenbits, insgesamt acht, mit dem höchst- oder niedrigstwertigen Datenbit entsprechend endend. Wurde ein kompletter Rahmen gesendet, kann der nächste unmittelbar folgen oder die Kommunikationsleitung wird in den Pausenzustand (high) gesetzt. Das Bit UDORDn in UCSRnC setzt das Rahmenformat im MSPIM-Modus. Sowohl Empfänger als auch Sender benutzen die gleiche Einstellung. Das Ändern dieses Bits während einer laufenden Kommunikation bringt sowohl Sender als auch Empfänger durcheinander. 16-bit-Datentransfer wird durch das Schreiben von zwei Datenbytes in UDRn erreicht. Ein UART-Senden-fertig-Interrupt signalisiert dann, dass der 16-Bit-Wert ausgeschoben wurde.

21.5.1. MSPIM-Initialisierung

The USART in MSPIM mode has to be initialized before any communication can take place. The initialization process normally consists of setting the baud rate, setting master mode of operation (by setting DDR_XCKn to one), setting frame format and enabling the Transmitter and the Receiver. Only the transmitter can operate independently. For interrupt driven USART operation, the Global Interrupt Flag should be cleared (and thus interrupts globally disabled) when doing the initialization.
Note:
To ensure immediate initialization of the XCKn output the baud-rate register (UBRRn) must be zero at the time the transmitter is enabled. Contrary to the normal mode USART operation the UBRRn must then be written to the desired value after the transmitter is enabled, but before the first transmission is started. Setting UBRRn to zero before enabling the transmitter is not necessary if the initialization is done immediately after a reset since UBRRn is reset to zero.
Before doing a re-initialization with changed baud rate, data mode, or frame format, be sure that there is no ongoing transmissions during the period the registers are changed. The TXCn Flag can be used to check that the Transmitter has completed all transfers, and the RXCn Flag can be used to check that there are no unread data in the receive buffer. Note that the TXCn Flag must be cleared before each transmission (before UDRn is written) if it is used for this purpose. The following simple USART initialization code examples show one assembly and one C function that are equal in functionality. The examples assume polling (no interrupts enabled). The baud rate is given as a function parameter. For the assembly code, the baud rate parameter is assumed to be stored in the r17:r16 registers.
Kodebeispiel in Assembler(1)
USART_Init:
    clr  r18
    out  UBRRnH,r18
    out  UBRRnL,r18
; Das XCKn-Portpin als Ausgang setzen, was den Master-Modus aktiviert
    sbi  XCKn_DDR, XCKn
; MSPI-Betriebsart auf SPI-Modus 0 setzen
    ldi  r18,(1<<UMSELn1)|(1<<UMSELn0)|(0<<UCPHAn)|(0<<UCPOLn)
    out  UCSRnC,r18
; Sender und Empfänger freigeben
    ldi  r18,(1<<RXENn)|(1<<TXENn)
    out  UCSRnB,r18
; Baudrate setzen.
; WICHTIG: Die Baudrate darf erst nach der Aktivierung von Sender und Empfänger gesetzt werden!
    out  UBRRnH,r17
    out  UBRRnL,r18
    ret
Kodebeispiel in C(1)
void USART_Init(unsigned int baud) {
  UBRRn = 0;
/* Das XCKn-Portpin als Ausgang setzen, was den Master-Modus aktiviert */
  XCKn_DDR |= (1<<XCKn);
/* MSPI-Betriebsart auf SPI-Modus 0 setzen */
  UCSRnC = (1<<UMSELn1)|(1<<UMSELn0)|(0<<UCPHAn)|(0<<UCPOLn);
/* Sender und Empfänger freigeben */
  UCSRnB = (1<<RXENn)|(1<<TXENn);
/* Baudrate setzen. */
/* WICHTIG: Die Baudrate darf erst nach der Aktivierung von Sender und Empfänger gesetzt werden! */
  UBRRn = baud;
}
Hinweis:
  1. Siehe „Über Kode-Beispiele“

21.6 Datentransfer

Using the USART in MSPI mode requires the Transmitter to be enabled, i.e. the TXENn bit in the UCSRnB register is set to one. When the Transmitter is enabled, the normal port operation of the TxDn pin is overridden and given the function as the Transmitter's serial output. Enabling the receiver is optional and is done by setting the RXENn bit in the UCSRnB register to one. When the receiver is enabled, the normal pin operation of the RxDn pin is overridden and given the function as the Receiver's serial input. The XCKn will in both cases be used as the transfer clock.

After initialization the USART is ready for doing data transfers. A data transfer is initiated by writing to the UDRn I/O location. This is the case for both sending and receiving data since the transmitter controls the transfer clock. The data written to UDRn is moved from the transmit buffer to the shift register when the shift register is ready to send a new frame.

Note:
To keep the input buffer in sync with the number of data bytes transmitted, the UDRn register must be read once for each byte transmitted. The input buffer operation is identical to normal USART mode, i.e. if an overflow occurs the character last received will be lost, not the first data in the buffer. This means that if four bytes are transferred, byte 1 first, then byte 2, 3, and 4, and the UDRn is not read before all transfers are completed, then byte 3 to be received will be lost, and not byte 1.
The following code examples show a simple USART in MSPIM mode transfer function based on polling of the Data Register Empty (UDREn) Flag and the Receive Complete (RXCn) Flag. The USART has to be initialized before the function can be used. For the assembly code, the data to be sent is assumed to be stored in Register R16 and the data received will be available in the same register (R16) after the function returns.

The function simply waits for the transmit buffer to be empty by checking the UDREn Flag, before loading it with new data to be transmitted. The function then waits for data to be present in the receive buffer by checking the RXCn Flag, before reading the buffer and returning the value.

Kodebeispiel in Assembler(1)
USART_MSPIM_Transfer:
; Wait for empty transmit buffer
    in r16, UCSRnA
    sbrs r16, UDREn
    rjmp USART_MSPIM_Transfer
; Put data (r16) into buffer, sends the data
    out UDRn,r16
; Wait for data to be received
    USART_MSPIM_Wait_RXCn:
    in r16, UCSRnA
    sbrs r16, RXCn
    rjmp USART_MSPIM_Wait_RXCn
; Get and return received data from buffer
    in r16, UDRn
    ret
Kodebeispiel in C(1)
unsigned char USART_Receive( void )
{
/* Wait for empty transmit buffer */
  while ( !( UCSRnA & (1<<UDREn)) );
/* Put data into buffer, sends the data */
  UDRn = data;
/* Wait for data to be received */
  while ( !(UCSRnA & (1<<RXCn)) );
/* Get and return received data from buffer */
  return UDRn;
}
Hinweis:
  1. Siehe „Über Kode-Beispiele“

21.6.1 Sende- und Empfängerflags und Interrupts

The RXCn, TXCn, and UDREn flags and corresponding interrupts in USART in MSPIM mode are identical in function to the normal USART operation. However, the receiver error status flags (FE, DOR, and PE) are not in use and is always read as zero.

21.6.2 Deaktivierung des Senders oder Empfängers

The disabling of the transmitter or receiver in USART in MSPIM mode is identical in function to the normal USART operation.

21.7 Gegenüberstellung MSPIM und SPI

The USART in MSPIM mode is fully compatible with the AVR SPI regarding:
  • Master mode timing diagram.
  • The UCPOLn bit functionality is identical to the SPI CPOL bit.
  • The UCPHAn bit functionality is identical to the SPI CPHA bit.
  • The UDORDn bit functionality is identical to the SPI DORD bit.
However, since the USART in MSPIM mode reuses the USART resources, the use of the USART in MSPIM mode is somewhat different compared to the SPI. In addition to differences of the control register bits, and that only master operation is supported by the USART in MSPIM mode, the following features differ between the two modules:
  • The USART in MSPIM mode includes (double) buffering of the transmitter. The SPI has no buffer.
  • The USART in MSPIM mode receiver includes an additional buffer level.
  • The SPI WCOL (Write Collision) bit is not included in USART in MSPIM mode.
  • The SPI double speed mode (SPI2X) bit is not included. However, the same effect is achieved by setting UBRRn accordingly.
  • Interrupt timing is not compatible.
  • Pin control differs due to the master only operation of the USART in MSPIM mode.
A comparison of the USART in MSPIM mode and the SPI pins is shown in folgende Tabelle.
Tabelle 21-3: Vergleich der USART im MSPIM-Modus mit SPI-Pins
USART_MSPIM | SPI | Kommentar
TxDn | MOSI | Nur Master-Ausgang
RxDn | MISO | Nur Master-Eingang
XCKn | SCK | (functionell identisch)
(N/A) | SS | Vom USART nicht unterstützt im MSPIM-Modus

21.8 Register-Beschreibung

The following section describes the registers used for SPI operation using the USART.

21.8.1 UDRn — Bidirektionales Datenregister

The function and bit description of the USART data register (UDRn) in MSPI mode is identical to normal USART operation. Siehe „UDRn — Bidirektionales Datenregister“.

21.8.2 UCSRnA — Kontroll- und Statusregister A

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
 | RXCn | TXCn | UDREn | – | – | – | – | – | UCSRnA
Zugriff | R | R/W | R | R | R | R | R | R
Startwert | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0
  • Bit 7 – RXCn: USART Receive Complete This flag bit is set when there are unread data in the receive buffer and cleared when the receive buffer is empty (i.e., does not contain any unread data). If the Receiver is disabled, the receive buffer will be flushed and consequently the RXCn bit will become zero. The RXCn Flag can be used to generate a Receive Complete interrupt (see description of the RXCIEn bit).
  • Bit 6 – TXCn: USART Transmit Complete This flag bit is set when the entire frame in the Transmit Shift Register has been shifted out and there are no new data currently present in the transmit buffer (UDRn). The TXCn Flag bit is automatically cleared when a transmit complete interrupt is executed, or it can be cleared by writing a one to its bit location. The TXCn Flag can generate a Transmit Complete interrupt (see description of the TXCIEn bit).
  • Bit 5 – UDREn: USART Data Register Empty The UDREn Flag indicates if the transmit buffer (UDRn) is ready to receive new data. If UDREn is one, the buffer is empty, and therefore ready to be written. The UDREn Flag can generate a Data Register Empty interrupt (see description of the UDRIE bit). UDREn is set after a reset to indicate that the Transmitter is ready.
  • Bit 4:0 – Reserved Bits in MSPI mode When in MSPI mode, these bits are reserved for future use. For compatibility with future devices, these bits must be written to zero when UCSRnA is written.

    21.8.3 UCSRnB — Kontroll- und Statusregister B

    Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
    RXCIEnTXCIEnUDRIEnRXENnTXENn–––UCSRnB
    Zugriff | R/W | R/W | R/W | R/W | R/W | R | R | R
    Startwert | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0
  • Bit 7 – RXCIEn: RX Complete Interrupt Enable Writing this bit to one enables interrupt on the RXCn Flag. A USART Receive Complete interrupt will be generated only if the RXCIEn bit is written to one, the Global Interrupt Flag in SREG is written to one and the RXCn bit in UCSRnA is set.
  • Bit 6 – TXCIEn: TX Complete Interrupt Enable Writing this bit to one enables interrupt on the TXCn Flag. A USART Transmit Complete interrupt will be generated only if the TXCIEn bit is written to one, the Global Interrupt Flag in SREG is written to one and the TXCn bit in UCSRnA is set.
  • Bit 5 – UDRIE: USART Data Register Empty Interrupt Enable Writing this bit to one enables interrupt on the UDREn Flag. A Data Register Empty interrupt will be generated only if the UDRIE bit is written to one, the Global Interrupt Flag in SREG is written to one and the UDREn bit in UCSRnA is set.
  • Bit 4 – RXENn: Receiver Enable Writing this bit to one enables the USART Receiver in MSPIM mode. The Receiver will override normal port operation for the RxDn pin when enabled. Disabling the Receiver will flush the receive buffer. Only enabling the receiver in MSPI mode (i.e. setting RXENn=1 and TXENn=0) has no meaning since it is the transmitter that controls the transfer clock and since only master mode is supported.
  • Bit 3 – TXENn: Transmitter Enable Writing this bit to one enables the USART Transmitter. The Transmitter will override normal port operation for the TxDn pin when enabled. The disabling of the Transmitter (writing TXENn to zero) will not become effective until ongoing and pending transmissions are completed, i.e., when the Transmit Shift Register and Transmit Buffer Register do not contain data to be transmitted. When disabled, the Transmitter will no longer override the TxDn port.
  • Bit 2:0 – Reserved Bits in MSPI mode When in MSPI mode, these bits are reserved for future use. For compatibility with future devices, these bits must be written to zero when UCSRnB is written.

    21.8.4 UCSRnC — Kontroll- und Statusregister C

    Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
    UMSELn1UMSELn0–––UDORDnUCPHAnUCPOLnUCSRnC
    Zugriff | R/W | R/W | R | R | R | R/W | R/W | R/W
    Startwert | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0
  • Bit 7:6 – UMSELn1:0: USART Mode Select These bits select the mode of operation of the USART as shown in Table 21-4. See ”UCSRnC – USART Control and Status Register n C” on page 193 for full description of the normal USART operation. The MSPIM is enabled when both UMSELn bits are set to one. The UDORDn, UCPHAn, and UCPOLn can be set in the same write operation where the MSPIM is enabled.
    Tabelle 21-4: UMSELn Bits Settings
    UMSELn1 | UMSELn0 | Mode
    0 | 0 | Asynchronous USART
    0 | 1 | Synchronous USART
    1 | 0 | reserviert
    1 | 1 | Master SPI (MSPIM)
  • Bit 5:3 – Reserved Bits in MSPI mode When in MSPI mode, these bits are reserved for future use. For compatibility with future devices, these bits must be written to zero when UCSRnC is written.
  • Bit 2 – UDORDn: Data Order When set to one the LSB of the data word is transmitted first. When set to zero the MSB of the data word is transmitted first. Refer to the Frame Formats section page 4 for details.
  • Bit 1 – UCPHAn: Clock Phase The UCPHAn bit setting determine if data is sampled on the leasing edge (first) or tailing (last) edge of XCKn. Refer to the SPI Data Modes and Timing section page 4 for details.
  • Bit 0 – UCPOLn: Clock Polarity The UCPOLn bit sets the polarity of the XCKn clock. The combination of the UCPOLn and UCPHAn bit settings determine the timing of the data transfer. Refer to the SPI Data Modes and Timing section page 4 for details.

    21.8.5 UBRRn — Baudraten-Register

    The function and bit description of the baud rate registers in MSPI mode is identical to normal USART operation. Siehe „UBRRn — Baudraten-Register“.


TWI: Serielles Zweidraht-Interface

22. TWI: Serielles Zweidraht-Interface

Im nachfolgenden Abschnitt wird das serielle Zweidraht-Interface beschrieben.

22.1 Features

  • Einfaches aber mächtiges und flexibles Kommunikationsinterface mit nur zwei Busleitungen
  • Sowohl Master- als auch Slavebetrieb
  • Baustein kann als Sender und Empfänger arbeiten
  • 7-bit-Adressraum erlaubt die Adressierung von 128 verschiedenen Slaves
  • Multi-Master-Entscheidungsunterstützung
  • Bis zu 400 kHz Übertragungsgeschwindigkeit
  • Ausgangstreiber mit limitierter Anstiegsgeschwindigkeit
  • Störungsunterdrückungsschaltungen verwerfen Störungen auf der Busleitung
  • Voll programmierbare Slaveadresse mit General Call-Unterstützung
  • Adresserkennung führt zum Aufwachen des AVR Bausteins aus den Sleep-Modi

22.2 Bus-Definition

Das Two-wire Serial Interface (TWI) ist für typische Mikrocontrollerapplikationen ideal aufgebaut. Das TWI Protokoll erlaubt dem Systemdesigner mit bis zu 128 verschiedenen Bausteinen zu arbeiten, die lediglich über zwei Leitungen miteinander verbunden sind. Eine Leitung für den Takt (SCL) und eine Leitung für die Daten (SDA). Die einzige externe Hardware, die in den Bus implementiert werden muss, sind zwei Pullup-Widerstände für die beiden Busleitungen. Alle Bausteine, die an den Bus angeschlossen werden, haben eine individuelle Adresse, die Mechanismen zur Auflösung von Buskollisionen sind Bestandteil des Busprotokolls.
Bild 22-1: TWI-Bus-Verbindungen

22.2.1 TWI-Terminologie

Die folgenden Definitionen werden uns in den folgenden Abschnitten wiederholt begegnen:
Bezeichnung | Beschreibung
Master | Dieser Baustein startet und beendet eine Datenübertragung, der Master generiert außerdem den Takt SCL.
Slave | Dieser Baustein wird durch den Master adressiert.
Sender | Dieser Baustein legt die Daten auf den Bus.
Empfänger | Dieser Baustein ließt die Daten von dem Bus.

22.2.2 Elektrischer Anschluss

Wie in obigem Abbild gezeigt, sind beide Busleitungen über die Pullup-Widerstände mit der positiven Versorgungsspannung verbunden. Die Bustreiber aller TWI-Bausteine sind open-drain oder open-collektor Treiber. Dies entspricht einer verdrahten UND-Funktion, die für die Arbeitsweise des Busses entscheidend ist. Ein Low-Pegel auf einer der Busleitungen wird erzeugt, indem einer oder mehrere TWI-Bausteine ihren Ausgang auf Low ziehen. Ein High-Pegel wird erzeugt, wenn alle Bausteine ihre Ausgänge in tristate versetzen, so dass die Pullup-Widerstände die Busleitungen auf High ziehen. Man beachte, dass allen AVR Bausteinen, die an den Bus angeschlossen werden, möglich sein muss, diese Busoperationen durchzuführen.

Die Anzahl der Bausteine, die an den Bus angeschlossen werden können, wird durch die maximale Buskapazität von 400 pF und den 7-bit Adressraum für die Slaves begrenzt. Eine detaillierte Beschreibung der elektrischen Eigenschaften des TWI ist weiter hinten enthalten. Dort sind die Spezifikationen für zwei verschiedene Busvarianten gegeben, eine für Busgeschwindigkeiten unterhalb von 100 kHz und eine für Busgeschwindigkeiten bis zu 400 kHz.

22.3 Rahmenformate

Im nachfolgenden Abschnitt wird die Datenübertragung mit dem TWI beschrieben.

22.3.1 Bits senden

Jedes Datenbit, das über den Bus übertragen wird, ist mit einem Puls auf der Taktleitung verbunden. Der Pegel der Datenleitung muss stabil sein, wenn die Taktleitung High ist. Die einzige Ausnahme von der Regel ist das Generieren einer Start- oder Stopp Bedingung.
Datenvalidierung TWI

22.3.2 Start- und Stopp-Bedingung

Der Master startet und beendet eine Datenübertragung. Die Übertragung wird gestartet, indem der Master eine Start Bedingung auf dem Bus erzeugt und beendet, indem der Master eine Stopp Bedingung auf dem Bus erzeugt. Zwischen einer Start und einer Stop Bedingung ist der Bus demzufolge belegt und kein anderer Master sollte versuchen die Kontrolle über den Bus zu übernehmen. Ein besonderer Fall tritt auf, wenn zwischen einer Start und einer Stopp Bedingung eine weitere Start Bedingung auftritt. Dies wird als Wiederholte Startbedingung bezeichnet und wird verwendet, wenn der Master eine neue Übertragung starten will, ohne vorher die Kontrolle über den Bus zu verlieren. Nach einer Wiederholten Start Bedingung ist der Bus weiterhin belegt, bis eine Stopp Bedingung auftritt. Dies ist identisch mit der normalen Start Bedingung und daher wird Start und Wiederholter Start im Folgenden allgemein als Start bezeichnet, spezielle Besonderheiten werden explizit erwähnt. Wie zuvor geschildert, werden die Start und Stopp Bedingungen dadurch signalisiert, dass sich der Pegel der SDA Leitung ändert, während die SCL Leitung High ist.
Start, erneuter Start und Stopp

22.3.3 Adressformat

Alle Adresspakete, die auf dem TWI-Bus übertragen werden sind 9-bit lang, bestehend aus 7-bit Adresse, einem READ/WRITE Bit und dem Bestätigungsbit (acknowledge, ACK). Wenn das READ/WRITE Bit gesetzt ist, wird eine Lese-Operation ausgeführt, wenn das Bit gelöscht ist, wird eine Schreiboperation durchgeführt. Wenn ein Salve erkennt, dass er adressiert wurde, so muss er im neunten Taktzyklus (SCL) die Datenleitung (SDA) auf Low ziehen. Wenn der Slave belegt ist oder aus einem anderen Grund die Anforderung vom Master nicht beantworten kann, so muss die SDA Leitung im neuntenTakt auf High bleiben. Der Master kann dann eine Stopp Bedingung generieren oder eine Wiederholte Start Bedingung ausführen um die Datenübertragung zu starten. Ein Adresspaket, das die Salveadresse und das Read oder Write Bit enthält wird als SLA+R bzw. SLA+W bezeichnet.

Das MSB der Adresse wird zuerst übertragen. Die Salveadressen können frei durch den Programmierer gewählt werden, allerdings ist die Adresse 0000 000 für einen Rundruf reserviert.

Wenn ein Rundruf ausgeführt wird, antworten alle Slaves indem sie die SDA Leitung im ACK Takt auf Low ziehen. Ein Rundruf wird verwendet, wenn der Master an alle Bausteine im System die gleiche Nachricht schicken will. Wenn die Rundrufadresse mit dem WRITE Bit auf den Bus ausgegeben wird, ziehen alle Slaves zum Bestätigen des Rundrufs die SDA Leitung im neunten Takt auf Low. Die folgenden Datenpakete werden dann von allen Slaves empfangen, die den Rundruf bestätigt haben. Man beachte, dass eine Rundrufadresse mit einem READ Bit unsinnig ist, da dies zu Kollisionen führen wird, wenn alle Slaves mit dem Aussenden unterschiedlicher Daten beginnen würden.

Alle Adressen mit dem Format 1111 xxx sind für zukünftige Verwendungen reserviert.

Adresspaket

22.3.4 Datenformat

Alle Datenpakete, die über den TWI-Bus übertragen werden, sind 9-Bit lang, acht Bit Daten und ein ACK Bit. Während des Datentransfers generiert der Master den Takt und die Start- Stop Bedingungen, während der Empfänger dafür verantwortlich ist, den Datenempfang zu bestätigen (ACK). Eine Bestätigung (ACK) wird durch den Empfänger dadurch signalisiert, indem er die SDA Leitung im neuten Takt auf Low zieht. Läßt der Empfänger die SDA Leitung im neunten Takt auf High, so wird eine Nichtbestätigung (NACK) signalisiert. Wenn der Empfänger das letzte Byte empfangen hat oder aus irgendwelchen Gründen keine weiteren Daten empfangen kann, teilt er dies dem Sender durch eine Nichtbestätigung (NACK) nach dem letzten Byte mit. Das MSB der Daten wird zuerst übertragen.
Datenpaket

22.3.5 Adressen und Daten gemischt

Eine Übertragung besteht grundsätzlich aus einer Start Bedingung, einer SLA+R/W Adresse, einem oder mehreren Datenpaketen und der Stopp Bedingung. Eine Leermeldung, bestehend aus einer Start und Stop Bedingung ist unzulässig. Man beachte, dass die verdrahtete UND-Funktion der SCL Leitung für das Aufbauen eines Handshake zwischen Master und Slave verwendet werden kann. Der Slave kann die Low-Periode der SCL Leitung verlängern, indem er diese auf Low ziegt. Dies ist nützlich, wenn die Taktgeschwindigkeit, die durch den Master erzeugt wird, zu hoch ist für den Slave und dieser mehr Zeit zum Verarbeiten der einzelnen Daten benötigt. Die verlängerte SCL Low-Periode beeinflusst nicht die High-Periode von SCL, die durch den Master bestimmt wird. Als Resultat kann der Slave also die TWI Datentransferrate reduzieren, indem er die Taktzeit von SCL verlängert.

Das nachfolgende Bild zeigt eine typische Datenübertragung. Man beachte, dass mehrere Datenbytes zwischen der SLA+R/W Adresse und der Stopp Bedingung übertragen werden können, dies ist abhängig von dem Softwareprotokoll, dass in der Applikation verwendet wird.

Typische Datenübertragung

22.4 Multi-Master-Bussystem

Das Busprotokoll erlaubt Bussysteme mit mehreren Mastern. Spezielle Dinge müssen geregelt werden, damit sichergestellt ist, dass ein Übertragungsprozess auch dann normal abläuft, wenn zwei oder mehrere Master zum gleichen Zeitpunkt eine Übertragung beginnen. Zwei Probleme können in Multi-Master Systemen auftreten:
  • Ein Algorithmus muss implementiert sein, der es nur einem Master erlaubt, seinen Übertragung zu beenden. Alle Master müssen ihre Übertragung aufhören, wenn sie entdecken, dass die den Auswahlprozess verloren haben. Dieser Auswahlprozess wird Arbitration (Schiedsgericht) genannt. Wenn ein unterlegender Master bemerkt, dass er das Schiedsgericht verloren hat, muss er sofort in den Slave-Modus umschalten, um zu überprüfen, ob der durch den gewinnenden Master adressiert wurde. Die Tatsache, dass mehrere Master zur gleichen Zeit eine Übertragung begonnen haben, wird durch die Slaves nicht bemerkt. D.h. die Daten, die über den Bus ausgesandt wurden, müssen nicht unbrauchbar werden.
  • Verschiedene Master können unterschiedliche SCL Frequenzen verwenden. Ein Plan muss erdacht werden, um die Takte aller Master zu synchronisieren um die Übertragung in einer Art Sperrschritt fortzufahren.
Die verdrahtete UND-Funktion der beiden Busleitungen wird verwendet, um diese beiden Probleme aufzulösen. Die seriellen Takte aller Master sind UND verknüpft, woraus sich ein Takt ergibt, dessen High-Periode durch den Master mit der kürzesten High-Periode bestimmt wird und dessen Low-Periode durch den Master mit der längsten Low-Periode bestimmt wird. Man beachte, dass alle Master die SCL Leitung abfragen, indem sie die High und Low Zeiten der Taktleitung SCL auszählen.
SCL-Synchromnisation
Das Schiedsgericht wird durch alle Master kontinuierlich durchgeführt, indem sie die SDA Leitung überwachen, nachdem sie Daten darauf ausgegeben haben. Wenn der Wert der Datenleitung SDA nicht mit dem Wert übereinstimmt, den ein Master ausgegeben hatte, so hat er das Schiedsgericht verloren. Man beachte, dass ein Master das Schiedsgericht nur dann verlieren kann, wenn er ein High auf die SDA Leitung ausgibt, während ein anderer Master diese Leitung auf Low zieht. Der unterlegene Master muss sofort in den Salve Modus gehen, um zu überprüfen, ob der durch den gewinnenden Master adressiert wurde. Die SDA Leitung sollte High bleiben, allerdings ist des dem unterlegenen Master erlaubt, bis zum Ende des laufenden Daten- oder Adresspaketes weiterhin das Taktsignal zu erzeugen. Das Schiedsgericht wird so lange fortgesetzt, bis nur ein Master übrig bleibt. Das kann viele Bits lang dauern. Wenn mehrere Master zeitgleich den gleichen Slave adressieren, so wird das Schiedsgericht während der Datenpakete fortgesetzt.
Schiedsgericht
Das Schiedsgericht ist nicht möglich zwischen:
  • Einer wiederholten Startbedingung und einem Datenbit
  • Einer Stoppbedingung und einem Datenbit
  • Einer wiederholten Startbedingung und einer Stoppbedingung
Es ist durch die Software des Anwenders sicherzustellen, dass diese ungültigen Schiedsgericht Bedingungen nicht auftreten können. Das bedeutet, dass in einem Multi-Master System alle Datenübertragungen die gleiche Zusammenstellung von SLA+R/W und den Datenpaketen haben müssen. Mit anderen Worten: Alle Übertragungen müssen die gleiche Anzahl von Datenpaketen haben, da andernfalls das Ergebnis des Schiedsgerichtes undefiniert ist.

22.5 Übersicht zum TWI-Modul

Das TWI Modul umfasst mehrere Untermodule, wie nachfolgend dargestellt. Auf alle Register, die in einer fetten Linie stehen, kann über den AVR Datenbus zugegriffen werden.
TWI Modul

22.6 TWI-Anwendung

Das AVR TWI ist Byte-orientiert und Interrupt basierend. Interrupts sind das Ergebnis aller Bus-Ereignisse wie das Empfangen eines Bytes oder das Senden einer START Bedingung. Da das TWI auf Interrupts basiert, kann die Applikationssoftware andere Aufgaben durchführen, während ein Byte übertragen wird. Das TWI Interrupt Enable Bit (TWIE) im TWCR Register zusammen mit dem I-Bit im SREG erlaubt der Applikation zu entscheiden, ob mit dem Auftreten des TWINT Flags eine Interrupt Anforderung ausgelöst wird oder nicht. Wenn das TWIE Bit gelöscht ist, muss die Applikationssoftware das TWINT Flag pollen, um die Aktivitäten auf dem TWI Bus zu erkennen.

Wenn das TWINT Flag gesetzt wird, wurde eine TWI Operation beendet und erwartet eine Antwort der Applikation. In diesem Fall enthält das TWI Status Register (TWSR) einen Wert, der den aktuellen Status des TWI Busses wiedergibt. Die Applikation kann dann entscheiden, wie sich der TWI Bus im nächsten Zyklus verhalten soll, indem das TWCR und das TWDR entsprechend manipuliert werden.

Die nachfolgende Abbildung zeigt ein einfaches Beispiel, wie die Applikation mit dem TWI zusammenarbeiten kann. In dem Beispiel will ein Master ein Byte an einen Slave senden. Die Beschreibung ist zunächst abstrakt, weitere detailliertere Beispiele folgen später. Ein einfacher Beispielcode der das gewünschte Verhalten erzeugt, ist ebenfalls enthalten.

Typische Übertragung mit TWI
  1. Der erste Schritt bei einer TWI Übertragung ist das Senden einer START Bedingung. Dies wird gemacht, indem ein spezieller Wert in das TWCR geschrieben wird, der die TWI Hardware veranlasst, eine START Bedingung zu senden. Welcher Wert genommen werden muss, wird später beschrieben. Wichtig ist, dass das TWINT Bit mit dem Schreiben des Wertes gesetzt wird. Das Schreiben einer 1 in das TWINT löscht dieses Flag. Das TWI startet keine Operation, solange das TWINT im TWCR gesetzt ist. Unmittelbar nachdem die Applikation das TWINT gelöscht hat, wird das TWI mit dem Aussenden der START Bedingung beginnen.

  2. Wenn die START Bedingung gesendet wurde, wird das TWINT im TWCR gesetzt und das TWSR wird mit dem Statuswert upgedatet, der signalisiert, dass eine START Bedingung erfolgreich ausgesendet wurde.

  3. Die Applikationssoftware sollte nun den Wert des TWSR analysieren, um sicherzustellen, dass die START Bedingung erfolgreich gesendet wurde. Wenn dies nicht der Fall war, muss die Software eine Art Fehler-Routine ausführen. Wenn der Status-Code der erwartete ist, muss die Applikation als nächstes die SLA+W in das TWDR laden. (Das TWDR wird für Adressen und Daten verwendet). Nachdem das TWDR mit der gewünschten SLA+W geladen ist, muss wieder ein spezieller Wert in das TWCR geschrieben werden, der die Hardware veranlasst, den SLA+W Wert im TWDR zu übertragen. Welcher Wert genommen werden muss, wird später beschrieben. Wichtig ist, dass das TWINT Bit mit dem Schreiben des Wertes gesetzt wird. Das Schreiben einer 1 in das TWINT löscht dieses Flag. Das TWI startet keine Operation, solange das TWINT im TWCR gesetzt ist. Unmittelbar nachdem die Applikation das TWINT gelöscht hat, wird das TWI mit dem Aussenden der SLA+W beginnen.

  4. Nachdem das Adresspaket ausgesendet wurde, wird das TWINT Flag im TWCR gesetzt und das TWSR wird mit dem Statuscode geladen, der das erfolgreiche Aussenden des Adresspaketes signalisiert. Der Statuscode zeigt auch an, ob ein Slave das Adresspaket bestätigt hat oder nicht.

  5. Die Applikationssoftware sollte nun den Wert des TWSR analysieren, um sicherzustellen, dass das Adresspaket erfolgreich übertragen und wie erwartet bestätigt wurde (ACK). Wenn dies nicht der Fall war, muss die Software eine Fehler-Routine ausführen. Wenn der Status-Code der erwartete ist, muss die Applikation als nächstes das Datenbyte in das TWDR laden. (Das TWDR wird für Adressen und Daten verwendet). Nachdem das TWDR mit der gewünschten Daten geladen ist, muss wieder ein spezieller Wert in das TWCR geschrieben werden, der die Hardware veranlasst, den Daten Wert im TWDR zu übertragen. Welcher Wert genommen werden muss, wird später beschrieben. Wichtig ist, dass das TWINT Bit mit dem Schreiben des Wertes gesetzt wird. Das Schreiben einer 1 in das TWINT löscht dieses Flag. Das TWI startet keine Operation, solange das TWINT im TWCR gesetzt ist. Unmittelbar nachdem die Applikation das TWINT gelöscht hat, wird das TWI mit dem Aussenden des Datenbytes beginnen.

  6. Nachdem das Datenpaket ausgesendet wurde, wird das TWINT Flag im TWCR gesetzt und das TWSR wird mit dem Statuscode geladen, der das erfolgreiche Aussenden des Datenpaketes signalisiert. Der Statuscode zeigt auch an, ob ein Slave das Datenpaket bestätigt (ACK) hat oder nicht.

  7. Die Applikationssoftware sollte nun den Wert des TWSR analysieren, um sicherzustellen, dass das Datenpaket erfolgreich übertragen und wie erwartet bestätigt wurde (ACK). Wenn dies nicht der Fall war, muss die Software eine Fehler-Routine ausführen. Wenn der Status-Code der erwartete ist, muss wieder ein spezieller Wert in das TWCR geschrieben werden, der die Hardware veranlasst, eine STOPP Bedingung zu übertragen. Welcher Wert genommen werden muss, wird später beschrieben. Wichtig ist, dass das TWINT Bit mit dem Schreiben des Wertes gesetzt wird. Das Schreiben einer 1 in das TWINT löscht dieses Flag. Das TWI startet keine Operation, solange das TWINT im TWCR gesetzt ist. Unmittelbar nachdem die Applikation das TWINT gelöscht hat, wird das TWI mit dem Aussenden der STOPP Bedingung beginnen. Man beachte, dass das TWINT Flag nach dem Senden einer STOPP Bedingung nicht gesetzt wird.
Auch wenn dieses Beispiel einfach ist, zeigt es den vollständigen Vorgang einer Übertragung, die zusammengefasst wie folgt abläuft:
  • Wenn das TWI eine Operation ausgeführt hat und eine Reaktion des Applikation erforderlich ist, wird das TWINT Flag gesetzt. Die SCL Leitung wird auf Low gehalten, bis das TWINT Flag gelöscht wird.
  • Wenn das TWINT Flag gesetzt ist, muss der User alle TWI Register mit den Werten laden, die für den nächsten TWI Bus Zyklus notwendig sind. Zum Beispiel muss das TWDR mit dem Wert geladen werden, der im nächsten Zyklus gesendet werden soll.
  • Nachdem alle TWI Register mit den neuen Werten beschrieben sind und alle anderen Aufgaben der Applikationssoftware erledigt sind, wird das TWCR beschrieben. Beim Beschreiben des TWCR muss das TWINT-Bit gesetzt sein. Das Schreiben einer 1 in das TWINT löscht dieses Flag, wodurch die TWI veranlasst wird, die Operation auszuführen, die im TWCR eingestellt ist.
Nachfolgend wird ein Assembler und C Beispiel für den Ablauf gegeben. Man beachte, dass der nachfolgende Code voraussetzt, dass vorher einige Definitionen durchgeführt wurden, z.B. durch Verwenden eines include-Files.

Assembler-Beispiel C-Beispiel Anmerkungen
1
 ldi  r16,(1<<TWINT)\
       | (1<<TWSTA)\
       | (1<<TWEN)
 out  TWCR, r16

TWCR = (1<<TWINT)
      |(1<<TWSTA)
      |(1<<TWEN);
Sende Start-Bedingung
2
wait1:
 in   r16,TWCR
 sbrs r16,TWINT
 rjmp wait1

while (!(TWCR &
  (1<<TWINT)));
Warte bis TWINT-Bit gesetzt. Dann wurde die Startbedingung gesendet.
3
 in   r16,TWSR
 andi r16,0xF8
 cpi  r16,START
 brne FEHLER

if ((TWSR & 0xF8)
  != START)
    FEHLER();
Prüfe Inhalt des TWI-Statusregisters ohne die Vorteiler-Bits. Wenn nicht START dann FEHLER
 ldi  r16,SLA_W
 out  TWDR,r16
 ldi  r16,(1<<TWINT)\
        | (1<<TWEN)
 out  TWCR, r16

TWDR = SLA_W;
TWCR = (1<<TWINT)
     | (1<<TWEN);
Lade SLA_W ins TWDR-Register. Lösche das TWINT-Bit im TWCR zum Absenden der Adresse
4
wait2:
 in   r16,TWCR
 sbrs r16,TWINT
 rjmp wait2

while (!(TWCR &
  (1<<TWINT)));
Warte bis TWINT-Bit gesetzt. Dann wurde SLA+W abgesendet, und ACK oder NACK wurde empfangen.
5
 in   r16,TWSR
 andi r16,0xF8
 cpi  r16,MT_SLA_ACK
 brne FEHLER

if ((TWSR & 0xF8)
  != MT_SLA_ACK)
    FEHLER();
Prüfe Inhalt des TWI-Statusregisters ohne die Vorteiler-Bits. Wenn nicht MT_SLA_ACK dann FEHLER
 ldi r16,DATA
 out TWDR,r16
 ldi r16,(1<<TWINT)\
       | (1<<TWEN)
 out TWCR,r16

TWDR = DATA;
TWCR = (1<<TWINT)
     | (1<<TWEN);
Lade Daten ins TWDR-Register. Lösche das TWINT-Bit im TWCR zum Absenden
6
wait3:
 in   r16,TWCR
 sbrs r16,TWINT
 rjmp wait3

while (!(TWCR &
  (1<<TWINT)));
Warte bis TWINT-Bit gesetzt. Dann sind die Daten abgesendet und ACK oder NACK empfangen worden.
7
 in   r16,TWSR
 andi r16,0xF8
 cpi  r16,MT_DATA_ACK
 brne FEHLER

if ((TWSR & 0xF8)
  != MT_DATA_ACK)
    FEHLER();
Prüfe Inhalt des TWI-Statusregisters ohne die Vorteiler-Bits. Wenn nicht MT_DATA_ACK dann FEHLER
 ldi  r16,(1<<TWINT)\
        | (1<<TWEN)\
        | (1<<TWSTO)
 out  TWCR, r16

TWCR = (1<<TWINT)
     | (1<<TWEN)
     | (1<<TWSTO);
Sende Stopp-Bedingung

22.7 Übertragungsmodi

Das TWI kann in vier verschiedenen Modi arbeiten. Diese werden als Master Transmitter (MT), Master Receiver (MR), Slave Transmitter (ST) und Slave Receiver (SR) bezeichnet. Verschiedene dieser Modi können in einer Applikation verwendet werden. Zum Beispiel kann der MT Modus verwendet werden, um Daten in ein TWI EEPROM zu schreiben und der MR um diese wieder auszulesen. Wenn weitere Master im System vorhanden sind, können von diesen Daten empfangen werden, wenn der SR Modus verwendet wird. Die Applikationssoftware entscheidet, welcher der Modi möglich ist.

Nachfolgend werden alle Modi beschrieben. Die möglichen Statuscodes sind in jedem Bild angegeben, die die Übertragung im Detail darstellen. In den Bildern werden folgende Abkürzungen verwendet:

S: START Bedingung
Rs: Wiederholte START Bedingung
R: Read Bit, Bit lesen (High Pegel auf SDA)
W: Write Bit, Bit schreiben (Low Pegel auf SDA)
A: Acknowledge Bit (Low Pegel auf SDA)
A: Not Acknowledge Bit (High Pegel auf SDA)
Data: 8-bit Datenbyte
P: STOPP Bedingung
SLA: Slave Adresse
Die Kreise in den Bildern kennzeichnen, wann das TWINT Flag gesetzt wird. Die Zahlen in den Kreisen zeigen den Statuscode an, der im TWSR steht, wobei die Vorteilerbits mit 0 maskiert sind. An diesen Stellen muss die Applikationssoftware eine Aktion ausführen, um die Übertragung fortzusetzen oder zu beenden. Die TWI Übertragung ist unterbrochen, bis das TWINT Flag durch die Software gelöscht wird.

Wenn das TWINT Flag gesetzt ist, bestimmt der Statuscode im TWSR, welche Aktion die Applikation als nächstes ausführen muss. Für jeden Statuscode sind die erforderlichen Aktionen und Details der folgenden seriellen Übertragung in den Tabellen angegeben. Auch in den Tabellen sind die Vorteilerbits mit 0 maskiert.

22.7.1 Master-Senden

Im Master Sende Modus wird eine Anzahl von Bytes an einen Slave Empfänger übertragen. Um in den Master Sende Modus zu gelangen, wird eine START Bedingung ausgesendet. Das Format des darauf folgenden Adresspaketes bestimmt, ob der Master Sende- oder der Master- Empfangs Modus ausgewählt wird. Wenn ein SLA+W Adresspaket ausgegeben wird, wird der Master Sende Modus ausgewählt, wenn ein SLA+R Adresspaket ausgegeben wird, erfolgt der Eintritt in den Master Empfangs Modus. Alle Statuscodes, die nachfolgend angegeben sind, unterstellen, dass die Vorteilerbits mit 0 maskiert sind.
Master Sende Modus
Eine START-Bedingung wird gesendet, wenn folgender Wert in das TWCR geschrieben wird.

TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | - | TWIE
Wert | 1 | X | 1 | 0 | X | 1 | 0 | X

TWEN muss gesetzt werden, um das TWI freizugeben. TWSTA muss auf eins gesetzt werden, um eine START Bedingung zu senden und TWINT muss mit einer 1 beschrieben werden, um das TWINT Flag zu löschen. Das TWI wird dann den TWI Bus überprüfen und eine START Bedingung senden, sobald der Bus frei wird. Nach dem Senden der START Bedingung wird das TWINT Flag durch die Hardware gesetzt und der Statuscode im TWSR wird auf 08h gesetzt. Um dann den Master Sende Modus zu aktivieren, muss anschließend ein SAL+W Adresspaket gesendet werden. Dies wird gemacht, indem eine SLA+W in das TWDR geschrieben wird. Anschließend muss das TWINT Bit gelöscht werden, indem eine 1 hineingeschrieben wird, um die Übertragung fortzusetzen. Es muss also folgender Wert in das TWCR geschrieben werden, um die Übertragung fortzusetzen.

TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | - | TWIE
Wert | 1 | X | 0 | 0 | X | 1 | 0 | X

Wenn das SLA+W Adresspaket gesendet und eine Bestätigung (ACK) empfangen wurde, so wird das TWINT Flag wieder gesetzt und der Stauscode im TWSR aktualisiert. Mögliche Statuscodes im Master Modus sind 18h, 20h oder 38h. Wie bei den unterschiedlichen Statuscodes weiter verfahren wird, ist in der Tabelle angegeben.

Wenn ein SLA+W Adresspaket erfolgreich gesendet wurde, kann als nächstes ein Datenpaket gesendet werden. Das Datenbyte wird dafür in das TWDR geschrieben. Das TWDR darf nur beschrieben werden, wenn das TWINT auf High ist. Andernfalls wird der Zugriff verworfen und das Schreibkollisions- (TWWC) Bit im TWCR Register gesetzt. Nach dem Aktualisieren des TWDR muss das TWINT Bit gelöscht werden (durch Beschreiben mit einer 1) um die Übertragung fortzusetzen. Es muss also folgender Wert in das TWCR geschrieben werden.

TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | - | TWIE
Wert | 1 | X | 0 | 0 | X | 1 | 0 | X

Dieser Vorgang wird wiederholt, bis das letzte Datenbyte gesendet ist und die Übertragung durch eine STOPP Bedingung oder eine Wiederholte START Bedingung beendet wird. Eine STOPP Bedingung wird erzeugt, indem folgender Wert in das TWCR geschrieben wird.

TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | - | TWIE
Wert | 1 | X | 0 | 1 | X | 1 | 0 | X

Eine Wiederholte START Bedingung wird erzeugt, indem folgender Wert in das TWCR geschrieben wird.

TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | - | TWIE
Wert | 1 | X | 1 | 0 | X | 1 | 0 | X

Statuskodes für Master-Senden
Status Code(TWSR); Prescaler Bits are 0 | Status of the 2-wire Serial Bus and 2-wire Serial Interface Hardware | Application Software Response |  |  |  |  | Next Action Taken by TWI Hardware
 |  | To/from TWDR | To TWCR
 |  |  | STA | STO | TWINT | TWEA
0x08 | A START condition has been transmitted | Load SLA+W | 0 | 0 | 1 | X | SLA+W will be transmitted; ACK or NOT ACK will be received
0x10 | A repeated START condition has been transmitted | Load SLA+W | 0 | 0 | 1 | X | SLA+W will be transmitted; ACK or NOT ACK will be received
 |  | Load SLA+R | 0 | 0 | 1 | X | SLA+R will be transmitted; Logic will switch to Master Receiver mode
0x18 | SLA+W has been transmitted; ACK has been received | Load data byte | 0 | 0 | 1 | X | Data byte will be transmitted and ACK or NOT ACK will be received
 |  | No TWDR action | 1 | 0 | 1 | X | Repeated START will be transmitted
 |  | No TWDR action | 0 | 1 | 1 | X | STOP condition will be transmitted and TWSTO Flag will be reset
 |  | No TWDR action | 1 | 1 | 1 | X | STOP condition followed by a START condition will be transmitted and TWSTO Flag will be reset
0x20 | SLA+W has been transmitted; NOT ACK has been received | Load data byte | 0 | 0 | 1 | X | Data byte will be transmitted and ACK or NOT ACK will be received
 |  | No TWDR action | 1 | 0 | 1 | X | Repeated START will be transmitted
 |  | No TWDR action | 0 | 1 | 1 | X | STOP condition will be transmitted and TWSTO Flag will be reset
 |  | No TWDR action | 1 | 1 | 1 | X | STOP condition followed by a START condition will be transmitted and TWSTO Flag will be reset
0x28 | Data byte has been transmitted; ACK has been received | Load data byte | 0 | 0 | 1 | X | Data byte will be transmitted and ACK or NOT ACK will be received
 |  | No TWDR action | 1 | 0 | 1 | X | Repeated START will be transmitted
 |  | No TWDR action | 0 | 1 | 1 | X | STOP condition will be transmitted and TWSTO Flag will be reset
 |  | No TWDR action | 1 | 1 | 1 | X | STOP condition followed by a START condition will be transmitted and TWSTO Flag will be reset
0x30 | Data byte has been transmitted; NOT ACK has been received | Load data byte | 0 | 0 | 1 | X | Data byte will be transmitted and ACK or NOT ACK will be received
 |  | No TWDR action | 1 | 0 | 1 | X | Repeated START will be transmitted
 |  | No TWDR action | 0 | 1 | 1 | X | STOP condition will be transmitted and TWSTO Flag will be reset
 |  | No TWDR action | 1 | 1 | 1 | X | STOP condition followed by a START condition will be transmitted and TWSTO Flag will be reset
0x38 | Arbitration lost in SLA+W or data bytes | No TWDR action | 0 | 0 | 1 | X | 2-wire Serial Bus will be released and not addressed Slave mode entered
 |  | No TWDR action | 1 | 0 | 1 | X | A START condition will be transmitted when the bus becomes free
Master senden Format

22.7.2 Master-Empfang

Im Master Empfänger Modus wird eine Anzahl von Bytes von einem Slave Sender empfangen. Um in den Master Empfänger Modus zu gelangen, wird eine START Bedingung ausgesendet. Das Format des darauf folgenden Adresspaketes bestimmt, ob der Master Sende oder Master Empfangs Modus ausgewählt wird. Wenn ein SLA+W Adresspaket ausgegeben wird, wird der Master Sende Modus ausgewählt, wenn ein SLA+R Adresspaket ausgegeben wird, erfolgt der Eintritt in den Master Empfangs Modus. Alle Statuscodes, die nachfolgend angegeben sind, unterstellen, dass die Vorteilerbits mit 0 maskiert sind.
Master Empfänger Modus
Eine START Bedingung wird gesendet, wenn folgender Wert in das TWCR geschrieben wird.

TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | - | TWIE
Wert | 1 | X | 1 | 0 | X | 1 | 0 | X

TWEN muss gesetzt werden, um das TWI freizugeben. TWSTA muss auf eins gesetzt werden, um eine START Bedingung zu senden und TWINT muss mit einer 1 beschrieben werden, um das TWINT Flag zu löschen. Das TWI wird dann den TWI Bus überprüfen und eine START Bedingung senden, sobald der Bus frei wird. Nach dem Senden der START Bedingung wird das TWINT Flag durch die Hardware gesetzt und der Statuscode im TWSR wird auf 08h gesetzt. Um dann den Master Empfänger Modus zu aktivieren, muss anschließend ein SAL+R Adresspaket gesendet werden. Dies wird gemacht, indem eine SLA+R in das TWDR geschrieben wird. Anschließend muss das TWINT Bit gelöscht werden, indem eine 1 hineingeschrieben wird, um die Übertragung fortzusetzen. Es muss also folgender Wert in das TWCR geschrieben werden, um die Übertragung fortzusetzen.

TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | - | TWIE
Wert | 1 | X | 0 | 0 | X | 1 | 0 | X

Wenn das SLA+R Adresspaket gesendet und eine Bestätigung (ACK) empfangen wurde, so wird das TWINT Flag wieder gesetzt und der Stauscode im TWSR aktualisiert. Mögliche Statuscodes in diesem Master Modus sind 38h, 40h oder 48h. Wie bei den unterschiedlichen Statuscodes weiter verfahren wird, ist in der Tabelle angegeben.

Die empfangenen Daten können aus dem TWDR Register ausgelesen werden, wenn das TWINT Flag durch die Hardware auf High gesetzt wird.
Dieser Vorgang wird wiederholt, bis das letzte Datenbyte empfangen ist. Danach muss der Master Empfänger den Slave Sender durch Senden einer Nichtbestätigung (NACK) darüber informieren, dass der Datenempfang nun abgeschlossen werden kann. Die Übertragung wird dann beendet, indem eine STOPP Bedingung oder eine Wiederholte START Bedingung erzeugt wird.

Eine STOPP Bedingung wird erzeugt, indem folgender Wert in das TWCR geschrieben wird.

TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | - | TWIE
Wert | 1 | X | 0 | 1 | X | 1 | 0 | X

Eine Wiederholte START Bedingung wird erzeugt, indem folgender Wert in das TWCR geschrieben wird.

TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | - | TWIE
Wert | 1 | X | 1 | 0 | X | 1 | 0 | X

Nach einer Wiederholten START Bedingung (Status 10h) kann das TWI erneut auf den selben Slave zugreifen oder auf einen anderen Slave, ohne eine STOPP Bedingung auszusenden. Eine erneute START-Bedingung ermöglicht das Umschalten zwischen verschiedenen Slaves oder Master Empfänger und Sender Modus, ohne die Kontrolle über den Bus zu verlieren.

Statuskodes für Master-Empfang
Status Code(TWSR); Prescaler Bits are 0 | Status of the 2-wire Serial Bus and 2-wire Serial Interface Hardware | Application Software Response |  |  |  |  | Next Action Taken by TWI Hardware
 |  | To/from TWDR | To TWCR
 |  |  | STA | STO | TWINT | TWEA
0x08 | A START condition has been transmitted | Load SLA+R | 0 | 0 | 1 | X | SLA+R will be transmitted ACK or NOT ACK will be received
0x10 | A repeated START condition has been transmitted | Load SLA+R | 0 | 0 | 1 | X | SLA+R will be transmitted ACK or NOT ACK will be received
 |  | Load SLA+W | 0 | 0 | 1 | X | SLA+W will be transmitted Logic will switch to Master Transmitter mode
0x38 | Arbitration lost in SLA+R or NOT ACK bit | No TWDR action | 0 | 0 | 1 | X | 2-wire Serial Bus will be released and not addressed Slave mode will be entered
 |  | No TWDR action | 1 | 0 | 1 | X | A START condition will be transmitted when the bus becomes free
0x40 | SLA+R has been transmitted; ACK has been received | No TWDR action | 0 | 0 | 1 | 0 | Data byte will be received and NOT ACK will be returned
 |  | No TWDR action | 0 | 0 | 1 | 1 | Data byte will be received and ACK will be returned
0x48 | SLA+R has been transmitted; NOT ACK has been received | No TWDR action | 1 | 0 | 1 | X | Repeated START will be transmitted
 |  | No TWDR action | 0 | 1 | 1 | X | STOP condition will be transmitted and TWSTO Flag will be reset
 |  | No TWDR action | 1 | 1 | 1 | X | STOP condition followed by a START condition will be transmitted and TWSTO Flag will be reset
0x50 | Data byte has been received; ACK has been returned | Read data byte | 0 | 0 | 1 | 0 | Data byte will be received and NOT ACK will be returned
 |  | Read data byte | 0 | 0 | 1 | 1 | Data byte will be received and ACK will be returned
0x58 | Data byte has been received; NOT ACK has been returned | Read data byte | 1 | 0 | 1 | X | Repeated START will be transmitted
 |  | Read data byte | 0 | 1 | 1 | X | STOP condition will be transmitted and TWSTO Flag will be reset
 |  | Read data byte | 1 | 1 | 1 | X | STOP condition followed by a START condition will be transmitted and TWSTO Flag will be reset
Master Empfang Formate

22.7.3 Slave-Empfang

Im Slave Empfänger Modus werden eine Anzahl von Bytes von einem Master Sender empfangen. Alle Statuscodes die nachfolgend verwendet werden, untsertellen, dass die Vorteilerbits mit 0 maskiert sind.
Slave Empfänger Modus
Um den Slave Empfänger Modus einzuschalten, müssen das TWAR und TWCR wie folgt initialisiert werden.

TWAR | TWA6 | TWA5 | TWA4 | TWA3 | TWA2 | TWA1 | TWA0 | TWGCE
Wert | Chip-interne Slave-Adresse |  |  |  |  |  |  |

Die oberen 7 Bits bilden die Adresse, über die das TWI durch einen anderen Master angesprochen werden kann. Wenn das TWGCE Bit gesetzt ist, wird der Baustein auch durch einen Rundruf angesprochen, andernfalls ignoriert er Rundrufe.

TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | - | TWIE
Wert | 0 | 1 | 0 | 0 | 0 | 1 | 0 | X

TWEN muss auf 1 gesetzt werden, um das TWI freizugeben. Das TWEA Bit muss auf eins gesetzt werden, um das Bestätigen der eigenen Salve-Adresse oder eines Rundrufes freizugeben. TWSTA und TWSTO müssen auf 0 gesetzt werden.

Wenn TWAR und TWCR initialisiert sind, wartet das TWI bis es durch die eigene Salve Adresse (oder einen Rundruf, wenn freigegeben) gefolgt von dem Datenrichtigs Bit adressiert wurde. Wenn das Richtungsbit 0 ist (Write), arbeitet das TWI im Slave Empfänger Modus, andernfalls wird der Slave Sender Modus eingeschaltet. Nachdem die eigene Slave Adresse und das Write Bit empfangen wurden, wird das TWINT Flag gesetzt und ein gültiger Statuscode kann aus dem TWSR gelesen werden. Der Statuscode wird verwendet, um die folgende Aktion der Software zu bestimmen. Die möglichen Aktionen der Software sind für die unterschiedlichen Statuscodes in der nachfolgenden Tabelle beschrieben. Der Slave Empfänger Modus wird auch eingeschaltet, wenn der Baustein das Schiedsgericht im Mastermodus verloren hat (siehe Status 68h und 78h).

Wenn das TWEA während einer Übertragung gelöscht wird, wird das TWI eine Nichtbestätigung (NACK) auf der SDA Leitung zurückgeben, nachdem das nächste Datenbyte empfangen wurde. Dies kann dazu benutzt werden, um zu signalisieren, dass der Slave keine weiteren Daten mehr empfangen kann. Während TWEA auf Null ist, wird das TWI die eigene Slave Adresse nicht bestätigen. Der TWI Bus wird aber weiterhin überwacht, so dass der Adressvergleich jederzeit durch Setzen des TWEA Bits wieder eingeschaltet werden kann. Das bedeutet, dass das TWEA Bit dazu verwendet werden kann, das TWI vorübergehend vom Bus zu isolieren.

In allen Sleep Modi außer dem Idle Modus wird das Taktsystem des TWI ausgeschaltet. Wenn das TWEA Bit gesetzt ist, kann der Baustein weiterhin seine eigene Slave Adresse oder einen Rundruf bestätigen, indem er den Takt des TWI-Busses als Taktquelle verwendet. Der Baustein wird dann aufwachen und das TWI hält die SCL Leitung so lange auf Low, bis das Auwachen abgeschlossen ist und das TWINT Flag gelöscht wird (durch Beschreiben mit einer 1). Der weitere Datenempfang verwendet dann wieder die normalen AVR Takte. Man beachte, dass, wenn der AVR auf eine lange Aufwachzeit eingestellt ist, die SCL Leitung ebenfalls lange auf Low gehalten wird und dadurch andere Datenübertragungen blockiert werden.

Man beachte, dass das TWDR nach dem Aufwachen aus dem Sleep Modus nicht das letzte Byte enthält, das auf dem Bus präsent war.

Statuskodes für Slave-Empfang
Status Code(TWSR); Prescaler Bits are 0 | Status of the 2-wire Serial Bus and 2-wire Serial Interface Hardware | Application Software Response | Next Action Taken by TWI Hardware
To/from TWDR | To TWCR
STA | STO | TWINT | TWEA
0x60 Own SLA+W has been received;
ACK has been returned 		No TWDR action X010 Data byte will be received and NOT ACK will be returned
No TWDR action | X | 0 | 1 | 1 | Data byte will be received and ACK will be returned
0x68 | Arbitration lost in SLA+R/W as Master; own SLA+W has been received; ACK has been returned | No TWDR action | X | 0 | 1 | 0 | Data byte will be received and NOT ACK will be returned
No TWDR action | X | 0 | 1 | 1 | Data byte will be received and ACK will be returned
0x70 | General call address has been received; ACK has been returned | No TWDR action | X | 0 | 1 | 0 | Data byte will be received and NOT ACK will be returned
No TWDR action | X | 0 | 1 | 0 | Data byte will be received and ACK will be returned
0x78 | Arbitration lost in SLA+R/W as Master; General call address has been received; ACK has been returned | No TWDR action | X | 0 | 1 | 0 | Data byte will be received and NOT ACK will be returned
No TWDR action | X | 0 | 1 | 1 | Data byte will be received and ACK will be returned
0x80 Previously addressed with own SLA+W; data has been received;
ACK has been returned 		Read data byte X010 Data byte will be received and NOT ACK will be returned
Read data byte | X | 0 | 1 | 1 | Data byte will be received and ACK will be returned
0x88 Previously addressed with own SLA+W; data has been received;
NOT ACK has been returned 		Read data byte 0010 Switched to the not addressed Slave mode;
no recognition of own SLA or GCA
Read data byte 0011 Switched to the not addressed Slave mode;
own SLA will be recognized;
GCA will be recognized if TWGCE = “1”
Read data byte 1010 Switched to the not addressed Slave mode;
no recognition of own SLA or GCA;
a START condition will be transmitted when the bus becomes free
Read data byte 1011 Switched to the not addressed Slave mode;
own SLA will be recognized;
GCA will be recognized if TWGCE = “1”;
a START condition will be transmitted when the bus becomes free
0x90 | Previously addressed with general call; data has been received; ACK has been returned | Read data byte | X | 0 | 1 | 0 | Data byte will be received and NOT ACK will be returned
Read data byte | X | 0 | 1 | 1 | Data byte will be received and ACK will be returned
0x98 Previously addressed with general call; data has been received; NOT ACK has been returned Read data byte 0010 Switched to the not addressed Slave mode;
no recognition of own SLA or GCA
Read data byte 0011 Switched to the not addressed Slave mode;
own SLA will be recognized;
GCA will be recognized if TWGCE = “1”
Read data byte 1010 Switched to the not addressed Slave mode;
no recognition of own SLA or GCA;
a START condition will be transmitted when the bus becomes free
Read data byte 1011 Switched to the not addressed Slave mode;
own SLA will be recognized;
GCA will be recognized if TWGCE = “1”;
a START condition will be transmitted when the bus becomes free
0xA0 A STOP condition or repeated START condition has been received while still addressed as Slave No action 0010 Switched to the not addressed Slave mode;
no recognition of own SLA or GCA
0011 Switched to the not addressed Slave mode;
own SLA will be recognized;
GCA will be recognized if TWGCE = “1”
1010 Switched to the not addressed Slave mode;
no recognition of own SLA or GCA;
a START condition will be transmitted when the bus becomes free
1011 Switched to the not addressed Slave mode;
own SLA will be recognized;
GCA will be recognized if TWGCE = “1”;
a START condition will be transmitted when the bus becomes free
Formate und Zustände bei Slave-Empfang

22.7.4 Slave-Senden

Im Slave Sender Modus werden eine Anzahl von Datenbytes an den Master Empfänger gesendet. Alle Statuscodes die nachfolgend verwendet werden, unterstellen, dass die Vorteilerbits mit 0 maskiert sind.
Slave Sender Modus
Um den Slave Sender Modus einzuschalten, müssen das TWAR und TWCR wie folgt initialisiert werden.

TWAR | TWA6 | TWA5 | TWA4 | TWA3 | TWA2 | TWA1 | TWA0 | TWGCE
Wert | Chip-interne Slave-Adresse |  |  |  |  |  |  |

Die oberen 7 Bits bilden die Adresse, über die das TWI durch einen anderen Master angesprochen werden kann. Wenn das TWGCE Bit gesetzt ist, wird der Baustein auch durch einen Rundruf angesprochen, andernfalls ignoriert er Rundrufe.

TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | - | TWIE
Wert | 0 | 1 | 0 | 0 | 0 | 1 | 0 | X

TWEN muss auf 1 gesetzt werden, um das TWI freizugeben. Das TWEA Bit muss auf eins gesetzt werden, um das Bestätigen der eigenen Salve-Adresse oder eines Rundrufes freizugeben. TWSTA und TWSTO müssen auf 0 gesetzt werden.

Wenn TWAR und TWCR initialisiert sind, wartet das TWI bis es durch die eigene Salve Adresse (oder einen Rundruf, wenn freigegeben) gefolgt von dem Datenrichtigs Bit adressiert wurde. Wenn das Richtungsbit 1 ist (Read), arbeitet das TWI im Slave Sender Modus, andernfalls wird der Slave Empfänger Modus eingeschaltet. Nachdem die eigene Slave Adresse und das Read Bit empfangen wurden, wird das TWINT Flag gesetzt und ein gültiger Statuscode kann aus dem TWSR gelesen werden. Der Statuscode wird verwendet, um die folgende Aktion der Software zu bestimmen. Die möglichen Aktionen der Software sind für die unterschiedlichen Statuscodes in der nachfolgenden Tabelle beschrieben. Der Slave Sender Modus kann auch eingeschaltet werden, wenn der Baustein das Schiedsgericht im Mastermodus verloren hat (siehe Status B0h).

Wenn das TWEA während einer Übertragung gelöscht wird, wird das letzte Byte der Übertragung übertragen. Danach treten die Statuscodes C0h oder C8h auf, abhängig davon, ob der Master Empfänger das letzte Byte mit einem NACK oder ACK bestätigt. Das TWI schaltet in den nicht adressierten Slave Modus um und ignoriert den Master, falls dieser die Übertragung weiter fortsetzen will. Daher empfängt der Master alle seriellen Daten als 1. Status C8h wird eingeschaltet wenn der Master weitere Daten abruft (durch Senden eines ACK) auch wenn der Slave das letzte Byte gesendet hat (TWEA null und erwartetem NACK vom Master).

Während TWEA auf Null ist, wird das TWI die eigene Slave Adresse nicht bestätigen. Der TWI Bus wird aber weiterhin überwacht, so dass der Adressvergleich jederzeit durch Setzen des TWEA Bits wieder eingeschaltet werden kann. Das bedeutet, dass das TWEA Bit dazu verwendet werden kann, das TWI vorübergehend vom Bus zu isolieren.

In allen Sleep Modi außer dem Idle Modus wird das Taktsystem des TWI ausgeschaltet. Wenn das TWEA Bit gesetzt ist, kann der Baustein weiterhin seine eigene Slave Adresse oder einen Rundruf bestätigen, indem er den Takt des TWI-Busses als Taktquelle verwendet. Der Baustein wird dann aufwachen und das TWI hält die SCL Leitung so lange auf Low, bis das Aufwachen abgeschlossen ist und das TWINT Flag gelöscht wird (durch Beschreiben mit einer 1). Der weitere Datenempfang verwendet dann wieder die normalen AVR Takte. Man beachte, dass, wenn der AVR auf eine lange Aufwachzeit eingestellt ist, die SCL Leitung ebenfalls lange auf Low gehalten wird und dadurch andere Datenübertragungen blockiert werden.

Man beachte, dass das TWDR nach dem Aufwachen aus dem Sleep Modus nicht das letzte Byte enthält, das auf dem Bus präsent war.

Statuskodes für Slave-Senden
Status Code(TWSR); Prescaler Bits are 0 | Status of the 2-wire Serial Bus and 2-wire Serial Interface Hardware | Application Software Response | Next Action Taken by TWI Hardware
To/from TWDR | To TWCR
STA | STO | TWINT | TWEA
0xA8 | Own SLA+R has been received; ACK has been returned | Load data byte | X | 0 | 1 | 0 | Last data byte will be transmitted and NOT ACK should be received
Load data byte | X | 0 | 1 | 1 | Data byte will be transmitted and ACK should be received
0xB0 | Arbitration lost in SLA+R/W as Master; own SLA+R has been received; ACK has been returned | Load data byte | X | 0 | 1 | 0 | Last data byte will be transmitted and NOT ACK should be received
Load data byte | X | 0 | 1 | 1 | Data byte will be transmitted and ACK should be received
0xB8 | Data byte in TWDR has been transmitted; ACK has been received | Load data byte | X | 0 | 1 | 0 | Last data byte will be transmitted and NOT ACK should be received
Load data byte | X | 0 | 1 | 1 | Data byte will be transmitted and ACK should be received
0xC0 Data byte in TWDR has been transmitted; NOT ACK has been received No TWDR action 0010 Switched to the not addressed Slave mode;
no recognition of own SLA or GCA
No TWDR action 0011 Switched to the not addressed Slave mode;
own SLA will be recognized;
GCA will be recognized if TWGCE = “1”
No TWDR action 1010 Switched to the not addressed Slave mode;
no recognition of own SLA or GCA;
a START condition will be transmitted when the bus becomes free
No TWDR action 1011 Switched to the not addressed Slave mode;
own SLA will be recognized;
GCA will be recognized if TWGCE = “1”;
a START condition will be transmitted when the bus becomes free
0xC8 Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received No TWDR action 0010 Switched to the not addressed Slave mode;
no recognition of own SLA or GCA
No TWDR action 0011 Switched to the not addressed Slave mode;
own SLA will be recognized;
GCA will be recognized if TWGCE = “1”
No TWDR action 1010 Switched to the not addressed Slave mode;
no recognition of own SLA or GCA;
a START condition will be transmitted when the bus becomes free
No TWDR action 1011 Switched to the not addressed Slave mode;
own SLA will be recognized;
GCA will be recognized if TWGCE = “1”;
a START condition will be transmitted when the bus becomes free
Formate und Zustände beim Slave-Senden

22.7.5 Sonstige Zustände

Es gibt zwei Stati, die nicht mit einem definierten Zustand des TWI korrespondiern.

Status F8h zeigt an, dass keine relevanten Informationen vorliegen, weil das TWINT Flag nicht gesetzt ist. Dies tritt zwischen anderen Stati auf und wenn der TWI nicht an der seriellen Übertragung beteiligt ist.

Status 00h zeigt an, dass ein Busfehler während einer TWI Übertragung aufgetreten ist. Ein Busfehler tritt auf, wenn eine START oder STOPP Bedingung an einer ungültigen Position in dem Frameformat auftritt. Beispiele für solche ungültigen Positionen sind während des seriellen Übertragens eines Adresspaketes, eines Datenbytes oder Bestätigungs Bits. Wenn ein Busfehler auftritt, wird TWINT gesetzt. Um den Busfehler wieder zu beseitigen, muss das TWSTO Flag gesetzt und das TWINT Flag durch Beschreiben mit einer 1 gelöscht werden. Dies zwingt das TWI in den Modus eines nicht adressierten Slaves und löscht das TWSTO Flag, andere Bits im TWCR werden nicht beeinflusst. Die SDA und SCL Leitung werden freigegeben allerdings wird keine STOPP Bedingung gesendet.

Sonstige Zustände
Status Code(TWSR); Prescaler Bits are 0 | Status of the 2-wire Serial Bus and 2-wire Serial Interface Hardware | Application Software Response |  |  |  |  | Next Action Taken by TWI Hardware
 |  | To/from TWDR | To TWCR
 |  |  | STA | STO | TWINT | TWEA
0xF8 | No relevant state information available; TWINT = “0” | No TWDR action | No TWCR action |  |  |  | Wait or proceed current transfer
0x00 | Bus error due to an illegal START or STOP condition | No TWDR action | 0 | 1 | 1 | X | Only the internal hardware is affected, no STOP condition is sent on the bus. In all cases, the bus is released and TWSTO is cleared.

22.7.6 Kombination diverser TWI-Modi

In einigen Fällen müssen verschiedene TWI Modes kombiniert werden, um die gewünschte Aktion auszuführen. Dies kann z.B. beim Lesen eines seriellen EEPROMs der Fall sein. Gewöhnlich läuft ein solcher Transfer wie folgt ab:
  1. Übertragung initialisieren
  2. Dem EEPROM mitteilen, von welcher Speicherzelle gelesen werden soll
  3. Lesen der Speicherzelle
  4. Beenden der Übertragung
In diesem Fall werden also Daten vom Master zum Slave und vom Slave zum Master übertragen. Um dem Slave mitzuteilen, von welcher Speicherzelle gelesen werden soll, ist der Master Sende Modus erforderlich. Beim Lesen der Daten ist hingegen der Master Empfangs Modus erforderlich. D.h. die Richtung der Datenübertragung muss zwischendurch umgeschaltet werden. Der Master muss während allen Schritten die Kontrolle über den TWI Bus behalten und die Schritte müssen in einer zusammenhängenden Operation durchgeführt werden. In einem System mit mehreren Mastern kann ein anderer Master den Datenzeiger des EEPROM zwischen Schritt 2 und 3 verändern und der erste Master liest die falsche Speicherzelle. Ein Wechsel der Übertragungsrichtung muss also durch eine Wiederholte START Bedingung zwischen dem Senden der Speicheradresse und dem Empfangen der Daten vorgenommen werden. Mit der Wiederholten START Bedingung behält der Master die Kontrolle über den Bus. Die nachfolgende Abbildung zeigt den Vorgang.
Mehrere TWI-Zustände bei Zugriff auf seriellen EEPROM

22.8 Multi-Master Systeme und Schiedsgericht

Wenn mehrere Master an denselben Bus angeschlossen sind, kann eine Übertragung zeitgleich von zwei oder mehreren Mastern begonnen werden. Der TWI Standard stellt sicher, dass solche Situationen so gehandhabt werden, dass nur einem Master erlaubt wird, seine Arbeit fortzusetzen und keine Daten verloren gehen. Ein Beispiel für eine Schiedsgericht-Situation ist nachfolgend beschrieben, in der zwei Master versuchen, Daten an einen Slave Empfänger zu übertragen.
Schiedsgericht-Situation
Folgende Szenarien können während des Schiedsgerichtes auftreten:
  • Beide Master führen eine vollkommen identische Kommunikation mit dem Slave durch. In diesem Fall merkt weder der Slave noch einer von den Mastern etwas von dem gemeinsamen Zugriff auf den Bus.
  • Beide Master adressieren den gleichen Slave aber mit unterschiedlichen Daten- oder Richtungs Bit. In diesem Fall tritt das Schiedsgericht ein, nämlich bei den Read/Write Bit oder in den Datenbits. Der Master, der versucht eine 1 auf SDA auszugeben, während der andere Master eine 0 ausgibt, verliert das Schiedsgericht. Der unterlegene Master wird in den Modus eines nicht adressierten Slaves geschaltet oder wartet, bis der Bus frei ist, um dann eine neue START Bedingung zu senden. Dies hängt von der Software ab.
  • Beide Master adressieren unterschiedliche Salves. In diesem Fall tritt das Schiedsgericht schon bei den SLA Bits auf. Der Master, der versucht eine 1 auf SDA auszugeben, während der andere Master eine 0 ausgibt, verliert das Schiedsgericht. Der unterlegene Master schaltet in den Modus eines nicht adressierten Slaves und überprüft, ob er von dem überlegenen Master adressiert wurde. Wenn er selbst adressiert wurde, so schaltet er anschließend in den Slave Empfangs oder Sende Modus. Wurde der unterlegene Master nicht selber adressiert, so schaltet er in den Modus eines nicht adressierten Slaves oder wartet, bis der Bus frei ist, um dann eine neue START Bedingung zu senden. Dies hängt von der Software ab.
Zusammengefasst sind hier noch einmal die verschiedenen Möglichkeiten aufgezeigt, die Werte der möglichen Statuscodes sind in den Kreisen angegeben.
Statuscodes Schiedsgericht

22.9 Register-Beschreibung

TWBR – TWI-Bitraten-Register

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0xB8) | TWBR7 | TWBR6 | TWBR5 | TWBR4 | TWBR3 | TWBR2 | TWBR1 | TWBR0 | TWBR
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7 bis 0 – TWBRx: TWI Bit Rate Register
Diese Bits wählen den Teilungsfaktor für den Bitratengenerator. Der Bitratengenerator ist ein Frequenzteiler, der im Master-Modus die Frequenz für den SCL-Takt erzeugt.

TWCR — TWI-Kontrollregister

Das TWCR wird verwendet, um die Arbeit des TWI zu kontrollieren. Es wird verwendet, um den TWI freizugeben, um einen Masterzugriff durch Aussenden einer Start-Bedingung zu beginnen, um die Emfangsbestätigung zu erzeugen, um eine Stopp-Bedingung zu erzeugen und um den Takt anzuhalten, während die Daten, die auf den Bus geschrieben werden sollen, in das TWDR Register geschrieben werden. Es zeigt ebenfalls eine Schreibkollision, wenn versucht wird, Daten in das TWDR zu schreiben, während dieses Register nicht ansprechbar ist.

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0xBC) | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | - | TWIE | TWCR
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7– TWINT: TWI Interrupt Flag
Diese Bits wird durch die Hardware gesetzt, wenn das TWI seinen laufenden Job beendet hat und auf eine Antwort der Applikationssoftware wartet. Wenn das I-Bit im SREG und das TWIE-Bit im TWCR gesetzt sind, springt die MCU zu dem TWI Interrupt Vektor. Während das TWINT Flag gesetzt ist, wird der SCL Takt auf Low gehalten. Das TWINT Flag wird nicht automatisch durch die Hardware gelöscht, wenn der Interrupt ausgeführt wird. Das Flag muss vielmehr durch die Software gelöscht werden, indem es mit einer logischen 1 beschrieben wird. Das Löschen des Flags startet die Arbeit des TWI wieder, daher müssen alle Zugriffe auf das TWI Address Register (TWAR), das TWI Status Register (TWSR) und das TWI Data Register (TWDR) vorher abgeschlossen sein.
  • Bit 6– TWEA: TWI Enable Acknowledge Bit
Diese Bits kontrolliert das Erzeugen des Empfangsbestätigungs-Pulses. Wenn das TWEA-Bit mit einer 1 beschrieben ist, so wird ein ACK-Puls erzeugt, wenn eine der folgenden Bedingungen zutrifft:
  1. Die Slaveadresse des Bausteins wurde empfangen
  2. Ein Rundruf wurde empfangen während das TWGCE Bit im TWAR gesetzt war
  3. Ein Datenbyte wurde im Master- oder Slave-Modus empfangen.
Durch Setzen dieses Bits auf Null kann der Baustein vorübergehend virtuell vom Bus getrennt werden. Die Adresserkennung kann dann wieder freigegeben werden, indem das Bit wieder auf 1 gesetzt wird.
  • Bit 5– TWSTA: TWI START Condition Bit
Die Applikation schreibt das TWSTA Bit auf 1, wenn sie Master über den TWI Bus werden will. Die TWI Hardware überprüft, ob der Bus frei ist und erzeugt eine Start-Bedingung, wenn der Bus frei war. Wenn der Bus nicht frei war, wartet die TWI bis eine Stopp-Bedingung erkannt wird, und erzeugt dann eine neue Start-Bedingung, um die Kontrolle über den Bus zu übernehmen. Das TWSTA muss durch die Software gelöscht werden, wenn die Start-Bedingung gesendet wurde.
  • Bit 4– TWSTO: TWI STOP Condition Bit
Wenn das TWSTO Bit im Master Modus auf eins gesetzt wird, wird eine Stopp-Bedingung auf dem TWI-Bus erzeugt. Nach dem Erzeugen der Stopp-Bedingung wird das TWSTO Bit automatisch gelöscht. Im Slave-Modus kann das Setzen des TWSTO Bits verwendet werden, um aus einer Fehlersituation zurückzukehren. Dadurch wird zwar keine Stopp-Bedingung auf dem Bus erzeugt, allerdings kehrt das TWI in einen definierten Zustand zurück.
  • Bit 3– TWWC: TWI Write Collision Flag
Dieses Bit wird gesetzt, wenn versucht wird in das TWI Data Register (TWDA) zu schreiben, während das TWINT Flag Low ist. Das TWWC Flag wird gelöscht, wenn in das TWDA geschrieben wird, während TWINT High ist.
  • Bit 2– TWEN: TWI Enable Bit
Das TWEN Bit gibt das TWI frei und aktiviert das TWI Interface. Wenn das TWIEN Bit auf Eins gesetzt ist, übernimmt das TWI die Kontrolle über die I/O-Pins, die mit SDA und SCL verbunden sind, und gibt die Übertragungsratenverzögerung und die Spitzenfilter frei. Wenn das TWEN Bit auf Null gesetzt wird, wird das TWI ausgeschaltet und alle Übertragungen werden abgebrochen, unabhängig davon, ob diese bereits beendet sind oder nicht.
  • Bit 1 – Res: Reserviertes Bit
Dieses Bit ist reserviert und wird immer als 0 gelesen.
  • Bit 0– TWIE: TWI Interrupt Enable
Wenn dieses Bit auf 1 gesetzt ist und das I-Bit im SREG ebenfalls 1 ist, wird der TWI Interrupt so lange ausgeführt, wie das TWINT Flag High ist.

TWSR – TWI-Statusregister

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0xB9) | TWS7 | TWS6 | TWS5 | TWS4 | TWS3 | - | TWPS1 | TWPS0 | TWSR
Zugriff | R | R | R | R | R | R | R/W | R/W
Startwert | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0
  • Bit 7 bis 3 – TWS: TWI Status
Diese 5 Bits geben den Status der TWI Logik und des TWI Busses wieder. Die verschiedenen Status Kodes werden auf den Seiten weiter hinten beschrieben. Man beachte, dass der Wert, der aus dem TWSR gelesen wird, neben den 5 Status Bits immer auch die 2 Bits des Vorteilers enthält. Die Applikationssoftware muss die unteren 2 Bits also auf Null maskieren, wenn die Statusbits geprüft werden sollen. Dadurch wird die Statusprüfung der Vorteilerbits unabhängig. Diese Vorgehensweise wird auch in diesem Datenblatt unterstellt.
  • Bit 2 – Res: Reserviertes Bit
Dieses Bit ist reserviert und wird immer als 0 gelesen.
  • Bit 1 und 0 – TWPSx: TWI Prescaler Bits
Diese Bits können gelesen und geschrieben werden. Sie bestimmen den Wert des Vorteilers.
TWPS1 | TWPS0 | Wert des Vorteilers
0 | 0 | 1
0 | 1 | 4
1 | 0 | 16
1 | 1 | 64
Die Berechnung der Bitrate ist auf den Seiten zuvor beschrieben.

TWDR – TWI-Datenregister

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0xBB) | TWD7 | TWD6 | TWD5 | TWD4 | TWD3 | TWD2 | TWD1 | TWD0 | TWD
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1
Im Sendemodus enthält das TWDR das nächste Byte, das gesendet wird. Im Empfangsmodus enthält das TWDR das letzte Byte, das empfangen wurde. Das Register ist beschreibbar, solange das TWI nicht mit dem Schieben eines Bytes beschäftigt ist, was durch das Setzen des TWI Interrupt Flag (TWINT) durch die Hardware angezeigt wird. Man beachte, dass das Data Register nicht initialisiert werden kann bevor der erste Interrupt auftritt. Die Daten im TWI bleiben so lange stabil, wie das TWINT gesetzt ist. Während die Daten rausgeschoben werden, werden die Daten auf dem Bus gleichzeitig reingeschoben. Das TWDR enthält immer das letzte Byte, das auf dem Bus präsent war. Außer nach dem Aufwachen aus einem Sleep-Modus durch dem TWI Interrupt. In diesem Fall ist der Inhalt des TWDR unbestimmt. Im Falle eines verlorenen Schiedsgerichtes gehen keine Daten während des Überganges vom Master in den Slave Modus verloren. Das Handhaben des ACK Bits wird durch die TWI Logik automatisch kontrolliert, die CPU kann nicht direkt auf das ACK Bit zugreifen.
  • Bit 7 bis 0 – TWD: TWI Data Register
Diese 8 Bits enthalten das nächste zu sendende Byte oder das letzte empfangene Byte.

TWAR — TWI-Adressregister (Slave)

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0xBA) | TWA6 | TWA5 | TWA4 | TWA3 | TWA2 | TWA1 | TWA0 | TWGCE | TWAR
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1
Die oberen 7 Bits des TWAR können die 7-bit Slave Adresse enthalten, unter der das TWI angesprochen wird, wenn es als Slave Empfänger oder Sender arbeitet. Im Master Modus werden diese Bits nicht benötigt. Im Multi Master Modus muss eine Adresse angegeben werden, damit der Baustein von einem anderen Master als Slave adressiert werden kann.

Das LSB des TWAR wird verwendet, um das Erkennen eines Rundrufes freizugeben. Der verbundene Adressvergleicher überprüft, ob die empfangene Adresse mit der Slave-Adresse (oder der Rundrufadresse) übereinstimmt. Wenn dies der Fall ist, so wird eine Interruptanforderung erzeugt.

  • Bit 7 bis 1 – TWA: TWI Address Register
Diese 7 Bits enthalten die Slaveadresse des Bausteins.
  • Bit 0 – TWGCE: TWI General Call Recognition Enable Bit
Wenn dieses Bit gesetzt ist, ist das Erkennen eines Rundrufes freigegeben.

TWAMR – TWI-Adressmasken-Register (Slave)

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0xBD) | TWAM[6:0] |  |  |  |  |  |  | - | TWAMR
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7 bis 1 – TWAM: TWI Addressmaske
Mit diesen Bits können einzelne Bits beim Adressvergleich via TWAR ausgenommen werden. Ein gesetztes TWAM-Bit deaktiviert den Adressvergleich für das korrespondierende TWA-Bit.
Beispiel: Der Mikrocontroller ist als I²C-Slave auf den Adressen 0x50 (Schreibadresse 0xA0) und 0x58 (Schreibadresse 0xB0) aufweckbar, wenn TWA auf 0xA1 (oder 0xB1) und TWAM auf 0x10 gesetzt wird.
Logik des TWI-Adressvergleichs, Blockschaltbild
  • Bit 0 – reserviert
Dieses Bit sollte Null bleiben.


Der Analogvergleicher

23. Der Analogvergleicher

23.1 Übersicht

Der Analogvergleicher vergleicht die Spannungen am positiven Eingang Pin AIN0 und am negativen Eingang Pin AIN1 miteinander. Wenn die Spannung am positiven Eingang größer als die am negativen Eingang ist, wird der Komparator-Ausgang auf 1 gesetzt. Der Ausgang kann den Zähler-Zeitgeber-Interrupt oder einen eigenen Interrupt triggern, der nur für den Analogvergleicher vorgesehen ist. Der Anwender kann auswählen, ob der Interrupt mit der steigenden oder fallenden Flanke des Komparator-Ausgang oder durch einen Zustandswechsel getriggert wird. Das Blockdiagramm mit der dazugehörigen Logik zeigt das nachfolgende Bild.

Das Leistungsreduktionsbit PRADC, siehe „Leistungsreduktion“, muss deaktiviert werden, um den Multiplexer des A/D-Wandlers zu nutzen.

Bild 23-1: Blockschaltbild des Analogvergleichers(2)
Hinweise:
  1. Siehe Tabelle 23-1
  2. Siehe Bild 1-1 und Tabelle 13-9 für die Pinzuordnung

23.2. Vielfacher Komparator-Eingang

Es ist möglich jeden der ADC7 bis ADC0 Pins als negativen Eingang für den Komparator zu verwenden. Für die Auswahl wird der Multiplexer des A/D-Wandlers (ADU) verwendet, so dass der ADU konsequenterweise ausgeschaltet sein muss, um diese Möglichkeit zu nutzen. Wenn das Analogvergleicher-Multiplex-Bit (ACME im ADCSRB) gesetzt ist und der ADU ausgeschaltet ist (ADEN in ADCSRA ist Null), wählen die MUX2- bis MUX0-Bits im ADMUX-Register den Pin aus, der als negativer Eingang für den Komparator verwendet wird. Wenn ACME gelöscht ist oder ADEN gesetzt ist, wird immer der AIN1-Pin als negativer Eingang für den Komparator verwendet.
Vielfacher Komparator-Eingang
ACME | ADEN | MUX2..0 | Negativer Komparator-Eingang
0 | x | xxx | AIN1
1 | 1 | xxx | AIN1
1 | 0 | 000 | ADC0
1 | 0 | 001 | ADC1
1 | 0 | 010 | ADC2
1 | 0 | 011 | ADC3
1 | 0 | 100 | ADC4
1 | 0 | 101 | ADC5
1 | 0 | 110 | ADC6
1 | 0 | 111 | ADC7

23.3 Registerbeschreibung

23.3.1 ADCSRB – ADC Steuer- und Statusregister B

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x7B) | - | ACME | - | - | - | ADTS2 | ADTS1 | ADTS0 | ADCSRB
Zugriff | R | R/W | R | R | R | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 6 – ACME: Freigabe des Vielfachen Komparator-Eingangs
Wenn dieses Bit logicsch Eins ist und der A/D-Wandler ausgeschaltet ist (ADEN in ADCSRA ist Null), wählt der A/D-Multiplexer den negativen Eingang des Komparators aus. Wenn Null, liegt AIN1 am negativen Eingang an. Eine genaue Beschreibung steht bei Vielfacher Komparator-Eingang.

23.3.2 ACSR — Analogvergleicher: Kontroll- und Statusregister

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x50) | ACD | ACBG | ACO | ACI | ACIE | ACIC | ACIS1 | ACIS0 | ACSR
Zugriff | R/W | R/W | R | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | - | 0 | 0 | 0 | 0 | 0
  • Bit 7 — ACD: Analogvergleicher abschalten
Wenn dieses Bit gesetzt wird, wird die Versorgung des Analogvergleichers abgeschaltet. Diese Bit kann jederzeit gesetzt werden. Damit kann der Stromverbrauch im aktiven oder Idle-Modus reduziert werden. Wenn das ACD-Bit verändert wird, sollte vorher das ACIE-Bit (Analogvergleicher Interruptfreigabe) gelöscht werden, da sonst versehentlich ein Interrupt durch das Ändern des ACD-Bits ausgelöst werden kann.
  • Bit 6 — ACBG: Analogvergleicher: Bandgap-Auswahl
Wenn diese Bit gesetzt wird, wird die positive Eingangsspannung von AIN0 durch eine interne Bandgap-Spannung am Eingang des Komparators ersetzt. Wenn das Bit gelöscht ist, liegt die Spannung von AIN0 am positiven Eingang des Komparators. Siehe Interne Spannungsreferenz.
  • Bit 5 — ACO: Komparator-Ausgang
Dieses Bit ist taktsynchronisiert und direkt mit dem Ausgang des Vergleichers verbunden. Die Synchronisation beinhaltet eine Verzögerung von 1 bis 2 Taktzyklen.
  • Bit 4 — ACI: Analogvergleicher: Interrupt-Flag
Dieses Bit wird durch die Hardware gesetzt, wenn ein Ereignis am Ausgang des ACO einen Interrupt auslöst, der mit ACI1 und ACI0 eingestellt wurde. Die Analogvergleicher-Interrupt-Routine wird ausgeführt, wenn das ACIE-Bit und das globale Interrupt-Bit (I-Bit im SREG) gesetzt sind. Das ACI-Bit wird durch die Hardware gelöscht, wenn die dazugehörige Interrupt-Routine ausgeführt wird. Alternativ kann das Bit auch gelöscht werden, indem man eine logische 1 in das Flag schreibt.
  • Bit 3 — ACIE: Analogvergleicher: Interruptfreigabe
Wenn das ACIE-Bit und das globale Interrupt-Bit gesetzt sind, ist der Analogvergleicher-Interrupt freigegeben. Wenn das Bit gelöscht ist, ist der Interrupt gesperrt.
  • Bit 2 — ACIC: Analogvergleicher: Freigabe des Input Capture
Wenn dieses Bit mit einer logischen 1 beschrieben wird, gibt das Bit die Input-Capture-Funktion für Zähler/Zeitgeber1 frei, die durch den Analogvergleicher getriggert wird. Der Ausgang des Komparators ist in diesem Fall direkt mit der Input-Capture-Eingangs-Logik verbunden, so dass auch die Störungsunterdrückung und die Flanken-Einstellmöglichkeiten des Zähler/Zeitgeber1-Interrupts verwendet werden. Wenn das Bit auf 0 gesetzt ist, besteht keine Verbindung zwischen dem ACO und der Input-Capture-Funktion. Um den ACO zum Triggern des Zähler/Zeitgeber1 Interrupts zu verwenden, muss das TICIE1-Bit im Register TIMSK gesetzt sein.
  • Bit 1, 0 — ACIS1, ACIS0: Analogvergleicher Interrupt-Mode-Auswahl
Mit diesen Bits wird vorgegeben, bei welchem Zustand des Komparators ein Interrupt ausgelöst werden soll. Die verschiedenen Möglichkeiten stehen in folgender Tabelle.
Tabelle 23-2: Einstellungen ACIS1/ACIS0
ACIS1 | ACIS0 | Interrupt-Modus
0 | 0 | Wechsel am ACO-Ausgang löst einen Interrupt aus
0 | 1 | Reserviert
1 | 0 | Eine fallende Flanke am ACO-Ausgang löst einen Interrupt aus
1 | 1 | Eine steigende Flanke am ACO-Ausgang löst einen Interrupt aus
Wenn diese Bits verändert werden, sollte vorher das ACIE-Bit (Analogvergleicher-Interruptfreigabe) im ACSR Register gelöscht werden, da sonst versehentlich ein Interrupt ausgelöst werden kann.

23.3.3 DIDR1 – Deaktivierung Digitaleingang Register 1

DIDR = Digital Input Disable Register
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x7F) | - | - | - | - | - | - | AIN1D | AIN0D | DIDR1
Zugriff | R | R | R | R | R | R | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7..2 – Res: Reserved Bits
Diese Bits sind unbenutzt und liefern beim Lesen Null.
  • Bit 1, 0 – AIN1D, AIN0D: Deaktivierung des digitalen Eingangs für AIN1, AIN0
Diese Bits deaktivieren den digitalen Eingangspuffer der Eingänge AIN1 bzw. AIN0, wenn auf logisch Eins gesetzt. Das entsprechende PIN-Register-Bit liefert dann stets Null. Wenn analoge Signale an AIN1/0 angelegt werden, sollten diese Bits gesetzt werden, um den Stromverbrauch des digitalen Eingangs zu senken.
Ansonsten praktisch ruhestromfreie CMOS-Gatter nehmen bekanntermaßen einen merklichen Strom auf, wenn das Eingangssignal nicht nahe den Betriebsspannungsgrenzen liegt.


Der Analog-Digital Wandler

24. Der Analog-Digital Wandler

24.1 Features

  • 10-bit Auflösung (8-bit Genauigkeit bei ADC 4 und ADC5)
  • +- 2 LSB absolute Genauigkeit
  • 0,5 LSB integrale Nichtlinearität
  • optionale Streichung der Offsetspannung
  • 65  260 µs Wandlungszeit
  • bis zu 15.000 Wandlungen pro Sekunde
  • 6 gemultiplexte Einzeleingänge
  • 2 weitere gemultiplexte Eingänge im TQFP und MLF Gehäuse
  • Auswählbare 2,56 V ADC Referenzspannung
  • 0  VCC Eingangsspannung an den Einzeleingängen
  • Optionale linksbündiges Aufbereiten für das Auslesen der Wandlungsergebnisse
  • Kontinuierliche oder Einzelwandlung
  • Interrupt bei Ende der Wandlung
  • Sleep-Modus Noise Canceler

24.2 Übersicht

Der ATmega8 bietet einen 10-bit Analog-Digital-Wandler, der nach dem Prinzip der succsessiven Approximation arbeitet. Der Analog-Digital-Wandler ist mit einem analogen Multiplexer verbunden, der die Auswahl zwischen acht Einzeleingängen an Port C erlaubt. Diese Eingänge referenzieren gegen 0V (GND).

Man beachte, dass die Eingänge ADC4 und ADC5 auf 8-bit Genauigkeit limitiert sind, die Eingänge ADC 3 bis 0 und ADC 7 bis 6 haben 10-bit Genauigkeit.

Der ADC enthält einen Sample and Hold Verstärker, der sicherstellt, dass die Eingangsspannung für den Wandler während des Wandlungsvorganges konstant bleibt.

Der ADC hat einen separaten Pin für die Versorgungsspannung (AVCC). AVCC darf nicht mehr als +- 0,3 V von VCC abweichen. Siehe Kapitel ADC Störungsunterdrückung.

Die interne Referenzspannung von nominell 2,56V wird auf dem Chip erzeugt. Die Referenzspannung sollte durch einen externen Kondensator am Pin AREF gestützt werden, um eine Störsicherheit zu erreichen.

Blockschaltbild des Analog-Digital-Wandlers

Bild 24-1: Blockschaltbild des Analog-Digital-Wandlers
Der Analog-Digital-Wandler wandelt eine analoge Eingangsspannung durch succsessive Approximation in einen 10-bit Digitalwert. Der kleinste Wert enstpricht GND, der maximale Wert entspricht der ausgewählten Referenzspannung minus ein LSB.

Die Referenzspannung für den Analog-Digital-Wandler kann durch die Bits REFS1 und REFS0 im ADMUX-Register ausgewählt werden, die Referenzspannung liegt dann auch am AVCC Pin an. Möglich sind VCC oder die interne Referenzspannung von 2,56V. Die Spannung an AVCC kann durch einen externen Kondensator am AREF-Pin zur besseren Rauschunterdrückung gestützt werden.

Die analogen Eingänge werden mit den Bits MUX2 bis MUX0 im ASMUX-Register ausgewählt. Jeder der Eingänge sowie GND oder die feste Bandgap Referenzspannung können als Einzeleingang für den Analog-Digital-Wandler ausgewählt werden.

Der Analog-Digital-Wandler kann in zwei Arten betrieben werden, der kontinuierlichen oder der einzelnen Wandlung. Bei der Einzelwandlung wird jede Wandlung durch das Programm einzeln gestartet. Bei der kontinuierlichen Wandlung werden die Eingänge ständig ausgewertet und die Daten im ADC Data Register aktualisiert. Das ADFR-Bit im ADCSR-Register wählt zwischen diesen beiden Möglichkeiten aus.

Der Analog-Digital-Wandler wird freigegeben, indem das ADEN-Bit im ADCSR-Register gesetzt wird. Änderungen an der Referenzspannung und den Input Kanälen werden erst wirksam, wenn das ADEN-Bit gesetzt ist. Wenn das ADEN-Bit gelöscht ist, verbraucht der Analog-Digital-Wandler kein Strom. Es ist also sinnvoll, das Bit zu löschen, bevor in den Stromsparmodus umgeschaltet wird.

Der Analog-Digital-Wandler erzeugt ein 10-bit Ergebnis, das in den ADC Data Registern ADCH und ADCL abgelegt wird. Normalerweise wird das Ergebnis rechtsbündig in den beiden Registern abgelegt, optional kann das Ergebnis aber auch linksbündig in ADCH und ADCL geschrieben werden. Die Einstellung erfolgt mit dem ADLAR-Bit im ADMUX-Register.

Wenn das Ergebnis linksbündig geschrieben wird, und keine größere Auflösung als 8 Bit benötigt wird, so kann das komplette (8-Bit) Ergebnis direkt aus ADCH gelesen werden. Andernfalls muss erst ADCL und dann ADCH gelesen werden, um sicherzustellen, dass beide Daten zu dem selben Wandlungsergebnis gehören. Sobald ADCL gelesen wird, kann der Analog-Digital-Wandler keine Zugriffe auf die Datenbytes ausführen. Das bedeutet, dass wenn ADCL gelesen wurde und eine weitere Wandlung abgeschlossen wurde, bevor ADCH ausgelesen ist, werden beide Register nicht mit den neuen Werten beschrieben und das neue Wandlungsergebnis geht verloren. Wenn ADCH gelesen wird, wird der Zugriff auf die Register ADCL und ADCH wieder freigegeben.

Der ADC hat einen eigenen Interrupt, der getriggert werden kann, wenn eine Wandlung abgeschlossen wurde. Wenn der Zugriff des ADC auf die Datenregister zwischen dem Lesen von ADCH und ADCL gesperrt ist, wird der Interrput trotzdem getriggert, auch wenn das Ergebnis verloren geht.

24.3 Starten einer Wandlung

Eine Wandlung wird gestartet, indem eine 1 in das ADC Start Conversion (ADSC)  Bit geschrieben wird. Das Bit bleibt während der Wandlung gesetzt und wird nach Beendigung der Wandlung automatisch durch die Hardware wieder gelöscht. Wenn während eine Wandlung noch läuft ein anderer Input-Kanal ausgewählt wird, wird die laufende Wandlung erst bis zum Ende durchgeführt, bevor auf den anderen Kanal umgeschaltet wird.

Im Freilaufenden Modus tastet der ADC kontinuierlich ab und aktualisiert die Datenregister. Der Freilaufende Modus wird ausgewählt, indem das ADFR Bit im ADCSRA Register auf 1 gesetzt wird. Die erste Wandlung muss dann gestartet werden indem eine logische 1 in das ADSC Bit im ADCSRA Register geschrieben wird. In diesem Modus führt der ADC kontinuierlich Wandlungen durch, unabhängig davon, ob das ADC Interrupt Flag ADIF gelöscht ist oder nicht.

Bild 24-2: Auto-Trigger-Logik

24.4 Vorteiler und Wandlungszeit

Bild 24-3: ADU-Vorteiler
Die Schaltung für die succsessive Approximation benötigt einen Takt mit einer Frequenz zwischen 50kHz und 200kHz, um die maximale Aulösung zu erreichen. Wenn kleinere Auflösungen als 10 bit ausreichen, kann die Taktfrequenz des ADC auch höher als 200 kHz sein, um dadurch eine höhere Abtastrate zu erreichen.

Das ADC-Modul enthält daher einen Vorteiler, der einen brauchbaren ADC-Takt aus CPU Taktfrequenzen über 100 kHz erzeugt. Der Vorteiler wird durch die ADPS Bits im ADCSRA Register eingestellt. Der Vorteiler startet in dem Moment, in dem der Analog-Digital-Wandler durch Setzen des ADEN-Bits im ADCSR-Register eingeschaltet wird. Der Vorteiler arbeitet so lange, wie ADEN gesetzt ist und wird kontinuierlich zurückgesetzt, wenn ADEN auf Low steht.

Wenn eine Wandlung durch Setzen des ADSC-Bits im ADCSRA-Register gestartet wird, beginnt die Wandlung mit der nächsten steigenden Flanke des ADC-Taktes. Eine normale Wandlung dauert 13 ADC-Takte lang. Die erste Wandlung, die nach dem Einschalten des ADC durchgeführt wird, dauert allerdings 25 Takte, da der analoge Schaltkreis erst initialisiert werden muss.

Der aktuelle sample and hold Vorgang beginnt 1,5 ADC-Takte nach dem Start einer normalen Wandlung und 13,5 ADC-Takte nach dem Start einer längern Wandlung. Nachdem eine Wandlung abgeschlossen wurde, wird das Ergebnis in die ADC-Daten-Register geschrieben und das ADIF-Flag wird gesetzt. Im Modus der Einzelwandlung wird gleichzeitig auch das ADSC-Bit gelöscht. Die Software kann das ADSC-Bit dann wieder setzen und eine neue Wandlung wird mit der steigenden Flanke des ADC-Taktes eingeleitet.

Im Modus der fortlaufenden Wandlung wird eine neue Wandlung sofort wieder angestoßen, sofern ADSC weiterhin auf high bleibt. Die nachfolgende Tabelle fasst die Wandlungszeiten noch einmal zusammen.

Bild 24-4: Zeitdiagramm erste Wandlung
Bild 24-5: Zeitdiagramm Einzelwandlung
Bild 24-6: Zeitdiagramm automatisch getriggerte Wandlung
Bild 24-7: Zeitdiagramm fortlaufende Wandlung
Tabelle 24-1: A/D-Wandlungszeiten
Bedingung | Sample&Hold (Anzahl Takte nach Start der Wandlung) | Anzahl der Takte für Wandlung
Erste Wandlung | 13,5 | 25
Normale Wandlung | 1,5 | 13
Automatisch getriggerte Wandlung | 2 | 13,5

24.5 Wechsel der Kanäle und Referenzspannung

Die MUXn und REFS1 und 0 Bits im ADMUX Register sind durch ein temporäres Register, auf das die CPU zugreifen kann, einfach gebuffert. Dadurch ist sichergestellt, dass die Kanal- und Referenzauswahl während einer Wandlung nicht verändert werden kann. Die Kanal- und Referenzauswahl wird kontinuierlich aktualisiert, bis eine Wandlung gestartet wird. Mit dem Start einer Wandlung wird die Kanal- und Referenzauswahl übernommen, um eine ausreichende Abtastzeit für den ADC sicherzustellen. Das kontinuierliche Aktualisieren wird im letzten Takt, bevor die Wandlung abgeschlossen ist (ADIF im ADCSRA wird gesetzt), fortgesetzt. Man beachte, dass eine Wandlung mit der ersten fallenden Flanke des ADC Taktes gestartet wird, die nach dem Setzen des ADSC auftritt. Der Anwender muss also darauf bedacht sein, keinen neuen Kanal- oder Referenzwert in das ADMUX zu schreiben, bis ein ADC Taktzyklus nach dem Schreiben des ADSC vorüber ist.

Wenn sowohl ADFR als auch ADEN mit 1 beschrieben sind, kann jederzeit ein Interrupt auftreten. Wenn das ADMUX Register in dieser Zeit verändert wird, kann der User nicht feststellen, ob das nächste Wandlungsergebnis zu den alten oder den neuen Einstellungen gehört. ADMUX kann sicher aktualisiert werden auf folgende Weisen:

  1. Wenn ADFR oder ADEN gelöscht sind
  2. Während einer Wandlung, mindestens einen ADC Takt nach dem Wandlungsstart
  3. Nach einer Wandlung, bevor das Interrupt Flag als Triggerquelle gelöscht wird
Wenn das ADMUX unter einer der Bedingungen verändert wird, gelten die neuen Einstellungen für die nächste Wandlung.

24.5.1 ADU-Eingangskanäle

Wenn die Eingangskanäle gewechselt werden, sollte der User folgende Richtlinien beachten, um sicherzustellen, dass der richtige Kanal ausgewählt ist.

Im Einzelwandlungs Modus sollte der Kanal ausgewählt werden, bevor die Wandlung startet. Die Auswahl des Kanals kann einen ADC Taktzyklus nachdem das ADSC Bit gesetzt wurde, wieder verändert werden. Die einfachste Methode ist aber, das Ende einer Wandlung abzuwarten bevor ein anderer Kanal eingestellt wird.

Im Freilaufenden Modus wird der Kanal ausgewählt, bevor die erste Wandlung gestartet wird. Die Auswahl des Kanals kann einen ADC Taktzyklus nachdem das ADSC Bit gesetzt wurde, wieder verändert werden. Die einfachste Methode ist aber, das Ende der ersten Wandlung abzuwarten bevor ein anderer Kanal eingestellt wird. Da die nächste Wandlung dann bereits automatisch begonnen hat, gehört das nächste Wandlungsergebnis noch zu den alten Kanal. Die nachfolgenden Wandlungen gehören dann zu dem neuen Kanal.

24.5.2 ADU-Spannungsreferenz

Die Referenzspannung für den ADC (UREF) bestimmt die Wandlungsbandbreite des ADC. Die Einzeleingänge, die VREF erreichen, führen zu einem Ergebniscode von 3Fh. Als VREF können entweder AVCC, die interne 2,56 V Referenz oder der externe AREF Pin ausgewählt werden.

AVCC ist mit dem ADC durch einen passiven Schalter verbunden. Die interne 2,56V Referenz wird durch einen internen Verstärker aus der internen Bandbreiten Referenz (VBG) abgeleitet. In allen Fällen ist der externe AREF Pin direkt mit dem ADC verbunden und kann durch einen externen Kondensator zwischen dem AREF Pin und GND gestützt werden. Mit einem hochohmigen Voltmeter kann VREF am AREF Pin gemessen werden. Man beachte dabei, dass VREF eine Quelle mit hoher Impedanz ist und nur eine Kapazitive Last angeschlossen werden kann.

Wenn der User eine Festspannungsquelle an den AREF Pin angeschlossen hat, darf er die anderen Referenzspannungen in der Applikation nicht verwenden, da sie sonst mit der externen Spannungsquelle kurzgeschlossen werden. Wenn keine externe Referenzspannung angeschlossen wird, kann der User zwischen AVCC und 2,56V als Referenzspannung auswählen. Die erste Wandlung nach dem Umschalten der Referenzspannung kann ungenau sein, weshalb dieses Ergebnis vom User besser nicht verwendet werden sollte.

24.6 ADC Störungsunterdrückung

Der ADC bietet einen Rauschunterdrücker, der es erlaubt, Wandlungen auch dann durchzuführen, während der Noise Reduction Mode (siehe Sleep-Modes) einschaltet ist. In diesem Modus werden Störungen, die von der CPU oder anderer I/O-Peripherie erzeugt werden verringert. Die Störungsunterdrückung kann im ADC Noise Reduction Modus und im Idle Modus verwendet werden. Um diese Möglichkeit zu nutzen, muss folgender Ablauf eingehalten werden:
  1. Sicherstellen, dass der ADC freigegeben ist und nicht mit einer Wandlung beschäftigt ist. Der Einzelwandlungsmodus muss ausgewählt sein und der ADC-Complete Interrupt muss freigegeben sein.
  2. Einschalten des ADC Noise Reduction Mode (oder Idle Mode). Der ADC wird eine Wandlung durchführen, während die CPU angehalten ist.
  3. Wenn kein anderer Interrupt auftrat, bevor der ADC mit der Wandlung fertig ist, wird der ADC-Interrupt die CPU wieder aufwecken und die ADC-Interrupt Routine wird ausgeführt. Wenn ein anderer Interrupt die CPU aufweckt, bevor die ADC Wandlung abgeschlossen ist, wird dieser Interrupt ausgeführt und der ADC Wandlung Fertig Interrupt wird erzeugt, wenn die Wandlung abgeschlossen ist. Die CPU verbleibt aber im aktiven Zustand bis ein neuer Sleep Befehl ausgeführt wird.
Man beachte, dass der ADC nicht automatisch ausgeschaltet wird, wenn andere Sleep Modi als der Idle oder ADC Noise Reduction Mode ausgewählt werden. Der User ist also angehalten, das ADEN Bit zu löschen bevor einer dieser Sleep Modi eingeschaltet wird, um den unnötigen Stromverbrauch zu vermeiden.

24.6.1 Analoge Eingangsbeschaltung

Bild 24-8: Analoge Eingangsbeschaltung

24.6.2 Techniken zur Störunterdrückung

Bild 24-9: Speisespannungs- und Masseführung

24.6.3 Definitionen zur ADU-Genauigkeit

Bild 24-10: Offsetfehler
Bild 24-11: Verstärkungsfehler
Bild 24-12: Gesamt-Linearitätsabweichung
Bild 24-13: Differenzielle Linearitätsabweichung

24.7 ADU-Ergebnis

Nachdem eine Wandlung abgeschlossen ist (ADIF ist Eins), kann das Ergebnis der Wandlung im Ergebnisregister ADC abgeholt werden.

Für eine einzelne Wandlung ist das Ergebnis

ADC = UIN · 1024,
UREF
wobei UIN die Spannung am ausgewählten Eingang und UREF die Spannung der ausgewählten Referenzspannung ist. 0x000 repräsentiert Analogmasse und 0x3FF entspricht der ausgewählten Referenzspannung minus 1 LSB.

24.8 Temperaturmessung

Die Temperaturmessung basiert auf einen Temperatursensor auf dem Chip, der an den Eingangskanal ADC8 gebunden ist. Die Auswahl von ADC8 durch Setzen der MUX[3:0]-Bits auf “1000” aktiviert den Temperatursensor. Die interne 1,1-V-Spannungsreferenz muss dazu als Spannungsreferenz für den A/D-Wandler ausgewählt sein. Ist der Temperatursensor ausgewählt, kann der A/D-Wandler im Einzelbetrieb die Spannung über den Sensor messen.

Die gemessene Spannung hat einen linearen Zusammenhang zur Chiptemperatur mit den in Tabelle 24-2 angegebenen Stützstellen. Die Empfindlichkeit liegt bei 1 mV/K und die Genauigkeit bei ±10 °C.

Tabelle 24-2: Spannungsreferenz-Auswahl für den ADU
Temperatur | -45 °C | +25 °C | +85 °C
Spannung | 242 mV | 314 mV | 380 mV
ADC-Wert (rechtsbündig) | 225 | 292 | 353
Die Spannungen in Tabelle 24-2 sind typische Werte. Die Ausgangsspannung variiert von Chip zu Chip. Um präzisere Temperaturwerte zu erhalten, kann die Temperaturausgabe kalibriert werden. Die Software-Kalibrierung erfordert, dass ein Kalibrierwert (als Nullpunkt) im EEPROM für jeden Chip beim Produktionstest gespeichert werden. Die Kalibrierung kann folgende Formel verwenden:

T = (ADC – TOS) · k

wobei ADC das 16-bit-ADU-Datenregister, k ein fester Koeffizient und TOS den Kalibrierwert darstellt, der im EEPROM als Teil der Produktions-Endkontrolle abgespeichert wurde.

24.9 Register-Beschreibung

24.9.1 ADMUX — A/D-Multiplexer

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x7C) | REFS1 | REFS0 | ADLAR | - | MUX3 | MUX2 | MUX1 | MUX0 | ADMUX
Zugriff | R/W | R/W | R/W | R | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7:6 — REFS[1:0]: Referenzauswahl
Mit diesen Bits wird die Spannungsreferenz für den ADU ausgewählt. Wenn diese Bits während einer laufenden Wandlung gewechselt werden, wird der Wechsel nicht während der laufenden Wandlung wirksam sondern erst dann, wenn ADIF im ADCSRA gesetzt wird. Die interne Referenzspannungsoptionen können nicht verwendet werden, wenn eine externe Referenzspannung am AREF-Pin angeschlossen ist.
Tabelle 24-3: Spannungsreferenz-Auswahl für den ADU
REFS1 | REFS0 | Auswahl der Referenzspannung
0 | 0 | AREF, interne UREF ist abgeschaltet
0 | 1 | AUCC mit externem Kondensator am AREF-Pin
1 | 0 | reserviert
1 | 1 | Interne Referenzspannung 1,1 V mit externem Kondensator an AREF-Pin
  • Bit 5 — ADLAR: Linksausrichtung des Wandlungsergebnisses
Mit diesen Bit wird eingestellt, wie das Wandlungsergebnis in den beiden ADC-Datenbytes abgelegt wird. Wenn das Bit gesetzt ist, wird das Ergebnis linksbündig abgelegt, andernfalls wird es rechtsbündig abgelegt. Das Ändern des Bits wirkt sich sofort auf die ADC-Data-Register aus, unabhängig davon, ob gerade noch eine Wandlung läuft. Siehe Beschreibung von ADCH und ADCL.
  • Bit 4 — Res: reserviert
Dieses Bit ist ungenutzt und wird immer als 0 gelesen.
  • Bit 3:0 — MUX[3:0]: Auswahl des Analogeingangs
Dieses Bit legen fest, welcher analoge Eingang mit dem ADU verbunden ist. Siehe folgende Tabelle. Werden diese Bits verändert, während eine Wandlung noch läuft, so wirken sich die Änderungen erst nach Abschluss der laufenden Wandlung aus (wenn ADIF im ADCSRA gesetzt wird).
Tabelle 24-4: Eingangskanal-Auswahl
MUX[3:0] | Unsymmetrischer Eingang
0000 | ADC0
0001 | ADC1
0010 | ADC2
0011 | ADC3
0100 | ADC4
0101 | ADC5
0110 | ADC6
0111 | ADC7
1000 | ADC8(1)
1001 | reserviert
1010 | reserviert
1011 | reserviert
1100 | reserviert
1101 | reserviert
1110 | 1,1 V (UBG)
1111 | 0 V (Masse)
Hinweis:
  1. Für den Temperatursensor

24.9.2 ADCSRA — Kontroll- und Statusregister A

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x7A) | ADEN | ADSC | ADATE | ADIF | ADIE | ADPS2 | ADPS1 | ADPS0 | ADCSRA
Zugriff | R/W | R/W | R/W | R/W! | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7 — ADEN: ADU-Freigabe
Mit einer 1 in diesem Bit wird der ADU freigegeben. Durch Löschen des Bits wird der ADU gesperrt. Wird das Bit während einer laufenden Wandlung gelöscht, wird diese Wandlung abgebrochen.
  • Bit 6 — ADSC: Wandlung starten
Im Betriebsart Einzelwandlung muss dieses Bit zum Starten jeder einzelnen Wandlung gesetzt werden. Wenn die Wandlung abgeschlossen ist, wird das Bit automatisch wieder gelöscht. Im Betriebsart fortlaufende Wandlung startet das Setzen des Bits die erste Wandlung. Die erste Wandlung nach dem Beschreiben des ADSC, nachdem der ADC freigegeben wurde, oder wenn das ADSC gleichzeitig mit der Freigabe des ADC beschrieben wird, benötigt 25 ADU-Takte, ansosnten 13 Takte.

Das ADSC-Bit wird so lange als 1 gelesen, wie eine Wandlung andauert. Nach dem Abschluss einer Wandlung wird das Bit automatisch wieder auf Null gesetzt. Das Schreiben einer Null in dieses Bit hat keine Auswirkungen.

  • Bit 5 — ADFR: Automatische Triggerung
Wenn dieses Bit gesetzt ist, arbeitet der ADU mit automatischer Triggerung. Eine Wandlung startet bei positiver Flanke des Triggersignals. Die Triggerquelle wird mit den ADTS-Bits im ADCSRB ausgewählt.
In der Standardeinstellung von ADCSRB wird die kontinuierliche Betriebsart des ADU aktiviert, wie bei vorhergehenden AVR-Controllern ohne Triggerauswahl. Das Löschen des Bits stoppt die weitere Wandlung.
  • Bit 4 — ADIF: ADU-Interrupt anhängig
Dieses Bit wird gesetzt, wenn eine Wandlung abgeschlossen und die Daten-Register aktualisiert wurden. Der ADU-Wandlung-komplett-Interrupt wird ausgeführt, wenn das ADIE-Bit und das globale Interrupt-Bit (I-Bit im SREG) gesetzt sind. ADIF wird durch die Hardware gelöscht, wenn die Interrupt-Routine ausgeführt wird. Alternativ kann das ADIF-Bit auch gelöscht werden, indem man eine logische 1 in das Flag schreibt. Dies ist besonders zu beachten, wenn man eine Lese-Ändern-Schreiben-Befehlsfolge mit dem ADCSR durchführt, da dadurch ein anhängiger Interrupt gelöscht werden kann. Das kann auch geschehen, wenn die Befehle SBI und CBI verwendet werden.

Hierbei würde man eine 1 im ADIF zurücklesen, irgendein anderes Bit ändern und das ganze Byte zurückschreiben. Die 1 im ADIF führt dann zum Löschen des Interruptflags und damit zur unbeabsichtigten Quittierung der Interruptanforderung.
  • Bit 3 — ADIE: ADU-Interruptfreigabe
Wenn dieses Bit gesetzt wird und auch das I-Bit im SREG die Interrupts global freigibt, dann ist der ADC Conversion Complete Interrupt freigegeben.

  • Bit 2:0 — ADPS[2:0]: ADU-Taktvorteilerauswahl
Diese Bits legen den Teilungsfaktor des Vorteilers fest, der aus der Systemtaktfrequenz den ADU-Takt ableitet.
Tabelle 24-5: Vorteiler-Auswahl
ADPS2 | ADPS1 | ADPS0 | Teilungsfaktor
0 | 0 | 0 | 2
0 | 0 | 1 | 2
0 | 1 | 0 | 4
0 | 1 | 1 | 8
1 | 0 | 0 | 16
1 | 0 | 1 | 32
1 | 1 | 0 | 64
1 | 1 | 1 | 128

24.9.3 ADC (ADCL+ADCH) — Ergebnisregister

24.9.3.1 Bei ADLAR = 0

Bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8
(0x79) | - | - | - | - | - | - | ADC9 | ADC8 | ADCH
(0x78) | ADC7 | ADC6 | ADC5 | ADC4 | ADC3 | ADC2 | ADC1 | ADC0 | ADCL
 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
Zugriff | R | R | R | R | R | R | R | R
 | R | R | R | R | R | R | R | R
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0

24.9.3.2 Bei ADLAR = 1

Bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8
(0x79) | ADC9 | ADC8 | ADC7 | ADC6 | ADC5 | ADC4 | ADC3 | ADC2 | ADCH
(0x78) | ADC1 | ADC0 | - | - | - | - | - | - | ADCL
 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
Zugriff | R | R | R | R | R | R | R | R
 | R | R | R | R | R | R | R | R
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0

Wenn eine ADC-Wandlung abgeschlossen wurde, wird das Ergebnis in den beiden Registern ADCL und ADCH abgelegt. Wenn das ADCL-Register gelesen wurde, werden beide Register so lange nicht mit Werten neuerer Wandlungen aktualisiert, bis auch das ADCH gelesen wurde. Wenn das Ergebnis linksbündig eingetragen ist und eine Auflösung von 8 Bit ausreichend ist, dann ist es sinnvoll, nur ADCH auszulesen. Andernfalls muss ADCL als erstes gelesen werden und anschließend ADCH.

Mit gesetztem ADLAR-Bit im ADMUX Register wird Linksbündigkeit eingestellt. Ist es gelöscht (= Vorgabe), ist das Ergebnis rechtsbündig.

Beim Zugriff auf die volatile 16-Bit-Variable ADC im C-Programm stellt der Compiler die richtige Zugriffsreihenfolge sicher.
  • Bits ADC[9:0]: ADU-Wandlungsergebnis
Diese Bits repräsentieren das Ergebnis der Analog-Digital-Wandlung, siehe oben.

24.9.4 ADCSRB — Kontroll- und Statusregister B

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x7B) | - | ACME | - | - | - | ADTS2 | ADTS1 | ADTS0 | ADCSRB
Zugriff | R | R/W | R | R | R | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7,5:3 — reserviert
Diese Bits sind für künftige Verwendung reserviert und sollten stets mit Null beschrieben werden.
  • Bit 2:0 — ADTS[2:0]: Automatische Triggerquelle für den ADU
Wenn ADATE im ADCSRA auf Eins gesetzt wurde, wählen diese Bits die Triggerquelle für den A/D-Umsetzung aus. Ist ADATE gelöscht, sind diese Bits ohne Wirkung. Eine Wandlung wird durch eine steigende Flanke der ausgewählten Interruptanforderung ausgelöst. Das Umschalten von einer gelöschten zu einer gesetzten Triggerquelle bildet ebenfalls eine steigende Flanke des Triggersignals. Ist ADEN in ADCSRA gesetzt, startet dies eine A/D-Wandlung. Die Umschaltung zum kontinuierlichen Betrieb löst kein Triggerereignis aus, selbst wenn die ADU-Interruptanforderung gesetzt ist.
Tabelle 24-6: Triggerquellen-Auswahl
ADTS2 | ADTS1 | ADTS0 | Triggerquelle
0 | 0 | 0 | Kontinuierlicher Betrieb
0 | 0 | 1 | Analogvergleicher
0 | 1 | 0 | Externer Interrupt 0
0 | 1 | 1 | Zähler/Zeitgeber 0 Compare Match A
1 | 0 | 0 | Zähler/Zeitgeber 0 Überlauf
1 | 0 | 1 | Zähler/Zeitgeber 1 Compare Match B
1 | 1 | 0 | Zähler/Zeitgeber 1 Überlauf
1 | 1 | 1 | Zähler/Zeitgeber 1 Capture-Ereignis

24.9.5 DIDR0 — Abschalten digitaler Eingänge

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x7E) | - | - | ADC5D | ADC4D | ADC3D | ADC2D | ADC1D | ADC0D | DIDR0
Zugriff | R | R | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7:6 — reserviert
Diese Bits sind für künftige Verwendung reserviert und sollten stets mit Null beschrieben werden.
  • Bit 5:0 — ADC[5:0]D: Abschalten des zugehörigen digitalen Eingangs
Wenn das Bit logisch Eins ist, wird der digitale Eingangspuffer des zugehörigen Anschlusspins abgeschaltet. In Folge liest das PIN-Register stets ein Null-Bit. Wird ein analoges Eingangssignal an ADC5:0 angeschlossen und die digitale Eingangsfunktion nicht benötigt, sollte dieses Bit auf logisch Eins gesetzt werden, um die Stromaufnahme des digitalen Eingangspuffers zu reduzieren.

Die Eingänge ADC7 und ADC6 haben keine digitalen Eingangsfunktionen. Daher benötigen diese keine Digital-Eingangs-Abschalt-Bits.


debugWIRE On-chip Debug System

25. debugWIRE On-chip Debug System

25.1 Features

  • Complete Program Flow Control
  • Emulates All On-chip Functions, Both Digital and Analog, except RESET Pin
  • Real-time Operation
  • Symbolic Debugging Support (Both at C and Assembler Source Level, or for Other HLLs)
  • Unlimited Number of Program Break Points (Using Software Break Points)
  • Non-intrusive Operation
  • Electrical Characteristics Identical to Real Device
  • Automatic Configuration System
  • High-Speed Operation
  • Programming of Non-volatile Memories

25.2 Overview

The debugWIRE On-chip debug system uses a One-wire, bi-directional interface to control the program flow, execute AVR instructions in the CPU and to program the different non-volatile memories.

25.3 Physical Interface

When the debugWIRE Enable (DWEN) Fuse is programmed and Lock bits are unprogrammed, the debugWIRE system within the target device is activated. The RESET port pin is configured as a wire-AND (open-drain) bi- directional I/O pin with pull-up enabled and becomes the communication gateway between target and emulator.
Bild 25-1: The debugWIRE Setup
Bild 25-1 shows the schematic of a target MCU, with debugWIRE enabled, and the emulator connector. The system clock is not affected by debugWIRE and will always be the clock source selected by the CKSEL Fuses. When designing a system where debugWIRE will be used, the following observations must be made for correct operation:
  • Pull-up resistors on the dW/(RESET) line must not be smaller than 10kΩ. The pull-up resistor is not required for debugWIRE functionality.
  • Connecting the RESET pin directly to VCC will not work.
  • Capacitors connected to the RESET pin must be disconnected when using debugWire.
  • All external reset sources must be disconnected.

25.4. Software Break Points

debugWIRE supports Program memory Break Points by the AVR Break instruction. Setting a Break Point in AVR Studio® will insert a BREAK instruction in the Program memory. The instruction replaced by the BREAK instruction will be stored. When program execution is continued, the stored instruction will be executed before continuing from the Program memory. A break can be inserted manually by putting the BREAK instruction in the program.

The Flash must be re-programmed each time a Break Point is changed. This is automatically handled by AVR Studio through the debugWIRE interface. The use of Break Points will therefore reduce the Flash Data retention. Devices used for debugging purposes should not be shipped to end customers.

25.5 Limitations of debugWIRE

The debugWIRE communication pin (dW) is physically located on the same pin as External Reset (RESET). An External Reset source is therefore not supported when the debugWIRE is enabled.

A programmed DWEN Fuse enables some parts of the clock system to be running in all sleep modes. This will increase the power consumption while in sleep. Thus, the DWEN Fuse should be disabled when debugWire is not used.

25.6 Registerbeschreibung

The following section describes the registers used with the debugWire.

25.6.1 DWDR – debugWire Data Register

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x31) | DWDR[7:0] |  |  |  |  |  |  |  | DWDR
Zugriff | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
The DWDR Register provides a communication channel from the running program in the MCU to the debugger. This register is only accessible by the debugWIRE and can therefore not be used as a general purpose register in the normal operations.


Boot Loader, Self-Programming

26. Flash-Selbstprogrammierung, ATmega48

26.1 Übersicht

Der ATmega84(P)A hat nicht die Möglichkeit des Lesens-beim-Schreiben des Flash-Speichers. Der SPM-Befehl kann vom gesamten Flash-Speicher aus ausgeführt werden.

Der Chip unterstützt Selbstprogrammierung zum Download und Upload von Programmkode. Dazu kann jedes verfügbare Dateninterface und -protokoll herangezogen werden.

Der Programmspeicher wird Seite für Seite beschrieben und gelöscht. Bevor eine Seite mit den Daten, die in dem temporären Seitenpuffer geladen sind, programmiert wird, muss die Seite gelöscht werden. Der temporäre Seitenpuffer wird 16-bitweise mit dem SPM-Befehl gefüllt. Der Seitenpuffer kann sowohl vor dem Seitenlösch-Kommando als auch zwischen dem Seitenlösch-Kommando und dem Schreiben der Seite gefüllt werden.

Variante 1: Füllen des Puffers vor dem Löschen:

  • Füllen des temporären Seitenpuffers
  • Löschen der Seite
  • Schreiben der Seite
Variante 2: Füllen des Puffers zwischen dem Löschen und Schreiben:
  • Löschen der Seite
  • Füllen des temporären Seitenpuffers
  • Schreiben der Seite
Wenn nur ein Teil einer Seite verändert werden muss, muss der Rest der Seite vorher rückgelesen werden (z.B. im temporären Seitenpuffer), da vor dem Schreiben immer die gesamte Seite gelöscht wird. Wenn Variante 1 verwendet wird, bietet der Urloader echtes, byteweises Lesen-Verändern-Schreiben an. In dieser wird die Software zunächst die Seite lesen, dann die notwendigen Veränderungen durchführen und anschließend die modifizierten Daten zurückschreiben. Wenn Variante 2 verwendet wird, ist es nicht möglich, die alten Daten zu lesen, da die Seite bereits gelöscht wurde. Auf den temporären Seitenpuffer kann frei zugegriffen werden. Es ist wichtig, dass die Seitenadresse beim Löschen und Schreiben der Seite die gleiche Flash-Seite adressiert.

26.1.1 Seite löschen

Zum Löschen einer Seite wird die Seitenadresse im Zeigerregisterpaar Z hinterlegt, der Wert 0b00000011 in das SPMCSR geschrieben und innerhalb von 4 Taktzyklen ein SPM-Befehl ausgeführt. Die Daten in R1 und R0 werden dabei ignoriert. Die Seitenadresse muss in den Bereich PCPAGE in Z geschrieben werden, die anderen Bits von Z werden bei dieser Operation ignoriert.
  • Die CPU wird für die Dauer des Löschens der Seite angehalten.
    So als ob der SPM-Befehl eine Ausführungszeit von einigen Millisekunden hätte.
Hinweis:
Wenn ein Interrupt innerhalb der zulässigen vier Taktzyklen zwischen den beiden Befehlen auftaucht, kann der Zugriff nicht korrekt erfolgen. Um atomare (unterbrechungsfreie) Aneinandereihung der Befehlsausführung zu garantieren, sollten die Interrupts vor dem Schreiben von SPMCSR gesperrt werden.

26.1.2 Zwischenpuffer füllen (Seite laden)

Zum Schreiben eines Befehlswortes wird die Adresse im Zeigerregisterpaar Z hinterlegt, die Daten in R1:R0 geschrieben, der Wert 0b00000001 in das SPMCSR geschrieben und innerhalb von vier Taktzyklen ein SPM-Befehl ausgeführt. Der PCWORD-Bereich von Z wird verwendet, um die Daten im temporären Puffer zu adressieren. Der temporäre Puffer wird automatisch nach dem Befehl Seite-Schreiben gelöscht, aber auch durch Beschreiben des RWWSRE Bits im SPMCSR. Er wird auch nach einem System-Reset gelöscht. Man beachte, dass es nicht möglich ist, mehr als einmal in eine Adresse zu schreiben, ohne dass der temporäre Puffer gelöscht wird.

Wenn der EEPROM mitten in einer Seitenlade-Operation beschrieben wird, gehen alle geladenen Daten verloren.

26.1.3 Seite schreiben

Um das Schreiben einer Seite durchzuführen, wird die Adresse im Zeigerregisterpaar Z hinterlegt, der Wert 0b0000101 in das SPMCSR geschrieben und innerhalb von vier Taktzyklen ein SPM-Befehl ausgeführt. Die Daten in R1:R0 werden dabei ignoriert. Die Seitenadresse muss in dem Bereich PCPAGE von Z geschrieben werden, die anderen Bits von Z müssen während dieser Operation auf Null gesetzt sein.
  • Die CPU wird für die Dauer des Löschens der Seite angehalten.
    So als ob der SPM-Befehl eine Ausführungszeit von einigen Millisekunden hätte.

26.2 Adressierung beim Selbstprogrammieren

Das Zeigerregisterpaar Z wird zur Adressierung des SPM-Befehls benutzt (= impliziter Operand).

Bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8
ZH(R31) | Z15 | Z14 | Z13 | Z12 | Z11 | Z10 | Z9 | Z8
ZL(R30) | Z7 | Z6 | Z5 | Z4 | Z3 | Z2 | Z1 | Z0
 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0

Da der Flash-Speicher in Seiten organisiert ist (siehe Tabelle 28-11), kann man sich den Programmzähler in zwei Teile aufgeteilt vorgestellen. Die niederwertigen Bits addressieren ein 16-Bit-Wort in einer Seite, und der höherwertige Teil adressiert die Seite. Siehe Bild 26-1. Man beachte, das Seite-Löschen und Seite-Schreiben unabhängig adressiert werden. Daher muss die Software gleiche Adressen zum Seitenlöschen und Seitenschreiben sicherstellen.

Auch für den LPM-Befehl wird Z (implizit oder explizit) zur Adressierung verwendet. Da dieser Befehl byteweise arbeitet, wird hierbei auch das LSB (Bit 0) von Z verwendet.

Bild 26-1: Flash-Adressierung während SPM (1)
Hinweis:
  1. Die verschiedenen Variablen im Bild 26-1 sind in Tabelle 28-11 gelistet.

26.2.1 EEPROM schreiben behindert Schreibzugriff auf SPMCSR

Man beachte, dass das Beschreiben des EEPROM alle Programmierungen des Flash blockiert. Das Lesen der Fuses und Sperrbits durch die Software ist ebenfalls während der Beschreibens des EEPROM nicht möglich. Es wird daher empfohlen, dass der Anwender überprüft, ob das Statusbit EEWE im EECR-Register gelöscht ist, bevor in das SPMCSR geschrieben wird.

26.2.2 Fuse- und Sperrbits lesen

Es ist möglich, sowohl die Fuses als auch die Sperrbits durch die Software auszulesen. Zum Lesen der Sperrbits wird das Zeigerregisterpaar Z mit 0x0001 geladen und die Bits BLBSET und SPMEN im SPMCSR gesetzt. Wenn innerhalb der nächsten drei Taktzyklen nach dem Setzen der beiden Bits ein LPM-Befehl ausgeführt wird, werden die Werte der Sperrbits in das LPM-Zielregister geladen. Die beiden Bits werden nach dem Ausführen des Befehls automatisch gelöscht oder dann, wenn innerhalb der Zeit kein LPM-Befehl ausgeführt wird. Wenn BLBSET und SPMEN gelöscht sind, arbeitet der LPM-Befehl wieder normal, so wie in der Befehlsübersicht beschrieben.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
Rd | - | - | - | - | - | - | LB2 | LB1

Das Auslesen der Low-Fuse ist mit dem Lesen der Sperrbits vergleichbar. Zum Lesen der Low-Fuse (Fuse-Low-Bits = FLB) wird das Zeigerregisterpaar Z mit 0x0000 geladen und die Bits BLBSET und SPMEN im SPMCSR gesetzt. Wenn innerhalb der nächsten drei Taktzyklen nach dem Setzen der beiden Bits ein LPM-Befehl ausgeführt wird, werden die Werte der Low-Fuse in das LPM-Zielregister geladen, wie nachfolgend dargestellt. Siehe Tabelle 28-9 zur Zuordnung der Bits der Low-Fuse.

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
Rd | FLB7 | FLB6 | FLB5 | FLB4 | FLB3 | FLB2 | FLB1 | FLB0

Vergleichbar wird zum Lesen der High-Fuse (Fuse-High-Bits = FHB) das Zeigerregisterpaar Z mit 0x0003 geladen und die Bits BLBSET und SPMEN im SPMCSR gesetzt. Wenn innerhalb der nächsten drei Taktzyklen nach dem Setzen der beiden Bits ein LPM-Befehl ausgeführt wird, werden die Werte der High-Fuse in das LPM-Zielregister geladen, wie nachfolgend dargestellt. Siehe Tabelle 28-7 zur Zuordnung der Bits der High-Fuse.

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
Rd | FHB7 | FHB6 | FHB5 | FHB4 | FHB3 | FHB2 | FHB1 | FHB0

Vergleichbar wird zum Lesen der Extended-Fuse (Extended-Fuse-Bits = EFB) das Zeigerregisterpaar Z mit 0x0002 geladen und die Bits BLBSET und SPMEN im SPMCSR gesetzt. Wenn innerhalb der nächsten drei Taktzyklen nach dem Setzen der beiden Bits ein LPM-Befehl ausgeführt wird, werden die Werte der Extended-Fuse in das LPM-Zielregister geladen, wie nachfolgend dargestellt. Siehe Tabelle 28-4 zur Zuordnung der Bits der Extended-Fuse.

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
Rd | - | - | - | - | - | - | - | EFB0

Programmierte Fuse- und Sperrbits werden als Null gelesen. Unprogrammierte Fuse- und Sperrbits werden als Eins gelesen.

26.2.3 Schreibfehler vermeiden

Wenn UCC zu niedrig ist, kann das Programmieren des Flash verderben, weil die Versorgungsspannung zu niedrig für ein korrektes Arbeiten der CPU und des Flash ist. Das gilt für alle Systeme mit Flash-Speicher.

Ein Verfälschen des Flash-Programmierens kann in zwei Situationen, in denen die Versorgungsspannung zu gering ist, begründet sein. Erstens benötigt ein regulärer Schreibvorgang eine Mindestspannung, um korrekt zu arbeiten. Zweitens kann die CPU selbst Befehle falsch ausführen, wenn die Versorgungsspannung zu gering ist.

Flash-Fehler können verhindert werden, wenn folgende Designregeln beachtet werden (eine genügt):

  1. Halten des AVR-Resets auf aktiv Low in Zeiten unzureichender Versorgungsspannung. Dies kann durch Freigabe des internen Unterspannungs-Detektors geschehen. Andernfalls kann eine externe Spannungsüberwachung eingesetzt werden. Wenn ein Reset auftritt, während ein Schreibvorgang läuft, so wird dieser Vorgang noch bis zum Ende ausgeführt, vorausgesetzt, die Spannungsversorgung ist noch ausreichend.
  2. Versetzen des AVR-Kerns in den Power-Down Sleep-Modus wenn UCC zu gering ist. Das schützt die CPU davor, Befehle zu dekodieren und auszuführen, woduch auch das SPMCSR geschützt wird und somit auch der Flash.

26.2.4 Programmierzeit für Flash-Speicher mittels SPM

Der kalibrierte RC-Oszillator regelt die Zeiten beim Flash-Zugriff. Nachfolgende Tabelle zeigt die typischen Programmierzeiten des Flash durch die CPU.
Tabelle 26-1: SPM-Programmierzeit(1)
Aktion | Minimale Programmierzeit | Maximale Programmierzeit
Flash schreiben (Seiten löschen, Seite schreiben, Sperrbits mittels SPM setzen) | 3,7 ms | 4,5 ms
Hinweis:
  1. Minimale und maximale Programmierzeit gelten für jede einzelne Operation.

26.2.5 Einfaches Assembler-Beispiel für einen Urlader

Beachte, dass das RWWSB-Bit im ATmega48 stets Null liest. Nichtsdestotrotz wird empfohlen, das Bit wie in den Kode-Beispielen zu überprüfen, damit die Software auch bei den größeren oder künftigen Chips mit Lesen-beim-Schreiben funktioniert.
    ;- Diese Routine schreibt eine Seite vom RAM zum Flash.
    ;   Die erste RAM-Speicherzelle wird durch Y adressiert.
    ;   Die erste Flash-Speicherzelle wird durch Z adressiert.
    ;- Fehlerbehandlung ist nicht dabei.
    ;- Verwendete Register: R0, R1, temp1 (R16), temp2 (R17), loop (R18), spmcrval (R19)
    ;  Retten und Siederherstellen (Push+Pop) ist hier nicht eingebaut.
    ;  Registerverbrauch kann gegen Kodegröße eingespart werden.
    ;- Es wird PAGESIZEB ≤ 256 für 8-Bit-Schleifenzähler vorausgesetzt.
.equ	PAGESIZEB = PAGESIZE*2	;PAGESIZEB = Seitengröße in BYTE, nicht in WORD
.org SMALLBOOTSTART
Write_page:
    ; Seite löschen
    ldi	spmcrval, (1<<PGERS) | (1<<SPMEN)
    rcall	Do_spm
    ; RWW-Bereich wiederherstellen (unnötig für ATmega48)
    ldi	spmcrval, (1<<RWWSRE) | (1<<SPMEN)
    rcall	Do_spm
    ; Daten vom RAM zum Flash-Seitenpuffer schaufeln
    ldi	loop, PAGESIZE		;Schleifenzähler initialisieren
Wrloop:
    ld	r0, Y+
    ld	r1, Y+
    ldi	spmcrval, (1<<SPMEN)
    rcall	Do_spm
    subi	ZL, -2			;= +2, ohne Überlauf zum High-Teil
    dec	loop
    brnz	Wrloop
    ; execute Page Write
    subi	ZL, PAGESIZEB		;Zeiger wiederherstellen
    ldi	spmcrval, (1<<PGWRT) | (1<<SPMEN)
    rcall	Do_spm
    ; re-enable the RWW section
    ldi	spmcrval, (1<<RWWSRE) | (1<<SPMEN)
    rcall	Do_spm
    ; read back and check, optional
    ldi	loop, PAGESIZEB		;Schleifenzähler initialisieren
    subi	YL, PAGESIZEB		;Zeiger wiederherstellen
    sbci	YH, 0
Rdloop:
    lpm	r0, Z+
    ld	r1, Y+
    cpse	r0, r1
    rjmp	Error			;Nicht gezeigte Fehlerbehandlung
    dec	loop
    brnz	Rdloop
    ; Rückkehr zum RWW-Bereich
Return:	; Warten bis RWW-Bereich bereit zum Lesen ist (unsinnig für ATmega48)
    in	temp1, SPMCSR
    sbrs	temp1, RWWSB
    ret
    ; RWW-Bereich wiederherstellen (unsinnig für ATmega48)
    ldi	spmcrval, (1<<RWWSRE) | (1<<SPMEN)
    rcall	Do_spm
    rjmp	Return

Do_spm:
    ; Warten bis vorheriges SPM fertig (unsinnig für ATmega48)
Wait_spm:
    in	temp1, SPMCSR
    sbrc	temp1, SPMEN
     rjmp	Wait_spm
    ; Warten bis evtl. EEPROM-Schreibzugriff fertig ist (Interrupts okay)
Wait_ee:
    sbic	EECR, EEPE
     rjmp	Wait_ee
    ; Eingabe: spmcrval legt SPM-Aktion fest
    ; Interrupts sperren, falls freigegeben, Zustand retten
    in	temp2, SREG
    cli
    ; Spezielle zeitabhängige SPM-Sequenz
    out	SPMCSR, spmcrval
    spm
    ; SREG wiederherstellen (Interrupts freigeben wenn vorher freigegeben)
    out	SREG, temp2
    ret

26.3 Register-Beschreibung

26.3.1 SPMCSR — SPM-Kontroll- und Statusregister

Das SPMCSR enthält Steuerbits, die benötigt werden, um die Urlader-Funktionen zu steuern.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x57) | SPMIE | RWWSB | SIGRD | RWWSRE | BLBSET | PGWRT | PGERS | SPMEN | SPMCSR
Zugriff | R/W | R | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7 — SPMIE: SPM-Interruptfreigabe
Wenn das SPMIE-Bit auf 1 gesetzt ist und das I-Bit im Statusregister gesetzt ist, wird der SPM-Fertig-Interrupt freigegeben. Der SPM-Fertig-Interrupt wird ausgeführt, sobald das SPMEN-Bit im SPMCSR (durch die Hardware) gelöscht ist.
Beim ATmega48 ist dieser Interrupt wegen der angehaltenen CPU recht zweckfrei.
  • Bit 6 — RWWSB: Lesen-beim-Schreiben-Bereich beschäftigt
Beim ATmega48 ist dieses Bit stets Null.
  • Bit 5 — SIGRD: Lesen der Signaturzeile
Mit diesem Bit kann man die Chip-Signatur (Herstellerkennung) sowie das RC-Oszillator-Werkskalibrierbyte auslesen. Siehe Signaturbytes lesen. Das Beschreiben mittels SPM ist wirkungslos und sollte wegen künftiger Erweiterungen unterlassen werden.
  • Bit 4 — RWWSRE: Lesen-beim-Schreiben-Bereich Lesefreigabe
Da der ATmega48 keine RWW- und NRWW-Bereiche hat, verbleibt mit diesem Bit nur eine Restfunktionalität: Wird dieses Bit während des Füllvorgangs gesetzt, wird der Puffer gelöscht.
  • Bit 3 — BLBSET: Urlader-Sperrbits setzen
Beim ATmega48 können damit die Fuse- und Sperrbits gelesen werden; er hat keine Urlader-Sperrbits. Siehe oben.
  • Bit 2 — PGWRT: Seite schreiben
Wenn dieses Bit gleichzeitig mit SPMEN auf Eins gesetzt wird, wird der nächste SPM-Befehl innerhalb von vier Taktzyklen das Beschreiben einer Seite mit den Daten, die im temporären Puffer gespeichert sind, starten. Die Seitenadresse wird aus dem oberen Teil des Registerpaars Z entnommen. Die Daten in R1 und R0 werden ignoriert. Das PGWRT-Bit wird, nachdem die Seite geschrieben wurde, automatisch gelöscht oder dann, wenn der SPM-Befehl nicht innerhalb der vier Taktzyklen ausgeführt wurde. Die CPU wird während des Schreibvorgangs angehalten.
  • Bit 1 — PGERS: Seite löschen
Wenn dieses Bit gleichzeitig mit SPMEN auf Eins gesetzt wird, wird der nächste SPM-Befehl innerhalb von vier Taktzyklen das Löschen einer Seite starten. Die Seitenadresse wird aus dem oberen Teil des Registerpaars Z entnommen. Die Daten in R1 und R0 werden ignoriert. Das PGERS-Bit wird automatisch gelöscht, wenn die Seite gelöscht wurde oder wenn innerhalb der nächsten vier Taktzyklen kein SPM-Befehl ausgeführt wurde. Die CPU wird während des Löschvorgangs angehalten.
  • Bit 0 — SPMEN: Freigabe des SPM-Befehls
Dieses Bit gibt die Ausführung eines SPM-Befehls innerhalb der nächsten vier Taktzyklen frei. Wenn es zusammen mit einem der Bits RWWSRE, BLBSET, PGWRT oder PGERS gesetzt wird, hat der folgende SPM-Befehl eine besondere Bedeutung, wie oben beschrieben. Wenn nur SPMEN allein auf Eins besetzt wird, wird der folgende SPM-Befehl die Werte, die in R1:R0 stehen, in den Seitenpuffer speichern, der durch den Registerpaar Z adressiert ist. Dabei wird das LSB von Z ignoriert. Das SPMEN-Bit wird automatisch gelöscht, wenn ein SPM-Befehl ausgeführt wurde, oder spätestens nach vier Taktzyklen. Während des Löschens und Schreibens einer Seite verbleibt das SPMEN-Bit so lange High, bis die Operation vollständig abgeschlossen ist.

Das Schreiben anderer Werte als 0b10001, 0b01001, 0b00101, 0b00011 oder 0b00001 in die unteren fünf Bits hat keine Auswirkungen.


Urlader-Unterstützung

27. Urlader-Unterstützung

Die Urlader-Unterstützung betrifft die Typen ATmega88, -168 und -328.

27.1 Features

  • Selbstprogrammierung mit Lesen-beim-Schreiben
  • Einstellbare Größe des Urlader-Bereichs
  • Hohe Sicherheit (Separate Urlader-Sperrbits für flexiblen Speicherschutz)
  • Separate Fuses für die Auswahl des Reset-Vektors
  • Optimierte Seitengröße
  • Effizienter Programmcode zum Programmieren
  • Effiziente Unterstützung des Lesen-beim-Schreiben

27.2 Übersicht

Die Urlader-Unterstützung des ATmega88/168/328 bietet einen echten Lesen-während-Schreiben-Selbstprogrammiermechanismus, der es ermöglicht, Programmcode durch den Mikrocontroller selbst laden zu lassen. Diese Eigenschaft erlaubt fexible Anwendungs-Updates, die durch den Controller selbst mit einem Boot-Loader Programm druchgeführt werden. Das Urlader-Programm kann alle verfügbaren Schnittstellen und die damit verbundenen Protokolle verwenden, um Programmcode zu lesen und diesen in den Flash-Speicher zu schreiben oder den Programmcode auszulesen.

Der Programmcode innerhalb des Urlader-Bereiches kann in den gesamten Flash schreiben, also auch in den Urlader-Bereich. Der Urlader kann sich daher selbst modifizieren oder auch sich selbst löschen, wenn er nicht mehr benötigt wird. Die Größe des Urlader-Bereichs wird mit zwei Fuses konfiguriert. Ferner hat der Urlader zwei separate Einstellungen von Sperrbits, die unabhängig voneinander gesetzt werden können. Dies gibt dem Anwender eine einzigartige Flexibilität bei der Auswahl verschiedener Schutzstufen.

27.3 Anwendungs- und Urlader-Bereiche im Flash

Der Flash-Speicher ist in zwei Hauptbereiche organisiert, dem Anwender- und den Urlader-Bereich, siehe Bild 27-2. Die Größe der beiden Bereiche wird mit den BOOTSZ-Fuses konfiguriert, siehe Tabelle 27-7. Beide Bereiche können unterschiedliche Schutzstufen haben, da sie verschiedene Sperrbits haben.

27.3.1 Anwender-Bereich

Der Anwender-Bereich ist der Bereich im Flash, in dem der Kode des Anwenderprogrammes gespeichert wird. Die Schutzstufe für den Anwender-Bereich kann durch die Anwendungs-Sperrbits (Sperrbits 0) eingestellt werden, siehe Tabelle 27-2. Das Anwenderprogramm selbst kann keinen Urlader-Programmkode speichern, da der SPM-Befehl im Anwender-Bereich ausgeschaltet ist.

27.3.2 Urlader-Bereich

Da der Anwender-Bereich zum Speichern des Anwendungsprogrammes vorgesehen ist, muss die Urlader-Software in den Urlader-Bereich gelegt werden, da nur hier der SPM-Befehl eine Programmierung des Flash durchführen kann. Der SPM-Befehl kann auf den gesamten Flash-Speicher zugreifen, also auch auf den Urlader-Bereich selbst. Die Schutzstufe für den Urlader-Bereich kann mit den Urlader-Sperrbits (Sperrbits 1) eingestellt werden, siehe Tabelle 27-3.

27.4 Lesen-beim-Schreiben- und Nicht-Lesen-beim-Schreiben-Bereich

Technischer Hintergrund: Flash-Speicher, genauer: seine Adressierungseinheit, ist nicht in der Lage, beim Zugriff auf „beschäftigte“ (gerade beim Löschen oder Programmieren) Sektoren bspw. aus einem Cache zu lesen. Auch kann nur maximal ein Sektor „beschäftigt“ sein. Damit ist beim Programmieren der Speicher komplett mit sich beschäftigt. Als grober zeitlicher Richtwert gelten allgemein 10 ms. Während dieser Zeit sind keine Lesezugriffe möglich, und die CPU würde so keine Befehle lesen können. Verschiedene Mikrocontroller-Architekturen gehen verschiedene Wege, mit diesem Problem umzugehen. Häufig wird die CPU angehalten. Damit erscheint der Controller für kurze Zeit tot. Von-Neumann-Architekturen können (nur) Kode aus dem RAM ausführen. Beispielsweise ist das Verhalten undefiniert, wenn irrtümlich Flash-Speicher gelesen wird. Undefiniert heißt, dass von falschen Daten über Programmabsturz bis zum Chip-Abbrand alles drin ist. Die AVR-Lösung für größere Controller ist die Einteilung des Flash-Speichers in zwei hinreichend getrennte Bereiche, sodass einer beschäftigt sein kann und der andere (zum Befehlslesen) funktionstüchtig bleibt. Die Aufteilung und die Zugriffsmöglichkeiten ist dabei ziemlich asymmetrisch ausgelegt.
Ob die CPU das Lesen während des Schreibens unterstützt oder ob die CPU angehalten wird, während die Urlader-Software updatet, ist davon abhängig, an welcher Adresse das Urlader-Programm steht. Genauso, wie der Flash wie oben beschrieben mit den BOOTSZ-Fuses in den Anwendngs- und Urlader-Bereich eingeteilt wird, wird der Flash auch in zwei feste Bereiche, nämlich den Lesen-beim-Schreiben- (RWW) und den Nicht-Lesen-beim-Schreiben-Bereich (NRWW) eingeteilt. Die Grenze zwischen dem RWW- und dem NRWW-Bereich ist der Tabelle 27-8 angegeben. Der Hauptunterschied zwischen den beiden Bereichen ist der folgende:
  • Wenn eine Seite innerhalb des RWW-Bereiches gelöscht oder geschrieben wird, kann der NRWW-Bereich während dieser Operation gelesen werden.
  • Wenn eine Seite innerhalb des NRWW-Bereiches gelöscht oder geschrieben wird, wird die CPU während dieser Operation angehalten.
Man beachte, dass die Anwendersoftware niemals Code lesen kann, der im RWW-Bereich steht, während die Urlader-Software arbeitet.(sic) Der Term „Lesen-beim-Schreiben-Bereich“ bezieht sich darauf, welcher Bereich gerade programmiert (d.h. gelöscht oder beschrieben) wird und nicht darauf, welcher Bereich gerade durch die Urlader-Software gelesen wird.

27.4.1 RWW — Lesen-beim-Schreiben

Während die Urlader-Software eine Seite im RWW-Bereich programmiert, ist es möglich, Kode aus dem Flash zu lesen, allerdings nur Kode, der im NRWW-Bereich steht. Während einer laufenden Programmierung muss die Software sicherstellen, dass nicht aus dem RWW-Bereich gelesen wird. Wenn die Software versucht, während der Programmierung Code aus dem RWW-Bereich zu lesen, so gerät die Software in einen undefinierten Zustand. Um dies zu verhindern, sollten alle Interrupts gesperrt oder in den Urlader-Bereich gelegt werden. Der Urlader-Bereich liegt immer im NRWW Bereich. Das RWW-Busy-Bit (RWWSB) im SPM-Steuerregister (SPMCSR) wird so lange als 1 gelesen, wie der RWW-Bereich für das Lesen blockiert ist. Nachdem eine Programmierung abgeschlossen ist, muss das RWWSB durch die Software gelöscht werden, bevor Code aus dem RWW Bereich gelesen wird. Siehe SPMCSR.

27.4.2 NRWW — Nicht-Lesen-beim-Schreiben

Der Code, der im NRWW-Bereich liegt, kann gelesen werden, während die Software eine Seite im RWW-Bereich programmiert. Wenn das Urlader-Programm eine Seite im NRWW-Bereich programmiert, wird die CPU für die Dauer des gesamten Lösch- oder Schreibvorganges angehalten.
Tabelle 27-1: Gleichzeitig Lesen und Programmieren — Ja oder nein?
Welchen Bereich adressiert der Zeiger Z beim Programmieren? | Welcher Bereich kann gelesen werden? | Ist die CPU angehalten? | Gleichzeitig Lesen und Programmieren?
RWW-Bereich | NRWW-Bereich | Nein | Ja
NRWW-Bereich | Keiner | Ja | Nein
Bild 27-1: Lesen-beim-Schreiben- und Nicht-Lesen-beim-Schreiben-Bereich
Bild 27-2: Speicherbereiche
Hinweis:
  1. Die Parameter im Bild sind in Tabelle 27-7 erklärt.

27.5 Urlader-Sperrbits

Wenn keine Urlader-Funktion benötigt wird, steht der gesamte Flash für das Anwenderprogramm zur Verfügung. Der Urlader hat zwei separate, unabhängige Einstellungen der Sperrbits. Dies ermöglicht dem Anwender eine einzigartige Flexibilität bei der Auswahl verschiedener Schutzstufen.

Der Anwender kann wählen:

  • Schutz des gesamten Flash vor einem Softwareupdate durch den Controller
  • Schutz des Urlader-Bereiches vor einem Softwareupdate durch den Controller
  • Schutz des Anwender-Bereiches vor einem Softwareupdate durch den Controller
  • Freigabe des gesamten Flash für ein Softwareupdate durch den Controller
Die nachfolgenden Tabellen geben weitere Details. Die Urlader-Sperrbits können durch die Software und im seriellen und parallelen Programmiermodus gesetzt werden. Das Löschen der Bits kann aber nur durch Löschen des gesamten Bausteins durchgeführt werden. Der generelle Schreibschutz (Sperrbit-Modus 2) beeinflusst nicht das Programmieren des Flash-Speichers mit einem SPM-Befehl. Ähnlich beeinflusst die generelle Lese/Schreibsperre (Sperrbit-Modus 3) nicht das Lesen oder Schreiben durch einen LPM- bzw. SPM-Befehl, wenn diese auftreten.
Tabelle 27-2: BLB0: Schutzstufen des Anwender-Bereichs(1)
BLB0-Modus | BLB02 | BLB01 | Schutzart
1 | 1 | 1 | Keine Einschränkung für SPM und LPM beim Zugriff auf den Anwender-Bereich
2 | 1 | 0 | Schreibschutz: SPM darf nicht in den Anwender-Bereich schreiben
3 | 0 | 0 | Vollschutz: SPM darf nicht in den Anwender-Bereich schreiben, und LPM darf nicht vom Urlader-Bereich aus den Anwender-Bereich lesen. Sofern Interruptvektoren im Urlader-Bereich platziert sind, sind Interrupts deaktiviert, wenn Kode aus dem Anwender-Bereich ausgeführt wird.
4 | 0 | 1 | Kopierschutz: LPM darf nicht vom Urlader-Bereich aus den Anwender-Bereich lesen. Sofern Interruptvektoren im Urlader-Bereich platziert sind, sind Interrupts deaktiviert, wenn Kode aus dem Anwender-Bereich ausgeführt wird.
Hinweis:
  1. „1“ bedeutet unprogrammiert, „0“ bedeutet programmiert
Tabelle 27-3: BLB1: Schutzstufen des Urlader-Bereichs(1)
BLB1-Modus | BLB12 | BLB11 | Schutzart
1 | 1 | 1 | Keine Einschränkung für SPM und LPM beim Zugriff auf den Urlader-Bereich
2 | 1 | 0 | Schreibschutz: SPM darf nicht in den Urlader-Bereich schreiben
3 | 0 | 0 | Vollschutz: SPM darf nicht in den Urlader-Bereich schreiben, und LPM darf nicht vom Anwender-Bereich aus den Urlader-Bereich lesen. Sofern Interruptvektoren im Anwender-Bereich platziert sind, sind Interrupts deaktiviert, wenn Kode aus dem Urlader-Bereich ausgeführt wird.
4 | 0 | 1 | Kopierschutz: LPM darf nicht vom Anwender-Bereich aus den Urlader-Bereich lesen. Sofern Interruptvektoren im Anwender-Bereich platziert sind, sind Interrupts deaktiviert, wenn Kode aus dem Urlader-Bereich ausgeführt wird.
Hinweis:
  1. „1“ bedeutet unprogrammiert, „0“ bedeutet programmiert

27.6 Aufruf des Urladers

Das Aufrufen des Urlader-Programmes kann durch einen JUMP- oder CALL-Befehl aus dem Anwenderprogramm heraus erfolgen. Dieser Anstoß kann durch ein bestimmtes Kommando erfolgen, das über das USART oder die SPI-Schnittstelle empfangen wurde. Alternativ kann die Urlader-Reset-Fuse so programmiert werden, dass der Reset-Vektor auf die Startadresse des Urlader-Bereiches zeigt. In diesem Fall wird das Urlader-Programm nach einem Reset gestartet. Nachdem der Programmcode der Applikation geladen ist, kann dieses Programm dann ausgeführt werden. Man beachte, dass die Fuses nicht durch die CPU selbst verändert werden können. Das bedeutet, dass, wenn die Urlader-Reset-Fuse programmiert ist, der Reset-Vektor immer in den Urlader-Bereich zeigt. Die Fuse kann nur über die serielle oder parallele Programmierung geändert werden.
Tabelle 27-4: Urlader-Reset-Fuse(1)
BOOTRST | Reset-Adresse
1 | Reset-Vektor = Anwendungs-Reset (Adresse 0x0000)
0 | Reset-Vektor = Urlader-Reset (Adresse siehe Tabelle 27-7)
Hinweis:
  1. „1“ bedeutet unprogrammiert, „0“ bedeutet programmiert

27.7 Adressierung beim Selbstprogrammieren

Das Zeigerregisterpaar Z wird zur Adressierung des SPM-Befehls benutzt (= impliziter Operand).

Bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8
ZH(R31) | Z15 | Z14 | Z13 | Z12 | Z11 | Z10 | Z9 | Z8
ZL(R30) | Z7 | Z6 | Z5 | Z4 | Z3 | Z2 | Z1 | Z0
 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0

Da der Flash-Speicher in Seiten organisiert ist (siehe Tabelle 28-11), kann man sich den Programmzähler in zwei Teile aufgeteilt vorgestellen. Die niederwertigen Bits addressieren ein 16-Bit-Wort in einer Seite, und der höherwertige Teil adressiert die Seite. Siehe Bild 27-3. Man beachte, das Seite-Löschen und Seite-Schreiben unabhängig adressiert werden. Daher muss die Software gleiche Adressen zum Seitenlöschen und Seitenschreiben sicherstellen. Eine Programmieroperation gestartet ist der Z-Zeiger wieder frei verwendbar.

Die einzige SPM-Operation, die nicht den Z-Zeiger verwendet, ist das Setzen von Sperrbits. In diesem Fall wird das Z-Registerpaar nicht verwendet. Für den LPM-Befehl wird Z (implizit oder explizit) zur Adressierung verwendet. Da dieser Befehl byteweise arbeitet, wird hierbei auch das LSB (Bit 0) von Z verwendet.

Bild 27-3: Flash-Adressierung während SPM (1)
Hinweis:
  1. Die verschiedenen Variablen im Bild 27-3 sind in Tabelle 28-11 gelistet.

27.8 Flash-Selbstprogrammierung

Der Programmspeicher wird Seite für Seite beschrieben und gelöscht. Bevor eine Seite mit den Daten, die in dem temporären Seitenpuffer geladen sind, programmiert wird, muss die Seite gelöscht werden. Der temporäre Seitenpuffer wird 16-bitweise mit dem SPM-Befehl gefüllt. Der Seitenpuffer kann sowohl vor dem Seitenlösch-Kommando als auch zwischen dem Seitenlösch-Kommando und dem Schreiben der Seite gefüllt werden.

Variante 1: Füllen des Puffers vor dem Löschen:

  • Füllen des temporären Seitenpuffers
  • Löschen der Seite
  • Schreiben der Seite
Variante 2: Füllen des Puffers zwischen dem Löschen und Schreiben:
  • Löschen der Seite
  • Füllen des temporären Seitenpuffers
  • Schreiben der Seite
Wenn nur ein Teil einer Seite verändert werden muss, muss der Rest der Seite vorher rückgelesen werden (z.B. im temporären Seitenpuffer), da vor dem Schreiben immer die gesamte Seite gelöscht wird. Wenn Variante 1 verwendet wird, bietet der Urloader echtes, byteweises Lesen-Verändern-Schreiben an. In dieser wird die Software zunächst die Seite lesen, dann die notwendigen Veränderungen durchführen und anschließend die modifizierten Daten zurückschreiben. Wenn Variante 2 verwendet wird, ist es nicht möglich, die alten Daten zu lesen, da die Seite bereits gelöscht wurde. Auf den temporären Seitenpuffer kann frei zugegriffen werden. Es ist wichtig, dass die Seitenadresse beim Löschen und Schreiben der Seite die gleiche Flash-Seite adressiert.

27.8.1 Seite löschen

Zum Löschen einer Seite wird die Seitenadresse im Zeigerregisterpaar Z hinterlegt, der Wert 0bx0000011 in das SPMCSR geschrieben und innerhalb von 4 Taktzyklen ein SPM-Befehl ausgeführt. Die Daten in R1 und R0 werden dabei ignoriert. Die Seitenadresse muss in den Bereich PCPAGE in Z geschrieben werden, die anderen Bits von Z werden bei dieser Operation ignoriert.
  • Seite im RWW-Bereich: Der NRWW-Bereich kann während des Löschens gelesen werden.
  • Seite im NRWW-Bereich: Die CPU wird für die Dauer des Löschens der Seite angehalten.

27.8.2 Zwischenpuffer füllen (Seite laden)

Zum Schreiben eines Befehlswortes wird die Adresse im Zeigerregisterpaar Z hinterlegt, die Daten in R1:R0 geschrieben, der Wert 0b00000001 in das SPMCSR geschrieben und innerhalb von vier Taktzyklen ein SPM-Befehl ausgeführt. Der PCWORD-Bereich von Z wird verwendet, um die Daten im temporären Puffer zu adressieren. Der temporäre Puffer wird automatisch nach dem Befehl Seite-Schreiben gelöscht, aber auch durch Beschreiben des RWWSRE Bits im SPMCSR. Er wird auch nach einem System-Reset gelöscht. Man beachte, dass es nicht möglich ist, mehr als einmal in eine Adresse zu schreiben, ohne dass der temporäre Puffer gelöscht wird.

Wenn der EEPROM mitten in einer Seitenlade-Operation beschrieben wird, gehen alle geladenen Daten verloren.

27.8.3 Seite Schreiben

Um das Schreiben einer Seite durchzuführen, wird die Adresse im Zeigerregisterpaar Z hinterlegt, der Wert 0bx000101 in das SPMCSR geschrieben und innerhalb von vier Taktzyklen ein SPM-Befehl ausgeführt. Die Daten in R1:R0 werden dabei ignoriert. Die Seitenadresse muss in dem Bereich PCPAGE von Z geschrieben werden, die anderen Bits von Z müssen während dieser Operation auf Null gesetzt sein.
  • Seite im RWW-Bereich: Der NRWW-Bereich kann während des Schreibens gelesen werden.
  • Seite im NRWW-Bereich: Die CPU wird für die Dauer des Schreibens angehalten.

27.8.4 SPM-Interrupt

Wenn der SPM-Interrupt freigegeben ist, wird permanent ein Interrupt angefordert, solange das SPMEN-Bit im SPMCSR gelöscht ist. Das bedeutet, dass der Interrupt verwendet werden kann, anstatt den Zustand des SPMCSR durch Softwarepolling abzufragen. Wenn der SPM-Interrupt verwendet wird, sollten die Interruptvektoren in den Urlader-Bereich gelegt werden, um zu verhindern, dass der Interrupt auf den RWW-Bereich zugreift, während dieser blockiert ist. Siehe Interrupts.

27.8.5 Überlegungen beim Update des Urladers

Besondere Vorsicht ist angeraten, wenn durch entsprechende Konfiguration der Urlader-Sperrbits möglich ist, den Urlader-Bereich zu überschreiben. Ein schreibender Zugriff des Urladers auf sich selbst kann den gesamten Urlader unbrauchbar und somit zukünftige Softwareupdates unmöglich machen. Wenn es demnach nicht erforderlich ist, dass der Urlader sich selbst aktualisiert, sollte das Urlader-Sperrbit 11 (Schreibschutz) programmiert werden, um die Urlader-Software vor Änderungen zu schützen.

27.8.6 RWW-Lesen verhindern beim Programmieren

Während der Selbstprogrammierung (sowohl Seite löschen als auch schreiben) ist der RWW-Bereich für Lesezugriffe gesperrt. Die Anwendersoftware selbst muss verhindern, dass dieser Bereich während einer Selbstprogrammierung angesprochen werden kann. Das RWWSB-Bit im SPMCSR ist so lange gesetzt, wie der RWW-Bereich blockiert ist. Während der Selbstprogrammierung sollten die Interruptvektoren in den Urlader Bereich gelegt werden, siehe Watchdog, oder die Interrupts generell gesperrt sein. Bevor auf den RWW-Bereich zugegriffen wird, nachdem eine Programmierung abgeschlossen ist, muss die Software das RWWSB-Bit durch Beschreiben des RWWSRE wieder löschen. Siehe Programmbeispiel.

27.8.7 Sperrbits setzen

Zum Setzen der Urlader Sperrbits wird der erforderliche Wert in R0 geschrieben, der Wert 0bx0001001 in das SPMCSR geschrieben und innerhalb von vier Taktzyklen ein SPM-Befehl ausgeführt.

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
R0 | 1 | 1 | BLB12 | BLB11 | BLB02 | BLB01 | LB2 | LB1

Siehe Tabelle 27-2 und Tabelle 27-3, wie die verschiedenen BLB-Bits wirken.

Werden die Bits 5:0 in R0 auf Null gesetzt, werden die entsprechenden Sperrbits gesetzt, wenn BLBSET und SPMEM im SPMCSR gesetzt wurden und innerhalb von vier Takten SPM ausgeführt wird. Der Z-Zeiger wird dabei nicht verwendet. Für künftige Kompatibilität sollte Z auf 0x0001 gesetzt werden, genauso wie zum Lesen der IOCK-Bits. Außerdem sind die Bits 7 und 6 in R0 wie oben angegeben auf „1“ gesetzt sein. Während des Programmierens der Sperrbits bleibt der gesamte Flash-Speicher ungesperrt zum Lesen.

27.8.8 EEPROM schreiben behindert Schreibzugriff auf SPMCSR

Man beachte, dass das Beschreiben des EEPROM alle Programmierungen des Flash blockiert. Das Lesen der Fuses und Sperrbits durch die Software ist ebenfalls während der Beschreibens des EEPROM nicht möglich. Es wird daher empfohlen, dass der Anwender überprüft, ob das Statusbit EEWE im EECR Register gelöscht ist, bevor in das SPMCSR geschrieben wird.

27.8.9 Fuse- und Sperrbits lesen

Es ist möglich, sowohl die Fuses als auch die Sperrbits durch die Software auszulesen. Zum Lesen der Sperrbits wird der Z-Zeiger mit 0x0001 geladen und die Bits BLBSET und SPMEN im SPMCSR gesetzt. Wenn innerhalb der nächsten drei Taktzyklen nach dem Setzen der beiden Bits ein LPM-Befehl ausgeführt wird, werden die Werte der Sperrbits in das Zielregister geladen. Die beiden Bits werden nach dem Ausführen des Befehls oder Zeitüberschreitung automatisch gelöscht. Wenn BLBSET und SPMEN gelöscht sind, arbeitet der LPM-Befehl wieder normal, so wie in der Befehlsübersicht beschrieben.

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
Rn | 1 | 1 | BLB12 | BLB11 | BLB02 | BLB01 | LB2 | LB1

Das Auslesen der Low-Fuse ist mit dem Lesen der Sperrbits vergleichbar. Zum Lesen der Low-Fuse, wird der Z-Pointer mit 0x0000 geladen und die Bits BLBSET und SPMEN im SPMCSR gesetzt. Wenn innerhalb der nächsten drei Taktzyklen nach dem Setzen der beiden Bits ein LPM-Befehl ausgeführt wird, wird die Low-Fuse in das Zielregister geladen, wie nachfolgend dargestellt. Siehe Tabelle 28-9 zur Zuordnung der Fuse-Bits.

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
Rn | CKDIV8 | CKOUT | SUT1 | SUT0 | CKSEL3 | CKSEL2 | CKSEL1 | CKSEL0

Ebenso wird zum Lesen der High-Fuse der Z-Pointer mit 0x0003 geladen. Wenn innerhalb der nächsten drei Taktzyklen nach dem Setzen der Bits BLBSET und SPMEN im SPMCSR ein LPM-Befehl ausgeführt wird, wird die High-Fuse in das Zielregister geladen, wie nachfolgend dargestellt. Siehe Tabelle 28-7 zur Zuordnung der Fuse-Bits.

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
Rn | RSTDISBL | DWEN | SPIEN | WDTON | EESAVE | BODLEVEL2 BOOTSZ1 | BODLEVEL1 BOOTSZ0 | BODLEVEL0 BOOTRST | ATmega48/88/168 ATmega328

Zum Lesen der Erweiterten Fuse wird der Z-Pointer mit 0x0002 geladen. Wenn innerhalb der nächsten drei Taktzyklen nach dem Setzen der Bits BLBSET und SPMEN im SPMCSR ein LPM-Befehl ausgeführt wird, wird die Erweiterte Fuse in das Zielregister geladen, wie nachfolgend dargestellt. Siehe Tabelle 28-5 zur Zuordnung der Fuse-Bits.

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
Rn | - | - | - | - | - | BOOTSZ1 BODLEVEL2 | BOOTSZ0 BODLEVEL1 | BOOTRST BODLEVEL0 | ATmega48/88/168 ATmega328

Fuse- und Sperrbits, die programmiert sind, werden als Null gelesen. Bits, die unprogrammiert sind, werden als Eins gelesen.

27.8.10 Signaturbytes lesen

Zum Auslesen der Signaturzeile wird der Z-Zeiger mit der Adresse laut Tabelle 27-5 geladen und die Bits SIGRD und SPMEN im SPMCSR gesetzt. Wenn innerhalb der nächsten drei Taktzyklen nach dem Setzen der beiden Bits ein LPM-Befehl ausgeführt wird, wird der Wert des Signaturbytes in das Zielregister geladen. Die beiden Bits werden nach dem Ausführen des Befehls oder Zeitüberschreitung automatisch gelöscht. Wenn BLBSET und SPMEN gelöscht sind, arbeitet der LPM-Befehl wieder normal, so wie in der Befehlsübersicht beschrieben.
Tabelle 27-5: Adressierung der Signaturzeile
Signaturbyte | Adresse im Z-Zeiger
Signaturbyte 1 | 0x0000
Signaturbyte 2 | 0x0002
Signaturbyte 3 | 0x0004
Kalibrierbyte für RC-Oszillator | 0x0001
Hinweis:
  1. Alle anderen Adressen sind reserviert

27.8.11 Schreibfehler vermeiden

Wenn UCC zu niedrig ist, kann der Inhalt des Flash-Speichers undefiniert sein, weil die Speisespannung für ein korrektes Arbeiten der CPU und/oder des Flash ist zu niedrig ist. Das gilt gleichermaßen auch für Systeme mit externem Flash-Speicher.

Ein falscher Flash-Speicherinhalt kann durch zwei Ursachen entstehen, in denen die Speisespannung zu gering ist. Erstens benötigt ein regulärer Schreibvorgang in den Flash eine Mindestspannung um korrekt zu arbeiten. Zweitens kann die CPU selbst Befehle falsch ausführen, wenn die Speisespannung zu gering ist.

Flash-Fehler können verhindert werden, wenn folgende Designregeln beachtet werden (eine genügt):

  1. Wenn kein Urlader-Update im System benötigt wird, sollten die entsprechenden Sperrbits programmiert werden um den Urlader vor Änderungen zu schützen.
  2. Zu Zeiten unzureichender Speisespannung kann die CPU im Reset gehalten werden. Dies kann durch Aktivierung des internen Unterspannungsdetektors geschehen. Oder es kann eine externe Spannungsüberwachung eingesetzt werden, die den Mikrocontroller per Low-Pegel am Reset-Eingang anhält. Wenn ein Reset auftritt, während ein Schreibvorgang läuft, so wird dieser Vorgang noch bis zum Ende ausgeführt, vorausgesetzt, die Speisespannung ist dafür noch ausreichend.
  3. Zu Zeiten unzureichender Speisespannung kann die CPU im Leistung-Weg-Modus gehalten werden. Das schützt die CPU davor, Befehle zu dekodieren und auszuführen, woduch auch das SPMCSR geschützt wird und somit auch der Flash.

27.8.12 Programmierzeiten

Der kalibrierte RC-Oszillator legt die Zugriffzeiten für den Flash fest. Nachfolgende Tabelle zeigt die typischen Programmierzeiten des Flash durch die CPU.
Tabelle 27-6: Programmierzeiten mit dem SPM-Befehl(1)
Aktion | Min. Programmierzeit | Max. Programmierzeit
Flash schreiben (Seite löschen, Seite schreiben, Sperrbits schreiben) | 3,7 ms | 4,5 ms
Hinweis:
  1. Minimale und maximale Zeit sind individuell für jeden einzelnen SPM-Befehl

27.8.13 Einfaches Assembler-Beispiel für einen Urlader

    ;- Diese Routine schreibt eine Seite vom RAM zum Flash.
    ;   Die erste RAM-Speicherzelle wird durch Y adressiert.
    ;   Die erste Flash-Speicherzelle wird durch Z adressiert.
    ;- Fehlerbehandlung ist nicht dabei.
    ;- Verwendete Register: R0, R1, temp1 (R16), temp2 (R17), loop (R18), spmcrval (R19)
    ;  Retten und Siederherstellen (Push+Pop) ist hier nicht eingebaut.
    ;  Registerverbrauch kann gegen Kodegröße eingespart werden.
    ;- Es wird PAGESIZEB ≤ 256 für 8-Bit-Schleifenzähler vorausgesetzt.
.equ	PAGESIZEB = PAGESIZE*2	;PAGESIZEB = Seitengröße in BYTE, nicht in WORD
.org SMALLBOOTSTART
Write_page:
    ; Seite löschen
    ldi	spmcrval, (1<<PGERS) | (1<<SPMEN)
    rcall	Do_spm
    ; RWW-Bereich wiederherstellen
    ldi	spmcrval, (1<<RWWSRE) | (1<<SPMEN)
    rcall	Do_spm
    ; Daten vom RAM zum Flash-Seitenpuffer schaufeln
    ldi	loop, PAGESIZE		;Schleifenzähler initialisieren
Wrloop:
    ld	r0, Y+
    ld	r1, Y+
    ldi	spmcrval, (1<<SPMEN)
    rcall	Do_spm
    subi	ZL, -2			;= +2, ohne Überlauf zum High-Teil
    dec	loop
    brnz	Wrloop
    ; execute Page Write
    subi	ZL, PAGESIZEB		;Zeiger wiederherstellen
    ldi	spmcrval, (1<<PGWRT) | (1<<SPMEN)
    rcall	Do_spm
    ; re-enable the RWW section
    ldi	spmcrval, (1<<RWWSRE) | (1<<SPMEN)
    rcall	Do_spm
    ; read back and check, optional
    ldi	loop, PAGESIZEB		;Schleifenzähler initialisieren
    subi	YL, PAGESIZEB		;Zeiger wiederherstellen
    sbci	YH, 0
Rdloop:
    lpm	r0, Z+
    ld	r1, Y+
    cpse	r0, r1
    rjmp	Error			;Nicht gezeigte Fehlerbehandlung
    dec	loop
    brnz	Rdloop
    ; Rückkehr zum RWW-Bereich
Return:	; Warten bis RWW-Bereich bereit zum Lesen ist
    in	temp1, SPMCSR
    sbrs	temp1, RWWSB
    ret
    ; RWW-Bereich wiederherstellen
    ldi	spmcrval, (1<<RWWSRE) | (1<<SPMEN)
    rcall	Do_spm
    rjmp	Return

Do_spm:
    ; Warten bis vorheriges SPM fertig
Wait_spm:
    in	temp1, SPMCSR
    sbrc	temp1, SPMEN
     rjmp	Wait_spm
    ; Warten bis evtl. EEPROM-Schreibzugriff fertig ist (Interrupts okay)
Wait_ee:
    sbic	EECR, EEPE
     rjmp	Wait_ee
    ; Eingabe: spmcrval legt SPM-Aktion fest
    ; Interrupts sperren, falls freigegeben, Zustand retten
    in	temp2, SREG
    cli
    ; Spezielle zeitabhängige SPM-Sequenz
    out	SPMCSR, spmcrval
    spm
    ; SREG wiederherstellen (Interrupts freigeben wenn vorher freigegeben)
    out	SREG, temp2
    ret

27.8.14 Urlader-Parameter für ATmega88

Die nachfolgenden Tabellen zeigen die Parameter, die in der Beschreibung der Selbstprogrammierung erwähnt wurden.
Tabelle 27-7: Konfiguration der Größe des Bootbereichs
BOOTSZ1 | BOOTSZ0 | Boot Size | Seiten | Anwender-Bereich | Boot-Bereich | Ende des Anwender-Bereichs | Boot-Reset-Adresse (=Anfang Boot-Bereich)
1 | 1 | 128 Word | 4 | 0x000 - 0xF7F | 0xF80 - 0xFFF | 0xF7F | 0xF80
1 | 0 | 256 Word | 8 | 0x000 - 0xEFF | 0xF00 - 0xFFF | 0xEFF | 0xF00
0 | 1 | 512 Word | 16 | 0x000 - 0xDFF | 0xE00 - 0xFFF | 0xDFF | 0xE00
0 | 0 | 1024 Word | 32 | 0x000 - 0xBFF | 0xC00 - 0xFFF | 0xBFF | 0xC00
Hinweis:
  1. Die verschiedenen BOOTSZ-Fuse-Bits sind im Bild 27-2 zu sehen.
Tabelle 27-8: Grenze des RWW- und NRWW-Bereichs
Bereich | Seiten | Adress-Bereich
Lesen-beim-Schreiben (Read-While-Write = RWW) | 96 | 0x000 - 0xBFF
Nicht-lesen-beim-Schreiben (No Read-While-Write = NRWW) | 32 | 0xC00 - 0xFFF
Details zu RWW- und NRWW-Bereichen sind bereits erläutert.
Man beachte, dass die Bereichsaufteilung nur mit der größten Bootbereichsgröße von 2 KByte korelliert.
Tabelle 27-9: Erläuterungen der verschiedenen Variablen in Bild 27-3 und die Verbindung zum Z-Zeiger
Variable |  | Entsprechende Z-Bits(1) | Beschreibung
PCMSB | 11 |  | Höchstwertiges Bit im Programmzähler. (Der Programmzähler ist 12 Bit breit = PC[11:0])
PAGEMSB | 4 |  | Höchstwertiges Bit, welches Worte innerhalb einer Page adressiert. 32 Word per Seite erfordern 5 Bits des Programmzählers = PC[4:0].
ZPCMSB |  | Z12 | Bit in Z-Register, welches auf PCMSB gemappt ist. Weil Z0 ungenutzt ist, ist ZPCMSB gleich PCMSB + 1.
ZPAGEMSB |  | Z5 | Bit in Z-Register, welches auf PAGEMSB gemappt ist. Weil Z0 ungenutzt ist, ist ZPAGEMSB gleich PAGEMSB + 1.
PCPAGE | PC[11:5] | Z12:Z6 | Programmzähler-Seitenadresse: Seitenauswahl, fürs Seiten-Löschen und Seiten-Schreiben
PCWORD | PC[4:0] | Z5:Z1 | Programmzähler Word-Adresse: Word-Auswahl, um den Zwischenpuffer zu füllen; muss Null sein beim Seiten-Schreiben
Hinweis:
  1. Bits Z15:Z13 werden ignoriert.
    Bit Z0 ist Byte-Auswahl beim LPM-Befehl und sollte für alle SPM-Befehle stets Null sein. Siehe „Adressierung des Flash-Speichers beim Selbst-Programmieren” zur der Verwendung des Z-Zeigers beim SPM-Befehl.

27.8.15 Urlader-Parameter für ATmega168

Die nachfolgenden Tabellen zeigen die Parameter, die in der Beschreibung der Selbstprogrammierung erwähnt wurden.
Tabelle 27-10: Konfiguration der Größe des Bootbereichs
BOOTSZ1 | BOOTSZ0 | Boot Size | Seiten | Anwender-Bereich | Boot-Bereich | Ende des Anwender-Bereichs | Boot-Reset-Adresse (=Anfang Boot-Bereich)
1 | 1 | 128 Word | 2 | 0x0000 - 0x1F7F | 0x1F80 - 0x1FFF | 0x1F7F | 0x1F80
1 | 0 | 256 Word | 4 | 0x0000 - 0x1EFF | 0x1F00 - 0x1FFF | 0x1EFF | 0x1F00
0 | 1 | 512 Word | 8 | 0x0000 - 0x1DFF | 0x1E00 - 0x1FFF | 0x1DFF | 0x1E00
0 | 0 | 1024 Word | 16 | 0x0000 - 0x1BFF | 0x1C00 - 0x1FFF | 0x1BFF | 0x1C00
Hinweis:
  1. Die verschiedenen BOOTSZ-Fuse-Bits sind im Bild 27-2 zu sehen.
Tabelle 27-11: Grenze des RWW- und NRWW-Bereichs
Bereich | Seiten | Adress-Bereich
Lesen-beim-Schreiben (Read-While-Write = RWW) | 112 | 0x0000 - 0x1BFF
Nicht-lesen-beim-Schreiben (No Read-While-Write = NRWW) | 16 | 0x1C00 - 0x1FFF
Details zu RWW- und NRWW-Bereichen sind bereits erläutert.
Man beachte, dass die Bereichsaufteilung nur mit der größten Bootbereichsgröße von 2 KByte korelliert.
Tabelle 27-12: Erläuterungen der verschiedenen Variablen in Bild 27-3 und die Verbindung zum Z-Zeiger
Variable |  | Entsprechende Z-Bits(1) | Beschreibung
PCMSB | 12 |  | Höchstwertiges Bit im Programmzähler. (Der Programmzähler ist 13 Bit breit = PC[12:0])
PAGEMSB | 5 |  | Höchstwertiges Bit, welches Worte innerhalb einer Page adressiert. 64 Word per Seite erfordern 6 Bits des Programmzählers = PC[5:0].
ZPCMSB |  | Z13 | Bit in Z-Register, welches auf PCMSB gemappt ist. Weil Z0 ungenutzt ist, ist ZPCMSB gleich PCMSB + 1.
ZPAGEMSB |  | Z6 | Bit in Z-Register, welches auf PAGEMSB gemappt ist. Weil Z0 ungenutzt ist, ist ZPAGEMSB gleich PAGEMSB + 1.
PCPAGE | PC[12:6] | Z13:Z7 | Programmzähler-Seitenadresse: Seitenauswahl, fürs Seiten-Löschen und Seiten-Schreiben
PCWORD | PC[5:0] | Z6:Z1 | Programmzähler Word-Adresse: Word-Auswahl, um den Zwischenpuffer zu füllen; muss Null sein beim Seiten-Schreiben
Hinweis:
  1. Bits Z15:Z14 werden ignoriert.
    Bit Z0 ist Byte-Auswahl beim LPM-Befehl und sollte für alle SPM-Befehle stets Null sein. Siehe „Adressierung des Flash-Speichers beim Selbst-Programmieren” zur der Verwendung des Z-Zeigers beim SPM-Befehl.

27.8.16 Urlader-Parameter für ATmega328

Die nachfolgenden Tabellen zeigen die Parameter, die in der Beschreibung der Selbstprogrammierung erwähnt wurden.
Tabelle 27-13: Konfiguration der Größe des Bootbereichs
BOOTSZ1 | BOOTSZ0 | Boot Size | Seiten | Anwender-Bereich | Boot-Bereich | Ende des Anwender-Bereichs | Boot-Reset-Adresse (=Anfang Boot-Bereich)
1 | 1 | 256 Word | 4 | 0x0000 - 0x3EFF | 0x3F00 - 0x3FFF | 0x3EFF | 0x3F00
1 | 0 | 512 Word | 8 | 0x0000 - 0x3DFF | 0x3E00 - 0x3FFF | 0x3DFF | 0x3E00
0 | 1 | 1024 Word | 16 | 0x0000 - 0x3BFF | 0x3C00 - 0x3FFF | 0x3BFF | 0x3C00
0 | 0 | 2048 Word | 32 | 0x0000 - 0x37FF | 0x3800 - 0x3FFF | 0x37FF | 0x3800
Hinweis:
  1. Die verschiedenen BOOTSZ-Fuse-Bits sind im Bild 27-2 zu sehen.
Tabelle 27-14: Grenze des RWW- und NRWW-Bereichs
Bereich | Seiten | Adress-Bereich
Lesen-beim-Schreiben (Read-While-Write = RWW) | 224 | 0x0000 - 0x37FF
Nicht-lesen-beim-Schreiben (No Read-While-Write = NRWW) | 32 | 0x3800 - 0x3FFF
Details zu RWW- und NRWW-Bereichen sind bereits erläutert.
Man beachte, dass die Bereichsaufteilung nur mit der größten Bootbereichsgröße von 4 KByte korelliert.
Tabelle 27-15: Erläuterungen der verschiedenen Variablen in Bild 27-3 und die Verbindung zum Z-Zeiger
Variable |  | Entsprechende Z-Bits(1) | Beschreibung
PCMSB | 13 |  | Höchstwertiges Bit im Programmzähler. (Der Programmzähler ist 14 Bit breit = PC[13:0])
PAGEMSB | 5 |  | Höchstwertiges Bit, welches Worte innerhalb einer Page adressiert. 64 Word per Seite erfordern 6 Bits des Programmzählers = PC[5:0].
ZPCMSB |  | Z14 | Bit in Z-Register, welches auf PCMSB gemappt ist. Weil Z0 ungenutzt ist, ist ZPCMSB gleich PCMSB + 1.
ZPAGEMSB |  | Z6 | Bit in Z-Register, welches auf PAGEMSB gemappt ist. Weil Z0 ungenutzt ist, ist ZPAGEMSB gleich PAGEMSB + 1.
PCPAGE | PC[13:6] | Z14:Z7 | Programmzähler-Seitenadresse: Seitenauswahl, fürs Seiten-Löschen und Seiten-Schreiben
PCWORD | PC[5:0] | Z6:Z1 | Programmzähler Word-Adresse: Word-Auswahl, um den Zwischenpuffer zu füllen; muss Null sein beim Seiten-Schreiben
Hinweis:
  1. Bit Z15 wird ignoriert.
    Bit Z0 ist Byte-Auswahl beim LPM-Befehl und sollte für alle SPM-Befehle stets Null sein. Siehe „Adressierung des Flash-Speichers beim Selbst-Programmieren” zur der Verwendung des Z-Zeigers beim SPM-Befehl.

27.9 Register-Beschreibung

27.9.1 SPMCSR — SPM-Kontroll- und Statusregister

Das SPMCSR enthält Steuerbits, die benötigt werden, um die Urlader-Funktionen zu steuern.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
(0x57) | SPMIE | RWWSB | SIGRD | RWWSRE | BLBSET | PGWRT | PGERS | SPMEN | SPMCSR
Zugriff | R/W | R | R/W | R/W | R/W | R/W | R/W | R/W
Startwert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  • Bit 7 — SPMIE: SPM-Interruptfreigabe
Wenn das SPMIE-Bit auf 1 gesetzt ist und das I-Bit im Statusregister gesetzt ist, wird der SPM-Fertig-Interrupt freigegeben. Der SPM-Fertig-Interrupt wird ausgeführt, sobald das SPMEN-Bit im SPMCSR (durch die Hardware) gelöscht ist.
  • Bit 6 — RWWSB: Lesen-beim-Schreiben-Bereich beschäftigt
Wenn eine Selbstprogrammieroperation (Löschen oder Schreiben) in dem RWW-Bereich gestartet wird, wird das Bit durch die Hardware auf 1 gesetzt. Solange das RWWSB-Bit gesetzt ist, kann nicht auf den RWW-Bereich zugegriffen werden. Das RWWSB-Bit wird gelöscht, indem das RWWSRE Bit auf 1 gesetzt wird, nachdem der Selbstprogrammierungs-vorgang abgeschlossen ist. Alternativ wird das RWWSB-Bit automatisch gelöscht, wenn mit dem Laden einer Seite begonnen wird.
  • Bit 5 — SIGRD: Lesen der Signaturzeile
Ein LPM-Befehl innerhalb von drei Taktzyklen nach dem Setzen der Bits SIGRD und SPMEN liest ein Byte aus der Signaturzeile (Herstellerkennung) oder das RC-Oszillator-Werkskalibrierbyte, abhängig vom Inhalt des Z-Zeigers, in ein Zielregister. Siehe „Signaturbytes lesen“. Das Beschreiben mittels SPM ist wirkungslos und sollte wegen künftiger Erweiterungen unterlassen werden.
  • Bit 4 — RWWSRE: Lesen-beim-Schreiben-Bereich Lesefreigabe
Wenn eine Programmierung des RWW Bereiches erfolgt (Seite löschen oder schreiben) ist den RWW-Bereich für das Lesen gesperrt (das RWWSB Bit wird durch die Hardware gesetzt). Um die RWW Sektion wieder freizugeben muss die Software warten, bis der Programmiervorgang abgeschlossen ist (SPMEN wird gelöscht). Dann, wenn das RWWSRE-Bit zur gleichen Zeit wie das SPMEN Bit mit einer 1 beschrieben wird, gibt der nächste SPM Befehl innerhalb von vier Taktzyklen den RWW-Bereich wieder frei. Der RWW-Bereich kann nicht wieder freigegeben werden, während der Flash mit dem Löschen oder Schreiben einer Seite beschäftigt ist (SPMEN ist gesetzt). Wenn das RWWSRE Bit beschrieben wird, während der Flash geladen wird, wird die Flash-Operation abgebrochen und die zu ladenden Daten gehen verloren.
  • Bit 3 — BLBSET: Urlader-Sperrbits setzen
Wenn dieses Bit zur gleichen Zeit wie das SPMEN-Bit auf Eins gesetzt wird, wird der nächste SPM-Befehl innerhalb von vier Taktzyklen die Urlader-Sperrbits mit den Daten einstellen, die in R0 stehen. Die Daten in R1 und die Adresse im Z-Pointer werden ignoriert. Das BLBSET-Bit wird automatisch gelöscht, wenn die Einstellung der Urlader-Sperrbits erfolgte oder wenn der SPM Befehl nicht innerhalb der vier Taktzyklen ausgeführt wird.

Ein LPM-Befehl innerhalb von drei Taktzyklen nach dem Setzen der Bits BLBSET und SPMEN liest entweder die Sperr- oder die Fuse-Bits (abhängig von Z0 des Z-Zeigers) in ein Zielregister. Siehe Lesen der Fuse- und Sperrbits.

  • Bit 2 — PGWRT: Seite schreiben
Wenn dieses Bit zur gleichen Zeit wie das SPMEN-Bit auf Eins gesetzt wird, wird der nächste SPM-Befehl innerhalb von vier Taktzyklen das Beschreiben einer Seite mit den Daten, die im temporären Buffer gespeichert sind, starten. Die Seitenadresse wird aus dem oberen Teil des Registerpaars Z entnommen. Die Daten in R1 und R0 werden ignoriert. Das PGWRT-Bit wird, nachdem die Seite geschrieben wurde automatisch gelöscht oder dann, wenn der SPM-Befehl nicht innerhalb der vier Taktzyklen ausgeführt wurde. Die CPU wird angehalten, wenn ein Schreibvorgang in dem NRWW-Bereich durchgeführt wird.
  • Bit 1 — PGERS: Seite löschen
Wenn dieses Bit gleichzeitig mit SPMEN auf Eins gesetzt wird, wird der nächste SPM-Befehl innerhalb von vier Taktzyklen das Löschen einer Seite starten. Die Seitenadresse wird aus dem oberen Teil des Registerpaars Z entnommen. Die Daten in R1 und R0 werden ignoriert. Das PGERS-Bit wird automatisch gelöscht, wenn die Seite gelöscht wurde oder wenn innerhalb der nächsten vier Taktzyklen kein SPM-Befehl ausgeführt wurde. Die CPU wird angehalten, wenn ein Löschvorgang in dem NRWW-Bereich durchgeführt wird.
  • Bit 0 — SPMEN: Freigabe des SPM-Befehls
Dieses Bit gibt die Ausführung eines SPM-Befehls innerhalb der nächsten vier Taktzyklen frei. Wenn es zusammen mit einem der Bits RWWSRE, BLBSET, PGWRT oder PGERS gesetzt wird, hat der folgende SPM-Befehl eine besondere Bedeutung, wie oben beschrieben. Wenn nur SPMEN allein auf Eins besetzt wird, wird der folgende SPM-Befehl die Werte, die in R1:R0 stehen, in den Seitenpuffer speichern, der durch den Registerpaar Z adressiert ist. Dabei wird das LSB von Z ignoriert. Das SPMEN-Bit wird automatisch gelöscht, wenn ein SPM-Befehl ausgeführt wurde, oder spätestens nach vier Taktzyklen. Während des Löschens und Schreibens einer Seite verbleibt das SPMEN-Bit so lange High, bis die Operation vollständig abgeschlossen ist.

Das Schreiben anderer Werte als 0b10001, 0b01001, 0b00101, 0b00011 oder 0b00001 in die unteren fünf Bits hat keine Auswirkungen.


Programmierung des Speichers

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-Name | Bitnummer | Beschreibung | Vorgabe
 | 7 | – | 1 (unprogrammiert)
 | 6 | – | 1 (unprogrammiert)
BLB12(2) | 5 | Urlader-Sperrbit | 1 (unprogrammiert)
BLB11(2) | 4 | Urlader-Sperrbit | 1 (unprogrammiert)
BLB02(2) | 3 | Urlader-Sperrbit | 1 (unprogrammiert)
BLB01(2) | 2 | Urlader-Sperrbit | 1 (unprogrammiert)
LB2 | 1 | Sperrbit | 1 (unprogrammiert)
LB1 | 0 | Sperrbit | 1 (unprogrammiert)
Hinweise:
  1. „1“ bedeutet unprogrammiert, „0“ bedeutet programmiert
  2. Nur bei ATmega88/168/328
Tabelle 28-2: Sperrbit-Schutzmodi(1) (2)
Speicher-Sperrbits |  |  | Schutzart
LB-Modus | LB2 | LB1 |
1 | 1 | 1 | Kein Speicherschutz aktiviert
2 | 1 | 0 | Schreibschutz: 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)
3 | 0 | 0 | Kopierschutz: 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-Modus | BLB02 | BLB01 |
1 | 1 | 1 | Keine Einschränkungen für SPM und LPM beim Zugriff auf den Anwenderbereich
2 | 1 | 0 | Schreibschutz: SPM ist nicht erlaubt, in den Anwenderbereich zu schreiben
3 | 0 | 0 | Vollschutz: 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.
4 | 0 | 1 | Kopierschutz: 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-Modus | BLB12 | BLB11 |
1 | 1 | 1 | Keine Einschränkungen für SPM und LPM beim Zugriff auf den Urlader-Bereich.
2 | 1 | 0 | Schreibschutz: SPM ist nicht erlaubt, in den Urlader-Bereich zu schreiben
3 | 0 | 0 | Vollschutz: 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.
4 | 0 | 1 | Kopierschutz: 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-Bit | Bitnummer | Beschreibung | Vorgabe
– | 7 | – | 1
– | 6 | – | 1
– | 5 | – | 1
– | 4 | – | 1
– | 3 | – | 1
– | 2 | – | 1
– | 1 | – | 1
SELFPRGEN | 0 | Freigabe der Selbstprogrammierung | 1 (unprogrammiert)
Tabelle 28-5: Erweitertes Fuse-Byte — ATmega88/168
Erweitertes Fuse-Bit | Bitnummer | Beschreibung | Vorgabe
– | 7 | – | 1
– | 6 | – | 1
– | 5 | – | 1
– | 4 | – | 1
– | 3 | – | 1
BOOTSZ1 | 2 | Auswahl der Urlader-Größe (siehe Tabelle 27-7 und Tabelle 27-10) | 0 (programmiert)(1)
BOOTSZ0 | 1 |  | 0 (programmiert)(1)
SELFPRGEN | 0 | Freigabe der Selbstprogrammierung | 1 (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-Bit | Bitnummer | Beschreibung | Vorgabe
– | 7 | – | 1
– | 6 | – | 1
– | 5 | – | 1
– | 4 | – | 1
– | 3 | – | 1
BODLEVEL2(1) | 2 | Auslöseschwelle des Unterspannungsdetektors | 1 (unprogrammiert)
BODLEVEL1(1) | 1 |  | 1 (unprogrammiert)
BODLEVEL0(1) | 0 |  | 1 (unprogrammiert)
Hinweis:
  1. Siehe Tabelle 29-12 für die Wertzuweisung an BODLEVEL
Tabelle 28-7: High-Fuse-Byte — ATmega48/88/168
High-Fuse-Bit | Bitnummer | Beschreibung | Vorgabe
RSTDISBL(1) | 7 | Deaktivierung externes Reset | 1 (unprogrammiert)
DWEN | 6 | Freigabe von debugWIRE | 1 (unprogrammiert)
SPIEN(2) | 5 | Freigabe der seriellen Programmierung | 0 (programmiert, SPI-Programmierung möglich)
WDTON(3) | 4 | Watchdog immer ein | 1 (unprogrammiert)
EESAVE | 3 | EEPROM-Speicher beim Chip-Löschen erhalten | 1 (unprogrammiert), EEPROM wird gelöscht
BODLEVEL2(41) | 2 | Auslöseschwelle des Unterspannungsdetektors | 1 (unprogrammiert)
BODLEVEL1(4) | 1 |  | 1 (unprogrammiert)
BODLEVEL0(4) | 0 |  | 1 (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-Bit | Bitnummer | Beschreibung | Vorgabe
RSTDISBL(1) | 7 | Deaktivierung externes Reset | 1 (unprogrammiert)
DWEN | 6 | Freigabe von debugWIRE | 1 (unprogrammiert)
SPIEN(2) | 5 | Freigabe der seriellen Programmierung | 0 (programmiert, SPI-Programmierung möglich)
WDTON(3) | 4 | Watchdog immer ein | 1 (unprogrammiert)
EESAVE | 3 | EEPROM-Speicher beim Chip-Löschen erhalten | 1 (unprogrammiert), EEPROM wird gelöscht
BOOTSZ1 | 2 | Auswahl der Urlader-Größe (siehe Tabelle 27-13) | 0 (programmiert)(1)
BOOTSZ0 | 1 |  | 0 (programmiert)(1)
SELFPRGEN | 0 | Freigabe der Selbstprogrammierung | 1 (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-Bit | Bitnummer | Beschreibung | Vorgabe
CKDIV8(4) | 7 | Taktteiler durch 8 | 0 (programmiert)
CKOUT(3) | 6 | Taktausgang | 1 (unprogrammiert)
SUT1 | 5 | Auswahl der Hochlaufzeit | 1 (unprogrammiert)(1)
SUT0 | 4 |  | 0 (programmiert)(1)
CKSEL3 | 3 | Taktquellen-Auswahl | 0 (programmiert)(2)
CKSEL2 | 2 |  | 0 (programmiert)(2)
CKSEL1 | 1 |  | 1 (unprogrammiert)(2)
CKSEL0 | 0 |  | 0 (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
Schaltkreis | Adresse des Signatur-Bytes
 | 0x000 (Hersteller) | 0x001 (Flash-Größe) | 0x002 (lfd. Nummer)
ATmega48A | 0x1E | 0x92 | 0x05
ATmega48PA | 0x1E | 0x92 | 0x0A
ATmega88A | 0x1E | 0x93 | 0x0A
ATmega88PA | 0x1E | 0x93 | 0x0F
ATmega168A | 0x1E | 0x94 | 0x06
ATmega168PA | 0x1E | 0x94 | 0x0B
ATmega328 | 0x1E | 0x95 | 0x14
ATmega328P | 0x1E | 0x95 | 0x0F

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
Schaltkreis | Flash-Größe | Seitengröße | PCWORD | Anzahl Seiten | PCPAGE | PCMSB
ATmega48A | 2 KWord (4 KByte) | 32 Word | PC[4:0] | 64 | PC[10:5] | 10
ATmega48PA
ATmega88A | 4 KWord (8 KByte) |  |  | 128 | PC[11:5] | 11
ATmega88PA
ATmega168A | 8 KWord (16 KByte) | 64 Word | PC[5:0] |  | PC[12:6] | 12
ATmega168PA
ATmega328 | 16 KWord (32 KByte) |  |  | 256 | PC[13:6] | 13
ATmega328P
Tabelle 28-12: Anzahl 16-Bit-Worte pro Seite und Anzahl Seiten im EEPROM-Speicher
Schaltkreis | EEPROM-Größe | Seitengröße | PCWORD | Anzahl Seiten | PCPAGE | EEAMSB
ATmega48A | 256 Byte | 4 Byte | EEA[1:0] | 64 | EEA[7:2] | 7
ATmega48PA
ATmega88A | 512 Byte |  |  | 128 | EEA[8:2] | 8
ATmega88PA
ATmega168A
ATmega168PA
ATmega328 | 1 KByte |  |  | 256 | EEA[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 Programmiermodus | Pin-Name | I/O | Funktion
RDY/BSY | PD1 | O | 0: Schaltkreis beschäftigt mit Programmierung, 1: Schaltkreis bereit für neues Kommando
OE | PD2 | I | Ausgangs-Freigabe (low-aktiv)
WR | PD3 | I | Schreibimpuls (low-aktiv)
BS1 | PD4 | I | Byte-Auswahl 1 (0 = Low-Byte, 1 = High-Byte)
XA0 | PD5 | I | Quarz-Aktionsbit 0
XA1 | PD6 | I | Quarz-Aktionsbit 1
PAGEL | PD7 | I | Programmspeicher- und EEPROM-Speicher laden
BS2 | PC2 | I | Byte-Auswahl 2 (0 = Low-Byte, 1 = zweites High-Byte)
DATA | {PC[1:0]:PB[5:0]} | I/O | Bidirektionaler Datenbus (Ausgang wenn OE low)
Tabelle 28-14: Pin-Werte beim Einstieg in den Programmiermodus
Pin | Symbol | Wert
PAGEL | Prog_enable[3] | 0
XA1 | Prog_enable[2] | 0
XA0 | Prog_enable[1] | 0
BS1 | Prog_enable[0] | 0
Tabelle 28-15: Kodierung von XA1 und XA0
XA1 | XA0 | Aktion bei Puls an XTAL1
0 | 0 | Lade Flash- oder EEPROM-Adresse (High- oder Low-Teil je nach BS1).
0 | 1 | Lade Daten (High- oder Low-Byte für Flash je nach BS1).
1 | 0 | Lade Kommando
1 | 1 | Keine Aktion, Ruhezustand
Tabelle 28-16: Kommandobyte-Kodierung
Kommandobyte | Ausgeführtes Kommando
1000 0000 | Chip löschen
0100 0000 | Fuse-Bits schreiben
0010 0000 | Sperrbits schreiben
0001 0000 | Flash schreiben
0001 0001 | EEPROM schreiben
0000 1000 | Signatur-Bytes und Kalibrierbyte lesen
0000 0100 | Fuse- und Sperrbits lesen
0000 0010 | Flash lesen
0000 0011 | EEPROM 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.
  • The command needs only be loaded once when writing or reading multiple memory locations.
  • Skip writing the data value 0xFF, that is the contents of the entire EEPROM (unless the EESAVE Fuse is programmed) and Flash after a Chip Erase.
  • Address high byte needs only be loaded before programming or reading a new 256 word window in Flash or 256 byte EEPROM. This consideration also applies to Signature bytes reading.

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.
  7. 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.
  8. 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).
  9. Repeat B through H until the entire Flash is programmed or until all data has been programmed.
  10. 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
Symbol | Pin | I/O | Beschreibung
MOSI | PB3 | I | Serieller Dateneingang
MISO | PB4 | O | Serieller Datenausgang
SCK | PB5 | I | Serieller 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.
  6. Jede Speicherzelle kann überprüft werden, indem mit dem Lesebefehl der Inhalt der Speicherzelle der aktuellen Adresse über den MISO-Pin ausgegeben wird.
  7. Am Ende der Programmierung kann RESET auf High gelegt werden, um die normale Schaltkreisfunktion zu starten.
  8. Abschalten der Spannung (wenn benötigt):
    • RESET auf „1“ legen
    • Spannung abschalten
Tabelle 28-18: Typische Wartezeiten, bevor die nächste Flash- oder EEPROM-Schreiboperation starten darf
Symbol | Minimale Wartezeit
tWD_FLASH | 4,5 ms
tWD_EEPROM | 3,6 ms
tWD_ERASE | 9,0 ms
tWD_FUSE | 4,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
Befehl | Befehlsformat
 | Byte 1 | Byte 2 | Byte 3 | Byte 4
Programmierfreigabe | 0xAC | 0x53 | 0x00 | 0x00
Chip löschen (Programmspeicher und ggf. EEPROM) | 0xAC | 0x80 | 0x00 | 0x00
Abfrage RDY/BSY | 0xF0 | 0x00 | 0x00 | data byte out
Ladebefehle
Lade Erweitertes Adressbyte(1) | 0x4D | 0x00 | Extended adr | 0x00
Lade Programmspeicherseite, High-Byte | 0x48 | 0x00 | adr LSB | high data byte in
Lade Programmspeicherseite, Low-Byte | 0x40 | 0x00 | adr LSB | low data byte in
Lade EEPROM-Speicherseite | 0xC1 | 0x00 | 0000 000aa | data byte in
Lesebefehle
Lese Programmspeicher, High-Byte | 0x28 | adr MSB | adr LSB | high data byte out
Lese Programmspeicher, Low-Byte | 0x20 | adr MSB | adr LSB | low data byte out
Lese EEPROM-Speicher | 0xA0 | 0000 00aa | aaaa aaaa | data byte out
Lese Sperrbits | 0x58 | 0x00 | 0x00 | data byte out
Lese Signatur-Byte | 0x30 | 0x00 | 0000 000aa | data byte out
Lese Low-Fuse-Bits | 0x50 | 0x00 | 0x00 | data byte out
Lese High-Fuse-Bits | 0x58 | 0x08 | 0x00 | data byte out
Lese Erweiterte Fuse-Bits | 0x50 | 0x08 | 0x00 | data byte out
Lese Kalibrier-Byte | 0x38 | 0x00 | 0x00 | data byte out
Schreibbefehle(6)
Schreibe Programmspeicher-Seite | 0x4C | adr MSB(8) | adr LSB(8) | 0x00
Schreibe EEPROM-Byte | 0xC0 | 0000 00aa | aaaa aaaa | data byte in
Schreibe EEPROM-Seite | 0xC2 | 0000 00aa | aaaa aa00 | 0x00
Schreibe Sperrbits | 0xAC | 0xE0 | 0x00 | data byte in
Schreibe Low-Fuse-Bits | 0xAC | 0xA0 | 0x00 | data byte in
Schreibe High-Fuse-Bits | 0xAC | 0xA8 | 0x00 | data byte in
Schreibe Erweiterte Fuse-Bits | 0xAC | 0xA4 | 0x00 | data 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


Kennwerte

29. Kennwerte (TA = -40 °C bis 85 °C)

29.1 Grenzwerte *

Betriebstemperatur: ................. -55 °C bis +125 °C

Lagertemperatur: .................... -65 °C bis +150 °C

Spannung an jedem Pin außer RESET
bezüglich Masse: ................. -0,5 V bis UCC + 0,5 V

Spannung an RESET
bezüglich Masse: ......................... -0,5 V bis 13,0 V

Maximale Speisespannung: .......................... 6,0 V

Gleichstrom pro I/O-Pin: .......................... 40,0 mA

Gleichstrom an UCC und Massepins: .......... 200,0 mA

* Hinweis:
Das Überschreiten der Grenzwerte kann den Schaltkreis dauerhaft schädigen. Dies sind Stressgrenzwerte, und der Funktionsbereich und andere Bedingungen, die jenseits der Kennwerte liegen, sind nicht impliziert. Der Betrieb des Schaltkreises an den Grenzwerten über längere Zeit kann die Zuverlässigkeit herabsetzen.

29.2 Statische Kennwerte

29.2.1 Statische Kennwerte für ATmega48A

Tabelle 29-1: Statische Kennwerte für ATmega48A bei TA = -40 °C bis 85 °C
Symbol | Parameter | Bedingung | Min. | Typ.(2) | Max. | Einheit
ICC | Strom der Stromversorgung (1) | Aktiv 1 MHz, UCC = 2 V |  | 0,2 | 0,55 | mA
 |  | Aktiv 4 MHz, UCC = 3 V |  | 1,2 | 3,5 | mA
 |  | Aktiv 8 MHz, UCC = 5 V |  | 4,0 | 12 | mA
 |  | Idle 1 MHz, UCC = 2 V |  | 0,03 | 0,5 | mA
 |  | Idle 4 MHz, UCC = 3 V |  | 0,21 | 1,5 | mA
 |  | Idle 8 MHz, UCC = 5 V |  | 0,9 | 5,5 | mA
 | Leistung-weg-Modus (3) | 32 kHz TOSC laufend, UCC = 1,8 V |  | 0,75 |  | µA
 |  | 32 kHz TOSC laufend, UCC = 3 V |  | 0,9 |  | µA
 | Leistung-spar-Modus (3) | Watchdog ein, UCC = 3 V |  | 3,9 | 15 | µA
 |  | Watchdog aus, UCC = 3 V |  | 0,1 | 2 | µA
Hinweise:
  1. Werte bei deaktivierten I/O-Modulen, d.h. PRR = 0xFF. Siehe „Minimieren des Stromverbrauchs“
  2. Typische Werte bei 25 °C
  3. Der Stromverbrauch schließt Eingangsleckströme ein.

29.2.2 Statische Kennwerte für ATmega48PA

Tabelle 29-2: Statische Kennwerte für ATmega48PA bei TA = -40 °C bis 85 °C
Symbol | Parameter | Bedingung | Min. | Typ.(2) | Max. | Einheit
ICC | Strom der Stromversorgung (1) | Aktiv 1 MHz, UCC = 2 V |  | 0,2 | 0,5 | mA
 |  | Aktiv 4 MHz, UCC = 3 V |  | 1,2 | 2,5 | mA
 |  | Aktiv 8 MHz, UCC = 5 V |  | 4,0 | 9 | mA
 |  | Idle 1 MHz, UCC = 2 V |  | 0,03 | 0,15 | mA
 |  | Idle 4 MHz, UCC = 3 V |  | 0,21 | 0,7 | mA
 |  | Idle 8 MHz, UCC = 5 V |  | 0,9 | 2,7 | mA
 | Leistung-weg-Modus (3) | 32 kHz TOSC laufend, UCC = 1,8 V |  | 0,75 |  | µA
 |  | 32 kHz TOSC laufend, UCC = 3 V |  | 0,9 |  | µA
 | Leistung-spar-Modus (3) | Watchdog ein, UCC = 3 V |  | 3,9 | 8 | µA
 |  | Watchdog aus, UCC = 3 V |  | 0,1 | 2 | µA
Hinweise:
  1. Werte bei deaktivierten I/O-Modulen, d.h. PRR = 0xFF. Siehe „Minimieren des Stromverbrauchs“
  2. Typische Werte bei 25 °C
  3. Der Stromverbrauch schließt Eingangsleckströme ein.

29.2.3 Statische Kennwerte für ATmega88A

Tabelle 29-3: Statische Kennwerte für ATmega88A bei TA = -40 °C bis 85 °C
Symbol | Parameter | Bedingung | Min. | Typ.(2) | Max. | Einheit
ICC | Strom der Stromversorgung (1) | Aktiv 1 MHz, UCC = 2 V |  | 0,2 | 0,55 | mA
 |  | Aktiv 4 MHz, UCC = 3 V |  | 1,2 | 3,5 | mA
 |  | Aktiv 8 MHz, UCC = 5 V |  | 4,1 | 12 | mA
 |  | Idle 1 MHz, UCC = 2 V |  | 0,03 | 0,5 | mA
 |  | Idle 4 MHz, UCC = 3 V |  | 0,18 | 1,5 | mA
 |  | Idle 8 MHz, UCC = 5 V |  | 0,8 | 5,5 | mA
 | Leistung-weg-Modus (3) | 32 kHz TOSC laufend, UCC = 1,8 V |  | 0,8 |  | µA
 |  | 32 kHz TOSC laufend, UCC = 3 V |  | 0,9 |  | µA
 | Leistung-spar-Modus (3) | Watchdog ein, UCC = 3 V |  | 3,9 | 15 | µA
 |  | Watchdog aus, UCC = 3 V |  | 0,1 | 2 | µA
Hinweise:
  1. Werte bei deaktivierten I/O-Modulen, d.h. PRR = 0xFF. Siehe „Minimieren des Stromverbrauchs“
  2. Typische Werte bei 25 °C
  3. Der Stromverbrauch schließt Eingangsleckströme ein.

29.2.4 Statische Kennwerte für ATmega88PA

Tabelle 29-4: Statische Kennwerte für ATmega88PA bei TA = -40 °C bis 85 °C
Symbol | Parameter | Bedingung | Min. | Typ.(2) | Max. | Einheit
ICC | Strom der Stromversorgung (1) | Aktiv 1 MHz, UCC = 2 V |  | 0,2 | 0,5 | mA
 |  | Aktiv 4 MHz, UCC = 3 V |  | 1,2 | 2,5 | mA
 |  | Aktiv 8 MHz, UCC = 5 V |  | 4,1 | 9 | mA
 |  | Idle 1 MHz, UCC = 2 V |  | 0,03 | 0,15 | mA
 |  | Idle 4 MHz, UCC = 3 V |  | 0,18 | 0,7 | mA
 |  | Idle 8 MHz, UCC = 5 V |  | 0,8 | 2,7 | mA
 | Leistung-weg-Modus (3) | 32 kHz TOSC laufend, UCC = 1,8 V |  | 0,8 |  | µA
 |  | 32 kHz TOSC laufend, UCC = 3 V |  | 0,9 |  | µA
 | Leistung-spar-Modus (3) | Watchdog ein, UCC = 3 V |  | 3,9 | 8 | µA
 |  | Watchdog aus, UCC = 3 V |  | 0,1 | 2 | µA
Hinweise:
  1. Werte bei deaktivierten I/O-Modulen, d.h. PRR = 0xFF. Siehe „Minimieren des Stromverbrauchs“
  2. Typische Werte bei 25 °C
  3. Der Stromverbrauch schließt Eingangsleckströme ein.

29.2.5 Statische Kennwerte für ATmega168A

Tabelle 29-5: Statische Kennwerte für ATmega168A bei TA = -40 °C bis 85 °C
Symbol | Parameter | Bedingung | Min. | Typ.(2) | Max. | Einheit
ICC | Strom der Stromversorgung (1) | Aktiv 1 MHz, UCC = 2 V |  | 0,2 | 0,55 | mA
 |  | Aktiv 4 MHz, UCC = 3 V |  | 1,2 | 3,5 | mA
 |  | Aktiv 8 MHz, UCC = 5 V |  | 4,2 | 12 | mA
 |  | Idle 1 MHz, UCC = 2 V |  | 0,03 | 0,5 | mA
 |  | Idle 4 MHz, UCC = 3 V |  | 0,2 | 1,5 | mA
 |  | Idle 8 MHz, UCC = 5 V |  | 0,9 | 5,5 | mA
 | Leistung-weg-Modus (3) | 32 kHz TOSC laufend, UCC = 1,8 V |  | 0,75 |  | µA
 |  | 32 kHz TOSC laufend, UCC = 3 V |  | 0,83 |  | µA
 | Leistung-spar-Modus (3) | Watchdog ein, UCC = 3 V |  | 4,1 | 15 | µA
 |  | Watchdog aus, UCC = 3 V |  | 0,1 | 2 | µA
Hinweise:
  1. Werte bei deaktivierten I/O-Modulen, d.h. PRR = 0xFF. Siehe „Minimieren des Stromverbrauchs“
  2. Typische Werte bei 25 °C
  3. Der Stromverbrauch schließt Eingangsleckströme ein.

29.2.6 Statische Kennwerte für ATmega168PA

Tabelle 29-6: Statische Kennwerte für ATmega168PA bei TA = -40 °C bis 85 °C
Symbol | Parameter | Bedingung | Min. | Typ.(2) | Max. | Einheit
ICC | Strom der Stromversorgung (1) | Aktiv 1 MHz, UCC = 2 V |  | 0,2 | 0,5 | mA
 |  | Aktiv 4 MHz, UCC = 3 V |  | 1,2 | 2,5 | mA
 |  | Aktiv 8 MHz, UCC = 5 V |  | 4,2 | 9 | mA
 |  | Idle 1 MHz, UCC = 2 V |  | 0,03 | 0,15 | mA
 |  | Idle 4 MHz, UCC = 3 V |  | 0,2 | 0,7 | mA
 |  | Idle 8 MHz, UCC = 5 V |  | 0,9 | 2,7 | mA
 | Leistung-weg-Modus (3) | 32 kHz TOSC laufend, UCC = 1,8 V |  | 0,75 |  | µA
 |  | 32 kHz TOSC laufend, UCC = 3 V |  | 0,83 |  | µA
 | Leistung-spar-Modus (3) | Watchdog ein, UCC = 3 V |  | 4,1 | 8 | µA
 |  | Watchdog aus, UCC = 3 V |  | 0,1 | 2 | µA
Hinweise:
  1. Werte bei deaktivierten I/O-Modulen, d.h. PRR = 0xFF. Siehe „Minimieren des Stromverbrauchs“
  2. Typische Werte bei 25 °C
  3. Der Stromverbrauch schließt Eingangsleckströme ein.

29.2.7 Statische Kennwerte für ATmega328

Tabelle 29-7: Statische Kennwerte für ATmega328 bei TA = -40 °C bis 85 °C
Symbol | Parameter | Bedingung | Min. | Typ.(2) | Max. | Einheit
ICC | Strom der Stromversorgung (1) | Aktiv 1 MHz, UCC = 2 V |  | 0,3 | 0,55 | mA
 |  | Aktiv 4 MHz, UCC = 3 V |  | 1,7 | 3,5 | mA
 |  | Aktiv 8 MHz, UCC = 5 V |  | 5,2 | 12 | mA
 |  | Idle 1 MHz, UCC = 2 V |  | 0,04 | 0,5 | mA
 |  | Idle 4 MHz, UCC = 3 V |  | 0,3 | 1,5 | mA
 |  | Idle 8 MHz, UCC = 5 V |  | 1,2 | 5,5 | mA
 | Leistung-weg-Modus (3) | 32 kHz TOSC laufend, UCC = 1,8 V |  | 0,8 |  | µA
 |  | 32 kHz TOSC laufend, UCC = 3 V |  | 0,9 |  | µA
 | Leistung-spar-Modus (3) | Watchdog ein, UCC = 3 V |  | 4,2 | 15 | µA
 |  | Watchdog aus, UCC = 3 V |  | 0,1 | 2 | µA
Hinweise:
  1. Werte bei deaktivierten I/O-Modulen, d.h. PRR = 0xFF. Siehe „Minimieren des Stromverbrauchs“
  2. Typische Werte bei 25 °C
  3. Der Stromverbrauch schließt Eingangsleckströme ein.

29.2.8 Statische Kennwerte für ATmega328P

Tabelle 29-8: Statische Kennwerte für ATmega328P bei TA = -40 °C bis 85 °C
Symbol | Parameter | Bedingung | Min. | Typ.(2) | Max. | Einheit
ICC | Strom der Stromversorgung (1) | Aktiv 1 MHz, UCC = 2 V |  | 0,3 | 0,5 | mA
 |  | Aktiv 4 MHz, UCC = 3 V |  | 1,7 | 2,5 | mA
 |  | Aktiv 8 MHz, UCC = 5 V |  | 5,2 | 9 | mA
 |  | Idle 1 MHz, UCC = 2 V |  | 0,4 | 0,15 | mA
 |  | Idle 4 MHz, UCC = 3 V |  | 0,3 | 0,7 | mA
 |  | Idle 8 MHz, UCC = 5 V |  | 1,2 | 2,7 | mA
 | Leistung-weg-Modus (3) | 32 kHz TOSC laufend, UCC = 1,8 V |  | 0,8 |  | µA
 |  | 32 kHz TOSC laufend, UCC = 3 V |  | 0,9 |  | µA
 | Leistung-spar-Modus (3) | Watchdog ein, UCC = 3 V |  | 4,2 | 8 | µA
 |  | Watchdog aus, UCC = 3 V |  | 0,1 | 2 | µA
Hinweise:
  1. Werte bei deaktivierten I/O-Modulen, d.h. PRR = 0xFF. Siehe „Minimieren des Stromverbrauchs“
  2. Typische Werte bei 25 °C
  3. Der Stromverbrauch schließt Eingangsleckströme ein.

29.3 Geschwindigkeitsbereich

Die maximale Geschwindigkeit ist abhängig von der Speisespannung UCC. Wie im Bild 1 zu sehen gibt es lineare Abschnitte zwischen 1,8 V < UCC < 2,7 V und 2,7 V < UCC < 4,5 V.
Bild 29-1: Maximale Frequenz vs. UCC

29.4 Dynamische Kennwerte

29.4.1 Genauigkeit des internen RC-Oszillators

Tabelle 29-9: Kalibriergenauigkeit des internen RC-Oszillators
 | Frequenz | UCC | Temperatur | Kalibriergenauigkeit
Werkskalibierung | 8,0 MHz | 3 V | 25 °C | ±10 %
Anwenderkalibrierung | 7,3 - 8,1 MHz | 1,8V - 5.5 V | -40 °C - 85 °C | ±1 %

29.4.2 Kurvenform der Taktspeisung

Bild 29-2: Kurvenform für externen Takt

29.4.3 Externe Taktspeisung

Tabelle 29-10: Externe Taktspeisung
Symbol | Parameter | UCC = 1,8 - 5,5 V |  | UCC = 2,7 - 5,5 V |  | UCC = 4,5 - 5,5 V |  | Einheit
 |  | Min. | Max. | Min. | Max. | Min. | Max.
1/tCLCL | Oszillatorfrequenz | 0 | 4 | 0 | 10 | 0 | 20 | MHz
tCLCL | Taktperiode | 250 |  | 100 |  | 50 |  | ns
tCHCX | High-Zeit | 100 |  | 40 |  | 20 |  | ns
tCLCX | Low-Zeit | 100 |  | 40 |  | 20 |  | ns
tCLCH | Anstiegszeit |  | 2,0 |  | 1,6 |  | 0,5 | µs
tCHCL | Abfallzeit |  | 2,0 |  | 1,6 |  | 0,5 | µs
∆tCLCL | Wechsel der Periodendauer von einem Taktzyklus zum nächsten |  | 2 |  | 2 |  | 2 | %

29.5 System- und Reset-Kennwerte

Tabelle 29-11: Reset-, Unterspannungsdetektor- und interne Spannungskennwerte (1)
Symbol | Parameter |  | Min. | Typ. | Max. | Einheit
UPOT | Steigende Power-on-Reset-Schwellspannung |  | 1,1 | 1,4 | 1,6 | V
 | Fallende Power-on-Reset Schwellspannung (2) |  | 0,6 | 1,3 | 1,6 | V
SRON | Anstiegsgeschwindigkeit der Speisespannung |  | 0,01 |  | 10 | V/ms
URST | Schwellspannung am RESET-Pin |  | 0,2 UCC |  | 0,9 UCC | V
tRST | Minimale Pulsbreite am RESET-Pin |  |  |  | 2,5 | µs
UHYST | Unterspannungsdetektor-Hysterese |  |  | 50 |  | mV
tBOD | Minimale Dauer des Spannungseinbruchs für den Unterspannungsdetektor |  |  | 2 |  | µs
UBG | Spannungsreferenz: Spannung | UCC = 2,7 V TA = 25 °C | 1,0 | 1,1 | 1,2 | V
tBG | Spannungsreferenz: Hochlaufzeit |  |  | 40 | 70 | µs
IBG | Spannungsreferenz: Stromverbrauch |  |  | 10 |  | µA
Hinweise:
  1. Werte sind nur Richtlinien.
  2. Der Power-On-Reset funktioniert nur wenn die Speisespannung unterhalb UPOT (fallend) ist.
Tabelle 29-12: BODLEVEL-Fuse-Kodierung (1) (2)
BODLEVEL[2:0]-Fuses | Min. UBOT | Typ. UBOT | Max. UBOT | Einheit
111 | Unterspannungsdetektor deaktiviert
110 | 1,7 | 1,8 | 2,0 | V
101 | 2,5 | 2,7 | 2,9
100 | 4,1 | 4,3 | 4,5
011 | reserviert
010
001
000
Hinweise:
  1. UBOT kann niedriger als die minimale Speisespannung liegen bei einigen Chips. In solchen Fällen wird bis zu UCC = UBOT während der Produktion getestet. Das garantiert, dass der Unterspannungsdetektor anspricht, bevor UCC unter eine Spannung fällt, bei der Mikrocontroller noch korrekt arbeitet. Der Test wird bei BODLEVEL = 110, 101 und 100 ausgeführt.
  2. UBOT wird bei 25 °C und 85 °C während der Produktion getestet.

29.6 SPI-Kennwerte

Tabelle 29-13: SPI-Kennwerte
Nr. | Beschreibung | Modus | Min. | Typ. | Max. | Einheit
1 | SCK-Periodendauer | Master |  | Siehe Tabelle 19-5 |  | ns
2 | SCK high/low | Master |  | 50 % Tastverhältnis |
3 | Anstiegs- und Abfallzeit | Master |  | 3,6 |
4 | Vorhaltezeit | Master |  | 10 |
5 | Nachhaltezeit | Master |  | 10 |
6 | Out to SCK | Master |  | 0,5 • tsck |
7 | SCK to out | Master |  | 10 |
8 | SCK to out high | Master |  | 10 |
9 | SS low to out | Slave |  | 15 |
10 | SCK-Periodendauer | Slave | 4 • tck |  |
11 | SCK high/low(1) | Slave | 2 • tck |  |
12 | Rise/Fall time | Slave |  |  | 1600
13 | Setup | Slave | 10 |  |
14 | Hold | Slave | tck |  |
15 | SCK to out | Slave |  | 15 |
16 | SCK to SS high | Slave | 20 |  |
17 | SS high to tri-state | Slave |  | 10 |
18 | SS low to SCK | Slave | 20 |  |
Hinweis:
  1. Im SPI-Programmiermodus beträgt die minimale SCK-High/Low-Zeit:
    • 2 tCLCL für fCK < 12 MHz
    • 3 tCLCL für fCK > 12 MHz
Bild 29-3: SPI-Timing-Erfordernisse (Master-Modus)
Bild 29-4: SPI-Timing-Erfordernisse (Slave-Modus)

29.7 TWI-Kennwerte

Tabelle 29-14: TWI-Kennwerte
Symbol | Parameter | Bedingung | Min. | Max. | Einheit
UIL | Input Low-voltage | -0,5 | 0,3 UCC | V
UIH | Input High-voltage | 0,7 UCC | UCC + 0,5 | V
Uhys(1)Hysteresis of Schmitt Trigger Inputs0,05 UCC (2)–V
UOL(1) | Output Low-voltage | 3 mA sink current | 0 | 0,4 | V
tr(1) | Rise Time for both SDA and SCL | 20 + 0,1 Cb(3) (2) | 300 | ns
tof(1) | Output Fall Time from VIHmin to VILmax | 10 pF < Cb < 400 pF (3) | 20 + 0,1 Cb(3) (2) | 250 | ns
tSP(1) | Spikes Suppressed by Input Filter | 0 | 50 (2) | ns
Ii | Input Current each I/O Pin | 0,1 UCC < Vi < 0,9 UCC | -10 | 10 | µA
Ci(1)Capacitance for each I/O Pin–10pF
fSCL | SCL Clock Frequency | fCK(4) > max(16 fSCL, 250 kHz) (5) | 0 | 400 | kHz
RpValue of Pull-up resistor fSCL ≤ 100 kHz
UCC – 0,4 V
3 mA
1000 ns
Cb
Ω
fSCL > 100 kHz
UCC – 0,4 V
3 mA
300 ns
Cb
Ω
tHD;STAHold Time (repeated) START Bedingung fSCL ≤ 100 kHz4,0–µs
fSCL > 100 kHz0,6–µs
tLOWLow Period of the SCL Clock fSCL ≤ 100 kHz4,7–µs
fSCL > 100 kHz1,3–µs
tHIGHHigh period of the SCL clock fSCL ≤ 100 kHz4,0–µs
fSCL > 100 kHz0,6–µs
tSU;STASet-up time for a repeated START condition fSCL ≤ 100 kHz4,7–µs
fSCL > 100 kHz0,6–µs
tHD;DAT | Data hold time | fSCL ≤ 100 kHz | 0 | 3,45 | µs
fSCL > 100 kHz | 0 | 0,9 | µs
tSU;DATData setup time fSCL ≤ 100 kHz250–ns
fSCL > 100 kHz100–ns
tSU;STOSetup time for STOP condition fSCL ≤ 100 kHz4,0–µs
fSCL > 100 kHz0,6–µs
tBUFBus free time between a STOP and START condition fSCL ≤ 100 kHz4,7–µs
fSCL > 100 kHz1,3–µs
Hinweise:
  1. This parameter is characterized and not 100% tested.
  2. Required only for fSCL > 100kHz.
  3. Cb = capacitance of one bus line in pF.
  4. fCK = CPU clock frequency
  5. This requirement applies to all 2-wire Serial Interface operation. Other devices connected to the 2-wire Serial Bus need only obey the general fSCL requirement.
Bild 29-5: Zweidraht-Bus-Zeitverhalten

29.8 ADU-Kennwerte

Tabelle 29-15: Kennwerte des Analog-Digital-Wandlers
Symbol | Parameter | Bedingung | Min. | Typ. | Max | Einheit
 | Auflösung |  |  | 10 |  | Bits
 | Absolute accuracy (Including INL, DNL, quantization error, gain and offset error) | UREF = 4V, VCC = 4V, ADC clock = 200kHz |  | 2 |  | LSB
 |  | UREF = 4V, VCC = 4V, ADC clock = 1MHz |  | 4.5 |  | LSB
 |  | UREF = 4V, VCC = 4V, ADC clock = 200kHz Noise Reduction Mode |  | 2 |  | LSB
 |  | UREF = 4V, VCC = 4V, ADC clock = 1MHz Noise Reduction Mode |  | 4.5 |  | LSB
 | Integral Non-Linearity (INL) | UREF = 4V, VCC = 4V, ADC clock = 200kHz |  | 0.5 |  | LSB
 | Differential Non-Linearity (DNL) | UREF = 4V, VCC = 4V, ADC clock = 200kHz |  | 0.25 |  | LSB
 | Gain Error | UREF = 4V, VCC = 4V, ADC clock = 200kHz |  | 2 |  | LSB
 | Offset Error | UREF = 4V, VCC = 4V, ADC clock = 200kHz |  | 2 |  | LSB
 | Conversion Time | Free Running Conversion | 13 |  | 260 | µs
 | Clock Frequency |  | 50 |  | 1000 | kHz
AUCC(1) | Analog Supply Voltage |  | UCC - 0.3 |  | UCC + 0.3 | V
UREF | Reference Voltage |  | 1.0 |  | AUCC | V
UIN | Input Voltage |  | GND |  | UREF | V
 | Eingangsbandbreite |  |  | 38.5 |  | kHz
UINT | Internal Voltage Reference |  | 1.0 | 1.1 | 1.2 | V
RREF | Reference Input Resistance |  |  | 32 |  | kΩ
RAIN | Analog Input Resistance |  |  | 100 |  | MΩ
Hinweis:
  1. AUCC absolute min./max: 1.8V/5.5V

28.9 Kennwerte bei Paralleler Programmierung

Tabelle 29-16: Kennwerte der Parallelen Programmierung, UCC = 5 V ± 10 %
Symbol | Parameter | Min. | Typ. | Max. | Einheit
UPP | Spannung zur Programmierfreigabe | 11.5 |  | 12.5 | V
IPP | Strom der Programmierfreigabe |  |  | 250 | μA
tDVXH | Vorhaltezeit Daten und Steuersignale vor XTAL1 High | 67 |  |  | ns
tXLXH | Vorhaltezeit XTAL1 Low bis XTAL1 High | 200 |  |  | ns
tXHXL | Pulsbreite XTAL1 High | 150 |  |  | ns
tXLDX | Nachhaltezeit Daten und Steuersignale nach XTAL1 Low | 67 |  |  | ns
tXLWL | Vorhaltezeit XTAL1 Low bis WR Low | 0 |  |  | ns
tXLPH | Vorhaltezeit XTAL1 Low bis PAGEL high | 0 |  |  | ns
tPLXH | Vorhaltezeit PAGEL low bis XTAL1 high | 150 |  |  | ns
tBVPH | Vorhaltezeit BS1 Valid bis PAGEL High | 67 |  |  | ns
tPHPL | Pulsbreite PAGEL High | 150 |  |  | ns
tPLBX | Nachhaltezeit BS1 nach PAGEL Low | 67 |  |  | ns
tWLBX | Nachhaltezeit BS2/1 nach WR Low | 67 |  |  | ns
tPLWL | Vorhaltezeit PAGEL Low bis WR Low | 67 |  |  | ns
tBVWL | Vorhaltezeit BS1 Valid bis WR Low | 67 |  |  | ns
tWLWH | Pulsbreite WR Low | 150 |  |  | ns
tWLRL | Reaktionszeit WR Low bis RDY/BSY Low | 0 |  | 1 | μs
tWLRH | Reaktionszeit WR Low bis RDY/BSY High(1) | 3,7 |  | 4,5 | ms
tWLRH_CE | Vorhaltezeit WR Low bis RDY/BSY High für Chip Löschen(2) | 7,5 |  | 9 | ms
tXLOL | Vorhaltezeit XTAL1 Low bis OE Low | 0 |  |  | ns
tBVDV | Reaktionszeit BS1 gültig bis DATA gültig | 0 |  | 250 | ns
tOLDV | Reaktionszeit OE Low bis DATA gültig |  |  | 250 | ns
tOHDZ | Reaktionszeit OE High bis DATA hochohmig |  |  | 250 | ns
Hinweise:
  1. tWLRH gilt für die Kommandos Flash schreiben, EEPROM schreiben, Fusebits schreiben und Sperrbits schreiben.
  2. tWLRH_CE gilt für das Kommando Chip Löschen.
Bild 29-6: Zeiten der Parallelen Programmierung, inklusive einiger allgemeiner Zeitgrenzen
Bild 29-7: Zeiten der Parallelen Programmierung, Ladesequenz mit Zeitgrenzen(1)
Hinweis:
  1. Die Zeitgrenzen im Bild 29-6 (bspw. tDVXH, tXHXL und tXLDX) gelten auch für die Ladesequenz.
Bild 29-8: Zeiten der Parallelen Programmierung, Lesesequenz (innerhalb einer Seite) mit Zeitgrenzen(1)
Hinweis:
  1. Die Zeitgrenzen im Bild 29-6 (bspw. tDVXH, tXHXL und tXLDX) gelten auch für die Lesesequenz.


Kennwerte

30. Kennwerte (TA = -40 °C bis 105 °C)

30.1 Grenzwerte *

Betriebstemperatur: ................. -55 °C bis +125 °C

Lagertemperatur: .................... -65 °C bis +150 °C

Spannung an jedem Pin außer RESET
bezüglich Masse: ................. -0,5 V bis UCC + 0,5 V

Spannung an RESET
bezüglich Masse: ......................... -0,5 V bis 13,0 V

Maximale Speisespannung: .......................... 6,0 V

Gleichstrom pro I/O-Pin: .......................... 40,0 mA

Gleichstrom an UCC und Massepins: .......... 200,0 mA

* Hinweis:
Das Überschreiten der Grenzwerte kann den Schaltkreis dauerhaft schädigen. Dies sind Stressgrenzwerte, und der Funktionsbereich und andere Bedingungen, die jenseits der Kennwerte liegen, sind nicht impliziert. Der Betrieb des Schaltkreises an den Grenzwerten über längere Zeit kann die Zuverlässigkeit herabsetzen.

30.2 Statische Kennwerte

Tabelle 30-1: Gemeinsame statische Kennwerte bei TA = -40 °C bis 105 °C
Symbol | Parameter | Bedingung |  | Min. | Typ. | Max. | Einheit
UIL | Input Low Voltage, except XTAL1 and RESET pins | UCC = 1,8 V - 2,4 V |  | -0,5 |  | 0,2 UCC(1) | V
 |  | UCC = 2,4 V - 5,5 V |  | -0,5 |  | 0,3 UCC(1)
UIH | Input High Voltage, except XTAL1 and RESET pins | UCC = 1,8 V - 2,4 V |  | 0,7 UCC(2) |  | UCC + 0,5 | V
 |  | UCC = 2,4 V - 5,5 V |  | 0,6 UCC(2) |  | UCC + 0,5
UIL1 | Input Low Voltage, XTAL1 pin | UCC = 1,8 V - 5,5 V |  | -0,5 |  | 0,1 UCC(1) | V
UIH1 | Input High Voltage, XTAL1 pin | UCC = 1,8 V - 2,4 V |  | 0,8 UCC(2) |  | UCC + 0,5 | V
 |  | UCC = 2,4 V - 5,5 V |  | 0,7 UCC(2) |  | UCC + 0,5
UIL2 | Input Low Voltage, RESET pin | UCC = 1,8 V - 5,5 V |  | -0,5 |  | 0,1 UCC(1) | V
UIH2 | Input High Voltage, RESET pin | UCC = 1,8 V - 5,5 V |  | 0,9 UCC(2) |  | UCC + 0,5 | V
UIL3 | Input Low Voltage, RESET pin as I/O | UCC = 1,8 V - 2,4 V |  | -0,5 |  | 0,2 UCC(1) | V
 |  | UCC = 2,4 V - 5,5 V |  | -0,5 |  | 0,3 UCC(1)
UIH3 | Input High Voltage, RESET pin as I/O | UCC = 1,8 V - 2,4 V |  | 0,7 UCC(2) |  | UCC + 0,5 | V
 |  | UCC = 2,4 V - 5,5 V |  | 0,6 UCC(2) |  | UCC + 0,5
UOL | Output Low Voltage(4) except RESET pin | IOL = 20 mA, UCC = 5 V | TA = 85 °C |  |  | 0,9 | V
 |  |  | TA = 105 °C |  |  | 1,0
 |  | IOL = 10 mA, UCC = 3 V | TA = 85 °C |  |  | 0,6
 |  |  | TA = 105 °C |  |  | 0,7
VOH | Output High Voltage(3) except Reset pin | IOH = -20 mA, UCC = 5 V | TA = 85 °C | 4,2 |  |  | V
 |  |  | TA = 105 °C | 4,1 |  |
 |  | IOH = -10 mA, UCC = 3 V | TA = 85 °C | 2,3 |  |
 |  |  | TA = 105 °C | 2,1 |  |
IIL | Input Leakage Current I/O Pin | UCC = 5,5 V, pin low (absolute value) |  |  |  | 1 | µA
IIH | Input Leakage Current I/O Pin | UCC = 5,5 V, pin high (absolute value) |  |  |  | 1 | µA
RRST | Reset Pull-up Resistor |  |  | 30 |  | 60 | kΩ
RPU | I/O Pin Pull-up Resistor |  |  | 20 |  | 50 | kΩ
UACIO | Analog Comparator Input Offset Voltage | UCC = 5 V Uin = UCC/2 |  |  | <10 | 40 | mV
IACLK | Analog Comparator Input Leakage Current | UCC = 5 V Uin = UCC/2 |  | -50 |  | 50 | nA
tACID | Analog Comparator Propagation Delay | UCC = 2,7 V |  |  | 750 |  | ns
 |  | UCC = 4,0 V |  |  | 500 |
Hinweise:
  1. “Max” means the highest value where the pin is guaranteed to be read as low
  2. “Min” means the lowest value where the pin is guaranteed to be read as high
  3. Although each I/O port can source more than the test conditions (20mA at UCC = 5V, 10mA at UCC = 3V) under steady state conditions (non-transient), the following must be observed: ATmega48A/PA/88A/PA/168A/PA/328/P:
    1. The sum of all IOH, for ports C0 - C5, D0- D4, ADC7, RESET should not exceed 150mA.
    2. The sum of all IOH, for ports B0 - B5, D5 - D7, ADC6, XTAL1, XTAL2 should not exceed 150mA.
    If IIOH exceeds the test condition, VOH may exceed the related specification. Pins are not guaranteed to source current greater than the listed test condition.
  4. Although each I/O port can sink more than the test conditions (20mA at UCC = 5V, 10mA at UCC = 3V) under steady state conditions (non-transient), the following must be observed: ATmega48A/PA/88A/PA/168A/PA/328/P:
    1. The sum of all IOL, for ports C0 - C5, ADC7, ADC6 should not exceed 100mA.
    2. The sum of all IOL, for ports B0 - B5, D5 - D7, XTAL1, XTAL2 should not exceed 100mA.
    3. The sum of all IOL, for ports D0 - D4, RESET should not exceed 100mA.
    If IOL exceeds the test condition, VOL may exceed the related specification. Pins are not guaranteed to sink current greater than the listed test condition.

30.2.2 Statische Kennwerte für ATmega48PA

Tabelle 30-2: Statische Kennwerte für ATmega48PA bei TA = -40 °C bis 105 °C
Symbol | Parameter | Bedingung | Min. | Typ.(2) | Max. | Einheit
ICC | Strom der Stromversorgung (1) | Aktiv 1 MHz, UCC = 2 V |  | 0,22 | 0,55 | mA
 |  | Aktiv 4 MHz, UCC = 3 V |  | 1,15 | 2,65
 |  | Aktiv 8 MHz, UCC = 5 V |  | 4,1 | 9,5
 |  | Idle 1 MHz, UCC = 2 V |  | 0,024 | 0,16
 |  | Idle 4 MHz, UCC = 3 V |  | 0,2 | 0,75
 |  | Idle 8 MHz, UCC = 5 V |  | 0,78 | 2,8
 | Leistung-weg-Modus (2) | 32 kHz TOSC laufend, UCC = 1,8 V |  | 0,75 |  | µA
 |  | 32 kHz TOSC laufend, UCC = 3 V |  | 0,9 |
 | Leistung-spar-Modus (3) | Watchdog ein, UCC = 3 V |  | 3,9 | 10
 |  | Watchdog aus, UCC = 3 V |  | 0,1 | 5
Hinweise:
  1. Werte bei deaktivierten I/O-Modulen, d.h. PRR = 0xFF. Siehe „Minimieren des Stromverbrauchs“
  2. Typische Werte bei 25 °C
  3. Der Stromverbrauch schließt Eingangsleckströme ein.

30.2.3 Statische Kennwerte für ATmega88PA

Tabelle 30-3: Statische Kennwerte für ATmega88PA bei TA = -40 °C bis 105 °C
Symbol | Parameter | Bedingung | Min. | Typ.(2) | Max. | Einheit
ICC | Strom der Stromversorgung (1) | Aktiv 1 MHz, UCC = 2 V |  | 0,2 | 0,6 | mA
 |  | Aktiv 4 MHz, UCC = 3 V |  | 1,2 | 2,75
 |  | Aktiv 8 MHz, UCC = 5 V |  | 4,1 | 10
 |  | Idle 1 MHz, UCC = 2 V |  | 0,03 | 0,17
 |  | Idle 4 MHz, UCC = 3 V |  | 0,18 | 0,8
 |  | Idle 8 MHz, UCC = 5 V |  | 0,8 | 3
 | Leistung-weg-Modus (3) | 32 kHz TOSC laufend, UCC = 1,8 V |  | 0,8 |  | µA
 |  | 32 kHz TOSC laufend, UCC = 3 V |  | 0,9 |
 | Leistung-spar-Modus (3) | Watchdog ein, UCC = 3 V |  | 3,9 | 10
 |  | Watchdog aus, UCC = 3 V |  | 0,1 | 5
Hinweise:
  1. Werte bei deaktivierten I/O-Modulen, d.h. PRR = 0xFF. Siehe „Minimieren des Stromverbrauchs“
  2. Typische Werte bei 25 °C
  3. Der Stromverbrauch schließt Eingangsleckströme ein.

30.2.4 Statische Kennwerte für ATmega168PA

Tabelle 30-4: Statische Kennwerte für ATmega168PA bei TA = -40 °C bis 105 °C
Symbol | Parameter | Bedingung | Min. | Typ. (2) | Max. | Einheit
ICC | Strom der Stromversorgung (1) | Aktiv 1 MHz, UCC = 2 V |  | 0,3 | 0,6 | mA
 |  | Aktiv 4 MHz, UCC = 3 V |  | 1,8 | 2,75
 |  | Aktiv 8 MHz, UCC = 5 V |  | 6,7 | 10
 |  | Idle 1 MHz, UCC = 2 V |  | 0,06 | 0,2
 |  | Idle 4 MHz, UCC = 3 V |  | 0,4 | 0,8
 |  | Idle 8 MHz, UCC = 5 V |  | 1,7 | 3
 | Leistung-weg-Modus (3) | 32 kHz TOSC laufend, UCC = 1,8 V |  | 0,8 |  | µA
 |  | 32 kHz TOSC laufend, UCC = 3 V |  | 0,9 |
 | Leistung-spar-Modus (3) | Watchdog ein, UCC = 3 V |  | 4,6 | 10
 |  | Watchdog aus, UCC = 3 V |  | 0,1 | 5
Hinweise:
  1. Werte bei deaktivierten I/O-Modulen, d.h. PRR = 0xFF. Siehe „Minimieren des Stromverbrauchs“
  2. Typische Werte bei 25 °C
  3. Der Stromverbrauch schließt Eingangsleckströme ein.

30.2.5 Statische Kennwerte für ATmega328P

Tabelle 30-5: Statische Kennwerte für ATmega328P bei TA = -40 °C bis 105 °C
Symbol | Parameter | Bedingung | Min. | Typ. (2) | Max. | Einheit
ICC | Strom der Stromversorgung (1) | Aktiv 1 MHz, UCC = 2 V |  | 0,3 | 0,5 | mA
 |  | Aktiv 4 MHz, UCC = 3 V |  | 1,7 | 2,5
 |  | Aktiv 8 MHz, UCC = 5 V |  | 5,2 | 9,0
 |  | Idle 1 MHz, UCC = 2 V |  | 0,04 | 0,15
 |  | Idle 4 MHz, UCC = 3 V |  | 0,3 | 0,7
 |  | Idle 8 MHz, UCC = 5 V |  | 1,2 | 2,7
 | Leistung-weg-Modus (3) | 32 kHz TOSC laufend, UCC = 1,8 V |  | 0,8 |  | µA
 |  | 32 kHz TOSC laufend, UCC = 3 V |  | 0,9 |
 | Leistung-spar-Modus (3) | Watchdog ein, UCC = 3 V |  | 4,2 | 10
 |  | Watchdog aus, UCC = 3 V |  | 0,1 | 5
Hinweise:
  1. Werte bei deaktivierten I/O-Modulen, d.h. PRR = 0xFF. Siehe „Minimieren des Stromverbrauchs“
  2. Typische Werte bei 25 °C
  3. Der Stromverbrauch schließt Eingangsleckströme ein.


Diagramme (-40 … +85 °C)

31. Diagramme (-40 … +85 °C)

Die nachfolgenden Diagramme zeigen das typische Verhalten. Diese Daten sind nicht getestet. Alle Stromverbrauchs-Messungen wurden durchgeführt als alle I/O-Pins als Eingang konfiguriert und die internen pull-up-Widerstände freigegeben waren. Als Taktquelle wurde ein Rechteckgenerator mit Rail-to-Rail-Ausgang verwendet.

Alle Verbräuche wurden gemessen, wenn alle Bits im PRR-Register gesetzt wurden und damit alle Peripherieeinheiten deaktiviert wurden. Außerdem wurde der Analogvergleicher abgeschaltet. Siehe ATmega88: Stromverbrauch der I/O-Module um den zusätzlichen Stromverbrauch der jeweiligen I/O-Module hinzuzurechnen.

Der Stromverbrauch im Leistung-weg-Modus ist unabhängig von der Taktquelle.

Der Stromverbrauch hängt von verschiedenen Faktoren ab: Der Versorgungsspannung, der Taktfrequenz, den Zuständen an den I/O-Pins, der Schaltrate der I/O-Pins, dem ausgeführten Befehl und der Umgebungstemperatur. Die wesentlichen Faktoren sind die Versorgungsspannung und die Taktfrequenz.

Der Stromverbrauch eines kapazitiv belasteten Pins kann abgeschätzt werden mit CL · UCC · f, wobei CL der Kapazität, UCC der Versorgungsspannung und f der Schaltfrequenz des I/O-Pins entspricht.

Die Diagramme enthalten Frequenzen, die höher sind als die Testlimits. Die Chips garantieren aber keine korrekte Funktion bei Frequenzen oberhalb des in der Bestellbezeichnung angegebenen Wertes.

Die Differenz beim Stromverbrauch zwischen Leistung-weg-Modus mit und ohne freigegebenen Watchdog entspricht dem Stromverbrauch des Watchdogs.

31.1 Diagramme ATmega48A

31.1.1 Strom unter Last

Bild 31-1: ATmega48A: Strom unter Last vs. Frequenz (0,1 – 1,0 MHz)
Bild 31-2: ATmega48A: Strom unter Last vs. Frequenz (1 - 20 MHz
Bild 31-3: ATmega48A: Strom unter Last vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 31-4: ATmega48A: Strom unter Last vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 31-5: ATmega48A: Strom unter Last vs. UCC (Interner RC-Oszillator, 8 MHz)

31.1.2 Stromaufnahme im Leerlauf

Bild 31-6: ATmega48A: Stromaufnahme im Leerlauf vs. Frequenz (0,1 – 1,0 MHz)
Bild 31-7: ATmega48A: Stromaufnahme im Leerlauf vs. Frequenz (1 – 20 MHz)
Bild 31-8: ATmega48A: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 31-9: ATmega48A: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 31-10: ATmega48A: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 8 MHz)

31.1.3 ATmega48A: Stromaufnahme der I/O-Module

Die folgenden Tabellen und Formeln können zur Berechnung der zusätzlichen Stromaufnahme der verschiedenen I/O-Module unter Last und im Leerlauf herangezogen werden. Das Freigeben und Sperren der I/O-Module wird über das Leistungs-Reduktions-Register gesteuert. It is possible to calculate the typical current consumption based on the numbers from Tabelle 31-2 for other UCC und frequency settings than listed in Tabelle 31-1.

31.1.3.1 Beispiel

Berechne die zu erwartende Stromaufnahme im Leerlauf mit TIMER1, ADU und SPI bei UCC = 2,0 V und F = 1 MHz: Von Tabelle 31-4, dritte Spalte, we see that we need to add 11,2 % for the TIMER1, 22.1 % for the ADU und 17,6 % for the SPI module. Reading from Bild 31-53, we find that the idle current consumption is ≈0,028 mA at UCC = 2,0 V und F = 1 MHz. Die Gesamtstromaufnahme im Leerlauf mit TIMER1, ADU und SPI enabled, gives:
ICCtotal ≈ 0,028 mA ∙(1 + 0,112 + 0,221 + 0.176) ≈ 0,042 mA
Tabelle 31-1: ATmega48PA: Zusätzlicher Stromverbrauch der verschiedenen I/O-Module, in µA
PRR-Bit | Typische Werte
 | UCC = 2 V, F = 1 MHz | UCC = 3 V, F = 4 MHz | UCC = 5 V, F = 8 MHz
PRUSART0 | 2,9 µA | 20,7 µA | 97,4 µA
PRTWI | 6,0 µA | 44,8 µA | 219,7 µA
PRTIM2 | 5,0 µA | 34,5 µA | 141,3 µAµA
PRTIM1 | 3,6 µA | 24,4 µA | 107,7 µA
PRTIM0 | 1,4 µA | 9,5 µA | 38,4 µA
PRSPI | 5,0 µA | 38,0 µA | 190,4 µA
PRADC | 6,1 µA | 47,4 µA | 244,7 µA
Tabelle 31-2: ATmega48PA: Zusätzlicher Stromverbrauch (in Prozent) unter Last und im Leerlauf
PRR-Bit | Zusätzlicher Stromverbrauch verglichen mit CPU-Last und externem Takt (siehe Bild 31-48 und Bild 31-49) | Zusätzlicher Stromverbrauch verglichen mit Leerlauf und externem Takt (siehe Bild 31-53 und Bild 31-54)
PRUSART0 | 1,8 % | 11,4 %
PRTWI | 3,9 % | 20,6 %
PRTIM2 | 2,9 % | 15,7 %
PRTIM1 | 2,1 % | 11,2 %
PRTIM0 | 0,8 % | 4,2 %
PRSPI | 3,3 % | 17,6 %
PRADC | 4,2 % | 22,1 %

31.1.4 Stromaufnahme bei Leistung-weg

Bild 31-11: ATmega48A: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog deaktiviert)
Bild 31-12: ATmega48A: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog aktiviert)

31.1.5 Stromaufnahme beim Leistung sparen

Bild 31-13: ATmega48A: Stromaufnahme beim Leistung sparen vs. UCC (Watchdog deaktiviert und 32kHz Crystal Oscillator Running)

31.1.6 Stromaufnahme in Bereitschaft

Bild 31-14: ATmega48A: Stromaufnahme in Bereitschaft vs. UCC (Watchdog deaktiviert)

31.1.7 Pin-Pullups

Bild 31-15: ATmega48A: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 1,8 V)
Bild 31-16: ATmega48A: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 2,7 V)
Bild 31-17: ATmega48A: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 5 V)
Bild 31-18: ATmega48A: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 1,8 V))
Bild 31-19: ATmega48A: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (V = 2,7 V)
Bild 31 – 20: ATmega48A: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 5 V)

31.1.8 Treiberstärke der Pins

Bild 31-21: ATmega48A: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (UCC = 3 V)
Bild 31-22: ATmega48A: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (UCC = 5 V)
Bild 31-23: ATmega48A: Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 3 V)
Bild 31-24: ATmega48A: Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 5 V)

31.1.9 Schaltschwelle und Hysterese der Pins

Bild 31-25: ATmega48A: Schaltschwelle vs. UCC (UIH, Pin liest „1“)
Bild 31-26: ATmega48A: Schaltschwelle vs. UCC (UIL, Pin liest „0“)
Bild 31-27: ATmega48A: Hysterese vs. UCC
Bild 31-28: ATmega48A: Schaltschwelle vs. UCC am RESET-Pin (UIH, Pin liest „1“)
Bild 31-29: ATmega48A: Schaltschwelle vs. UCC am RESET-Pin (UIL, Pin liest „0“)
Bild 31-30: ATmega48A: Hysterese vs. UCC am RESET-Pin

31.1.10 Unterspannungsdetektor-Schwelle

Bild 31-31: ATmega48A: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 1,8 V)
Bild 31-32: ATmega48A: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 2,7 V)
Bild 31-33: ATmega48A: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 4,3 V)
Bild 31-34: ATmega48A: Referenzspannung vs. UCC

31.1.11 Interner Oszillator

Bild 31-35: ATmega48A: Watchdog-Oszillatorfrequenz vs. Temperatur
Bild 31-36: ATmega48A: Watchdog-Oszillatorfrequenz vs. UCC
Bild 31-37: ATmega48A: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. UCC
Bild 31-38: ATmega48A: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. Temperatur
Bild 31-39: ATmega48A: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. OSCCAL-Wert

31.1.12 Verbrauch der I/O-Module

Bild 31-40: ATmega48A: Stromaufnahme des A/D-Wandlers vs. UCC (AREF = AUCC)
Bild 31-41: ATmega48A: Stromaufnahme des Analogvergleichers vs. UCC
Bild 31-42: ATmega48A: Strom der externen Spannungsreferenz AREF vs. UCC
Bild 31-43: ATmega48A Stromaufnahme des Unterspannungsdetektor vs. UCC
Bild 31-44: ATmega48A: Programmierstrom vs. UCC

31.1.13 Reset-Verbrauch und -Pulsbreite

Bild 31-45: ATmega48A: Stromaufnahme während Reset vs. Frequenz (0.1 - 1,0 MHz)
Bild 31-46: ATmega48A: Stromaufnahme während Reset vs. Frequenz (1 - 20 MHz)
Bild 31-47: ATmega48A: Minimale Resetpulsbreite vs. UCC

31.2 Diagramme ATmega48PA

31.2.1 Strom unter Last

Bild 31-48: ATmega48PA: Strom unter Last vs. Frequenz (0,1 – 1,0 MHz)
Bild 31-49: ATmega48PA: Strom unter Last vs. Frequenz (1 – 20 MHz)
Bild 31-50: ATmega48PA: Strom unter Last vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 31-51: ATmega48PA: Strom unter Last vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 31-52: ATmega48PA: Strom unter Last vs. UCC (Interner RC-Oszillator, 8 MHz)

31.2.2 Stromaufnahme im Leerlauf

Bild 31-53: ATmega48PA: Stromaufnahme im Leerlauf vs. Frequenz (0,1 – 1,0 MHz)
Bild 31-54: ATmega48PA: Stromaufnahme im Leerlauf vs. Frequenz (1 – 20 MHz)
Bild 31-55: ATmega48PA: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 31-56: ATmega48PA: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 31-57: ATmega48PA: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 8 MHz)

31.2.3 ATmega48PA: Stromaufnahme der I/O-Module

Die folgenden Tabellen und Formeln können zur Berechnung der zusätzlichen Stromaufnahme der verschiedenen I/O-Module unter Last und im Leerlauf herangezogen werden. Das Freigeben und Sperren der I/O-Module wird über das Leistungs-Reduktions-Register gesteuert. It is possible to calculate the typical current consumption based on the numbers from Tabelle 31-4 for other UCC und frequency settings than listed in Tabelle 31-3.
Tabelle 31-3: ATmega48PA: Zusätzlicher Stromverbrauch der verschiedenen I/O-Module, in µA
PRR-Bit | Typische Werte
 | UCC = 2 V, F = 1 MHz | UCC = 3 V, F = 4 MHz | UCC = 5 V, F = 8 MHz
PRUSART0 | 2,9 µA | 20,7 µA | 97,4 µA
PRTWI | 6,0 µA | 44,8 µA | 219,7 µA
PRTIM2 | 5,0 µA | 34,5 µA | 141,3 µA
PRTIM1 | 3,6 µA | 24,4 µA | 107,7 µA
PRTIM0 | 1,4 µA | 9,5 µA | 38,4 µA
PRSPI | 5,0 µA | 38,0 µA | 190,4 µA
PRADC | 6,1 µA | 47,4 µA | 244,7 µA
Tabelle 31-4: ATmega48PA: Zusätzlicher Stromverbrauch (in Prozent) unter Last und im Leerlauf
PRR-Bit | Zusätzlicher Stromverbrauch verglichen mit CPU-Last und externem Takt (siehe Bild 31-48 und Bild 31-49) | Zusätzlicher Stromverbrauch verglichen mit Leerlauf und externem Takt (siehe Bild 31-53 und Bild 31-54)
PRUSART0 | 1,8 % | 11,4 %
PRTWI | 3,9 % | 20,6 %
PRTIM2 | 2,9 % | 15,7 %
PRTIM1 | 2,1 % | 11,2 %
PRTIM0 | 0,8 % | 4,2 %
PRSPI | 3,3 % | 17,6 %
PRADC | 4,2 % | 22,1 %

31.2.3.1 Beispiel

Berechne die zu erwartende Stromaufnahme im Leerlauf mit TIMER1, ADU und SPI bei UCC = 2,0 V und F = 1 MHz: Von Tabelle 31-4, dritte Spalte, we see that we need to add 11,2 % for the TIMER1, 22.1 % for the ADU und 17,6 % for the SPI module. Reading from Bild 31-53, we find that the idle current consumption is ≈0,028 mA at UCC = 2,0 V und F = 1 MHz. Die Gesamtstromaufnahme im Leerlauf mit TIMER1, ADU und SPI enabled, gives:
ICCtotal ≈ 0,028 mA ∙(1 + 0,112 + 0,221 + 0.176) ≈ 0,042 mA

31.2.4 Stromaufnahme bei Leistung-weg

Bild 31-58: ATmega48PA: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog deaktiviert)
Bild 31-59: ATmega48PA: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog aktiviert)

31.2.5 Stromaufnahme beim Leistung sparen

Bild 31-60: ATmega48PA: Stromaufnahme beim Leistung sparen vs. UCC (Watchdog deaktiviert und 32kHz Crystal Oscillator Running)

31.2.6 Stromaufnahme in Bereitschaft

Bild 31-61: ATmega48PA: Stromaufnahme in Bereitschaft vs. UCC (Watchdog deaktiviert)

31.2.7 Pin-Pullups

Bild 31-62: ATmega48PA: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 1,8 V)
Bild 31-63: ATmega48PA: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 2,7 V)
Bild 31-64: ATmega48PA: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 5 V)
Bild 31-65: ATmega48PA: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 1,8 V)
Bild 31-66: ATmega48PA: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 2,7 V)
Bild 31-67: ATmega48PA: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 5 V)

31.2.8 Treiberstärke der Pins

Bild 31-68: ATmega48PA: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (UCC = 3 V)
Bild 31-69: ATmega48PA: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (V = 5 V)
Bild 31-70: ATmega48PA: Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 3 V)
Bild 31-71: ATmega48PA: Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 5 V)

31.2.9 Schaltschwelle und Hysterese der Pins

Bild 31-72: ATmega48PA: Schaltschwelle vs. UCC (UIH, Pin liest „1“)
Bild 31-73: ATmega48PA: Schaltschwelle vs. UCC (UIL, Pin liest „0“)
Bild 31-74: ATmega48PA: Hysterese vs. UCC
Bild 31-75: ATmega48PA: Schaltschwelle vs. UCC am RESET-Pin (UIH, Pin liest „1“)
Bild 31-76: ATmega48PA: Schaltschwelle vs. UCC am RESET-Pin (UIL, Pin liest „0“)
Bild 31-77: ATmega48PA: Hysterese vs. UCC am RESET-Pin

31.2.10 Unterspannungsdetektor-Schwelle

Bild 31-78: ATmega48PA: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 1,8 V)
Bild 31-79: ATmega48PA: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 2,7 V)
Bild 31-80: ATmega48PA: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 4,3 V)
Bild 31-81: ATmega48PA: Referenzspannung vs. UCC

31.2.11 Interner Oszillator

Bild 31-82: ATmega48PA: Watchdog-Oszillatorfrequenz vs. Temperatur
Bild 31-83: ATmega48PA: Watchdog-Oszillatorfrequenz vs. UCC
Bild 31-84: ATmega48PA: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. UCC
Bild 31-85: ATmega48PA: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. Temperatur
Bild 31-86: ATmega48PA: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. OSCCAL-Wert

31.2.12 Verbrauch der I/O-Module

Bild 31-87: ATmega48PA: Stromaufnahme des A/D-Wandlers vs. UCC (AREF = AUCC)
Bild 31-88: ATmega48PA: Stromaufnahme des Analogvergleichers vs. UCC
Bild 31-89: ATmega48PA: Strom der externen Spannungsreferenz AREF vs. UCC
Bild 31-90: ATmega48PA: Stromaufnahme des Unterspannungsdetektor vs. UCC
Bild 31-91: ATmega48PA: Programmierstrom vs. UCC

31.2.13 Reset-Verbrauch und -Pulsbreite

Bild 31-92: ATmega48PA: Stromaufnahme während Reset vs. Frequenz (0.1 MHz- 1,0 MHz)
Bild 31-93: ATmega48PA: Stromaufnahme während Reset vs. Frequenz (1 MHz- 20 MHz)
Bild 31-94: ATmega48PA: Minimale Resetpulsbreite vs. UCC

31.3 Diagramme ATmega88A

31.3.1 Strom unter Last

Bild 31-95: ATmega88A: Strom unter Last vs. Frequenz (0,1 – 1,0 MHz)
Bild 31-96: ATmega88A: Strom unter Last vs. Frequenz (1 - 20 MHz)
Bild 31-97: ATmega88A: Strom unter Last vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 31-98: ATmega88A: Strom unter Last vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 31-99: ATmega88A: Strom unter Last vs. UCC (Interner RC-Oszillator, 8 MHz)

31.3.2 Stromaufnahme im Leerlauf

Bild 31-100: ATmega88A: Stromaufnahme im Leerlauf vs. Frequenz (0,1 – 1,0 MHz)
Bild 31-101: ATmega88A: Stromaufnahme im Leerlauf vs. Frequenz (1 – 20 MHz)
Bild 31-102: ATmega88A: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 31-103: ATmega88A: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 31-104: ATmega88A: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 8 MHz)

31.3.3 ATmega88A: Stromaufnahme der I/O-Module

Die folgenden Tabellen und Formeln können zur Berechnung der zusätzlichen Stromaufnahme der verschiedenen I/O-Module unter Last und im Leerlauf herangezogen werden. Das Freigeben und Sperren der I/O-Module wird über das Leistungs-Reduktions-Register gesteuert.
Tabelle 31-5: ATmega88A: Zusätzlicher Stromverbrauch der verschiedenen I/O-Module, in µA
PRR-Bit | Typische Werte
 | UCC = 2 V, F = 1 MHz | UCC = 3 V, F = 4 MHz | UCC = 5 V, F = 8 MHz
PRUSART0 | 3,0 µA | 21,3 µA | 97,9 µA
PRTWI | 6,1 µA | 45,4 µA | 219,0 µA
PRTIM2 | 5,2 µA | 35,2 µA | 149,5 µA
PRTIM1 | 3,8 µA | 25,6 µA | 110,0 µA
PRTIM0 | 1,5 µA | 9,8 µA | 39,6 µA
PRSPI | 5,2 µA | 40,0 µA | 199,6 µA
PRADC | 6,3 µA | 48,7 µA | 247,0 µA
Tabelle 31-6: ATmega88A: Zusätzlicher Stromverbrauch (in Prozent) unter Last und im Leerlauf
PRR-Bit | Zusätzlicher Stromverbrauch verglichen mit CPU-Last und externem Takt (siehe Bild 31-142 und Bild 31-143) | Zusätzlicher Stromverbrauch verglichen mit Leerlauf und externem Takt (siehe Bild 31-147 und Bild 31-148)
PRUSART0 | 1,8 % | 11,4 %
PRTWI | 3,9 % | 24,4 %
PRTIM2 | 2,9 % | 18,6 %
PRTIM1 | 2,1 % | 13,6 %
PRTIM0 | 0,8 % | 5,2 %
PRSPI | 3,5 % | 21,5 %
PRADC | 4,2 % | 26,3 %
It is possible to calculate the typical current consumption based on the numbers from Tabelle 31-8 for other UCC und frequency settings than listed in Tabelle 31-7.

31.3.3.1 Beispiel

Berechne die zu erwartende Stromaufnahme im Leerlauf mit TIMER1, ADU und SPI bei UCC = 2,0 V und F = 1 MHz: Von Tabelle 31-8, dritte Spalte, we see that we need to add 13,6 % for the TIMER1, 26.3 % for the ADU und 21,5 % for the SPI module. Reading from Bild 31-147, we find that the idle current consumption is ≈0,027 mA at UCC = 2,0 V und F = 1 MHz. The total current consumption in idle mode with TIMER1, ADU und SPI enabled, gives:
ICCtotal ≈ 0,027 mA ∙(1 + 0,136 + 0,263 + 0.215) ≈ 0,043 mA

31.3.4 Stromaufnahme bei Leistung-weg

Bild 31-105: ATmega88A: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog deaktiviert)
Bild 31-106: ATmega88A: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog aktiviert)

31.3.5 Stromaufnahme beim Leistung sparen

Bild 31-107: ATmega88A: Stromaufnahme beim Leistung sparen vs. UCC (Watchdog deaktiviert und 32kHz Crystal Oscillator Running)

31.3.6 Stromaufnahme in Bereitschaft

Bild 31-108: ATmega88A: Stromaufnahme in Bereitschaft vs. UCC (Watchdog deaktiviert)

31.3.7 Pin-Pullups

Bild 31-109: ATmega88A: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 1,8 V)
Bild 31-110: ATmega88A: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 2,7 V)
Bild 31-111: ATmega88A: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 5 V)
Bild 31-112: ATmega88A: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 1,8 V)
Bild 31-113: ATmega88A: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 2,7 V)
Bild 31-114: ATmega88A: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 5 V)

31.3.8 Treiberstärke der Pins

Bild 31-115: ATmega88A: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (UCC = 3 V)
Bild 31-116: ATmega88A: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (UCC = 5 V)
Bild 31-117: ATmega88A: Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 3 V)
Bild 31-118: ATmega88A: Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 5 V)

31.3.9 Schaltschwelle und Hysterese der Pins

Bild 31-119: ATmega88A: Schaltschwelle vs. UCC (UIH, Pin liest „1“)
Bild 31-120: ATmega88A: Schaltschwelle vs. UCC (UIL, Pin liest „0“)
Bild 31-121: ATmega88A: Hysterese vs. UCC
Bild 31-122: ATmega88A: Schaltschwelle vs. UCC am RESET-Pin (UIH, Pin liest „1“)
Bild 31-123: ATmega88A: Schaltschwelle vs. UCC am RESET-Pin (UIL, Pin liest „0“)
Bild 31-124: ATmega88A: Hysterese vs. UCC am RESET-Pin

31.3.10 Unterspannungsdetektor-Schwelle

Bild 31-125: ATmega88A: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 1,8 V)
Bild 31-126: ATmega88A: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 2,7 V)
Bild 31-127: ATmega88A: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 4,3 V)
Bild 31-128: ATmega88A: Referenzspannung vs. UCC

31.3.11 Interner Oszillator

Bild 31-129: ATmega88A: Watchdog-Oszillatorfrequenz vs. Temperatur
Bild 31-130: ATmega88A: Watchdog-Oszillatorfrequenz vs. UCC
Bild 31-131: ATmega88A: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. UCC
Bild 31-132: ATmega88A: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. Temperatur
Bild 31-133: ATmega88A: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. OSCCAL-Wert

31.3.12 Verbrauch der I/O-Module

Bild 31-134: ATmega88A: Stromaufnahme des A/D-Wandlers vs. UCC (AREF = AUCC)
Bild 31-135: ATmega88A: Stromaufnahme des Analogvergleichers vs. UCC
Bild 31-136: ATmega88A: Strom der externen Spannungsreferenz AREF vs. UCC
Bild 31-137: ATmega88A: Stromaufnahme des Unterspannungsdetektor vs. UCC
Bild 31-138: ATmega88A: Programmierstrom vs. UCC

31.3.13 Reset-Verbrauch und -Pulsbreite

Bild 31-139: ATmega88A: Stromaufnahme während Reset vs. Frequenz (0.1 - 1,0 MHz)
Bild 31-140: ATmega88A: Stromaufnahme während Reset vs. Frequenz (1 - 20 MHz)
Bild 31-141: ATmega88A: Minimale Resetpulsbreite vs. UCC

31.4 Diagramme ATmega88PA

31.4.1 Strom unter Last

Bild 31-142: ATmega88PA: Strom unter Last vs. Frequenz (0,1 – 1,0 MHz)
Bild 31-143: ATmega88PA: Strom unter Last vs. Frequenz (1 - 20 MHz)
Bild 31-144: ATmega88PA: Strom unter Last vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 31-145: ATmega88PA: Strom unter Last vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 31-146: ATmega88PA: Strom unter Last vs. UCC (Interner RC-Oszillator, 8 MHz)

31.4.2 Stromaufnahme im Leerlauf

Bild 31-147: ATmega88PA: Stromaufnahme im Leerlauf vs. Frequenz (0,1 – 1,0 MHz)
Bild 31-148: ATmega88PA: Stromaufnahme im Leerlauf vs. Frequenz (1 - 20 MHz)
Bild 31-149: ATmega88PA: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 31-150: ATmega88PA: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 31-151: ATmega88PA: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 8 MHz)

31.4.3 ATmega88PA: Stromaufnahme der I/O-Module

Die folgenden Tabellen und Formeln können zur Berechnung der zusätzlichen Stromaufnahme der verschiedenen I/O-Module unter Last und im Leerlauf herangezogen werden. Das Freigeben und Sperren der I/O-Module wird über das Leistungs-Reduktions-Register gesteuert.
Tabelle 31-7: ATmega88PA: Zusätzlicher Stromverbrauch der verschiedenen I/O-Module, in µA
PRR-Bit | Typische Werte
 | UCC = 2 V, F = 1 MHz | UCC = 3 V, F = 4 MHz | UCC = 5 V, F = 8 MHz
PRUSART0 | 3,0 µA | 21,3 µA | 97,9 µA
PRTWI | 6,1 µA | 45,4 µA | 219,0 µA
PRTIM2 | 5,2 µA | 35,2 µA | 149,5 µA
PRTIM1 | 3,8 µA | 25,6 µA | 110,0 µA
PRTIM0 | 1,5 µA | 9,8 µA | 39,6 µA
PRSPI | 5,2 µA | 40,0 µA | 199,6 µA
PRADC | 6,3 µA | 48,7 µA | 247,0 µA
Tabelle 31-8: ATmega88PA: Zusätzlicher Stromverbrauch (in Prozent) unter Last und im Leerlauf
PRR-Bit | Zusätzlicher Stromverbrauch verglichen mit CPU-Last und externem Takt (siehe Bild 31-142 und Bild 31-143) | Zusätzlicher Stromverbrauch verglichen mit Leerlauf und externem Takt (siehe Bild 31-147 und Bild 31-148)
PRUSART0 | 1,8 % | 11,4 %
PRTWI | 3,9 % | 24,4 %
PRTIM2 | 2,9 % | 18,6 %
PRTIM1 | 2,1 % | 13,6 %
PRTIM0 | 0,8 % | 5,2 %
PRSPI | 3,5 % | 21,5 %
PRADC | 4,2 % | 26,3 %
It is possible to calculate the typical current consumption based on the numbers from Tabelle 31-8 for other UCC und frequency settings than listed in Tabelle 31-7.

31.4.3.1 Beispiel

Berechne die zu erwartende Stromaufnahme im Leerlauf mit TIMER1, ADU und SPI bei UCC = 2,0 V und F = 1 MHz: Von Tabelle 31-8, dritte Spalte, we see that we need to add 13,6 % for the TIMER1, 26,3 % for the ADU und 21,5 % for the SPI module. Reading from Bild 31-147, we find that the idle current consumption is ≈0,027 mA at UCC = 2,0 V und F = 1 MHz. Die Gesamtstromaufnahme im Leerlauf mit TIMER1, ADU und SPI enabled, gives:
ICCtotal ≈ 0,027 mA ∙(1 + 0,136 + 0,263 + 0.215) ≈ 0,043 mA

31.4.4 Stromaufnahme bei Leistung-weg

Bild 31-152: ATmega88PA: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog deaktiviert)
Bild 31-153: ATmega88PA: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog aktiviert)

31.4.5 Stromaufnahme beim Leistung sparen

Bild 31-154: ATmega88PA: Stromaufnahme beim Leistung sparen vs. UCC (Watchdog deaktiviert und 32kHz Crystal Oscillator Running)

31.4.6 Stromaufnahme in Bereitschaft

Bild 31-155: ATmega88PA: Stromaufnahme in Bereitschaft vs. UCC (Watchdog deaktiviert)

31.4.7 Pin-Pullups

Bild 31-156: ATmega88PA: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 1,8 V)
Bild 31-157: ATmega88PA: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 2,7 V)
Bild 31-158: ATmega88PA: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 5 V)
Bild 31-159: ATmega88PA: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 1,8 V)
Bild 31-160: ATmega88PA: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 2,7 V)
Bild 31-161: ATmega88PA: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 5 V)

31.4.8 Treiberstärke der Pins

Bild 31-162: ATmega88PA: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (UCC = 3 V)
Bild 31-163: ATmega88PA: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (UCC = 5 V)
Bild 31-164: ATmega88PA: Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 3 V)
Bild 31-165: ATmega88PA: Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 5 V)

31.4.9 Schaltschwelle und Hysterese der Pins

Bild 31-166: ATmega88PA: Schaltschwelle vs. UCC (UIH, Pin liest „1“)
Bild 31-167: ATmega88PA: Schaltschwelle vs. UCC (UIL, Pin liest „0“)
Bild 31-168: ATmega88PA: Hysterese vs. UCC
Bild 31-169: ATmega88PA: Schaltschwelle vs. UCC am RESET-Pin (UIH, Pin liest „1“)
Bild 31-170: ATmega88PA: Schaltschwelle vs. UCC am RESET-Pin (UIL, Pin liest „0“)
Bild 31-171: ATmega88PA: Hysterese vs. UCC am RESET-Pin

31.4.10 Unterspannungsdetektor-Schwelle

Bild 31-172: ATmega88PA: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 1,8 V)
Bild 31-173: ATmega88PA: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 2,7 V)
Bild 31-174: ATmega88PA: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 4,3 V)
Bild 31-175: ATmega88PA: Kalibrierte Referenzspannung vs. Temperatur
Bild 31-176: ATmega88PA: Referenzspannung vs. UCC

31.4.11 Interner Oszillator

Bild 31-177: ATmega88PA: Watchdog-Oszillatorfrequenz vs. Temperatur
Bild 31-178: ATmega88PA: Watchdog-Oszillatorfrequenz vs. UCC
Bild 31-179: ATmega88PA: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. UCC
Bild 31-180: ATmega88PA: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. Temperatur
Bild 31-181: ATmega88PA: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. OSCCAL-Wert

31.4.12 Verbrauch der I/O-Module

Bild 31-182: ATmega88PA: Stromaufnahme des A/D-Wandlers vs. UCC (AREF = AUCC)
Bild 31-183: ATmega88PA: Stromaufnahme des Analogvergleichers vs. UCC
Bild 31-184: ATmega88PA: Strom der externen Spannungsreferenz AREF vs. UCC
Bild 31-185: ATmega88PA: Stromaufnahme des Unterspannungsdetektor vs. UCC
Bild 31-186: ATmega88PA: Programmierstrom vs. UCC

31.4.13 Reset-Verbrauch und -Pulsbreite

Bild 31-187: ATmega88PA: Stromaufnahme während Reset vs. Frequenz (0,1 – 1,0 MHz)
Bild 31-188: ATmega88PA: Stromaufnahme während Reset vs. Frequenz (1 - 20 MHz)
Bild 31-189: ATmega88PA: Minimale Resetpulsbreite vs. UCC

31.5 Diagramme ATmega168A

31.5.1 Strom unter Last

Bild 31-190: ATmega168A: Strom unter Last vs. Frequenz (0,1 – 1,0 MHz)
Bild 31-191: ATmega168A: Strom unter Last vs. Frequenz (1 – 20 MHz)
Bild 31-192: ATmega168A: Strom unter Last vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 31-193: ATmega168A: Strom unter Last vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 31-194: ATmega168A: Strom unter Last vs. UCC (Interner RC-Oszillator, 8 MHz)

31.5.2 Stromaufnahme im Leerlauf

Bild 31-195: ATmega168A: Stromaufnahme im Leerlauf vs. Frequenz (0,1 – 1,0 MHz)
Bild 31-196: ATmega168A: Stromaufnahme im Leerlauf vs. Frequenz (1 – 20 MHz)
Bild 31-197: IATmega168A: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 31-198: ATmega168A: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 31-199: ATmega168A: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 8 MHz)

31.5.3 ATmega168A Stromaufnahme der I/O-Module

Die folgenden Tabellen und Formeln können zur Berechnung der zusätzlichen Stromaufnahme der verschiedenen I/O-Module unter Last und im Leerlauf herangezogen werden. Das Freigeben und Sperren der I/O-Module wird über das Leistungs-Reduktions-Register gesteuert.
Tabelle 31-9: ATmega168A: Zusätzlicher Stromverbrauch der verschiedenen I/O-Module, in µA
PRR-Bit | Typische Werte
 | UCC = 2 V, F = 1 MHz | UCC = 3 V, F = 4 MHz | UCC = 5 V, F = 8 MHz
PRUSART0 | 2,86 µA | 20,3 µA | 52,2 µA
PRTWI | 6,00 µA | 44,1 µA | 122,0 µA
PRTIM2 | 4,97 µA | 33,2 µA | 79,8 µA
PRTIM1 | 3,50 µA | 23,0 µA | 55,3 µA
PRTIM0 | 1,43 µA | 9,2 µA | 21,4 µA
PRSPI | 5,01 µA | 38,6 µA | 111,4 µA
PRADC | 6,34 µA | 45,7 µA | 123,6 µA
Tabelle 31-10: ATmega168A: Zusätzlicher Stromverbrauch (in Prozent) unter Last und im Leerlauf
PRR-Bit | Zusätzlicher Stromverbrauch verglichen mit CPU-Last und externem Takt (siehe Bild 31-237 und Bild 31-238) | Zusätzlicher Stromverbrauch verglichen mit Leerlauf und externem Takt (siehe Bild 31-242 und Bild 31-243)
PRUSART0 | 1,5 % | 8,9 %
PRTWI | 3,2 % | 19,5 %
PRTIM2 | 2,4 % | 14,8 %
PRTIM1 | 1,7 % | 10,3 %
PRTIM0 | 0,7 % | 4,1 %
PRSPI | 2,9 % | 17,1 %
PRADC | 3,4 % | 20,3 %
It is possible to calculate the typical current consumption based on the numbers from Tabelle 31-12 for other UCC und frequency settings than listed in Tabelle 31-11.

31.5.3.1 Beispiel

Berechne die zu erwartende Stromaufnahme im Leerlauf mit TIMER1, ADU und SPI bei UCC = 2,0 V und F = 1 MHz: Von Tabelle 31-12, dritte Spalte, we see that we need to add 10,3 % for the TIMER1, 20,3 % for the ADU und 17,1 % for the SPI module. Reading from Bild 31-242, we find that the idle current consumption is ≈0,027 mA at UCC = 2,0 V und F = 1 MHz. The total current consumption in idle mode with TIMER1, ADU und SPI enabled, gives:
ICCtotal ≈ 0,027 mA ∙(1 + 0,103 + 0,203 + 0,171) ≈ 0,040 mA

31.5.4 Stromaufnahme bei Leistung-weg

Bild 31 – 200: ATmega168A: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog deaktiviert)
Bild 31 – 201: ATmega168A: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog aktiviert)

31.5.5 Stromaufnahme beim Leistung sparen

Bild 31 – 202: ATmega168A: Stromaufnahme beim Leistung sparen vs. UCC (Watchdog deaktiviert und 32kHz Crystal Oscillator Running)

31.5.6 Stromaufnahme in Bereitschaft

Bild 31 – 203: ATmega168A: Stromaufnahme in Bereitschaft vs. UCC (Watchdog deaktiviert)

31.5.7 Pin-Pullups

Bild 31 – 204: ATmega168A: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 1,8 V)
Bild 31 – 205: ATmega168A: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 2,7 V)
Bild 31 – 206: ATmega168A: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 5 V)
Bild 31 – 207: ATmega168A: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC =1.8 V)
Bild 31 – 208: ATmega168A: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC =2.7 V)
Bild 31 – 209: ATmega168A: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC =5 V)

31.5.8 Treiberstärke der Pins

Bild 31-210: ATmega168A: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (UCC = 3 V)
Bild 31-211: ATmega168A: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (UCC = 5 V)
Bild 31-212: ATmega168A: Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 3 V)
Bild 31-213: ATmega168A: Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 5 V)

31.5.9 Schaltschwelle und Hysterese der Pins

Bild 31-214: ATmega168A: Schaltschwelle vs. UCC (UIH, Pin liest „1“)
Bild 31-215: ATmega168A: Schaltschwelle vs. UCC (UIL, Pin liest „0“)
Bild 31-216: ATmega168A: Hysterese vs. UCC
Bild 31-217: ATmega168A: Schaltschwelle vs. UCC am RESET-Pin (UIH, Pin liest „1“)
Bild 31-218: ATmega168A: Schaltschwelle vs. UCC am RESET-Pin (UIL, Pin liest „0“)
Bild 31-219: ATmega168A: Hysterese vs. UCC am RESET-Pin

31.5.10 Unterspannungsdetektor-Schwelle

Bild 31-220: ATmega168A: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 1,8 V)
Bild 31-221: ATmega168A: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 2,7 V)
Bild 31-222: ATmega168A: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 4,3 V)
Bild 31-223: ATmega168A: Referenzspannung vs. UCC

31.5.11 Interner Oszillator

Bild 31-224: ATmega168A: Watchdog-Oszillatorfrequenz vs. Temperatur
Bild 31-225: ATmega168A: Watchdog-Oszillatorfrequenz vs. UCC
Bild 31-226: ATmega168A: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. UCC
Bild 31-227: ATmega168A: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. Temperatur
Bild 31-228: ATmega168A: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. OSCCAL-Wert

31.5.12 Verbrauch der I/O-Module

Bild 31-229: ATmega168A: Stromaufnahme des A/D-Wandlers vs. UCC (AREF = AUCC)
Bild 31-230: ATmega168A: Stromaufnahme des Analogvergleichers vs. UCC
Bild 31-231: ATmega168A: Strom der externen Spannungsreferenz AREF vs. UCC
Bild 31-232: ATmega168A: Stromaufnahme des Unterspannungsdetektor vs. UCC
Bild 31-233: ATmega168A: Programmierstrom vs. UCC

31.5.13 Reset-Verbrauch und -Pulsbreite

Bild 31-234: ATmega168A: Stromaufnahme während Reset vs. Frequenz (0.1 - 1,0 MHz)
Bild 31-235: ATmega168A: Stromaufnahme während Reset vs. Frequenz (1 - 20 MHz)
Bild 31-236: ATmega168A: Minimale Resetpulsbreite vs. UCC

31.6 Diagramme ATmega168PA

31.6.1 Strom unter Last

Bild 31-237: ATmega168PA: Strom unter Last vs. Frequenz (0,1 – 1,0 MHz)
Bild 31-238: ATmega168PA: Strom unter Last vs. Frequenz (1 – 20 MHz)
Bild 31-239: ATmega168PA: Strom unter Last vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 31-240: ATmega168PA: Strom unter Last vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 31-241: ATmega168PA: Strom unter Last vs. UCC (Interner RC-Oszillator, 8 MHz)

31.6.2 Stromaufnahme im Leerlauf

Bild 31-242: ATmega168PA: Stromaufnahme im Leerlauf vs. Frequenz (0,1 – 1,0 MHz)
Bild 31-243: ATmega168PA: Stromaufnahme im Leerlauf vs. Frequenz (1 – 20 MHz)
Bild 31-244: ATmega168PA: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 31-245: ATmega168PA: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 31-246: ATmega168PA: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 8 MHz)

31.6.3 ATmega168PA Stromaufnahme der I/O-Module

Die folgenden Tabellen und Formeln können zur Berechnung der zusätzlichen Stromaufnahme der verschiedenen I/O-Module unter Last und im Leerlauf herangezogen werden. Das Freigeben und Sperren der I/O-Module wird über das Leistungs-Reduktions-Register gesteuert.
Tabelle 31-11: ATmega168PA: Zusätzlicher Stromverbrauch der verschiedenen I/O-Module, in µA
PRR-Bit | Typische Werte
 | UCC = 2 V, F = 1 MHz | UCC = 3 V, F = 4 MHz | UCC = 5 V, F = 8 MHz
PRUSART0 | 2,86 µA | 20,3 µA | 52,2 µA
PRTWI | 6,00 µA | 44,1 µA | 122,0 µA
PRTIM2 | 4,97 µA | 33,2 µA | 79,8 µA
PRTIM1 | 3,50 µA | 23,0 µA | 55,3 µA
PRTIM0 | 1,43 µA | 9,2 µA | 21,4 µA
PRSPI | 5,01 µA | 38,6 µA | 111,4 µA
PRADC | 6,34 µA | 45,7 µA | 123,6 µA
Tabelle 31-12: ATmega168PA: Zusätzlicher Stromverbrauch (in Prozent) unter Last und im Leerlauf
PRR-Bit | Zusätzlicher Stromverbrauch verglichen mit CPU-Last und externem Takt (siehe Bild 31-237 und Bild 31-238) | Zusätzlicher Stromverbrauch verglichen mit Leerlauf und externem Takt (siehe Bild 31-242 und Bild 31-243)
PRUSART0 | 1,5 % | 8,9 %
PRTWI | 3,2 % | 19,5 %
PRTIM2 | 2,4 % | 14,8 %
PRTIM1 | 1,7 % | 10,3 %
PRTIM0 | 0,7 % | 4,1 %
PRSPI | 2,9 % | 17,1 %
PRADC | 3,4 % | 20,3 %
It is possible to calculate the typical current consumption based on the numbers from Tabelle 31-12 for other UCC und frequency settings than listed in Tabelle 31-11.

31.6.3.1 Beispiel

Berechne die zu erwartende Stromaufnahme im Leerlauf mit TIMER1, ADU und SPI bei UCC = 2,0 V und F = 1 MHz: Von Tabelle 31-12, dritte Spalte, we see that we need to add 10,3 % for the TIMER1, 20,3 % for the ADU und 17,1 % for the SPI module. Reading from Bild 31-242, we find that the idle current consumption is ≈0,027 mA at UCC = 2,0 V und F = 1 MHz. The total current consumption in idle mode with TIMER1, ADU und SPI enabled, gives:
ICCtotal ≈ 0,02 mA ∙(1 + 0,103 + 0,203 + 0.171) ≈ 0,04 mA

31.6.4 Stromaufnahme bei Leistung-weg

Bild 31-247: ATmega168PA: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog deaktiviert)
Bild 31-248: ATmega168PA: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog aktiviert)

31.6.5 Stromaufnahme beim Leistung sparen

Bild 31-249: ATmega168PA: Stromaufnahme beim Leistung sparen vs. UCC (Watchdog deaktiviert und 32kHz Crystal Oscillator Running)

31.6.6 Stromaufnahme in Bereitschaft

Bild 31-250: ATmega168PA: Stromaufnahme in Bereitschaft vs. UCC (Watchdog deaktiviert)

31.6.7 Pin-Pullups

Bild 31-251: ATmega168PA: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 1,8 V)
Bild 31-252: ATmega168PA: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 2,7 V)
Bild 31-253: ATmega168PA: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 5 V)
Bild 31-254: ATmega168PA: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 1,8 V)
Bild 31-255: ATmega168PA: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 2,7 V)
Bild 31-256: ATmega168PA: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 5 V)

31.6.8 Treiberstärke der Pins

Bild 31-257: ATmega168PA: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (UCC = 3 V)
Bild 31-258: ATmega168PA: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (UCC = 5 V)
Bild 31-259: ATmega168PA: Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 3 V)
Bild 31-260: ATmega168PA Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 5 V)

31.6.9 Schaltschwelle und Hysterese der Pins

Bild 31-261: ATmega168PA Schaltschwelle vs. UCC (UIH, Pin liest „1“)
Bild 31-262: ATmega168PA Schaltschwelle vs. UCC (UIL, Pin liest „0“)
Bild 31-263: ATmega168PA Hysterese vs. UCC
Bild 31-264: ATmega168PA: Schaltschwelle vs. UCC am RESET-Pin (UIH, Pin liest „1“)
Bild 31-265: ATmega168PA: Schaltschwelle vs. UCC am RESET-Pin (UIL, Pin liest „0“)
Bild 31-266: ATmega168PA: Hysterese vs. UCC am RESET-Pin

31.6.10 Unterspannungsdetektor-Schwelle

Bild 31-267: ATmega168PA: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 1,8 V)
Bild 31-268: ATmega168PA: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 2,7 V)
Bild 31-269: ATmega168PA: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 4,3 V)
Bild 31-270: ATmega168PA: Kalibrierte Referenzspannung vs. Temperatur
Bild 31-271: ATmega168PA: Kalibrierte Referenzspannung vs. UCC

31.6.11 Interner Oszillator

Bild 31-272: ATmega168PA: Watchdog-Oszillatorfrequenz vs. Temperatur
Bild 31-273: ATmega168PA: Watchdog-Oszillatorfrequenz vs. UCC
Bild 31-274: ATmega168PA: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. UCC
Bild 31-275: ATmega168PA: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. Temperatur
Bild 31-276: ATmega168PA: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. OSCCAL-Wert

31.6.12 Verbrauch der I/O-Module

Bild 31-277: ATmega168PA: Stromaufnahme des A/D-Wandlers vs. UCC (AREF = AUCC)
Bild 31-278: ATmega168PA: Stromaufnahme des Analogvergleichers vs. UCC
Bild 31-279: ATmega168PA: Strom der externen Spannungsreferenz AREF vs. UCC
Bild 31-280: ATmega168PA: Stromaufnahme des Unterspannungsdetektor vs. UCC
Bild 31-281: ATmega168PA: Programmierstrom vs. UCC

31.6.13 Reset-Verbrauch und -Pulsbreite

Bild 31-282: ATmega168PA: Stromaufnahme während Reset vs. Frequenz (0,1 – 1,0 MHz)
Bild 31-283: ATmega168PA: Stromaufnahme während Reset vs. Frequenz (1 - 20 MHz)
Bild 31-284: ATmega168PA: Minimum Reset Pulse Width vs. UCC

31.7 Diagramme ATmega328

31.7.1 Strom unter Last

Bild 31-285: ATmega328: Strom unter Last vs. Frequenz (0,1 – 1,0 MHz)
Bild 31-286: ATmega328: Strom unter Last vs. Frequenz (1 – 20 MHz)
Bild 31-287: ATmega328: Strom unter Last vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 31-288: ATmega328: Strom unter Last vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 31-289: ATmega328: Strom unter Last vs. UCC (Interner RC-Oszillator, 8 MHz)

31.7.2 Stromaufnahme im Leerlauf

Bild 31-290: ATmega328: Stromaufnahme im Leerlauf vs. Frequenz (0,1 – 1,0 MHz)
Bild 31-291: ATmega328: Stromaufnahme im Leerlauf vs. Frequenz (1 – 20 MHz)
Bild 31-292: ATmega328: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 31-293: ATmega328: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 31-294: ATmega328: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 8 MHz)

31.7.3 ATmega328: Stromaufnahme der I/O-Module

Die folgenden Tabellen und Formeln können zur Berechnung der zusätzlichen Stromaufnahme der verschiedenen I/O-Module unter Last und im Leerlauf herangezogen werden. Das Freigeben und Sperren der I/O-Module wird über das Leistungs-Reduktions-Register gesteuert.
Tabelle 31-13: ATmega328: Zusätzlicher Stromverbrauch der verschiedenen I/O-Module, in µA
PRR-Bit | Typische Werte
 | UCC = 2 V, F = 1 MHz | UCC = 3 V, F = 4 MHz | UCC = 5 V, F = 8 MHz
PRUSART0 | 3,20 µA | 22,17 µA | 100,25 µA
PRTWI | 7,34 µA | 46,55 µA | 199,25 µA
PRTIM2 | 7,34 µA | 50,79 µA | 224,25 µA
PRTIM1 | 6,19 µA | 41,25 µA | 176,25 µA
PRTIM0 | 1,89 µA | 14,28 µA | 61,13 µA
PRSPI | 6,94 µA | 43,84 µA | 186,50 µA
PRADC | 8,66 µA | 61,80 µA | 295,38 µA
Tabelle 31-14: ATmega328: Zusätzlicher Stromverbrauch (in Prozent) unter Last und im Leerlauf
PRR-Bit | Zusätzlicher Stromverbrauch verglichen mit CPU-Last und externem Takt (siehe Bild 31-332 und Bild 31-333) | Zusätzlicher Stromverbrauch verglichen mit Leerlauf und externem Takt (siehe Bild 31-337 und Bild 31-338)
PRUSART0 | 1,4 % | 7,8 %
PRTWI | 3,0 % | 16,6 %
PRTIM2 | 3,3 % | 17,8 %
PRTIM1 | 2,7 % | 14,5 %
PRTIM0 | 0,9 % | 4,8 %
PRSPI | 2,9 % | 15,7 %
PRADC | 4,1 % | 22,1 %
It is possible to calculate the typical current consumption based on the numbers from Tabelle 31-13 for other UCC und frequency settings than listed in Tabelle 31-14.

31.7.3.1 Beispiel

Berechne die zu erwartende Stromaufnahme im Leerlauf mit TIMER1, ADU und SPI bei UCC = 2,0 V und F = 1 MHz: Von Tabelle 31-14, dritte Spalte, we see that we need to add 14,5 % for the TIMER1, 22,1 % for the ADU und 15,7 % for the SPI module. Reading from Bild 31-338, we find that the idle current consumption is ≈0,055 mA at UCC = 2,0 V und F = 1 MHz. Die Gesamtstromaufnahme im Leerlauf mit TIMER1, ADU und SPI enabled, gives:
ICCtotal ≈ 0,045 mA ∙(1 + 0,145 + 0,221 + 0.157) ≈ 0,069 mA

31.7.4 Stromaufnahme bei Leistung-weg

Bild 31-295: ATmega328: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog deaktiviert)
Bild 31-296: ATmega328: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog aktiviert)

31.7.5 Stromaufnahme beim Leistung sparen

Bild 31-297: ATmega328: Stromaufnahme beim Leistung sparen vs. UCC (Watchdog deaktiviert und 32kHz Crystal Oscillator Running)

31.7.6 Stromaufnahme in Bereitschaft

Bild 31-298: ATmega328: Stromaufnahme in Bereitschaft vs. UCC (Watchdog deaktiviert)

31.7.7 Pin-Pullups

Bild 31-299: ATmega328: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 1,8 V)
Bild 31-300: ATmega328: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 2,7 V)
Bild 31-301: ATmega328: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 5 V)
Bild 31-302: ATmega328: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC =1.8 V)
Bild 31-303: ATmega328: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC =2.7 V)
Bild 31-304: ATmega328: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 5 V)

31.7.8 Treiberstärke der Pins

Bild 31-305: ATmega328: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (UCC = 3 V)
Bild 31-306: ATmega328: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (UCC = 5 V)
Bild 31-307: ATmega328: Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 3 V)
Bild 31-308: ATmega328: Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 5 V)

31.7.9 Schaltschwelle und Hysterese der Pins

Bild 31-309: ATmega328: Schaltschwelle vs. UCC (UIH, Pin liest „1“)
Bild 31-310: ATmega328: Schaltschwelle vs. UCC (UIL, Pin liest „0“)
Bild 31-311: ATmega328: Hysterese vs. UCC
Bild 31-312: ATmega328: Schaltschwelle vs. UCC am RESET-Pin (UIH, Pin liest „1“)
Bild 31-313: ATmega328: Schaltschwelle vs. UCC am RESET-Pin (UIL, Pin liest „0“)
Bild 31-314: ATmega328: Hysterese vs. UCC am RESET-Pin

31.7.10 Unterspannungsdetektor-Schwelle

Bild 31-315: ATmega328: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 1,8 V)
Bild 31-316: ATmega328: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 2,7 V)
Bild 31-317: ATmega328: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 4,3 V)
Bild 31-318: ATmega328: Referenzspannung vs. UCC

31.7.11 Interner Oszillator

Bild 31-319: ATmega328: Watchdog-Oszillatorfrequenz vs. Temperatur
Bild 31-320: ATmega328: Watchdog-Oszillatorfrequenz vs. UCC
Bild 31-321: ATmega328: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. UCC
Bild 31-322: ATmega328: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. Temperatur
Bild 31-323: ATmega328: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. OSCCAL-Wert

31.7.12 Verbrauch der I/O-Module

Bild 31-324: ATmega328: Stromaufnahme des A/D-Wandlers vs. UCC (AREF = AUCC)
Bild 31-325: ATmega328: Stromaufnahme des Analogvergleichers vs. UCC
Bild 31-326: ATmega328: Strom der externen Spannungsreferenz AREF vs. UCC
Bild 31-327: ATmega328: Stromaufnahme des Unterspannungsdetektor vs. UCC
Bild 31-328: ATmega328: Programmierstrom vs. UCC

31.7.13 Reset-Verbrauch und -Pulsbreite

Bild 31-329: ATmega328: Stromaufnahme während Reset vs. Frequenz (0.1 - 1,0 MHz)
Bild 31-330: ATmega328: Stromaufnahme während Reset vs. Frequenz (1 - 20 MHz)
Bild 31-331: ATmega328: Minimale Resetpulsbreite vs. UCC

31.8 Diagramme ATmega328P

31.8.1 Strom unter Last

Bild 31-332: ATmega328P: Strom unter Last vs. Frequenz (0,1 – 1,0 MHz)
Bild 31-333: ATmega328P: Strom unter Last vs. Frequenz (1 – 20 MHz)
Bild 31-334: ATmega328P: Strom unter Last vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 31-335: ATmega328P: Strom unter Last vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 31-336: ATmega328P: Strom unter Last vs. UCC (Interner RC-Oszillator, 8 MHz)

31.8.2 Stromaufnahme im Leerlauf

Bild 31-337: ATmega328P: Stromaufnahme im Leerlauf vs. Frequenz (0,1 – 1,0 MHz)
Bild 31-338: ATmega328P: Stromaufnahme im Leerlauf vs. Frequenz (1 – 20 MHz)
Bild 31-339: ATmega328P: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 31-340: ATmega328P: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 31-341: ATmega328P Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 8 MHz)

31.8.3 ATmega328P Stromaufnahme der I/O-Module

Die folgenden Tabellen und Formeln können zur Berechnung der zusätzlichen Stromaufnahme der verschiedenen I/O-Module unter Last und im Leerlauf herangezogen werden. Das Freigeben und Sperren der I/O-Module wird über das Leistungs-Reduktions-Register gesteuert.
Tabelle 31-15: ATmega328P: Zusätzlicher Stromverbrauch der verschiedenen I/O-Module, in µA
PRR-Bit | Typische Werte
 | UCC = 2 V, F = 1 MHz | UCC = 3 V, F = 4 MHz | UCC = 5 V, F = 8 MHz
PRUSART0 | 3,20 µA | 22,17 µA | 100,25 µA
PRTWI | 7,34 µA | 46,55 µA | 199,25 µA
PRTIM2 | 7,34 µA | 50,79 µA | 224,25 µA
PRTIM1 | 6,19 µA | 41,25 µA | 176,25 µA
PRTIM0 | 1,89 µA | 14,28 µA | 61,13 µA
PRSPI | 6,94 µA | 43,84 µA | 186,50 µA
PRADC | 8,66 µA | 61,80 µA | 295,38 µA
Tabelle 31-16: ATmega328P: Zusätzlicher Stromverbrauch (in Prozent) unter Last und im Leerlauf
PRR-Bit | Zusätzlicher Stromverbrauch verglichen mit CPU-Last und externem Takt (siehe Bild 31-332 und Bild 31-333) | Zusätzlicher Stromverbrauch verglichen mit Leerlauf und externem Takt (siehe Bild 31-337 und Bild 31-338)
PRUSART0 | 1,4 % | 7,8 %
PRTWI | 3,0 % | 16,6 %
PRTIM2 | 3,3 % | 17,8 %
PRTIM1 | 2,7 % | 14,5 %
PRTIM0 | 0,9 % | 4,8 %
PRSPI | 2,9 % | 15,7 %
PRADC | 4,1 % | 22,1 %
It is possible to calculate the typical current consumption based on the numbers from Tabelle 31-15 for other UCC und frequency settings than listed in Tabelle 31-16.

31.8.3.1 Beispiel

Berechne die zu erwartende Stromaufnahme im Leerlauf mit TIMER1, ADU und SPI bei UCC = 2,0 V und F = 1 MHz: Von Tabelle 31-16, dritte Spalte, we see that we need to add 14,5 % for the TIMER1, 22,1 % for the ADU und 15,7 % for the SPI module. Reading from Bild 31-338, we find that the idle current consumption is ≈0,055 mA at UCC = 2,0 V und F = 1 MHz. Die Gesamtstromaufnahme im Leerlauf mit TIMER1, ADU und SPI enabled, gives:
ICCtotal ≈ 0,045 mA ∙(1 + 0,145 + 0,221 + 0.157) ≈ 0,069 mA

31.8.4 Stromaufnahme bei Leistung-weg

Bild 31-342: ATmega328P: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog deaktiviert
Bild 31-343: ATmega328P: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog aktiviert)

31.8.5 Stromaufnahme beim Leistung sparen

Bild 31-344: ATmega328P: Stromaufnahme beim Leistung sparen vs. UCC (Watchdog deaktiviert und 32kHz Crystal Oscillator Running)

31.8.6 Stromaufnahme in Bereitschaft

Bild 31-345: ATmega328P: Stromaufnahme in Bereitschaft vs. UCC (Watchdog deaktiviert)

31.8.7 Pin-Pullups

Bild 31-346: ATmega328P: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 1,8 V)
Bild 31-347: ATmega328P: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 2,7 V)
Bild 31-348: ATmega328P: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 5 V)
Bild 31-349: ATmega328P: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 1,8 V)
Bild 31-350: ATmega328P: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 2,7 V)
Bild 31-351: ATmega328P: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 5 V)

31.8.8 Treiberstärke der Pins

Bild 31-352: ATmega328P: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (UCC = 3 V)
Bild 31-353: ATmega328P: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (UCC = 5 V)
Bild 31-354: ATmega328P: Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 3 V)
Bild 31-355: ATmega328P: Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 5 V)

31.8.9 Schaltschwelle und Hysterese der Pins

Bild 31-356: ATmega328P: Schaltschwelle vs. UCC (UIH, Pin liest „1“)
Bild 31-357: ATmega328P: Schaltschwelle vs. UCC (UIL, Pin liest „0“)
Bild 31-358: ATmega328P: Hysterese vs. UCC
Bild 31-359: ATmega328P: Schaltschwelle vs. UCC am RESET-Pin (UIH, Pin liest „1“)
Bild 31-360: ATmega328P: Schaltschwelle vs. UCC am RESET-Pin (UIL, Pin liest „0“)
Bild 31-361: ATmega328P: Hysterese vs. UCC am RESET-Pin

31.8.10 Unterspannungsdetektor-Schwelle

Bild 31-362: ATmega328P: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 1,8 V)
Bild 31-363: ATmega328P Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 2,7 V)
Bild 31-364: ATmega328P Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 4,3 V)
Bild 31-365: ATmega328P: Kalibrierte Referenzspannung vs. UCC

31.8.11 Interner Oszillator

Bild 31-366: ATmega328P: Watchdog-Oszillatorfrequenz vs. Temperatur
Bild 31-367: ATmega328PC Watchdog-Oszillatorfrequenz vs. UCC
Bild 31-368: ATmega328P: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. UCC
Bild 31-369: ATmega328P: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. Temperatur
Bild 31-370: ATmega328P Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. OSCCAL-Wert

31.8.12 Verbrauch der I/O-Module

Bild 31-371: ATmega328P: Stromaufnahme des A/D-Wandlers vs. UCC (AREF = AUCC)
Bild 31-372: ATmega328P: Stromaufnahme des Analogvergleichers vs. UCC
Bild 31-373: ATmega328P: Strom der externen Spannungsreferenz AREF vs. UCC
Bild 31-374: ATmega328P: Stromaufnahme des Unterspannungsdetektor vs. UCC
Bild 31-375: ATmega328P: Programmierstrom vs. UCC

31.8.13 Reset-Verbrauch und -Pulsbreite

Bild 31-376: ATmega328P: Stromaufnahme während Reset vs. Frequenz (0,1 – 1,0 MHz)
Bild 31-377: ATmega328P Stromaufnahme während Reset vs. Frequenz (1 - 20 MHz)
Bild 31-378: ATmega328P: Minimum Reset Pulse Width vs. UCC


Diagramme ATmega48PA (-40 … +105 °C)

32. Diagramme ATmega48PA (-40 … +105 °C)

Die nachfolgenden Diagramme zeigen das typische Verhalten. Diese Daten sind nicht getestet. Alle Stromverbrauchs-Messungen wurden durchgeführt als alle I/O-Pins als Eingang konfiguriert und die internen pull-up-Widerstände freigegeben waren. Als Taktquelle wurde ein Rechteckgenerator mit Rail-to-Rail-Ausgang verwendet.

Alle Verbräuche wurden gemessen, wenn alle Bits im PRR-Register gesetzt wurden und damit alle Peripherieeinheiten deaktiviert wurden. Außerdem wurde der Analogvergleicher abgeschaltet.

Der Stromverbrauch im Leistung-weg-Modus ist unabhängig von der Taktquelle.

Der Stromverbrauch hängt von verschiedenen Faktoren ab: Der Versorgungsspannung, der Taktfrequenz, den Zuständen an den I/O-Pins, der Schaltrate der I/O-Pins, dem ausgeführten Befehl und der Umgebungstemperatur. Die wesentlichen Faktoren sind die Versorgungsspannung und die Taktfrequenz.

Der Stromverbrauch eines kapazitiv belasteten Pins kann abgeschätzt werden mit CL · UCC · f, wobei CL der Kapazität, UCC der Versorgungsspannung und f der Schaltfrequenz des I/O-Pins entspricht.

Die Diagramme enthalten Frequenzen, die höher sind als die Testlimits. Die Chips garantieren aber keine korrekte Funktion bei Frequenzen oberhalb des in der Bestellbezeichnung angegebenen Wertes.

Die Differenz beim Stromverbrauch zwischen Leistung-weg-Modus mit und ohne freigegebenen Watchdog entspricht dem Stromverbrauch des Watchdogs.

32.1 Strom unter Last

Bild 32-1: ATmega48PA: Strom unter Last vs. Frequenz (0,1 - 1,0 MHz)
Bild 32-2: ATmega48PA: Strom unter Last vs. Frequenz (1 - 20 MHz)
Bild 32-3: ATmega48PA: Strom unter Last vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 32-4: ATmega48PA: Strom unter Last vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 32-5: ATmega48PA: Strom unter Last vs. UCC (Interner RC-Oszillator, 8 MHz)

32.2 Stromaufnahme im Leerlauf

Bild 32-6: ATmega48PA: Stromaufnahme im Leerlauf vs. Frequenz (0,1 - 1,0 MHz)
Bild 32-7: ATmega48PA: Stromaufnahme im Leerlauf vs. Frequenz (1 - 20 MHz)
Bild 32-8: ATmega48PA: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 32-9: ATmega48PA: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 32-10: ATmega48PA: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 8 MHz)

32.3 Stromaufnahme bei Leistung-weg

Bild 32-11: ATmega48PA: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog deaktiviert)
Bild 32-12: ATmega48PA: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog aktiviert)

32.4 Stromaufnahme in Bereitschaft

Bild 32-13: ATmega48PA: Stromaufnahme in Bereitschaft vs. UCC (Watchdog deaktiviert)

32.5 Pin-Pullups

Bild 32-14: ATmega48PA: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 1,8 V)
Bild 32-15: ATmega48PA: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 2,7 V)
Bild 32-16: ATmega48PA: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 5 V)
Bild 32-17: ATmega48PA: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 1,8 V))
Bild 32-18: ATmega48PA: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (V = 2,7 V)
Bild 32-19: ATmega48PA: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 5 V)

32.6 Treiberstärke der Pins

Bild 32-20: ATmega48PA: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (UCC = 3 V)
Bild 32-21: ATmega48PA: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (UCC = 5 V)
Bild 32-22: ATmega48PA: Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 3 V)
Bild 32-23: ATmega48PA: Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 5 V)

32.7 Schaltschwelle und Hysterese der Pins

Bild 32-24: ATmega48PA: Schaltschwelle vs. UCC (UIH, Pin liest „1“)
Bild 32-25: ATmega48PA: Schaltschwelle vs. UCC (UIL, Pin liest „0“)
Bild 32-26: ATmega48PA: Hysterese vs. UCC
Bild 32-27: ATmega48PA: Schaltschwelle vs. UCC am RESET-Pin (UIH, Pin liest „1“)
Bild 32-28: ATmega48PA: Schaltschwelle vs. UCC am RESET-Pin (UIL, Pin liest „0“)
Bild 32-29: ATmega48PA: Hysterese vs. UCC am RESET-Pin

32.8 Unterspannungsdetektor-Schwelle

Bild 32-30: ATmega48PA: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 1,8 V)
Bild 32-31: ATmega48PA: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 2,7 V)
Bild 32-32: ATmega48PA: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 4,3 V)

32.9 Interner Oszillator

Bild 32-33: ATmega48PA: Watchdog-Oszillatorfrequenz vs. Temperatur
Bild 32-34: ATmega48PA: Watchdog-Oszillatorfrequenz vs. UCC
Bild 32-35: ATmega48PA: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. UCC
Bild 32-36: ATmega48PA: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. Temperatur
Bild 32-37: ATmega48PA: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. OSCCAL-Wert

32.10 Verbrauch der I/O-Module

Bild 32-38: ATmega48PA: Stromaufnahme des A/D-Wandlers vs. UCC (AREF = AUCC)
Bild 32-39: ATmega48PA: Stromaufnahme des Analogvergleichers vs. UCC
Bild 32-40: ATmega48PA: Strom der externen Spannungsreferenz AREF vs. UCC
Bild 32-41: ATmega48PA Stromaufnahme des Unterspannungsdetektor vs. UCC
Bild 32-42: ATmega48PA: Programmierstrom vs. UCC

32.11 Reset-Verbrauch und -Pulsbreite

Bild 32-43: ATmega48PA: Stromaufnahme während Reset vs. Frequenz (0.1 - 1,0 MHz)
Bild 32-44: ATmega48PA: Stromaufnahme während Reset vs. Frequenz (1 - 20 MHz)
Bild 32-45: ATmega48PA: Minimale Resetpulsbreite vs. UCC


Diagramme ATmega88PA (-40 … +105 °C)

33. Diagramme ATmega88PA (-40 … +105 °C)

Die nachfolgenden Diagramme zeigen das typische Verhalten. Diese Daten sind nicht getestet. Alle Stromverbrauchs-Messungen wurden durchgeführt als alle I/O-Pins als Eingang konfiguriert und die internen pull-up-Widerstände freigegeben waren. Als Taktquelle wurde ein Rechteckgenerator mit Rail-to-Rail-Ausgang verwendet.

Alle Verbräuche wurden gemessen, wenn alle Bits im PRR-Register gesetzt wurden und damit alle Peripherieeinheiten deaktiviert wurden. Außerdem wurde der Analogvergleicher abgeschaltet.

Der Stromverbrauch im Leistung-weg-Modus ist unabhängig von der Taktquelle.

Der Stromverbrauch hängt von verschiedenen Faktoren ab: Der Versorgungsspannung, der Taktfrequenz, den Zuständen an den I/O-Pins, der Schaltrate der I/O-Pins, dem ausgeführten Befehl und der Umgebungstemperatur. Die wesentlichen Faktoren sind die Versorgungsspannung und die Taktfrequenz.

Der Stromverbrauch eines kapazitiv belasteten Pins kann abgeschätzt werden mit CL · UCC · f, wobei CL der Kapazität, UCC der Versorgungsspannung und f der Schaltfrequenz des I/O-Pins entspricht.

Die Diagramme enthalten Frequenzen, die höher sind als die Testlimits. Die Chips garantieren aber keine korrekte Funktion bei Frequenzen oberhalb des in der Bestellbezeichnung angegebenen Wertes.

Die Differenz beim Stromverbrauch zwischen Leistung-weg-Modus mit und ohne freigegebenen Watchdog entspricht dem Stromverbrauch des Watchdogs.

33.1 Strom unter Last

Bild 33-1: ATmega88PA: Strom unter Last vs. Frequenz (0,1 - 1,0 MHz)
Bild 33-2: ATmega88PA: Strom unter Last vs. Frequenz (1 - 20 MHz)
Bild 33-3: ATmega88PA: Strom unter Last vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 33-4: ATmega88PA: Strom unter Last vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 33-5: ATmega88PA: Strom unter Last vs. UCC (Interner RC-Oszillator, 8 MHz)

33.2 Stromaufnahme im Leerlauf

Bild 33-6: ATmega88PA: Stromaufnahme im Leerlauf vs. Frequenz (0,1 - 1,0 MHz)
Bild 33-7: ATmega88PA: Stromaufnahme im Leerlauf vs. Frequenz (1 - 20 MHz)
Bild 33-8: ATmega88PA: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 33-9: ATmega88PA: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 33-10: ATmega88PA: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 8 MHz)

33.3 Stromaufnahme bei Leistung-weg

Bild 33-11: ATmega88PA: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog deaktiviert)
Bild 33-12: ATmega88PA: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog aktiviert)

33.4 Stromaufnahme bei Leistung-sparen

Bild 33-13: ATmega88PA: Stromaufnahme bei Leistung-sparen vs. UCC (Watchdog deaktiviert)

33.5 Pin-Pullups

Bild 33-14: ATmega88PA: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 1,8 V)
Bild 33-15: ATmega88PA: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 2,7 V)
Bild 33-16: ATmega88PA: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 5 V)
Bild 33-17: ATmega88PA: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 1,8 V))
Bild 33-18: ATmega88PA: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (V = 2,7 V)
Bild 33-19: ATmega88PA: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 5 V)

33.6 Treiberstärke der Pins

Bild 33-20: ATmega88PA: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (UCC = 3 V)
Bild 33-21: ATmega88PA: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (UCC = 5 V)
Bild 33-22: ATmega88PA: Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 3 V)
Bild 33-23: ATmega88PA: Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 5 V)

33.7 Schaltschwelle und Hysterese der Pins

Bild 33-24: ATmega88PA: Schaltschwelle vs. UCC (UIH, Pin liest „1“)
Bild 33-25: ATmega88PA: Schaltschwelle vs. UCC (UIL, Pin liest „0“)
Bild 33-26: ATmega88PA: Hysterese vs. UCC
Bild 33-27: ATmega88PA: Schaltschwelle vs. UCC am RESET-Pin (UIH, Pin liest „1“)
Bild 33-28: ATmega88PA: Schaltschwelle vs. UCC am RESET-Pin (UIL, Pin liest „0“)
Bild 33-29: ATmega88PA: Hysterese vs. UCC am RESET-Pin

33.8 Unterspannungsdetektor-Schwelle

Bild 33-30: ATmega88PA: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 1,8 V)
Bild 33-31: ATmega88PA: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 2,7 V)
Bild 33-32: ATmega88PA: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 4,3 V)

33.9 Interner Oszillator

Bild 33-33: ATmega88PA: Watchdog-Oszillatorfrequenz vs. Temperatur
Bild 33-34: ATmega88PA: Watchdog-Oszillatorfrequenz vs. UCC
Bild 33-35: ATmega88PA: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. UCC
Bild 33-36: ATmega88PA: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. Temperatur
Bild 33-37: ATmega88PA: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. OSCCAL-Wert

33.10 Verbrauch der I/O-Module

Bild 33-38: ATmega88PA: Stromaufnahme des A/D-Wandlers vs. UCC (AREF = AUCC)
Bild 33-39: ATmega88PA: Stromaufnahme des Analogvergleichers vs. UCC
Bild 33-40: ATmega88PA: Strom der externen Spannungsreferenz AREF vs. UCC
Bild 33-41: ATmega88PA Stromaufnahme des Unterspannungsdetektor vs. UCC
Bild 33-42: ATmega88PA: Programmierstrom vs. UCC

33.11 Reset-Verbrauch und -Pulsbreite

Bild 33-43: ATmega88PA: Stromaufnahme während Reset vs. Frequenz (0.1 - 1,0 MHz)
Bild 33-44: ATmega88PA: Stromaufnahme während Reset vs. Frequenz (1 - 20 MHz)
Bild 33-45: ATmega88PA: Minimale Resetpulsbreite vs. UCC


Diagramme ATmega168PA (-40 … +105 °C)

34. Diagramme ATmega168PA (-40 … +105 °C)

Die nachfolgenden Diagramme zeigen das typische Verhalten. Diese Daten sind nicht getestet. Alle Stromverbrauchs-Messungen wurden durchgeführt als alle I/O-Pins als Eingang konfiguriert und die internen pull-up-Widerstände freigegeben waren. Als Taktquelle wurde ein Rechteckgenerator mit Rail-to-Rail-Ausgang verwendet.

Der Stromverbrauch im Leistung-weg-Modus ist unabhängig von der Taktquelle.

Der Stromverbrauch hängt von verschiedenen Faktoren ab: Der Versorgungsspannung, der Taktfrequenz, den Zuständen an den I/O-Pins, der Schaltrate der I/O-Pins, dem ausgeführten Befehl und der Umgebungstemperatur. Die wesentlichen Faktoren sind die Versorgungsspannung und die Taktfrequenz.

Der Stromverbrauch eines kapazitiv belasteten Pins kann abgeschätzt werden mit CL · UCC · f, wobei CL der Kapazität, UCC der Versorgungsspannung und f der Schaltfrequenz des I/O-Pins entspricht.

Die Diagramme enthalten Frequenzen, die höher sind als die Testlimits. Die Chips garantieren aber keine korrekte Funktion bei Frequenzen oberhalb des in der Bestellbezeichnung angegebenen Wertes.

Die Differenz beim Stromverbrauch zwischen Leistung-weg-Modus mit und ohne freigegebenen Watchdog entspricht dem Stromverbrauch des Watchdogs.

34.1 Strom unter Last

Bild 34-1: ATmega168PA: Strom unter Last vs. Frequenz (0,1 - 1,0 MHz)
Bild 34-2: ATmega168PA: Strom unter Last vs. Frequenz (1 - 20 MHz)
Bild 34-3: ATmega168PA: Strom unter Last vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 34-4: ATmega168PA: Strom unter Last vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 34-5: ATmega168PA: Strom unter Last vs. UCC (Interner RC-Oszillator, 8 MHz)

34.2 Stromaufnahme im Leerlauf

Bild 34-6: ATmega168PA: Stromaufnahme im Leerlauf vs. Frequenz (0,1 - 1,0 MHz)
Bild 34-7: ATmega168PA: Stromaufnahme im Leerlauf vs. Frequenz (1 - 20 MHz)
Bild 34-8: ATmega168PA: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 34-9: ATmega168PA: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 34-10: ATmega168PA: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 8 MHz)

34.3 Stromaufnahme bei Leistung-weg

Bild 34-11: ATmega168PA: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog deaktiviert)
Bild 34-12: ATmega168PA: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog aktiviert)

34.4 Stromaufnahme bei Leistung-sparen

Bild 34-13: ATmega168PA: Stromaufnahme bei Leistung-sparen vs. UCC (Watchdog deaktiviert)

32.5 Stromaufnahme in Bereitschaft

Bild 32-14: ATmega168PA: Stromaufnahme in Bereitschaft vs. UCC (Watchdog deaktiviert)

34.6 Pin-Pullups

Bild 34-15: ATmega168PA: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 1,8 V)
Bild 34-16: ATmega168PA: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 2,7 V)
Bild 34-17: ATmega168PA: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 5 V)
Bild 34-18: ATmega168PA: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 1,8 V))
Bild 34-19: ATmega168PA: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (V = 2,7 V)
Bild 34-20: ATmega168PA: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 5 V)

34.7 Treiberstärke der Pins

Bild 34-21: ATmega168PA: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (UCC = 3 V)
Bild 34-22: ATmega168PA: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (UCC = 5 V)
Bild 34-23: ATmega168PA: Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 3 V)
Bild 34-24: ATmega168PA: Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 5 V)

34.8 Schaltschwelle und Hysterese der Pins

Bild 34-25: ATmega168PA: Schaltschwelle vs. UCC (UIH, Pin liest „1“)
Bild 34-26: ATmega168PA: Schaltschwelle vs. UCC (UIL, Pin liest „0“)
Bild 34-27: ATmega168PA: Hysterese vs. UCC
Bild 34-28: ATmega168PA: Schaltschwelle vs. UCC am RESET-Pin (UIH, Pin liest „1“)
Bild 34-29: ATmega168PA: Schaltschwelle vs. UCC am RESET-Pin (UIL, Pin liest „0“)
Bild 34-30: ATmega168PA: Hysterese vs. UCC am RESET-Pin

34.9 Unterspannungsdetektor-Schwelle

Bild 34-31: ATmega168PA: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 1,8 V)
Bild 34-32: ATmega168PA: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 2,7 V)
Bild 34-33: ATmega168PA: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 4,3 V)
Bild 34-34: ATmega168PA: Referenzspannung vs. UCC
Bild 34-35: ATmega168PA: Referenzspannung vs. Temperatur

34.10 Interner Oszillator

Bild 34-36: ATmega168PA: Watchdog-Oszillatorfrequenz vs. Temperatur
Bild 34-37: ATmega168PA: Watchdog-Oszillatorfrequenz vs. UCC
Bild 34-38: ATmega168PA: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. UCC
Bild 34-39: ATmega168PA: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. Temperatur
Bild 34-40: ATmega168PA: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. OSCCAL-Wert

34.11 Verbrauch der I/O-Module

Bild 34-41: ATmega168PA: Stromaufnahme des A/D-Wandlers vs. UCC (AREF = AUCC)
Bild 34-42: ATmega168PA: Stromaufnahme des Analogvergleichers vs. UCC
Bild 34-43: ATmega168PA: Strom der externen Spannungsreferenz AREF vs. UCC
Bild 34-44: ATmega168PA Stromaufnahme des Unterspannungsdetektor vs. UCC
Bild 34-45: ATmega168PA: Programmierstrom vs. UCC

34.12 Reset-Verbrauch und -Pulsbreite

Bild 34-46: ATmega168PA: Stromaufnahme während Reset vs. Frequenz (0.1 - 1,0 MHz)
Bild 34-47: ATmega168PA: Stromaufnahme während Reset vs. Frequenz (1 - 20 MHz)
Bild 34-48: ATmega168PA: Minimale Resetpulsbreite vs. UCC


Diagramme ATmega32P (-40 … +105 °C)

35. Diagramme ATmega32P (-40 … +105 °C)

Die nachfolgenden Diagramme zeigen das typische Verhalten. Diese Daten sind nicht getestet. Alle Stromverbrauchs-Messungen wurden durchgeführt als alle I/O-Pins als Eingang konfiguriert und die internen pull-up-Widerstände freigegeben waren. Als Taktquelle wurde ein Rechteckgenerator mit Rail-to-Rail-Ausgang verwendet.

Der Stromverbrauch im Leistung-weg-Modus ist unabhängig von der Taktquelle.

Der Stromverbrauch hängt von verschiedenen Faktoren ab: Der Versorgungsspannung, der Taktfrequenz, den Zuständen an den I/O-Pins, der Schaltrate der I/O-Pins, dem ausgeführten Befehl und der Umgebungstemperatur. Die wesentlichen Faktoren sind die Versorgungsspannung und die Taktfrequenz.

Der Stromverbrauch eines kapazitiv belasteten Pins kann abgeschätzt werden mit CL · UCC · f, wobei CL der Kapazität, UCC der Versorgungsspannung und f der Schaltfrequenz des I/O-Pins entspricht.

Die Diagramme enthalten Frequenzen, die höher sind als die Testlimits. Die Chips garantieren aber keine korrekte Funktion bei Frequenzen oberhalb des in der Bestellbezeichnung angegebenen Wertes.

Die Differenz beim Stromverbrauch zwischen Leistung-weg-Modus mit und ohne freigegebenen Watchdog entspricht dem Stromverbrauch des Watchdogs.

35.1 Strom unter Last

Bild 35-1: ATmega32P: Strom unter Last vs. Frequenz (0,1 - 1,0 MHz)
Bild 35-2: ATmega32P: Strom unter Last vs. Frequenz (1 - 20 MHz)
Bild 35-3: ATmega32P: Strom unter Last vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 35-4: ATmega32P: Strom unter Last vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 35-5: ATmega32P: Strom unter Last vs. UCC (Interner RC-Oszillator, 8 MHz)

35.2 Stromaufnahme im Leerlauf

Bild 35-6: ATmega32P: Stromaufnahme im Leerlauf vs. Frequenz (0,1 - 1,0 MHz)
Bild 35-7: ATmega32P: Stromaufnahme im Leerlauf vs. Frequenz (1 - 20 MHz)
Bild 35-8: ATmega32P: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 128kHz)
Bild 35-9: ATmega32P: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 1 MHz)
Bild 35-10: ATmega32P: Stromaufnahme im Leerlauf vs. UCC (Interner RC-Oszillator, 8 MHz)

35.3 Stromaufnahme bei Leistung-weg

Bild 35-11: ATmega32P: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog deaktiviert)
Bild 35-12: ATmega32P: Stromaufnahme bei Leistung-weg vs. UCC (Watchdog aktiviert)

35.4 Stromaufnahme bei Leistung-sparen

Bild 35-13: ATmega32P: Stromaufnahme bei Leistung-sparen vs. UCC (Watchdog deaktiviert)

32.5 Stromaufnahme in Bereitschaft

Bild 32-14: ATmega32P: Stromaufnahme in Bereitschaft vs. UCC (Watchdog deaktiviert)

35.6 Pin-Pullups

Bild 35-15: ATmega32P: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 1,8 V)
Bild 35-16: ATmega32P: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 2,7 V)
Bild 35-17: ATmega32P: Strom durch Pullup-Widerstand vs. Eingangsspannung (UCC = 5 V)
Bild 35-18: ATmega32P: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 1,8 V))
Bild 35-19: ATmega32P: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (V = 2,7 V)
Bild 35-20: ATmega32P: Strom durch Pullup-Widerstand vs. Spannung am RESET-Pin (UCC = 5 V)

35.7 Treiberstärke der Pins

Bild 35-21: ATmega32P: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (UCC = 3 V)
Bild 35-22: ATmega32P: Ausgangsspannung vs. Strom nach Masse am I/O-Pin (UCC = 5 V)
Bild 35-23: ATmega32P: Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 3 V)
Bild 35-24: ATmega32P: Ausgangsspannung vs. Strom von UCC am I/O-Pin (UCC = 5 V)

35.8 Schaltschwelle und Hysterese der Pins

Bild 35-25: ATmega32P: Schaltschwelle vs. UCC (UIH, Pin liest „1“)
Bild 35-26: ATmega32P: Schaltschwelle vs. UCC (UIL, Pin liest „0“)
Bild 35-27: ATmega32P: Hysterese vs. UCC
Bild 35-28: ATmega32P: Schaltschwelle vs. UCC am RESET-Pin (UIH, Pin liest „1“)
Bild 35-29: ATmega32P: Schaltschwelle vs. UCC am RESET-Pin (UIL, Pin liest „0“)
Bild 35-30: ATmega32P: Hysterese vs. UCC am RESET-Pin

35.9 Unterspannungsdetektor-Schwelle

Bild 35-31: ATmega32P: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 1,8 V)
Bild 35-32: ATmega32P: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 2,7 V)
Bild 35-33: ATmega32P: Schaltschwellen des Unterspannungsdetektors vs. Temperatur (BODLEVEL = 4,3 V)
Bild 35-34: ATmega32P: Referenzspannung vs. UCC

35.10 Interner Oszillator

Bild 35-35: ATmega32P: Watchdog-Oszillatorfrequenz vs. Temperatur
Bild 35-36: ATmega32P: Watchdog-Oszillatorfrequenz vs. UCC
Bild 35-37: ATmega32P: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. UCC
Bild 35-38: ATmega32P: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. Temperatur
Bild 35-39: ATmega32P: Kalibrierte 8-MHz-RC-Oszillatorfrequenz vs. OSCCAL-Wert

35.11 Verbrauch der I/O-Module

Bild 35-40: ATmega32P: Stromaufnahme des A/D-Wandlers vs. UCC (AREF = AUCC)
Bild 35-41: ATmega32P: Stromaufnahme des Analogvergleichers vs. UCC
Bild 35-42: ATmega32P: Strom der externen Spannungsreferenz AREF vs. UCC
Bild 35-43: ATmega32P Stromaufnahme des Unterspannungsdetektor vs. UCC
Bild 35-44: ATmega32P: Programmierstrom vs. UCC

35.12 Reset-Verbrauch und -Pulsbreite

Bild 35-45: ATmega32P: Stromaufnahme während Reset vs. Frequenz (0.1 - 1,0 MHz)
Bild 35-46: ATmega32P: Stromaufnahme während Reset vs. Frequenz (1 - 20 MHz)
Bild 35-47: ATmega32P: Minimale Resetpulsbreite vs. UCC


Übersicht I/O-Register

36. Übersicht I/O-Register

Adresse | Name | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0
(0xFF) | reserviert | – | – | – | – | – | – | – | –
usw. |  | usw.
(0xC7) |  | – | – | – | – | – | – | – | –
(0xC6) | UDR0 | Bidirektionales USART-Datenregister
(0xC5) | UBRR0 |  |  |  |  | USART-Baudratenregister High-Teil
(0xC4) |  | USART-Baudratenregister Low-Teil
(0xC3) | reserviert | – | – | – | – | – | – | – | –
(0xC2) | UCSR0C | UMSEL01 | UMSEL00 | UPM01 | UPM00 | USBS0 | UCSZ01 UDORD0 | UCSZ00 UCPHA0 | UCPOL0
(0xC1) | UCSR0B | RXCIE0 | TXCIE0 | UDRIE0 | RXEN0 | TXEN0 | UCSZ02 | RXB80 | TXB80
(0xC0) | UCSR0A | RXC0 | TXC0 | UDRE0 | FE0 | DOR0 | UPE0 | U2X0 | MPCM0
Adresse | Name | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0
(0xBF) | reserviert | – | – | – | – | – | – | – | –
(0xBE) |  | – | – | – | – | – | – | – | –
(0xBD) | TWAMR | TWAM6 | TWAM5 | TWAM4 | TWAM3 | TWAM2 | TWAM1 | TWAM0 | –
(0xBC) | TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | – | TWIE
(0xBB) | TWDR | TWI (I²C) Bidirektionales Datenregister
(0xBA) | TWAR | TWA6 | TWA5 | TWA4 | TWA3 | TWA2 | TWA1 | TWA0 | TWGCE
(0xB9) | TWSR | TWS7 | TWS6 | TWS5 | TWS4 | TWS3 | – | TWPS1 | TWPS0
(0xB8) | TWBR | TWI (I²) Bitrate
(0xB7) | reserviert | – | – | – | – | – | – | – | –
(0xB6) | ASSR | – | EXCLK | AS2 | TCN2UB | OCR2AUB | OCR2BUB | TCR2AUB | TCR2BUB
(0xB5) | reserviert | – | – | – | – | – | – | – | –
(0xB4) | OCR2B | Zähler/Zeitgeber2 Output-Compare-Register B
(0xB3) | OCR2A | Zähler/Zeitgeber2 Output-Compare-Register A
(0xB2) | TCNT2 | Zähler/Zeitgeber2 Zählregister (8-bit)
(0xB1) | TCCR2B | FOC2A | FOC2B | – | – | WGM22 | CS22 | CS21 | CS20
(0xB0) | TCCR2A | COM2A1 | COM2A0 | COM2B1 | COM2B0 | – | – | WGM21 | WGM20
(0xAF) | reserviert | – | – | – | – | – | – | – | –
usw. |  | usw.
(0x8C) |  | – | – | – | – | – | – | – | –
(0x8B) | OCR1B | Zähler/Zeitgeber1 - Output-Compare-Register B High-Byte
(0x8A) |  | Zähler/Zeitgeber1 - Output-Compare-Register B Low-Byte
(0x89) | OCR1A | Zähler/Zeitgeber1 - Output-Compare-Register A High-Byte
(0x88) |  | Zähler/Zeitgeber1 - Output-Compare-Register A Low Byte
(0x87) | ICR1 | Zähler/Zeitgeber1 - Input-Capture-Register High-Byte
(0x86) |  | Zähler/Zeitgeber1 - Input-Capture-Register Low Byte
(0x85) | TCNT1 | Zähler/Zeitgeber1 - Zählregister High-Byte
(0x84) |  | Zähler/Zeitgeber1 - Zählregister Low-Byte
(0x83) | reserviert | – | – | – | – | – | – | – | –
(0x82) | TCCR1C | FOC1A | FOC1B | – | – | – | – | – | –
(0x81) | TCCR1B | ICNC1 | ICES1 | – | WGM13 | WGM12 | CS12 | CS11 | CS10
(0x80) | TCCR1A | COM1A1 | COM1A0 | COM1B1 | COM1B0 | – | – | WGM11 | WGM10
Adresse | Name | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0
(0x7F) | DIDR1 | – | – | – | – | – | – | AIN1D | AIN0D
(0x7E) | DIDR0 | – | – | ADC5D | ADC4D | ADC3D | ADC2D | ADC1D | ADC0D
(0x7D) | reserviert | – | – | – | – | – | – | – | –
(0x7C) | ADMUX | REFS1 | REFS0 | ADLAR | – | MUX3 | MUX2 | MUX1 | MUX0
(0x7B) | ADCSRB | – | ACME | – | – | – | ADTS2 | ADTS1 | ADTS0
(0x7A) | ADCSRA | ADEN | ADSC | ADATE | ADIF | ADIE | ADPS2 | ADPS1 | ADPS0
(0x79) | ADC | ADU-Wandlungsergebnis, High-Byte
(0x78) |  | ADU-Wandlungsergebnis, Low-Byte
(0x77) | reserviert | – | – | – | – | – | – | – | –
usw. |  | usw.
(0x71) |  | – | – | – | – | – | – | – | –
(0x70) | TIMSK2 | – | – | – | – | – | OCIE2B | OCIE2A | TOIE2
(0x6F) | TIMSK1 | – | – | ICIE1 | – | – | OCIE1B | OCIE1A | TOIE1
(0x6E) | TIMSK0 | – | – | – | – | – | OCIE0B | OCIE0A | TOIE0
(0x6D) | PCMSK2 | PCINT23 | PCINT22 | PCINT21 | PCINT20 | PCINT19 | PCINT18 | PCINT17 | PCINT16
(0x6C) | PCMSK1 | – | PCINT14 | PCINT13 | PCINT12 | PCINT11 | PCINT10 | PCINT9 | PCINT8
(0x6B) | PCMSK0 | PCINT7 | PCINT6 | PCINT5 | PCINT4 | PCINT3 | PCINT2 | PCINT1 | PCINT0
(0x6A) | reserviert | – | – | – | – | – | – | – | –
(0x69) | EICRA | – | – | – | – | ISC11 | ISC10 | ISC01 | ISC00
(0x68) | PCICR | – | – | – | – | – | PCIE2 | PCIE1 | PCIE0
(0x67) | reserviert | – | – | – | – | – | – | – | –
(0x66) | OSCCAL | Werkskalibrierwert des internen RC-Oszillators
(0x65) | reserviert | – | – | – | – | – | – | – | –
(0x64) | PRR | PRTWI | PRTIM2 | PRTIM0 | – | PRTIM1 | PRSPI | PRUSART0 | PRADC
(0x63) | reserviert | – | – | – | – | – | – | – | –
(0x62) |  | – | – | – | – | – | – | – | –
(0x61) | CLKPR | CLKPCE | – | – | – | CLKPS3 | CLKPS2 | CLKPS1 | CLKPS0
(0x60) | WDTCSR | WDIF | WDIE | WDP3 | WDCE | WDE | WDP2 | WDP1 | WDP0
Adresse | Name | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0
0x3F (0x5F) | SREG | I | T | H | S | V | N | Z | C
0x3E (0x5E) | SP | – | – | – | – | – | (SP10)5 | SP9 | SP8
0x3D (0x5D) |  | SP7 | SP6 | SP5 | SP4 | SP3 | SP2 | SP1 | SP0
0x3C (0x5C) | reserviert | – | – | – | – | – | – | – | –
usw. |  | usw.
0x38 (0x58) |  | – | – | – | – | – | – | – | –
0x37 (0x57) | SPMCSR | SPMIE | (RWWSB)5 | SIGRD | (RWWSRE)5 | BLBSET | PGWRT | PGERS | SPMEN
0x36 (0x56) | reserviert | – | – | – | – | – | – | – | –
0x35 (0x55) | MCUCR | – | BODS(6) | BODSE(6) | PUD | – | – | IVSEL | IVCE
0x34 (0x54) | MCUSR | – | – | – | – | WDRF | BORF | EXTRF | PORF
0x33 (0x53) | SMCR | – | – | – | – | SM2 | SM1 | SM0 | SE
0x32 (0x52) | reserviert | – | – | – | – | – | – | – | –
0x31 (0x51) | reserviert | – | – | – | – | – | – | – | –
0x30 (0x50) | ACSR | ACD | ACBG | ACO | ACI | ACIE | ACIC | ACIS1 | ACIS0
0x2F (0x4F) | reserviert | – | – | – | – | – | – | – | –
0x2E (0x4E) | SPDR | SPI Data Register
0x2D (0x4D) | SPSR | SPIF | WCOL | – | – | – | – | – | SPI2X
0x2C (0x4C) | SPCR | SPIE | SPE | DORD | MSTR | CPOL | CPHA | SPR1 | SPR0
0x2B (0x4B) | GPIOR2 | Allgemeines I/O-Register 2
0x2A (0x4A) | GPIOR1 | Allgemeines I/O-Register 1
0x29 (0x49) | reserviert | – | – | – | – | – | – | – | –
0x28 (0x48) | OCR0B | Zähler/Zeitgeber0 Output Compare Register B
0x27 (0x47) | OCR0A | Zähler/Zeitgeber0 Output Compare Register A
0x26 (0x46) | TCNT0 | Zähler/Zeitgeber0 Zählregister (8-bit)
0x25 (0x45) | TCCR0B | FOC0A | FOC0B | – | – | WGM02 | CS02 | CS01 | CS00
0x24 (0x44) | TCCR0A | COM0A1 | COM0A0 | COM0B1 | COM0B0 | – | – | WGM01 | WGM00
0x23 (0x43) | GTCCR | TSM | – | – | – | – | – | PSRASY | PSRSYNC
0x22 (0x42) | EEAR | (EEPROM-Adressregister High-Byte)5
0x21 (0x41) |  | EEPROM-Adressregister Low-Byte
0x20 (0x40) | EEDR | EEPROM-Datenregister
Adresse | Name | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0
0x1F (0x3F) | EECR | – | – | EEPM1 | EEPM0 | EERIE | EEMPE | EEPE | EERE
0x1E (0x3E) | GPIOR0 | Allgemeines I/O-Register 0
0x1D (0x3D) | EIMSK | – | – | – | – | – | – | INT1 | INT0
0x1C (0x3C) | EIFR | – | – | – | – | – | – | INTF1 | INTF0
0x1B (0x3B) | PCIFR | – | – | – | – | – | PCIF2 | PCIF1 | PCIF0
0x1A (0x3A) | reserviert | – | – | – | – | – | – | – | –
0x19 (0x39) | reserviert | – | – | – | – | – | – | – | –
0x18 (0x38) | reserviert | – | – | – | – | – | – | – | –
0x17 (0x37) | TIFR2 | – | – | – | – | – | OCF2B | OCF2A | TOV2
0x16 (0x36) | TIFR1 | – | – | ICF1 | – | – | OCF1B | OCF1A | TOV1
0x15 (0x35) | TIFR0 | – | – | – | – | – | OCF0B | OCF0A | TOV0
0x14 (0x34) | reserviert | – | – | – | – | – | – | – | –
usw. |  | usw.
0x0C (0x2C) |  | – | – | – | – | – | – | – | –
0x0B (0x2B) | PORTD | PORTD7 | PORTD6 | PORTD5 | PORTD4 | PORTD3 | PORTD2 | PORTD1 | PORTD0
0x0A (0x2A) | DDRD | DDD7 | DDD6 | DDD5 | DDD4 | DDD3 | DDD2 | DDD1 | DDD0
0x09 (0x29) | PIND | PIND7 | PIND6 | PIND5 | PIND4 | PIND3 | PIND2 | PIND1 | PIND0
0x08 (0x28) | PORTC | – | PORTC6 | PORTC5 | PORTC4 | PORTC3 | PORTC2 | PORTC1 | PORTC0
0x07 (0x27) | DDRC | – | DDC6 | DDC5 | DDC4 | DDC3 | DDC2 | DDC1 | DDC0
0x06 (0x26) | PINC | – | PINC6 | PINC5 | PINC4 | PINC3 | PINC2 | PINC1 | PINC0
0x05 (0x25) | PORTB | PORTB7 | PORTB6 | PORTB5 | PORTB4 | PORTB3 | PORTB2 | PORTB1 | PORTB0
0x04 (0x24) | DDRB | DDB7 | DDB6 | DDB5 | DDB4 | DDB3 | DDB2 | DDB1 | DDB0
0x03 (0x23) | PINB | PINB7 | PINB6 | PINB5 | PINB4 | PINB3 | PINB2 | PINB1 | PINB0
0x02 (0x22) | PORTA | – | – | – | – | – | – | – | –
0x01 (0x21) | DDRA | – | – | – | – | – | – | – | –
0x00 (0x20) | PINA | – | – | – | – | – | – | – | –
Hinweise:
  1. Zur Erhalt der Kompatibilität mit künftigen AVR-Mikrocontrollern sollten reservierte Bits mit Null beschrieben werden. Reservierte I/O-Adressen sollten niemals gelesen oder beschrieben werden
  2. I/O-Register im I/O-Adressraum 0x00 - 0x1F sind bitadressierbar mit den Befehlen SBI und CBI. Einzelne Bits können mit den Befehlen SBIS und SBIC abgeprüft werden.
  3. Einige Flagbits werden durch Schreiben einer Eins gelöscht. Im Gegensatz zu den meisten anderen AVR-Mikrocontrollern können hierbei die Befehle CBI und SBI eingesetzt werden, um solche Bits zu setzen bzw. zu löschen, ohne andere Bits des Bytes zu beeinflussen. Die Befehle CBI und SBI funktionieren nur im I/O-Adressbereich 0x00 bis 0x1F
  4. Die 1-Takt-Befehle IN und OUT funktionieren nur im I/O-Adressraum 0x00 bis 0x3F. Beim Zugriff mit den 2-Takt-Befehlen zum Speicherzugriff LD/LDS/LDD und ST/STS/STD gilt der Speicheradressraum 0x20 bis 0x5F. Der ATmegaX8 ist ein komplexer Microcontroller mit mehr Peripherie als über die 64 Adressen des I/O-Adressraums ansprechbar. Für den Erweiterten I/O-Adressraum von 0x60 bis 0xFF müssen die 2-Takt-Befehle zum Speicherzugriff LD/LDS/LDD und ST/STS/STD verwendet werden
  5. Nur gültig für ATmega88/168/328
  6. BODS und BODSE gibt es nur in den picoPower-Chips mit „P“ am Ende


Befehlsübersicht

37. Befehlsübersicht

Arithmetische und logische Befehle
Mnemonik | Beschreibung | Funktion | Flags | T. | Kode/Emul.
ADD Rd,Rr | Addiert zwei Register | Rd ← Rd + Rr | Z,C,N,V,S,H | 1 | 000011rd ddddrrrr
ADC Rd,Rr | Addiert Carry und zwei Register | Rd ← Rd + Rr + C | Z,C,N,V,S,H | 1 | 000111rd ddddrrrr
ADIW Rd,K | Addiert eine Konstante zu einem Registerpaar | Rd+1:Rd ← Rd+1:Rd + K | Z,C,N,V,S | 2 | 10010110 KKddKKKK
SUB Rd,Rr | Subtrahiert zwei Register | Rd ← Rd - Rr | Z,C,N,V,S,H | 1 | 000110rd ddddrrrr
SUBI Rd,K | Subtrahiert eine Konstante vom Register | Rd ← Rd - K | Z,C,N,V,S,H | 1 | 0101KKKK ddddKKKK
SBC Rd,Rr | Subtrahiert Carry und Register vom Register | Rd ← Rd - Rr - C | Z,C,N,V,S,H | 1 | 000010rd ddddrrrr
SBCI Rd,K | Subtrahiert eine Konstante und Carry vom Register | Rd ← Rd - K - C | Z,C,N,V,S,H | 1 | 0100KKKK ddddKKKK
SBIW Rd,K | Subtrahiert eine Konstante von einem Registerpaar | Rd+1:Rd ← Rd+1:Rd - K | Z,C,N,V,S | 2 | 10010111 KKddKKKK
AND Rd,Rr | Logische UND-Verknüpfung zweier Register | Rd ← Rd • Rr | Z,N,V,S | 1 | 001000rd ddddrrrr
ANDI Rd,K | Logische UND-Verknüpfung Register mit Konstante | Rd ← Rd • K | Z,N,V,S | 1 | 0111KKKK ddddKKKK
OR Rd,Rr | Logische ODER-Verknüpfung zweier Register | Rd ← Rd ∨ Rr | Z,N,V,S | 1 | 001010rd ddddrrrr
ORI Rd,K | Logische ODER-Verknüpfung Register mit Konstante | Rd ← Rd ∨ K | Z,N,V,S | 1 | 0110KKKK ddddKKKK
EOR Rd,Rr | Logische XOR-Verknüpfung zweier Register | Rd ← Rd ⊕ Rr | Z,N,V,S | 1 | 001001rd ddddrrrr
COM Rd | Einerkomplement des Registers | Rd ← FFh - Rd | Z,C,N,V,S | 1 | 1001010d dddd0000
NEG Rd | Zweierkomplement des Registers | Rd ← 00h - Rd | Z,C,N,V,S,H | 1 | 1001010d dddd0001
SBR Rd,K | Setzt Bit(s) in Register | Rd ← Rd ∨ K | Z,N,V,S | 1 | OR Rd,K
CBR Rd,K | Löscht Bit(s) in Register | Rd ← Rd • (FFh - K) | Z,N,V,S | 1 | AND Rd,~K
INC Rd | Inkrementieren Register | Rd ← Rd + 1 | Z,N,V,S | 1 | 1001010d dddd0011
DEC Rd | Dekrementieren Register | Rd ← Rd - 1 | Z,N,V,S | 1 | 1001010d dddd1010
TST Rr | Test ob Register Null oder negativ | Rr ? | Z,N,V,S | 1 | AND Rr,Rr
CLR Rd | Löschen Register | Rd ← 0 | Z,N,V,S | 1 | EOR Rd,Rd
SER Rd | Setzen des Registers | Rd ← FFh | keines | 1 | LDI Rd,0xFF
MUL Rd,Rr | Multipliziert Rd und Rr, ohne Vorzeichen | R1:R0 ← Rd × Rr | Z,C | 2 | 100111rd ddddrrrr
MULS Rd,Rr | Multipliziert Rd und Rr, mit Vorzeichen | R1:R0 ← Rd × Rr | Z,C | 2 | 00000010 ddddrrrr
MULSU Rd,Rr | Multipliziert Rd und Rr, mit / ohne Vorzeichen | R1:R0 ← Rd × Rr | Z,C | 2 | 00000011 0ddd0rrr
FMUL Rd,Rr | Multipliziert Rd und Rr, gebrochene Zahlen ohne Vorzeichen | R1:R0 ← (Rd×Rr)≪1 | Z,C | 2 | 00000011 0ddd1rrr
FMULS Rd,Rr | Multipliziert Rd und Rr, gebrochene Zahlen mit Vorzeichen | R1:R0 ← (Rd×Rr)≪1 | Z,C | 2 | 00000011 1ddd0rrr
FMULSU Rd,Rr | Multipliziert Rd und Rr, gebrochene Zahlen mit / ohne Vorzeichen | R1:R0 ← (Rd×Rr)≪1 | Z,C | 2 | 00000011 1ddd1rrr
Datentransport-Befehle
Mnemonik | Beschreibung | Funktion | Flags | T. | Kode/Emul.
MOV Rd,Rr | Kopiert von Register nach Register | Rd ← Rr | keines | 1 | 001011rd ddddrrrr
MOVW Rd,Rr | Kopiert von Registerpaar nach Registerpaar | Rd+1:Rd ← Rr+1:Rr | keines | 1 | 00000001 ddddrrrr
LDI Rd,K | Register mit Konstante laden | Rd ← K | keines | 1 | 1110KKKK ddddKKKK
LDS Rd,k | Register mit Konstante aus Datenspeicher laden | Rd ← (k) | keines | 2 | 1001000d dddd0000 kkkkkkkk kkkkkkkk
LD Rd,z | Register indirekt laden | Rd ← (z) | keines | 2 | 1001000d ddddzz00
LD Rd,z+ | Register indirekt laden, Zeiger inkrementieren | Rd ← (z), z ← z + 1 | keines | 2 | 1001000d ddddzz01
LD Rd,-z | Zeiger dekrementieren, Register indirekt laden | z ← z - 1, Rd ← (z) | keines | 2 | 1001000d ddddzz10
LDD Rd,z+q | Register indirekt mit Offset laden | Rd ← (Y + q) | keines | 2 | 10q0qq0d ddddzqqq
STS k,Rr | Register in Datenspeicher speichern | (k) ← Rr | keines | 2 | 1001001d dddd0000 kkkkkkkk kkkkkkkk
ST z,Rr | Register indirekt speichern | (z) ← Rr | keines | 2 | 1000001r rrrrzz00
ST z+,Rr | Register indirekt speichern, Zeiger inkrementieren | (z) ← Rr, X ← X + 1 | keines | 2 | 1001001r rrrrzz01
ST -z,Rr | Zeiger dekrementieren, Register indirekt speichern | X ← X - 1, (X) ← Rr | keines | 2 | 1001001r rrrrzz10
STD z+q,Rr | Register indirekt mit Offset speichern | (Y + q) ← Rr | keines | 2 | 10q0qq1r rrrrzqqq
LPM | Laden aus dem Programmspeicher in R0 | R0 ← (Z) | keines | 3 | 10010101 11001000
LPM Rd,Z | Laden aus dem Programmspeicher in Rd | Rd ← (Z) | keines | 3 | 1001000d dddd0100
LPM Rd,Z+ | Laden aus dem Programmspeicher in Rd, Z inkrementieren | Rd ← (Z), Z ← Z + 1 | keines | 3 | 1001000d dddd0101
ELPM | Laden aus dem erweiterten Programmspeicher in R0 | R0 ← (RAMPZ:Z) | keines | 3 | 10010101 11011000
ELPM Rd,Z | Laden aus dem erweiterten Programmspeicher in Rd | Rd ← (RAMPZ:Z) | keines | 3 | 1001000d dddd0110
ELPM Rd,Z+ | Laden aus dem erweiterten Programmspeicher in Rd, Z inkrementieren | Rd ← (RAMPZ:Z), Z ← Z + 1 | keines | 3 | 1001000d dddd0111
SPM | In den Programmspeicher speichern | (Z) ← R1:R0 | keines | - | 10010101 11101000
IN Rd,A | I/O-Adresse lesen | Rd ← (A+0x20) | keines | 1 | 10110AAd ddddAAAA
OUT A,Rr | I/O-Adresse beschreiben | (A+0x20) ← Rr | keines | 1 | 10111AAr rrrrAAAA
PUSH Rr | Sichert Rr in den Stack | (SP) ← Rr, SP ← SP - 1 | keines | 2 | 1001001d dddd1111
POP Rd | Holt Stackspitze in Rd | SP ← SP + 1, Rd ← (SP) | keines | 2 | 1001000d dddd1111
MCU-Steuerbefehle
Mnemonik | Beschreibung | Funktion | Flags | T. | Kode/Emul.
BREAK | Unterbrechung | siehe Beschreibung der Break-Funktion | keines | 1 | 10010101 10011000
NOP | Leerbefehl | keine Operation | keines | 1 | 00000000 00000000
SLEEP | Übergang in den Sleep-Modus | siehe Beschreibung der Sleep-Funktion | keines | 1 | 10010101 10001000
WDR | Watchdog-Reset | siehe Beschreibung Watchdog-Zeitgeber | keines | 1 | 10010101 10101000
Verzweigungsbefehle
Mnemonik | Beschreibung | Funktion | Flags | T. | Kode/Emul.
RJMP k | Relativer Sprung | PC ← PC + k + 1 | keines | 2 | 1100kkkk kkkkkkkk
IJMP | Indirekter Sprung zu (Z) | PC(15:0) ← Z, PC(21:16) ← 0 | keines | 2 | 10010100 00001001
EIJMP | Erweiterter indirekter Sprung zu (Z) | PC(15:0) ← Z, PC(21:16) ← EIND | keines | 2 | 10010100 00011001
JMP k | Direkter Sprung | PC ← k | keines | 3 | 1001010k kkkk110k kkkkkkkk kkkkkkkk
RCALL k | Relativer Unterprogramm-Aufruf | PUSH PC, PC ← PC + k + 1 | keines | 3/4 | 1101kkkk kkkkkkkk
ICALL | Indirekter Unterprogramm-Aufruf | PUSH PC, PC(15:0) ← Z, PC(21:16) ← 0 | keines | 3/4 | 10010101 00001001
EICALL | Erweiterter indirekter Unterprogramm-Aufruf | PUSH PC, PC(15:0) ← Z, PC(21:16) ← EIND | keines | 4 | 10010101 00011001
CALL k | Direkter Unterprogramm-Aufruf | PUSH PC, PC ← k | keines | 4 | 1001010k kkkk111k kkkkkkkk kkkkkkkk
RET | Rückkehr aus Unterprogramm | POP PC | keines | 4 | 10010101 00001000
RETI | Rückkehr aus Interrupt-Routine | POP PC, I ← 1 | I | 4 | 10010101 00011000
CPSE Rd,Rr | Vergleichen, überspringen wenn gleich | Wenn (Rd=Rr) dann PC ← PC + 2 oder 3 | keines | 1/2/3 | 000100rd ddddrrrr
CP Rd,Rr | Vergleichen | Rd - Rr ? | Z,N,S,V,C,H | 1 | 000101rd ddddrrrr
CPC Rd,Rr | Register vergleichen mit Carry | Rd - Rr - C ? | Z,N,S,V,C,H | 1 | 000001rd ddddrrrr
CPI Rd,K | Vergleiche Register mit Konstante | Rd - K ? | Z,N,S,V,C,H | 1 | 0011KKKK ddddKKKK
SBRC Rr,b | Überspringen, wenn Bit in Register gelöscht | Wenn (Rr(b)=0) dann PC ← PC + 2 oder 3 | keines | 1/2/3 | 1111110r rrrr0bbb
SBRS Rr,b | Überspringen, wenn Bit in Register gesetzt | Wenn (Rr(b)=1) dann PC ← PC + 2 oder 3 | keines | 1/2/3 | 1111111r rrrr0bbb
SBIC A,b | Überspringen, wenn Bit in I/O-Register gelöscht | Wenn (A[b]=0) dann PC ← PC + 2 oder 3 | keines | 1/2/3 | 10011001 AAAAAbbb
SBIS A,b | Überspringen, wenn Bit in I/O-Register gesetzt | Wenn (A[b]=1) dann PC ← PC + 2 oder 3 | keines | 1/2/3 | 10011011 AAAAAbbb
BRBS s,k | Verzweigen, wenn Statusbit s gesetzt ist. | Wenn (SREG[s]=1) dann PC ← PC + k + 1 | keines | 1/2 | 111100kk kkkkksss
BRBC s,k | Verzweigen, wenn Statusbit s gelöscht ist. | Wenn (SREG[s]=0) dann PC ← PC + k + 1 | keines | 1/2 | 111101kk kkkkksss
BREQ k | Verzweigen wenn gleich | Wenn (Z=1) dann PC ← PC + k + 1 | keines | 1/2 | BRBS 1,k
BRNE k | Verzweigen wenn nicht gleich | Wenn (Z=0) dann PC ← PC + k + 1 | keines | 1/2 | BRBC 1,k
BRCS k | Verzweigen wenn Carry gesetzt ist. | Wenn (C=1) dann PC ← PC + k + 1 | keines | 1/2 | BRBS 0,k
BRCC k | Verzweigen wenn Carry gelöscht ist. | Wenn (C=0) dann PC ← PC + k + 1 | keines | 1/2 | BRBC 0,k
BRSH k | Verzweigen wenn gleich oder größer | Wenn (C=0) dann PC ← PC + k + 1 | keines | 1/2 | BRBC 0,k
BRLO k | Verzweigen wenn kleiner | Wenn (C=1) dann PC ← PC + k + 1 | keines | 1/2 | BRBS 0,k
BRMI k | Verzweigen wenn Minus | Wenn (N=1) dann PC ← PC + k + 1 | keines | 1/2 | BRBS 2,k
BRPL k | Verzweigen wenn Plus | Wenn (N=0) dann PC ← PC + k + 1 | keines | 1/2 | BRBC 2,k
BRGE k | Verzweigen wenn größer oder gleich, vorzeichenbehaftet | Wenn (N ⊕ V = 0) dann PC ← PC + k + 1 | keines | 1/2 | BRBC 4,k
BRLT k | Verzweigen wenn kleiner als, vorzeichenbehaftet | Wenn (N ⊕ V = 1) dann PC ← PC + k + 1 | keines | 1/2 | BRBS 4,k
BRHS k | Verzweigen wenn H-Carry Flag gesetzt ist | Wenn (H=1) dann PC ← PC + k + 1 | keines | 1/2 | BRBS 5,k
BRHC k | Verzweigen wenn H-Carry Flag gelöscht ist | Wenn (H=0) dann PC ← PC + k + 1 | keines | 1/2 | BRBC 5,k
BRTS k | Verzweigen wenn T-Flag gesetzt ist | Wenn (T=1) dann PC ← PC + k + 1 | keines | 1/2 | BRBS 6,k
BRTC k | Verzweigen wenn T-Flag gelöscht ist | Wenn (T=0) dann PC ← PC + k + 1 | keines | 1/2 | BRBC 6,k
BRVS k | Verzweigen wenn Overflow-Flag (V) gesetzt ist | Wenn (V=1) dann PC ← PC + k + 1 | keines | 1/2 | BRBS 3,k
BRVC k | Verzweigen wenn Overflow-Flag (V) gelöscht ist | Wenn (V=0) dann PC ← PC + k + 1 | keines | 1/2 | BRBC 3,k
BRIE k | Verzweigen wenn Interrupt freigegeben | Wenn (I=1) dann PC ← PC + k + 1 | keines | 1/2 | BRBS 7,k
BRID k | Verzweigen wenn Interrupt gesperrt | Wenn (I=0) dann PC ← PC + k + 1 | keines | 1/2 | BRBC 7,k
Bit-Befehle
Mnemonik | Beschreibung | Funktion | Flags | T. | Kode/Emul.
SBI A,b | Bit in I/O-Register setzen | [A+0x20] |= 1≪b | keines | 2 | 10011010 AAAAAbbb
CBI A,b | Bit in I/O-Register löschen | [A+0x20] &=~ 1≪b | keines | 2 | 10011000 AAAAAbbb
LSL Rd | Logisches Linksschieben | Rd(n+1) ← Rd(n), Rd(0) ← 0 | Z,C,N,V,H | 1 | ADD Rd,Rd
LSR Rd | Logisches Rechtsschieben | Rd(n) ← Rd(n+1), Rd(7) ← 0 | Z,C,N,V | 1 | 1001010d dddd0110
ROL Rd | Links rotieren durch Carry | Rd(0) ← C, Rd(n+1) ← Rd(n), C ← Rd(7) | Z,C,N,V,H | 1 | ADC Rd,Rd
ROR Rd | Rechts rotieren durch Carry | Rd(7) ← C, Rd(n) ← Rd(n+1), C ← Rd(0) | Z,C,N,V | 1 | 1001010d dddd0111
ASR Rd | Arithmetisches Rechtsschieben | Rd(n) ← Rd(n+1), n = 0...6 | Z,C,N,V | 1 | 1001010d dddd0101
SWAP Rd | Nibbles vertauschen | Rd(3..0) ← Rd (7..4), Rd(7..4) ← Rd(3..0) | keines | 1 | 1001010d dddd0010
BSET s | Flag im SREG setzen | SREG(s) ← 1 | SREG(s) | 1 | 10010100 0sss1000
BCLR s | Flag im SREG löschen | SREG(s) ← 0 | SREG(s) | 1 | 10010100 1sss1000
BST Rr,b | Bit von Register nach T speichern | T ← Rr(b) | T | 1 | 1111101d dddd0bbb
BLD Rd,b | Bit von T nach Register laden | Rd(b) ← T | keines | 1 | 1111100d dddd0bbb
SEC | Carry setzen | C ← 1 | C | 1 | BSET 0
CLC | Carry löschen | C ← 0 | C | 1 | BCLR 0
SEZ | Zero-Flag setzen | Z ← 1 | Z | 1 | BSET 1
CLZ | Zero-Flag löschen | Z ← 0 | Z | 1 | BCLR 1
SEN | Negativ-Flag N setzen | N ← 1 | N | 1 | BSET 2
CLN | Negativ-Flag N löschen | N ← 0 | N | 1 | BCLR 2
SEV | Zweierkomplement-Überlauf setzen | V ← 1 | V | 1 | BSET 3
CLV | Zweierkomplement-Overflow löschen | V ← 0 | V | 1 | BCLR 3
SES | Vorzeichen Test-Flag setzen | S ← 1 | S | 1 | BSET 4
CLS | Vorzeichen Test-Flag löschen | S ← 0 | S | 1 | BCLR 4
SEH | Half-Carry-Flag setzen | H ← 1 | H | 1 | BSET 5
CLH | Half-Carry-Flag löschen | H ← 0 | H | 1 | BCLR 5
SET | T setzen | T ← 1 | T | 1 | BSET 6
CLT | T löschen | T ← 0 | T | 1 | BCLR 6
SEI | Globale Interrupt-Freigabe | I ← 1 | I | 1 | BSET 7
CLI | Globale Interrupt-Sperre | I ← 0 | I | 1 | BCLR 7
Erläuterungen:
  1. T. = Anzahl CPU-Takte
  2. 8-Bit-Befehle mit Direktoperand sowie MULS sind auf die Register R16..R31 beschränkt
  3. 16-Bit-Arithmetikbefehle sind auf die Registerpaare R25:R24, R27:R26 (X), R29:R28 (Y) und R31:R30 (Z) beschränkt
  4. Offsets (zur Zeigermanipulation) sind auf 0..63 beschränkt
  5. Erweiterte MUL-Befehle sind auf die Register R16..R23 als Operanden beschränkt
  6. 16-Bit-Befehle funktionieren nur mit geraden Registern, MOVW mit R0..R30.
  7. Zeigerregister sind X, Y oder Z für LD und ST, hingegen nur Y oder Z für LDD und STD. Einfache Controller lassen nur Z zu. Alle indirekten Operationen verhalten sich undefiniert, wenn ein Register des Zeigerregisterpaars als Operand verwendet wird
  8. Bitweise I/O-Operationen gibt es nur im „unteren“ I/O-Bereich 0x00..0x1F (entsprechend Speicheradresse 0x20..0x3F)


Bestellinformation

38. Bestellinformation

38.1 ATmega48A

Geschwindigkeit (MHz) | Speisespannung (V) | Bestellkode(2) | Gehäuse(1) | Einsatzbereich(6)
20(3) | 1,8 – 5,5 | ATmega48A-AU | 32A | Industrie (-40 °C … 85 °C)
 |  | ATmega48A-AUR(5)
 |  | ATmega48A-CCU | 32CC1
 |  | ATmega48A-CCUR(5)
 |  | ATmega48A-MMH(4) | 28M1
 |  | ATmega48A-MMHR(4) (5)
 |  | ATmega48A-MU | 32M1-A
 |  | ATmega48A-MUR(5)
 |  | ATmega48A-PU | 28P3
Hinweise:
  1. Der Schaltkreis kann auch als Wafer geliefert werden. Bitte die nationale Atmel-Vertretung kontaktieren, um Bestellinformationen und Mindestabnahmemengen zu erfahren.
  2. Bleifreie Gehäuse entsprechen der europäischen Verordnung zur Vermeidung gefährlicher Stoffe (RoHS). Außerdem frei von Halogenverbindungen und umweltfreundlich („Fully Green“)
  3. Siehe Geschwindigkeitsbereich
  4. Anschlüsse mit NiPdAu überzogen
  5. auf Gurt magaziniert (Tape & Reel)
  6. Für erweiterten Termperaturbereich auf ATmega48PA ausweichen
Gehäuse |  | Pinabstand | Anschlüsse
32A | 1,0 mm dünnes „Plastic Quad Flat Package“ TQFP | 0,8 mm | 32
32CC1 | 4 × 4 × 0,6 mm großes „Ultra-thin Fine-pitch Ball Grid Array“ UFBGA | 0,5 mm | 32
28M1 | 4 × 4 × 1 mm großes „Quad Flat No-Lead / Micro Lead Frame Package“ QFN/MLF | 0,45 mm | 28
32M1-A | 5 × 5 × 1 mm großes „Quad Flat No-Lead / Micro Lead Frame Package“ QFN/MLF | 0,5 mm | 32
28P3 | 0,3 Zoll breites „Plastic Dual Inline Package“ PDIP | 0,1 Zoll | 28

38.2 ATmega48PA

Geschwindigkeit (MHz)(3) | Speisespannung (V) | Bestellkode(2) | Gehäuse(1) | Einsatzbereich
20 | 1,8 – 5,5 | ATmega48PA-AU | 32A | Industrie (-40 °C … 85 °C)
 |  | ATmega48PA-AUR(5)
 |  | ATmega48PA-CCU | 32CC1
 |  | ATmega48PA-CCUR(5)
 |  | ATmega48PA-MMH(4) | 28M1
 |  | ATmega48PA-MMHR(4) (5)
 |  | ATmega48PA-MU | 32M1-A
 |  | ATmega48PA-MUR(5)
 |  | ATmega48PA-PU | 28P3
 |  | ATmega48PA-AN | 32A | Industrie (-40 °C … 105 °C)
 |  | ATmega48PA-ANR(5)
 |  | ATmega48PA-MMN(4) | 28M1
 |  | ATmega48PA-MMNR(4) (5)
 |  | ATmega48PA-MN | 32M1-A
 |  | ATmega48PA-MNR(5)
 |  | ATmega48PA-PN | 28P3
Hinweise:
  1. Der Schaltkreis kann auch als Wafer geliefert werden. Bitte die nationale Atmel-Vertretung kontaktieren, um Bestellinformationen und Mindestabnahmemengen zu erfahren.
  2. Bleifreie Gehäuse entsprechen der europäischen Verordnung zur Vermeidung gefährlicher Stoffe (RoHS). Außerdem frei von Halogenverbindungen und umweltfreundlich („Fully Green“)
  3. Siehe Geschwindigkeitsbereich
  4. Anschlüsse mit NiPdAu überzogen
  5. auf Gurt magaziniert (Tape & Reel)
Gehäuse |  | Pinabstand | Anschlüsse
32A | 1,0 mm dünnes „Plastic Quad Flat Package“ TQFP | 0,8 mm | 32
32CC1 | 4 × 4 × 0,6 mm großes „Ultra-thin Fine-pitch Ball Grid Array“ UFBGA | 0,5 mm | 32
28M1 | 4 × 4 × 1 mm großes „Quad Flat No-Lead / Micro Lead Frame Package“ QFN/MLF | 0,45 mm | 28
32M1-A | 5 × 5 × 1 mm großes „Quad Flat No-Lead / Micro Lead Frame Package“ QFN/MLF | 0,5 mm | 32
28P3 | 0,3 Zoll breites „Plastic Dual Inline Package“ PDIP | 0,1 Zoll | 28

38.3 ATmega88A

Geschwindigkeit (MHz) | Speisespannung (V) | Bestellkode(2) | Gehäuse(1) | Einsatzbereich(6)
20(3) | 1,8 – 5,5 | ATmega88A-AU | 32A | Industrie (-40 °C … 85 °C)
 |  | ATmega88A-AUR(5)
 |  | ATmega88A-CCU | 32CC1
 |  | ATmega88A-CCUR(5)
 |  | ATmega88A-MMH(4) | 28M1
 |  | ATmega88A-MMHR(4) (5)
 |  | ATmega88A-MU | 32M1-A
 |  | ATmega88A-MUR(5)
 |  | ATmega88A-PU | 28P3
Hinweise:
  1. Der Schaltkreis kann auch als Wafer geliefert werden. Bitte die nationale Atmel-Vertretung kontaktieren, um Bestellinformationen und Mindestabnahmemengen zu erfahren.
  2. Bleifreie Gehäuse entsprechen der europäischen Verordnung zur Vermeidung gefährlicher Stoffe (RoHS). Außerdem frei von Halogenverbindungen und umweltfreundlich („Fully Green“)
  3. Siehe Geschwindigkeitsbereich
  4. Anschlüsse mit NiPdAu überzogen
  5. auf Gurt magaziniert (Tape & Reel)
  6. Für erweiterten Termperaturbereich auf ATmega88PA ausweichen
Gehäuse |  | Pinabstand | Anschlüsse
32A | 1,0 mm dünnes „Plastic Quad Flat Package“ TQFP | 0,8 mm | 32
32CC1 | 4 × 4 × 0,6 mm großes „Ultra-thin Fine-pitch Ball Grid Array“ UFBGA | 0,5 mm | 32
28M1 | 4 × 4 × 1 mm großes „Quad Flat No-Lead / Micro Lead Frame Package“ QFN/MLF | 0,45 mm | 28
32M1-A | 5 × 5 × 1 mm großes „Quad Flat No-Lead / Micro Lead Frame Package“ QFN/MLF | 0,5 mm | 32
28P3 | 0,3 Zoll breites „Plastic Dual Inline Package“ PDIP | 0,1 Zoll | 28

38.4 ATmega88PA

Geschwindigkeit (MHz) | Speisespannung (V) | Bestellkode | Gehäuse | Einsatzbereich
20 | 1,8 – 5,5 | ATmega88PA-AU | 32A | Industrie (-40 °C … 85 °C)
 |  | ATmega88PA-AUR(5)
 |  | ATmega88PA-CCU | 32CC1
 |  | ATmega88PA-CCUR(5)
 |  | ATmega88PA-MMH(4) | 28M1
 |  | ATmega88PA-MMHR(4) (5)
 |  | ATmega88PA-MU | 32M1-A
 |  | ATmega88PA-MUR(5)
 |  | ATmega88PA-PU | 28P3
 |  | ATmega88PA-AN | 32A | Industrie (-40 °C … 105 °C)
 |  | ATmega88PA-ANR(5)
 |  | ATmega88PA-MMN(4) | 28M1
 |  | ATmega88PA-MMNR(4) (5)
 |  | ATmega88PA-MN | 32M1-A
 |  | ATmega88PA-MNR(5)
 |  | ATmega88PA-PN | 28P3
Hinweise:
  1. Der Schaltkreis kann auch als Wafer geliefert werden. Bitte die nationale Atmel-Vertretung kontaktieren, um Bestellinformationen und Mindestabnahmemengen zu erfahren.
  2. Bleifreie Gehäuse entsprechen der europäischen Verordnung zur Vermeidung gefährlicher Stoffe (RoHS). Außerdem frei von Halogenverbindungen und umweltfreundlich („Fully Green“)
  3. Siehe Geschwindigkeitsbereich
  4. Anschlüsse mit NiPdAu überzogen
  5. auf Gurt magaziniert (Tape & Reel)
Gehäuse |  | Pinabstand | Anschlüsse
32A | 1,0 mm dünnes „Plastic Quad Flat Package“ TQFP | 0,8 mm | 32
32CC1 | 4 × 4 × 0,6 mm großes „Ultra-thin Fine-pitch Ball Grid Array“ UFBGA | 0,5 mm | 32
28M1 | 4 × 4 × 1 mm großes „Quad Flat No-Lead / Micro Lead Frame Package“ QFN/MLF | 0,45 mm | 28
32M1-A | 5 × 5 × 1 mm großes „Quad Flat No-Lead / Micro Lead Frame Package“ QFN/MLF | 0,5 mm | 32
28P3 | 0,3 Zoll breites „Plastic Dual Inline Package“ PDIP | 0,1 Zoll | 28

38.5 ATmega168A

Geschwindigkeit (MHz)(3) | Speisespannung (V) | Bestellkode(2) | Gehäuse(1) | Einsatzbereich(6)
20 | 1,8 – 5,5 | ATmega168A-AU | 32A | Industrie (-40 °C … 85 °C)
 |  | ATmega168A-AUR(5)
 |  | ATmega168A-CCU | 32CC1
 |  | ATmega168A-CCUR(5)
 |  | ATmega168A-MMH(4) | 28M1
 |  | ATmega168A-MMHR(4) (5)
 |  | ATmega168A-MU | 32M1-A
 |  | ATmega168A-MUR(5)
 |  | ATmega168A-PU | 28P3
Hinweise:
  1. Der Schaltkreis kann auch als Wafer geliefert werden. Bitte die nationale Atmel-Vertretung kontaktieren, um Bestellinformationen und Mindestabnahmemengen zu erfahren.
  2. Bleifreie Gehäuse entsprechen der europäischen Verordnung zur Vermeidung gefährlicher Stoffe (RoHS). Außerdem frei von Halogenverbindungen und umweltfreundlich („Fully Green“)
  3. See ”Speed Grades” on page 303
  4. Anschlüsse mit NiPdAu überzogen
  5. auf Gurt magaziniert (Tape & Reel)
  6. Für erweiterten Termperaturbereich auf ATmega168PA ausweichen
Gehäuse |  | Pinabstand | Anschlüsse
32A | 1,0 mm dünnes „Plastic Quad Flat Package“ TQFP | 0,8 mm | 32
32CC1 | 4 × 4 × 0,6 mm großes „Ultra-thin Fine-pitch Ball Grid Array“ UFBGA | 0,5 mm | 32
28M1 | 4 × 4 × 1 mm großes „Quad Flat No-Lead / Micro Lead Frame Package“ QFN/MLF | 0,45 mm | 28
32M1-A | 5 × 5 × 1 mm großes „Quad Flat No-Lead / Micro Lead Frame Package“ QFN/MLF | 0,5 mm | 32
28P3 | 0,3 Zoll breites „Plastic Dual Inline Package“ PDIP | 0,1 Zoll | 28

38.6 ATmega168PA

Geschwindigkeit (MHz)(3) | Speisespannung (V) | Bestellkode(2) | Gehäuse(1) | Einsatzbereich
20 | 1,8 – 5,5 | ATmega168PA-AU | 32A | Industrie (-40 °C … 85 °C)
 |  | ATmega168PA-AUR(5)
 |  | ATmega168PA-CCU | 32CC1
 |  | ATmega168PA-CCUR(5)
 |  | ATmega168PA-MMH(4) | 28M1
 |  | ATmega168PA-MMHR(4) (5)
 |  | ATmega168PA-MU | 32M1-A
 |  | ATmega168PA-MUR(5)
 |  | ATmega168PA-PU | 28P3
 |  | ATmega168PA-AN | 32A | Industrie (-40 °C … 105 °C)
 |  | ATmega168PA-ANR(5)
 |  | ATmega168PA-MN | 32M1-A
 |  | ATmega168PA-MNR(5)
 |  | ATmega168PA-PN | 28P3
Hinweise:
  1. Der Schaltkreis kann auch als Wafer geliefert werden. Bitte die nationale Atmel-Vertretung kontaktieren, um Bestellinformationen und Mindestabnahmemengen zu erfahren.
  2. Bleifreie Gehäuse entsprechen der europäischen Verordnung zur Vermeidung gefährlicher Stoffe (RoHS). Außerdem frei von Halogenverbindungen und umweltfreundlich („Fully Green“)
  3. Siehe Geschwindigkeitsbereich
  4. Anschlüsse mit NiPdAu überzogen
  5. auf Gurt magaziniert (Tape & Reel)
Gehäuse |  | Pinabstand | Anschlüsse
32A | 1,0 mm dünnes „Plastic Quad Flat Package“ TQFP | 0,8 mm | 32
32CC1 | 4 × 4 × 0,6 mm großes „Ultra-thin Fine-pitch Ball Grid Array“ UFBGA | 0,5 mm | 32
28M1 | 4 × 4 × 1 mm großes „Quad Flat No-Lead / Micro Lead Frame Package“ QFN/MLF | 0,45 mm | 28
32M1-A | 5 × 5 × 1 mm großes „Quad Flat No-Lead / Micro Lead Frame Package“ QFN/MLF | 0,5 mm | 32
28P3 | 0,3 Zoll breites „Plastic Dual Inline Package“ PDIP | 0,1 Zoll | 28

38.7 ATmega328

Geschwindigkeit (MHz) | Speisespannung (V) | Bestellkode(2) | Gehäuse(1) | Einsatzbereich(6)
20(3) | 1,8 – 5,5 | ATmega328-AU | 32A | Industrie (-40 °C … 85 °C)
 |  | ATmega328-AUR(5)
 |  | ATmega328-MMH(4) | 28M1
 |  | ATmega328-MMHR(4) (5)
 |  | ATmega328-MU | 32M1-A
 |  | ATmega328-MUR(5)
 |  | ATmega328-PU | 28P3
Hinweise:
  1. Der Schaltkreis kann auch als Wafer geliefert werden. Bitte die nationale Atmel-Vertretung kontaktieren, um Bestellinformationen und Mindestabnahmemengen zu erfahren.
  2. Bleifreie Gehäuse entsprechen der europäischen Verordnung zur Vermeidung gefährlicher Stoffe (RoHS). Außerdem frei von Halogenverbindungen und umweltfreundlich („Fully Green“)
  3. Siehe Bild 29-1
  4. Anschlüsse mit NiPdAu überzogen
  5. auf Gurt magaziniert (Tape & Reel)
  6. Für erweiterten Termperaturbereich auf ATmega328P ausweichen
Gehäuse |  | Pinabstand | Anschlüsse
32A | 1,0 mm dünnes „Plastic Quad Flat Package“ TQFP | 0,8 mm | 32
28M1 | 4 × 4 × 1 mm großes „Quad Flat No-Lead / Micro Lead Frame Package“ QFN/MLF | 0,45 mm | 28
28P3 | 0,3 Zoll breites „Plastic Dual Inline Package“ PDIP | 0,1 Zoll | 28
32M1-A | 5 × 5 × 1 mm großes „Quad Flat No-Lead / Micro Lead Frame Package“ QFN/MLF | 0,5 mm | 32

38.8 ATmega328P

Geschwindigkeit (MHz)(3) | Speisespannung (V) | Bestellkode(2) | Gehäuse(1) | Einsatzbereich
20 | 1,8 – 5,5 | ATmega328P-AU | 32A | Industrie (-40 °C … 85 °C)
 |  | ATmega328P-AUR(5)
 |  | ATmega328P-MMH(4) | 28M1
 |  | ATmega328P-MMHR(4) (5)
 |  | ATmega328P-MU | 32M1-A
 |  | ATmega328P-MUR(5)
 |  | ATmega328P-PU | 28P3
 |  | ATmega328P-AN | 32A | Industrie (-40 °C … 105 °C)
 |  | ATmega328P-ANR(5)
 |  | ATmega328P-MN | 32M1-A
 |  | ATmega328P-MNR(5)
 |  | ATmega328P-PN | 28P3
Hinweise:
  1. Der Schaltkreis kann auch als Wafer geliefert werden. Bitte die nationale Atmel-Vertretung kontaktieren, um Bestellinformationen und Mindestabnahmemengen zu erfahren.
  2. Bleifreie Gehäuse entsprechen der europäischen Verordnung zur Vermeidung gefährlicher Stoffe (RoHS). Außerdem frei von Halogenverbindungen und umweltfreundlich („Fully Green“)
  3. Siehe Bild 29-1
  4. Anschlüsse mit NiPdAu überzogen
  5. auf Gurt magaziniert (Tape & Reel)
Gehäuse |  | Pinabstand | Anschlüsse
32A | 1,0 mm dünnes „Plastic Quad Flat Package“ TQFP | 0,8 mm | 32
28M1 | 4 × 4 × 1 mm großes „Quad Flat No-Lead / Micro Lead Frame Package“ QFN/MLF | 0,45 mm | 28
28P3 | 0,3 Zoll breites „Plastic Dual Inline Package“ PDIP | 0,1 Zoll | 28
32M1-A | 5 × 5 × 1 mm großes „Quad Flat No-Lead / Micro Lead Frame Package“ QFN/MLF | 0,5 mm | 32


Gehäuseformen und -abmessungen

39. Gehäuseformen und -abmessungen

39.1 32A

Hinweise:
  1. Das Gehäuse entspricht dem JEDEC-Referenzgehäuse MS-026, Variation ABA
  2. Die Maße D1 und E1 sind exklusive Spritzguss-Überstände. Erlaubte Überstände sind 0,25 mm pro Seite. Die Maße sind maximale Maße des Plastkörpers, auch bei Versatz der Spritzguss-Formen.
  3. Anschlüsse sind planparallel mit maximal 0,1 mm Höhenversatz
Allgemeine Maße
(Einheit = mm)

Maß | Min. | Nom. | Max. | Hinweis
A | – | – | 1,20 |
A1 | 0,05 | – | 0,15 |
A2 | 0,95 | 1,00 | 1,05 |
D | 8,75 | 9,00 | 9,25 |
D1 | 6,90 | 7,00 | 7,10 | (2)
E | 8,75 | 9,00 | 9,25 |
E1 | 6,90 | 7,00 | 7,10 | (2)
B | 0,30 | – | 0,45 |
C | 0,09 | – | 0,20 |
L | 0,45 | – | 0,75 |
e | 0,80 typ. |  |  |

20. Oktober 2010

Zeichnung 39-1: 32-poliges TQFP-Gehäuse mit 0,8 mm Pinabstand und 7 × 7 × 1 mm Plastkörper-Größe

39.2 32CC1

Hinweise:
  1. Maß b ist der maximale horizontale Kugeldurchmesser
  2. Maß b1 ist der Durchmesser der lötbaren Platinenoberfläche, bestimmt durch die Öffnung des Lötstopplacks
Allgemeine Maße
(Einheit = mm)

Maß | Min. | Nom. | Max. | Hinweis
A | – | – | 0,60 |
A1 | 0,12 | – | – |
A2 | 0,38 (Informationskennwert)
b | 0,25 | 0,30 | 0,35 | (1)
b1 | 0,25 | – | – | (2)
D | 3,90 | 4,00 | 4,10 |
D1 | 2,50 (Teilung) |  |  |
E | 3,90 | 4,00 | 4,10 |
E1 | 2,50 (Teilung) |  |  |
e | 0,50 (Teilung) |  |  |

6. Juli 2010

Zeichnung 39-2: 32-poliges UFBGA-Gehäuse mit 0,5 mm Kugelabstand und 4 × 4 × 0,6 mm Größe

39.3 28M1

Hinweis:
  1. Die Pin-1-Markierung ist mit dem Laserbeschrifter erstellt
Allgemeine Maße
(Einheit = mm)

Maß | Min. | Nom. | Max. | Hinweis
A | 0,80 | 0,90 | 1,00 |
A1 | 0,00 | 0,02 | 0,05 |
b | 0,17 | 0,22 | 0,27 |
C | 0,20 (Informationskennwert)
D | 3,95 | 4,00 | 4,05 |
D2 | 2,35 | 2,40 | 2,45 |
E | 3,95 | 4,00 | 4,05 |
E2 | 2,35 | 2,40 | 2,45 |
e | 0,45 |  |  |
L | 0,35 | 0,40 | 0,45 |
y | 0,00 | – | 0,08 |
K | 0,20 | – | – |

24. Oktober 2008

Zeichnung 39-3: 28-poliges VQFN-Gehäuse mit 0,45 mm Pinabstand und 4 × 4 × 1 mm Größe

39.4 32M1-A

Hinweis:
  1. JEDEC-Standard MO-220, Bild 2 (Gesenk-Vereinzelung), VHHD-2
Allgemeine Maße
(Einheit = mm)

Maß | Min. | Nom. | Max. | Hinweis
A | 0,80 | 0,90 | 1,00 |
A1 | – | 0,02 | 0,05 |
A2 | – | 0,65 | 1,00 |
A3 | 0,20 (Informationskennwert)
b | 0,18 | 0,23 | 0,30 |
D | 4,90 | 5,00 | 5,10 |
D1 | 4,70 | 4,75 | 4,80 |
D2 | 2,95 | 3,10 | 3,25 |
E | 4,70 | 4,75 | 4,80 |
E1 | 4,90 | 5,00 | 5,10 |
E2 | 2,95 | 3,10 | 3,25 |
e | 0,50 (Teilung) |  |  |
L | 0,30 | 0,40 | 0,50 |
P | – | – | 0,60 |
Θ | – | – | 12° |
K | 0,20 | – | – |

14. März 2014

Zeichnung 39-4: 32-poliges MLF-Gehäuse mit 0,5 mm Pinabstand und 5 × 5 × 1 mm Größe

39.5 28P3

Hinweis:
  1. Die Maße D und E1 sind exklusive Spritzguss-Überstände. Erlaubte Überstände sind 0,25 mm pro Seite.
Allgemeine Maße
(Einheit = mm)

Maß | Min. | Nom. | Max. | Hinweis
A | – | – | 4,5724 |
A1 | 0,508 | – | – |
D | 34,544 | – | 34,798 | (1)
E | 7,620 | – | 8,255 |
E1 | 7,112 | – | 7,493 | (1)
B | 0,381 | – | 0,533 |
B1 | 1,143 | – | 1,397 |
B2 | 0,762 | – | 1,143 |
L | 3,175 | – | 3,429 |
C | 0,203 | – | 0,356 |
eB | – | – | 10,160 |
e | 2,540 typisch |  |  |

28. September 2001

Zeichnung 39-5: 28-poliges PDIP-Gehäuse mit 2,54 mm Pinabstand und 34,8 × 7,5 × 4 mm Plastkörper-Größe

2325 Orchard Parkway
San Jose, CA 95131

Für Gehäusezeichnungen kontaktiere packagedrawings@atmel.com


Siliziumfehler

40. Siliziumfehler

40.1 Errata ATmega48A

The revision letter in this section refers to the revision of the ATmega48A device.

40.1.1 Rev K

  • Full swing crystal oscillator not supported
  • Parallel programming timing modified
  • Write wait delay for NVM is increased
  • Changed device ID

1. Full swing crystal oscillator not supported

The full swing crystal oscillator functionality is not available in revision K.
Problem Fix / Workaround
Use alternative clock sources available in the device.

2. Parallel programming timing modified

 |  | Previous die revision |  |  |  | Revision K
Symbol | Parameter | Min | Typ. | Max | Units | Min | Typ. | Max | Units
tWLRH_CE | /WR Low to RDY/BSY High for Chip Erase | 7,5 |  | 9 | ms | 9,8 |  | 10,5 | ms
tBVDV | /BS1 Valid to DATA valid | 0 |  | 250 | ns | 0 |  | 335 | ns
tOLDV | /OE Low to DATA Valid |  |  | 250 | ns |  |  | 335 | ns

3. Write wait delay for NVM is increased

The write delay for non-volatile memory (NVM) is increased as follows:
 | Other revisions | Revision K
Symbol | Minimum Wait Delay | Minimum Wait Delay
tWD_ERASE | 9 ms | 10,5 ms

4. Changed device ID

The device ID has been modified according to the to the following:
 | Any die revision |  |  | Previous die revision | Revision K
 | Signature byte address ID (Unchanged) |  |  | Device ID read via debugWIRE | Device ID read via debugWIRE
Part | 0x000 | 0x001 | 0x002
ATmega48A | 0x1E | 0x92 | 0x05 | 0x920A | 0x920A

40.1.2 Rev. E to J

Not Sampled

40.1.3 Rev. D

  • Analog MUX can be turned off when setting ACME bit
  • TWI Data setup time can be too short

1. Analog MUX can be turned off when setting ACME bit

If the ACME (Analog Comparator Multiplexer Enabled) bit in ADCSRB is set while MUX3 in ADMUX is '1' (ADMUX[3:0]=1xxx), all MUXes are turned off until the ACME bit is cleared.
Problem Fix / Workaround
Clear the MUX3 bit before setting the ACME bit.

2. TWI Data setup time can be too short

When running the device as a TWI slave with a system clock above 2MHz, the data setup time for the first bit after ACK may in some cases be too short. This may cause a false start or stop condition on the TWI line.
Problem Fix / Workaround
Insert a delay between setting TWDR and TWCR.

40.2 Errata ATmega48PA

The revision letter in this section refers to the revision of the ATmega48PA device.

40.2.1 Rev K

  • Full swing crystal oscillator not supported
  • Parallel programming timing modified
  • Write wait delay for NVM is increased

1. Full swing crystal oscillator not supported

The full swing crystal oscillator functionality is not available in revision K.
Problem Fix / Workaround
Use alternative clock sources available in the device.

2. Parallel programming timing modified

 |  | Previous die revision |  |  |  | Revision K
Symbol | Parameter | Min | Typ. | Max | Units | Min | Typ. | Max | Units
tWLRH_CE | /WR Low to RDY/BSY High for Chip Erase | 7,5 |  | 9 | ms | 9,8 |  | 10,5 | ms
tBVDV | /BS1 Valid to DATA valid | 0 |  | 250 | ns | 0 |  | 335 | ns
tOLDV | /OE Low to DATA Valid |  |  | 250 | ns |  |  | 335 | ns

3. Write wait delay for NVM is increased

The write delay for non-volatile memory (NVM) is increased as follows:
 | Other revisions | Revision K
Symbol | Minimum Wait Delay | Minimum Wait Delay
tWD_ERASE | 9 ms | 10,5 ms

40.2.2 Rev. E to J

Not sampled.

40.2.3 Rev. D

  • Analog MUX can be turned off when setting ACME bit
  • TWI Data setup time can be too short

1. Analog MUX can be turned off when setting ACME bit

If the ACME (Analog Comparator Multiplexer Enabled) bit in ADCSRB is set while MUX3 in ADMUX is '1' (ADMUX[3:0]=1xxx), all MU Xes are turned off until the ACME bit is cleared.
Problem Fix / Workaround
Clear the MUX3 bit before setting the ACME bit.

2. TWI Data setup time can be too short

When running the device as a TWI slave with a system clock above 2MHz, the data setup time for the first bit after ACK may in some cases be too short. This may cause a false start or stop condition on the TWI line.
Problem Fix / Workaround
Insert a delay between setting TWDR and TWCR.

40.2.4 Rev B to C

Not Sampled

40.2.5 Rev. A

  • Power consumption in power save modes
  • Startup time for the device

1. Power consumption in power save modes

Power consumption in power save modes will be higher due to improper control of internal power management.48
Problem Fix / Workaround
This problem will be corrected in Rev B.

2. Startup time for the device

Due to implementation of a different NVM structure, the startup sequence for the device will require longer startup time.
Problem Fix / Workaround
There is no fix for this problem.

40.3 Errata ATmega88A

The revision letter in this section refers to the revision of the ATmega88A device.

40.3.1 Rev K

  • Full swing crystal oscillator not supported
  • Parallel programming timing modified
  • Write wait delay for NVM is increased
  • Changed device ID
  • Analog MUX can be turned off when setting ACME bit
  • TWI Data setup time can be too short

1. Full swing crystal oscillator not supported

The full swing crystal oscillator functionality is not available in revision K.
Problem Fix / Workaround
Use alternative clock sources available in the device.

2. Parallel programming timing modified

 |  | Previous die revision |  |  |  | Revision K
Symbol | Parameter | Min | Typ. | Max | Units | Min | Typ. | Max | Units
tWLRH_CE | /WR Low to RDY/BSY High for Chip Erase | 7,5 |  | 9 | ms | 9,8 |  | 10,5 | ms
tBVDV | /BS1 Valid to DATA valid | 0 |  | 250 | ns | 0 |  | 335 | ns
tOLDV | /OE Low to DATA Valid |  |  | 250 | ns |  |  | 335 | ns

3. Write wait delay for NVM is increased

The write delay for non-volatile memory (NVM) is increased as follows:
 | Other revisions | Revision K
Symbol | Minimum Wait Delay | Minimum Wait Delay
tWD_ERASE | 9 ms | 10,5 ms

4. Changed device ID

The device ID has been modified according to the to the following:
 | Any die revision |  |  | Previous die revision | Revision K
 | Signature byte address ID (Unchanged) |  |  | Device ID read via debugWIRE | Device ID read via debugWIRE
Part | 0x000 | 0x001 | 0x002
ATmega88A | 0x1E | 0x93 | 0x0A | 0x930F | 0x930F

5. Analog MUX can be turned off when setting ACME bit

If the ACME (Analog Comparator Multiplexer Enabled) bit in ADCSRB is set while MUX3 in ADMUX is '1' (ADMUX[3:0]=1xxx), all MU Xes are turned off until the ACME bit is cleared.
Problem Fix / Workaround
Clear the MUX3 bit before setting the ACME bit.

6. TWI Data setup time can be too short

When running the device as a TWI slave with a system clock above 2MHz, the data setup time for the first bit after ACK may in some cases be too short. This may cause a false start or stop condition on the TWI line.
Problem Fix / Workaround
Insert a delay between setting TWDR and TWCR.

40.3.2 Rev. G to J

Not sampled.

40.3.3 Rev. F

  • Analog MUX can be turned off when setting ACME bit
  • TWI Data setup time can be too short

1. Analog MUX can be turned off when setting ACME bit

If the ACME (Analog Comparator Multiplexer Enabled) bit in ADCSRB is set while MUX3 in ADMUX is '1' (ADMUX[3:0]=1xxx), all MU Xes are turned off until the ACME bit is cleared.
Problem Fix / Workaround
Clear the MUX3 bit before setting the ACME bit.

2. TWI Data setup time can be too short

When running the device as a TWI slave with a system clock above 2MHz, the data setup time for the first bit after ACK may in some cases be too short. This may cause a false start or stop condition on the TWI line.
Problem Fix / Workaround
Insert a delay between setting TWDR and TWCR.

40.3.4 Rev. A to E

Not Sampled.

40.4 Errata ATmega88PA

The revision letter in this section refers to the revision of the ATmega88PA device.

40.4.1 Rev K

  • Full swing crystal oscillator not supported
  • Parallel programming timing modified
  • Write wait delay for NVM is increased
  • Analog MUX can be turned off when setting ACME bit
  • TWI Data setup time can be too short

1. Full swing crystal oscillator not supported

The full swing crystal oscillator functionality is not available in revision K.
Problem Fix / Workaround
Use alternative clock sources available in the device.

2. Parallel programming timing modified

 |  | Previous die revision |  |  |  | Revision K
Symbol | Parameter | Min | Typ. | Max | Units | Min | Typ. | Max | Units
tWLRH_CE | /WR Low to RDY/BSY High for Chip Erase | 7,5 |  | 9 | ms | 9,8 |  | 10,5 | ms
tBVDV | /BS1 Valid to DATA valid | 0 |  | 250 | ns | 0 |  | 335 | ns
tOLDV | /OE Low to DATA Valid |  |  | 250 | ns |  |  | 335 | ns

3. Write wait delay for NVM is increased

The write delay for non-volatile memory (NVM) is increased as follows:
 | Other revisions | Revision K
Symbol | Minimum Wait Delay | Minimum Wait Delay
tWD_ERASE | 9 ms | 10,5 ms

4. Analog MUX can be turned off when setting ACME bit

If the ACME (Analog Comparator Multiplexer Enabled) bit in ADCSRB is set while MUX3 in ADMUX is '1' (ADMUX[3:0]=1xxx), all MU Xes are turned off until the ACME bit is cleared.
Problem Fix / Workaround
Clear the MUX3 bit before setting the ACME bit.

5. TWI Data setup time can be too short

When running the device as a TWI slave with a system clock above 2MHz, the data setup time for the first bit after ACK may in some cases be too short. This may cause a false start or stop condition on the TWI line.
Problem Fix / Workaround
Insert a delay between setting TWDR and TWCR.

40.4.2 Rev. G to J

Not sampled

40.4.3 Rev. F

  • Analog MUX can be turned off when setting ACME bit
  • TWI Data setup time can be too short

1. Analog MUX can be turned off when setting ACME bit

If the ACME (Analog Comparator Multiplexer Enabled) bit in ADCSRB is set while MUX3 in ADMUX is '1' (ADMUX[3:0]=1xxx), all MUXes are turned off until the ACME bit is cleared.
Problem Fix / Workaround
Clear the MUX3 bit before setting the ACME bit.

2. TWI Data setup time can be too short

When running the device as a TWI slave with a system clock above 2MHz, the data setup time for the first bit after ACK may in some cases be too short. This may cause a false start or stop condition on the TWI line.
Problem Fix / Workaround
Insert a delay between setting TWDR and TWCR.

40.4.4 Rev B to E

Not sampled.

40.4.5 Rev. A

  • Power consumption in power save modes
  • Startup time for the device

1. Power consumption in power save modes

Power consumption in power save modes will be higher due to improper control of internal power management.48
Problem Fix / Workaround
This problem will be corrected in Rev B.

2. Startup time for the device

Due to implementation of a different NVM structure, the startup sequence for the device will require longer startup time.
Problem Fix / Workaround
There is no fix for this problem.

40.5 Errata ATmega168A

The revision letter in this section refers to the revision of the ATmega168A device.

40.5.1 Rev K

  • Full swing crystal oscillator not supported
  • Parallel programming timing modified
  • Write wait delay for NVM is increased
  • Changed device ID
  • Analog MUX can be turned off when setting ACME bit
  • TWI Data setup time can be too short

1. Full swing crystal oscillator not supported

The full swing crystal oscillator functionality is not available in revision K.
Problem Fix / Workaround
Use alternative clock sources available in the device.

2. Parallel programming timing modified

 |  | Previous die revision |  |  |  | Revision K
Symbol | Parameter | Min | Typ. | Max | Units | Min | Typ. | Max | Units
tWLRH_CE | /WR Low to RDY/BSY High for Chip Erase | 7,5 |  | 9 | ms | 9,8 |  | 10,5 | ms
tBVDV | /BS1 Valid to DATA valid | 0 |  | 250 | ns | 0 |  | 335 | ns
tOLDV | /OE Low to DATA Valid |  |  | 250 | ns |  |  | 335 | ns

3. Write wait delay for NVM is increased

The write delay for non-volatile memory (NVM) is increased as follows:
 | Other revisions | Revision K
Symbol | Minimum Wait Delay | Minimum Wait Delay
tWD_ERASE | 9 ms | 10,5 ms

4. Changed device ID

The device ID has been modified according to the to the following:
 | Any die revision |  |  | Previous die revision | Revision K
 | Signature byte address ID (Unchanged) |  |  | Device ID read via debugWIRE | Device ID read via debugWIRE
Part | 0x000 | 0x001 | 0x002
ATmega168A | 0x1E | 0x94 | 0x06 | 0x940B | 0x940B

5. Analog MUX can be turned off when setting ACME bit

If the ACME (Analog Comparator Multiplexer Enabled) bit in ADCSRB is set while MUX3 in ADMUX is '1' (ADMUX[3:0]=1xxx), all MU Xes are turned off until the ACME bit is cleared.
Problem Fix / Workaround
Clear the MUX3 bit before setting the ACME bit.

6. TWI Data setup time can be too short

When running the device as a TWI slave with a system clock above 2MHz, the data setup time for the first bit after ACK may in some cases be too short. This may cause a false start or stop condition on the TWI line.
Problem Fix / Workaround
Insert a delay between setting TWDR and TWCR.

40.5.2 Rev. F to J

Not sampled.

40.5.3 Rev. E

  • Analog MUX can be turned off when setting ACME bit
  • TWI Data setup time can be too short

1. Analog MUX can be turned off when setting ACME bit

If the ACME (Analog Comparator Multiplexer Enabled) bit in ADCSRB is set while MUX3 in ADMUX is '1' (ADMUX[3:0]=1xxx), all MUXes are turned off until the ACME bit is cleared.
Problem Fix / Workaround
Clear the MUX3 bit before setting the ACME bit.

2. TWI Data setup time can be too short

When running the device as a TWI slave with a system clock above 2MHz, the data setup time for the first bit after ACK may in some cases be too short. This may cause a false start or stop condition on the TWI line.
Problem Fix / Workaround
Insert a delay between setting TWDR and TWCR.

40.5.4 Rev. A to D

Not sampled.

40.6 Errata ATmega168PA

The revision letter in this section refers to the revision of the ATmega168PA device.

40.6.1 Rev K

  • Full swing crystal oscillator not supported
  • Parallel programming timing modified
  • Write wait delay for NVM is increased
  • Analog MUX can be turned off when setting ACME bit
  • TWI Data setup time can be too short

1. Full swing crystal oscillator not supported

The full swing crystal oscillator functionality is not available in revision K.
Problem Fix / Workaround
Use alternative clock sources available in the device.

2. Parallel programming timing modified

 |  | Previous die revision |  |  |  | Revision K
Symbol | Parameter | Min | Typ. | Max | Units | Min | Typ. | Max | Units
tWLRH_CE | /WR Low to RDY/BSY High for Chip Erase | 7,5 |  | 9 | ms | 9,8 |  | 10,5 | ms
tBVDV | /BS1 Valid to DATA valid | 0 |  | 250 | ns | 0 |  | 335 | ns
tOLDV | /OE Low to DATA Valid |  |  | 250 | ns |  |  | 335 | ns

3. Write wait delay for NVM is increased

The write delay for non-volatile memory (NVM) is increased as follows:
 | Other revisions | Revision K
Symbol | Minimum Wait Delay | Minimum Wait Delay
tWD_ERASE | 9 ms | 10,5 ms

4. Analog MUX can be turned off when setting ACME bit

If the ACME (Analog Comparator Multiplexer Enabled) bit in ADCSRB is set while MUX3 in ADMUX is '1' (ADMUX[3:0]=1xxx), all MU Xes are turned off until the ACME bit is cleared.
Problem Fix / Workaround
Clear the MUX3 bit before setting the ACME bit.

5. TWI Data setup time can be too short

When running the device as a TWI slave with a system clock above 2MHz, the data setup time for the first bit after ACK may in some cases be too short. This may cause a false start or stop condition on the TWI line.
Problem Fix / Workaround
Insert a delay between setting TWDR and TWCR.

40.6.2 Rev. F to J

Not sampled.

40.6.3 Rev E

  • Analog MUX can be turned off when setting ACME bit
  • TWI Data setup time can be too short

1. Analog MUX can be turned off when setting ACME bit

If the ACME (Analog Comparator Multiplexer Enabled) bit in ADCSRB is set while MUX3 in ADMUX is '1' (ADMUX[3:0]=1xxx), all MUXes are turned off until the ACME bit is cleared.
Problem Fix / Workaround
Clear the MUX3 bit before setting the ACME bit.

2. TWI Data setup time can be too short

When running the device as a TWI slave with a system clock above 2MHz, the data setup time for the first bit after ACK may in some cases be too short. This may cause a false start or stop condition on the TWI line.
Problem Fix / Workaround
Insert a delay between setting TWDR and TWCR.

40.6.4 Rev A to D

Not sampled.

40.7 Errata ATmega328

The revision letter in this section refers to the revision of the ATmega328 device.

40.7.1 Rev K

  • Full swing crystal oscillator not supported
  • Parallel programming timing modified
  • Write wait delay for NVM is increased
  • Changed device ID
  • Analog MUX can be turned off when setting ACME bit
  • TWI Data setup time can be too short

1. Full swing crystal oscillator not supported

The full swing crystal oscillator functionality is not available in revision K.
Problem Fix / Workaround
Use alternative clock sources available in the device.

2. Parallel programming timing modified

 |  | Previous die revision |  |  |  | Revision K
Symbol | Parameter | Min | Typ. | Max | Units | Min | Typ. | Max | Units
tWLRH_CE | /WR Low to RDY/BSY High for Chip Erase | 7,5 |  | 9 | ms | 9,8 |  | 10,5 | ms
tBVDV | /BS1 Valid to DATA valid | 0 |  | 250 | ns | 0 |  | 335 | ns
tOLDV | /OE Low to DATA Valid |  |  | 250 | ns |  |  | 335 | ns

3. Write wait delay for NVM is increased

The write delay for non-volatile memory (NVM) is increased as follows:
 | Other revisions | Revision K
Symbol | Minimum Wait Delay | Minimum Wait Delay
tWD_ERASE | 9 ms | 10,5 ms

4. Changed device ID

The device ID has been modified according to the to the following:
 | Any die revision |  |  | Previous die revision | Revision K
 | Signature byte address ID (Unchanged) |  |  | Device ID read via debugWIRE | Device ID read via debugWIRE
Part | 0x000 | 0x001 | 0x002
ATmega328 | 0x1E | 0x95 | 0x14 | 0x9514 | 0x9516

5. Analog MUX can be turned off when setting ACME bit

If the ACME (Analog Comparator Multiplexer Enabled) bit in ADCSRB is set while MUX3 in ADMUX is '1' (ADMUX[3:0]=1xxx), all MUX es are turned off until the ACME bit is cleared.
Problem Fix / Workaround
Clear the MUX3 bit before setting the ACME bit.

6. TWI Data setup time can be too short

When running the device as a TWI slave with a system clock above 2MHz, the data setup time for the first bit after ACK may in some cases be too short. This may cause a false start or stop condition on the TWI line.
Problem Fix / Workaround
Insert a delay between setting TWDR and TWCR.

40.7.2 Rev E to J

Not sampled.

40.7.3 Rev D

  • Analog MUX can be turned off when setting ACME bit
  • TWI Data setup time can be too short

1. Analog MUX can be turned off when setting ACME bit

If the ACME (Analog Comparator Multiplexer Enabled) bit in ADCSRB is set while MUX3 in ADMUX is '1' (ADMUX[3:0]=1xxx), all MUX es are turned off until the ACME bit is cleared.
Problem Fix / Workaround
Clear the MUX3 bit before setting the ACME bit.

2. TWI Data setup time can be too short

When running the device as a TWI slave with a system clock above 2MHz, the data setup time for the first bit after ACK may in some cases be too short. This may cause a false start or stop condition on the TWI line.
Problem Fix / Workaround
Insert a delay between setting TWDR and TWCR.

40.7.4 Rev C

Not sampled.

40.7.5 Rev B

  • Analog MUX can be turned off when setting ACME bit
  • Unstable 32kHz Oscillator

1. Analog MUX can be turned off when setting ACME bit

If the ACME (Analog Comparator Multiplexer Enabled) bit in ADCSRB is set while MUX3 in ADMUX is '1' (ADMUX[3:0]=1xxx), all MUXes are turned off until the ACME bit is cleared.
Problem Fix / Workaround
Clear the MUX3 bit before setting the ACME bit.

2. Unstable 32kHz Oscillator

The 32kHz oscillator does not work as system clock. The 32kHz oscillator used as asynchronous timer is inaccurate.
Problem Fix / Workaround
None.

40.7.6 Rev A

  • Analog MUX can be turned off when setting ACME bit
  • Unstable 32kHz Oscillator

1. Analog MUX can be turned off when setting ACME bit

If the ACME (Analog Comparator Multiplexer Enabled) bit in ADCSRB is set while MUX3 in ADMUX is '1' (ADMUX[3:0]=1xxx), all MUXes are turned off until the ACME bit is cleared.
Problem Fix / Workaround
Clear the MUX3 bit before setting the ACME bit.

2. Unstable 32kHz Oscillator

The 32kHz oscillator does not work as system clock. The 32kHz oscillator used as asynchronous timer is inaccurate.
Problem Fix / Workaround
None.

40.8 Errata ATmega328P

The revision letter in this section refers to the revision of the ATmega328P device.

40.8.1 Rev K

  • Full swing crystal oscillator not supported
  • Parallel programming timing modified
  • Write wait delay for NVM is increased
  • Changed device ID
  • Analog MUX can be turned off when setting ACME bit
  • TWI Data setup time can be too short

1. Full swing crystal oscillator not supported

The full swing crystal oscillator functionality is not available in revision K.
Problem Fix / Workaround
Use alternative clock sources available in the device.

2. Parallel programming timing modified

 |  | Previous die revision |  |  |  | Revision K
Symbol | Parameter | Min | Typ. | Max | Units | Min | Typ. | Max | Units
tWLRH_CE | /WR Low to RDY/BSY High for Chip Erase | 7,5 |  | 9 | ms | 9,8 |  | 10,5 | ms
tBVDV | /BS1 Valid to DATA valid | 0 |  | 250 | ns | 0 |  | 335 | ns
tOLDV | /OE Low to DATA Valid |  |  | 250 | ns |  |  | 335 | ns

3. Write wait delay for NVM is increased

The write delay for non-volatile memory (NVM) is increased as follows:
 | Other revisions | Revision K
Symbol | Minimum Wait Delay | Minimum Wait Delay
tWD_ERASE | 9 ms | 10,5 ms

4. Changed device ID

The device ID has been modified according to the to the following:
 | Any die revision |  |  | Previous die revision | Revision K
 | Signature byte address ID (Unchanged) |  |  | Device ID read via debugWIRE | Device ID read via debugWIRE
Part | 0x000 | 0x001 | 0x002
ATmega328P | 0x1E | 0x95 | 0x0F | 0x950F | 0x9516

5. Analog MUX can be turned off when setting ACME bit

If the ACME (Analog Comparator Multiplexer Enabled) bit in ADCSRB is set while MUX3 in ADMUX is '1' (ADMUX[3:0]=1xxx), all MUX es are turned off until the ACME bit is cleared.
Problem Fix / Workaround
Clear the MUX3 bit before setting the ACME bit.

6. TWI Data setup time can be too short

When running the device as a TWI slave with a system clock above 2MHz, the data setup time for the first bit after ACK may in some cases be too short. This may cause a false start or stop condition on the TWI line.
Problem Fix / Workaround
Insert a delay between setting TWDR and TWCR.

40.8.2 Rev E to J

Not sampled.

40.8.3 Rev D

  • Analog MUX can be turned off when setting ACME bit
  • TWI Data setup time can be too short

1. Analog MUX can be turned off when setting ACME bit

If the ACME (Analog Comparator Multiplexer Enabled) bit in ADCSRB is set while MUX3 in ADMUX is '1' (ADMUX[3:0]=1xxx), all MUXes are turned off until the ACME bit is cleared.
Problem Fix / Workaround
Clear the MUX3 bit before setting the ACME bit.

2. TWI Data setup time can be too short

When running the device as a TWI slave with a system clock above 2MHz, the data setup time for the first bit after ACK may in some cases be too short. This may cause a false start or stop condition on the TWI line.
Problem Fix / Workaround
Insert a delay between setting TWDR and TWCR.

40.8.4 Rev C

Not sampled.

40.8.5 Rev B

  • Analog MUX can be turned off when setting ACME bit
  • Unstable 32kHz Oscillator

1. Analog MUX can be turned off when setting ACME bit

If the ACME (Analog Comparator Multiplexer Enabled) bit in ADCSRB is set while MUX3 in ADMUX is '1' (ADMUX[3:0]=1xxx), all MUXes are turned off until the ACME bit is cleared.
Problem Fix / Workaround
Clear the MUX3 bit before setting the ACME bit.

2. Unstable 32kHz Oscillator

The 32kHz oscillator does not work as system clock. The 32kHz oscillator used as asynchronous timer is inaccurate.
Problem Fix / Workaround
None.

40.8.6 Rev A

  • Unstable 32kHz Oscillator

1. Unstable 32kHz Oscillator

The 32kHz oscillator does not work as system clock. The 32kHz oscillator used as asynchronous timer is inaccurate.
Problem Fix / Workaround
None.


Datenbuch-Revisionen

41. Datenbuch-Revisionen

Please note that the referring section/table/figure numbers in this section are referred to this document. The referring revision in this section are referring to the document revision.

41.1 Rev. 8271J – 11/2015

  1. Updated errata sections:
    • ”Errata ATmega48A”
    • ”Errata ATmega48PA”
    • ”Errata ATmega88A”
    • ”Errata ATmega88PA”
    • ”Errata ATmega168A”
    • ”Errata ATmega168PA”
    • ”Errata ATmega328”
    • ”Errata ATmega328P”

41.2 Rev. 8271I – 10/2014

  1. Several headings have been corrected and electrical characteristics for 105°C have been structured.

41.3 Rev. 8271H – 08/2014

  1. Updated text in section Section 16.9.3 ”Fast PWM Mode” concerning compare units allowing generation of PWM waveforms, referring to table 16-2.
  2. Updated WDT Assembly code example in Section 10.10.5 ”Watchdog Timer” (and onwards)
  3. Updated footnote 1 for tables giving DC Characteristics, ”ATmega88PA DC Characteristics – Current Consumption”, ”ATmega168PA DC Characteristics – Current Consumption” and ”ATmega328P DC Characteristics – Current Consumption”.
  4. Figure 31-1 has been updated with the correct plot.
  5. Figure 31-333 has been updated with the correct plot.
  6. Changed description of external interrupt behavior in deep sleep in Section 13. ”External Interrupts”.
  7. Added wait delay for tWD_FUSE in Table 28-18.
  8. Updated errata for rev A of 48PA and 88PA in Section 40.2 and Section 40.4.
  9. Updated back page and footer according to datasheet template of 05/2014

41.4 Rev. 8271G – 02/2013

  1. Added ”Electrical Characteristics (TA = -40°C to 105°C)”.
  2. Added ”ATmega48PA Typical Characteristics – (TA = -40°C to 105°C)”.
  3. Added ”ATmega88PA Typical Characteristics – (TA = -40°C to 105°C)”.
  4. Added ”ATmega168PA Typical Characteristics – (TA = -40°C to 105°C)”.
  5. Added ”ATmega328P Typical Characteristics – (TA = -40°C to 105°C)”.

41.5 Rev. 8271F – 08/2012

  1. Added ”DC Characteristics”. The following tables for DC characteristics - TA = -40 °C to 105 °C added:
    • Table 29-2
    • Table 30-3
    • Table 30-4
    • Table 30-5
  2. Replaced the following typical characteristics by the plots that include les characteristics at “TA =-40 °C to 105 °C”:
    • ”ATmega48PA Typical Characteristics”
    • ”ATmega88PA Typical Characteristics”
    • ”ATmega168PA Typical Characteristics”
    • ”ATmega328P Typical Characteristics”
  3. Removed the Power Save (Psave) maximum numbers for all devices throughout ”Electrical Characteristics – (TA = -40 °C to 85 °C)”.
  4. Changed the powerdown maximum numbers from 8.5 and 3 µA to 10 and 5 µA (ATmega48PA, ATmega88PA, ATmega168PA and ATmega328P).
  5. Changed the table note “Maximum values are characterized values and not test limits in production” to “Max values are test limits in production throughout ”Electrical Characteristics – (TA = -40 °C to 85 °C)”.

41.6 Rev. 8271E – 07/2012

  1. Updated Figure 1-1. Overlined “RESET” in 28 MLF top view and in 32 MLF top view.
  2. Added EEAR9 bit to the ”EEARH and EEARL – The EEPROM Address Register” and updated the all bit descriptions accordingly.
  3. Added a footnote “EEAR9 and EEAR8 are unused bits in ATmega48A/48PA and must always be written to zero” to ”EEARH and EEARL – The EEPROM Address Register”.
  4. Updated Table 18-8, “Waveform Generation Mode Bit Description”. WGM2, WGM1 and WGM0 changed to WGM22, WGM21 and WGM20 respectively.
  5. Updated ”TCCR2B – Timer/Counter Control Register B”. bit 2 (CS22) and bit 3 (WGM22) changed from R (read only) to R/W (read/write).
  6. Updated the definition of fosc. fosc is the system clock frequency (not XTAL pin frequency)
  7. Updated ”SPMCSR – Store Program Memory Control and Status Register”. Bit 0 renamed SPMEN and added bit 5 “SIGRD”.
  8. Replaced “SELFPRGEN” by “SPMEN” throughout the whole datasheet including in the “code examples”, except in ”Program And Data Memory Lock Bits” and in ”Fuse Bits”.
  9. Updated ”Register Summary” to include the bits: SIGRD and SPMEN in the SMPCSR register.
  10. Updated the Table 30-1. Removed the footnote.
  11. Updated the footnote of the Table 29-13. Removed the footnote “Note 2”.
  12. Updated ”Errata”. Added “Errata” TWI Data setup time can be too short.

41.7 Rev. 8271D – 05/11

  1. Added Atmel QTouch Sensing Capability Feature
  2. Updated ”Register Description” with PINxn as R/W.
  3. Added a footnote to the PINxn.
  4. Updated “Ordering Information”,”ATmega328”. Added “ATmega328-MMH” and “ATmega328-MMHR”.
  5. Updated “Ordering Information”,”ATmega328P”. Added “ATmega328P-MMH” and “ATmega328P-MMHR”.
  6. Added “Ordering Information” for ATmega48PA/88PA/168PA/328P @ 105 °C
  7. Updated ”Errata ATmega328” and ”Errata ATmega328P”
  8. Updated the datasheet according to the Atmel new brand style guide.

41.8 Rev. 8271C – 08/10

  1. Added 32UFBGA Pinout, Table 1-1.
  2. Updated the “SRAM Data Memory”, Figure 8-3.
  3. Updated ”Ordering Information” with CCU and CCUR code related to “32CC1” Package drawing.
  4. “32CC1” Package drawing added ”Packaging Information”.

41.9 Rev. 8271B – 04/10

  1. Updated Table 9-8 with correct value for timer oscillator at xtal2/tos2
  2. Corrected use of SBIS instructions in assembly code examples.
  3. Corrected BOD and BODSE bits to R/W in Section 10.11.2, Section 12.5 and Section 14.4
  4. Figures for bandgap characterization added, Figure 31-34, Figure 31-81, Figure 31-128 , Figure 31-176, Figure 31-223, Figure 31-271, Figure 31-318 and Figure 31-365.
  5. Updated ”Packaging Information” by replacing 28M1 with a correct corresponding package.

41.10 Rev. 8271A – 12/09

  1. New datasheet 8271 with merged information for ATmega48PA, ATmega88PA, ATmega168PA and ATmega48A, ATmega88A andATmega168A. Also included information on ATmega328 and ATmega328P
  2. Changes done:
    • New devices added: ATmega48A/ATmega88A/ATmega168A and ATmega328
    • Updated Feature Description
    • Updated Table 2-1
    • Added note for BOD Disable.
    • Added note on BOD and BODSE in ”MCUCR – MCU Control Register” and ”Register Description”
    • Added limitation information for the application ”Boot Loader Support – Read-While-Write Self-Programming”
    • Added limitation information for ”Program And Data Memory Lock Bits”
    • Added specified DC characteristics
    • Added typical characteristics
    • Removed exception information in ”Address Match Unit”.


Adressierungsarten AVR

Die AVR-Mikrocontroller unterstützen mächtige und effiziente Adressierungsarten, um auf den Programmspeicher (Flash) und den Datenspeicher (SRAM, Register, I/O-Speicher und erweiterten I/O-Speicher) zuzugreifen. Nachfolgend werden die verschiedenen Arten der Adressierung beschrieben.

In den Abbildungen bedeutet OP das Stück des Operationscodes innerhalb des Befehlswortes. Aus Gründen der Vereinfachung zeigen nicht alle Bilder den exakten Ort der adressierenden Bits. Die Variablen RAMEND und FLASHEND stehen für die höchste Speicherzelle im Daten- und Programmspeicher. Nicht alle Adressierungsarten sind in allen Bausteinen verfügbar.

  • Direkte Adressierung eines Registers
  • Direkte Adressierung von zwei Registern (Rd und Rr)
  • Direkte I/O-Adressierung
  • Direkte Datenadressierung
  • Indirekte Datenadressierung mit Versatz
  • Indirekte Datenadressierung
  • Indirekte Datenadressierung mit vorherigem Dekrement
  • Indirekte Datenadressierung mit anschließendem Inkrement
  • Adressierung von Konstanten im Programmspeicher mit den LPM-, ELPM- und SPM-Befehlen
  • Adressierung von Konstanten im Programmspeicher mit den LPM Z+ und ELPM Z+ Befehlen
  • Direkte Programmadressierung, JMP und CALL
  • Indirekte Programmadressierung, IJMP und ICALL
  • Relative Programmadressierung, RJMP und RCALL

Direkte Adressierung eines Registers

Der Operand für den Befehl ist im Register d (Rd).
Direkte Adressierung eines Registers

Direkte Adressierung von zwei Registern (Rd und Rr)

Die Operanden für den Befehl sind in den Registern d (Rd) und r (Rr) enthalten. Das Ergebnis der Operation wird im Register d (Rd) abgelegt.
Direkte Adressierung von zwei Registern

Direkte I/O-Adressierung

Die Adresse des I/O-Operanden ist in den 6 Bits des Befehlswortes enthalten. Rr/Rd ist die Adresse des Ziel- oder Quellregisters. In manchen Bausteinen sind mehr als 64 Speicherzellen im I/O-Bereich vorhanden. Dieser erweiterte Speicherbereich von 64 bis 255 kann nur über die Datenadressierung und nicht über die I/O-Adressierung erreicht werden.

Direkte Datenadressierung

Die 16-Bit-Adresse in den unteren 16 Bit des zwei Worte langen Befehls gibt die Speicherzelle im Datenspeicher an. Rr/Rd ist die Adresse des Ziel- oder Quellregisters.

Indirekte Datenadressierung mit Versatz

Die Adresse des Operanden ergibt sich aus der Addition des Y- oder Z-Registers mit den 6 Bits (Versatz) in dem Befehlswort. Rr/Rd ist die Adresse des Ziel- oder Quellregisters.
Indirekte Datenadressierung mit Versatz

Indirekte Datenadressierung

Die Adresse des Operanden wird über den Inhalt des X-, Y- oder Z-Registers bestimmt. In Bausteinen ohne SRAM entspricht die indirekte Datenadressierung der indirekten Registeradressierung. Die indirekte Registeradressierung ist eine Teilmenge der indirekten Datenadressierung, da der Datenspeicher von 0 bis 31 im Registerbereich liegt.

Indirekte Datenadressierung mit vorherigem Dekrement

Bei dieser Art der Adressierung wird das X-, Y- oder Z-Register vor der Ausführung des Befehls dekrementiert. Die Adresse des Operanden ist also der um eins verminderte Inhalt des entsprechenden Registers.
Indirekte Datenadressierung mit vorherigem Dekrement

Indirekte Datenadressierung mit anschließendem Inkrement

Bei dieser Art der Adressierung wird das X-, Y- oder Z-Register nach der Ausführung des Befehls inkrementiert. Die Adresse des Operanden ist also der Inhalt des entsprechenden Registers, bevor dieses um eins erhöht wird.
Indirekte Datenadressierung mit anschließendem Inkrement

Laden von Konstanten aus dem Programmspeicher mit LPM und ELPM

Die Adresse der Daten wird im Z-Register angegeben. Die oberen 15 Bit geben die Wortadresse an. Beim LPM-Befehl selektiert das LSB das Low-Byte (LSB=0) oder High-Byte (LSB=1). Beim SPM-Befehl muss das LSB=0 sein, da er sich auf ganze Worte (zwei Bytes) bezieht. Wenn der ELPM-Befehl genutzt wird, adressiert das RAMPZ-Register den erweiterten Speicherbereich, das Z-Register die Seite.
Adressierung von Konstanten

Laden von Konstanten aus dem Programmspeicher mit LPM Z+ und ELPM Z+

Die Adresse der Daten wird im Z-Register angegeben. Nach dem Zugriff auf die angegebene Speicherzelle wird der Z-Pointer inkrementiert. Die oberen 15 Bit geben die Wortadresse an. Das LSB adressiert das Low-Byte (LSB=0) oder das High-Byte (LSB=1). Wenn der ELPM Z+ Befehl genutzt wird, adressiert das RAMPZ-Register den erweiterten Speicherbereich, das Z-Register die Seite.
Adressierung von Konstanten mit den LPM Z+ und ELPM Z+

Direkte Programmadressierung, JMP und CALL

Die Ausführung des Programms wird an der Adresse fortgesetzt, die in den 22 Bit des gesamten Befehlswortes angegeben ist.
Direkte Programmadressierung, JMP und CALL

Indirekte Programmadressierung, IJMP und ICALL

Die Ausführung des Programms wird an der Adresse fortgesetzt, die in den 16 Bit des Z-Registers angegeben ist.
Indirekte Programmadressierung, IJMP und ICALL

Relative Programmadressierung, RJMP und RCALL

Die Ausführung des Programms wird an der Adresse fortgesetzt, die sich aus der Addition des aktuellen PC mit der relativen Adresse k und 1 ergibt. Die relative Adresse k kann Werte zwischen -2048 und +2047 annehmen.
Relative Programmadressierung, RJMP und RCALL


Sprungbedingungen AVR

Test | Boolesche Formel | Mnemonik | Umgekehrter Test | Boolesche Formel | Mnemonik | Bemerkung
Rd > Rr | Z • (N ⊕ V) = 0 | BRLT (1) | Rd ≤ Rr | Z + (N ⊕ V) = 1 | BRGE (1) | mit Vorzeichen
Rd ≥ Rr | (N ⊕ V) = 0 | BRGE | Rd < Rr | (N ⊕ V) = 1 | BRLT | mit Vorzeichen
Rd = Rr | Z = 1 | BREQ | Rd ≠ Rr | Z = 0 | BRNE | mit Vorzeichen
Rd ≤ Rr | Z + (N ⊕ V) = 1 | BRGE (1) | Rd > Rr | Z • (N ⊕ V) = 0 | BRLT (1) | mit Vorzeichen
Rd < Rr | (N ⊕ V) = 1 | BRLT | Rd ≥ Rr | (N ⊕ V) = 0 | BRGE | mit Vorzeichen
Rd > Rr | C + Z = 0 | BRLO (1) | Rd ≤ Rr | C + Z = 1 | BRSH (1) | ohne Vorzeichen
Rd ≥ Rr | C = 0 | BRSH BRCC | Rd < Rr | C = 1 | BRLO BRCS | ohne Vorzeichen
Rd = Rr | Z = 1 | BREQ | Rd ≠ Rr | Z = 0 | BRNE | ohne Vorzeichen
Rd ≤ Rr | C + Z = 1 | BRSH (1) | Rd > Rr | C + Z = 0 | BRLO (1) | ohne Vorzeichen
Rd < Rr | C = 1 | BRLO BRCS | Rd ≥ Rr | C = 0 | BRSH BRCC | ohne Vorzeichen
Carry | C = 1 | BRCS | Kein Carry | C = 0 | BRCC | einfach
Negativ | N = 1 | BRMI | Positiv | N = 0 | BRPL | einfach
Überlauf | V = 1 | BRVS | Kein Überlauf | V = 0 | BRVC | einfach
Null | Z = 1 | BREQ | Nicht Null | Z = 0 | BRNE | einfach

Erläuterungen:

  1. Diese Sprungbedingung gilt nur, wenn im vorherigen Vergleichs-Befehl die Operanden vertauscht wurden. Statt CP Rd,Rr muss also der Befehl CP Rr,Rd ausgeführt worden sein.


Opcode-Karte

Die Opcode-Karte zeigt, dass der Befehlsraum des AVRs (bei mehr als 8 KByte Flash) nahezu vollständig ausgenutzt ist, es bleibt daher nur wenig Platz für weitere Befehle mit impliziten Konstanten.
Bild 1: Opcode-Karte — grün = Befehl, weiß = kein Befehl definiert
Das High-Byte bildet die Zeilen, das Low-Byte die Spalten des 256×256 Pixel großen Bildes. Links oben ist (0,0) mit dem einsamen NOP-Befehlspixel.

Das Bild wurde mit diesem PHP-Skript erstellt und farblich nachbearbeitet.


Impressum

AVR - Mikrocontroller

Um was geht es hier

Dieser Bereich enthält das vollständige Datenbuch des ATmegaX8 als deutsche Übersetzung. Außerdem die Beschreibung der AVR-Befehle in deutscher Fassung.

Die größte Bekanntheit erlangt dieser Mikrocontroller sicherlich durch seinen Einsatz auf dem Arduino Uno.

Das Inhaltsverzeichnis habe für mehr Klarheit und Kürze umstrukturiert. Die Texte sind trotzdem kapitelweise wie im Atmel-Datenblatt organisiert, auch wenn sie dadurch im Inhaltsverzeichnis „durcheinander“ erscheinen. Die Sinnlos-Werbekapitel 3..6 habe ich im Inhaltsverzeichnis ausgelassen, hier kann man sie lesen.

Neuigkeiten

23.07.2010
Die Übersetzung für den ATmega8 ist vollständig und online.
05.01.2014
Leichte Umstrukturierung der Webseite und die Übersetzung der AVR-Befehle ist jetzt hier online.
März 2016
Alles neu für das 660-Seiten-PDF (32 Megabyte)

Impressum

Idee (ATmega8), alle Strichzeichnungen als 16-Mio-Farben-JPG (igitt)
Rolf Bröcker
Münstereifeler Straße 18a
53505 Berg
brieftaube@avr-modelleisenbahn.de
Umsetzung (ATmegaX8 sowie natives HTML in CHM)
Henrik Haftmann
Bernsdorfer Straße 160
09126 Chemnitz
henrik.haftmann@gmail.com.
Auch die Illustrationen (Bilder) wurden übersetzt, sofern Aufwand und Nutzen überschaubar blieb. Registerdarstellungen wurden als Tabelle, also HTML-Text, umgesetzt.

Beim Übersetzen fielen mir einige Ungereimtheiten auf. Viele offensichtliche Fehler wurden bereinigt (zumeist falsche Links), wieder andere habe ich wortwörtlich stehen gelassen. Wenn also mancher Textabschnitt sich schwülstig liest und dann auch noch falsch oder irreführend ist, habe ich diesen mit dem Hinweis (sic) stehen gelassen.

An einigen Stellen sind eingerückte Abschnitte in kleiner Schrift zu sehen. Dies sind Ansichten bzw. Hinweise des Übersetzers zum besseren Verständnis und nicht Teil des originalen Datenblattes. Allerdings wären solche Abschnitte im echten Datenblatt sehr hilfreich.

Glossar

Beim Übersetzen scheiden sich die Geister, wie weit man Fachenglisch übersetzt. Ich habe mich durchaus an DDR-Literatur gehalten, vornehmlich Kieser/Meder: Mikroprozessortechnik. Aber nicht alles ganz so eingedeutscht wie damals („ZVE“ = CPU). Auch nicht so wie IBM („Serielle Zeigereinheit“ = (Computer-)Maus). Aber auch nicht so dürftig wie die Vorlage von Rolf Bröcker („Lockbits“ dienen nicht zum Anlocken). Sondern irgendwo dazwischen. Abkürzungen wurden weitestgehend englisch belassen.
Englisch | Bedeutung | Gewählte Übersetzung
VCC | voltage between collectors, längst veralteter Index aus Bipolarzeiten | UCC entsprechend dem internationalen Formelzeichen für Spannung; Speisespannung
AVCC | analog voltage between collectors | AUCC
flash, flash memory | „Blitz-Speicher“, elektrisch löschbarer, dauerhafter Nur-Lese-Speicher | Flash, Flash-Speicher
interrupt | Unterbrechung | Interrupt
interrupt request | Anfage zur Unterbrechung | Interrupt-Anforderung
buffer | hier: Zwischenspeicher, Speicherbereich | Puffer
timer/counter | Zeitgeber/Zähler | Zähler/Zeitgeber
output compare | Vergleich des Zählerstandes mit einem Fixwert | Output Compare (Bessere Idee?)
compare match | Gleichheit beim Vergleich des Zählerstandes mit einem Fixwert | Compare Match (Bessere Idee?)
temporary register | Zwischen-Register | Schattenregister (gibt die Funktion besser wieder, engl. shadow register)
waveform | Wellenform (hier: nur digital) | Kurvenzug
analog comparator | Analog-Vergleicher | Analogvergleicher
ADC, analog/digital converter | Analog-Digital-Wandler | Analog-Digital-Wandler, Analog-Digital-Umsetzer (ADU)
fuse | Sicherung; etwas, was durchbrennt | Fuse (mit „sicher“ hat eine Fuse im Mikrocontroller-Sinn nichts zu tun)
low, high, extended | niedrig, hoch, erweitert | im Zusammenhang mit Fuse: Low, High und Erweitert
lock | Sperre, Schloss, Verriegelung | Sperre (da Verwechslungsgefahr mit „Locke“, „locken“)
CPU | central processing unit: Zentrale Verarbeitungseinheit, ZVE | CPU (erscheint mir inzwischen geläufiger als ZVE)
MCU | Mikrocontroller | Mikrocontroller
ALU | arithmetic logic unit: Rechenwerk | ALU (keine Gartengeräteproduktion)
boot loader | Ein Lader, der sich an seinen Stiefeln (boot) aus dem Sumpf zieht (ähnlich Münchhausen) | Urlader
boot sector | Urlader-Sektor | Urlader-Bereich („Sektor“ ist bereits ein kleinerer Flash-Speicherbereich)
application sector | Anwendungs-Sektor | Anwender-Bereich (= das, was der Urlader vom Flash übrig lässt)
pin | Nadel; hier: Anschlussbein | Pin
pad | Tupfkissen; hier: SMD-Lötfläche | Pad


Resources, Data Retention, Code Examples, QTouch

3. Resources

A comprehensive set of development tools, application notes and datasheets are available for download on http://www.atmel.com/avr.

4. Data Retention

Reliability Qualification results show that the projected data retention failure rate is much less than 1 PPM over 20 years at 85°C or 100 years at 25°C.

5. About Code Examples

This documentation contains simple code examples that briefly show how to use various parts of the device. These code examples assume that the part specific header file is included before compilation. Be aware that not all C compiler vendors include bit definitions in the header files and interrupt handling in C is compiler dependent. Please confirm with the C compiler documentation for more details. For I/O Registers located in extended I/O map, “IN”, “OUT”, “SBIS”, “SBIC”, “CBI”, and “SBI” instructions must be replaced with instructions that allow access to extended I/O. Typically “LDS” and “STS” combined with “SBRS”, “SBRC”, “SBR”, and “CBR”.

6. Capacitive Touch Sensing

The Atmel® QTouch® Library provides a simple to use solution to realize touch sensitive interfaces on most Atmel AVR® microcontrollers. The QTouch Library includes support for the Atmel QTouch and Atmel QMatrix® acquisition methods. Touch sensing can be added to any application by linking the appropriate Atmel QTouch Library for the AVR Microcontroller. This is done by using a simple set of APIs to define the touch channels and sensors, and then calling the touch sensing APIs to retrieve the channel information and determine the touch sensor states. The QTouch Library is FREE and downloadable from the Atmel website at the following location: www.atmel.com/qtouchlibrary. For implementation details and other information, refer to the Atmel QTouch Library User Guide — also available for download from Atmel website.