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!
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.