Forum: Mikrocontroller und Digitale Elektronik ADC - AT90S8535


von David B. (Gast)


Angehängte Dateien:

Lesenswert?

Der AD-Wandler am At90S8535 funktioniert nicht.
Laut Datenblatt müsste die C-Funktion siehe Dateianhang funktionieren.
Ich kann da keinen Fehler finden?

Für jede Unterstützung bin ich sehr danbar!

von johnny.m (Gast)


Lesenswert?

Was funktioniert denn nicht?
Diese Zeile
> result += (ADCL + (ADCH<<8));       // mit uint16_t x
ist schon mal sehr fehlerverdächtig. Praktisch jeder C-Compiler für AVRs 
(auch CodeVision, falls es sich um den handelt) bietet die Möglichkeit, 
16-Bit-I/O-Register auch als solche anzusprechen. Und das sollte man 
auch tunlichst nutzen, da z.B. dieser Einzeiler in keinster Weise 
garantiert, dass die beiden Teilregister in der richtigen Reihenfolge 
ausgelesen werden, was aber für die Funktion der ganzen Geschichte 
unbedingt erforderlich ist.

Außerdem ist es sinnvoll, wenn man den Verdacht hegt, dass eine 
Komponente nicht funktioniert, entweder ein Testprogramm speziell für 
diese Komponente zu schreiben, ohne den ganzen anderen Rotz, der damit 
eigentlich nichts zu tun hat, oder wenigstens die Sachen aus dem 
bestehenden komplett-Programm rauswerfen, die mit der Sache nichts zu 
tun haben.

von David B. (Gast)


Lesenswert?

Also die Uhr und das Display (Controller T6963) funktioniert problemlos.
Dieses Projekt habe ich vor ein paar Monaten begonnen. Aufgrund des 
Studiums musste ich meine privaten Interessen zurückstellen. Auf meinem 
Display sehe ich nur den Wert 1023. Normalerweise schwankt dieser Wert 
heftig.

von David B. (Gast)


Lesenswert?

Ich verwende den CodeVision AVR.
Wie könnte man dies mit CodeVision AVR tun?

von David B. (Gast)


Lesenswert?

Ich habe die Funktion so umgeschrieben:

#define ADC_VREF_TYPE 0x00
// Read the ADC conversion result
unsigned int read_adc(unsigned char adc_input)
{
 ADMUX=adc_input|ADC_VREF_TYPE;
 ADCSR.6=1;
 while (ADCSR.4==0);
 ADCSR.4=1;
 return ADCW;
}

Hauptprogramm setzte ich dann noch das Register ADCSR auf den Wert:0x86


von David B. (Gast)


Lesenswert?

Da tut sich auch nichts. Verhält sich genauso wie vorher.
Ich komme da nicht drauf wo der Fehler liegen könnte.

von Michael U. (Gast)


Lesenswert?

Hallo,

1023 ist Maximal-Wert, was hast Du eigentlich als ARef und wo kommt 
Deine zu messende Spannung her?

Ich habe jetzt auch nicht im Source nachgeschaut, aber ADC-Pin ist auch 
Eingang, PullUp ist ausgeschaltet?

Gruß aus Berlin
Michael

von johnny.m (Gast)


Lesenswert?

Das ADC_VREF_TYPE im ADMUX kannste Dir sparen. Der 90S8535 hat keine 
interne Referenzauswahl.

Ich hoffe, Du weißt, dass der ADC bei der Frequenz, mit der Du ihn 
betreibst, nur noch maximal 8 Bit Auflösung hat.

Ansonsten schließe ich mich Michael an: Ist AREF korrekt angeschlossen? 
Der Analog-Eingangsport sollte explizit als Eingang ohne Pull-Up 
konfiguriert werden, auch wenn der Reset-Wert der betreffenden Register 
eigentlich die korrekte Einstellung liefern sollte. Sicher ist sicher.

von David B. (Gast)


Lesenswert?

Vielen Dank Michael und Johnny.
Der AD-Wandler funktioniert jetzt.
Kann mir jemand sagen wo ich genauere Infos zu dem temperatursensor
KTY16-6 (Siemens) herbekommen kann? Ich habe zwar das Datenblatt, das 
bringt mir leider nichts.

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.