Forum: Mikrocontroller und Digitale Elektronik AD Wandler beim AVR


von Berndi (Gast)


Lesenswert?

Hi,
möchte gerne ein analoges Signal mit einem AVR digitalisieren. Nur weiß 
ich leider nicht wie ich das genau machen muß? Soweit ich das verstanden 
habe, schließe ich das Signal an den Port PA0 (ADC0) meines ATmega8535, 
AVCC auf VCC und AREF auf eine Referenzspannung. Wie hoch sollte diese 
den sein? Sollte doch so groß sein, wie die größte zu messende Spannung 
oder größer.
Wie kann ich jetzt in Asembler meine digitalisierten Werte verwenden? 
Wie heißen die Register wo der Wert gespeichert ist. Mit welchen 
Registern steuer ich den AD Wandler? Z.B. wie stelle ich den ein das er 
die interne AREF oder eine externe verwendet? Kennt jemand vielleicht 
ein paar Codebeispiele? Am liebsten wäre mir in Asembler. Habe schon im 
Datenblatt nachgelesen aber werde da irgendie nicht schlau draus. Vielen 
Dank
Gruß Bernd

von Sebastian Eckert (Gast)


Lesenswert?

Einen Codeschnipsel habe ich gerade nicht zur Hand, aber der A/D-Wandler 
muß über das entsprechende Konfigurationsregister zunächst eingeschaltet 
werden, und dann kann man eine einzelne oder kontinuierliche Umsetzung 
starten. Die Ergebnnisse werden aus zwei zusammengehörigen 8-bit 
Registern (Low und High-Byte) ausgelesen. Es gibt natürlich auch ein 
Statusbit, bzw. einen Interrupt, wenn der A/D-Wandler mit einer 
Umsetzung fertig ist.

Signal an PA0 ist richtig. VCC an AVCC ist richtig, wenn die 
Digtal-Versorgung sauber ist. Ansonsten LC-Filter dazwischen. ARef kann 
5V (Betriebsspannung), 2.55V (interne Referenz, dann Pin unbeschaltet 
lassen, muß in entsprechendem Register konfiguriert werden) oder eine 
externe Spannung nach Wahl sein, die dem obersten möglichen Meßwert des 
ADC entspricht.

Ich könnte vielleicht noch ein Codebeispiel in C auftreiben... falls ich 
es noch finde. Ist aber für einen mega32. Der mega8535 sollte aber 
ähnlich sein.

von Berndi (Gast)


Lesenswert?

Vielen Dank erstmal.

Habe mittlerweile folgende Register aus dem Datenblatt lesen können:

ADSCRA was aus folgenden Bits besteht:
7    6    5     4    3    2     1     0
ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0

ADEN 1 -> AD Wandler ist an 0 -> AD Wandler ist aus
ADSC 1 -> Startet die AD Wandlung und setzt danach auf 0
ADATE ???
ADIF 1 -> AD Wandlung ist fertig
ADIE 1 -> ADC Interrupt ist aktiv
ADPS2-0 - Teilungsfatkor einstellen für ???

SFIOR besteht aus:
8     7     6     5 4    3   2    1
ADTS2 ADTS1 ADTS0 - ACME PUD PSR2 PSR10

ADTS0-2 - Einstellen von Free Runing mode, ???, ???, ...
ACME ???
PUD ???
PSR2 ???
PSR10 ???


ADCL und ADCH speichert den Digitalen Wert des Signals

von Karl H. (kbuchegg)


Lesenswert?

Schau mal hier

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#ADC_.28Analog_Digital_Converter.29

ist zwar für C, du solltest allerdings mit deinen Assembler-
kenntnissen keine allzugroßen Schwierigkeiten haben, das
nachzuvollziehen und zu verstehen was da abgeht.

von Bernd W. (berndi)


Lesenswert?

Vielen Dank für eure nette und vor allem schnelle Hilfe. Werde ich mir 
mal durchlesen.

von Bernd W. (berndi)


Lesenswert?

Hi,

so jetzt hab ich noch ein Problem. Habe jetzt den Wert im Register 
stehen. Nur wie kann ich mit diesem Rechnen. Der Wert im Register soll 
eine Dezimalzahl darstellen die dann mit einer Konstanten (mit 4 
Nachkommastellen) multipliziert wird und dann noch eine 2 Konstante 
abgezogen wird. Anschließend  möchte ich den so erhaltenen Wert so 
umwandeln das ich ihn über ein lcd ausgeben kann. Also in Ascii 
codierung. Wie mach ich das? Hat da vielleicht schon jemand bischen Code 
wo man sich das anschauen kann. Bitte in Assembler.

Gruß Bernd

von Stephan (Gast)


Lesenswert?

zuerst befindet sich in den Regitsern nur der Zählerwert den der A/D 
brauchte um die angelegt Spannung mit der Referenzspannung zu 
vergleichen.
Also nimm den Wert un errechne daraus die Spannung.
Zählerwert * ( Ref. Spannung / Auflösung )
Dann kannst du Deine Konstanten ins Spiel bringen.
Ich würde ganzzahlig arbeiten weil einfacher und schneller.
Dann muß alles in ASCI gewandelt werden. Und schon ist es geschafft.

Beispiele dafür gibts hier wohl reichlich. ( Suchfunktion )

von johnny.m (Gast)


Lesenswert?

> ARef kann 5V (Betriebsspannung)...

Bitte nicht! Das ist ein Fehler, der bei vielen Leuten, die noch mit den 
alten AVRs (AT90S-Serie) gearbeitet haben, immer noch in den Köpfen 
feststeckt. Die aktuellen AVRs (Mega, Tiny usw.) besitzen allesamt 
intern die Möglichkeit, die Betriebsspannung AVCC als Referenz 
einzustellen. An den AREF-Pin gehört in den meisten Fällen lediglich ein 
kleiner Kondensator (s. Datenblatt) und sonst nix. Einzige Ausnahme: 
Wenn eine Referenzspannung verwendet werden soll, die nicht intern vom 
µC zur Verfügung gestellt werden kann, dann ist diese an AREF 
anzuschließen.

von Jörn P. (jonnyp)


Lesenswert?

@johnny.m
Jein! Ich weiss zwar was du meinst, aber AREF kann 5 Volt 
(spitzfindigkeit). Du meinst, das bei den aktuellen AVR´s AVCC oder die 
internen 2,56 Volt an den A/D-Wandler gelegt werden können, die damit 
auch an AREF liegen. In diesem Fall liegt am AREF-Pin halt nur ein 
Kondensator.Aber, wenn man die internen Referenzen abschaltet, kann man 
auch eine externe (präzisions-) Referenz von 5 Volt anlegen.Ich find es 
aber sehr gut, dass du darauf aufmerksam gemacht hast. Die Leute sollten 
erst mal ins Datenblatt sehen.

von johnny.m (Gast)


Lesenswert?

@Jörn:
Es geht mir um die Aussage 5V *(Betriebsspannung)*! Und die (AVCC) kann 
intern als Referenz ausgewählt werden und sollte deshalb nicht extern an 
AREF angelegt werden. Eine 5V-Präzisionsreferenz ist etwas völlig 
anderes, da diese nunmal nicht der Versorgungsspannung entspricht. 
Deshalb kein "Jein", sondern ein klares "Nein"! Die Präzisionsreferenz 
fällt unter "Ausnahmen" (siehe letzten Satz in meinem ersten Posting).

Eine Sache habe ich allerdings vergessen, zu erwähnen: Wenn man die 
interne Referenzspannung auch extern benötigt, dann kann man sie am 
AREF-Pin abgreifen.

Gruß

Johnny

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Wenn man die
>interne Referenzspannung auch extern benötigt, dann kann man sie am
>AREF-Pin abgreifen.

Die sollte man aber hochohmig auskoppeln...(OP dahinter hängen)

von johnny.m (Gast)


Lesenswert?

@Rahul:
Auch das ist natürlich völlig korrekt (wie immer ;-)

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>(wie immer ;-)

Naja, das bezweifle ich... ;-)

von Jörn P. (jonnyp)


Lesenswert?

@  johnny.m
Ouups, scheint ich bin über die Betriebsspannung gestolpert, aaber... 
;-)

von Bernd W. (berndi)


Lesenswert?

Vielen Dank nochmal für eure Antworten. Habe es jetzt mittlerweile so 
hinbekommen wie gewollt. Habs nur in C umgesetzt. Naja werde bei 
Gelegenheit mal mein Digitalskript suchen und vielleicht nochmal alles 
in asm schreiben.

Gruß Bernd

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

>vielleicht nochmal alles in asm schreiben.
Und was soll das bringen? Wesentlich schneller wird das auch nur, wenn 
man wirklich jedes Bit zwei mal umdreht...

von Berndi (Gast)


Lesenswert?

Schon klar, nur halt fürs Verständnis. Und um asm zu lernen :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.