Pfad: Home => AVR-Übersicht => AVR-Architektur
Eine Ansammlung älterer und neuer AVR in DIP-Packungen

Überblick über die Architektur von AVRs

Das Folgende gibt einen Überblick über AVRs für Anfänger. Es beschreibt allgemeine Eigenschaften aller AVR-Typen und die in den AVRs intern verfügbare Hardware für den praktischen Einsatz. In Auswahl wird ein Tool beschrieben, mit dem der optimale AVR-Typ anhand der erforderlichen Hardware ausgewählt werden kann.

1 Allgemeine Eigenschaften von AVRs

Die AVR sind eine Serie von 8-Bit-Mikroprozessoren, genannt ATtiny, ATmega und ATxmega. Ältere Typen hießen AT89 und AT90S. Alle diese Typen sind durch die folgenden Eigenschaften charakterisiert: Das folgende Bild gibt einen vereinfachten Überblick über alle verfügbaren Speicher in den AVRs. Die 32 Register und die 64 Ports können zusätzlich auch mit den 16-Bit-Zeigern gelesen und beschrieben werden (LD, ST). Daher beginnt das SRAM bei höheren Adressen. Bitte beachten, dass die 64 Ports in großen AVRs nicht ausreichen und daher erweitert werden. Diese zusätzlichen Ports können nicht mit IN/OUT, sondern müssen mit LDS/STS angesteuert werden.

Memory organisation of AVRs

Die Benennungen von Ports und deren Adressen, der Start und das Ende des SRAMs und alle anderen typ-spezifischen Parameter sind in Dateien mit den Namen "devicedef.inc" angegeben, bei denen "device" z.B. mit "tn13" angegeben wird. Alle typspezifische Hardware, alle Modi dieser Hardware und deren Konfiguration und die elektrischen Eigenschaften der verschiedenen AVR sind in den Datenbüchern (Devive Data Book) beschrieben und können bei ATMEL abgeholt werden.

Databook


Anfang dieser Seite Übergeordnetes Hardware Typauswahl

2 Interne Hardwarekomponenten und ihre Anwendung

2.1 Ein- und Ausgabepins

Alle externen Pins des Controllers, außer den Stromversorgungspins VCC und GND sowie (normalerweise) der RESET-Eingang, können als Ein- und Ausgabepins konfiguriert werden. Das kann für jeden Pin in drei verschiedenen Modi erfolgen (x = Port A, B, C, ...; n = Portpin 0, 1, ...):
  1. als Ausgabepin: wird das Richtungsbit (direction bit) im DDRxn-Port auf Eins gesetzt, wird der Ausgangstreiber eingeschaltet. Das Bit PORTxn bestimmt dann darüber, ob der Pin Eins (nahe Plus der Betriebsspannung) oder Null (nahe Minus der Betriebsspannung) wird. Der Pin kann im Eins-Zustand bis zu 50 mA treiben, im Null-Zustand bis zu 70 mA.
  2. als hochohmiger Eingabepin: ist das Richtungsbit im DDxn-Port Null, wird der Ausgangstreiber abgeschaltet. Der Zustand des Pins kann im Port PINxn gelesen werden. Eingabepins haben einen extrem hohen Eingangswiderstand und eine kleine Schmitt-Trigger-Spannung (der Pin geht erst bei einer etwas höheren Spannung auf Eins und bei einer etwas niedrigeren auf Null, Schaltschwelle).
  3. als Eingabepin mit einem Pull-Up-Widerstand: bei gelöschtem Richtungsbit DDRxn und gesetztem PORTxn-Bit wird ein Widerstand von etwa 50 kΩ vom Eingabepin zur positiven Betriebsspannung geschaltet. Das reduziert den Eingangswiderstand. Sofern der Pin nicht extern auf niediges Potenzial gezogen wird, liefert er beim Lesen Eins.
Das folgende Bild zeigt den Ausgangstreiber, die Eingangsstufe und den Pull-Up-Widerstand eines einzelnen Portpins im Detail, in diesem Fall PB0.

Portpin-Konfiguration
Alle Einstellungen an Portpins können jederzeit von der Software geändert werden, so dass z.B. Operationen in beiden Richtungen möglich sind.

Externe Pegelwechsel an bestimmten Eingabepins können einen externen Interrupt auslösen. Kleinere Typen haben dafür den INT0-Eingang, größere zusätzlich INT1 oder gar INT2. Diese Pins können so konfiguriert werden, dass sie bei Pegelwechseln von Null auf Eins, von Eins auf Null oder bei beiden Pegelwechseln einen Interrupt auslösen. In einem weiteren Fall wird der Interrupt so lange ausgelöst wie der Eingang auf Null bleibt.

Zusätzlich können in vielen AVR-Typen aber auch alle anderen Pins als Interrupt-Auslöser konfiguriert werden. Dieser Interrupt wird als PCINTn bezeichnet. Nur diejenigen PCINT-Eingänge lösen einen Interrupt aus, deren Bit in einer Maske Eins gesetzt ist. Sind mehr als ein Bit gesetzt, muss per Software festgestellt werden, welcher von den Pins den Interrupt ausgelöst hat. Alle Pegelwechsel lösen PCINT aus.

Die meisten Portpins können auch für ausgewählte andere Zwecke eingesetzt werden. Daher sollte die Beschreibung der Ports konsultiert werden.

Anfang dieser Seite Übergeordnetes Hardware Typauswahl

2.2 Timer/Counter

Die eingebauten Timer/Counter können für etliche Aufgaben eingesetzt werden: Timer/Counter können im Timer-Modus vom Prozessortakt oder aus einem Vorteiler mit einer Teilerrate von 8, 64, 256 oder 1024 getaktet werden. Im Zählermodus kann ein externes Signal den Takt angeben, entweder bei steigendem oder fallendem Signalpegel.

Timer/counter Taktquellen

Timer/Counter können entweder 8 oder 16 Bit haben. Alle AVR-Timer haben entweder einen oder zwei Vergleicher an Bord. Diese können dazu verwendet werden, um den Zählerstand bei ganz bestimmten Werten zu erkennen und z.B. einen Interrupt auszulösen.

Timer/counter Compare

Zusätzlich können die Vergleicher dazu benutzt werden, um bestimmte Ausgänge auf Eins oder Null zu setzen oder ihre Polarität umzukehren (to toggle). Diese Pins heißen OCnA oder OCnB, wobei n die Timer/Counter-Zahl ist (0, 1, 2 ...).

Timer/Counter können einen Interrupt auslösen Zahlreiche unterschiedliche Timer/Counter modi sind wählbar: Timer modes

Handelt es sich beim Timer/Counter um ein 16 Bit Exemplar muss eine bestimmte Prozedur eingahalten werden, damit die oberen 8 Bits und die unteren 8 Bits gleichzeitig in den Port geschrieben werden. Dazu wird ein Byte in einem Puffer aufbewahrt.

Der Timer/Counter Betriebsmodus, die Vorteilerauswahl, die Pinwechselmodi und die Interruptauswahl werden in drei Ports kontrolliert.

Anfang dieser Seite Übergeordnetes Hardware Typauswahl

2.3 AD-Wandler

Die meisten AVR haben einen 10-Bit-AD-Wandler an Bord. Dieser wandelt analoge Spannungen an den AINn-Pins in einen Digitalwert um. Als Referenz dabei dient entweder die Betriebsspannung, eine eingebaute Konstantspannungsquelle von 1,1 V oder (in wenigen Fällen) eine extern zugeführte Spannung.

Der als Analogeingang ausgewählte Portpin und die Referenzspannung werden in dem Port ADMUX eingestellt.

Die Umwandlung wird mit der Methode der sukzessiven Approximation ausgeführt. Dazu wird in einer schrittweisen Näherung jeweils die halbe Referenzspannung verglichen. Ist die Eingangsspannung kleiner, ist das oberste Bit Null. Im nächsten Schritt wird ein Viertel der Referenzspannung zum Wert dazu addiert und erneut verglichen. Usw. bis alle 10 Bits ermittelt sind.

Die Taktung dieses Annäherungsprozesses erfolgt aus dem Prozessortakt durch Teilen mit 2, 4, 8 oder einer höheren Teilerrate bis 128. Eine Wandlung benötigt 14 AD-Wandlertakte, wenn der AD-Wandler vor dem Start der Wandlung eingeschaltet war. Der erfolgte Abschluss der Wandlung kann am Bit ADSC im AD-Kontrollwort ermittelt werden. Mit dem ADEN-Bit in diesem Port kann bei Abschluss der Wandlung der ADC_RDY-Interrupt ausgelöst werden.

Normalerweise dient nur ein mit ADMUX auswählbarer AINn-Pin zur Messung. In einigen neueren Typen ist es aber möglich, zwei Pins zu verwenden und die Differenz der Spannung an den beiden Pins zu messen. Es ist zusätzlich möglich, diese Differenz um das 20-fache oder bis zum 100-fachen zu verstärken (gain). Die beiden Pins und die Verstärkung werden im ADMUX-Port eingestellt. Ist die Differenz an den beiden Eingangspins negativ, kann die Ausgabe negativer Werte eingestellt werden, wobei das höchste Bit zum Vorzeichen wird.

Einige wenige AVR-Typen haben einen Temperatursensor an Bord, der in ADMUX ebenfalls als Eingangswert eingestellt werden kann. Die gemessenen Temperaturwerte haben eine Genauigkeit von 1° und müssen justiert werden.

Anfang dieser Seite Übergeordnetes Hardware Typauswahl

2.4 Analogvergleicher

Alle AVR-Typen haben einen Analogvergleicher an Bord. Dieser vergleicht Analogspannungen an zwei Pins AIN0 und AIN1. Das Vergleichsergebnis kann vom Port ACSR gelesen werden.

Analog comparator

Wechsel im Ergebnis können einen ANA_COMP-Interrupt auslösen, wenn das Enable-Bit im ACSR gesetzt ist.

2.5 EEPROM

Alle AVR-Typen haben EEPROM-Speicher an Bord. Sein Inhalt bleibt über sehr lange Zeiten erhalten, die maximale Anzahl an Schreiboperationen ist spezifiziert.

Der Standard-Inhalt des EEPROMs, wenn ein neues Exemplar ausgeliefert wird oder nachdem eine Löschoperation ausgeführt wurde, ist 255dezimal oder FFhex.

EEPROM-Speicherstellen können gelesen werden durch
  1. Schreiben der gewünschten Adresse in den EEPROM-Adress-Port,
  2. das Setzen des Read-Enable-Bits im EEPROM-Kontrollport,
  3. Einlesen des Ergebnisses aus dem EEPROM-Daten-Port.
Das Schreiben von Daten in das EEPROM erfolgt durch folgenden Algorithmus:
  1. Schreiben der gewünschten Adresse in den EEPROM-Adress-Port,
  2. Schreiben des Datenbytes in den EEPROM-Daten-Port,
  3. Setzen der Schreibmodus-Bits (nur Programmieren, nur Löschen, Löschen und Programmieren) im EEPROM-Kontrollport,
  4. Setzen des EEPROM-Write-Enable-Bits in diesem Port,
  5. Setzen des EEPROM-Write-Bits in diesem Port.
Der Schreibfortschritt kann durch Lesen des Write-Bits erfolgen. Der Abschluss des Schreibvorgangs kann einen EE_RDY-Interrupt auslösen, wenn das Enable-Bit im EEPROM-Kontrollregister dafür gesetzt ist.

Anfang dieser Seite Übergeordnetes Hardware Typauswahl

2.6 Asynchrone Empfangs-/Sendeeinrichtung, USARTs

Größere AVR-Typen haben ein Universal-Interface für die serielle Kommunikation an Bord. Das Interface liest serielle Signale am RXD-Eingang und sendet sie am TXD-Ausgang, entweder im asynchronen oder im synchronen Modus. Die Signale an RXD und TXD können extern in das RS232-Format oder in andere serielle Übertragungsformate umgewandelt werden.

Datenpakete (Frames) können bestehen aus
  1. einem Startbit,
  2. 5, 6, 7, 8 oder 9 Datenbits,
  3. keinem, geradem oder ungeradem Paritätsbit,
  4. einem oder zwei Stopbits.
AVR-Typen mit USART(s) an Bord haben zusätzlich einen Baudratengenerator an Bord, der die serielle Taktrate für den Empfänger und den Sender vorgibt. Der Generator teilt den Prozessortakt maximal durch 16*4096 = 65.536. Er kann im UBRR-Port eingestellt werden. Einige Typen haben einen zusätzlichen Takteingang XCK dafür, der extern mit einem Taktsignal bespeist werden kann.

Das UART kann als Interruptquelle für folgende Fälle konfiguriert werden:
  1. USART_RXC wird ausgelöst, wenn ein Zeichen empfangen wurde, Framefehler, Datenüberläufe und Paritätsfehler können im Kontrollport erkannt werden,
  2. USART_UDRE wird ausgelöst, wenn der Sendepuffer leer ist und das nächste zu sendende Zeichen in den Puffer geschrieben werden kann,
  3. USART_TXC wird ausgelöst, wenn der Sendepuffer leer ist und das letzte zu sendende Zeichen vollständig gesendet wurde.


Anfang dieser Seite Übergeordnetes Hardware Typauswahl

2.7 Synchrone serielle Kommunikation

Bei der synchronen seriellen Kommunikation wird ein Taktsignal eingesetzt, um die seriell am Dateneingang anliegenden Bits in ein Schieberegister des Empfängers zu transferieren. Umgekehrt werden beim Senden die Datenbits am Sendeausgang nacheinander bereitgestellt und mit einem Taktsignal gesendet.

Die meisten AVR-Typen haben die Hardware für synchrone serielle Kommunikation an Bord. Diese kann entweder für den Zwei- oder den Dreileitungs-Modus konfiguriert werden (Two-Wire, Three-Wire).

Im Three-Wire-Modus sind die Pins DO, DI und USCK aktiv. USCK erzeugt das Taktsignal, wenn der AVR im Mastermode ist und den Takt vorgibt, die Datenbits werden in DO herausgeschoben und am DI hineingeschoben.

Im Two-Wire-Modus verwendet der AVR die Pins SDA/DI und SCL/USCK, die beide bidirektional arbeiten und einen offenen Kollektorausgang haben. Wenn das Interface als Empfänger konfiguriert ist kommen Takt- und Datensignale von der externen Quelle. Wenn als Sender konfiguriert, werden beide Signale vom AVR getrieben.

Interrupts können für das Erkennen der Startbedingung (USI_STR) und für die Erkennung von Überläufen (USI_OVF) beim Empfang eines kompletten Datenbytes gesetzt werden.

2.8 Taktvorteiler

Taktsignalquellen für den Prozessor sind entweder
  1. ein interner RC-Oszillator (mit z.B. 8 MHz),
  2. ein interner zweiter RC-Oszillator mit niedriger Frequenz (z.B. 128 kHz),
  3. ein extern angeschlossenes Taktsignal, oder
  4. ein extern angeschlossener Quarz oder Schwinger, der mit einem internen Oszillator arbeitet.
Die Auswahl dieser Taktoptionen erfolgt mittels Setzen von Fuses.

Die meisten AVR-Typen haben zusätzlich einen Taktvorteiler an Bord. Dieser teilt die Frequenz der Taktquelle durch Faktoren zwischen 1 und 256. Die Voreinstellung ist 8. Durch Löschen der CLKDIV8-Fuse läuft der Prozessor ohne diesen Vorteiler, z.B. mit der Geschwindigkeit des internen RC-Oszillators.

Um den Taktvorteiler zu aktivieren und einzustellen, ist Folgendes erforderlich:
  1. das Enable-Bit im Port CLKPR wird gesetzt, und
  2. innerhalb von vier Taktzyklen wird der gewünschte Teilerfaktor in den CLKPR-Port geschrieben.
Der Teiler wird danach sofort aktiv.

Anfang dieser Seite Übergeordnetes Hardware Typauswahl

3 Typauswahl

Wenn ein Projekt beginnt, stellt sich sofort die Frage, mit welchem AVR-Typ man das Projekt am Besten ausführt. Nachträglicher Typwechsel von einem kleineren auf einen größeren Typ sind zwar nicht sehr aufwändig (im Gegensatz zu dem was Nichtkenner von Hard- und Software so alles in diversen Foren behaupten), aber so richtig optimal wird Software erst, wenn sie die Features, die der Typ bietet, optimal ausnutzt (freiwillige Feature-Kastration ist auch eine häufig genutzte Methode, um Kompatibilität zu erreichen - der kleinste gemeinsame Nenner als selbstgewählte Performance-Bremse).

C-Programmierer brauchen den Rest dieses Kapitels gar nicht zu lesen und zu verstehen. Sie brauchen so viel Programmspeicher, dass es den ganzen Rest der Hardware ganz umsonst schon dazu gibt. Sie können jetzt direkt in das Speicherkapitel wechseln.

Für die, die in Assembler programmieren, bleibt die Welt farbenfroh. Die Auswahl an Typen, Packungsarten und -größen, interne Hardware, Pin-Zuordnung, etc., macht etwas Aufwand.

3.1 Auswahlkriterien

Die folgenden Kriterien spielen bei der Auswahl des optimalen AVR-Typs eine Rolle:

3.2 Auswahl nötiger Funktionen

Das folgende Werkzeug bietet Hilfe bei der Auswahl von AVR-Typen nach Hardwarefunktionen. Es ist in Lazarus-Pascal geschrieben und ist für Linux und Windows verfügbar. Die Software gibt es in zwei Versionen.

3.2.1 Normalversion

Die folgenden Bilder sind mit der Windows-Version gemacht, die Linux-Version sieht ein klein wenig anders aus (macht aber dasselbe).

avr_select

Die linke Seite des Programmfensters dient der Auswahl der nötigen Hardwarekomponenten.

Komponenten Alle nötigen Komponenten sind anzuklicken. Bei den drei Einstellfeldern für die Anzahl an PCINT, AD-Wandlerkanälen und von I/O-Einzelpins kann die benötigte Anzahl vorgewählt werden.

Devices-Feld Jede Änderung bei der Komponentenauswahl listet alle Typengruppen im Devices-Feld auf, die über die nötigen Funktionen verfügen. Wenn das Anzeigekriterium "All devices" aktiviert ist, zeigt das auch die nicht geeigneten Typen an, mit einem Stern davor, und diejenigen Anforderungen, die nicht erfüllt sind.

Wenn in dem Devices-Feld ein bestimmter Typ angeklickt wird, zeigt das Fenster "Device" die Anschlussfolge dieses Typs (in der PDIP/SOIC-Version) an. Wenn die Auswahl "Original pinout" eingeschaltet ist, stellt diese das Original dar. Wenn nicht dann signalisieren die Pinfunktionen in Kleinbuchstaben, welche Pins den gewählten Hardwarefunktionen zugeordnet wurden (alternative Pinfunktionen werden ausgeblendet).

Beispiel In diesem Beispiel sind fünf PCINT, ein Quarz als Taktgeber sowie ein separater Timer-Oszillator, die beiden OC-Signalausgänge von Timer 1, drei AD-Wandler-Eingänge mit interner Spannungsreferenz, der Analogvergleicher, ein 4-Bit-Bus und drei einzelne I/O-Portbits zugeordnet. Die meisten AVR-Typen erfüllen diese Anforderungen nicht gleichzeitig.

Ergebnis Das ist das Ergebnis für den ATmega644. Pins in Kleinbuchstaben sind fest zugeordnet, in Großbuchstaben nicht. Die Pins 3 und 4 sind für den Analogvergleicher reserviert, der 4-Bit-Bus ist den Pins 5 bis 8 (PB4 bis PB7), die fünf PCINTs an Pin 37 (PCINT3) und Pin 36 (PCINT4), Pin 22 (PCINT16) und Pin 23 (PCINT17) sowie Pin 20 (PCINT30) zugeordnet. ADC-Kanäle werden, wenn möglich, in einer Reihe angeordnet, was die Adressierung vereinfacht. Hier sind das ADC0 bis ADC2 an den Pins 40 bis 38.

Die folgenden Checkboxen formatieren die Anzeige um:
Frame-Ansicht So sieht die Frame-Ansicht in asm-Formatierung aus.

Der Knopf "Save" speichert die angewendeten Kriterien und das Pinout in einer Textdatei. Die sieht folgendermaßen aus:
Design criteria for Devices = ATmega164/324/644/1284:
  External ints: INT0 INT1 5 PCINTs
  Clock sources: Oscillator with external xtal or resonator
  TC1: OC1A OC1B
  UART0: RXD0 TXD0 External_clock
  Analog channels: 3, Internal reference enabled, analog comparator enabled
  I/O-Pins: 4-bit-bus 3 single bits

Pin layout:
;            ___________________________
;          1/                           |40
;        o--|xck0                   adc0|--o
;          2|                           |39
;        o--|pb1                    adc1|--o
;          3|                           |38
;        o--|ain0                   adc2|--o
;          4|                           |37
;        o--|ain1                 pcint3|--o
;          5|                           |36
;        o--|pb4                  pcint4|--o
;          6|                           |35
;        o--|pb5         PA5 ADC5 PCINT5|--o
;          7|                           |34
;        o--|pb6         PA6 ADC6 PCINT6|--o
;          8|                           |33
;        o--|pb7         PA7 ADC7 PCINT7|--o
;          9|                           |32
;        o--|reset                  aref|--o
;         10|                           |31
;        o--|vcc                     gnd|--o
;         11|                           |30
;        o--|gnd                    avcc|--o
;         12|                           |29
;        o--|xtal2                   pc7|--o
;         13|                           |28
;        o--|xtal1                   pc6|--o
;         14|                           |27
;        o--|rxd0        PC5 TDI PCINT21|--o
;         15|                           |26
;        o--|txd0        PC4 TDO PCINT20|--o
;         16|                           |25
;        o--|int0        PC3 TMS PCINT19|--o
;         17|                           |24
;        o--|int1        PC2 TCK PCINT18|--o
;         18|                           |23
;        o--|oc1b                pcint17|--o
;         19|                           |22
;        o--|oc1a                pcint16|--o
;         20|                           |21
;        o--|pcint30    PD7 OC2A PCINT31|--o
;           |___________________________|
Die Software gibt es hier: Die Software ist kostenlos für nicht-kommerzielle Verwendung. Fehlermeldungen, Anfragen zu weiteren Features, positive oder negative Rückmeldungen bitte per Email an info bei avr-asm-tutorial.net.

3.2.2 Fortgeschrittene Version

Bei der fortgeschrittenen Version sind zwei zusätzliche Funktionen verfügbar:
  1. die Auswahl nach Speichergröße,
  2. die Verlinkung mit zwei Anbietern von AVRs.
Die Auswahl nach Speichergröße erfolgt mit drei Dropdown-Selektoren.

Speicherauswahl

Die angebotenen Größen sind typische Werte bei allen AVR. Ausgewählt werden damit die AVR-Typen, die mindestens den gewählten Wert aufweisen.

Das zweite Feature prüft, ob Varianten des betreffenden Typs in den beiden Shops verfügbar sind und bietet dann zwei entsprechende Schaltflächen an.

Shop-Auswahl

Beim Anklicken der beiden Schaltflächen öffnet sich ein zusätzliches Fenster, das in den Shops verfügbare Untertypen auflistet.

Microchip Reichelt

Klickt man einen der aufgelisteten Typen an, dann öffnet sich im Internetbrowser ein Fenster, der direkt zur entsprechenden Produktseite führt. Bei Microchip sind auf dieser Seite auch die entsprechenden Datenbücher für den gewählten Typ verlinkt.

Die Software gibt es hier:

4 Speicher

Wenn Du an die Speichergrenzen stößt, verwende einfach einen größeren Typ. Bitte unbedingt beachten: das Befüllen des Speichers mit unnützem, weil nie verwendetem Schrott, ist kein guter Grund, um zu einem größeren Typ umzusteigen. In diesem Fall ist es eine bessere Idee den Code zu optimieren. Eine Liste der Speichergrößen ist hier verfügbar.

Anfang dieser Seite Übergeordnetes Hardware Typauswahl



©2017 by http://www.avr-asm-tutorial.net
Verwendung, Kopieren und Weitergabe dieser Seiten ist zulässig solange die Copyright-Angaben erhalten bleiben.