Bueno realmente no puedo quitarme la tentación de aportar algo al foro y pues como parte de mi proyecto de tesis es trabajar con el TCS230 aqui les dejo mis avances es algo general ya que yo estoy trabajando en otras cosas pero me ha servido mucho de guia este programita. Esta escrito en VB6 y funciona con el puerto COM1 les dejo el codigo que tengo hasta el momento y el primer ejecutable.
Del pic envio los datos con la siguiente instrucción:
printf ("R%LUOV%LUEA%LUZ.",FR, FV, FA);
en donde FR, FV y FA son las frecuencias del rojo, verde y azul respectivamente, mi pic siempre esta enviando esa información algo como: R746536OV745372EA637459Z. El programa toma la cadena y la decodifica uso una R y una O para encerrar la frecuencia del rojo; V y E para el verde; A y Z para el azul y un punto de fin de cadena.
El programa a veces marca error ya que no lo he depurado y pues solo lo ocupo para visualizar datos cierto tiempo no siempre y de mientras funciona, si alguien puede pulirlo o a lo mejor hay otra forma de adquirir los datos mas eficiente pues se acepta de todo.
Para leer frecuencia uso:
int32 lee_freq(void)
{
int cycles8, cycles;
int32 freq;
long freqc_high;
long freqc_low;
cycles8=0;
cycles=0;
freqc_high=0;
t1_overflow=0;
set_timer1(0);
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
while (cycles!=0xFF)
{
cycles8=0;
while (cycles8!=0xFF)
{
if (t1_overflow)
{
t1_overflow=0;freqc_high++;
}
else
{
delay_cycles(5);
}
delay_cycles(62);
cycles8++;
}
delay_cycles(216);
cycles++;
}
delay_cycles(211);
setup_timer_1(T1_DISABLED);
if (t1_overflow)
freqc_high++;
freqc_low=get_timer1();
freq=make32(freqc_high,freqc_low);
return (freq);
}
y para cambiar los filtro del TCS230 estan las funciones:
#define OE PIN_A4
void escala_100()
{
output_high(pin_A0);
output_high(pin_A1);
}
void escala_20()
{
output_high(pin_A0);
output_low(pin_A1);
}
void escala_2()
{
output_low(pin_A0);
output_high(pin_A1);
}
void apagar_sensor()
{
output_low(pin_A0);
output_low(pin_A1);
}
void sin_filtro (void)
{
output_high(pin_A2);
output_low(pin_A3);
}
void filtro_rojo (void)
{
output_low(pin_A2);
output_low(pin_A3);
}
void filtro_azul (void)
{
output_low(pin_A2);
output_high(pin_A3);
}
void filtro_verde (void)
{
output_high(pin_A2);
output_high(pin_A3);
}
Para transportar el programa y usar el puerto USB emulando el RS232 seria algo así.
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay(clock=48000000)
#include <usb_cdc.h>
int32 Fr, FV, FA;
void main()
{
// rutinas de inicialización
usb_cdc_init();
output_low(OE);
// Lectura de cada uno de los filtros
while (TRUE)
{
filtro_rojo();
FR=lee_freq();
filtro_verde();
FV=lee_freq();
filtro_azul();
FA=lee_freq();
// envia por puerto serie
printf(usb_cdc_putc,"R%LUOV%LUEA%LUZ.",FR, FV, FA);
}
}
Bueno es una base y es lo que hasta el momento tengo, espero que alguien pueda mejorarlo o se den ideas para hacerlo, yo afinare detalles en un futuro no muy lejano ya que me ha llamado mucho la atención trabajar con estos sensores y quisiera tener el tiempo para realizar mis propias pruebas
.
Ya habra tiempo para todo . . .
Saludos y hasta el siguiente post