can_main

Dependencies:   mbed CanMsga

main.cpp

Committer:
kurobikari
Date:
2019-12-07
Revision:
0:6322c2c7148c
Child:
1:7945cd701d0d

File content as of revision 0:6322c2c7148c:

#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;
  

  
   

    
    
    }

}