MCP3204をSTM303K8T6で同時に6個使ってみた
Dependencies: mbed 24LC1025 MCP3204
Diff: main.cpp
- Revision:
- 3:99c659d89698
- Parent:
- 2:133b3bf22850
- Child:
- 4:56d1f3a81b30
diff -r 133b3bf22850 -r 99c659d89698 main.cpp --- a/main.cpp Wed Aug 05 06:44:23 2020 +0000 +++ b/main.cpp Wed Sep 09 08:07:13 2020 +0000 @@ -1,8 +1,9 @@ #include "mbed.h" #include "MCP3204.h" +#include "24LC1025.h" Serial pc(PA_2, PA_3, 115200); //pin19,20 TX,RX -CAN can(PA_11, PA_12,100000); //pin21,22 rd,td +CAN can(PA_11, PA_12); //pin21,22 rd,td SPI spi(PA_7, PA_6, PA_5); MCP3204 mcp1(spi,PB_0); //下z- MCP3204 mcp2(spi,PB_1); //右x+ @@ -10,21 +11,36 @@ MCP3204 mcp4(spi,PA_8); // 前y+ MCP3204 mcp5(spi,PA_10); //上z+ MCP3204 mcp6(spi,PF_0); //後y- +LC1025 eeprom = LC1025(PB_7, PB_6); +DigitalOut led(PB_5); + CANMessage msg; #define T 0.03 +float cal_x=0,cal_y=0,cal_z=0; +int i,j,cnt=0,page_frg=0; +float world_time; +uint16_t eeprom_cnt = 0x0000; +char serialData[4]; + union Float2Byte{ float _float; char _byte[4]; }; typedef union Float2Byte Float2Byte; +union Int2Byte{ + unsigned short _int; + char _byte[2]; +}; +typedef union Int2Byte Int2Byte; + + void send(float senddata,int id){ //pc.printf("Master send()\n\r"); - /*ID: 0x01*/ Float2Byte sendFloat; sendFloat._float = senddata; //ここに送りたい値を入れる. @@ -40,18 +56,100 @@ } } +void send2(unsigned short senddata1,unsigned short senddata2,unsigned short senddata3,int id){ + //pc.printf("Master send()\n\r"); + + /*ID: 0x01*/ + Int2Byte sendInt; + sendInt._int = senddata1; + //ここに送りたい値を入れる. + + char serialData[6]; + + serialData[0] = sendInt._byte[0]; + serialData[1] = sendInt._byte[1]; + //pc.printf("send_char: %d\n\r", serialData[i]); + sendInt._int = senddata2; + serialData[2] = sendInt._byte[0]; + serialData[3] = sendInt._byte[1]; + + sendInt._int = senddata3; + serialData[4] = sendInt._byte[0]; + serialData[5] = sendInt._byte[1]; + //pc.printf("sendFloat: %f\n\r", sendFloat._float); + if(can.write(CANMessage(id, serialData, 6))){ + //pc.printf("Send.\n\r"); + } +} + void receive(){ Float2Byte getFloat; + Int2Byte getInt; + led = 0; if(can.read(msg)){ - /*ID: 0x01*/ + //ID: 0x01 if(msg.id == 0x01){ //pc.printf("ID: 0x01\n\r"); for(int i=0;i<4;++i){ getFloat._byte[i] = msg.data[i]; //pc.printf("get_char: %d\n\r", getFloat._byte[i]); } - pc.printf("world_time:%.2f\r\n", getFloat._float); + world_time = getFloat._float; + pc.printf("world_time:%.2f\r\n", world_time); + } + + if(msg.id == 0x02){ + //pc.printf("ID: 0x02\n\r"); + getInt._byte[0] = msg.data[0]; + getInt._byte[1] = msg.data[1]; + cal_x=(float)getInt._int /10.0f; + pc.printf("Mag:%.2f", cal_x); + + getInt._byte[0] = msg.data[2]; + getInt._byte[1] = msg.data[3]; + cal_y=(float)getInt._int /10.0f; + pc.printf(",%.2f", cal_y); + + getInt._byte[0] = msg.data[4]; + getInt._byte[1] = msg.data[5]; + cal_z=(float)getInt._int /10.0f; + pc.printf(",%.2f\r\n", cal_z); + + if(page_frg == 0){ + *(float*)serialData=0.0f; + eeprom.PageWrite(ADDRESS_24LC1025_BLOCK0,eeprom_cnt,serialData,4); + *(float*)serialData=cal_x; + eeprom.PageWrite(ADDRESS_24LC1025_BLOCK0,eeprom_cnt,serialData,4); + *(float*)serialData=cal_y; + eeprom.PageWrite(ADDRESS_24LC1025_BLOCK0,eeprom_cnt,serialData,4); + *(float*)serialData=cal_z; + eeprom.PageWrite(ADDRESS_24LC1025_BLOCK0,eeprom_cnt,serialData,4); + *(float*)serialData=world_time; + eeprom.PageWrite(ADDRESS_24LC1025_BLOCK0,eeprom_cnt,serialData,4); + *(float*)serialData=0.0f; + eeprom.PageWrite(ADDRESS_24LC1025_BLOCK0,eeprom_cnt,serialData,4); + //pc.printf("%d,0x%x\r\n",page_frg,eeprom_cnt); + }else if(page_frg == 1){ + *(float*)serialData=0.0f; + eeprom.PageWrite(ADDRESS_24LC1025_BLOCK1,eeprom_cnt,serialData,4); + *(float*)serialData=cal_x; + eeprom.PageWrite(ADDRESS_24LC1025_BLOCK1,eeprom_cnt,serialData,4); + *(float*)serialData=cal_y; + eeprom.PageWrite(ADDRESS_24LC1025_BLOCK1,eeprom_cnt,serialData,4); + *(float*)serialData=cal_z; + eeprom.PageWrite(ADDRESS_24LC1025_BLOCK1,eeprom_cnt,serialData,4); + *(float*)serialData=world_time; + eeprom.PageWrite(ADDRESS_24LC1025_BLOCK1,eeprom_cnt,serialData,4); + *(float*)serialData=0.0f; + eeprom.PageWrite(ADDRESS_24LC1025_BLOCK1,eeprom_cnt,serialData,4); + //pc.printf("%d,0x%x\r\n",page_frg,eeprom_cnt); + }else{ + //pc.printf("EEPROM_ERROR!! You should erase memory\r\n"); + } + eeprom_cnt = 0x18 + eeprom_cnt; + + } if(msg.id == 0x03){ @@ -62,17 +160,27 @@ } pc.printf("ID0x03:%.2f\r\n", getFloat._float); } + + if(msg.id == 0x04){ + //pc.printf("ID: 0x01\n\r"); + for(int i=0;i<4;++i){ + getFloat._byte[i] = msg.data[i]; + //pc.printf("get_char: %d\n\r", getFloat._byte[i]); + } + pc.printf("ID0x04:%.2f\r\n", getFloat._float); + } } + led=1; } int main(){ int adc1[4],adc2[4],adc3[4],adc4[4],adc5[4],adc6[4]; - int i,j,cnt; float ave[6],buff; can.attach(receive, CAN::RxIrq); - pc.printf("Hello world\r\n"); + pc.printf("Hello world%d\r\n",sizeof(i)); + led = 1; wait(1.0); while(1){ @@ -217,29 +325,52 @@ */ cnt = 0; - if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] < ave[0])pc.printf("x:0,y:0,z:0\r\n"); - //else if(ave[1] < ave[2] && ave[3] < ave[5] && ave[4] < ave[0])pc.printf("x:90,y:0,z:0\r\n"); - else if(ave[1] < ave[2] && ave[3] < ave[5] && ave[4] > ave[0])pc.printf("x:180,y:0,z:0\r\n"); - //else if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] > ave[0])pc.printf("x:270,y:0,z:0\r\n"); - - else if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] < ave[0])pc.printf("x:0,y:0,z:0\r\n"); - //else if(ave[1] < ave[2] && ave[3] < ave[5] && ave[4] < ave[0])pc.printf("x:0,y:0,z:90\r\n"); - else if(ave[1] > ave[2] && ave[3] < ave[5] && ave[4] < ave[0])pc.printf("x:0,y:0,z:180\r\n"); - //else if(ave[1] > ave[2] && ave[3] > ave[5] && ave[4] < ave[0])pc.printf("x:0,y:0,z:270\r\n"); - else if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] < ave[0])pc.printf("x:0,y:0,z:0\r\n"); - //else if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] > ave[0])pc.printf("x:0,y:90,z:0\r\n"); - else if(ave[1] > ave[2] && ave[3] > ave[5] && ave[4] > ave[0])pc.printf("x:0,y:180,z:0\r\n"); - //else if(ave[1] > ave[2] && ave[3] > ave[5] && ave[4] > ave[0])pc.printf("x:0,y:270,z:0\r\n"); - - else pc.printf("none\r\n"); + if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] < ave[0]){ + send2((unsigned short)(0.0f+cal_x),(unsigned short)(0.0f+cal_y),(unsigned short)(0.0f+cal_z),6); + //else if(ave[1] < ave[2] && ave[3] < ave[5] && ave[4] < ave[0])pc.printf("x:90,y:0,z:0\r\n"); + }else if(ave[1] < ave[2] && ave[3] < ave[5] && ave[4] > ave[0]){ + send2((unsigned short)(180.0f+cal_x),(unsigned short)(0.0f+cal_y),(unsigned short)(0.0f+cal_z),6); + //else if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] > ave[0])pc.printf("x:270,y:0,z:0\r\n"); + }else if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] < ave[0]){ + send2((unsigned short)(0.0f+cal_x),(unsigned short)(0.0f+cal_y),(unsigned short)(0.0f+cal_z),6); + //else if(ave[1] < ave[2] && ave[3] < ave[5] && ave[4] < ave[0])pc.printf("x:0,y:0,z:90\r\n"); + }else if(ave[1] > ave[2] && ave[3] < ave[5] && ave[4] < ave[0]){ + send2((unsigned short)(0.0f+cal_x),(unsigned short)(0.0f+cal_y),(unsigned short)(180.0f+cal_z),6); + //else if(ave[1] > ave[2] && ave[3] > ave[5] && ave[4] < ave[0])pc.printf("x:0,y:0,z:270\r\n"); + }else if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] < ave[0]){ + send2((unsigned short)(0.0f+cal_x),(unsigned short)(0.0f+cal_y),(unsigned short)(0.0f+cal_z),6); + //else if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] > ave[0])pc.printf("x:0,y:90,z:0\r\n"); + }else if(ave[1] > ave[2] && ave[3] > ave[5] && ave[4] > ave[0]){ + send2((unsigned short)(0.0f+cal_x),(unsigned short)(180.0f+cal_y),(unsigned short)(0.0f+cal_z),6); + //else if(ave[1] > ave[2] && ave[3] > ave[5] && ave[4] > ave[0])pc.printf("x:0,y:270,z:0\r\n"); + }else{ + pc.printf("none\r\n"); + } + pc.printf("%d,%x,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f\r\n",page_frg,eeprom_cnt,ave[1],ave[2],ave[3],ave[5],ave[4],ave[0]); + for(i=0; i<6; i++){ + *(float*)serialData = ave[i]; + //pc.printf("%f,",ave[i]); + if(eeprom_cnt > 0xFFF0){ + page_frg++; + eeprom_cnt = 0; + } - - pc.printf("%.1f,%.1f,%.1f,%.1f,%.1f,%.1f\r\n",ave[1],ave[2],ave[3],ave[5],ave[4],ave[0]); - - - wait(0.5); + if(page_frg == 0){ + eeprom.PageWrite(ADDRESS_24LC1025_BLOCK0,eeprom_cnt,serialData,4); + //pc.printf("%d,0x%x\r\n",page_frg,eeprom_cnt); + }else if(page_frg == 1){ + eeprom.PageWrite(ADDRESS_24LC1025_BLOCK1,eeprom_cnt,serialData,4); + //pc.printf("%d,0x%x\r\n",page_frg,eeprom_cnt); + }else{ + //pc.printf("EEPROM_ERROR!! You should erase memory\r\n"); + } + eeprom_cnt = 0x04 + eeprom_cnt; + wait(0.01); + + } + wait(0.1); } }