Hallo!
Mich beschäftigt mittlerweile seit Tagen ein im Grunde sehr banales
Problem: Der ADC meines ATmega8 funktioniert nicht. Ich habe am PINC2
des Mikrocontrollers einen Licht-Spannungs-Wandler TAOS TSL250R hängen
(dieser hat 3 Pins: Einer hängt auf GND, der andere auf + 5 V und der
andere ist mit dem PINC2 des ATmega8 verbunden).
Zur Beschaltung: Neben obigen ist noch GND auf GND, AREF über einen
100nF-KeKo auf GND geschalten und AVCC auf + 5 V.
Zur Software:
ADC_INIT:
ldi temp1, 0b10000011 ; ADEN an, Vorteiler auf 8
out ADCSRA, temp1
ldi temp1, 0b01000010 ; interne Referenzspannung (AVCC + 5V) +Kanal
PINC2
out ADMUX, temp1
MAIN:
rcall WAIT
rcall lcd_clear ; löscht das Display
rcall lcd_home ; setzt Cursor auf Zeile 1, Pos 1
rcall ADC_START
rcall plcd_uword ; Ausgabe des in r16:r17 stehenden Words
rjmp MAIN
ADC_START:
in temp1, ADCSRA
sbr temp1, 0b01000000 ; Wandlung starten
out ADCSRA, temp1
ADC_LOOP:
in temp1, ADCSRA
andi temp1, 0b00010000
tst temp1
breq ADC_LOOP ; warten, bis Wandlung abgeschlossen ist
in r16, ADCL
in r17, ADCH
in temp2, ADCSRA
sbr temp2, 0b00010000 ; ADIF auf 1 setzen (= löschen)
out ADCSRA, temp2
ret
Ich weiß im Moment wirklich nicht mehr weiter.
Danke im Vorraus für eure Hilfe!
R.M.
fonsana schrieb:> R.M. schrieb:>> Danke im Vorraus für eure Hilfe!>> Was ist die Frage?>> fonsana
Betreff gelesen?
@TE: Mit welchem Takt läuft dein Mega? Der ADC läuft am besten mit einem
Takt von 200-500kHz, Wenn du den Auslieferzustand hast (8Mhz intern und
CKDIV8 an), dann sollte das vom Takt her in Ordnung sein.
R.M. schrieb:> in temp2, ADCSRA> sbr temp2, 0b00010000 ; ADIF auf 1 setzen (= löschen)> out ADCSRA, temp2
Das kannst du einfacher haben:
1
sbiADCSRA,ADIF
Gilt für alle ähnlichen Statements auch. Nur wenn Register ausserhalb
des direkten I/O Bereiches sind, geht das nicht. Beim Mega8 ist der ADC
aber gut im I/O Bereich.
Ich seh sonst aber keine offensichtlichen Fehler. Startest du im
Programm einmal ADC_INIT? Ist die Anzeigeroutine für r16 und r17
getestet?
Wenn alles in Ordnung zu sein scheint, aber trotzdem nichts
funktioniert, dann nimm mal einen neuene AVR. Der ADC-Eingang lässt sich
durch versehentlich falsche Parametrierung der Referenzspannung
kaputtschiessen.
Oliver
Oliver schrieb:> Der ADC-Eingang lässt sich durch versehentlich falsche Parametrierung> der Referenzspannung kaputtschiessen.
Sicher? Bei richtiger Hardwarebeschaltung?
Kannst du da mal ein Beispiel bringen?
Du solltest zunächst anstelle des Sensors ein Poti 10 kOhm zwischen
Masse und Vcc des uC schalten, den Schleifer an den A/D Eingang.
Dann einschalten und mit Voltmeter nachmessen, ob du am A/D Eingang
durch drehen des Poti den vollen Spannungsbereich durchfahren kannst.
Wenn ja, muss auch der ADC dann Werte über seinen vollen Hub bringen;
sonst liegt ein SW-Problem oder ggf. ein Defekt am Bauteil vor. SW
Problem hat höhere Wahrscheinlichkeit.
Gruss
Hallo Matthias und Mitleser,
Matthias Sch. schrieb:>> Betreff gelesen?> @TE: Mit welchem Takt läuft dein Mega? Der ADC läuft am besten mit einem> Takt von 200-500kHz, Wenn du den Auslieferzustand hast (8Mhz intern und> CKDIV8 an), dann sollte das vom Takt her in Ordnung sein.
Ich muss noch klar stellen, dass Angaben zum ADC Takt so nicht im
Dateblatt eines atMega8 steht.
Bei 10Bit Auflösung sollte sie <= 200.00kHz sein.
/By default, the successive approximation circuitry requires an input
clock frequency between 50kHz and 200kHz to get maximum resolution. If a
lower resolution than 10 bits is needed, the input clock frequency to
the ADC can be higher than 200 kHz to get a higher sample rate./
Und tu dir selbst 2 Gefallen
Schreib bestimmte Dinge zb nicht so
1
in temp1, ADCSRA
2
sbr temp1, 0b01000000 ; Wandlung starten
3
out ADCSRA, temp1
sondern so
1
sbi ADCSRA, ADSC
zum einen sollst du also die speziellen Bitinstruktionen benutzten (wenn
du sie verwenden kannst. Hier kannst du).
Zum anderen: keine Binärkonstante!
Die muss man bei der Kontrolle alle überprüfen
* hast du tatsächlich 8 Bits geschrieben?
* welche Bits sind auf 1?
* Datenblatt raus, welche Bits sitzen an diesen Bitpositionen?
* was macht das jeweilige Bit
schreibst du das alles mit Namen, dann muss man üperprüfen
* ist das Bit im richtigen Register
* was macht es
Welche der beiden Versionen ist einfacher? Welche birgt mehr Potential
für dumme Fehler?
Um das klar zu stellen, ich hab bei der Kontrolle keinen derartigen
Fehler entdeckt. Aber es ist und war mühsam, und vor allen Dingen so
unnötig, diese Dinge in deiner Schreibwewise zu prüfen. Mit einer
sauberen Schreibweise wäre das 3 mal so schnell zu prüfen gegangen.
Um festzustellen, ob der ADC fertig ist, benutzt das ADSC Bit in ADCSRA.
Du setzt es auf 1 -> der ADC startet -> und wenn er fertig ist, zieht
der ADC das Bit wieder auf 0.
1
ADC_START:
2
sbi ADCSRA, ADSC
3
ADC_LOOP:
4
sbic ADCSRA, ADSC
5
rjmp ADC_LOOP
6
7
in r16, ADCL
8
in r17, ADCH
9
ret
du brauchst kein Bit löschen oder sonst irgendwas zusätzlich tun.
Uwe S. schrieb:> Ich muss noch klar stellen, dass Angaben zum ADC Takt so nicht im> Dateblatt eines atMega8 steht.>> Bei 10Bit Auflösung sollte sie <= 200.00kHz sein.
Stimmt schon. Er hat ja leider auch nicht geschrieben, mit welchem Takt
der Mega rennt. Falls es die 1 Mhz im Auslieferzustand sind, sollten
div 8 aber ok sein. Ich hab mich dazu hinreissen lassen, weil ich oft
nur 8 bit Werte auslese, er nimmt aber den 16 Bit Timer und die vollen
10 Bit des ADC. Allerdings kann er dann natürlich nie den vollen PWM
Bereich durchfahren, wenn er die Werte des ADC nicht 6 mal nach links
schiebt, bevor sie ins OCR geschrieben werden.
Karl Heinz Buchegger schrieb:> Schreib bestimmte Dinge zb nicht so in temp1, ADCSRA> sbr temp1, 0b01000000 ; Wandlung starten> out ADCSRA, temp1>> sondern so sbi ADCSRA, ADSC
Hatte ich auch schon empfohlen, siehe oben.
Matthias Sch. schrieb:> Uwe S. schrieb:>> Ich muss noch klar stellen, dass Angaben zum ADC Takt so nicht im>> Dateblatt eines atMega8 steht.>>>> Bei 10Bit Auflösung sollte sie <= 200.00kHz sein.>> Stimmt schon. Er hat ja leider auch nicht geschrieben, mit welchem Takt> der Mega rennt. Falls es die 1 Mhz im Auslieferzustand sind, sollten> div 8 aber ok sein.
Stimmt schon.
Ist die Samplefrequenz zu hoch (oder zu niedrig) dann werden die
gelieferten Werte immer schlechter. Aber ein Dauer-1023 kann auch das
nicht erklären.
Matthias Sch. schrieb:> Betreff gelesen?
Ja, habe ich. Allerdings wirft der nur weitere Fragen auf:
"nur 1023" im Sinne - nicht mehr als 1023
oder
"nur 1023" im Sinne - und nichts anderes.
Da ja bekanntlich eine korrekt und eindeutig formulierte Frage den
Fragesteller oft schon auf die Antwort fuehrt - was ist denn nun die
Frage?
Da sich aber der TO sowieso nicht mehr meldet....
fonsana
Vielen Dank für die vielen Antworten!
Inzwischen habe ich den Fehler gefunden, der allerdings in der
Beschaltung lag - ich hatte einen Draht nicht richtig verbunden.