16F819とRGBセンサーを組み合わせる方法について②

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ひよたん

16F819とRGBセンサーを組み合わせる方法について②

#1

投稿記事 by ひよたん » 6年前

こんにちは以前“16F819とRGBセンサーを組み合わせる方法について”のスレッドを立てました。皆さんのアドバイス嬉しかったです。その延長でRGBセンサーから得た数値をPRINT(PCに)しようとしたのですが、やっぱり自分の知識だとうまくいきませんでした。
継続して数値がでず、また右斜めに表示され、数値もラキーボードを打たないと表示されません。

i2c のaddress 構成に問題があるのでしょうか?
それともPrintのコードに?? (MP LAB X ICE とICD3でプログラミングしてます)
もしくは配線に問題が??? 

画像
画像
配線は
RGB センサー(TCS34725センサー)と PCA9306搭載 I2C用ロジックレベル変換ボードを SCLとSDAにつなげ、
5vを3.3vにするため VKLSVAN DC 3.3V 電源モジュール AMS1117-3.3Vを使いました。
RS232でPCとPICを繋げています。


https://www.switch-science.com/catalog/1522/



ちょっとした気づき、指摘などすごくありがたいです! どうかご教示ください!
よろしくおねがいいたします!

コード:

/* 
 * File:   main.c
 * Author: dt15rrh
 *
 * Created on 06 February 2019, 09:44
 */

#include<16F819.h>
#device adc=10  //ANALOGUE-DIGITAL-CONVERTER 10 BIT

#FUSES NOWDT,INTRC_IO,NOPUT,NOMCLR,NOBROWNOUT,NOLVP,NOWRT,NODEBUG,NOPROTECT

#use delay(clock=8000000)
#use rs232(baud=9600,xmit=PIN_B2,rcv=PIN_A1,STREAM=PC) //XMIT=TX PIN RCV=RX PIN
#use i2c(master,sda=PIN_B1,scl=PIN_B4,FORCE_HW)


// RGB Sensor=TCS34725 7 Bit Address 0x29 = 7bit+R/W bit
#define sensor_Write_address (0x52)
#define sensor_Read_address (0x53)


void int_Colour_Sensor(sLED){
    
    output_high(sLED);
    delay_ms(50);
    
//Configure ID 
    i2c_start();                     //START CONDITION
    i2c_write(sensor_Write_address); //SLAVE ADDRESS (0X29)
    i2c_read(0x12|0x80);             //READ ONLY BIT (ID REGISTER 0x12)
    i2c_stop();                      //STOP CONDITION
    
//Configure Status
    i2c_start();                     //START CONDITION
    i2c_write(sensor_Write_address); //SLAVE ADDRESS (0x29)
    i2c_read(0x13|0x80);            //COMMAND BIT (0x80)
                                      //READ ONLY BIT (STATUS REGISTER 0x13)
    i2c_stop();                      //STOP CONDITION
    

//Configure RGBC Time
    i2c_start();                     //START CONDITION
    i2c_write(sensor_Write_address); //SLAVE ADDRESS (0x29)
    i2c_write(0x01|0x80);            //COMMAND BIT (ATIME, RGBC time=0x01) 
    i2c_write(0x00);                 //MAX COUNT 65535 (0x00)
    i2c_stop();                      //STOP CONDITION
    

//Configure WLong
    i2c_start();                     //START CONDITION
    i2c_write(sensor_Write_address); //SLAVE ADDRESS (0x29)
    i2c_write(0x0D|0x80);            //COMMAND BIT (CONFIGURATION REGISTER=0x0D) 
    i2c_write(0x02);                 //ENABLE WLONG (0x02)
    i2c_stop();                      //STOP CONDITION   
    

//Configure Wait Time
    i2c_start();                     //START CONDITION
    i2c_write(sensor_Write_address); //SLAVE ADDRESS (0x29)
    i2c_write(0x03|0x80);            //COMMAND BIT (WTIME, WAIT time=0x03) 
    i2c_write(0x00);                 //MAX WAIT TIME (0x00)
    i2c_stop();                      //STOP CONDITION   
       

// Configure Control Register
    i2c_start();                     //START CONDITION
    i2c_write(sensor_Write_address); //SLAVE ADDRESS (0x29)
    i2c_write(0x0F|0x80);            //COMMAND BIT (CONTROL REGISTER=0x0F) 
    i2c_write(0x00);                 //AGAIN (0x00)
    i2c_stop();                      //STOP CONDITION   
    
    delay_ms(50);
}


//FUNCTIONS

void Write_Colour_Sensor(int8 address,int8 data){
    i2c_start();
    i2c_write(sensor_Write_address);
    i2c_write(address);
    i2c_write(data);
    i2c_stop();
    
}


//READ SENSOR
void Read_Colour_Sensor(){
    
    i2c_start();                     //MASTER TO SLAVE 
    i2c_write(sensor_Write_address); //SLAVE ADDRESS (0x29)
    i2c_read(1);                    // READ ONLY
    i2c_write(0);                   
}

void Read_RGB(unsigned int* r, unsigned int* g, unsigned int* b){
   
    unsigned int tmp;
    
    i2c_start();                     //MASTER TO SLAVE 
    i2c_write(sensor_Write_address); //SLAVE ADDRESS (0x29)
    i2c_write(0x16|0x20|0x80);       //RDATAL REGISTER (0x16),AUTO INCREMENT
    
    
    i2c_start();                    //START CONDITIONZ
    i2c_write(sensor_Read_address); //READ
    
    tmp = i2c_read();               //RDATAL REGISTER
    *r = (tmp<<8)|i2c_read();       //RDATAH REGISTER
    
    tmp = i2c_read();               //GDATAL REGISTER
    *g = (tmp<<8)|i2c_read();       //GDATAH REGISTER
    
    tmp = i2c_read();               //BDATAL REGISTER
    *b = (tmp<<8)|i2c_read();       //BDATAH REGISTER
    
    i2c_stop();                     //STOP CONDITION
}


//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//PRINT VALUE

int main(){
    unsigned int *r,*g,*b, tmp;
  
    for(;;){
        *r=fgetc(PC);
        fprintf(PC,"\n%u\n",*r);
        
        delay_ms(5);
        
        *g=fgetc(PC);
        fprintf(PC,"\n%u\n",*g);
        delay_ms(5);
        
        *b=fgetc(PC);
        fprintf(PC,"\n%u\n",*b);
        delay_ms(5);
       
    
    }
    return 0; 
    
}

/*アドレス詳細
#define TCS34725_ADDRESS(0x29)  //SLAVE ADDRESS =41
#define TCS34725_COMMAND_BIT(0x80) //SPECIFIES REGISTER ADDRESS
#define TCS34725_ENABLE(0x00) //ENABLE REGISTER 
#define TCS34725_PON(0x01)    //POWER ON
#define TCS34725_CONTROL(0x0F) //CONTROL REGISTER
#define TCS34725_ID(0x12)     //ID REGISTER =68
#define TCS34725_STATUS(0x13)  //STATUS REGISTER
#define TCS34725_CDATAL(0x14) //CLEAR LEAST BYTE 
#define TCS34725_CDATAH(0x15) //CLEAR MOST BYTE
#define TCS34725_RDATAL(0x16) //RED LEAST BYTE
#define TCS34725_RDATAH(0x17) //RED MOST BYTE
#define TCS34725_GDATAL(0x18) //GREEN LEAST BYTE
#define TCS34725_GDATAH(0x19) //GREEN MOST BYTE
#define TCS34725_BDATAL(0x1A) //BLUE LEAST BYTE
#define TCS34725_BDATAH(0x1B) //BLUE MOST BYTE
*/


アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 16F819とRGBセンサーを組み合わせる方法について②

#3

投稿記事 by みけCAT » 6年前

ひよたんさんはこのコードでRGBセンサーから読み取った値を出力できそうだと思っていますか?
それとも、わからないので適当に書いただけですか?
ひよたん さんが書きました:
6年前
継続して数値がでず、
数値もラキーボードを打たないと表示されません。
fgetcで入力待ちをしているので、当然ですね。
「ラキーボード」というのがよくわかりませんが、PCのキーボードのことでしょうか?
ひよたん さんが書きました:
6年前
また右斜めに表示され、
ターミナルソフトの設定でLFを改行とみなすようにするか、\nの代わりに\r\nを用いるようにすると改善されるでしょう。
(\r → カーソルを左端に戻す、 \n → カーソルを次の行に進める)
ひよたん さんが書きました:
6年前
i2c のaddress 構成に問題があるのでしょうか?
main関数から実行が開始されると仮定すると、i2cは全くいじっていないので、関係ないでしょう。
ひよたん さんが書きました:
6年前
それともPrintのコードに?? (MP LAB X ICE とICD3でプログラミングしてます)
「Printのコード」が何のことかよくわからないので、わかりません。
ひよたん さんが書きました:
6年前
もしくは配線に問題が??? 
RS232の通信はできているようですし、i2cは全くいじっていないようなので、関係ないでしょう。

C言語においては、エントリポイント(通常main関数)以外の関数は、基本的に呼び出さないと実行されません。
したがって、せっかくi2cを用いる関数を定義したのに、全く生かされていません。

また、main関数内において、ポインタr、g、bが初期化されないままデリファレンスされています。
PICに保護機構が無いために強制終了にはならないかもしれませんが、
予期せぬデータ(周辺機器の設定を含む)の破壊に繋がる可能性があり、危険です。
C言語でPICのプログラミングをしようとする前に、まずC言語自体を学ぶべきかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

返信

“C言語何でも質問掲示板” へ戻る