Forum: Compiler & IDEs Uart Problem beim auslesen


von Daniel Maisner (Gast)


Angehängte Dateien:

Lesenswert?

Hi,
ich habe ein kleines Programm, das mir den Wert aus der ADC-Wandlung
ans Uart übergeben soll. Aber irgendwie funktioniert die Wandlung so
nicht richtig, da ich immer "255" ans Terminal gesendet bekomme, aber
nur, wenn ich
loop_until_bit_is_clear(ADCSR,ADSC);
statt
loop_until_bit_is_set(ADCSR,ADIF);
schreibe.

Wäre es möglich (sofern der Code doch richtig ist) dass der ADC hinüber
ist? Ich wollte einfach nur von 0-Vcc mit einem Poti einstellen und am
ADC Pin abgreifen. GND und ADC-Vcc sind mit 100nF verbunden und sonst
(UART, Takt..) stimmt eigentlich auch alles.
Auf die kleine Induktivität, wie im Datenblatt, habe ich verzichtet -
kann es daran liegen?

Danke
Daniel

von Daniel Maisner (Gast)


Lesenswert?

vergessen:

mit
loop_until_bit_is_set(ADCSR,ADIF);
funktioniert gar nichts, scheinbar wird die Wandlung nie fertig und das
bit nicht gesetzt!?

von Alexander (Gast)


Lesenswert?

Habe mir dein gelinktes Programm nicht weiter angeschaut, jedoch
folgende Kommentare:

ADIF zu prüfen macht in meinen Augen keinen Sinn. Wenn du ADIE gesetzt
hast, übernimmt deine ISR die Behandlung von ADIF. Ansonsten reicht es,
ADSC zu prüfen.
BTW: inp und outp sind veraltet, konsultiere dazu die WinAVR-Doku.
Im Zweifel würde ich sagen, dass dein Fehler in der Beschaltung des AVR
liegt (AVCC, AGND, AREF).

Alex

von OldBug (Gast)


Lesenswert?

while (ADCSRA & (0<<ADSC));

 (0 << ADSC) wird nicht das sein, was Du machen möchtest,
 ~(1 << ADSC) dürfte da richtig sein...

Hab aber auch nur überflogen...

von Alexander (Gast)


Lesenswert?

@ OldBug

Man setzt doch ADSC, um eine Konvertierung zu starten. ADSC wird mit
dem Abschluss der Konvertierung gelöscht.
Also muss geprüft werden.

while (ADCSRA & _BV(ADSC));

Alex

von Jörg Wunsch (Gast)


Lesenswert?

Exakt dasselbe, was Patrick auch geschrieben hat. ;-)

von OldBug (Gast)


Lesenswert?

Hm, nicht ganz, ich hatte aus (0 << ADSC) geschlossen, daß er ein Bit
auf "0" Prüfen möchte. Ich habe - wie gesagt - nur überflogen. Das
Bitwise-Not muss dann wohl weg...

Also:

while(ADCSRA & _BV(ADSC));

oder

while(ADCSRA & (1 << ADSC));

Ist beides korrekt, aber mein Vorschlag

while(ADCSRA & ~(1 << ADSC));

würde genau das Gegenteil liefern...

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.