Forum: Mikrocontroller und Digitale Elektronik ADC funktioniert nicht - gibt nur 1023 zurück


von R.M. (Gast)


Lesenswert?

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.

von fonsana (Gast)


Lesenswert?

R.M. schrieb:
> Danke im Vorraus für eure Hilfe!

Was ist die Frage?

fonsana

von Otto (Gast)


Lesenswert?

Welche Spabbung liegt am Ausgang des Sensors an?

von Alexander F. (alexf91)


Lesenswert?

Poste doch mal deine Schaltung, vielleicht liegt der Fehler da.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
     sbi ADCSRA,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?

von Oliver (Gast)


Lesenswert?

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

von Nils (Gast)


Lesenswert?

Ich hab das Problem immer, wenn ich den ADC Eingang nicht als Eingang 
programmiert habe. Dummer Fehler, aber da muss man erstmal drauf kommen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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?

von Jens (Gast)


Lesenswert?

Funktioniert doch! Bei 10bit ist dein Wertebereich 1024 groß. Also von 0 
bis 1023!
Wenn der das zurück gibt, ist alles ok.

von Karl H. (kbuchegg)


Lesenswert?

Blöde Frage:
Die SPannung am PINC2 hast du kontrolliert?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jens schrieb:
> Bei 10bit ist dein Wertebereich 1024 groß. Also von 0 bis 1023!
Äh ja, und: kommt auch mal was anderes als 1023 raus?

von Erich (Gast)


Lesenswert?

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

von Uwe (de0508)


Lesenswert?

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./

von Karl H. (kbuchegg)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von fonsana (Gast)


Lesenswert?

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

von R.M. (Gast)


Lesenswert?

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.

von Paul Baumann (Gast)


Lesenswert?

Fehlerursache: Ab-ber Draht.
;-)
Das passiert in den besten Familien mal.

MfG Paul

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.