Forum: Mikrocontroller und Digitale Elektronik Mega8 - ADC liefert konstanten Wert


von hkr1734 (Gast)


Lesenswert?

Ich lese 4 ADC´s des Atmega8 etwa folgendermaßen aus:

1. Mux-Kanaleinstellungen ändern (auf z.B. Kanal3)
2. ADC-Starten
3. Warten bis der ADC fertig ist
4. ADC-Wert in Variablen kopieren
5. Wert der Variablen auf ein LED-Display ausgeben
->und wieder von vorn

Allerdings liefert der ADC immer einen kostanten Wert...

z.B.(0111011001->473) oder (0111011001->474)
Der Wert ändert sich aber nur bei einem Neustart der Schaltung.

Ich habe gelesen, dass die erste Messung nach dem Kanal-Wechsel immer 
schrott sein soll, aber 2-maliges Lesen hilft auch nicht.


Hat irgendwer eine Idee, woran das liegen könnte?

>PS:
>Programiert habe ich in Assembler nach dem ADC-Tutorial

von Michael H. (Gast)


Lesenswert?

hkr1734 schrieb:
> Hat irgendwer eine Idee, woran das liegen könnte?

Na klar. Du hast einen Programmierfehler in Zeile 42.

von Tim H. (hotty) Benutzerseite


Lesenswert?

Das heißt: Du sollst deinen Code hochladen. Immerhin kenn ich noch 
keinen der Weissagen kann :)

von hkr1734 (Gast)


Lesenswert?

Sorry, aber ich dachte, das mein vorgehen möglicherweise falsch sein 
könnte, so rein Hardwaremäßig (z.B. man muss erst 50µS warten bis man 
erneut den ADC lesen darf)

Hier also der Entscheidende Quellcode:
1
.include "m8def.inc"
2
3
.def temp1  = r16
4
.def temp2  = r17
5
6
.def WertL  = r18
7
.def WertH  = r19
8
9
Main:
10
  rcall Get_ADC_0
11
  rcall Ausgabe 
12
;Die Ausgabe funktioniert zu 100%, ewig getestet, die Daten werden korrekt ausgegeben, verwertet werden WertH und WertL
13
14
15
Get_ADC_0:
16
  ldi temp1, (1<<REFS0) | (1<<ADLAR) | (0<<Mux3) | (0<<Mux2) | (0<<Mux1) | (0<<mux0)
17
  ;Referenz 5V intern, Wert linksbündig, Kanal 0
18
  out ADMUX, temp1
19
20
  ldi temp1, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0)
21
  ;ADC an, Vorteiler 64
22
  out ADCSR, temp1
23
  rcall Get_ADC_lesen
24
ret
25
26
;^^^Gibt es für die Kanäle 0-3^^^
27
28
29
Get_ADC_lesen:
30
  sbi ADCSR, ADSC       ;ADC starten
31
  wait_adc:
32
    sbic ADCSR, ADSC
33
    rjmp R_wait_adc
34
  in WertH, ADCH
35
  in WertL, ADCL
36
ret

Achja, AVCC ist mit einem 100nF-Kondensator gegen GND angeschlossen...


Haben möglicherweise die Register r18 und r19 eine Sonderfunktion?

von spess53 (Gast)


Lesenswert?

Hi

>  in WertH, ADCH
>  in WertL, ADCL

Falsch. Erst ADCL, dann ADCH einlesen.

MfG Spess

von hkr1734 (Gast)


Lesenswert?

Das war ja einfach... :-)

Vielen Dank!

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.