史也 菅
/
I2c_slave
encslave
Diff: main.cpp
- Revision:
- 2:2ee241819861
- Parent:
- 1:7945cd701d0d
diff -r 7945cd701d0d -r 2ee241819861 main.cpp --- a/main.cpp Sat Dec 07 00:42:48 2019 +0000 +++ b/main.cpp Wed Sep 01 07:01:56 2021 +0000 @@ -1,122 +1,45 @@ #include "mbed.h" - -#define SDA PB_7 -#define SCL PB_6 +#include "can.h" +/* PCへのプリント用 */ +Serial pc(USBTX, USBRX); -/*クラス宣言*/ -I2CSlave slave(SDA, SCL); -Serial pc(USBTX, USBRX); - +/* CAN宣言 */ +YKNCT_MD_CAN MD(PA_11,PA_12,500000);//(rd , td, 周波数, 送信割り込み速度) -/*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(void) +{ + /* プリントのボーレート設定 */ + pc.baud(115200); + /* MD初期化 */ + MD.Init(0,MD_SMB); + MD.Init(1,MD_LAP); + MD.Init(2,MD_SMB); + MD.Init(3,MD_LAP); + MD.Init(4,MD_SMB); + MD.Init(5,MD_LAP); + MD.Init(6,MD_SMB); + MD.Init(7,MD_LAP); -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; - + /* MD実行 */ + MD.Set(0,100); + MD.Set(1,100); + MD.Set(2,100); + MD.Set(3,0); + MD.Set(4,0); + MD.Set(5,50); + MD.Set(6,0); + MD.Set(7,50); - 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; - + /* エンコーダ取得 */ + for(int i=0; i<8; i++) + pc.printf("%d ",MD.Get_enc(i)); + pc.printf("\n\r"); - - + } +} - - - } - -} \ No newline at end of file