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
@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.
@ 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
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.
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 ;)
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 ??????
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