ADC DMA-Modus, Averaging
-
hallo,
ich arbeite mit dem ADuC841 (Befehlssatz des 8052). Dieser läuft im DMA-Modus. Ich speichere 201 Werte im XRAM (2kByte). Diese sollen dann über ein 16faches Averaging gespeichert werden. Da der Speicherplatz dafür nicht reicht, denke ich, das ich das aufsummiere. Genau daran haperts. Wenn ich das aufsummiere überschreite ich doch die 12 Bit des ADC?
Hier mal mein Code bisher für die AD-Wandlung:
ADC0: CLR ES ;UART-Interrupt sperren MOV ADCCON1,#0 ;ADC muss abgeschaltet sein MOV DPTR,#0 ;Datenpointer auf 0 setzen ADC1: MOV R1,#201 ;Anzahl der Umsetzungen des ADC (1 mehr, da in die ;letzten 2 Byte keine Werte geschrieben werden) ADC2: MOV A,#10h ;Kanalnummer ADC1 (beginnend bei ersten Speicherzelle ;muss in jedem 2.Byte die Kanalnummer stehen (4Bit). MOVX @DPTR,A INC DPTR ;nächste Adresse CLR A MOVX @DPTR,A INC DPTR DJNZ R1,ADC2 ;201 mal wiederholen MOV A,#0FFh ;Stopbefehl für ADC MOVX @DPTR,A MOV DMAL,#0 MOV DMAH,#0 MOV DMAP,#0 MOV ADCCON2,#40h ;DMA-Modus aktivieren MOV ADCCON1,#0B0h ;conv./aquisation-time SETB CA ;CA ist Indikator ob conversion läuft (wird über Timer ;gelöscht) JB CA,$ CLR EADC RET
Der Timer setzt auch CCONV. Am Ende gebe ich die Werte über UART aus nachdem ich die 4Bit-Kanalnummer, die in jedem 2. Byte steht lösche. Die übrigen 4Bit sowie die 8 Bit der nächsten Speicherzelle ergeben die 12Bit in dem der umgewandelte Wert steht.
-
Bevor wir anfangen über den Assemblercode zu reden, sollten wir erstmal die theoretischen Grundlagen klären. Was genau verstehst Du unter Averaging und vor allem unter mehrfachen Averaging?
Mir fällt dazu spontan ein, eine Zeitreihe mit ihrem Mittelwert zu ersetzen. Eventuell ist aber die Glättung einer Zeitreihe gemeint? Bitte ein paar mehr Informationen dazu, danke.
-
ich brauch eine einfache 16fache Mittelwertbildung
-
Wie bitte sieht eine 16fache Mittelwertbildung aus?
Der Mittelwert ist ein Schätzer für den Erwartungswert, wir reden hier über eine Konstante.Es gibt natürlich gleitende Mittel oder Glättungen von Zeitreihen. Aber der Mittelwert eines Mittelwerts ist nun einmal der Mittelwert selber :).
-
eine Aufsummierung von 16 Werten mit anschließender Division durch die Anzahl der Aufsummierungen, also 16.
-
Wenn ich mich nicht verrechnet habe:
16* 0xfff =0xfff0 ~ 2Byte =16Bit
ist der 8052iger kein 16bitter?
Selbst wenn, es gibt doch noch n Carryflag ?!grüße
-
nein es ist ein 8Bit-Prozessor.