/*History Version 1.0 Ein & AUsgänge definiert 19.05.23 sowie CAN Nachrit senden Senden der Zustande LS Einfahrt SBH, Vmax und einfahrt Wendel Funktionstest Via CAn an Zentrale Funktioniert 1.1 Daten direkt in CAN Data 0 schreiben Also ohne Variable Data00 für Nachricht 1 1.2 Leerzeilen gelöscht und CANmsg noch oben verschoben ungetestet 2.0 Empfangen von nachricht von Zentrale ausgänge Weiche Einfahrt SBH - funktioniert Ausgang zum abschalten des Fahrstromes hinzugefügt 3.0 LSVmax hier und Weiche SBHSud einfahrt entfernt 3.1 Ausgang für Fahrstrom allgemein hinzugefügt 3.2 Eingang LSVmax hinzugefügt 3.3 Ausgang PWM Fahrstrom SBHSüdAllgemein auf PB0 geändert 3.4 Ausgang FahrstromEinfahrtSBHSud auf Modul 3 Verlegt 3.5 PWM Frequenz für Fahrspannung auf 100 Hz geändert 4.0 Neue Fahrspannungen zur Steuerung eingepflegt LS VMax entfernt CAN Nachricht angepasst funktioniert au Brett 5.0 Bezeichnung zum Unterscheiden von Fahrspannung abschalten (Fahrstromxx) und Regelung via PWM (UFahrxxx) eingeführt Test auf Brett - CAN LS Ein & Ufahr funktionieren 5.1 Funktion für CAN Senden programiert und einmal im Setup senden 6.0 State Maschine wieder gelöscht und nur noch als Zustandsaenderung programiert */ // -------------------------------------- Umbenenen der STM Pins // Bliotheken //------------------------------------------------------------------------------------------------------------Testweise auskommentiert #include #include "stm32f103.h" // Bei selbst erstellten Bibliotheken der name immer in Anführungszeichen!! Nicht in <> kleiner als Zeichen! // Eingaenge // Lichtschranke const int LSEinfahrtSBHSud = PB12; const int LSEinfahrtWendelSudU = PB13; const int SensorFahrstrom = PB1; uint8_t SensorFahrstromState = 0; uint8_t SensorFahrstromStateformer = 0; uint8_t LSEinfahrtSBHSudState = 0; uint8_t LSEinfahrtSBHSudStateformer = 0; uint8_t LSEinfahrtWendelSudUState = 0; uint8_t LSEinfahrtWendelSudUStateformer = 0; // Ausgaenge const int FahrstromEinfahrtSBHSudAbstell = PA0; // Abschalten der Zufahrt zum kompletten SBH const int FahrstromModulNotHalt = PA1; // Abschalten Fahrstrom komplettes Modul const int FahrstromEinfahrtWendelSud = PA2; // Abschalten der Zufahrt zur Wendel const int WeicheEinfahrtSBHSudgeradeaus = PA3; // Einfahrt in den Bereich Abstellgleise const int WeicheEinfahrtSBHSudabbiegen = PA4; // Umfahrgleis der Abstellgleise in SBH Sud const int UFahrKreuzungWendelSud = PA6; // Wert des Fahrstromes zur . const int UFahrSBHSudEinfahrt = PB0; // Wert des Fahrstromes von Zentrale uint8_t FahrstromEinfahrtSBHSudAbstellState = 0; uint8_t FahrstromModulNotHaltState = 0; uint8_t FahrstromEinfahrtWendelSudState = 0; uint8_t WeicheEinfahrtSBHSudgeradeausState = 0; uint8_t WeicheEinfahrtSBHSudabbiegenState = 0; uint8_t UFahrKreuzungWendelSudState = 0; uint8_t UFahrSBHSudEinfahrtState = 0; // ------------------------------------------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 uint8_t ZaehlerCANMSG0x100001 = 0; // Zaehler wie oft nachricht gesendet werden soll bool Modul2MSG09empfangen = 0; bool ZentraleMSG01empfangen = 0; CAN_msg_t CAN_TX_msg; // Initialisierung Senden CAN_msg_t CAN_RX_msg; // Initialisierung EMPFANGEN // Sonstige Variablen bool FahrstromFehlerModul2 = 0; // State maschine void AUSLESENSENSOREN() { LSEinfahrtSBHSudState = digitalRead(LSEinfahrtSBHSud); LSEinfahrtWendelSudUState = digitalRead(LSEinfahrtWendelSudU); SensorFahrstromState = analogRead(SensorFahrstrom); } void CANMSG0x100001() { AUSLESENSENSOREN(); // ---------------------------- CAN Nachricht 0x100001 senden // eigentliche Daten werden eingefüllt 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 bitWrite (CAN_TX_msg.data[0], 1, LSEinfahrtWendelSudUState); bitWrite (CAN_TX_msg.data[0], 2, FahrstromFehlerModul2); bitWrite (CAN_TX_msg.data[0], 3, Modul2MSG09empfangen); CAN_TX_msg.len = 1; // Länge der Nachricht 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 = 0x100001; // nachrichten ID } CANSend(&CAN_TX_msg); // Übergabe der Nachricht an die Hardware } void setup() { pinMode(LED_BUILTIN, OUTPUT); //LED auf Arduino Blinken um programierung zu bestätigen delay(500); 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(LSEinfahrtSBHSud, INPUT); pinMode(LSEinfahrtWendelSudU, INPUT); pinMode(SensorFahrstrom, INPUT); pinMode(FahrstromEinfahrtSBHSudAbstell, OUTPUT); pinMode(FahrstromModulNotHalt, OUTPUT); pinMode(FahrstromEinfahrtWendelSud, OUTPUT); pinMode(WeicheEinfahrtSBHSudgeradeaus, OUTPUT); pinMode(WeicheEinfahrtSBHSudabbiegen, OUTPUT); pinMode(UFahrKreuzungWendelSud, OUTPUT); pinMode(UFahrSBHSudEinfahrt, OUTPUT); } void loop() { // ---------------------------- Begin CAN Empfangen // ---------------------------- CAN Nachricht empfangen if (CANMsgAvail()) { CANReceive(&CAN_RX_msg); // Prüfen ob neue Nachricht empfangen werden kann (liegt eine neue Nachricht zum abholen bereit?) if (CAN_RX_msg.type == DATA_FRAME) { if (CAN_RX_msg.id == 0x100009) // Empfang der nachricht 0x100009 von Modul 2 Weiche SBH einfahrt { UFahrSBHSudEinfahrtState = (CAN_RX_msg.data[0]); UFahrKreuzungWendelSudState = (CAN_RX_msg.data[1]); FahrstromEinfahrtSBHSudAbstellState = bitRead (CAN_RX_msg.data[2], 0); FahrstromEinfahrtWendelSudState = bitRead (CAN_RX_msg.data[2], 1); WeicheEinfahrtSBHSudgeradeausState = bitRead (CAN_RX_msg.data[2], 2); WeicheEinfahrtSBHSudabbiegenState = bitRead (CAN_RX_msg.data[2], 3); ZentraleMSG01empfangen = bitRead (CAN_RX_msg.data[2], 4); Modul2MSG09empfangen = 1; // empfangsbestaetigung MSG 09 setzten } } } // ---------------------------- CAN Nachricht senden bis bestätigung da if (ZentraleMSG01empfangen == 0) // So lange keine Empangsbestätigung vom Empfänger da ist Senden { CANMSG0x100001(); ZaehlerCANMSG0x100001 = 0; } if (ZentraleMSG01empfangen == 1) { if (ZaehlerCANMSG0x100001 < 10) // Wen Empfangsbestäting da ist noch 10 mal senden { CANMSG0x100001(); ZaehlerCANMSG0x100001 = ZaehlerCANMSG0x100001 + 1; } } // ---------------------------- Auslesen der Sensoren/Eingaenge AUSLESENSENSOREN(); if (SensorFahrstromState > 200) { FahrstromModulNotHaltState = 1; } else { FahrstromModulNotHaltState = 1; } FahrstromFehlerModul2 = FahrstromModulNotHaltState ; // ------------------ Vergleich Zustandsänderung Eingänge also ob nachricht gesendet werden muss if (LSEinfahrtSBHSudState != LSEinfahrtSBHSudStateformer) // Lichtschranke Einfahrt SBH Sued { ZaehlerCANMSG0x100001 = 0; CANMSG0x100001(); LSEinfahrtSBHSudStateformer = LSEinfahrtSBHSudState; } if (LSEinfahrtWendelSudUState != LSEinfahrtWendelSudUStateformer) // Lichtschranke Einfahrt Wendel Sued untere Ebene { ZaehlerCANMSG0x100001 = 0; CANMSG0x100001(); LSEinfahrtWendelSudUStateformer = LSEinfahrtWendelSudUState; } //------ Schalten der Ausgaenge // ----- Werte für Fahrstrom einstellen analogWriteFrequency(100); analogWrite(UFahrSBHSudEinfahrt, UFahrSBHSudEinfahrtState); analogWrite(UFahrKreuzungWendelSud, UFahrKreuzungWendelSudState); // ----- Ausgaenge schalten digitalWrite(FahrstromEinfahrtSBHSudAbstell, FahrstromEinfahrtSBHSudAbstellState); digitalWrite(FahrstromModulNotHalt, FahrstromModulNotHaltState); digitalWrite(FahrstromEinfahrtWendelSud, FahrstromEinfahrtWendelSudState); digitalWrite(WeicheEinfahrtSBHSudgeradeaus, WeicheEinfahrtSBHSudgeradeausState); digitalWrite(WeicheEinfahrtSBHSudabbiegen, WeicheEinfahrtSBHSudabbiegenState); }