Hallo miteinander, ich baue gerade ein Leistungsmessgerät zusammen mit dem CS5463 Metering IC: http://cirrus.com/en/pubs/proDatasheet/CS5463_F3.pdf Die Register lassen sich über SPI byte weise auslesen und stellen allerhand Messwerte bereit. Mein Problem ist nun der Umgang mit diesen Registern. Z.b. auf S.28 im Datenblatt. Die RMS Werte für Spannung und Strom bei denen nur die Nachkommastellen kodiert wurden. Wenn ich diese Zahl byte für byte (ingesamt 24 bit also 3 byte) per SPI auslese, wie muss ich sie abspeichern um sie anschließend auf dem LCD ausgeben zu können? Insbesondere wenn ich sprintf() verwende? Gestern habe ich bereits rumprobiert und nachgemessen, habe aber festgestellt dass die angezeigten Zahlen nicht wirklich sinnvoll waren. Speicher habe ich genügend, ich verwende einen Atmega 644. Kann mir einer von euch weiterhelfen? Z.b. einen kelinen Codeschnipsel? Wie verhält es sich bei den Momentanwerten von Strom,Spannung und Leistung (oben auf S.28) ? Hier steht die Zahl sei in zweier Komplement darstellung notiert, wie muss ich das handhaben. Vielen Dank für die Hilfe!
Hallo, also wie die Zahl codiert ist steht ja dort, The value is represented in two's complement notation and in the range of -1.0 <= I, V, P < 1.0, with the binary point to the right of the MSB. das 2'er Komplement ist die übliche Verarbeitungsform für Werte mit negativem Wertebereich. Für den Compiler musst du den Wert eben auf 32Bit (long) erweitern. Müsste eigentlich so gehen ...
1 | if (Wert && 0x800000) {Wert |= 0xFF000000} |
Der reale Messwert liegt zwischen -1 und 1. Du hast 24Bit, ein Bit geht für's Vorzeichen weg. Damit entspricht +1 == 2^23! Unten auf S.28 hast du ein Beispiel: Default = 0x01999A = 0.0125 sec 0x01999A = 104858 dez Messwert = 1 / (2^23) * Registerwert auf o.g. Beispiel: 1 / 8388610 * 104858 = 0.0125 Sascha
Da ist ein & zuviel, so wärs besser:
1 | int32_t wert; |
2 | // hier wert einlesen
|
3 | if (wert & 0x800000) |
4 | {
|
5 | wert |= 0xFF000000; |
6 | }
|
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.