/*History Version 1.0 Variablen immer im Format : was Wo Welche = zB TastSBHSudBelegt Ein & AUsgänge definiert CAN MSG 0x500021 senden und Nachricht 0x800022 empfangen eingepflegt LCD und status SBH Sud Eingepflegt -- funktioniert auf testboard */ // -------------------------------------- Umbenenen der STM Pins // Bliotheken //------------------------------------------------------------------------------------------------------------Testweise auskommentiert #include #include "stm32f103.h" // Bei selbst erstellten Bibliotheken der name immer in Anfuehrungszeichen!! Nicht in <> kleiner als Zeichen! #include // EIngaenge // Taster const int TastStellwerk0Blattern = PB12; const int TastStellwerk0Set = PB13; const int TastStellwerk0Plus = PB14; const int TastStellwerk0Minus = PB15; uint8_t TastStellwerk0BlatternState = 0; uint8_t TastStellwerk0SetState = 0; uint8_t TastStellwerk0PlusState = 0; uint8_t TastStellwerk0MinusState = 0; // Schalter const int SchaltWendel0WestSud = PA8; const int SchaltWendel0WestWest = PA9; const int SchaltWendel0SudWest = PA10; const int SchaltWendel0SudSud = PB6; uint8_t SchaltWendel0WestSudState = 0; uint8_t SchaltWendel0WestWestState = 0; uint8_t SchaltWendel0SudWestState = 0; uint8_t SchaltWendel0SudSudState = 0; // Ausgaenge const int AnzeigeWendelWestSudBelegt = PA0; const int AnzeigeWendelWestWestBelegt = PA1; const int AnzeigeWendelSudWestBelegt = PA2; const int AnzeigeWendelSudSudBelegt = PA3; uint8_t AnzeigeWendelWestSudBelegtState = 0; uint8_t AnzeigeWendelWestWestBelegtState = 0; uint8_t AnzeigeWendelSudWestBelegtState = 0; uint8_t AnzeigeWendelSudSudBelegtState = 0; // LCD Ausgänge const int rs = PA6, en = PA7, d4 = PB0, d5 = PB1, d6 = PB10, d7 = PB11; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); // ------------------------------------------Variabelen // CAN uint8_t counter = 0; // Zahler für nachricht wurde x mal versand uint8_t frameLength = 0; // framelegth ist die länge der nachricht hier kann man auch im Sendeteil eine Zahl angeben unsigned long previousMillis = 0; // stores last time output was updated const long interval = 250; // transmission interval (milliseconds) Intervall in dem gesendet wird CAN_msg_t CAN_TX_msg; // Initialisierung Senden CAN_msg_t CAN_RX_msg; // Initialisierung EMPFANGEN // LCD Anzeige unsigned long ZeitspeicherLCDAnzeige = 0; unsigned long DauerLCDAnzeige = 2000; //------------------------------------------ - Statusvariablen von Zentrale uint8_t LSEinfahrtSBHSudState = 0; uint8_t LSEinfahrtWendelSudState = 0; uint8_t LSVmaxSBHSudState = 0; uint8_t LSEinfahrtSBHSudGleis1State = 0; uint8_t LSEinfahrtSBHSudGleis2State = 0; uint8_t LSEinfahrtSBHSudGleis3State = 0; uint8_t LSEinfahrtSBHSudGleis4State = 0; uint8_t LSEinfahrtSBHSudGleis5State = 0; uint8_t LSEndposSBHSudGleis1State = 0; uint8_t LSEndposSBHSudGleis2State = 0; uint8_t LSEndposSBHSudGleis3State = 0; uint8_t LSEndposSBHSudGleis4State = 0; uint8_t LSEndposSBHSudGleis5State = 0; uint8_t LSEinfahrtKehrschleifeSBHSudState = 0; uint8_t VARSBHSudFehlerState = 0; uint8_t VARSBHSudVollState = 0; uint8_t FahrstromSBHSudAllgemeinState = 0; uint8_t FahrstromSBHSudAbstellState = 0; uint8_t SBHSudStatus = 3 ; // Satus SBH Sud uint8_t SBHSUDaktGleis = 0; // Modul6 Kreuzung uint8_t LSEinfahrtVonSBHWest1State = 0; uint8_t LSEinfahrtVonSBHWest2State = 0; uint8_t LSEinfahrtVonSBHSudState = 0; uint8_t LSEinfahrtVonWendelWestState = 0; // --------------- State Maschine LCD enum LCDANZEIGEEBENE0 { UEBERSICHT }; LCDANZEIGEEBENE0 akt_state_LCDANZEIGEEBENE0 = UEBERSICHT; LCDANZEIGEEBENE0 next_state_LCDANZEIGEEBENE0 = UEBERSICHT; void setup() { pinMode(LED_BUILTIN, OUTPUT); //LED auf Arduino Blinken um programierung zu bestätigen delay(1500); digitalWrite(PC13, HIGH); delay(500); digitalWrite(PC13, LOW); delay(500); digitalWrite(PC13, HIGH); delay(500); digitalWrite(PC13, LOW); delay(500); digitalWrite(PC13, HIGH); // CAN aktivieren { Serial.begin(115200); bool ret = CANInit(CAN_500KBPS, 0); // CAN_RX mapped to PA11, CAN_TX mapped to PA12 if (!ret) while (true); } // -------------------------------------- pinMode { pinMode(TastStellwerk0Blattern, INPUT); pinMode(TastStellwerk0Set, INPUT); pinMode(TastStellwerk0Plus, INPUT); pinMode(TastStellwerk0Minus, INPUT); pinMode(SchaltWendel0WestSud, INPUT); pinMode(SchaltWendel0WestWest, INPUT); pinMode(SchaltWendel0SudWest, INPUT); pinMode(SchaltWendel0SudSud, INPUT); pinMode(AnzeigeWendelWestSudBelegt, OUTPUT); pinMode(AnzeigeWendelWestWestBelegt, OUTPUT); pinMode(AnzeigeWendelSudWestBelegt, OUTPUT); pinMode(AnzeigeWendelSudSudBelegt, OUTPUT); } // LCD initialisieren { lcd.begin(20, 4); lcd.print("Tach Kay!"); delay(1000); lcd.clear(); delay(1000); } } void loop() { // put your main code here, to run repeatedly: // ---------------------------- Begin CAN { { // ---------------------------- Begin CAN Senden // ---------------------------- CAN Nachricht 0x500023 senden an Zentrale // eigentliche Daten werden eingefüllt 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 bitWrite (CAN_TX_msg.data[0], 1, SchaltWendel0WestWestState); bitWrite (CAN_TX_msg.data[0], 2, SchaltWendel0SudWestState); bitWrite (CAN_TX_msg.data[0], 3, SchaltWendel0SudSudState ); CAN_TX_msg.len = 1; // Länge der Nachricht unsigned long currentMillis = millis(); // Senden alle x millisekunden if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; if ( ( counter % 2) == 0) { // Rest der Nachricht wird befüllt CAN_TX_msg.type = DATA_FRAME; if (CAN_TX_msg.len == 0) CAN_TX_msg.type = REMOTE_FRAME; CAN_TX_msg.format = EXTENDED_FORMAT; CAN_TX_msg.id = 0x500023; // nachrichten ID } CANSend(&CAN_TX_msg); // Übergabe der Nachricht an die Hardware } } // ---------------------------- Begin CAN Empfangen { // ---------------------------- CAN Nachricht empfangen if (CANMsgAvail()) { CANReceive(&CAN_RX_msg); // Prüfen ob neue Nacvhricht empfangen werden kann (liegt eine neue Nachricht zum abholen bereit?) if (CAN_RX_msg.type == DATA_FRAME) { 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) { LSEinfahrtSBHSudState = bitRead (CAN_TX_msg.data[0], 0); LSEinfahrtWendelSudState = bitRead (CAN_TX_msg.data[0], 1); LSVmaxSBHSudState = bitRead (CAN_TX_msg.data[0], 2); LSEinfahrtSBHSudGleis1State = bitRead (CAN_TX_msg.data[0], 3); LSEinfahrtSBHSudGleis2State = bitRead (CAN_TX_msg.data[0], 4); LSEinfahrtSBHSudGleis3State = bitRead (CAN_TX_msg.data[0], 5); LSEinfahrtSBHSudGleis4State = bitRead (CAN_TX_msg.data[0], 6); LSEinfahrtSBHSudGleis5State = bitRead (CAN_TX_msg.data[0], 7); LSEndposSBHSudGleis1State = bitRead (CAN_RX_msg.data[1], 0); LSEndposSBHSudGleis2State = bitRead (CAN_RX_msg.data[1], 1); LSEndposSBHSudGleis3State = bitRead (CAN_RX_msg.data[1], 2); LSEndposSBHSudGleis4State = bitRead (CAN_RX_msg.data[1], 3); LSEndposSBHSudGleis5State = bitRead (CAN_RX_msg.data[1], 4); LSEinfahrtKehrschleifeSBHSudState = bitRead (CAN_TX_msg.data[1], 5); VARSBHSudFehlerState = bitRead (CAN_TX_msg.data[1], 6); VARSBHSudVollState = bitRead (CAN_TX_msg.data[1], 7); FahrstromSBHSudAllgemeinState = CAN_TX_msg.data[2]; FahrstromSBHSudAbstellState = CAN_TX_msg.data[3]; SBHSudStatus = CAN_TX_msg.data[4]; } if (CAN_RX_msg.id == 0x100005) // nachrichten ID 0x100005 von Modul 6 { LSEinfahrtVonSBHWest1State = bitRead(CAN_RX_msg.data[0], 0); LSEinfahrtVonSBHWest2State = bitRead(CAN_RX_msg.data[0], 1); LSEinfahrtVonSBHSudState = bitRead(CAN_RX_msg.data[0], 2); LSEinfahrtVonWendelWestState = bitRead(CAN_RX_msg.data[0], 3); } } } } } //------ Auslesen der Eingaenge { TastStellwerk0BlatternState = digitalRead(TastStellwerk0Blattern); TastStellwerk0SetState = digitalRead(TastStellwerk0Set); TastStellwerk0PlusState = digitalRead(TastStellwerk0Plus); TastStellwerk0MinusState = digitalRead(TastStellwerk0Minus); delay(50); SchaltWendel0WestSudState = digitalRead(SchaltWendel0WestSud); SchaltWendel0WestWestState = digitalRead(SchaltWendel0WestWest); SchaltWendel0SudWestState = digitalRead(SchaltWendel0SudWest); SchaltWendel0SudSudState = digitalRead(SchaltWendel0SudSud); delay(50); } //------ Schalten der AUsgänge { // Variablen der ANzeige LEDS dem eingang zuweisen if (SchaltWendel0WestSudState || LSEinfahrtVonSBHWest1State == HIGH) { AnzeigeWendelWestSudBelegtState = 1; } else { AnzeigeWendelWestSudBelegtState = 0; } if (SchaltWendel0WestWestState || LSEinfahrtVonSBHWest2State == HIGH) { AnzeigeWendelWestWestBelegtState = 1; } else { AnzeigeWendelWestWestBelegtState = 0; } if (SchaltWendel0SudWestState || LSEinfahrtVonSBHSudState == HIGH) { AnzeigeWendelSudWestBelegtState = 1; } else { AnzeigeWendelSudWestBelegtState = 0; } if (SchaltWendel0SudSudState || LSEinfahrtVonWendelWestState == HIGH) { AnzeigeWendelSudSudBelegtState = 1; } else { AnzeigeWendelSudSudBelegtState = 0; } } { digitalWrite( AnzeigeWendelWestSudBelegt, AnzeigeWendelWestSudBelegtState); digitalWrite( AnzeigeWendelWestWestBelegt, AnzeigeWendelWestWestBelegtState); digitalWrite( AnzeigeWendelSudWestBelegt, AnzeigeWendelSudWestBelegtState); digitalWrite( AnzeigeWendelSudSudBelegt, AnzeigeWendelSudSudBelegtState); } { // --------------------------- begin state maschine LCD Anzeige if (next_state_LCDANZEIGEEBENE0 != akt_state_LCDANZEIGEEBENE0) // Hat sich der State geändert ? { switch (next_state_LCDANZEIGEEBENE0) // State Mashine für Wechselzwischen den Sates { case UEBERSICHT: { ZeitspeicherLCDAnzeige = millis(); lcd.clear(); break; } } akt_state_LCDANZEIGEEBENE0 = next_state_LCDANZEIGEEBENE0; // -----------------Zustand Next in Zustand aktuell schreiben } switch (akt_state_LCDANZEIGEEBENE0) // Eigentliche State mschine für SBH Sued { case UEBERSICHT: { lcd.setCursor(0, 0); lcd.print("Status SBH Sud"); lcd.setCursor(0, 1); if (VARSBHSudFehlerState == 0 && VARSBHSudVollState == 0) { if (SBHSudStatus == 0) { lcd.print ("-Keine Daten "); } if (SBHSudStatus == 1) { lcd.print ("-Bereit "); } if (SBHSudStatus == 2) { lcd.print ("-Ausfahrt"); lcd.print (" Gleis "); lcd.print (SBHSUDaktGleis); lcd.print (" "); } if (SBHSudStatus == 3) { lcd.print ("-Auswahl Gleis "); lcd.print (SBHSUDaktGleis); lcd.print (" "); } if (SBHSudStatus == 4) { lcd.print ("-Einfahrt"); lcd.print (" Gleis "); lcd.print (SBHSUDaktGleis); lcd.print (" "); } } lcd.setCursor(0, 2); lcd.print(SBHSudStatus); lcd.setCursor(0, 3); lcd.print(FahrstromSBHSudAllgemeinState); if (VARSBHSudFehlerState == 0 && VARSBHSudVollState == 1) { lcd.print ("Voll "); } if (VARSBHSudFehlerState == 1 ) { lcd.print ("Fehler "); } TastStellwerk0BlatternState = digitalRead(TastStellwerk0Blattern); if (TastStellwerk0BlatternState == 0) { // next_state_LCDANZEIGEEBENE0 = LSSBHSUDLS2; delay(250); } break; } } // --------------------------- Ende state maschine LCD Anzeige } }