Forum: Mikrocontroller und Digitale Elektronik A/D-Wandler C167


von cai (Gast)


Lesenswert?

Hallo,

ich beschäftige mich gerade mit dem A/D-Wandler, unter dessen Verwendung 
die Abtastung eines Analogsignals erfolgen soll.
Es soll eine Folge von 64 Wandlungen erfasst werden und im 
Speicherbereich abgelegt werden. Der Transfer der Daten soll unter 
Verwendung von einem PEC-Kanal erfolgen. Soweit wäre da kein Problem, 
aber die Werte sollen auf 8 bit gerundet werden. Wie kann ich das denn 
machen, wenn man diese mit PEC transferiert?

Für Tipps wäre ich dankbar!

von TManiac (Gast)


Lesenswert?

Hi cai,

PEC transportiert grundsätzlich 16bit. Das Runden musst du im nachhinein 
in Software lösen (genauso wie du die Kanalnummer aus dem 16bit-Wert 
entfernen musst). Das Interruptsystem gibt dir die Möglichkeit nach 
einer ausgewählten Anzahl von PEC-Transfers (deinen 16 Wandlungen) eine 
Interrupt-Service-Routine auszuführen, in der zum Beispiel deine Rundung 
vornehmen kannst (oder auch eine Mittelwertbildung durchführen).

Gruß TManiac

von cai (Gast)


Lesenswert?

Hallo TManiac,

DANKE!! So hab ich mir das schon fast gedacht. Wobei..

> PEC transportiert grundsätzlich 16bit.

nicht unbedingt, oder? Im Register PECCx kann ich ja bei BWT sagen, ob 
Worttransfer oder Bytetransfer durchgeführt werden soll?!

Aber Byte würde mir ja dann auch nichts bringen, also heißt es, dass ich 
das ganze Wort aus ADDAT im Speicher ablegen muss, um dieses dann 
hinterher zu bearbeiten? Hm. Dann benöte ich vorher doppelt so viel 
Platz als nachher.

> Das Runden musst du im nachhinein in Software lösen

Gibt es da eigentlich ein Befehl, shr ist ja nun nicht wirklich die 
Lösung dafür.

> Das Interruptsystem gibt dir die Möglichkeit nach einer ausgewählten
> Anzahl von PEC-Transfers (deinen 16 Wandlungen) eine
> Interrupt-Service-Routine auszuführen, in der zum Beispiel deine Rundung
> vornehmen kannst (oder auch eine Mittelwertbildung durchführen).

Es soll ja eine Folge von 64 Wandlungen erfasst werden. Heißt das also, 
dass ich zuerst alle 16-Bit Werte der 64 Wandlungen via PEC-Transfer im 
Speicher ablege, also COUNT im Register PECCx auf den Wert 64 setze, und 
dann im nächsten Schritt, in dem ja (da COUNT=0) die normale 
Interrupt-Routine ausgelöst wird, die Rundung vornehme?!

BTW, wie führt man eigentlich eine Mittelwertbildung durch?

Sorry für meine Fragen, bin noch ziemlicher Neuling.

Danke!

von Robert T. (robertteufel)


Lesenswert?

Ich fange mal hinten an. Mittelwertbildung macht man indem man die Summe 
aller Werte durch die Anzahl der Werte, also in Deinem Fall 64 teilt. 
Durch 64 teilen ist allerdings eleganter mit einem Shift Befehl 
moeglich. Shift right um 6 Stellen ist dasselbe wie durch 64 Teilen mit 
Ausnahme der Rundung, falls nicht immer nach unten gerundet werden soll. 
Rundung waere indem 5 mal geschiftet wird, falls das least significant 
bit = 1 ist nochmal 1 addieren und dann nochmals um 1 shiften. Geht 
vielleicht auch einfach doch der 167 shiftet sehr effektiv.

Wie bekommt man die Kanalnummer weg? z.B. Wert AND 0x3ff, dann ist nur 
noch das Ergebnis da. Ich wuerde sogar empfehlen die 10-bit Werte 
herzunehmen, alle 64 davon zu addieren und dann einfach nur noch das 
high Byte des Ergebnisses nehmen. Das Low-Byte faellt weg beim 
Mittelwert und beim Runden.

Alle Klarheiten beseitigt?

Also gesamter Programmablauf:
1. PEC so initialisieren, dass er nach 64 Transfers einen regulaeren 
Interrupt abgibt
2. In dieser Interrupt Routine die Kanalnummern entfernen
3. Alle 10-bit Werte aufaddieren
4. Das High Byte der Addition von 64 Werten entspricht dem Mittelwert 
auf 8-bit abgerundet.

Gruss, Robert

von TManiac (Gast)


Lesenswert?

Da muss ich Robert recht geben.

Die Kombination 64 mal 10 Bit-Werte auf 8-bit-Mittelwert ist eine 
wunderbare Sache.

Die 64 Werte ergeben maximal 0xFFC0. Also kommt es noch nicht einmal zum 
Überlauf. Das Highbyte stellt dann ziemlich genau (+- ein Digit) dein 
auf 8-Bit gerundeten Mittelwert.
(Sachen gibt's, die übersieht man gerne)

Das Vorgehen wurde nun ja schon erklärt.

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.