Hallo miteinander
Ich nehme momentan den BH1745NUC Fahrbsensor von ROHM in betrieb. Das
Programm habe ich dafür schon geschrieben wo wie es eigentlich das
datenblatt verlangt. Mit diesem Code gelang mir auch die je 2 8Bit werte
auszulesen und zu einem 16Bit Wert zu konvertieren. Jedoch bemerkte ich
schnell das dise Werte nicht stimmen konnten. Bei genauerer Analyse,
bemerkte ich das die beiden 8Bit Werte je an einem Anschlag sind und
immer für einen Überlauf sorgen. Das hat zur vollge das die werte immer
herumzapplen von dem einten extrem ins andere. Meine Frage hatte jemand
mit dem Sensor schon erfahrung oder sieht jemand au fer seite 12 im
Datenblatt ob ich diesen Ablauf falsch verstanden habe. Oder hat einer
eine mögliche erklährung für die Falsche Wertausgabe? Datenblatt im
Anhang und Code folgt.
C-manager schrieb:> sieht jemand au fer seite 12 im Datenblatt
Dies:
"main write format
BH1745NUC continues to receive data with address increments until master
issues stop condition.
Write cycle is 40h -41h -42h -43h ...57h -58h [...]"
hätte ich so verstanden, dass du nicht immer die nächste Register
Adresse mitgeben musst, wegen automatischem Increment.
Alternativ eben ein Stop einfügen.
1
i2c_start(0x70,0);//Adress
2
i2c_write(0x41);//Config1
3
i2c_write(0x00);
4
i2c_stop();
5
6
i2c_start(0x70,0);//Adress
7
i2c_write(0x42);//config2
8
i2c_write(0x11);
9
i2c_stop();
10
11
i2c_start(0x70,0);//Adress
12
i2c_write(0x44);//config3
13
i2c_write(0x02);
14
i2c_stop();
oder
1
i2c_start(0x70,0);//Adress
2
i2c_write(0x41);//Config1 - register address 41
3
i2c_write(0x00);// Config 1 value (for reg addr 41)
4
i2c_write(0x11);// Config 2 value (for reg addr 42)
5
i2c_write(0x00);// dummy (value for register address 43)
6
i2c_write(0x02);// Config 3 value (for reg addr 44)
7
i2c_stop();
C-manager schrieb:> unsigned char RedHigh = 0;> int Redfine = 0;> [...]> Redfine = ((RedHigh <<8) | RedLow);
Bist du sicher das beim Schieben von unsigned char RedHigh etwas übrig
bleibt?
Das mit dem automatischen increment hab ich jetzt mal so gemacht. so
zählt es automatisch ja hoch. hat aber an der Ausgabe nicht geändert.
werde mal das ansehen mit dem unsigned typ das ist ein guter Hinweis.
werde wieder zurück kommen wen es nicht läuft.
C-manager schrieb:> Ich nehme momentan den BH1745NUC Fahrbsensor von ROHM in betrieb.> ...> Bei genauerer Analyse, bemerkte ich das die beiden 8Bit Werte je an> einem Anschlag sind und immer für einen Überlauf sorgen. Das hat zur> vollge das die werte immer herumzapplen von dem einten extrem ins andere.
Da bist du den Werbefuzies auf den Leim gegangen. Der Sensor ist kein
Farbsensor, sondern ein vierkanaliger Helligkeitssensor, der die
integrale Beleuchtungssträrke für vier verschiedenen Spektralbereichen
bestimmt.
Stabile Helligkeitswerte auf den Einzelkanälen bekommst du nur, wenn du
den Sensor mit sauberem Gleichlicht beleuchtest, dem kein
Wechsellichtanteil überlagert ist. Stabile Farbwerte erhälst du erst,
wenn du Verhältnisse der gemessenen Werte betrachtest.
Der Sensor liefert 4 Bereiche diese sind auch im Datenblatt festgehalten
max und min. Doch die werte die ich direkt aus dem Sensor entnehme sind
bei 0 oder 255 wen man diese noch schiebt liegt der bereich bei 0 und
65000. und nicht bei ca 2000 und 3800. Vorallem springen die Werte immer
über den Überlauf, so das immer der maximale oder minimale wert
angegeben wird.
C-manager schrieb:> Ich nehme momentan den BH1745NUC Fahrbsensor von ROHM in betrieb. Das> Programm habe ich dafür schon geschrieben wo wie es eigentlich das> datenblatt verlangt.
Warum probierst du es nicht erstmal mit einer (höchstwahrscheinlich)
funktionsfähigen Bibliothek, bevor du das Rad neu erfindest.
https://github.com/jgromes/RohmMultiSensor
C-manager schrieb:> weil Arduino mit verpackten eingebundenen Funktionen. Deswegen.
Um zu gucken, ob deine HW vernünftig läuft und die von dir generierte
I2C-Steuersequenz irgendwelche Ähnlichkeiten mit einer funktionierenden
Ansteuerung hatte, sollte das ziemlich egal sein.
Es hält dich auch keiner auf, die "verpackten eingebundenen Funktionen"
durch eigenen zu ersetzen, wenn es dann läuft.
Das sehe ich ähnlich wie Wolfgang. Nur weil irgendwo Arduino
drangeschrieben wurde, sollte dich das nicht davon abhalten dir mal
anzuschauen wie der Sensor dort angesprochen wird.
Um konkret zu sein, diese Datei zweit sehr einfach wie es gehen sollte.
Auch liesse sich die Datei mit einem Fingerstrich in ein 'normalen'
C-Code verwandeln.
https://github.com/jgromes/RohmMultiSensor/blob/master/src/sensors/BH1745NUC.cpp
Auf den relevanten Teil gekürzt (s.u.) zeigt sich auch gleich wie
ähnlich der Code zu dem von C-manager (Gast) ist.
Einzig die Gain Einstellung ist bei Faktor 16, im oben stehenden Code
ist diese Faktor 2.