Software modbus, display, knoppen, bewegingssensor en mbed OS
Dependents: testSoftware8_alles_display
setup.cpp@1:92f9d6cec962, 2018-06-08 (annotated)
- Committer:
- mikevd1
- Date:
- Fri Jun 08 06:33:04 2018 +0000
- Revision:
- 1:92f9d6cec962
- Parent:
- 0:d603d31b42dc
- Child:
- 2:ca3d2395b6d3
Working code with crc and with data
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mikevd1 | 0:d603d31b42dc | 1 | #include "mbed.h" |
mikevd1 | 0:d603d31b42dc | 2 | #include "setup.h" |
mikevd1 | 0:d603d31b42dc | 3 | |
mikevd1 | 0:d603d31b42dc | 4 | unsigned int slaveID = 0x07; |
mikevd1 | 0:d603d31b42dc | 5 | unsigned int functionID0x03 = 0x03; |
mikevd1 | 0:d603d31b42dc | 6 | unsigned int functionID0x05 = 0x05; |
mikevd1 | 0:d603d31b42dc | 7 | unsigned int functionID0x02 = 0x02; |
mikevd1 | 0:d603d31b42dc | 8 | |
mikevd1 | 0:d603d31b42dc | 9 | char TxEnablePin = PA_8; |
mikevd1 | 0:d603d31b42dc | 10 | |
mikevd1 | 0:d603d31b42dc | 11 | Serial bus(PA_9,PA_10); |
mikevd1 | 0:d603d31b42dc | 12 | DigitalOut led1(LED1); |
mikevd1 | 0:d603d31b42dc | 13 | DigitalOut activateSN65(PA_8); |
mikevd1 | 0:d603d31b42dc | 14 | Serial pc(USBTX, USBRX); |
mikevd1 | 0:d603d31b42dc | 15 | |
mikevd1 | 0:d603d31b42dc | 16 | // Timers |
mikevd1 | 0:d603d31b42dc | 17 | Timer intercharacter_timer; |
mikevd1 | 0:d603d31b42dc | 18 | Timeout interframe_timeout; |
mikevd1 | 0:d603d31b42dc | 19 | |
mikevd1 | 0:d603d31b42dc | 20 | |
mikevd1 | 0:d603d31b42dc | 21 | unsigned int T1; |
mikevd1 | 0:d603d31b42dc | 22 | unsigned int T1_5; // inter character time out |
mikevd1 | 0:d603d31b42dc | 23 | unsigned int T3_5; // frame delay |
mikevd1 | 0:d603d31b42dc | 24 | unsigned static int buffer = 0; |
mikevd1 | 0:d603d31b42dc | 25 | unsigned int dataReceived[10] ; |
mikevd1 | 0:d603d31b42dc | 26 | unsigned int dataSend[10] ; |
mikevd1 | 0:d603d31b42dc | 27 | |
mikevd1 | 0:d603d31b42dc | 28 | |
mikevd1 | 0:d603d31b42dc | 29 | void modbus_configure(long baud, int _slaveID ) |
mikevd1 | 0:d603d31b42dc | 30 | { |
mikevd1 | 0:d603d31b42dc | 31 | pc.baud(115200); |
mikevd1 | 0:d603d31b42dc | 32 | slaveID = _slaveID; |
mikevd1 | 0:d603d31b42dc | 33 | |
mikevd1 | 0:d603d31b42dc | 34 | if (baud == 1000000 ){ |
mikevd1 | 0:d603d31b42dc | 35 | T1_5 = 1; |
mikevd1 | 0:d603d31b42dc | 36 | T3_5 = 10; |
mikevd1 | 0:d603d31b42dc | 37 | } |
mikevd1 | 0:d603d31b42dc | 38 | else if (baud >= 115200 ){ |
mikevd1 | 0:d603d31b42dc | 39 | T1_5 = 75; |
mikevd1 | 0:d603d31b42dc | 40 | T3_5 = 175; |
mikevd1 | 0:d603d31b42dc | 41 | } |
mikevd1 | 0:d603d31b42dc | 42 | else if (baud > 19200){ |
mikevd1 | 0:d603d31b42dc | 43 | T1_5 = 750; |
mikevd1 | 0:d603d31b42dc | 44 | T3_5 = 1750; |
mikevd1 | 0:d603d31b42dc | 45 | } |
mikevd1 | 0:d603d31b42dc | 46 | else { |
mikevd1 | 0:d603d31b42dc | 47 | T1_5 = 15000000/baud; // 1T * 1.5 = T1.5 |
mikevd1 | 0:d603d31b42dc | 48 | T3_5 = 35000000/baud; // 1T * 3.5 = T3.5 |
mikevd1 | 0:d603d31b42dc | 49 | } |
mikevd1 | 0:d603d31b42dc | 50 | T1 = 10000000/baud; |
mikevd1 | 0:d603d31b42dc | 51 | } |
mikevd1 | 0:d603d31b42dc | 52 | int modbus_read2(void) |
mikevd1 | 0:d603d31b42dc | 53 | { |
mikevd1 | 0:d603d31b42dc | 54 | |
mikevd1 | 0:d603d31b42dc | 55 | //int data ; |
mikevd1 | 0:d603d31b42dc | 56 | //int value = 0 ; |
mikevd1 | 0:d603d31b42dc | 57 | //activateSN65 = 0 ; |
mikevd1 | 0:d603d31b42dc | 58 | |
mikevd1 | 0:d603d31b42dc | 59 | if(bus.readable()) |
mikevd1 | 0:d603d31b42dc | 60 | { |
mikevd1 | 0:d603d31b42dc | 61 | int data = bus.getc(); |
mikevd1 | 0:d603d31b42dc | 62 | pc.putc(data); |
mikevd1 | 0:d603d31b42dc | 63 | } |
mikevd1 | 0:d603d31b42dc | 64 | return 0 ; |
mikevd1 | 0:d603d31b42dc | 65 | } |
mikevd1 | 0:d603d31b42dc | 66 | |
mikevd1 | 0:d603d31b42dc | 67 | int modbus_read(void) |
mikevd1 | 0:d603d31b42dc | 68 | { |
mikevd1 | 0:d603d31b42dc | 69 | activateSN65 = 0 ; |
mikevd1 | 0:d603d31b42dc | 70 | if(bus.readable()) |
mikevd1 | 0:d603d31b42dc | 71 | { |
mikevd1 | 0:d603d31b42dc | 72 | int data = bus.getc(); |
mikevd1 | 0:d603d31b42dc | 73 | //pc.putc(data); |
mikevd1 | 0:d603d31b42dc | 74 | if ( data == slaveID && buffer == 0 ) |
mikevd1 | 0:d603d31b42dc | 75 | { |
mikevd1 | 0:d603d31b42dc | 76 | dataReceived[buffer++] = slaveID ; // slaveID checks out proceed to checking function ID |
mikevd1 | 0:d603d31b42dc | 77 | } |
mikevd1 | 0:d603d31b42dc | 78 | else if ( data == 0x02 && buffer == 1) |
mikevd1 | 0:d603d31b42dc | 79 | { |
mikevd1 | 0:d603d31b42dc | 80 | dataReceived[buffer++] = data ; // FunctionID checks out proceed to receiving data |
mikevd1 | 0:d603d31b42dc | 81 | } |
mikevd1 | 0:d603d31b42dc | 82 | else if ( buffer == 2 || buffer == 3 ) // get data adress high and low order |
mikevd1 | 0:d603d31b42dc | 83 | { |
mikevd1 | 0:d603d31b42dc | 84 | // adress high and low |
mikevd1 | 0:d603d31b42dc | 85 | if ( buffer == 2 ) |
mikevd1 | 0:d603d31b42dc | 86 | { |
mikevd1 | 0:d603d31b42dc | 87 | dataReceived[buffer++] = data ; |
mikevd1 | 0:d603d31b42dc | 88 | //pc.putc(buffer); |
mikevd1 | 0:d603d31b42dc | 89 | } |
mikevd1 | 0:d603d31b42dc | 90 | else |
mikevd1 | 0:d603d31b42dc | 91 | { |
mikevd1 | 0:d603d31b42dc | 92 | dataReceived[buffer++] = data ; |
mikevd1 | 0:d603d31b42dc | 93 | //pc.putc(buffer); |
mikevd1 | 0:d603d31b42dc | 94 | } |
mikevd1 | 0:d603d31b42dc | 95 | } |
mikevd1 | 0:d603d31b42dc | 96 | else if ( buffer == 4 || buffer == 5 ) |
mikevd1 | 0:d603d31b42dc | 97 | { |
mikevd1 | 0:d603d31b42dc | 98 | // adress high and low |
mikevd1 | 0:d603d31b42dc | 99 | if ( buffer == 4 ) |
mikevd1 | 0:d603d31b42dc | 100 | { |
mikevd1 | 0:d603d31b42dc | 101 | dataReceived[buffer++] = data ; |
mikevd1 | 0:d603d31b42dc | 102 | //pc.putc(buffer); |
mikevd1 | 0:d603d31b42dc | 103 | } |
mikevd1 | 0:d603d31b42dc | 104 | else |
mikevd1 | 0:d603d31b42dc | 105 | { |
mikevd1 | 0:d603d31b42dc | 106 | dataReceived[buffer++] = data ; |
mikevd1 | 0:d603d31b42dc | 107 | //pc.putc(buffer); |
mikevd1 | 0:d603d31b42dc | 108 | } |
mikevd1 | 0:d603d31b42dc | 109 | } |
mikevd1 | 0:d603d31b42dc | 110 | else if ( buffer == 6 || buffer == 7 ) |
mikevd1 | 0:d603d31b42dc | 111 | { |
mikevd1 | 0:d603d31b42dc | 112 | if ( buffer == 6 ) |
mikevd1 | 0:d603d31b42dc | 113 | { |
mikevd1 | 0:d603d31b42dc | 114 | dataReceived[buffer++] = data ; |
mikevd1 | 0:d603d31b42dc | 115 | //pc.putc(buffer); |
mikevd1 | 0:d603d31b42dc | 116 | } |
mikevd1 | 0:d603d31b42dc | 117 | else |
mikevd1 | 0:d603d31b42dc | 118 | { |
mikevd1 | 0:d603d31b42dc | 119 | dataReceived[buffer++] = data ; |
mikevd1 | 0:d603d31b42dc | 120 | unsigned long crc = ((dataReceived[buffer - 1] << 8) | dataReceived[buffer - 2]); // combine the crc Low & High bytes |
mikevd1 | 0:d603d31b42dc | 121 | // check crc |
mikevd1 | 0:d603d31b42dc | 122 | if ( calculate_crc16_Modbus(dataReceived, buffer - 2 ) == crc ) |
mikevd1 | 0:d603d31b42dc | 123 | { |
mikevd1 | 0:d603d31b42dc | 124 | buffer = 8 ; |
mikevd1 | 0:d603d31b42dc | 125 | //pc.putc(buffer); |
mikevd1 | 0:d603d31b42dc | 126 | } |
mikevd1 | 0:d603d31b42dc | 127 | else |
mikevd1 | 0:d603d31b42dc | 128 | { |
mikevd1 | 0:d603d31b42dc | 129 | buffer = 0 ; |
mikevd1 | 0:d603d31b42dc | 130 | //pc.putc(buffer); |
mikevd1 | 0:d603d31b42dc | 131 | // error |
mikevd1 | 0:d603d31b42dc | 132 | } |
mikevd1 | 0:d603d31b42dc | 133 | } |
mikevd1 | 0:d603d31b42dc | 134 | } |
mikevd1 | 0:d603d31b42dc | 135 | else |
mikevd1 | 0:d603d31b42dc | 136 | { |
mikevd1 | 0:d603d31b42dc | 137 | buffer = 0 ; |
mikevd1 | 0:d603d31b42dc | 138 | pc.putc(buffer); |
mikevd1 | 0:d603d31b42dc | 139 | } |
mikevd1 | 0:d603d31b42dc | 140 | } |
mikevd1 | 0:d603d31b42dc | 141 | if ( buffer == 8 ) |
mikevd1 | 0:d603d31b42dc | 142 | { |
mikevd1 | 0:d603d31b42dc | 143 | modbus_sendData(); |
mikevd1 | 0:d603d31b42dc | 144 | } |
mikevd1 | 0:d603d31b42dc | 145 | |
mikevd1 | 0:d603d31b42dc | 146 | return 0 ; |
mikevd1 | 0:d603d31b42dc | 147 | } |
mikevd1 | 0:d603d31b42dc | 148 | |
mikevd1 | 0:d603d31b42dc | 149 | int modbus_sendData(void) |
mikevd1 | 0:d603d31b42dc | 150 | { |
mikevd1 | 0:d603d31b42dc | 151 | int i = 0 ; |
mikevd1 | 1:92f9d6cec962 | 152 | int maxData = 0 ; |
mikevd1 | 0:d603d31b42dc | 153 | unsigned static int count = 0 ; |
mikevd1 | 1:92f9d6cec962 | 154 | dataSend[maxData++] = slaveID ; |
mikevd1 | 1:92f9d6cec962 | 155 | dataSend[maxData++] = dataReceived[1]; |
mikevd1 | 1:92f9d6cec962 | 156 | dataSend[maxData++] = 0x01 ; // byte count |
mikevd1 | 1:92f9d6cec962 | 157 | count++; |
mikevd1 | 1:92f9d6cec962 | 158 | if ( count > 12 ) |
mikevd1 | 0:d603d31b42dc | 159 | { |
mikevd1 | 1:92f9d6cec962 | 160 | dataSend[maxData++] = 0x00 ; |
mikevd1 | 1:92f9d6cec962 | 161 | |
mikevd1 | 1:92f9d6cec962 | 162 | } |
mikevd1 | 1:92f9d6cec962 | 163 | else |
mikevd1 | 1:92f9d6cec962 | 164 | { |
mikevd1 | 1:92f9d6cec962 | 165 | dataSend[maxData++] = 0x01 ; |
mikevd1 | 1:92f9d6cec962 | 166 | } |
mikevd1 | 1:92f9d6cec962 | 167 | if ( count == 25 ) |
mikevd1 | 1:92f9d6cec962 | 168 | { |
mikevd1 | 0:d603d31b42dc | 169 | count = 0 ; |
mikevd1 | 0:d603d31b42dc | 170 | } |
mikevd1 | 1:92f9d6cec962 | 171 | |
mikevd1 | 1:92f9d6cec962 | 172 | uint16_t temp = calculate_crc16_Modbus(dataSend, maxData ) ; |
mikevd1 | 1:92f9d6cec962 | 173 | dataSend[maxData++] = (uint8_t)temp ; |
mikevd1 | 1:92f9d6cec962 | 174 | dataSend[maxData++] = ((uint16_t)temp>>8); |
mikevd1 | 0:d603d31b42dc | 175 | activateSN65 = 1 ; |
mikevd1 | 0:d603d31b42dc | 176 | wait_ms(3); |
mikevd1 | 1:92f9d6cec962 | 177 | led1 = !led1; |
mikevd1 | 1:92f9d6cec962 | 178 | for(i = 0 ; i < maxData ; i++ ) |
mikevd1 | 0:d603d31b42dc | 179 | { |
mikevd1 | 0:d603d31b42dc | 180 | bus.putc(dataSend[i]); |
mikevd1 | 1:92f9d6cec962 | 181 | pc.putc(dataSend[i]); |
mikevd1 | 0:d603d31b42dc | 182 | wait_us(750); |
mikevd1 | 0:d603d31b42dc | 183 | } |
mikevd1 | 0:d603d31b42dc | 184 | buffer = 0 ; |
mikevd1 | 0:d603d31b42dc | 185 | wait_ms(2) ; |
mikevd1 | 0:d603d31b42dc | 186 | activateSN65 = 0 ; |
mikevd1 | 0:d603d31b42dc | 187 | |
mikevd1 | 0:d603d31b42dc | 188 | return 0 ; |
mikevd1 | 0:d603d31b42dc | 189 | } |
mikevd1 | 0:d603d31b42dc | 190 | |
mikevd1 | 0:d603d31b42dc | 191 | uint16_t update_crc16_reflected(const uint16_t *table, uint16_t crc, unsigned int c ) |
mikevd1 | 0:d603d31b42dc | 192 | { |
mikevd1 | 0:d603d31b42dc | 193 | long short_c; |
mikevd1 | 0:d603d31b42dc | 194 | |
mikevd1 | 0:d603d31b42dc | 195 | short_c = 0x00ff & (long) c; |
mikevd1 | 0:d603d31b42dc | 196 | |
mikevd1 | 0:d603d31b42dc | 197 | /* Reflected form */ |
mikevd1 | 0:d603d31b42dc | 198 | return (crc >> 8) ^ table[(crc ^ short_c) & 0xff]; |
mikevd1 | 0:d603d31b42dc | 199 | } |
mikevd1 | 0:d603d31b42dc | 200 | |
mikevd1 | 0:d603d31b42dc | 201 | |
mikevd1 | 0:d603d31b42dc | 202 | uint16_t update_crc16_A001( long crc, unsigned int c ) |
mikevd1 | 0:d603d31b42dc | 203 | { |
mikevd1 | 0:d603d31b42dc | 204 | return update_crc16_reflected(crc_tab_8005_reflected,crc,c); |
mikevd1 | 0:d603d31b42dc | 205 | } |
mikevd1 | 0:d603d31b42dc | 206 | |
mikevd1 | 0:d603d31b42dc | 207 | |
mikevd1 | 0:d603d31b42dc | 208 | long calculate_crc16_Modbus(unsigned int *p, unsigned int length) |
mikevd1 | 0:d603d31b42dc | 209 | { |
mikevd1 | 0:d603d31b42dc | 210 | long crc; |
mikevd1 | 0:d603d31b42dc | 211 | unsigned int i; |
mikevd1 | 0:d603d31b42dc | 212 | |
mikevd1 | 0:d603d31b42dc | 213 | crc = 0xFFFF; |
mikevd1 | 0:d603d31b42dc | 214 | |
mikevd1 | 0:d603d31b42dc | 215 | for (i=0; i < length; i++) |
mikevd1 | 0:d603d31b42dc | 216 | { |
mikevd1 | 0:d603d31b42dc | 217 | crc = update_crc16_A001(crc,*p++); |
mikevd1 | 0:d603d31b42dc | 218 | } |
mikevd1 | 0:d603d31b42dc | 219 | return crc; |
mikevd1 | 0:d603d31b42dc | 220 | } |
mikevd1 | 0:d603d31b42dc | 221 | |
mikevd1 | 0:d603d31b42dc | 222 |