右側のほうのセンサLPC1114FN28 fumiya版
Dependencies: IRM2121_2 Ping mbed HMC6352 Watchdog
Fork of CatPot_SensorRight by
Diff: main.cpp
- Revision:
- 5:a41471351ae3
- Parent:
- 4:bac44e117fce
- Child:
- 6:f64989ad4746
--- a/main.cpp Mon Feb 23 09:39:33 2015 +0000 +++ b/main.cpp Tue Feb 24 05:36:15 2015 +0000 @@ -7,6 +7,7 @@ #include "mbed.h" + #define SYSAHBCLKDIV_Val 0x00000001 // Reset: 0x001 #define CLOCK_SETUP 1 // デフォルト=1 #define SYSPLLCTRL_Val 0x00000023 // デフォルト=23 Reset: 0x000 @@ -15,6 +16,7 @@ #include "IRM2121.h" #include "Ping.h" +#include "WatchDogTimer.h" #define PING_COUNT 5 //5回に1回にPing処理 #define IR_LEVEL 400 //irのしきい値 @@ -29,7 +31,7 @@ I2CSlave Mbed(dp5,dp27);//sda,scl Serial pc(USBTX,USBRX); - + /*irm2121平均化*/ uint8_t IrMoving_ave(uint8_t num, int data){ static unsigned int sum[10]; @@ -89,10 +91,10 @@ } /*周回の初期動作*/ -void ResetSet(uint8_t *PingCk){ +void ResetSet(uint8_t *PingCk, uint8_t *IrCk){ Led = 1;//周回の初め - PingCk ++; + //PingCk ++; } @@ -103,16 +105,18 @@ /*begin SetUp*/ //default Mbed.frequency(); Mbed.address(I2C_ADDRESS); - + Watchdog g; + g.kick(1.0f);//1秒でWDT発生 /*end Setup*/ /*Count*/ uint8_t PingCk = 0; + uint8_t IrCk = 0; /*Data*/ uint8_t PingData[2] = {0}; - int IrTemp[6] = {0}; //仮置き場 + unsigned long IrTemp[6] = {0}; //仮置き場 uint8_t IrData[3]; // irのデータ /*State(operate_value etc...)*/ @@ -120,32 +124,47 @@ /* I2Cdata*/ char SendData[9]={0}; - char AddressData = 0; + char AddressData[1] = {0}; /*Debug valiable*/ bool valid = 0,busy = 0; while(1) { - ResetSet(&PingCk); + ResetSet(&PingCk,&IrCk); + Ir[IrCk].Set(); + wait_ms(20); + IrTemp[IrCk] = Ir[IrCk].Read(); + + /* Ir[0].Set(); Ir[1].Set(); Ir[2].Set(); + Ir[3].Set(); Ir[4].Set(); Ir[5].Set(); - - wait_ms(80);//wait値は最適値を探す必要がある. + */ + //wait_ms(60);//wait値は最適値を探す必要がある. /*8bit*/ - - IrTemp[0] = (IR_LEVEL - Ir[0].Read())*255/400; - IrTemp[1] = (IR_LEVEL - Ir[1].Read())*255/400; - IrTemp[2] = (IR_LEVEL - Ir[2].Read())*255/400; + /* + IrData[0] = (IR_LEVEL - Ir[0].Read())*255/400; + IrData[1] = (IR_LEVEL - Ir[1].Read())*255/400; + IrData[2] = (IR_LEVEL - Ir[2].Read())*255/400; IrTemp[3] = (IR_LEVEL - Ir[3].Read())*255/400; IrTemp[4] = (IR_LEVEL - Ir[4].Read())*255/400; IrTemp[5] = (IR_LEVEL - Ir[5].Read())*255/400; + */ + /* + IrTemp[0] = Ir[0].Read(); + IrTemp[1] = Ir[1].Read(); + IrTemp[2] = Ir[2].Read(); + IrTemp[3] = Ir[3].Read(); + IrTemp[4] = Ir[4].Read(); + IrTemp[5] = Ir[5].Read(); + */ /* Ir[0].ReturnVB(&valid,&busy); pc.printf("valid %d, busy %d \n\r",valid, busy); @@ -161,7 +180,7 @@ */ - IrDataSelect(IrTemp,IrData); + //IrDataSelect(IrTemp,IrData); /* if(PingCk >= PING_COUNT){ @@ -173,24 +192,47 @@ PingCk = 0; } */ - I2CState = Mbed.receive(); + switch(I2CState){ case I2CSlave::ReadAddressed: + + if(AddressData[0]){ + switch(AddressData[0]){ + case 0x01://ping + SendData[0] = (char)PingData[0]; + SendData[1] = (char)PingData[1]; + Mbed.write(SendData, 2); + break; + case 0x02://IR + SendData[0] = (char)IrData[0]; + SendData[1] = (char)IrData[1]; + SendData[2] = (char)IrData[2]; + Mbed.write(SendData, 3); + break; + + + default: + break; + } + } - - Mbed.write(SendData, 9); + AddressData[0] = 0; break; case I2CSlave::WriteGeneral: - Mbed.read(SendData, 9); + Mbed.read(AddressData,1); break; case I2CSlave::WriteAddressed: break; } - Led = 0; - - //wait(0.5); + pc.printf("%d \t %d \n",IrTemp[0],IrTemp[1]); + IrCk ++; + if(IrCk > 5){ + IrCk = 0; + + } + //wait(0.1); } }