erstellt  30.09.2013
Analogmessung mit Atmega 32


Analoge Eingangswerte werden in der Regel über den AVR Analog-Digital-Converter (AD-Wandler, ADC) eingelesen,

der in vielen Typen verfügbar ist (typisch 10bit Auflösung).

Durch diesen werden analoge Signale (Spannungen) in digitale Zahlenwerte gewandelt.

Bei AVRs, die über keinen internen AD-Wandler verfügen (z. B. ATmega162), kann durch externe Beschaltung (R/C-Netzwerk und Zeitmessung) die Funktion des AD-Wandlers simuliert werden.

Die Umsetzung zu einer analogen Spannung muss daher durch externe Komponenten vorgenommen werden. Das kann z. B. durch PWM und deren Filterung zu (fast) DC, oder einem sogenannten R2R-Netzwerk erfolgen.

Unabhängig davon besteht natürlich immer die Möglichkeit, spezielle Bausteine zur Analog-Digital- bzw. Digital-Analog-Wandlung zu nutzen und diese über eine digitale Schnittstelle (z.b. SPI oder I2C) mit einem AVR anzusteuern.



AC (Analog Comparator)

Der Comparator vergleicht 2 Spannungen an den Pins AIN0 und AIN1 und gibt einen Status aus welche der beiden Spannungen größer ist.

AIN0 dient dabei als Referenzspannung (Sollwert) und AIN1 als Vergleichsspannung (Istwert).

Als Referenzspannung kann auch alternativ eine interne Referenzspannung ausgewählt werden.

Liegt die Vergleichsspannung (IST) unter der der Referenzspannung (SOLL) gibt der Comparator eine logische 1 aus.

Ist die Vergleichsspannung hingegen größer als die Referenzspannung wird eine logische 0 ausgegeben.

Der Comparator arbeitet völlig autark bzw. parallel zum Prozessor.

Für mobile Anwendungen empfiehlt es sich ihn abzuschalten sofern er nicht benötigt wird, da er ansonsten Strom benötigt.

Der Comparator kann interruptgesteuert abgefragt werden oder im Pollingbetrieb.

Das Steuer- bzw. Statusregister ist wie folgt aufgebaut:

ACSR - Analog Comparator Status Register
Bit 7 6 5 4 3 2 1 0
Name ACD ACBG ACO ACI ACIE ACIC ACIS1 ACIS0
R/W R/W R/W R R/W R/W R/W R/W R/W
Initialwert 0 0 n/a 0 0 0 0 0
Bit 7 ACD
Analog Comparator Disable: 0 = Comparator ein, 1 = Comparator aus. Wird dieses Bit geändert kann ein Interrupt ausgelöst werden. Soll dies vermieden werden muss das Bit 3 ACIE ggf. abgeschaltet werden.
Bit 6 ACBG
Analog Comparator Bandgap Select: Ermöglicht das umschalten zwischen interner und externer Referenzspannung. 1 = interne (~1,3 Volt), 0 = externe Referenzspannung (an Pin AIN0)
Bit 5 ACO
Analog Comparator Output: Hier wird das Ergebnis des Vergleichs angezeigt. Es liegt typischerweise nach 1-2 Taktzyklen vor.
IST < SOLL → 1
IST > SOLL → 0
Bit 4 ACI
Analog Comparator Interrupt Flag: Dieses Bit wird von der Hardware gesetzt, wenn ein Interruptereignis, das in Bit 0 und 1 definiert ist, eintritt. Dieses Bit löst noch keinen Interrupt aus! Die Interruptroutine wird nur dann ausgeführt, wenn das Bit 3 ACIE gesetzt ist und global Interrupts erlaubt sind (I-Bit in SREG gesetzt). Das Bit 4 ACI wird wieder gelöscht, wenn die Interruptroutine ausgeführt wurde oder wenn es manuell auf 1! gesetzt wird. Das Bit kann für Abfragen genutzt werden, steuert oder konfiguriert aber nicht den Comparator.
Bit 3 ACIE
Analog Comparator Interrupt Enable: Ist das Bit auf 1 gesetzt, wird immer ein Interrupt ausgelöst, wenn das Ereignis das in Bit 1 und 0 definiert ist, eintritt.
Bit 2 ACIC
Analog Comparator Input Capture Enable: Wird das Bit gesetzt, wird der Comparatorausgang intern mit dem Counter 1 verbunden. Es könnten damit z.b. die Anzahl der Vergleiche im Counter1 gezählt werden. Um den Comparator an den Timer1 Input Capture Interrupt zu verbinden, muss im Timerregister das TICIE1 Bit auf 1 gesetzt werden. Der Trigger wird immer dann ausgelöst, wenn das in Bit 1 und 0 definierte Ereignis eintritt.
Bit 1,0 ACIS1,ACIS0
Analog Comparator Interrupt select: Hier wird definiert, welche Ereignisse einen Interrupt auslösen sollen:
  • 00 = Interrupt auslösen bei jedem Flankenwechsel
  • 10 = Interrupt auslösen bei fallender Flanke
  • 11 = Interrupt auslösen bei steigender Flanke

Werden diese Bit geändert, kann ein Interrupt ausgelöst werden. Soll dies vermieden werden, muss das Bit 3 gelöscht werden.

ADC (Analog Digital Converter)

Der Analog-Digital-Konverter (ADC) wandelt analoge Signale in digitale Werte um, welche vom Controller interpretiert werden können. Einige AVR-Typen haben bereits einen mehrkanaligen Analog-Digital-Konverter eingebaut. Die Feinheit, mit welcher ein analoges Signal aufgelöst werden kann, wird durch die Auflösung des ADC, d.h. durch die Anzahl der verwendeten Bits angegeben. So sind derzeit bspw. 8-Bit- oder 10-Bit-ADC im Einsatz. ADCs, die in AVRs enthalten sind, haben zur Zeit eine maximale Auflösung von 10-Bit.

Ein ADC mit 8 Bit Auflösung kann somit das analoge Signal in Abstufungen von 1/256 des Maximalwertes digitalisieren. Wenn wir nun mal annehmen, wir hätten eine Eingangspannung zwischen 0 und 5 Volt, eine Referenzspannung von 5 V und eine Auflösung von 3 Bit, dann könnten Intervalle mit den Grenzen 0 V, 0.625 V, 1.25 V, 1.875 V, 2.5 V, 3.125 V, 3.75 V, 4.375 V, 5 V entsprechend folgender Tabelle unterschieden werden:

Eingangsspannung am ADC / V Entsprechender Messwert
0 – 0.625 0
0.625 – 1.25 1
1.25 – 1.875 2
1.875 – 2.5 3
2.5 – 3.125 4
3.125 – 3.75 5
3.75 – 4.375 6
4.375 – 5 7

Die Angaben sind natürlich nur ungefähr. Je höher nun die Auflösung des Analog-Digital-Konverters ist, also, je mehr Bits er hat, desto genauer kann der jeweilige Wert erfasst werden.

Der interne ADC im AVR

Oft sind auch mehrere Kanäle verfügbar. Kanäle heißt in diesem Zusammenhang, dass zwar bis zu zehn analoge Eingänge am AVR vorhanden sind, aber nur ein "echter" Analog-Digital-Wandler zur Verfügung steht. Vor der eigentlichen Messung ist also festzulegen, welcher Kanal ("Pin") mit dem Wandler verbunden und gemessen wird.

Die Umwandlung innerhalb des AVR basiert auf der schrittweisen Näherung. Beim AVR müssen die Pins AGND und AVCC beschaltet werden. Für genaue Messungen sollte AVCC über ein L-C Netzwerk mit VCC verbunden werden, um Spannungsspitzen und -einbrüche vom Analog-Digital-Wandler fernzuhalten. Im Datenblatt findet sich dazu eine Schaltung, die 10µH und 100nF vorsieht.

Das Ergebnis der Analog-Digital-Wandlung wird auf eine Referenzspannung bezogen. Aktuelle AVRs bieten drei Möglichkeiten zur Wahl dieser Spannung:

  • Eine externe Referenzspannung von maximal Vcc am Anschlusspin AREF. Die minimale (externe) Referenzspannung darf jedoch nicht beliebig niedrig sein, vgl. dazu das (aktuellste) Datenblatt des verwendeten Controllers.
  • Verfügt der AVR über eine interne Referenzspannung, kann diese genutzt werden. Alle aktuellen AVRs mit internem AD-Wandler sollten damit ausgestattet sein (vgl. Datenblatt: 2,56V oder 1,1V je nach Typ). Das Datenblatt gibt auch über die Genauigkeit dieser Spannung Auskunft.
  • Es kann die Spannung AVcc als Referenzspannung herangezogen werden

Bei Nutzung von AVcc oder der internen Referenz wird empfohlen, einen Kondensator zwischen dem AREF-Pin und GND anzuordnen. Die Festlegung, welche Spannungsreferenz genutzt wird, erfolgt z. B. beim ATmega16 mit den Bits REFS1/REFS0 im ADMUX-Register. Die zu messende Spannung muss im Bereich zwischen AGND und AREF (egal ob intern oder extern) liegen.

Der ADC kann in zwei verschiedenen Betriebsarten verwendet werden:

Einfache Wandlung (Single Conversion) 
In dieser Betriebsart wird der Wandler bei Bedarf vom Programm angestoßen für jeweils eine Messung.
Frei laufend (Free Running) 
In dieser Betriebsart erfasst der Wandler permanent die anliegende Spannung und schreibt diese in das ADC Data Register.

Die Register des ADC

Der ADC verfügt über eigene Register. Im Folgenden die Registerbeschreibung eines ATMega16, welcher über 8 ADC-Kanäle verfügt. Die Register unterscheiden sich jedoch nicht erheblich von denen anderer AVRs (vgl. Datenblatt).

ADCSRA    ADC Control and Status Register A.

In diesem Register stellen wir ein, wie wir den ADC verwenden möchten.
Das Register ist wie folgt aufgebaut:

Bit 7 6 5 4 3 2 1 0
Name ADEN ADSC ADFR ADIF ADIE ADPS2 ADPS1 ADPS0
R/W R/W R/W R/W R/W R/W R/W R/W R/W
Initialwert 0 0 0 0 0 0 0 0

ADEN (ADC Enable)

Dieses Bit muss gesetzt werden, um den ADC überhaupt zu aktivieren. Wenn das Bit nicht gesetzt ist, können die Pins wie normale I/O-Pins verwendet werden.

ADSC (ADC Start Conversion)

Mit diesem Bit wird ein Messvorgang gestartet. In der frei laufenden Betriebsart muss das Bit gesetzt werden, um die kontinuierliche Messung zu aktivieren.
Wenn das Bit nach dem Setzen des ADEN-Bits zum ersten Mal gesetzt wird, führt der Controller zuerst eine zusätzliche Wandlung und erst dann die eigentliche Wandlung aus. Diese zusätzliche Wandlung wird zu Initialisierungszwecken durchgeführt.
Das Bit bleibt nun so lange auf 1, bis die Umwandlung abgeschlossen ist, im Initialisierungsfall entsprechend bis die zweite Umwandlung erfolgt ist und geht danach auf 0.

ADFR (ADC Free Run select)

Mit diesem Bit wird die Betriebsart eingestellt.
Ist das Bit auf 1 gesetzt arbeitet der ADC im "Free Running"-Modus. Dabei wird das Datenregister permanent aktualisiert. Ist das Bit hingegen auf 0 gesetzt, macht der ADC nur eine "Single Conversion".


ADIF (ADC Interrupt Flag)

Dieses Bit wird vom ADC gesetzt, sobald eine Umwandlung erfolgt ist und das ADC Data Register aktualisiert wurde. Das Bit wird bei lesendem Zugriff auf ADC(L,H) automatisch (d.h. durch die Hardware) gelöscht.
Wenn das ADIE Bit sowie das I-Bit im AVR Statusregister gesetzt ist, wird der ADC Interrupt ausgelöst und die Interrupt-Behandlungsroutine aufgerufen.
Das Bit wird automatisch gelöscht, wenn die Interrupt-Behandlungsroutine aufgerufen wird. Es kann jedoch auch gelöscht werden, indem eine logische 1! in das Register geschrieben wird.

ADIE (ADC Interrupt Enable)

Wenn dieses Bit gesetzt ist und ebenso das I-Bit im Statusregister SREG, dann wird der ADC-Interrupt aktiviert.

ADPS2...ADPS0 (ADC Prescaler Select Bits)

Diese Bits bestimmen den Teilungsfaktor zwischen der Taktfrequenz und dem Eingangstakt des ADC.
Der ADC benötigt einen eigenen Takt, welchen er sich selber aus der CPU-Taktfreqenz erzeugt. Der ADC-Takt sollte zwischen 50 und 200kHz liegen.
Der Vorteiler muss also so eingestellt werden, dass CPU-Taktfrequenz dividiert durch den Teilungsfaktor einen Wert im Bereich (50-200)kHz ergibt.
Bei einer CPU-Taktfrequenz von 4MHz beispielsweise rechnen wir
\begin{matrix}
TF_{min}=\frac{CLK}{200\,\mathrm{kHz}}=\frac{4000000}{200000}=\mathbf{20}
\\
\\
TF_{max}=\frac{CLK}{50\,\mathrm{kHz}}=\frac{4000000}{50000}=\mathbf{80}
\end{matrix}
Somit kann hier der Teilungsfaktor 32 oder 64 verwendet werden. Im Interesse der schnelleren Wandlungszeit werden wir hier den Faktor 32 einstellen.
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
ADCL

ADCH

ADC Data Register

Wenn eine Umwandlung abgeschlossen ist, befindet sich der gemessene Wert in diesen beiden Registern. Von ADCH werden nur die beiden niederwertigsten Bits verwendet. Es müssen immer beide Register ausgelesen werden, und zwar immer in der Reihenfolge: ADCL, ADCH. Der effektive Messwert ergibt sich dann zu:

x = ADCL;       // mit uint16_t x
x += (ADCH<<8); // in zwei Zeilen (LSB/MSB-Reihenfolge und
// C-Operatorpriorität sichergestellt)

oder

x = ADCW; // je nach AVR auch x = ADC (siehe avr/ioxxx.h)
ADMUX   ADC Multiplexer Select Register

Mit diesem Register wird der zu messende Kanal ausgewählt. Beim 90S8535 kann jeder Pin von Port A als ADC-Eingang verwendet werden (=8 Kanäle).
Das Register ist wie folgt aufgebaut:

Bit 7 6 5 4 3 2 1 0
Name REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0
R/W R/W R/W R/W R/W R/W R/W R/W R/W
Initialwert 0 0 0 0 0 0 0 0

REFS1...REFS0 (ReferenceSelection Bits)

Mit diesen Bits kann die Referenzspannung eingestellt werden. Bei der Umstellung sind Wartezeiten zu beachten, bis die ADC-Hardware einsatzfähig ist (Datenblatt und [1]):
REFS1 REFS0 Referenzspanung
0 0 Externes AREF
0 1 AVCC als Referenz
1 0 Reserviert
1 1 Interne 2,56 Volt


ADLAR (ADC Left Adjust Result)

Das ADLAR Bit verändert das Aussehen des Ergebnisses der AD-Wandlung. Bei einer logischen 1 wird das Ergebnis linksbündig ausgegeben, bei einer 0 rechtsbündig. Eine Änderung in diesem Bit beeinflusst das Ergebnis sofort, ganz egal ob bereits eine Wandlung läuft.


MUX4...MUX0

Mit diesen 5 Bits wird der zu messende Kanal bestimmt. Wenn man einen einfachen 1-kanaligen ADC verwendet wird einfach die entsprechende Pinnummer des Ports in die Bits 0...4 eingeschrieben (je nach Anzahl der Wandler des AVR, bei 8 AD-Kanälen halt nur 0...2).
Wenn das Register beschrieben wird, während eine Umwandlung läuft, so wird zuerst die aktuelle Umwandlung auf dem bisherigen Kanal beendet. Dies ist vor allem beim frei laufenden Betrieb zu berücksichtigen.
Eine Empfehlung ist deswegen diese, dass der frei laufende Betrieb nur bei einem einzelnen zu verwendenden Analogeingang verwendet werden sollte, wenn man sich Probleme bei der Umschalterei ersparen will.


















Zeile
Programm
Beschreibung
Allgemeine Prozessor Konfiguration
1
$regfile "m32def.dat" 
Definiert den Atmega als Atmega 32
2
$crystal = 1000000  
Gibt die Quarzfrequenz an in Herz
3
$hwstack = 32 
Default use 32 Hardware reservierte Speicher
4
$swstack = 10  
Default Software resvierung Speicher
Konfiguration der Ein - Ausgänge
5
Ddrb = &B00000111     
Port B.0 - B.1 und B.2 als Ausgang setzen für Leds
Timer Konfigurieren für den Sekundentakt
6
On Timer1 Timer_eins    
Legt den Namen der anzuspringende Unterroutine für Timer 1 fest hier "Timer_eins"
7
Tccr1a = &B00000000     
Konfiguration der Timers über Register
8
Tccr1b = &B00000101 Konfiguration der Timers über Register
9
Timsk = &B00000100 Konfiguration der Timers über Register
10
Sreg = &B10000000      
Interrups Global einschalten
11
Timer1 = 64558         
Voreinstellung

Setzen der Ein/ Ausgänge
12
Ddra = &B00000000     
Setzte alle Analoganschlüsse als Eingänge

Setzen der Register für Funktionen der Analogeingänge und des AD Wandlers
13
Admux = &B0010000 Bits 6 und 7  sind für Referenzspannung zuständig
00 bedeutet exteren Referenzspannung hier 5 Volt an AREF Pin32
01 bedeutet Anschluß AVCC dient als Referenz an Pin 30
10 ohne Funktion
11 interne Rerenz von 2,56 Volt aber Achtung , dann darf keine
Externe Referenz anliegen
Bit 5 gibt die Auflösung an also 8 oder 10 Bit
Bit 5 = 1 ist 8 Bit Auflösung
Bit 5 = 0 ist 10 Bit Auflösung
Bit 4 = ?????????????????
Bit 3 = wird nur Vergleichsoperationen benötigt,fällt hier außer acht
Bit 0-1-2 wählt den Analogeingang aus also ADC0 bis ADC7 mehr infos hier
14
Adcsr = &B11000011 Die Rechten fünf Bits für den gewählten eingang ADC0 bis ADC7

Bit 7 schaltet A/D Wandler ein - Standard ist 0 (aus)
Bit 6 startet die Konvertierung
Bit 5 freilauf für permanente Konvertierung
Bit 4
Bit 3 interrupt nutzen
Bit 2 - 1 - 0  legt die sample Rate fest . Sample Rate sollte zwischen  50 bis 200KH liegen (010 teilt Taktfrequnz durch 4)
(111 teilt durch 128) usw. weitere Infos hier
Variable festlegen
15
Dim Analogeingang1 As Word     
Messwert vom Analogeingang ADC0
16
Dim Analogeingang2 As Word     
Messwert vom Analogeingang ADC1
Konfiguration des Display's
17
Config Lcd = 16 * 4 Display Art festlegen mit 16 Zeichen und 4 Zeilen
18
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , Rs = Portc.5 , E = Portc.4 Display Anschlüsse festlegen



19
Timer_eins: Interrupt Routine, wird vom Timer1  aus jede Sekunde einmal angesprungen
20
Timer1 = 64558 Voreinstellung
21
Toggle Portb.0 Wechsel Ausgang Portb.0
22
Analogeingang1 = Getadc(0) Messwert am Analogeingang ADC0 abfragen
23
Analogeingang2 = Getadc(1) Messwert am Analogeingang ADC1 abfragen
24
Gosub Anzeige Springe zur Routine "Anzeige"
25
Return



26
Anzeige: Anfang der Routine "Anzeige"
27
Cls
28
Locate 1 , 1 Cursor im Display auf Zeile1 Spalte 1 setzen
29
Lcd " Analog1=" ; Analogeingang1 Textanzeige auf dem Display
30
Locate 2 , 1 Cursor im Display auf Zeile2 Spalte 1 setzen
31
Lcd " Analog2=" ; Analogeingang2
32
Return Springe zurück von wo ab diese Routine angesprungen wurde







Register TCCR1A Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0

COM1A1
COM1A0
COM1B1
COM1B0
FOC1A
FOC1B
WGM11
WGM10
Über BIT 6 + 7 wird der OC1A  Anschluß konfiguriert ob er mit dem Ausganspin verbunden wird oder nicht
(00= nicht verbunden) 01= OC1A verbunden.Beim Atmega8 ist Ausgang OC1A gleich Portb.1 und der muss als Ausgang deklariert werden, wenn diese Funktion genutzt wird.
0
0






Über Bit 4 + 5 wird der OC1B Anschluß konfiguriert ob er mit  dem Ausgangspin verbunden wird  wenn WGM13=0 ist(00=nicht verbunden) 01=verbunden


0
0




Der Ausgang OC1A ist beim hochzählen 0 bis Vergleichswert erreicht wird , dann wird Ausgang auf 1 gesetzt. 1
0






Resetiert OC1B wenn Vergleichswert erreicht wird

1
0




Der Ausgang OC1A ist beim hochzählen 1 bis Vergleichswert erreicht wird , dann wird Ausgang auf 0 gesetzt. 1
1









1
1




Timer 1 wird bei einem Gleichstand des Zählers mit dem Vergleichsregister ( Compare1A) den Status des Ausgang OC1A ändern. Wobei Compare 1 A nur ein 16 Bit Pseudoregister für zwei tatsächliche 8 Bit Register ( OCR1AH + OCR1AL) ist. 0
1






Bei Gleichstand des Zählers und des Vergleichsregister Status am Ausgangpin  OC1B ändern

0
1




COM1A1
(Compare Match Output Mode) diese Register steuern den Output Compare Funktionen damit wird entschieden ob der OCR Ausgang aktiviert ist oder nicht








Force Output Compare (FOC) Modus
Der Force Output Compare Modus ist in alle Timer/Counter integriert.
Der FOC Modus kann nur bei nicht-PWM Modi genutzt werden. Beim Schreiben einer
logischen 1 auf FOCx wird ein sofortiger Compare Match des Funktionsgenerators
erzwungen. Der OCx Ausgang wird auf den Status des COMx1 Bits gesetzt. Deshalb
bestimmt der Wert aus COMx1 den Wert des OCx Pins beim Vergleich.








TCNTx - Timer/Counter RegisterIn diesem Register wird der aktuelle Zählwert gespeichert. 







OCRx[A | B][H | L] - Output Compare Register (A oder B und H oder L nur
Timer1)Wenn TCNTx den Wert dieses Registers erreicht, wird ein Output Compare
Interrupt Request ausgel¨ ost.








FOCx (Force Output Compare) Beim Schreiben einer logischen 1 auf FOCx wird ein sofortiger compare match des Funktionsgenerators erzwungen.







Der Zählwert des Timers also die gezählten Takte werden im Zähl-Register TCNT0 abgelegt mit jedem Takt wird der Wert im Register CNT0 um eins erhöht.
Es gibt zwei Möglichkeiten den Timern zu sagen was sie machen sollen, zum einen funktioniert das mit Bascom Befehle, und zum anderen gibt es die Möglichkeit Registereinstellungen direkt zu ändern.








TIMSK - Timer/Counter Interrupt Mask RegisterZur Auswahl, welche Interrupts aktiviert werden sollen.








ICR1[H | L] - Input Capture Register 1 Hi oder Low (nur Timer1)Wird bei jedem Input Capture Event mit TCNT abgeglichen. Kann zur
Festlegung des Maximalwertes genutzt werden.








TIFR - Timer/Counter Interrupt Flag RegisterHier werden bestimmte Bits gesetzt, wenn ein Interrupt ausgeführt werden soll.








ASSR - Asynchronous Status Register (nur Timer2)Register zur Steuerung des asynchronen Modus








SFIOR - Special Function IO RegisterPSR2 Bit setzt den Prescaler des Timer2 zurück














Register TCCR1B Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0

ICNC1
ICES1

WGM13
WGM12
CS12
CS11
CS10
Bei 1 wird steigende Flanke registriert bei 0 die fallende
1






CSxx (Clock Select) konfiguriert den Prescaler
CS10,CS11,Cs12.
Mit den Bits 0-1-2 (CS10,CS11,CS12) wird  der Prescaler ( Vorteiler ) eingestellt also in wie weit der Tackt des Atmegas herunter geteilt soll , oder aber wenn der Takt von Außerhalb angelegt wird , an welcher Flanke der Takt registriert werden soll bei abfallender oder Steigender Flanke.(000 =Timer / Counter hält an)





0
0
0
Voller Takt wird genutzt




0
0
1
Takt durch 8




0
1
0
Takt durch 64




0
1
1
Takt durch 256




1
0
0
Takt durch 1024




1
0
1
Externer Takt an Pin T1 bei fallender Flanke




1
1
0
Externer Takt an Pin T1 bei steigender Flanke




1
1
1
Register (ICES1) wird festgelegt ob bei aufsteigender Flanke ( ICES1=1) oder fallender Flanke (ICES1=0 )der Eingangspin ausgewertet werden soll.
ICES1
 (Input Capture Edge Select) Bestimmt, welche Flanke ein Capture Ereignis auslöst. Bei 0 löst eine fallende Flanke ein Capture Ereignis aus, bei 1 eine steigende Flanke 1 = Triggert bei steigender Flanke 0 Triggert bei fallender Flanke1

1






ICNC1 (Input Capture Noice Canceler) Ist die Störunterdrückung (ICNC1=1) eingeschaltet, wird der Eingangspin viermal hintereinander abgetastet und muss auch 4 mal den gleichen Wert aufweisen also 4 mal 0 oder 4 mal 1 je nach welche Flanke er erkannt werden soll damit der Eingangsimpuls als solcher gewertet wird.
Bei ausgeschalteter Störunterdrückung (ICNC1=0) wird jede Flanke als Eingangsimpuls erkannt, so kann es beispielsweise bei nicht entprellten Signale zu Störungen durch mehrfach Erkennung kommen.
Störunterdrückung eingeschaltet 0 ist ausgeschaltet
1







nach oben













ADMUX - Register
Bit Nr.
7
6
5
4
3
2
1
0
Funktion

0
0






Es wird als Referenzspannung die am Anschluß AREF (Pin 32 beim Atmega32) benutzt,, diese Referenzspannung kann zwischen Null und Fünf Volt betragen.

0
1






Referenzspannung wird an Anschluß AVCC angelegt, ist gleich die Versorgungsspannung für den A/D Wandler also meist die Betriebsspannung.

1
0






ohne Funktion

1
1






Es wird eine interne referenzspannung benutzt die auf 2,56 Volt festgelegt ist.



0





sorgt für eine 10 Bit auflösung also 0 bis 1023



1





sorgt für eine 8 Bit Auflösung also 0 bis 255




?









?










X



wird nur für Vergleichsoperationen verwendet , also wenn der Analogeingang als Comperator verwendung findet






0
0
0
Damit wird der Analogeingang ausgewählt der ausgewählt wird,  weil mder Eingang über einen Multilexer mit dem Atmega verbundet wird, kann immer nur ein Eingang Aktiv sein. 000 ist ADC0






0
0
1
ADC1






0
1
0
ADC2






0
1
1
ADC3






1
0
0
ADC4






1
0
1
ADC5






1
1
0
ADC6






1
1
1
ADC7







ADCSR - Register Atmega 32
Bit Nr.
7
6
5
4
3
2
1
0
Funktion

1







Damit wird der A/D Wandler eingeschaltet. Eine Null (Standard) schaltet ihn aus


1






Startet die Konvertierung , also die Verarbeitung der Anliegenden Spannung zu einem Digitalwert



1





Freilauf-Modus für eine kontinuirliche Konvertierung, sonst nur eine Einmalige Konvertierung




?










1



Benutzt den Interrupt , wird also folgende Anweisung benutzt:on adc adc_interrupt wird zur Unterroutine " ADC_interrupt" gesprungen und diese abgerbeitet.






0
0
0
Hier wird die Sampler Rate eingestellt , also mit welcher Frequenz die Analogeingänge abgefragt werden, sollte zwischen 50Khz und 200 Khz betragen und wird bestimmt durch die Taktfrequenz des Atmega 32 ( hier 1Mhz), die dann durch einen Teiler dividiert wird der durch die Bits 0 bis 3 eingestellt werden kann 001 bedeutet teiler Faktor 2






0
0
1
Teiler Faktor 2






0
1
0
Teiler Faktor 4






0
1
1
 Teiler Faktor 8






1
0
0
Teiler faktor 16






1
0
1
32






1
1
0
64






1
1
1
128







ADCSRA - Atmega 8
Bit
7
6
5
4
3
2
1
0


ADENADSCADFRADIFADIEADPS2ADPS1ADPS0
Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W







0
0
0
Teilfaktor für Analogabtastung =2 ( Systemntakt durch 2)






0
0
1
Teilfaktor für Analogabtastung =2






0
1
0
Teilfaktor für Analogabtastung =4






0
1
1
Teilfaktor für Analogabtastung =8






1
0
0
Teilfaktor für Analogabtastung =16






101Teilfaktor für Analogabtastung =32






110Teilfaktor für Analogabtastung =54






111Teilfaktor für Analogabtastung =128

1






Analog-Digital Converter aktivieren mit 1


1





Eine 1 startet  die  Wandlung  danach wird ADCS wieder auf Null gesetzt



1




Eine 1  betreibt eine Free Running Modus , eine Messung nach der anderen.




1



Nach jeder Messung wird das Bit gesetzt





1


Nach jeder Messung wird ein Interrupt ausgelöst



SREG
Bit
7
6
5
4
3
2
1
0


I
T
H
S
V
N
Z
C

Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W


1







Globalen Interrupt Freigeben (SREG.7=1)







TIMSK
Bit
7
6
5
4
3
2
1
0


OCIE2
TOIE2
TICIE1
OCIE1A
OCIE1B
TOIE1
-------
TOIE0

Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R
R/W




1





Timer Counter1 , Input Capture Interrupt Enable
Wenn dieses Bit eine 1 hat und der Interrupt Flag im Status Register gesetzt ist ( Globale Interrupt freigegeben) dann ist der Interrupt für Timer 1 Vergelichsregister freigegeben




1




Timer/Counter1,Output Compare A Match  Interrupt Enable





1



Timer/Counter1,Output Compare B Match  Interrupt Enable






1


Timer/Counter1,Overfow Interrupt Enable








1
Timer0 Overflow-Interrupt ein Beispiel (TIMSK.TOIE0=1)





Atmega 32 AVCC angeschlossen nicht aber Aref, admux auf interne referenz von 2,56V. Werden aber immer 1023bit angezeigt auch bei null volt eingang??












aktualisiert 30.09.2013