Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*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 <assert.h>
- #include "stm32f103.h" // Bei selbst erstellten Bibliotheken der name immer in Anfuehrungszeichen!! Nicht in <> kleiner als Zeichen!
- #include <LiquidCrystal.h>
- // 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
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment