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!
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
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.
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
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.
@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
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
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.