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
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.
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
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.
Vielen Dank für eure nette und vor allem schnelle Hilfe. Werde ich mir mal durchlesen.
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
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 )
> 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.
@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.
@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
>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)
@ johnny.m Ouups, scheint ich bin über die Betriebsspannung gestolpert, aaber... ;-)
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
>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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.