KGBRUS

Stellwerk0B

Oct 31st, 2023
375
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.62 KB | None | 0 0
  1. /*History Version 1.0 Variablen immer im Format : was Wo Welche = zB TastSBHSudBelegt
  2. Ein & AUsgänge definiert
  3. CAN MSG 0x500021 senden und Nachricht 0x800022 empfangen eingepflegt
  4. LCD und status SBH Sud Eingepflegt -- funktioniert auf testboard
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11. */
  12. // -------------------------------------- Umbenenen der STM Pins
  13. // Bliotheken
  14. //------------------------------------------------------------------------------------------------------------Testweise auskommentiert #include <assert.h>
  15. #include "stm32f103.h" // Bei selbst erstellten Bibliotheken der name immer in Anfuehrungszeichen!! Nicht in <> kleiner als Zeichen!
  16. #include <LiquidCrystal.h>
  17.  
  18. // EIngaenge
  19. // Taster
  20. const int TastStellwerk0Blattern = PB12;
  21. const int TastStellwerk0Set = PB13;
  22. const int TastStellwerk0Plus = PB14;
  23. const int TastStellwerk0Minus = PB15;
  24.  
  25.  
  26. uint8_t TastStellwerk0BlatternState = 0;
  27. uint8_t TastStellwerk0SetState = 0;
  28. uint8_t TastStellwerk0PlusState = 0;
  29. uint8_t TastStellwerk0MinusState = 0;
  30.  
  31.  
  32.  
  33. // Schalter
  34. const int SchaltWendel0WestSud = PA8;
  35. const int SchaltWendel0WestWest = PA9;
  36. const int SchaltWendel0SudWest = PA10;
  37. const int SchaltWendel0SudSud = PB6;
  38.  
  39. uint8_t SchaltWendel0WestSudState = 0;
  40. uint8_t SchaltWendel0WestWestState = 0;
  41. uint8_t SchaltWendel0SudWestState = 0;
  42. uint8_t SchaltWendel0SudSudState = 0;
  43. // Ausgaenge
  44.  
  45. const int AnzeigeWendelWestSudBelegt = PA0;
  46. const int AnzeigeWendelWestWestBelegt = PA1;
  47. const int AnzeigeWendelSudWestBelegt = PA2;
  48. const int AnzeigeWendelSudSudBelegt = PA3;
  49.  
  50. uint8_t AnzeigeWendelWestSudBelegtState = 0;
  51. uint8_t AnzeigeWendelWestWestBelegtState = 0;
  52. uint8_t AnzeigeWendelSudWestBelegtState = 0;
  53. uint8_t AnzeigeWendelSudSudBelegtState = 0;
  54.  
  55. // LCD Ausgänge
  56. const int rs = PA6, en = PA7, d4 = PB0, d5 = PB1, d6 = PB10, d7 = PB11;
  57. LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
  58.  
  59.  
  60. // ------------------------------------------Variabelen
  61. // CAN
  62. uint8_t counter = 0; // Zahler für nachricht wurde x mal versand
  63. uint8_t frameLength = 0; // framelegth ist die länge der nachricht hier kann man auch im Sendeteil eine Zahl angeben
  64. unsigned long previousMillis = 0; // stores last time output was updated
  65. const long interval = 250; // transmission interval (milliseconds) Intervall in dem gesendet wird
  66. CAN_msg_t CAN_TX_msg; // Initialisierung Senden
  67. CAN_msg_t CAN_RX_msg; // Initialisierung EMPFANGEN
  68.  
  69. // LCD Anzeige
  70. unsigned long ZeitspeicherLCDAnzeige = 0;
  71. unsigned long DauerLCDAnzeige = 2000;
  72.  
  73.  
  74. //------------------------------------------ - Statusvariablen von Zentrale
  75. uint8_t LSEinfahrtSBHSudState = 0;
  76. uint8_t LSEinfahrtWendelSudState = 0;
  77. uint8_t LSVmaxSBHSudState = 0;
  78. uint8_t LSEinfahrtSBHSudGleis1State = 0;
  79. uint8_t LSEinfahrtSBHSudGleis2State = 0;
  80. uint8_t LSEinfahrtSBHSudGleis3State = 0;
  81. uint8_t LSEinfahrtSBHSudGleis4State = 0;
  82. uint8_t LSEinfahrtSBHSudGleis5State = 0;
  83. uint8_t LSEndposSBHSudGleis1State = 0;
  84. uint8_t LSEndposSBHSudGleis2State = 0;
  85. uint8_t LSEndposSBHSudGleis3State = 0;
  86. uint8_t LSEndposSBHSudGleis4State = 0;
  87. uint8_t LSEndposSBHSudGleis5State = 0;
  88. uint8_t LSEinfahrtKehrschleifeSBHSudState = 0;
  89. uint8_t VARSBHSudFehlerState = 0;
  90. uint8_t VARSBHSudVollState = 0;
  91. uint8_t FahrstromSBHSudAllgemeinState = 0;
  92. uint8_t FahrstromSBHSudAbstellState = 0;
  93. uint8_t SBHSudStatus = 3 ; // Satus SBH Sud
  94. uint8_t SBHSUDaktGleis = 0;
  95.  
  96. // Modul6 Kreuzung
  97. uint8_t LSEinfahrtVonSBHWest1State = 0;
  98. uint8_t LSEinfahrtVonSBHWest2State = 0;
  99. uint8_t LSEinfahrtVonSBHSudState = 0;
  100. uint8_t LSEinfahrtVonWendelWestState = 0;
  101.  
  102.  
  103. // --------------- State Maschine LCD
  104. enum LCDANZEIGEEBENE0
  105. {
  106. UEBERSICHT
  107. };
  108. LCDANZEIGEEBENE0 akt_state_LCDANZEIGEEBENE0 = UEBERSICHT;
  109. LCDANZEIGEEBENE0 next_state_LCDANZEIGEEBENE0 = UEBERSICHT;
  110.  
  111. void setup()
  112. {
  113. pinMode(LED_BUILTIN, OUTPUT); //LED auf Arduino Blinken um programierung zu bestätigen
  114. delay(1500);
  115. digitalWrite(PC13, HIGH);
  116. delay(500);
  117. digitalWrite(PC13, LOW);
  118. delay(500);
  119. digitalWrite(PC13, HIGH);
  120. delay(500);
  121. digitalWrite(PC13, LOW);
  122. delay(500);
  123. digitalWrite(PC13, HIGH);
  124. // CAN aktivieren
  125. {
  126. Serial.begin(115200);
  127. bool ret = CANInit(CAN_500KBPS, 0); // CAN_RX mapped to PA11, CAN_TX mapped to PA12
  128. if (!ret) while (true);
  129. }
  130. // -------------------------------------- pinMode
  131. {
  132. pinMode(TastStellwerk0Blattern, INPUT);
  133. pinMode(TastStellwerk0Set, INPUT);
  134. pinMode(TastStellwerk0Plus, INPUT);
  135. pinMode(TastStellwerk0Minus, INPUT);
  136. pinMode(SchaltWendel0WestSud, INPUT);
  137. pinMode(SchaltWendel0WestWest, INPUT);
  138. pinMode(SchaltWendel0SudWest, INPUT);
  139. pinMode(SchaltWendel0SudSud, INPUT);
  140. pinMode(AnzeigeWendelWestSudBelegt, OUTPUT);
  141. pinMode(AnzeigeWendelWestWestBelegt, OUTPUT);
  142. pinMode(AnzeigeWendelSudWestBelegt, OUTPUT);
  143. pinMode(AnzeigeWendelSudSudBelegt, OUTPUT);
  144. }
  145. // LCD initialisieren
  146. {
  147. lcd.begin(20, 4);
  148. lcd.print("Tach Kay!");
  149. delay(1000);
  150. lcd.clear();
  151. delay(1000);
  152. }
  153.  
  154. }
  155.  
  156. void loop()
  157. {
  158. // put your main code here, to run repeatedly:
  159.  
  160. // ---------------------------- Begin CAN
  161. {
  162. {
  163.  
  164.  
  165. // ---------------------------- Begin CAN Senden
  166. // ---------------------------- CAN Nachricht 0x500023 senden an Zentrale
  167. // eigentliche Daten werden eingefüllt
  168. bitWrite (CAN_TX_msg.data[0], 0, SchaltWendel0WestSudState ); // mit bitwrite lassen sich einzelne bits innerhalb eines Bytes beschreiben. Hier Zustand TasterState in Erstes (ganz rechtes) Bit von Data0 schreiben
  169. bitWrite (CAN_TX_msg.data[0], 1, SchaltWendel0WestWestState);
  170. bitWrite (CAN_TX_msg.data[0], 2, SchaltWendel0SudWestState);
  171. bitWrite (CAN_TX_msg.data[0], 3, SchaltWendel0SudSudState );
  172.  
  173. CAN_TX_msg.len = 1; // Länge der Nachricht
  174. unsigned long currentMillis = millis(); // Senden alle x millisekunden
  175. if (currentMillis - previousMillis >= interval)
  176. {
  177. previousMillis = currentMillis;
  178. if ( ( counter % 2) == 0)
  179. { // Rest der Nachricht wird befüllt
  180. CAN_TX_msg.type = DATA_FRAME;
  181. if (CAN_TX_msg.len == 0) CAN_TX_msg.type = REMOTE_FRAME;
  182. CAN_TX_msg.format = EXTENDED_FORMAT;
  183. CAN_TX_msg.id = 0x500023; // nachrichten ID
  184. }
  185. CANSend(&CAN_TX_msg); // Übergabe der Nachricht an die Hardware
  186. }
  187. }
  188. // ---------------------------- Begin CAN Empfangen
  189. {
  190. // ---------------------------- CAN Nachricht empfangen
  191. if (CANMsgAvail())
  192. {
  193. CANReceive(&CAN_RX_msg); // Prüfen ob neue Nacvhricht empfangen werden kann (liegt eine neue Nachricht zum abholen bereit?)
  194. if (CAN_RX_msg.type == DATA_FRAME)
  195. {
  196. if (CAN_RX_msg.id == 0x100024) // Empfang der nachricht 0x500024 von Zentrale (Nachichtt beinhaltet alle daten zu SBH Süd es werden nur die Relevanten Daten abgefragt)
  197. {
  198. LSEinfahrtSBHSudState = bitRead (CAN_TX_msg.data[0], 0);
  199. LSEinfahrtWendelSudState = bitRead (CAN_TX_msg.data[0], 1);
  200. LSVmaxSBHSudState = bitRead (CAN_TX_msg.data[0], 2);
  201. LSEinfahrtSBHSudGleis1State = bitRead (CAN_TX_msg.data[0], 3);
  202. LSEinfahrtSBHSudGleis2State = bitRead (CAN_TX_msg.data[0], 4);
  203. LSEinfahrtSBHSudGleis3State = bitRead (CAN_TX_msg.data[0], 5);
  204. LSEinfahrtSBHSudGleis4State = bitRead (CAN_TX_msg.data[0], 6);
  205. LSEinfahrtSBHSudGleis5State = bitRead (CAN_TX_msg.data[0], 7);
  206. LSEndposSBHSudGleis1State = bitRead (CAN_RX_msg.data[1], 0);
  207. LSEndposSBHSudGleis2State = bitRead (CAN_RX_msg.data[1], 1);
  208. LSEndposSBHSudGleis3State = bitRead (CAN_RX_msg.data[1], 2);
  209. LSEndposSBHSudGleis4State = bitRead (CAN_RX_msg.data[1], 3);
  210. LSEndposSBHSudGleis5State = bitRead (CAN_RX_msg.data[1], 4);
  211. LSEinfahrtKehrschleifeSBHSudState = bitRead (CAN_TX_msg.data[1], 5);
  212. VARSBHSudFehlerState = bitRead (CAN_TX_msg.data[1], 6);
  213. VARSBHSudVollState = bitRead (CAN_TX_msg.data[1], 7);
  214. FahrstromSBHSudAllgemeinState = CAN_TX_msg.data[2];
  215. FahrstromSBHSudAbstellState = CAN_TX_msg.data[3];
  216. SBHSudStatus = CAN_TX_msg.data[4];
  217.  
  218. }
  219. if (CAN_RX_msg.id == 0x100005) // nachrichten ID 0x100005 von Modul 6
  220. {
  221. LSEinfahrtVonSBHWest1State = bitRead(CAN_RX_msg.data[0], 0);
  222. LSEinfahrtVonSBHWest2State = bitRead(CAN_RX_msg.data[0], 1);
  223. LSEinfahrtVonSBHSudState = bitRead(CAN_RX_msg.data[0], 2);
  224. LSEinfahrtVonWendelWestState = bitRead(CAN_RX_msg.data[0], 3);
  225. }
  226. }
  227. }
  228. }
  229. }
  230.  
  231. //------ Auslesen der Eingaenge
  232. {
  233. TastStellwerk0BlatternState = digitalRead(TastStellwerk0Blattern);
  234. TastStellwerk0SetState = digitalRead(TastStellwerk0Set);
  235. TastStellwerk0PlusState = digitalRead(TastStellwerk0Plus);
  236. TastStellwerk0MinusState = digitalRead(TastStellwerk0Minus);
  237. delay(50);
  238. SchaltWendel0WestSudState = digitalRead(SchaltWendel0WestSud);
  239. SchaltWendel0WestWestState = digitalRead(SchaltWendel0WestWest);
  240. SchaltWendel0SudWestState = digitalRead(SchaltWendel0SudWest);
  241. SchaltWendel0SudSudState = digitalRead(SchaltWendel0SudSud);
  242. delay(50);
  243.  
  244.  
  245. }
  246.  
  247. //------ Schalten der AUsgänge
  248. {
  249. // Variablen der ANzeige LEDS dem eingang zuweisen
  250. if (SchaltWendel0WestSudState || LSEinfahrtVonSBHWest1State == HIGH)
  251. {
  252. AnzeigeWendelWestSudBelegtState = 1;
  253. }
  254. else
  255. {
  256. AnzeigeWendelWestSudBelegtState = 0;
  257. }
  258. if (SchaltWendel0WestWestState || LSEinfahrtVonSBHWest2State == HIGH)
  259. {
  260. AnzeigeWendelWestWestBelegtState = 1;
  261. }
  262. else
  263. {
  264. AnzeigeWendelWestWestBelegtState = 0;
  265. }
  266. if (SchaltWendel0SudWestState || LSEinfahrtVonSBHSudState == HIGH)
  267. {
  268. AnzeigeWendelSudWestBelegtState = 1;
  269. }
  270. else
  271. {
  272. AnzeigeWendelSudWestBelegtState = 0;
  273. }
  274. if (SchaltWendel0SudSudState || LSEinfahrtVonWendelWestState == HIGH)
  275. {
  276. AnzeigeWendelSudSudBelegtState = 1;
  277. }
  278. else
  279. {
  280. AnzeigeWendelSudSudBelegtState = 0;
  281. }
  282.  
  283.  
  284. }
  285.  
  286. {
  287. digitalWrite( AnzeigeWendelWestSudBelegt, AnzeigeWendelWestSudBelegtState);
  288. digitalWrite( AnzeigeWendelWestWestBelegt, AnzeigeWendelWestWestBelegtState);
  289. digitalWrite( AnzeigeWendelSudWestBelegt, AnzeigeWendelSudWestBelegtState);
  290. digitalWrite( AnzeigeWendelSudSudBelegt, AnzeigeWendelSudSudBelegtState);
  291.  
  292. }
  293. {
  294. // --------------------------- begin state maschine LCD Anzeige
  295. if (next_state_LCDANZEIGEEBENE0 != akt_state_LCDANZEIGEEBENE0) // Hat sich der State geändert ?
  296. {
  297. switch (next_state_LCDANZEIGEEBENE0) // State Mashine für Wechselzwischen den Sates
  298. {
  299. case UEBERSICHT:
  300. {
  301. ZeitspeicherLCDAnzeige = millis();
  302. lcd.clear();
  303. break;
  304. }
  305.  
  306. }
  307. akt_state_LCDANZEIGEEBENE0 = next_state_LCDANZEIGEEBENE0; // -----------------Zustand Next in Zustand aktuell schreiben
  308. }
  309. switch (akt_state_LCDANZEIGEEBENE0) // Eigentliche State mschine für SBH Sued
  310. {
  311.  
  312. case UEBERSICHT:
  313. {
  314. lcd.setCursor(0, 0);
  315. lcd.print("Status SBH Sud");
  316. lcd.setCursor(0, 1);
  317. if (VARSBHSudFehlerState == 0 && VARSBHSudVollState == 0)
  318. {
  319. if (SBHSudStatus == 0)
  320. {
  321. lcd.print ("-Keine Daten ");
  322. }
  323. if (SBHSudStatus == 1)
  324. {
  325. lcd.print ("-Bereit ");
  326. }
  327. if (SBHSudStatus == 2)
  328. {
  329. lcd.print ("-Ausfahrt");
  330. lcd.print (" Gleis ");
  331. lcd.print (SBHSUDaktGleis);
  332. lcd.print (" ");
  333. }
  334. if (SBHSudStatus == 3)
  335. {
  336. lcd.print ("-Auswahl Gleis ");
  337. lcd.print (SBHSUDaktGleis);
  338. lcd.print (" ");
  339. }
  340. if (SBHSudStatus == 4)
  341. {
  342. lcd.print ("-Einfahrt");
  343. lcd.print (" Gleis ");
  344. lcd.print (SBHSUDaktGleis);
  345. lcd.print (" ");
  346. }
  347. }
  348. lcd.setCursor(0, 2);
  349. lcd.print(SBHSudStatus);
  350. lcd.setCursor(0, 3);
  351. lcd.print(FahrstromSBHSudAllgemeinState);
  352. if (VARSBHSudFehlerState == 0 && VARSBHSudVollState == 1)
  353. {
  354. lcd.print ("Voll ");
  355. }
  356. if (VARSBHSudFehlerState == 1 )
  357. {
  358. lcd.print ("Fehler ");
  359. }
  360.  
  361.  
  362.  
  363.  
  364. TastStellwerk0BlatternState = digitalRead(TastStellwerk0Blattern);
  365. if (TastStellwerk0BlatternState == 0)
  366. {
  367. // next_state_LCDANZEIGEEBENE0 = LSSBHSUDLS2;
  368. delay(250);
  369. }
  370. break;
  371. }
  372.  
  373.  
  374.  
  375. }
  376.  
  377.  
  378. // --------------------------- Ende state maschine LCD Anzeige
  379. }
  380. }
Advertisement
Add Comment
Please, Sign In to add comment