KGBRUS

Modul2_SBH_Sud_Einfahrt

May 26th, 2023
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.64 KB | None | 0 0
  1. /*History Version 1.0 Ein & AUsgänge definiert 19.05.23 sowie CAN Nachrit senden
  2. Senden der Zustande LS Einfahrt SBH, Vmax und einfahrt Wendel Funktionstest Via CAn an Zentrale Funktioniert
  3. 1.1 Daten direkt in CAN Data 0 schreiben Also ohne Variable Data00 für Nachricht 1
  4. 1.2 Leerzeilen gelöscht und CANmsg noch oben verschoben ungetestet
  5. 2.0 Empfangen von nachricht von Zentrale ausgänge Weiche Einfahrt SBH - funktioniert
  6.  
  7.  
  8.  
  9.  
  10. */
  11. // -------------------------------------- Umbenenen der STM Pins
  12. // Bliotheken
  13. //------------------------------------------------------------------------------------------------------------Testweise auskommentiert #include <assert.h>
  14. #include "stm32f103.h" // Bei selbst erstellten Bibliotheken der name immer in Anführungszeichen!! Nicht in <> kleiner als Zeichen!
  15.  
  16. // EIngaenge
  17. // Lichtschranke
  18. const int LSEinfahrtSBHSud = PB12;
  19. const int LSVmaxSBHSud = PB13; // Messung der aktuellen Geschwindigkeit um Fahrspannung Fest zu legen
  20. const int LSEinfahrtWendelSud = PB14;
  21. uint8_t LSEinfahrtSBHSudState = 0;
  22. uint8_t LSVmaxSBHSudState = 0;
  23. uint8_t LSEinfahrtWendelSudState = 0;
  24.  
  25. // Ausgaenge
  26. const int WeicheEinfahrtSBHSudGeradeaus = PA0;
  27. const int WeicheEinfahrtSBHSudAbbiegen = PA1;
  28. uint8_t WeicheEinfahrtSBHSudGeradeausState = 0;
  29. uint8_t WeicheEinfahrtSBHSudAbbiegenState = 0;
  30.  
  31. // nur zum Test
  32. uint8_t LSEinfahrtSBHSudGleis1State = 0;
  33.  
  34. // ------------------------------------------Variabelen
  35. // CAN
  36. uint8_t counter = 0; // Zahler für nachricht wurde x mal versand
  37. uint8_t frameLength = 0; // framelegth ist die länge der nachricht hier kann man auch im Sendeteil eine Zahl angeben
  38. unsigned long previousMillis = 0; // stores last time output was updated
  39. const long interval = 100; // transmission interval (milliseconds) Intervall in dem gesendet wird
  40. CAN_msg_t CAN_TX_msg; // Initialisierung Senden
  41. CAN_msg_t CAN_RX_msg; // Initialisierung EMPFANGEN
  42.  
  43. void setup()
  44. {
  45. pinMode(LED_BUILTIN, OUTPUT); //LED auf Arduino Blinken um programierung zu bestätigen
  46. delay(1500);
  47. digitalWrite(PC13, HIGH);
  48. delay(500);
  49. digitalWrite(PC13, LOW);
  50. delay(500);
  51. digitalWrite(PC13, HIGH);
  52. delay(500);
  53. digitalWrite(PC13, LOW);
  54. delay(500);
  55. digitalWrite(PC13, HIGH);
  56. // CAN aktivieren
  57. {
  58. Serial.begin(115200);
  59. bool ret = CANInit(CAN_500KBPS, 0); // CAN_RX mapped to PA11, CAN_TX mapped to PA12
  60. if (!ret) while (true);
  61. }
  62. // -------------------------------------- pinMode
  63. pinMode(LSEinfahrtSBHSud, INPUT);
  64. pinMode(LSVmaxSBHSud, INPUT); // Messung der aktuellen Geschwindigkeit um Fahrspannung Fest zu legen
  65. pinMode(LSEinfahrtWendelSud, INPUT);
  66. pinMode(WeicheEinfahrtSBHSudGeradeaus, OUTPUT);
  67. pinMode(WeicheEinfahrtSBHSudAbbiegen, OUTPUT);
  68. }
  69.  
  70. void loop()
  71. {
  72. // put your main code here, to run repeatedly:
  73.  
  74. // ---------------------------- Begin CAN
  75. {
  76. {
  77. // ---------------------------- Begin CAN Senden
  78. // ---------------------------- CAN Nachricht 0x10001 senden
  79. // eigentliche Daten werden eingefüllt
  80. bitWrite (CAN_TX_msg.data[0], 0, LSEinfahrtSBHSudState); // mit bitwrite lassen sich einzelne bits innerhalb eines Bytes beschreiben. Hier Zustand TasterState in Erstes (ganz rechtes) Bit von Data0 schreiben
  81. bitWrite (CAN_TX_msg.data[0], 1, LSVmaxSBHSudState);
  82. bitWrite (CAN_TX_msg.data[0], 2, LSEinfahrtWendelSudState);
  83. CAN_TX_msg.len = 1; // Länge der Nachricht
  84. unsigned long currentMillis = millis(); // Senden alle x millisekunden
  85. if (currentMillis - previousMillis >= interval)
  86. {
  87. previousMillis = currentMillis;
  88. if ( ( counter % 2) == 0)
  89. { // Rest der Nachricht wird befüllt
  90. CAN_TX_msg.type = DATA_FRAME;
  91. if (CAN_TX_msg.len == 0) CAN_TX_msg.type = REMOTE_FRAME;
  92. CAN_TX_msg.format = EXTENDED_FORMAT;
  93. CAN_TX_msg.id = 0x100001; // nachrichten ID
  94. }
  95. CANSend(&CAN_TX_msg); // Übergabe der Nachricht an die Hardware
  96. }
  97. }
  98. // ---------------------------- Begin CAN Empfangen
  99. {
  100. // ---------------------------- CAN Nachricht empfangen
  101. if (CANMsgAvail())
  102. {
  103. CANReceive(&CAN_RX_msg); // Prüfen ob neue Nachricht empfangen werden kann (liegt eine neue Nachricht zum abholen bereit?)
  104. if (CAN_RX_msg.type == DATA_FRAME)
  105. {
  106. if (CAN_RX_msg.id == 0x100009) // Empfang der nachricht 0x100009 von Modul 2 Weiche SBH einfahrt
  107. {
  108. WeicheEinfahrtSBHSudGeradeausState = bitRead (CAN_RX_msg.data[0], 0);
  109. WeicheEinfahrtSBHSudAbbiegenState = bitRead (CAN_RX_msg.data[0], 1);
  110. }
  111. }
  112. }
  113. }
  114. }
  115. //------ Auslesen der Eingaenge (Sensoren)
  116. {
  117. LSEinfahrtSBHSudState = digitalRead(LSEinfahrtSBHSud);
  118. LSVmaxSBHSudState = digitalRead(LSVmaxSBHSud);
  119. LSEinfahrtWendelSudState = digitalRead(LSEinfahrtWendelSud);
  120. }
  121.  
  122. //------ Schalten der AUsgänge
  123. {
  124. if (WeicheEinfahrtSBHSudGeradeausState == 1)
  125. {
  126. digitalWrite(WeicheEinfahrtSBHSudGeradeaus, HIGH);
  127. }
  128. else
  129. {
  130. digitalWrite(WeicheEinfahrtSBHSudGeradeaus, LOW);
  131. }
  132. if (WeicheEinfahrtSBHSudAbbiegenState == 1)
  133. {
  134. digitalWrite(WeicheEinfahrtSBHSudAbbiegen, HIGH);
  135. }
  136. else
  137. {
  138. digitalWrite(WeicheEinfahrtSBHSudAbbiegen, LOW);
  139. }
  140.  
  141. }
  142. }
Advertisement
Add Comment
Please, Sign In to add comment