史也 菅
/
I2c_slave
encslave
main.cpp@1:7945cd701d0d, 2019-12-07 (annotated)
- Committer:
- kurobikari
- Date:
- Sat Dec 07 00:42:48 2019 +0000
- Revision:
- 1:7945cd701d0d
- Parent:
- 0:6322c2c7148c
- Child:
- 2:2ee241819861
encslave(real)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kurobikari | 0:6322c2c7148c | 1 | #include "mbed.h" |
kurobikari | 0:6322c2c7148c | 2 | |
kurobikari | 0:6322c2c7148c | 3 | #define SDA PB_7 |
kurobikari | 0:6322c2c7148c | 4 | #define SCL PB_6 |
kurobikari | 0:6322c2c7148c | 5 | |
kurobikari | 0:6322c2c7148c | 6 | |
kurobikari | 0:6322c2c7148c | 7 | /*クラス宣言*/ |
kurobikari | 0:6322c2c7148c | 8 | I2CSlave slave(SDA, SCL); |
kurobikari | 0:6322c2c7148c | 9 | Serial pc(USBTX, USBRX); |
kurobikari | 0:6322c2c7148c | 10 | |
kurobikari | 0:6322c2c7148c | 11 | |
kurobikari | 0:6322c2c7148c | 12 | /*In,Out宣言*/ |
kurobikari | 0:6322c2c7148c | 13 | DigitalOut CS (PA_1); |
kurobikari | 0:6322c2c7148c | 14 | DigitalOut CLK (PA_2); |
kurobikari | 0:6322c2c7148c | 15 | DigitalIn Do (PB_5); |
kurobikari | 0:6322c2c7148c | 16 | DigitalOut led[4]={PA_4,PA_5,PA_6,PA_7}; |
kurobikari | 0:6322c2c7148c | 17 | DigitalOut k (PB_3); |
kurobikari | 0:6322c2c7148c | 18 | /*変数宣言*/ |
kurobikari | 0:6322c2c7148c | 19 | unsigned long data = 0; |
kurobikari | 0:6322c2c7148c | 20 | char msg[5]={0}; |
kurobikari | 0:6322c2c7148c | 21 | int enc_deg[2]; //角度を保存する変数 |
kurobikari | 0:6322c2c7148c | 22 | int cnt = 0; //割り込んだ回数を保存する |
kurobikari | 0:6322c2c7148c | 23 | long deg = 0; //DOの値を保存 |
kurobikari | 0:6322c2c7148c | 24 | int64_t sent_data=0; |
kurobikari | 0:6322c2c7148c | 25 | |
kurobikari | 0:6322c2c7148c | 26 | |
kurobikari | 0:6322c2c7148c | 27 | |
kurobikari | 0:6322c2c7148c | 28 | int main() |
kurobikari | 0:6322c2c7148c | 29 | { |
kurobikari | 0:6322c2c7148c | 30 | msg[0]=0; |
kurobikari | 0:6322c2c7148c | 31 | msg[1]=0; |
kurobikari | 0:6322c2c7148c | 32 | slave.frequency(100000); |
kurobikari | 0:6322c2c7148c | 33 | int receive; |
kurobikari | 0:6322c2c7148c | 34 | slave.address(1); |
kurobikari | 0:6322c2c7148c | 35 | while(1) { |
kurobikari | 0:6322c2c7148c | 36 | |
kurobikari | 0:6322c2c7148c | 37 | receive = slave.receive(); |
kurobikari | 0:6322c2c7148c | 38 | //cntが偶数の場合の処理 |
kurobikari | 0:6322c2c7148c | 39 | if (cnt % 2 == 0) { |
kurobikari | 0:6322c2c7148c | 40 | if (cnt == 0) { |
kurobikari | 0:6322c2c7148c | 41 | CS=0; |
kurobikari | 0:6322c2c7148c | 42 | data = 0; |
kurobikari | 0:6322c2c7148c | 43 | } |
kurobikari | 0:6322c2c7148c | 44 | CLK=1; |
kurobikari | 0:6322c2c7148c | 45 | } |
kurobikari | 0:6322c2c7148c | 46 | |
kurobikari | 0:6322c2c7148c | 47 | //cntが奇数の場合の処理 |
kurobikari | 0:6322c2c7148c | 48 | else { |
kurobikari | 0:6322c2c7148c | 49 | if (cnt != 1) data |= Do; //cntが1ではない時の処理 |
kurobikari | 0:6322c2c7148c | 50 | //cntが25ではない時の処理 |
kurobikari | 0:6322c2c7148c | 51 | if (cnt != 25) { |
kurobikari | 0:6322c2c7148c | 52 | data <<= 1; |
kurobikari | 0:6322c2c7148c | 53 | CLK=0; |
kurobikari | 0:6322c2c7148c | 54 | } |
kurobikari | 0:6322c2c7148c | 55 | //cntが25の時の処理 |
kurobikari | 0:6322c2c7148c | 56 | else { |
kurobikari | 0:6322c2c7148c | 57 | /* 前回の値更新 |
kurobikari | 0:6322c2c7148c | 58 | 今回の値更新(エンコーダの値(0?4096)を角度(0?360)に) */ |
kurobikari | 0:6322c2c7148c | 59 | enc_deg[1] = enc_deg[0]; |
kurobikari | 0:6322c2c7148c | 60 | enc_deg[0] = data * 360 / 4096; |
kurobikari | 0:6322c2c7148c | 61 | |
kurobikari | 0:6322c2c7148c | 62 | /* 前回270度以上,今回90度より小さい… 359→0を跨いだ時 |
kurobikari | 0:6322c2c7148c | 63 | 前回の値を0から逆回転で負の値で表記 */ |
kurobikari | 0:6322c2c7148c | 64 | if ((270 <= enc_deg[1] ) && (enc_deg[0] < 90)) enc_deg[1] -= 360; |
kurobikari | 0:6322c2c7148c | 65 | |
kurobikari | 0:6322c2c7148c | 66 | /* 0→359を跨いだ時, |
kurobikari | 0:6322c2c7148c | 67 | 前回の値を360以上の値で表記 */ |
kurobikari | 0:6322c2c7148c | 68 | else if ((enc_deg[1] < 90) && (270 <= enc_deg[0])) enc_deg[1] += 360; |
kurobikari | 0:6322c2c7148c | 69 | |
kurobikari | 0:6322c2c7148c | 70 | deg += enc_deg[0] - enc_deg[1]; |
kurobikari | 0:6322c2c7148c | 71 | |
kurobikari | 0:6322c2c7148c | 72 | sent_data=deg; |
kurobikari | 0:6322c2c7148c | 73 | CS=1; |
kurobikari | 0:6322c2c7148c | 74 | |
kurobikari | 1:7945cd701d0d | 75 | |
kurobikari | 0:6322c2c7148c | 76 | if(receive){ |
kurobikari | 0:6322c2c7148c | 77 | |
kurobikari | 0:6322c2c7148c | 78 | msg[0]=sent_data; |
kurobikari | 0:6322c2c7148c | 79 | msg[1]=sent_data>>8; |
kurobikari | 0:6322c2c7148c | 80 | msg[2]=sent_data>>16; |
kurobikari | 0:6322c2c7148c | 81 | msg[3]=sent_data>>24; |
kurobikari | 0:6322c2c7148c | 82 | slave.write(msg,4); |
kurobikari | 0:6322c2c7148c | 83 | } |
kurobikari | 0:6322c2c7148c | 84 | |
kurobikari | 0:6322c2c7148c | 85 | /* LEDの管理 */ |
kurobikari | 0:6322c2c7148c | 86 | static int LED_cnt=0; |
kurobikari | 0:6322c2c7148c | 87 | static int LED_flag=0; |
kurobikari | 0:6322c2c7148c | 88 | static long log[2]={0}; |
kurobikari | 0:6322c2c7148c | 89 | |
kurobikari | 0:6322c2c7148c | 90 | /* logデータの更新 */ |
kurobikari | 0:6322c2c7148c | 91 | log[1]=log[0]; |
kurobikari | 0:6322c2c7148c | 92 | log[0]=sent_data<<24|sent_data<<16|sent_data<<8|sent_data; |
kurobikari | 0:6322c2c7148c | 93 | /* 変化の正負に応じてLED点灯 */ |
kurobikari | 0:6322c2c7148c | 94 | if((log[0]-log[1])>1)led[0]=1; |
kurobikari | 0:6322c2c7148c | 95 | else led[0]=0; |
kurobikari | 0:6322c2c7148c | 96 | if(((log[0]-log[1])<0?-1:1)*(log[0]-log[1])<=1) led[1]=1; |
kurobikari | 0:6322c2c7148c | 97 | else led[1]=0; |
kurobikari | 0:6322c2c7148c | 98 | if((log[1]-log[0])>1) led[2]=1; |
kurobikari | 0:6322c2c7148c | 99 | else led[2]=0; |
kurobikari | 0:6322c2c7148c | 100 | |
kurobikari | 0:6322c2c7148c | 101 | LED_cnt++; |
kurobikari | 0:6322c2c7148c | 102 | LED_cnt%=10; |
kurobikari | 0:6322c2c7148c | 103 | if(LED_cnt==0) LED_flag++; |
kurobikari | 0:6322c2c7148c | 104 | LED_flag%=2; |
kurobikari | 0:6322c2c7148c | 105 | if(LED_flag) led[3]=1; |
kurobikari | 0:6322c2c7148c | 106 | else led[3]=0; |
kurobikari | 0:6322c2c7148c | 107 | |
kurobikari | 0:6322c2c7148c | 108 | } |
kurobikari | 0:6322c2c7148c | 109 | |
kurobikari | 0:6322c2c7148c | 110 | } |
kurobikari | 0:6322c2c7148c | 111 | cnt++; |
kurobikari | 0:6322c2c7148c | 112 | cnt %= 26; |
kurobikari | 0:6322c2c7148c | 113 | |
kurobikari | 0:6322c2c7148c | 114 | |
kurobikari | 0:6322c2c7148c | 115 | |
kurobikari | 0:6322c2c7148c | 116 | |
kurobikari | 0:6322c2c7148c | 117 | |
kurobikari | 0:6322c2c7148c | 118 | |
kurobikari | 0:6322c2c7148c | 119 | |
kurobikari | 0:6322c2c7148c | 120 | } |
kurobikari | 0:6322c2c7148c | 121 | |
kurobikari | 0:6322c2c7148c | 122 | } |