Forum: Mikrocontroller und Digitale Elektronik ADC ATmega8 weitere probleme.


von Jan F. (nistral)


Lesenswert?

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;

von Johannes M. (johnny-m)


Lesenswert?

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!

von Jan F. (nistral)


Lesenswert?

Beitrag "Aref Extern Aktivieren Atmega8"
ich habe meine schaltung jetzt so gebaut, das ich mit opamps die 
spannung anhebe, deswegen ist das nichtmehr notwendig.

Ich habe versuche die referenz durch die bits REF1 und REFS0 im ADMUX 
register durch setzen auf 0 zu deaktivieren.

sry mein fehler natürlich bekomme ich max 1023.

von Johannes M. (johnny-m)


Lesenswert?

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!

von Jan F. (nistral)


Lesenswert?

> 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.

von Michael U. (amiga)


Lesenswert?

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

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.