ADC - AT90S8535

Gast #502644
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.
Gast #502687
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.
Gast #502722
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

Gast #502860
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
Gast #502871
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.
Gast #503460
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren