Buenas tardes,
El caso es que he adquirido el modulo sensor de colores de 16 bits TCS3414 ( Adjunto datasheet ). Está claro que me falta programar el sensor y es aquí donde necesitaría un poco de ayuda. Utilizo el compilador CCS 5.025. Iré posteando y actualizando lo que lleve programado, aunque estoy un poco verde.
No pido que me hagáis el programa, ya que lo haré yo, pero sí que pido asesoramiento. Ya he buscado si existía el driver en internet pero me ha sido imposible.
Entiendo que el modulo utiliza fotodiodos como filtros ( 4 filtros rojos, 4 filtros verdes, 4 filtros azules y 4 sin filtro, formando un array de 8x2 ). Esos filtros llevan incorporados los convertidores A/D para conseguir el color detectado.
Mediante el bus I2C se puede controlar la escritura/lectura del sensor. Ahora el caso es ir definiendo los registros que contiene el sensor que si no me equivoco están enumerados en la siguiente figura:
De esos registros, creo que con solo configurar los registros de command, control, timing,gain y los ADC channels me vale para hacer correr el sensor.
Ahora bien, la dirección del sensor de colores en modo esclavo indica que es:
Address = 0111001 = 0x39
Registro commando
Corregidme si me equivoco pero interpreto que después de ubicar la dirección del esclavo debo mandar lo siguiente:
Bit 7: Debe ser 1 obligatorio.
Bit 6-5: Protocolo de comunicación. Interpreto que para leer/escribir byte a byte o toda la palabra. Alguien me puede aclarecer la diferencia entre esos protocolos?
Bit 4-0: La dirección del registro en el que leer o escribir
registro de control
la dirección del registro es 0x00, donde los 8 bits se define:
De manera que deduzco que:
Activar modulo : 00000011 ( 0x03 )
Desactivar modulo: 00000000 ( 0x00 )
Registro timming
Para seleccionar el tiempo de conversión de los canales A/D
Creo que con el modo de 12ms de tiempo de conversión me es suficiente por lo que quedaría configurado de la siguiente manera:
Registro timming = 00000000
Registro gain
Para configurar la sensibilidad del sensor, aunque no sé qué consigo… mayor sensibilidad, más detecta el cambio de las diferentes gammas del rojo por ejemplo?
Registro ADC channels
Lectura de los conversores A/D
El codigo para configurar el sensor ( falta terminarlo )
Visto así parece fácil, pero a la hora de trasladarlo al ccs se me hace un mundo... por eso pido asesoramiento.
Muchas gracias
El caso es que he adquirido el modulo sensor de colores de 16 bits TCS3414 ( Adjunto datasheet ). Está claro que me falta programar el sensor y es aquí donde necesitaría un poco de ayuda. Utilizo el compilador CCS 5.025. Iré posteando y actualizando lo que lleve programado, aunque estoy un poco verde.
No pido que me hagáis el programa, ya que lo haré yo, pero sí que pido asesoramiento. Ya he buscado si existía el driver en internet pero me ha sido imposible.
Entiendo que el modulo utiliza fotodiodos como filtros ( 4 filtros rojos, 4 filtros verdes, 4 filtros azules y 4 sin filtro, formando un array de 8x2 ). Esos filtros llevan incorporados los convertidores A/D para conseguir el color detectado.
Mediante el bus I2C se puede controlar la escritura/lectura del sensor. Ahora el caso es ir definiendo los registros que contiene el sensor que si no me equivoco están enumerados en la siguiente figura:

De esos registros, creo que con solo configurar los registros de command, control, timing,gain y los ADC channels me vale para hacer correr el sensor.
Ahora bien, la dirección del sensor de colores en modo esclavo indica que es:
Address = 0111001 = 0x39
Registro commando

Corregidme si me equivoco pero interpreto que después de ubicar la dirección del esclavo debo mandar lo siguiente:
Bit 7: Debe ser 1 obligatorio.
Bit 6-5: Protocolo de comunicación. Interpreto que para leer/escribir byte a byte o toda la palabra. Alguien me puede aclarecer la diferencia entre esos protocolos?
Bit 4-0: La dirección del registro en el que leer o escribir
registro de control
la dirección del registro es 0x00, donde los 8 bits se define:

De manera que deduzco que:
Activar modulo : 00000011 ( 0x03 )
Desactivar modulo: 00000000 ( 0x00 )
Registro timming

Para seleccionar el tiempo de conversión de los canales A/D
Creo que con el modo de 12ms de tiempo de conversión me es suficiente por lo que quedaría configurado de la siguiente manera:
Registro timming = 00000000
Registro gain
Para configurar la sensibilidad del sensor, aunque no sé qué consigo… mayor sensibilidad, más detecta el cambio de las diferentes gammas del rojo por ejemplo?

Registro ADC channels
Lectura de los conversores A/D

El codigo para configurar el sensor ( falta terminarlo )
Código:
#include<16F88.h>
#fuses NOMCLR
#fuses INTRC_IO
#fuses NOLVP
#fuses NOPROTECT
#fuses NOWDT
#use delay(internal=4000000)
#byte porta=0x05
#byte portb=0x06
#use i2c(Slave,Fast,sda=PIN_B1,scl=PIN_B4,address=0x39)
#define REGISTRO_CONTROL (0x00) ////////////////////////////////////////////////////////////////////////
#define REGISTRO_TIMING (0x01) // //
#define REGISTRO_INTERRUPT (0x02) // //
#define REGISTRO_INTSOURCE (0x03) // //
#define REGISTRO_ID (0x04) // //
#define REGISTRO_GAIN (0x07) // //
#define REGISTRO_LOWTHRESHOLD_LOWBYTE (0x08) // //
#define REGISTRO_LOWTHRESHOLD_HIGHBYTE (0x09) // //
#define REGISTRO_HIGHTHRESHOLD_LOWBYTE (0x0A) // //
#define REGISTRO_HIGHTHRESHOLD_HIGHBYTE (0x0B) // Definición de los registros de la tabla 2 //
#define REGISTRO_GREENLOW (0x10) // de la pagina 13 del datahseet. //
#define REGISTRO_GREENHIGH (0x11) // //
#define REGISTRO_REDLOW (0x12) // //
#define REGISTRO_REDHIGH (0x13) // //
#define REGISTRO_BLUELOW (0x14) // //
#define REGISTRO_BLUEHIGH (0x15) // //
#define REGISTRO_CLEARLOW (0x16) // //
#define REGISTRO_CLEARHIGH (0x17) ////////////////////////////////////////////////////////////////////////
#define COMANDO_TIMMING (0x81)
#define COMANDO_CONTROL (0x80)
#define COMANDO_GAIN (0x87)
#define POWER_ON (0x03) // Configuración registro control para activar el sensor
#define POWER_OFF (0x00) // Configuración registro control para desactivar el sensor
void main()
{
disable_interrupts(GLOBAL);
set_tris_a(0x00);
set_tris_b(0x00);
porta=0;
portb=0;
setup_oscillator(OSC_4MHZ);
enable_interrupts(GLOBAL);
i2c_start(); //Inicializa
i2c_write(0x39); // dirección del sensor
i2c_write(COMANDO_TIMMING); // registro configuracion timming
i2c_write(0x00); // registro configuracion timming a 12ms
i2c_stop(); //Finaliza
i2c_start(); //Inicializa
i2c_write(0x39); // dirección del sensor
i2c_write(COMANDO_GAIN); // registro configuracion gain
i2c_write(0x00); // registro configuracion gain a 1X y divide by 1
i2c_stop(); //Finaliza
i2c_start(); //Inicializa
i2c_write(0x39); // dirección del sensor
i2c_write(COMANDO_CONTROL); // registro configuracion control
i2c_write(POWER_ON); // Activación sensor
i2c_stop(); //Finaliza
while(1)
{
}
}
Visto así parece fácil, pero a la hora de trasladarlo al ccs se me hace un mundo... por eso pido asesoramiento.
Muchas gracias
Adjuntos
Última edición: