Frage zu TCS 34725 - RGBC Sensor

Gast #4899541
Lesenswert?

Hallo Gemeinde
Habe mit dem TCS 34725 und dem Datenblatt des Herstellers so meine 
Probleme.
Im Grund geht es eigentlich darum, die entsprechenden Register zu 
beschreiben und auszulesen.
Im Datenblatt auf Seite 12 wird das

1. Schreiben des Registers
2. Lesen der Datenregister
3. der Kombibetrieb

angegeben. Auf Seite 13 wird das Register Set mit Register Adressen 
angegeben, gefolgt auf Seite 14 mit dem Command Register, Seite 15 
Enable Register usw.
Frage dazu: Wie beschreibe ich bei diesem IC die Register?
Bisher habe ich das gemacht:
1
i2c_start(TCS_w);
2
  i2c_write(0x1f);     //Wert in Register
3
  i2c_stop();
Könnte noch andere Werte ins Register schreiben oder Einstellungen damit 
vornehmen. Wie schrebe ich was ins Register und lese die Daten aus?
1
ret = i2c_start(MCP_w);          // Start Lesen 
2
  if (ret == 0)
3
  {                         // Wenn ?? ein OK sendet...
4
    msb_temp = i2c_readAck();    //...speichere oberes Bit
5
    lsb_temp = i2c_readNak();    //...speichere unteres Bit
6
  }
7
  else                                // Fehlererkennung
8
  {                              // Wenn ?? kein OK sendet
9
    lcd_command(LCD_CLEAR);      // Leere Display
10
    lcd_printlc(1,13,"READ");    // "Lesevorgang"
11
    lcd_printlc(2,13,"NOK");    // "Nicht OK (NOK)"
12
  }
oberes Beispiel für das Auslesen einer 16 Bit Zahl mit überprüfung. Da 
in diesem IC 4 Werte gelesen werden sollen erfolgt das ebenfalls mit 
Register.
Leider verstehe ich das Datenblatt nicht korrekt und bekomme keine 
Werte.
Könnte jemand zu meiner Erleuchtung betragen?
Dank
LG Frg
Angehängte Dateien:
Gast #4900510
Lesenswert?

Das mit den Registern verstehe ich nicht. Wie muss ich die schreiben? 
z.B. um die Verstärkung einzustellen. Da verschiedene Einstellungen 
sind.
Oder wie kann ich die Farben bzw. die Werte dazu auslesen.
Es ist eine 16 Bit Zahl, doch wo stehen sie?
Gast #4900755
Lesenswert?

In der diesem Programm wird die Lib von arduino genommen und dabei alle 
Parameter angegeben. z.B. so:
1
#define TCS34725_ENABLE           (0x00)
2
#define TCS34725_ENABLE_AIEN      (0x10)    /* RGBC Interrupt Enable */
3
#define TCS34725_ENABLE_WEN       (0x08)    /* Wait enable - Writing 1 activates the wait timer */
4
#define TCS34725_ENABLE_AEN       (0x02)    /* RGBC Enable - Writing 1 actives the ADC, 0 disables it */
5
#define TCS34725_ENABLE_PON       (0x01)    /* Power on - Writing 1 activates the internal oscillator, 0 disables it */
6
#define TCS34725_ATIME            (0x01)    /* Integration time */
7
#define TCS34725_WTIME            (0x03)    /* Wait time (if TCS34725_ENABLE_WEN is asserted) */
8
#define TCS34725_WTIME_2_4MS      (0xFF)    /* WLONG0 = 2.4ms   WLONG1 = 0.029s */
9
#define TCS34725_WTIME_204MS      (0xAB)    /* WLONG0 = 204ms   WLONG1 = 2.45s  */
10
#define TCS34725_WTIME_614MS      (0x00)    /* WLONG0 = 614ms   WLONG1 = 7.4s   */
11
#define TCS34725_AILTL            (0x04)    /* Clear channel lower interrupt threshold */
Mit dieser Zeile komme ich nicht weiter
1
// Color Sensor-Objekt initialisieren
2
// Parameter siehe: https://learn.adafruit.com/adafruit-color-sensors/program-it
3
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_1X);
Wie muss ich diese Werte eintragen bzw. laden?
#4901260
Lesenswert?

Fragender Gast schrieb:
> Das mit den Registern verstehe ich nicht. Wie muss ich die schreiben?

Erst mal solltest du verstehen WIE du einen bestimmten Wert in ein 
bestimmtes Register schreiben kannst.
Kannst du das? Erst dann geht's weiter.

> z.B. um die Verstärkung einzustellen. Da verschiedene Einstellungen
> sind.
> Oder wie kann ich die Farben bzw. die Werte dazu auslesen.
> Es ist eine 16 Bit Zahl, doch wo stehen sie?


Welche Werte in welchem Register nun was genau bewirken steht auch im 
Datenblatt. Da ist jeder Register beschrieben und was der tut.
Wenn es sich um 16 Bit zahlen handelt, findet man die in 2 Registern.

Auch das steht im Datenblatt. Aber du solltest es der Reihe nach 
angehen.
Gast #4901795
Lesenswert?

Mit dem beschreiben von Registern, z.B. den PCF8591 (AD-DA Wandler)habe 
ich keine Probleme. Im oberen Beispiel habe ich bereits gezeigt, wie man 
es machen kann. Je nach Anzahl der Register können noch mehrere Angaben 
folgen.
Fragender Gast schrieb:
> i2c_start(TCS_w);
>   i2c_write(0x1f);     //Wert in Register
>   i2c_stop();
Mache es z.B. bei einem Display so:
1
i2c_start(slave_adresse_1);
2
  i2c_write(DC1);    // DC1
3
  i2c_write(0x04);  // 04 
4
  i2c_write(ESC);    // ESC
5
  i2c_write('Z');    // Z
6
  i2c_write('F');    // F
7
  i2c_write(a);
Im genannten Beispiel sind DC1, Z und F verschiedene Befehle zur 
Darstellung von verschiedenen Fonts oder Rahmen.
Komme mit dem I2C bus schon soweit klar. Auch mit der Abfrage ob ein 
Busteilnehmer vorhanden ist,z.B. so:

Fragender Gast schrieb:
> ret = i2c_start(MCP_w);          // Start Lesen
>   if (ret == 0)
>   {                         // Wenn ?? ein OK sendet...
>     msb_temp = i2c_readAck();    //...speichere oberes Bit
>     lsb_temp = i2c_readNak();    //...speichere unteres Bit
>   }
>   else                                // Fehlererkennung
>   {                              // Wenn ?? kein OK sendet
>     lcd_command(LCD_CLEAR);      // Leere Display
>     lcd_printlc(1,13,"READ");    // "Lesevorgang"
>     lcd_printlc(2,13,"NOK");    // "Nicht OK (NOK)"
>   }

Es ist auch das auslesen einer 16 Bit Zahl dabei. Das Bitschieben habe 
ich hier nicht drin. Die Auswertung ist wieder was anderes.
Komme also mit dem Bus klar. Versteh es bei diesem IC nicht. 
Wahrscheinlich denke ich in die falsche Richtung und es fehlt nur ein 
Anstoss zum Verständnis
LG frg

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren