史也 菅
/
I2c_slave
encslave
Diff: main.cpp
- Revision:
- 0:6322c2c7148c
- Child:
- 1:7945cd701d0d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Dec 07 00:39:45 2019 +0000 @@ -0,0 +1,124 @@ +#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) { + + // +// // pc.printf("%d\n\r",deg); + 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(sent_data) + 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; + + + + + + + + } + +} \ No newline at end of file