Hallo Leute,
ich komme wieder nicht weiter.
Meine ersten versuche:
Ich Starte den ADC mittels Timer alle ca. 1/15s und springt per
Interrupt in ADC_Start (Z und Y Pointer sind vorerst nirgens im Programm
verwendet).
Danach soll er alle 7 Messwerte (nur die höherwertigen 8 bit) im SRAM
ablegen.
Zum testen der Analogwerte habe ich folgedes Programm mit einer LED.
Mein Problem ist, dass die LED wenn sie aus sein sollte willkürlich
flackert.
Wenn ich den Wert für ADMUX fix festlege (also mit ldi ....) oder wenn
ich zwischen den einzelnen Messungen mehr als ca. 1-10 ms pause lasse
funktioniert es richtig:
Bitte um Hilfe.
Test schleifen:
1
ldi XL, LOW(DSRAM_Analogwerte) ; Adresse des Strings in den
2
ldi XH, HIGH(DSRAM_Analogwerte) ; Z-Pointer laden
3
4
loop:
5
6
7
ld temp4, X
8
9
cpi temp4, 0x7F
10
BRSH ADC_Test_H
11
12
cpi temp4, 0x7D
13
BRLO ADC_Test_L
14
15
rjmp loop
16
17
18
ADC_Test_L:
19
20
cbi PORTB, 0
21
22
rjmp loop
23
24
ADC_Test_H:
25
26
sbi PORTB, 0
27
28
rjmp loop
ADC Routine
1
; ADC Routine
2
3
ADC_Start:
4
5
6
7
ldi ZL, LOW(DFlash_ADC_ADMUX*2) ; Adresse des Strings in den
SREG sichern ist auf jeden Fall wichtig.
Das andere:
Es könnte sein, dass die Umschaltung zwischen den ADC Kanälen zu schnell
erfolgt und sich daher die Sample&Hold Stufe am Eingang nicht schnell
genug auf den nächsten Eingang einstellen kann. Meistens macht man es
so, dass man die erste Messung nach dem Umschalten des Kanals verwirft
und erst die 2.te nimmt. Zumindest sieht man das so in vielen
Programmen. Was wirklich dahinter steckt und ob es notwendig ist, kann
ich dir jetzt so auch nicht sagen.
Hi
> Meistens macht man es>so, dass man die erste Messung nach dem Umschalten des Kanals verwirft>und erst die 2.te nimmt. Zumindest sieht man das so in vielen>Programmen. Was wirklich dahinter steckt und ob es notwendig ist, kann>ich dir jetzt so auch nicht sagen.
Das wird eigentlich nur nach Umschaltung der Referenzspannungsquelle
empfohlen. Bei Messungen alle 66ms sehe ich da nicht das Problem.
@Matthias (Gast)
Ich empfehle dir folgendes:
Den ADC einmal mit den relevanten Einstellungen außer ADSC und MUX3..0
zu initialisieren
Eine Speicherstelle für den Kanal festlegen (ich bevorzuge RAM). Dient
gleichzeitig als Offset zum Speichern
Im Timer0-Overflow-Interrupt den ADC starten (->Adsc)
Im ADC Complete Interrupt den ADC auslesen, speichern und auf den
nächsten Kanal umschalten
MfG Spess
spess53 schrieb:> Hi>>> Meistens macht man es>>so, dass man die erste Messung nach dem Umschalten des Kanals verwirft>>und erst die 2.te nimmt. Zumindest sieht man das so in vielen>>Programmen. Was wirklich dahinter steckt und ob es notwendig ist, kann>>ich dir jetzt so auch nicht sagen.>> Das wird eigentlich nur nach Umschaltung der Referenzspannungsquelle> empfohlen. Bei Messungen alle 66ms sehe ich da nicht das Problem.
Oh. Die idee in seinem Code ist aber nicht alle 66ms zu messen.
Mit dem Timer startet er eine Kette von Ereignissen. Der ADC läuft auf
Interrupt. Mit jedem Interrupt holt er das Ergebnis, stellt den Kanal um
und startet die nächste Wandlung, bis am Ende dann der ADC nicht mehr
gestartet wird und alles zum Erliegen kommt, bis dann der Timer erneut
alles triggert.
Ich bin mir auch noch nicht sicher, ob ich das so machen würde bzw. was
ich davon halten soll.
> Ich empfehle dir folgendes:>> Den ADC einmal mit den relevanten Einstellungen außer ADSC und MUX3..0> zu initialisieren>> Eine Speicherstelle für den Kanal festlegen (ich bevorzuge RAM). Dient> gleichzeitig als Offset zum Speichern>> Im Timer0-Overflow-Interrupt den ADC starten (->Adsc)>> Im ADC Complete Interrupt den ADC auslesen, speichern und auf den> nächsten Kanal umschalten
Hmm.
Genau das macht er doch.
Jetzt bin ich verwirrt.