www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC Pinwechsel


Autor: easy (Gast)
Datum:
Angehängte Dateien:

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

Autor: easy (Gast)
Datum:

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

Autor: Peter Dannegger (Gast)
Datum:

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

Autor: easy (Gast)
Datum:

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

Autor: Schmidle (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: easy (Gast)
Datum:

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

Autor: easy (Gast)
Datum:

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

Autor: easy (Gast)
Datum:

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

Autor: Lutz Müller (Gast)
Datum:

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

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.