Software modbus, display, knoppen, bewegingssensor en mbed OS

Dependents:   testSoftware8_alles_display

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?

UserRevisionLine numberNew 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