www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AD Wandler beim AVR


Autor: Berndi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian Eckert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Berndi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal hier

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

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.

Autor: Bernd Wunder (berndi)
Datum:

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

Autor: Bernd Wunder (berndi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 )

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörn Paschedag (jonnyp)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: johnny.m (Gast)
Datum:

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

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>(wie immer ;-)

Naja, das bezweifle ich... ;-)

Autor: Jörn Paschedag (jonnyp)
Datum:

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

Autor: Bernd Wunder (berndi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: unsichtbarer WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Berndi (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.