OPT3001 Helligkeitssensor mit I2C Bus

achim S.

Mitglied
16 Jan 2010
641
9
18
Berlin Biesdorf
Sprachen
  1. ANSI C
Hallo
Hat schon jemand Erfahrung mit dem QPT3001 von TI gemacht?
Bin gerade dabei es zu verstehen. Einiges geht schon. Der OPT hat mehrere Register mit 16 Bit. In diesen steht z.B. der Wert der Helligkeit (Result). Dabei muss man wieder unterscheiden bei den 16 Bit auf 4 Bit (E3:0) und 12 Bit (R11:0).
In den ersten 4 Bit steht der Exponent und in den 12 Bit die Mantisse. Holen des 16 Bit Wertes über lsb und msb geht, doch wie kann ich es vernünftig trennen?
Auch die Einstellung erfolgt mit einem 16 Bit Register (Configuration) mit RN, CT, M, OVF, CRF, FH, FL, L, POL, ME und FC.
8 Bit Register kenne ich und kann sie beschreiben. Wie kann ich ein 16 Bit Register beschreiben? Leider gibt es so gut wie keine Info zu diesem IC im Netz.
Da der Anschluss mit dem I2C Bus erfolgt kann ich nur 8 Bit übertragen oder geht auch 16 Bit zusammen?
achim
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3,497
65
48
Marwitz
Sprachen
  1. BascomAVR
  2. Assembler
Da der Anschluss mit dem I2C Bus erfolgt kann ich nur 8 Bit übertragen oder geht auch 16 Bit zusammen?
I²C überträgt byteweise, für 16 Bit müssen folglich zwei Bytes (zuzüglich Adressbyte+R/W) übertragen werden. Das wird aber auch genauer im von Dir verlinkten Datenblatt auf Seite 16 und 17 erklärt.
In den ersten 4 Bit steht der Exponent und in den 12 Bit die Mantisse. Holen des 16 Bit Wertes über lsb und msb geht, doch wie kann ich es vernünftig trennen?
Wie das in C (insbesondere in AVR-C) zu handhaben ist, weiß ich nicht, aber grundsätzlich ist genau das die Codierung von Fließkommazahlen - hier halt 16Bit-Fließkomma.
@Dirk : Gibts sowas (Mini-Fließkomma(?)) schon fertig in C? ansonsten sollte sich das doch mit etwas Bitgeschubse in konventionellere Floats wandeln lassen, falls weitergerechnet werden soll.
Sorry, ich selbst hab Mikrocontrollertechnisch noch nix mit Fließkomma machen müssen...
(Gibt ja auch genug Spezis, die einen DS18B20 auslesen, und dann wild mit den ausgelesenen Bytes rumwurschteln, obwohl der eben genau das Ergebnis in Zweierkomplementdarstellung (also ein (vorzeichenbehafteter) Integer) geliefert wird. Da sind halt die untersten vier Bits Nachkommastellen.)
 

achim S.

Mitglied
16 Jan 2010
641
9
18
Berlin Biesdorf
Sprachen
  1. ANSI C
Hatte die Beschreibung auf den seiten zwar gesehen aber nicht so richtig verstanden. In der Figur 20 und 21 ist ja die Übertragung angegeben. Danach sollen ja die 1. die Adresse, 2. das Register, 3. MSB und 4. LSB übertragen werden. Das mit den beiden ersten Punkten kenne ich bereits aus anderen Projekten. Das Mit MSB und LSB schreiben in Register war mir bisher unbekannt das so was geht. Man lernt halt nie aus.
Beim lesen des Result ist es ähnlich. Habe ich auch teilweise in anderen Projekten gemacht. Es wird erst msb mit 8 Bit gelesen, dann lsb mit 8 Bit gelesen. Kommen in eine 16 Bit Variable. Erst msb und nach links verschieben dann noch lsb. Diese 16 Bit Variable wird durch Bitschubsen in Exponent mit Bit 15 bis 12 zerlegt und in Mantisse Bit 11 bis 0.
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3,497
65
48
Marwitz
Sprachen
  1. BascomAVR
  2. Assembler
Also grundsätzlich gilt bei I²C:
Erstmal ist der Master (bzw derjenige, der die Arbitrierung letztendlich gewinnt) Sender, Transmitter. Er sendet die Zieladresse, und mit dem letzten Bit dieses Bytes bestimmt er außerdem, ob er für den Rest des Telegrammes Transmitter oder Receiver sein will.
Nach diesem SLA+R/W-Byte können beliebig viele Bytes folgen, wobei die Festlegung der Rollen (Transmitter/Receiver) wie festgelegt bleibt. Der Receiver ACKt jedes Byte, NACKt er, ist das Telegramm für ihn ja auch beendet, der Master könnte also entweder den Bus freigeben (Stop Condition), oder ein neues Telegramm mit SLA+R/W (mit einer ggf anderen Adresse und/oder Datenrichtung) starten (repeated Start Condition ohne vorheriges Stop, er bleibt im Busbesitz).

Beim Lesen von Speicherbausteinen hast Du zB oft:
Slaveadressierung mit SLA+W (Master weiterhin Transmitter)(versuchte) Businbesitznahme mit Startcondition
adressierter Slave (Speicherbaustein) ACKt
Übertragung der gewünschten Speicher/Registeradresse
Slave ACKt (und setzt seinen internen Lesepointer entsprechend)
(Können ggf auch mehrere Bytes sein, wenn der Speicher zb groß ist)
Master generiert repeated start
Master sendet SLA+R (ab jetzt will er lesen)
Slave ACKt
Master liest (beliebig viele) Byte(s) und ACKt (bzw NACKt nach dem letzten).
Master gibt den Bus frei (StopCondition).
Der Slave kann zB nach jedem einzelnen Byte seinen Lesepointer inkrementieren, wodurch der Master sequentiell Lesen kann.
Fürs Schreiben gilt sinngemäß dasselbe, hier muß hal nur nicht die Datenrichtung (mit repeated start und SLA+R) umgekehrt werden.
Dein Sensor ist aus I²C-sicht quasi auch nur ein Speicher...

Beim lesen des Result ist es ähnlich. Habe ich auch teilweise in anderen Projekten gemacht. Es wird erst msb mit 8 Bit gelesen, dann lsb mit 8 Bit gelesen. Kommen in eine 16 Bit Variable. Erst msb und nach links verschieben dann noch lsb. Diese 16 Bit Variable wird durch Bitschubsen in Exponent mit Bit 15 bis 12 zerlegt und in Mantisse Bit 11 bis 0.
Wobei das weitere zerlegen nicht unbedingt nötig ist. Deine 16Bit-Variable enthält eine 16Bit-Fließkommazahl mit vier Bit Exponent und zwölf Bit Mantisse. Einfach genaue Fließkommazahlen (single) werden quasi genau so gespeichert, nur eben mit 32Bit, davon ein Vorzeichenbit, acht Exponentenbits und 23 Mantissenbits.
Du hast mit der 16bit-float irgendwie sowas ähnliches wie 'ne (unsigned) halbgenaue Fließkommazahl (@dino03 ,@Dirk usw bitte nicht steinigen), die Frage ist, was DU(!) jetzt weiter damit anfangen willst.
Irgendwas mit halbgenauen Fließkommazahlen weiterrechnen -> dann brauchst Du nichts weiter wandeln, aber Rechenoperationen, die auf dieser halben Genauigkeit arbeiten.
Irgendwas mit genaueren Fließkommazahlen weiterrechnen -> dann mußt Du diese "half"s in singles/doubles umwandeln, und kannst fertige Hochsprachenoperationen nutzen.
Die Kommazahl nur irgendwie ausgeben -> dann kannst Du die Formel aus dem Datenblatt Seite 20 anwenden - die Multiplikation mit 0,01 erledigst Du durch hinzumogeln eines Kommas, bei 2hochExponent bin ich mir grad nicht sicher(*), das sollte eigentlich auch ganz einfach gehen, bleibt 'ne Multiplikation einer 4Bit und einer 12Bit-Zahl.
Als Ergebnis erhälst Du einen Integer bzw eine Fixkommazahl (der 0,01-Faktor).
(Ob sich die Multiplikation und die Dezimalstellenzerlegung (ggf->String) bereits in einem Arbeitsgang erledigen läßt, ist mir (noch) nicht klar - aber eigentlich ist das Dein Problem -> Dein Hirnschmalz ;) )

Edit zu (*): wäre das nicht genau Exponent * Mantisse (also die 4-Bit-ZAhl mal die 12-Bit-Zahl)? dann müßte man sich nurmal die Multiplikationsroutine genauer ansehen, um die Schleife Registereffizient zu halten...
 
Zuletzt bearbeitet:

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3,497
65
48
Marwitz
Sprachen
  1. BascomAVR
  2. Assembler
die Multiplikation mit 0,01 erledigst Du durch hinzumogeln eines Kommas, bei 2hochExponent bin ich mir grad nicht sicher(*), das sollte eigentlich auch ganz einfach gehen, bleibt 'ne Multiplikation einer 4Bit und einer 12Bit-Zahl.
Als Ergebnis erhälst Du einen Integer bzw eine Fixkommazahl (der 0,01-Faktor).
[...]
Edit zu (*): wäre das nicht genau Exponent * Mantisse (also die 4-Bit-ZAhl mal die 12-Bit-Zahl)? dann müßte man sich nurmal die Multiplikationsroutine genauer ansehen, um die Schleife Registereffizient zu halten...
Quatsch...
die Mantisse muß genau Exponent-mal linksgeschoben werden. Schon steht Dein Ergebnis da. In Centilux.

Mal ein Beispiel aus dem Datenblatt:
ausgelesen: 1000_1000_0000_0000
Exponent ist also 8. Mantisse also achtmal linksgeschoben (acht Nullen drankritzeln)
1000_0000_0000_0000_0000 ergibt dezimal 524288 (Centilux).
Jetzt noch'n Komma vor die vorletzte Stelle gemogelt:
5242,88 Lux.
Fertig.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)