Forum: Mikrocontroller und Digitale Elektronik Frage zu TCS 34725 - RGBC Sensor


von Fragender Gast (Gast)


Angehängte Dateien:

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

von Fragender Gast (Gast)


Lesenswert?

Sorry, noch was vergessen.
Habe vorher die Adresse mit einem Busscanner kontrolliert, wird korrekt 
erkannt und nutze die ermittelte Adresse.

von Jim M. (turboj)


Lesenswert?

Datasheet Seite 12 und Seite 14. Das erste geschriebene Byte nach der 
I²C Addresse enthält die Register Addresse in Bits 4..0.

von Fragender Gast (Gast)


Lesenswert?

Danke für die Info. Komme aber nicht so richtig weiter damit

von Cyblord -. (cyblord)


Lesenswert?

Fragender Gast schrieb:
> Danke für die Info. Komme aber nicht so richtig weiter damit

Was ist dir denn GENAU unklar?

von Fragender Gast (Gast)


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?

von Fragender Gast (Gast)


Lesenswert?

Hat keiner eine Info für mich?

von JensM (Gast)


Lesenswert?

Schau dir mal die arduino library Adafruit_TCS34725 an.

Da wird der Baustein initialisiert und auch die Verstärkung gesetzt.

Gruß
JensM

von Fragender Gast (Gast)


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?

von Cyblord -. (cyblord)


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.

von Fragender Gast (Gast)


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

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.