Forum: Mikrocontroller und Digitale Elektronik ADC Pinwechsel


von easy (Gast)


Angehängte Dateien:

Lesenswert?

Hallo! Ich arbeite mit einem Atmega 32, 16 MHz. Ich möchte an zwei Pins
des ADC nacheinander Spannungen einlesen. Die Referenzspannung ist
extern an AREF 5V. Wenn im Programm nur ein Pin benutz wird
funktioniert die Wandlung einwandfrei. Wenn ich jedoch gleich nach der
Wandlung am ersten Pin und zueisung des Ergebnisses an die
entsprechende Variable auf den nächsten Pin wechsele und Wert einer
anderen Variable übergebe enthalten beide Variablen den Wert der
zweiten Wandlung. Der Quelltext befindet sich im Eingang. Muss ich
vielleicht eine Funktion einbauen, die wartet bis ADC das erste mal
ausgelesen wurde und dann erst mit der zweiten Wandlung beginnen?

Danke!

von easy (Gast)


Lesenswert?

Der Quelltext befindet sich natürlich im Anhang - nicht im eingang :-)

von Peter Dannegger (Gast)


Lesenswert?

Direkt nach dem Start, steht natürlich noch das Ergebnis der vorherigen
Wandlung im Puffer.

Du must schon testen, ob die Wandlung beendet ist oder ein
entsprechendes delay einfügen.


Peter

von easy (Gast)


Lesenswert?

Wie kann ich das testen? Ich nehme an mit der Überprüfung von ADIF?
Hab ich eben versucht:

while(ADIF!=1){}

Hier bleibt das Programm aber scheinbar in einer Dauerschleife hängen.
Laut Datenblatt müsste ADIF aber gesetzt sein sobald die Wandlung
beendet ist.

von Schmidle (Gast)


Lesenswert?

Hi easy,

ADIF ist in einer deiner include-Files mit Sicherheit als 4 definiert,
weil es das vierte Bit im Register ADCSRA ist. Es kann also nie zu 1
werden und deine Abfrageschleife wird demzufolge niemals verlassen
werden.
Prüfe einfach, ob das vierte Bit (ADIF) im Register ADCSRA gesetzt
ist.

while(!(ADCSRA & ADIF));

Gruß
Schmidle

von crazy horse (Gast)


Lesenswert?

ADMUX=....//Kanal,VrefType
ADCSRA.6=1;
while (ADCSRA.6);
ADCSRA|=0x10;
return ADCW;

x.x wird bei deinem Compiler wahrscheinlich nicht unterstützt, musst
also die sonst übliche Schreibweise nehmen.

von easy (Gast)


Lesenswert?

@Schmidle:
Danke hat geklappt die Dauerschleife bin ich jetzt los!

@crazy horse:
Was ist genau gemeint mit <<while (ADCSRA.6);>>
Soll das überprüfen ob ADSC (Start Conversion) gesetzt ist? Wenn ich
dies versuche <<while(ADCSRA & ADSC)>> lande ich wieder in einer
dauerschleife

von easy (Gast)


Lesenswert?

Hallo! Ich habe immer noch das Problem , dass sich der Wert einer
wandlung auch in die Variablen reinschreibt in der eigentlich die Werte
der anderen Wandlung annehmen sollte. Das warten auf beendigung der
jeweiligen Wandlung hab ich durch die Zeile
<<while(!(ADCSRA&(1<<ADIF)))>> meiner Meinung nach sicher gestellt.
Kann mir jemand helfen?
Danke easy

von easy (Gast)


Lesenswert?

Hallo! Hab soeben festgestellt dass es so gar egal ist in welcher
Reihenfolge im Programm ich die Wandlungen an den Pins durchführe.
Immer der Pin mit der höchsten Ziffer ist bestimmend. Also Wenn ich zum
Beispiel am Pin 0 und an Pin 4 arbeite, wird immer der Wert von Pin 4
für beide übernommen. Kann damit jemand was anfangen?
Danke!

von Lutz Müller (Gast)


Lesenswert?

Hallo,
hast Du nach der ersten Wandlung und dem Auslesen des Ergebnisses auch
ADCSRA = (1<<ADIF); geschrieben, um das ADIF zu löschen? Wenn Du es
nämlich nach der ersten Wandlung nicht per Hand löschst (wenn Du es
über ISR machst, tut die es für Dich), dann bleibt ADIF = 1 und es
ändert nichts an Deiner Abfrage, d.h. ADIF steht noch von der
vorherigen Wandlung auf "1" und die Bedingung ist irrtümlich
erfüllt.
Gruß
Lutz

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.