Forum: Mikrocontroller und Digitale Elektronik ADC MUX Problem 4433


von Berny (Gast)


Lesenswert?

hallo zusammen

ich brauch noch mal ne Info. Ich bekomme aus dem Kanal 5 ADC Info und
weiß nicht genau wie ich die anderen Kanäle ansprechen muss. Habe schon
Interrupt Routiene und Free Run propiert.Der ADC_MUX Kanal 05 und  04
sollen ausgelesen werden, aber ist immer der selbe Wert. Zur Zeit Free
Run Modus am laufen. Läst sich besser timen.

Danke Berny

von Chris (Gast)


Lesenswert?

Bei allgemeinen fragen zu abläufen sollte man als erstes ins Datenblatt
des Controllers gucken, da gibt eine kurze ausführung und eine lange,
lies die dir mal durch, da findest du bestimmt eine Antwort.

http://www.atmel.com/dyn/resources/prod_documents/1042s.pdf   (kurz)
http://www.atmel.com/dyn/resources/prod_documents/doc1042.pdf   (lang)

gruß
Chris

von Berny (Gast)


Lesenswert?

@Chris danke, habe es gelesen, verstanden und geht nicht?????
Wie so oft eine einfache Sache, wenn sie richtig erklärt wurde!!!:)

;ADC initialisieren
;ADEN (ADC Enable) = 1
;ADSC (ADC Start Conversion) = 1
;ADFR (ADC Free Run Select) = 1
;ADIF (ADC Interrupt Flag) = 1
;ADIE (ADC Interrupt Enable) = 0
;ADPS2..0 (ADC Prescaler Selct Bits XTAL /2..128)= 64
;ldi temp, ((1<<ADEN)|(1<<ADSC)|(1<<ADFR))+7 ;free Run convert
;out ADCSR, temp
ldi temp, ((1<<ADEN)|(1<<ADSC)|(1<<ADFR))+7
out ADCSR, temp


Die Beispiele hier haben mich auf den Weg gebracht, doch leider nicht
ans Ziel. Wäre klasse wenn jemand der Plan hat eine Antwort hätte. Wie
in anderen Beiträgen zu sehen ist, hängt es immer wieder.

Gruß Berny und hilfe wäre echt klasse, zumindest einen Wegweise, den
Rest finden ich schon raus.

von thkais (Gast)


Lesenswert?

Du mußt dem Wandler auch mitteilen, welchen Kanal Du lesen möchtest....
Register ADMUX

von bernhard (Gast)


Angehängte Dateien:

Lesenswert?

hier die beschreibung des adc's und ein sourcecode..

grüsse,
bernhard

von Berny (Gast)


Lesenswert?

@ Bernhard danke erstmal. Habe das Programm bis auf sbi ADCSR, ADSC
hatte ich diesen Teil gleich.

Doch ein Problem bleibt. Ich erhalte auf Kanal 5 den Wert von 4 und
umgekehrt?


ldi temp, ((1<<ADEN)|(1<<ADFR)|(1<<ADPS2))+(1<<ADPS1)
out ADCSR, temp


z.B.    LDI temp,0x05
ADC_IN:       ; Temp = MUX = Kanal Messung Rück r1-r2
  out ADMUX,temp
  sbi ADCSR, ADIF
  sbi ADCSR, ADSC
ADC_IN_l01:      ; warte auf Conversion complet
  sbis ADCSR,ADIF        ; ADIF Iterrupt flag prüfen
  rjmp ADC_IN_l01
  ldi count,128           ; warten falls Daten nicht ok
ADC_IN_l02:                     ; nur zum testen eingefügt
  dec count
  brne ADC_IN_l02
  in r1, ADCL        ; ADC einlesen
  in r2, ADCH
  ret


Ich weiss nicht, was hier falsch läuft, wenn die Werte immer getdreht
währen, hatte ich die Kanäle einfach vertauscht, aber manchmal
klappts????

Hilfeeee und Gruß Berny

von thkais (Gast)


Lesenswert?

Das liegt evtl. am free-run Modus. Es kann da zu interessanten Effekten
kommen, wenn man mehrere Kanäle abfragen will, denn wenn das Schreiben
des ADMUX-Registers nicht synchron ist, klapperts.

Ich nutze den Interrupt des A/D-Wandlers. Code-Beispiel siehe:
http://www.mikrocontroller.net/forum/read-1-35558.html#36904

Mit ein paar kleineren Änderungen sollte das auch bei Dir laufen.

von bernhard (Gast)


Lesenswert?

also wenn du meinen code nimmst (ad kanäle halt umbenennen) müsste es
eigentlich funktionieren...;)...naja, hab auch ziemlich lang
herumgebastelt und nette effekte mit der atmel ad wandlung erlebt ;)

von Berny (Gast)


Lesenswert?

Danke für die Info, das funzt prima, habe ich schon probiert, doch kann
ich den Interrupt Modus nicht verwenden, da das auslesen zu einem ganz
bestimmten Zeitpunkt bei Kanal 5 statt finden muss und im
Ausnahmezustand des Timers stattfindet. Ich bekomme die falsche
Spannung des Akkus zurück, halt die Ladespannung und nicht die
Leerlaufspannung.
Wie kann ich den den MUX Befehl syconisieren???

Gruß Berny ??????

von bernhard (Gast)


Lesenswert?

moment mein wg mitbewohner sagt ich soll mal mit ihm ein bier trinken
;))..danach, werd ich mal zurückposten ;)

von Berny (Gast)


Lesenswert?

War plötzlich ganz einfach,
Dank an alle, ich hoffe die Routine zickt nich noch mal rum,
Der Hinweis Sycronisieren war super klassen, Ich habe einfach den
Interrupt verwendet um die MUX zu sycronisieren und siehe da es läuft
stabil.

Dank an alle und Gruß Berny

ADC_IN:     ; Temp = MUX = Kanal Messung Rück r1-r2
  out ADMUX,temp
  sbi ADCSR, ADIF
  out ADMUX,temp
  sbi ADCSR, ADSC
ADC_IN_l01:    ; warte auf Conversion complet
  sbis ADCSR,ADIF ; ADIF Iterrupt flag prüfen
  rjmp ADC_IN_l01
  ldi count,128
ADC_IN_l02:
  dec count
  brne ADC_IN_l02
  out ADMUX,temp
  sbi ADCSR, ADSC
ADC_IN_l03:
  dec count
  brne ADC_IN_l03
  in r1, ADCL      ; ADC einlesen
  in r2, ADCH
  cbi ADCSR,ADSC  ;Stop ADC Conversion

  ret

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.