Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
main.cpp@0:f9b3d6a82c03, 2019-02-19 (annotated)
- Committer:
- ahdyer
- Date:
- Tue Feb 19 10:02:29 2019 +0000
- Revision:
- 0:f9b3d6a82c03
5-Axis accelerator
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| ahdyer | 0:f9b3d6a82c03 | 1 | // CAN_MONITOR with filtering 2012/03/21 ym1784 |
| ahdyer | 0:f9b3d6a82c03 | 2 | |
| ahdyer | 0:f9b3d6a82c03 | 3 | #include "mbed.h" |
| ahdyer | 0:f9b3d6a82c03 | 4 | #include "CAN.h" |
| ahdyer | 0:f9b3d6a82c03 | 5 | |
| ahdyer | 0:f9b3d6a82c03 | 6 | Serial pc(USBTX, USBRX); // tx, rx |
| ahdyer | 0:f9b3d6a82c03 | 7 | DigitalOut led2(LED2); |
| ahdyer | 0:f9b3d6a82c03 | 8 | DigitalOut led1(LED1); |
| ahdyer | 0:f9b3d6a82c03 | 9 | // Tiker for sending messges |
| ahdyer | 0:f9b3d6a82c03 | 10 | Ticker ticker; |
| ahdyer | 0:f9b3d6a82c03 | 11 | |
| ahdyer | 0:f9b3d6a82c03 | 12 | int CAN_ID = 1; |
| ahdyer | 0:f9b3d6a82c03 | 13 | char counter = 1; |
| ahdyer | 0:f9b3d6a82c03 | 14 | |
| ahdyer | 0:f9b3d6a82c03 | 15 | // CAN2 on mbed pins 29(CAN_TXD) and 30(CAN_RXD) using MCP2551. |
| ahdyer | 0:f9b3d6a82c03 | 16 | CAN can2(p30, p29); |
| ahdyer | 0:f9b3d6a82c03 | 17 | CAN can1(p9, p10); |
| ahdyer | 0:f9b3d6a82c03 | 18 | /*-------------------------------------------- |
| ahdyer | 0:f9b3d6a82c03 | 19 | setup acceptance filter for CAN controller 2 |
| ahdyer | 0:f9b3d6a82c03 | 20 | original http://www.dragonwake.com/download/LPC1768/Example/CAN/CAN.c |
| ahdyer | 0:f9b3d6a82c03 | 21 | simplified for CAN2 interface and std id (11 bit) only |
| ahdyer | 0:f9b3d6a82c03 | 22 | *--------------------------------------------*/ |
| ahdyer | 0:f9b3d6a82c03 | 23 | void CAN2_wrFilter (uint32_t id) { |
| ahdyer | 0:f9b3d6a82c03 | 24 | static int CAN_std_cnt = 0; |
| ahdyer | 0:f9b3d6a82c03 | 25 | uint32_t buf0, buf1; |
| ahdyer | 0:f9b3d6a82c03 | 26 | int cnt1, cnt2, bound1; |
| ahdyer | 0:f9b3d6a82c03 | 27 | |
| ahdyer | 0:f9b3d6a82c03 | 28 | /* Acceptance Filter Memory full */ |
| ahdyer | 0:f9b3d6a82c03 | 29 | if (((CAN_std_cnt + 1) >> 1) >= 512) |
| ahdyer | 0:f9b3d6a82c03 | 30 | return; /* error: objects full */ |
| ahdyer | 0:f9b3d6a82c03 | 31 | |
| ahdyer | 0:f9b3d6a82c03 | 32 | /* Setup Acceptance Filter Configuration |
| ahdyer | 0:f9b3d6a82c03 | 33 | Acceptance Filter Mode Register = Off */ |
| ahdyer | 0:f9b3d6a82c03 | 34 | LPC_CANAF->AFMR = 0x00000001; |
| ahdyer | 0:f9b3d6a82c03 | 35 | |
| ahdyer | 0:f9b3d6a82c03 | 36 | id |= 1 << 13; /* Add controller number(2) */ |
| ahdyer | 0:f9b3d6a82c03 | 37 | id &= 0x0000F7FF; /* Mask out 16-bits of ID */ |
| ahdyer | 0:f9b3d6a82c03 | 38 | |
| ahdyer | 0:f9b3d6a82c03 | 39 | if (CAN_std_cnt == 0) { /* For entering first ID */ |
| ahdyer | 0:f9b3d6a82c03 | 40 | LPC_CANAF_RAM->mask[0] = 0x0000FFFF | (id << 16); |
| ahdyer | 0:f9b3d6a82c03 | 41 | } else if (CAN_std_cnt == 1) { /* For entering second ID */ |
| ahdyer | 0:f9b3d6a82c03 | 42 | if ((LPC_CANAF_RAM->mask[0] >> 16) > id) |
| ahdyer | 0:f9b3d6a82c03 | 43 | LPC_CANAF_RAM->mask[0] = (LPC_CANAF_RAM->mask[0] >> 16) | (id << 16); |
| ahdyer | 0:f9b3d6a82c03 | 44 | else |
| ahdyer | 0:f9b3d6a82c03 | 45 | LPC_CANAF_RAM->mask[0] = (LPC_CANAF_RAM->mask[0] & 0xFFFF0000) | id; |
| ahdyer | 0:f9b3d6a82c03 | 46 | } else { |
| ahdyer | 0:f9b3d6a82c03 | 47 | /* Find where to insert new ID */ |
| ahdyer | 0:f9b3d6a82c03 | 48 | cnt1 = 0; |
| ahdyer | 0:f9b3d6a82c03 | 49 | cnt2 = CAN_std_cnt; |
| ahdyer | 0:f9b3d6a82c03 | 50 | bound1 = (CAN_std_cnt - 1) >> 1; |
| ahdyer | 0:f9b3d6a82c03 | 51 | while (cnt1 <= bound1) { /* Loop through standard existing IDs */ |
| ahdyer | 0:f9b3d6a82c03 | 52 | if ((LPC_CANAF_RAM->mask[cnt1] >> 16) > id) { |
| ahdyer | 0:f9b3d6a82c03 | 53 | cnt2 = cnt1 * 2; |
| ahdyer | 0:f9b3d6a82c03 | 54 | break; |
| ahdyer | 0:f9b3d6a82c03 | 55 | } |
| ahdyer | 0:f9b3d6a82c03 | 56 | if ((LPC_CANAF_RAM->mask[cnt1] & 0x0000FFFF) > id) { |
| ahdyer | 0:f9b3d6a82c03 | 57 | cnt2 = cnt1 * 2 + 1; |
| ahdyer | 0:f9b3d6a82c03 | 58 | break; |
| ahdyer | 0:f9b3d6a82c03 | 59 | } |
| ahdyer | 0:f9b3d6a82c03 | 60 | cnt1++; /* cnt1 = U32 where to insert new ID */ |
| ahdyer | 0:f9b3d6a82c03 | 61 | } /* cnt2 = U16 where to insert new ID */ |
| ahdyer | 0:f9b3d6a82c03 | 62 | |
| ahdyer | 0:f9b3d6a82c03 | 63 | if (cnt1 > bound1) { /* Adding ID as last entry */ |
| ahdyer | 0:f9b3d6a82c03 | 64 | if ((CAN_std_cnt & 0x0001) == 0) /* Even number of IDs exists */ |
| ahdyer | 0:f9b3d6a82c03 | 65 | LPC_CANAF_RAM->mask[cnt1] = 0x0000FFFF | (id << 16); |
| ahdyer | 0:f9b3d6a82c03 | 66 | else /* Odd number of IDs exists */ |
| ahdyer | 0:f9b3d6a82c03 | 67 | LPC_CANAF_RAM->mask[cnt1] = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000) | id; |
| ahdyer | 0:f9b3d6a82c03 | 68 | } else { |
| ahdyer | 0:f9b3d6a82c03 | 69 | buf0 = LPC_CANAF_RAM->mask[cnt1]; /* Remember current entry */ |
| ahdyer | 0:f9b3d6a82c03 | 70 | if ((cnt2 & 0x0001) == 0) /* Insert new mask to even address */ |
| ahdyer | 0:f9b3d6a82c03 | 71 | buf1 = (id << 16) | (buf0 >> 16); |
| ahdyer | 0:f9b3d6a82c03 | 72 | else /* Insert new mask to odd address */ |
| ahdyer | 0:f9b3d6a82c03 | 73 | buf1 = (buf0 & 0xFFFF0000) | id; |
| ahdyer | 0:f9b3d6a82c03 | 74 | |
| ahdyer | 0:f9b3d6a82c03 | 75 | LPC_CANAF_RAM->mask[cnt1] = buf1; /* Insert mask */ |
| ahdyer | 0:f9b3d6a82c03 | 76 | |
| ahdyer | 0:f9b3d6a82c03 | 77 | bound1 = CAN_std_cnt >> 1; |
| ahdyer | 0:f9b3d6a82c03 | 78 | /* Move all remaining standard mask entries one place up */ |
| ahdyer | 0:f9b3d6a82c03 | 79 | while (cnt1 < bound1) { |
| ahdyer | 0:f9b3d6a82c03 | 80 | cnt1++; |
| ahdyer | 0:f9b3d6a82c03 | 81 | buf1 = LPC_CANAF_RAM->mask[cnt1]; |
| ahdyer | 0:f9b3d6a82c03 | 82 | LPC_CANAF_RAM->mask[cnt1] = (buf1 >> 16) | (buf0 << 16); |
| ahdyer | 0:f9b3d6a82c03 | 83 | buf0 = buf1; |
| ahdyer | 0:f9b3d6a82c03 | 84 | } |
| ahdyer | 0:f9b3d6a82c03 | 85 | |
| ahdyer | 0:f9b3d6a82c03 | 86 | if ((CAN_std_cnt & 0x0001) == 0) /* Even number of IDs exists */ |
| ahdyer | 0:f9b3d6a82c03 | 87 | LPC_CANAF_RAM->mask[cnt1] = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000) | (0x0000FFFF); |
| ahdyer | 0:f9b3d6a82c03 | 88 | } |
| ahdyer | 0:f9b3d6a82c03 | 89 | } |
| ahdyer | 0:f9b3d6a82c03 | 90 | CAN_std_cnt++; |
| ahdyer | 0:f9b3d6a82c03 | 91 | |
| ahdyer | 0:f9b3d6a82c03 | 92 | /* Calculate std ID start address (buf0) and ext ID start address <- none (buf1) */ |
| ahdyer | 0:f9b3d6a82c03 | 93 | buf0 = ((CAN_std_cnt + 1) >> 1) << 2; |
| ahdyer | 0:f9b3d6a82c03 | 94 | buf1 = buf0; |
| ahdyer | 0:f9b3d6a82c03 | 95 | |
| ahdyer | 0:f9b3d6a82c03 | 96 | /* Setup acceptance filter pointers */ |
| ahdyer | 0:f9b3d6a82c03 | 97 | LPC_CANAF->SFF_sa = 0; |
| ahdyer | 0:f9b3d6a82c03 | 98 | LPC_CANAF->SFF_GRP_sa = buf0; |
| ahdyer | 0:f9b3d6a82c03 | 99 | LPC_CANAF->EFF_sa = buf0; |
| ahdyer | 0:f9b3d6a82c03 | 100 | LPC_CANAF->EFF_GRP_sa = buf1; |
| ahdyer | 0:f9b3d6a82c03 | 101 | LPC_CANAF->ENDofTable = buf1; |
| ahdyer | 0:f9b3d6a82c03 | 102 | |
| ahdyer | 0:f9b3d6a82c03 | 103 | LPC_CANAF->AFMR = 0x00000000; /* Use acceptance filter */ |
| ahdyer | 0:f9b3d6a82c03 | 104 | } // CAN2_wrFilter |
| ahdyer | 0:f9b3d6a82c03 | 105 | |
| ahdyer | 0:f9b3d6a82c03 | 106 | void send() { |
| ahdyer | 0:f9b3d6a82c03 | 107 | pc.printf("send()\n\r"); |
| ahdyer | 0:f9b3d6a82c03 | 108 | if(can1.write(CANMessage(CAN_ID, &counter, 1))) { |
| ahdyer | 0:f9b3d6a82c03 | 109 | pc.printf("wloop()\n\r"); |
| ahdyer | 0:f9b3d6a82c03 | 110 | pc.printf("Message sent: %d with can ID: %d \n\r", counter, CAN_ID); |
| ahdyer | 0:f9b3d6a82c03 | 111 | if (CAN_ID < 3) |
| ahdyer | 0:f9b3d6a82c03 | 112 | { |
| ahdyer | 0:f9b3d6a82c03 | 113 | CAN_ID ++; |
| ahdyer | 0:f9b3d6a82c03 | 114 | } |
| ahdyer | 0:f9b3d6a82c03 | 115 | else |
| ahdyer | 0:f9b3d6a82c03 | 116 | { |
| ahdyer | 0:f9b3d6a82c03 | 117 | CAN_ID = 1; |
| ahdyer | 0:f9b3d6a82c03 | 118 | } |
| ahdyer | 0:f9b3d6a82c03 | 119 | } |
| ahdyer | 0:f9b3d6a82c03 | 120 | led1 = !led1; |
| ahdyer | 0:f9b3d6a82c03 | 121 | } |
| ahdyer | 0:f9b3d6a82c03 | 122 | |
| ahdyer | 0:f9b3d6a82c03 | 123 | int main() { |
| ahdyer | 0:f9b3d6a82c03 | 124 | pc.baud(921600); |
| ahdyer | 0:f9b3d6a82c03 | 125 | pc.printf("CAN_MONITOR 921600 bps\r\n"); |
| ahdyer | 0:f9b3d6a82c03 | 126 | |
| ahdyer | 0:f9b3d6a82c03 | 127 | // 500kbit/s |
| ahdyer | 0:f9b3d6a82c03 | 128 | can1.frequency(500000); |
| ahdyer | 0:f9b3d6a82c03 | 129 | can2.frequency(500000); |
| ahdyer | 0:f9b3d6a82c03 | 130 | CANMessage can_MsgRx; |
| ahdyer | 0:f9b3d6a82c03 | 131 | |
| ahdyer | 0:f9b3d6a82c03 | 132 | CAN2_wrFilter(0x178); |
| ahdyer | 0:f9b3d6a82c03 | 133 | CAN2_wrFilter(0x1C4); |
| ahdyer | 0:f9b3d6a82c03 | 134 | CAN2_wrFilter(0x245); |
| ahdyer | 0:f9b3d6a82c03 | 135 | CAN2_wrFilter(0x3D3); |
| ahdyer | 0:f9b3d6a82c03 | 136 | CAN2_wrFilter(0x498); |
| ahdyer | 0:f9b3d6a82c03 | 137 | CAN2_wrFilter(0x4A6); |
| ahdyer | 0:f9b3d6a82c03 | 138 | //ticker.attach(&send, 1); |
| ahdyer | 0:f9b3d6a82c03 | 139 | int Yaw_Byte1, Yaw_Byte2, Yaw, Y_Acc_Byte1, Y_Acc_Byte2, Y_Acc, Roll_Byte1, Roll_Byte2, Roll, X_Acc_Byte1, X_Acc_Byte2, X_Acc, Z_Acc_Byte1, Z_Acc_Byte2, Z_Acc; |
| ahdyer | 0:f9b3d6a82c03 | 140 | |
| ahdyer | 0:f9b3d6a82c03 | 141 | while (1) { |
| ahdyer | 0:f9b3d6a82c03 | 142 | // send received messages to the pc via serial line |
| ahdyer | 0:f9b3d6a82c03 | 143 | if (can2.read(can_MsgRx)) { |
| ahdyer | 0:f9b3d6a82c03 | 144 | pc.printf("Can ID: %d, Message Length: %d", can_MsgRx.id, can_MsgRx.len); |
| ahdyer | 0:f9b3d6a82c03 | 145 | if(can_MsgRx.id == 372) |
| ahdyer | 0:f9b3d6a82c03 | 146 | { |
| ahdyer | 0:f9b3d6a82c03 | 147 | Yaw_Byte1 = can_MsgRx.data[0]; |
| ahdyer | 0:f9b3d6a82c03 | 148 | Yaw_Byte2 = can_MsgRx.data[1]<<8; // shift right to normailse the second byte of data, same with others |
| ahdyer | 0:f9b3d6a82c03 | 149 | Y_Acc_Byte1 = can_MsgRx.data[4]; |
| ahdyer | 0:f9b3d6a82c03 | 150 | Y_Acc_Byte2 = can_MsgRx.data[5]<<8; //^ |
| ahdyer | 0:f9b3d6a82c03 | 151 | } |
| ahdyer | 0:f9b3d6a82c03 | 152 | if(can_MsgRx.id == 376) |
| ahdyer | 0:f9b3d6a82c03 | 153 | { |
| ahdyer | 0:f9b3d6a82c03 | 154 | Roll_Byte1 = can_MsgRx.data[0]; |
| ahdyer | 0:f9b3d6a82c03 | 155 | Roll_Byte2 = can_MsgRx.data[1]<<8; //^ |
| ahdyer | 0:f9b3d6a82c03 | 156 | X_Acc_Byte1 = can_MsgRx.data[4]; |
| ahdyer | 0:f9b3d6a82c03 | 157 | X_Acc_Byte2 = can_MsgRx.data[5]<<8; //^ |
| ahdyer | 0:f9b3d6a82c03 | 158 | } |
| ahdyer | 0:f9b3d6a82c03 | 159 | if(can_MsgRx.id == 380) |
| ahdyer | 0:f9b3d6a82c03 | 160 | { |
| ahdyer | 0:f9b3d6a82c03 | 161 | Z_Acc_Byte1 = can_MsgRx.data[4]; |
| ahdyer | 0:f9b3d6a82c03 | 162 | Z_Acc_Byte2 = can_MsgRx.data[5]<<8; //^ |
| ahdyer | 0:f9b3d6a82c03 | 163 | } |
| ahdyer | 0:f9b3d6a82c03 | 164 | //Calculate actual data by adding both bytes and the offset anf then normalising |
| ahdyer | 0:f9b3d6a82c03 | 165 | Yaw = (Yaw_Byte1 + Yaw_Byte2 - 32768)*0.005; |
| ahdyer | 0:f9b3d6a82c03 | 166 | Y_Acc = (Y_Acc_Byte1 + Y_Acc_Byte2 - 32768)*0.0001274; |
| ahdyer | 0:f9b3d6a82c03 | 167 | Roll = (Roll_Byte1 + Roll_Byte2 - 32768)*0.005; |
| ahdyer | 0:f9b3d6a82c03 | 168 | X_Acc = (X_Acc_Byte1 + X_Acc_Byte2 - 32768)*0.0001274; |
| ahdyer | 0:f9b3d6a82c03 | 169 | Z_Acc = (Z_Acc_Byte1 + Z_Acc_Byte2 - 32768)*0.0001274; |
| ahdyer | 0:f9b3d6a82c03 | 170 | |
| ahdyer | 0:f9b3d6a82c03 | 171 | // show the id of the messege being read |
| ahdyer | 0:f9b3d6a82c03 | 172 | // print all of the data to pc serial |
| ahdyer | 0:f9b3d6a82c03 | 173 | pc.printf("Yaw: %d\n\r", Yaw); |
| ahdyer | 0:f9b3d6a82c03 | 174 | pc.printf("Roll: %d\n\r", Roll); |
| ahdyer | 0:f9b3d6a82c03 | 175 | pc.printf("Y_Acc: %d\n\r", Y_Acc); |
| ahdyer | 0:f9b3d6a82c03 | 176 | pc.printf("X_Acc: %d\n\r", X_Acc); |
| ahdyer | 0:f9b3d6a82c03 | 177 | pc.printf("Z_Acc: %d\n\r", Z_Acc); |
| ahdyer | 0:f9b3d6a82c03 | 178 | pc.printf("\r\n"); |
| ahdyer | 0:f9b3d6a82c03 | 179 | // toggle led2 |
| ahdyer | 0:f9b3d6a82c03 | 180 | led2 = !led2; |
| ahdyer | 0:f9b3d6a82c03 | 181 | } // if |
| ahdyer | 0:f9b3d6a82c03 | 182 | } // while |
| ahdyer | 0:f9b3d6a82c03 | 183 | } // main |