Hallo zusammen, ich bräuchte eure Hilfe. Und zwar muss ich eine Funktion ReadI2CRegister beschreiben die Lux Werte von meinem OPT3001 einliest und diese dann in der WriteI2CRegister ausgibt. Leider habe ich keine Ahnung wie ich das mit Verwendung meiner Bibliotheken mache. Ich habe euch unten mal angehängt was ich bisher habe. Ich hoffe ihr könnt mir helfen.
Dieter schrieb: > Leider habe ich keine > Ahnung wie ich das mit Verwendung meiner Bibliotheken mache. Ich hab auch keine Ahnung wie ich das mit deinen Bibliotheken machen könnte. Sie liegen mir nicht zur Ansicht vor. Dieter schrieb: > HelloWorldv101.c Fragen: 1 Warum machst du
1 | // convert raw readings to LUX
|
2 | switch(ui16Exponent) |
3 | ...
|
in einer Funktion die ReadI2CRegister() heißt? 2 Was soll der Delay hier mitten in der I2C-Implementierung
1 | SysCtlDelay(ui32SysClock / (3*10)); // Wait 100ms for LED to be recognized |
und wie ergibt sich aus "sysclock / 30" plötzlich 100msec? 3 Warum unterschlägst du von der Funktion
1 | uint16_t ReadI2CRegister(uint8_t i2cAdress, uint8_t registerName) |
die Variable registerName und hantierst da dauernd mit
1 | I2CMasterSlaveAddrSet(I2C0_BASE, 0x44, false); |
einer hart kodierten 68 herum? Unterm Strich denke ich, dass du irgendeinen vorhandenen, funktionierenden Code hergenommen hast, um ihn letztendlich kaputt zu fummeln. Trenne Funktionalitäten voneinander: - I2C-Handling ist I2C-Handling und nix anderes. Einzig I2C-Busy und blocking für andere I2C-Lower-Level-Gerätetreiber müssen da gehandhabt werden, wenn nötig. - I2C-Adressen und Register in I2C-Peripherie gehören in Config Headerdatei eines Lower-Level-Gerätetreibers, der wiederrum den I2C-Handler benutzt. - Umrechnung in Lux, Statemachine usw. gehört in ein Higher-Level-Gerätetreiber - letztendliche Abfrage und schalten der LED, delay bevor man da messen kann usw gehören noch eine Programmebene höher. mfg mf
:
Bearbeitet durch User
Dieter schrieb: > Und zwar muss ich eine Funktion ReadI2CRegister beschreiben die Lux Werte > von meinem OPT3001 Ob das "Lux Werte", Messwerte der Beleuchtungsstärke oder sonstwas sind, ist egal. Im Datenblatt des OPT3001 ist im Kapitel 7.5.1 genau beschrieben, wie das Lesen und Schreiben der Register funktioniert und wie das Signal auf dem I2C-Bus dabei aussehen muss.
Der grundsätzliche Ansatz ist schon richtig. Allerdings packst Du den geschobenen Wert wieder in eine 16bit Variable. Das reicht nicht, das Ergebnis ist ein 32bit Wert oder besser noch ein float.
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.