Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.36 KB | None | 0 0
  1. #include <SoftwareSerial.h>
  2.  
  3. #define TRUE 1
  4. #define FALSE 0
  5. #define RX 6
  6. #define TX 9
  7. #define LIN_BAUD_RATE 19200
  8. #define FRAME_LENGTH 10
  9. #define BREAK_FIELD_DOMINANT_TIME 937.5 //19200 első periódusa
  10. #define BREAK_FIELD_RECESSIVE_TIME 103.166
  11. #define WAKE_UP_BREAK 25
  12. #define HEADER_DELAY 1
  13. #define BASIC_DELAY 1
  14. #define SYNC 0x55
  15. #define ACQUISITION_PERIOD 1000
  16. #define MASK_00 0x01
  17. #define MASK_01 0x02
  18. #define MASK_02 0x04
  19. #define MASK_03 0x08
  20. #define MASK_04 0x10
  21. #define MASK_05 0x20
  22.  
  23. SoftwareSerial LIN (RX, TX);
  24.  
  25. void display_init(void) {
  26. Serial.begin(9600);
  27. while (!Serial);
  28.  
  29. Serial.print("VW IPS Sensor. Continental GmbH");
  30. Serial.print("\nPeriod acqusition of 0x2F and 0x30 frames");
  31. }
  32.  
  33. byte calculate_PID(byte ID) {
  34. byte PID, b0, b1, b2, b3, b4, b5, p1, p0;
  35. ID = ID & 0x3F;
  36.  
  37. b0 = ID & MASK_00;
  38. b1 = (ID & MASK_01) >> 1;
  39. b2 = (ID & MASK_02) >> 2;
  40. b3 = (ID & MASK_03) >> 3;
  41. b4 = (ID & MASK_04) >> 4;
  42. b5 = (ID & MASK_05) >> 5;
  43.  
  44. p0 = ( b0 ^ b1 ^ b2 ^ b4) << 6;
  45. p1 = ( ~(b1 ^ b3 ^ b4 ^ b5)) << 7;
  46.  
  47. PID = ID | p0 | p1;
  48. return PID;
  49. }
  50.  
  51. void generate_break_field(void) {
  52. digitalWrite(TX, LOW);
  53. delayMicroseconds(BREAK_FIELD_DOMINANT_TIME);
  54. digitalWrite(TX, HIGH);
  55. delayMicroseconds(BREAK_FIELD_RECESSIVE_TIME);
  56. }
  57.  
  58. void close_LIN(void) {
  59. LIN.flush();
  60. LIN.end();
  61. }
  62.  
  63. void bus_init(void) {
  64. pinMode(TX, OUTPUT);
  65. pinMode(RX, INPUT);
  66. }
  67.  
  68. void send_header(byte ID) {
  69. byte PID;
  70.  
  71. PID = calculate_PID(ID);
  72. generate_break_field();
  73. LIN.begin(LIN_BAUD_RATE);
  74. while (!LIN);
  75.  
  76. LIN.write(SYNC);
  77. LIN.write(PID);
  78.  
  79. digitalWrite(TX, HIGH);
  80. delay(HEADER_DELAY);
  81. }
  82.  
  83. void receive_data(byte* ptr_frame_data) {
  84. short int idx;
  85.  
  86. for (idx = 1; idx < FRAME_LENGTH; idx++) {
  87. delay(BASIC_DELAY);
  88. ptr_frame_data[idx] = LIN.read();
  89. }
  90.  
  91. close_LIN();
  92. }
  93.  
  94. void display_frame_data(byte* ptr_frame_data) {
  95. Serial.print("\n\n\nFrame 0x");
  96. if (ptr_frame_data[0] <= 0x0F) {
  97. Serial.print("0");
  98. }
  99. Serial.print(ptr_frame_data[0]);
  100. Serial.print("\n");
  101.  
  102. for (int i = 0; i < FRAME_LENGTH; i++) {
  103. if (ptr_frame_data[i] <= 0x0F) {
  104. Serial.print("0");
  105. }
  106. Serial.print(ptr_frame_data[i], HEX);
  107. Serial.print(" ");
  108. }
  109. }
  110.  
  111. byte evaluate_checksum(byte* ptr_frame_data) {
  112. return 1;
  113. }
  114.  
  115. void BDM_Spannung_dyn(byte* ptr_frame_data) {
  116. unsigned int BDM_Spannung_dyn;
  117. byte volts;
  118. byte digit1, digit2, digit3;
  119.  
  120. BDM_Spannung_dyn = ((unsigned int)ptr_frame_data[2] & 0x3F) << 8;
  121. BDM_Spannung_dyn += (unsigned int)ptr_frame_data[1];
  122. BDM_Spannung_dyn += 4000;
  123.  
  124. volts = (byte)(BDM_Spannung_dyn / 1000);
  125. digit1 = (byte)(BDM_Spannung_dyn - (volts * 1000)) / 100;
  126. digit2 = (byte)(BDM_Spannung_dyn % 100) / 10;
  127. digit3 = (byte)(BDM_Spannung_dyn % 10);
  128.  
  129. Serial.print("\nBDM Spannung: ");
  130. Serial.print(volts, DEC);
  131. Serial.print(".");
  132. Serial.print(digit1, DEC);
  133. Serial.print(digit2, DEC);
  134. Serial.print(digit3, DEC);
  135. Serial.print(".");
  136. }
  137.  
  138. void BDM_Temp_dyn(byte* ptr_frame_data) {
  139.  
  140. }
  141.  
  142. void BDM_I_Bereich_and_BDM_Storm_dyn(byte* ptr_frame_data) {
  143.  
  144. }
  145.  
  146. void BZE_SOC_K20(byte* ptr_frame_data) {
  147.  
  148. }
  149.  
  150. void acquire_frame_2F() {
  151. byte frame_data[FRAME_LENGTH] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
  152. byte checksum_matches;
  153.  
  154. send_header(0x2F);
  155. receive_data(frame_data);
  156.  
  157. frame_data[0] = 0x2F;
  158. display_frame_data(frame_data);
  159.  
  160. frame_data[0] = calculate_PID(0x2F);
  161. checksum_matches = evaluate_checksum(frame_data);
  162.  
  163. if (checksum_matches == FALSE) {
  164. Serial.print("\n Checksum error!");
  165. } else {
  166. BDM_Spannung_dyn(frame_data);
  167. Serial.print("\nVoltage: ");
  168. Serial.print(getSignalPhys(frame_data, 8, 14, 4000, 1000));
  169. Serial.print("V");
  170.  
  171. Serial.print("\nTemperature: ");
  172. Serial.print(getSignalPhys(frame_data, 40, 8, -40, 1));
  173. Serial.print("C");
  174.  
  175. byte bereich = getSignalPhys(frame_data, 22, 2, 0, 1);
  176. Serial.print("\nStrom bereich: ");
  177. Serial.print(bereich);
  178. int strom = 0;
  179. strom =
  180.  
  181. // BDM_Temp_dyn(frame_data);
  182. BDM_I_Bereich_and_BDM_Storm_dyn(frame_data);
  183. }
  184. }
  185.  
  186. void acquire_frame_30() {
  187. byte frame_data[FRAME_LENGTH] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
  188. byte checksum_matches;
  189.  
  190. send_header(0x30);
  191. receive_data(frame_data);
  192.  
  193. frame_data[0] = 0x30;
  194. display_frame_data(frame_data);
  195.  
  196. frame_data[0] = calculate_PID(0x30);
  197. checksum_matches = evaluate_checksum(frame_data);
  198.  
  199. if (checksum_matches == FALSE) {
  200. Serial.print("\n Checksum error!");
  201. } else {
  202. BZE_SOC_K20(frame_data);
  203. }
  204. }
  205.  
  206.  
  207.  
  208. void setup() {
  209. display_init();
  210. bus_init();
  211. }
  212.  
  213. #define GET_BIT(INPUT, POS) ((INPUT & (1 << POS)) >> POS);
  214.  
  215. float getSignalPhys(unsigned char * frame, unsigned char position,
  216. unsigned char length, int offset, unsigned int factor) {
  217. unsigned long raw_value = 0;
  218. unsigned char step, byte_index, bit_index;
  219. byte bit;
  220.  
  221. for (step = 0; step < length; step++) {
  222. byte_index = (position + step) / 8;
  223. bit_index = (position + step) & 0x7;
  224. bit = GET_BIT(frame[byte_index], bit_index);
  225. raw_value |= bit << step;
  226. }
  227. return (((float)raw_value + (float)offset) / (float)factor);
  228. }
  229.  
  230. void printSignalPhys() {
  231.  
  232. }
  233.  
  234. void loop() {
  235. acquire_frame_2F();
  236. delay(ACQUISITION_PERIOD);
  237. acquire_frame_30();
  238. delay(ACQUISITION_PERIOD);
  239. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement