can_main

Dependencies:   mbed CanMsga

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