Forum: Mikrocontroller und Digitale Elektronik Lux Werte per OPT3001 auslesen


von Dieter (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Achim M. (minifloat)


Lesenswert?

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
von Wolfgang (Gast)


Lesenswert?

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.

von Harald A. (embedded)


Lesenswert?

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
Noch kein Account? Hier anmelden.