A/D-Wandler C167

Gast #1392351
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!
Gast
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
Gast
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!
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
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.