ADC ATmega8 weitere probleme.

OP #1099034
Hallo
und das endlose lästige problem mit der AD wandlung geht weiter …

Ich habe mich momentan damit abgefunden, dass ich die Interne Referenz 
nicht abgeschaltet bekomme.
Dennoch passieren sehr merkwürdige dinge.

Die Referenz ist ja 2,56V daher dachte ich, dass ich bei 2,56V den 
gewandelten wert von 1024 erhalte, tatsächlich bekomme ich ihn bei 5V.

Das nächste Problem ist das wandeln der werte an sich, wenn ich nur 1x 
wandel passiert gar nix.
Wenn ich in einer schleife wandel und ca. 20x dann hab danach den 
richtigen wert.

Bei mir liegt am entwicklerboard an Vcc, Avcc und Aref 5V an.
Auf meinem Steckboard hab ich Aref offengelassen. (es natürlich aber 
auch anders probiert)

Ich gebe mal ein Beispiel:

//kein brauchbarer Wert:
begin
a := Read_Adc(5);  //reads from pinc5
end;

//richtiger Wert:
lauf := 0;
begin
repeat
a := Read_Adc(5);  //reads from pinc5
lauf := lauf+1;
until lauf = 20;
end.


Die Funktion kann wie folgt manuel editiert werden.
Übernehme ich sie so 1:1 erhalte ich aber nur wert von 255 bei 5V. Warum 
weis ich nicht.
Ein ändern der werte von ADMUX und ADCSRA liefern gar keine brauchbaren 
ergebnisse mehr.

function Read_ADC(n:byte):integer;
begin
    ADMUX := n;
    ADMUX := ADMUX or $60;   //binär 1100000
    ADCSRA := ADCSRA or $C7; //binär 11000111
 
    while ADCSRA.6 <> 0 do
          begin
          end;
 
    result :=  ADCH;
end;
Jan F. wrote:
> Hallo
> und das endlose lästige problem mit der AD wandlung geht weiter …
Und wo hat es angefangen? Vielleicht mal einen Link auf den (vermutlich 
vorhandenen) alten Thread?

> Ich habe mich momentan damit abgefunden, dass ich die Interne Referenz
> nicht abgeschaltet bekomme.
Womit versuchst Du denn, die abzuschalten?

> Die Referenz ist ja 2,56V daher dachte ich, dass ich bei 2,56V den
> gewandelten wert von 1024 erhalte, tatsächlich bekomme ich ihn bei 5V.
1024 kannst Du überhaupt nicht bekommen, höchstens 1023!
Jan F. wrote:
> Ich gebe mal ein Beispiel:
>
> //kein brauchbarer Wert:
> begin
> a := Read_Adc(5);  //reads from pinc5
> end;
Soll das BASCOM sein? Sieht mir jetzt allerdings eher nach PASCAL aus, 
ist allerdings bei mir auch schon was länger her.  Wie wäre es denn, mal 
zu erzählen, womit Du überhaupt arbeitest?
> function Read_ADC(n:byte):integer;
> begin
>     ADMUX := n;
>     ADMUX := ADMUX or $60;   //binär 1100000
>     ADCSRA := ADCSRA or $C7; //binär 11000111
Schon mal ins Datenblatt geschaut und versucht, nachzuvollziehen, was da 
überhaupt konfiguriert wird?

>     result :=  ADCH;
ADCH hat 8 Bit. Da gehen nur Werte von 0 bis 255 rein. Also nochmal 
Datenblatt hernehmen, ADLAR löschen (weil es vermutlich gesetzt ist, 
sonst bekämst Du keine Werte bis 255) und beide Datenregister 
auslesen!

> end;
Genau!
OP
> Soll das BASCOM sein? Sieht mir jetzt allerdings eher nach PASCAL aus,
> ist allerdings bei mir auch schon was länger her.  Wie wäre es denn, mal
> zu erzählen, womit Du überhaupt arbeitest?
du meinst das board oder?
Ich benutze das EasyAVR5A von Mikroelektronika und den mikro Pascal 
compiler.

> Schon mal ins Datenblatt geschaut und versucht, nachzuvollziehen, was da
> überhaupt konfiguriert wird?
Doch nur was du gerade ansprichst mit den 8 und 10bits ist mir nicht 
ganz klar gewesen.

Die funktion ist von einem user geschrieben und nicht im handbuch 
referiert.
Wenn ich die standardfunktion verwende
Adc_Read(5) bekomme ich auch 1023.

> ADCH hat 8 Bit. Da gehen nur Werte von 0 bis 255 rein. Also nochmal
> Datenblatt hernehmen, ADLAR löschen (weil es vermutlich gesetzt ist,
> sonst bekämst Du keine Werte bis 255) und beide Datenregister
> auslesen!

ah, ich muss also ADCL auch noch auslesen?
ich dachte ADLAR ist nur für die ausrichtung wichtig nicht ob 8 oder 
10bit.
Hallo,

bei REFS0 u8nd REFS1 auf 0 ist die externe Referenzspannung aktiv.

Bei Deinem Entwicklerboard wären das also die extern anliegenden +5V.
Die Verbindung AREF - +5V würde ich da ohnehin auftrennen und nur einen 
100n gegen GND an AREF anschließen.

5V als Referenz lassen sich mit REFS1 = 0 und REFS0 = 1 einstellen.
Der Versuch, auf Deinem Board mit fest angeschlossenener AREF an +5V auf 
interne Referenz zu stellen, kann nicht klappen. Die eingestellte 
Referenzspannung liegt immer an AREF an, bei Einstellung auf AREF=2,56V 
und direkter Verbindung außen zu +5V gibt es eben einen Kurzschluß 
dazwischen, wo irgendwann einer nachgibt...

Ansonsten bei Selbstbauten AREF über 100n an GND und die gewünschte 
Referenzspannung mit den REFS-Bits einstellen, entweder auf 2,56V oder 
auf AVCC.

Steht auch alles nochmal im Datenblatt, Tabelle 74 bei mir.

Gruß aus Berlin
Michael

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.