//********************************************************************** /*   『RGBロガー』  ※デジタルカラーセンサ/S9706を使用し、RGBのデータをSDCに記録する。  ※記録データは、高感度(RGB)、低感度(RGB)の2種類とする。    <記録例>     H,1234,1234,1234,L,1234,1234,1234 */ //********************************************************************** #define SW PORTC.F0 #define LED PORTC.F2 #define CR 0x0d #define LF 0x0a #define ON 0 #define OFF 1 #define GATE PORTB.F4 #define CK PORTB.F5 #define RANGE PORTB.F6 #define DOUT PORTB.F7 //********************************************************************** void GetColor(short sensitivity, int addTime, unsigned int* pColor) { static unsigned int RED, GREEN, BLUE, tmp; static unsigned short cnt; // GATE = 0; CK = 0; RANGE = sensitivity; GATE = 1; for (; addTime > 0; addTime--) { Delay_ms(1); } GATE = 0; //赤色データの取り込み RED = 0; for (cnt = 0; cnt < 12; cnt++) { CK = 1; CK = 0; tmp = DOUT << cnt; RED |= tmp; } *pColor = RED; pColor++; //緑色データの取り込み GREEN = 0; for (cnt = 0; cnt < 12; cnt++) { CK = 1; CK = 0; tmp = DOUT << cnt; GREEN |= tmp; } *pColor = GREEN; pColor++; //青色データの取り込み BLUE = 0; for (cnt = 0; cnt < 12; cnt++) { CK = 1; CK = 0; tmp = DOUT << cnt; BLUE |= tmp; } *pColor = BLUE; } //********************************************************************** void init_adc() { //A/D変換の設定 ADCON1.PCFG3 = 1; ADCON1.PCFG2 = 0; ADCON1.PCFG1 = 1; ADCON1.PCFG0 = 0; } //********************************************************************** void init_sdc() { static short cnt; //SDC(MMC)の初期化 Spi_Init_Advanced(MASTER_OSC_DIV64, DATA_SAMPLE_MIDDLE, CLK_IDLE_LOW, LOW_2_HIGH); if (Mmc_Fat_Init(&PORTC, 6)) { while (1) { LED = ON; Delay_ms(100); LED = OFF; Delay_ms(100); } } Spi_Init_Advanced(MASTER_OSC_DIV16, DATA_SAMPLE_MIDDLE, CLK_IDLE_LOW, LOW_2_HIGH); for (cnt = 0; cnt < 3; cnt++) { LED = ON; Delay_ms(300); LED = OFF; Delay_ms(300); } } //********************************************************************** void main() { //変数の定義 static char buf[16]; static short mode; static double ad; static unsigned int color[3]; // OSCCON.IRCF2 = 1; OSCCON.IRCF1 = 1; OSCCON.IRCF0 = 1; //ポートの設定 TRISA = 0b01111111; TRISB = 0b10001111; TRISC = 0b00000001; //コンパレータは使用しない。 CMCON = 0b00000111; //A/D変換の設定 init_adc(); //変数の初期化 LED = OFF; mode = 0; //SDC(MMC)の初期化 init_sdc(); // while (1) { if ((mode == 0) && (SW == ON)) { while (SW == ON) { Delay_ms(100); } mode = 1; LED = ON; // Mmc_Fat_Assign("log.txt", 0xA0); Mmc_Fat_Rewrite(); Mmc_Fat_Write("$START\r\n", 8); } // if ((mode == 1) && (SW == ON)) { while (SW == ON) { Delay_ms(100); } mode = 0; LED = OFF; // Mmc_Fat_Write("$STOP\r\n", 7); } // if (mode == 1) { //カラーデータの取得(高感度) GetColor(1, 100, color); //赤色データ表示 WordToStr(color[0], buf); Mmc_Fat_Write("H,", 2); Mmc_Fat_Write(&buf[1], 4); //緑データ表示 WordToStr(color[1], buf); Mmc_Fat_Write(",", 1); Mmc_Fat_Write(&buf[1], 4); //青色データ表示 WordToStr(color[2], buf); Mmc_Fat_Write(",", 1); Mmc_Fat_Write(&buf[1], 4); //カラーデータの取得(低感度) GetColor(0, 100, color); //赤色データ表示 WordToStr(color[0], buf); Mmc_Fat_Write(",L,", 3); Mmc_Fat_Write(&buf[1], 4); //緑データ表示 WordToStr(color[1], buf); Mmc_Fat_Write(",", 1); Mmc_Fat_Write(&buf[1], 4); //青色データ表示 WordToStr(color[2], buf); Mmc_Fat_Write(",", 1); Mmc_Fat_Write(&buf[1], 4); // buf[0] = CR; buf[1] = LF; Mmc_Fat_Write(buf, 2); } } } //**********************************************************************