Software modbus, display, knoppen, bewegingssensor en mbed OS

Dependents:   testSoftware8_alles_display

Committer:
mikevd1
Date:
Mon Sep 17 10:30:05 2018 +0000
Revision:
4:80135cfbaeb7
Parent:
3:4fff62544119
Child:
5:6bafdac3cd5a
Aanpassing in display uitschakeling door geen bewegingdetectie

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 2:ca3d2395b6d3 3 #include "ssd1306.h"
mikevd1 2:ca3d2395b6d3 4 #include "FlashIAP.h"
mikevd1 0:d603d31b42dc 5
mikevd1 2:ca3d2395b6d3 6 //UART to RS485 bus line & enable of RS485
mikevd1 2:ca3d2395b6d3 7 Serial bus(PA_9,PA_10); //rx , tx
mikevd1 0:d603d31b42dc 8 DigitalOut activateSN65(PA_8);
mikevd1 0:d603d31b42dc 9
mikevd1 2:ca3d2395b6d3 10 // Timer max message time
mikevd1 2:ca3d2395b6d3 11 Timer maxMessageTime ;
mikevd1 0:d603d31b42dc 12
mikevd1 4:80135cfbaeb7 13 // buffer message package
mikevd1 0:d603d31b42dc 14 unsigned static int buffer = 0;
mikevd1 2:ca3d2395b6d3 15
mikevd1 0:d603d31b42dc 16 unsigned int dataReceived[10] ;
mikevd1 0:d603d31b42dc 17 unsigned int dataSend[10] ;
mikevd1 2:ca3d2395b6d3 18 unsigned int count = 0, count1 = 0, count2 = 0 ;
mikevd1 4:80135cfbaeb7 19 static unsigned int maxSizeBuffer = 0 ;
mikevd1 2:ca3d2395b6d3 20
mikevd1 2:ca3d2395b6d3 21 int modbus_read(dataModbus *allData)
mikevd1 0:d603d31b42dc 22 {
mikevd1 2:ca3d2395b6d3 23 activateSN65 = 0 ;
mikevd1 4:80135cfbaeb7 24
mikevd1 2:ca3d2395b6d3 25 if(bus.readable())
mikevd1 2:ca3d2395b6d3 26 {
mikevd1 2:ca3d2395b6d3 27 // if( maxMessageTime.read_ms() > (int)180 )
mikevd1 2:ca3d2395b6d3 28 // {
mikevd1 2:ca3d2395b6d3 29 // buffer = 0 ;
mikevd1 2:ca3d2395b6d3 30 // maxMessageTime.reset();
mikevd1 2:ca3d2395b6d3 31 // }
mikevd1 2:ca3d2395b6d3 32 int data = bus.getc();
mikevd1 3:4fff62544119 33 if ( data == allData->slaveID && buffer == 0 )
mikevd1 2:ca3d2395b6d3 34 {
mikevd1 2:ca3d2395b6d3 35 // maxMessageTime.start();
mikevd1 3:4fff62544119 36 dataReceived[buffer++] = allData->slaveID ; // slaveID checks out proceed to checking function ID
mikevd1 2:ca3d2395b6d3 37 }
mikevd1 2:ca3d2395b6d3 38 else if ( buffer == 1 )
mikevd1 2:ca3d2395b6d3 39 {
mikevd1 2:ca3d2395b6d3 40 dataReceived[buffer++] = data ; // functie code
mikevd1 2:ca3d2395b6d3 41 maxSizeBuffer = functionCodeCheckMaxData(data) ;
mikevd1 2:ca3d2395b6d3 42 }
mikevd1 2:ca3d2395b6d3 43 else if ( ( buffer >= 2 ) && ( buffer < maxSizeBuffer ) )
mikevd1 2:ca3d2395b6d3 44 {
mikevd1 2:ca3d2395b6d3 45 dataReceived[buffer++] = data ; // data
mikevd1 2:ca3d2395b6d3 46 }
mikevd1 2:ca3d2395b6d3 47 else if ( buffer == maxSizeBuffer || buffer == maxSizeBuffer + 1 )
mikevd1 2:ca3d2395b6d3 48 {
mikevd1 2:ca3d2395b6d3 49 if (buffer == maxSizeBuffer )
mikevd1 0:d603d31b42dc 50 {
mikevd1 2:ca3d2395b6d3 51 dataReceived[buffer++] = data ;
mikevd1 0:d603d31b42dc 52 }
mikevd1 0:d603d31b42dc 53 else
mikevd1 0:d603d31b42dc 54 {
mikevd1 2:ca3d2395b6d3 55 dataReceived[buffer++] = data ;
mikevd1 2:ca3d2395b6d3 56 //buffer++;
mikevd1 2:ca3d2395b6d3 57 CRCChecking();
mikevd1 2:ca3d2395b6d3 58 }
mikevd1 0:d603d31b42dc 59 }
mikevd1 2:ca3d2395b6d3 60 else
mikevd1 0:d603d31b42dc 61 {
mikevd1 2:ca3d2395b6d3 62 buffer = 0 ;
mikevd1 2:ca3d2395b6d3 63 // maxMessageTime.stop();
mikevd1 2:ca3d2395b6d3 64 // maxMessageTime.reset();
mikevd1 2:ca3d2395b6d3 65 }
mikevd1 2:ca3d2395b6d3 66 }
mikevd1 2:ca3d2395b6d3 67 if ( buffer == maxSizeBuffer + 3 )
mikevd1 2:ca3d2395b6d3 68 {
mikevd1 2:ca3d2395b6d3 69 // maxMessageTime.stop();
mikevd1 2:ca3d2395b6d3 70 // maxMessageTime.reset();
mikevd1 2:ca3d2395b6d3 71 return modbus_sendData(allData);
mikevd1 2:ca3d2395b6d3 72 }
mikevd1 0:d603d31b42dc 73
mikevd1 0:d603d31b42dc 74 return 0 ;
mikevd1 0:d603d31b42dc 75 }
mikevd1 0:d603d31b42dc 76
mikevd1 2:ca3d2395b6d3 77 int modbus_sendData(dataModbus *allData)
mikevd1 0:d603d31b42dc 78 {
mikevd1 2:ca3d2395b6d3 79 int i = 0 ;
mikevd1 1:92f9d6cec962 80 int maxData = 0 ;
mikevd1 4:80135cfbaeb7 81 static int temperatuur = 0, beweging = 0 ;
mikevd1 2:ca3d2395b6d3 82 temperatuur = allData->temperatuur ;
mikevd1 2:ca3d2395b6d3 83 beweging = allData->beweging ;
mikevd1 3:4fff62544119 84 dataSend[maxData++] = allData->slaveID ;
mikevd1 1:92f9d6cec962 85 dataSend[maxData++] = dataReceived[1];
mikevd1 2:ca3d2395b6d3 86 if ( dataReceived[1] == 0x02 )
mikevd1 2:ca3d2395b6d3 87 {
mikevd1 2:ca3d2395b6d3 88 dataSend[maxData++] = 0x01 ; // byte count
mikevd1 2:ca3d2395b6d3 89 dataSend[maxData++] = 0x01 ;
mikevd1 2:ca3d2395b6d3 90 }
mikevd1 2:ca3d2395b6d3 91 else if (dataReceived[1] == 0x04 )
mikevd1 2:ca3d2395b6d3 92 {
mikevd1 2:ca3d2395b6d3 93 if ( dataReceived[3] == 0 )
mikevd1 2:ca3d2395b6d3 94 {
mikevd1 2:ca3d2395b6d3 95 dataSend[maxData++] = 0x02 ; // byte count
mikevd1 2:ca3d2395b6d3 96 dataSend[maxData++] = 0x00 ;
mikevd1 2:ca3d2395b6d3 97 dataSend[maxData++] = temperatuur ;
mikevd1 2:ca3d2395b6d3 98 }
mikevd1 2:ca3d2395b6d3 99 else
mikevd1 2:ca3d2395b6d3 100 {
mikevd1 2:ca3d2395b6d3 101 dataSend[maxData++] = 0x02 ; // byte count
mikevd1 2:ca3d2395b6d3 102 dataSend[maxData++] = 0x00 ;
mikevd1 2:ca3d2395b6d3 103 dataSend[maxData++] = beweging ;
mikevd1 2:ca3d2395b6d3 104 }
mikevd1 2:ca3d2395b6d3 105 }
mikevd1 2:ca3d2395b6d3 106 else if ( dataReceived[1] == 0x06 )
mikevd1 0:d603d31b42dc 107 {
mikevd1 2:ca3d2395b6d3 108 dataSend[maxData++] = dataReceived[2] ; //echo
mikevd1 2:ca3d2395b6d3 109 dataSend[maxData++] = dataReceived[3] ;
mikevd1 2:ca3d2395b6d3 110 dataSend[maxData++] = dataReceived[4] ;
mikevd1 2:ca3d2395b6d3 111 dataSend[maxData++] = dataReceived[5] ;
mikevd1 2:ca3d2395b6d3 112 if ( dataReceived[3] == 0x01 )
mikevd1 2:ca3d2395b6d3 113 {
mikevd1 2:ca3d2395b6d3 114 count2 = dataReceived[5] ;
mikevd1 2:ca3d2395b6d3 115 if ( count2 == 1 )
mikevd1 2:ca3d2395b6d3 116 {
mikevd1 2:ca3d2395b6d3 117 allData->RelaisK1 = 1 ;
mikevd1 2:ca3d2395b6d3 118 }
mikevd1 2:ca3d2395b6d3 119 else
mikevd1 2:ca3d2395b6d3 120 {
mikevd1 2:ca3d2395b6d3 121 allData->RelaisK1 = 0 ;
mikevd1 2:ca3d2395b6d3 122 }
mikevd1 2:ca3d2395b6d3 123 }
mikevd1 2:ca3d2395b6d3 124 else
mikevd1 2:ca3d2395b6d3 125 {
mikevd1 2:ca3d2395b6d3 126 count1 = dataReceived[5] ;
mikevd1 2:ca3d2395b6d3 127 if ( count1 == 1 )
mikevd1 2:ca3d2395b6d3 128 {
mikevd1 2:ca3d2395b6d3 129 allData->RelaisK2 = 1 ;
mikevd1 2:ca3d2395b6d3 130 }
mikevd1 2:ca3d2395b6d3 131 else
mikevd1 2:ca3d2395b6d3 132 {
mikevd1 2:ca3d2395b6d3 133 allData->RelaisK2 = 0 ;
mikevd1 2:ca3d2395b6d3 134 }
mikevd1 2:ca3d2395b6d3 135 }
mikevd1 2:ca3d2395b6d3 136 temperatuur = allData->temperatuur ; //count2 * count1 ;
mikevd1 2:ca3d2395b6d3 137 beweging = allData->beweging ;
mikevd1 2:ca3d2395b6d3 138 }
mikevd1 1:92f9d6cec962 139 else
mikevd1 2:ca3d2395b6d3 140 {
mikevd1 2:ca3d2395b6d3 141 return 0 ;
mikevd1 1:92f9d6cec962 142 }
mikevd1 1:92f9d6cec962 143 uint16_t temp = calculate_crc16_Modbus(dataSend, maxData ) ;
mikevd1 1:92f9d6cec962 144 dataSend[maxData++] = (uint8_t)temp ;
mikevd1 1:92f9d6cec962 145 dataSend[maxData++] = ((uint16_t)temp>>8);
mikevd1 0:d603d31b42dc 146 activateSN65 = 1 ;
mikevd1 0:d603d31b42dc 147 wait_ms(3);
mikevd1 1:92f9d6cec962 148 for(i = 0 ; i < maxData ; i++ )
mikevd1 0:d603d31b42dc 149 {
mikevd1 0:d603d31b42dc 150 bus.putc(dataSend[i]);
mikevd1 0:d603d31b42dc 151 wait_us(750);
mikevd1 0:d603d31b42dc 152 }
mikevd1 2:ca3d2395b6d3 153
mikevd1 0:d603d31b42dc 154 buffer = 0 ;
mikevd1 0:d603d31b42dc 155 wait_ms(2) ;
mikevd1 0:d603d31b42dc 156 activateSN65 = 0 ;
mikevd1 0:d603d31b42dc 157
mikevd1 2:ca3d2395b6d3 158 if ( allData->RelaisK1 == 1 && allData->RelaisK2 == 1 )
mikevd1 2:ca3d2395b6d3 159 {
mikevd1 2:ca3d2395b6d3 160 return 1 ;
mikevd1 2:ca3d2395b6d3 161 }
mikevd1 2:ca3d2395b6d3 162 else if ( allData->RelaisK1 == 0 && allData->RelaisK2 == 1 )
mikevd1 2:ca3d2395b6d3 163 {
mikevd1 2:ca3d2395b6d3 164 return 2 ;
mikevd1 2:ca3d2395b6d3 165 }
mikevd1 2:ca3d2395b6d3 166 else if ( allData->RelaisK1 == 1 && allData->RelaisK2 == 0 )
mikevd1 2:ca3d2395b6d3 167 {
mikevd1 2:ca3d2395b6d3 168 return 3 ;
mikevd1 2:ca3d2395b6d3 169 }
mikevd1 2:ca3d2395b6d3 170 else if ( allData->RelaisK1 == 0 && allData->RelaisK2 == 0 )
mikevd1 2:ca3d2395b6d3 171 {
mikevd1 2:ca3d2395b6d3 172 return 4 ;
mikevd1 2:ca3d2395b6d3 173 }
mikevd1 2:ca3d2395b6d3 174 else
mikevd1 2:ca3d2395b6d3 175 {
mikevd1 2:ca3d2395b6d3 176 return 0 ;
mikevd1 2:ca3d2395b6d3 177 }
mikevd1 2:ca3d2395b6d3 178
mikevd1 0:d603d31b42dc 179 }
mikevd1 0:d603d31b42dc 180
mikevd1 0:d603d31b42dc 181 uint16_t update_crc16_reflected(const uint16_t *table, uint16_t crc, unsigned int c )
mikevd1 0:d603d31b42dc 182 {
mikevd1 0:d603d31b42dc 183 long short_c;
mikevd1 0:d603d31b42dc 184
mikevd1 0:d603d31b42dc 185 short_c = 0x00ff & (long) c;
mikevd1 0:d603d31b42dc 186
mikevd1 0:d603d31b42dc 187 /* Reflected form */
mikevd1 0:d603d31b42dc 188 return (crc >> 8) ^ table[(crc ^ short_c) & 0xff];
mikevd1 0:d603d31b42dc 189 }
mikevd1 0:d603d31b42dc 190
mikevd1 0:d603d31b42dc 191
mikevd1 0:d603d31b42dc 192 uint16_t update_crc16_A001( long crc, unsigned int c )
mikevd1 0:d603d31b42dc 193 {
mikevd1 0:d603d31b42dc 194 return update_crc16_reflected(crc_tab_8005_reflected,crc,c);
mikevd1 0:d603d31b42dc 195 }
mikevd1 0:d603d31b42dc 196
mikevd1 0:d603d31b42dc 197
mikevd1 0:d603d31b42dc 198 long calculate_crc16_Modbus(unsigned int *p, unsigned int length)
mikevd1 0:d603d31b42dc 199 {
mikevd1 0:d603d31b42dc 200 long crc;
mikevd1 0:d603d31b42dc 201 unsigned int i;
mikevd1 0:d603d31b42dc 202
mikevd1 0:d603d31b42dc 203 crc = 0xFFFF;
mikevd1 0:d603d31b42dc 204
mikevd1 0:d603d31b42dc 205 for (i=0; i < length; i++)
mikevd1 0:d603d31b42dc 206 {
mikevd1 0:d603d31b42dc 207 crc = update_crc16_A001(crc,*p++);
mikevd1 0:d603d31b42dc 208 }
mikevd1 0:d603d31b42dc 209 return crc;
mikevd1 0:d603d31b42dc 210 }
mikevd1 0:d603d31b42dc 211
mikevd1 2:ca3d2395b6d3 212 int functionCodeCheckMaxData(int functionCode)
mikevd1 2:ca3d2395b6d3 213 {
mikevd1 2:ca3d2395b6d3 214 // exclude function code in byte count
mikevd1 2:ca3d2395b6d3 215 switch (functionCode)
mikevd1 2:ca3d2395b6d3 216 {
mikevd1 2:ca3d2395b6d3 217 // function code 0x01
mikevd1 2:ca3d2395b6d3 218 case 0x02 :
mikevd1 2:ca3d2395b6d3 219 return 0x04 + 2 ;
mikevd1 2:ca3d2395b6d3 220 //break ;
mikevd1 2:ca3d2395b6d3 221 case 0x04 :
mikevd1 2:ca3d2395b6d3 222 return 0x04 + 2 ;
mikevd1 2:ca3d2395b6d3 223 //break ;
mikevd1 2:ca3d2395b6d3 224 case 0x06 :
mikevd1 2:ca3d2395b6d3 225 return 0x04 + 2 ;
mikevd1 2:ca3d2395b6d3 226 default :
mikevd1 2:ca3d2395b6d3 227 buffer = 0 ;
mikevd1 2:ca3d2395b6d3 228 return 0 ;
mikevd1 2:ca3d2395b6d3 229 }
mikevd1 2:ca3d2395b6d3 230 }
mikevd1 2:ca3d2395b6d3 231 void CRCChecking(void)
mikevd1 2:ca3d2395b6d3 232 {
mikevd1 2:ca3d2395b6d3 233 unsigned long crc = ((dataReceived[buffer - 1] << 8) | dataReceived[buffer - 2]); // combine the crc Low & High bytes
mikevd1 2:ca3d2395b6d3 234 if ( calculate_crc16_Modbus(dataReceived, buffer - 2 ) == crc )
mikevd1 2:ca3d2395b6d3 235 {
mikevd1 2:ca3d2395b6d3 236 buffer++ ;
mikevd1 2:ca3d2395b6d3 237 }
mikevd1 2:ca3d2395b6d3 238 else
mikevd1 2:ca3d2395b6d3 239 {
mikevd1 2:ca3d2395b6d3 240 buffer = 0 ;
mikevd1 2:ca3d2395b6d3 241 }
mikevd1 2:ca3d2395b6d3 242 }