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.
Poste doch mal deine Schaltung, vielleicht liegt der Fehler da.
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?
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
Ich hab das Problem immer, wenn ich den ADC Eingang nicht als Eingang programmiert habe. Dummer Fehler, aber da muss man erstmal drauf kommen.
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?
Funktioniert doch! Bei 10bit ist dein Wertebereich 1024 groß. Also von 0 bis 1023! Wenn der das zurück gibt, ist alles ok.
Blöde Frage: Die SPannung am PINC2 hast du kontrolliert?
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.