史也 菅
/
I2c_slave
encslave
main.cpp
- Committer:
- kurobikari
- Date:
- 2019-12-07
- Revision:
- 1:7945cd701d0d
- Parent:
- 0:6322c2c7148c
- Child:
- 2:2ee241819861
File content as of revision 1:7945cd701d0d:
#include "mbed.h" #define SDA PB_7 #define SCL PB_6 /*クラス宣言*/ I2CSlave slave(SDA, SCL); Serial pc(USBTX, USBRX); /*In,Out宣言*/ DigitalOut CS (PA_1); DigitalOut CLK (PA_2); DigitalIn Do (PB_5); DigitalOut led[4]={PA_4,PA_5,PA_6,PA_7}; DigitalOut k (PB_3); /*変数宣言*/ unsigned long data = 0; char msg[5]={0}; int enc_deg[2]; //角度を保存する変数 int cnt = 0; //割り込んだ回数を保存する long deg = 0; //DOの値を保存 int64_t sent_data=0; int main() { msg[0]=0; msg[1]=0; slave.frequency(100000); int receive; slave.address(1); while(1) { receive = slave.receive(); //cntが偶数の場合の処理 if (cnt % 2 == 0) { if (cnt == 0) { CS=0; data = 0; } CLK=1; } //cntが奇数の場合の処理 else { if (cnt != 1) data |= Do; //cntが1ではない時の処理 //cntが25ではない時の処理 if (cnt != 25) { data <<= 1; CLK=0; } //cntが25の時の処理 else { /* 前回の値更新 今回の値更新(エンコーダの値(0?4096)を角度(0?360)に) */ enc_deg[1] = enc_deg[0]; enc_deg[0] = data * 360 / 4096; /* 前回270度以上,今回90度より小さい… 359→0を跨いだ時 前回の値を0から逆回転で負の値で表記 */ if ((270 <= enc_deg[1] ) && (enc_deg[0] < 90)) enc_deg[1] -= 360; /* 0→359を跨いだ時, 前回の値を360以上の値で表記 */ else if ((enc_deg[1] < 90) && (270 <= enc_deg[0])) enc_deg[1] += 360; deg += enc_deg[0] - enc_deg[1]; sent_data=deg; CS=1; if(receive){ msg[0]=sent_data; msg[1]=sent_data>>8; msg[2]=sent_data>>16; msg[3]=sent_data>>24; slave.write(msg,4); } /* LEDの管理 */ static int LED_cnt=0; static int LED_flag=0; static long log[2]={0}; /* logデータの更新 */ log[1]=log[0]; log[0]=sent_data<<24|sent_data<<16|sent_data<<8|sent_data; /* 変化の正負に応じてLED点灯 */ if((log[0]-log[1])>1)led[0]=1; else led[0]=0; if(((log[0]-log[1])<0?-1:1)*(log[0]-log[1])<=1) led[1]=1; else led[1]=0; if((log[1]-log[0])>1) led[2]=1; else led[2]=0; LED_cnt++; LED_cnt%=10; if(LED_cnt==0) LED_flag++; LED_flag%=2; if(LED_flag) led[3]=1; else led[3]=0; } } cnt++; cnt %= 26; } }