Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*History Version 1.0 Ein & AUsgänge definiert 19.05.23 sowie CAN Nachrit senden
- 1.2 Leerzeilen gelöscht und CANmsg noch oben verschoben ungetestet
- 2.0 Empfangen von nachricht von Zentrale ausgänge Fahrgfleise 1 - 5 SBH - funktioniert
- Nachricht 0x100011 für Fahrstöme geändert - funktioniert
- 3.0 Für Abstellgkleise das abschalten auf an/ aus gestellt
- Bei test auf Anlage festgestellt, das LSPOS ständig zwischen High & LOW wechselt (Fehler behoben!)
- 3.1 Ausgang PWM Fahrstrom SBHSüdAllgemein auf PB0 geändert sowie
- 3.2 PWM Frequenz für Fahrstom auf 100HZ geändert
- 4.0 Neue Fahrspannungen PWM hinzugefügt und CAN nachrichten bearbeitet
- 5.0 Bezeichnung zum Unterscheiden von Fahrspannung abschalten (Fahrstromxx) und Regelung via PWM (UFahrxxx) eingeführt
- 5.1 Sendeintervall CAN auf 100ms
- 5.2 CAN nachricht in funktion geschrieben, ebnso Eingaenge auslesen und state Maschine zum CAN senden
- */
- // -------------------------------------- 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!
- // EIngaenge
- // Lichtschranke
- const int LSEndposSBHSudGleis1 = PB12;
- const int LSEndposSBHSudGleis2 = PB13;
- const int LSEndposSBHSudGleis3 = PB14;
- const int LSEndposSBHSudGleis4 = PB15;
- const int LSEndposSBHSudGleis5 = PA8;
- const int SensorFahrstrom = PA2;
- uint8_t LSEndposSBHSudGleis1State = 0;
- uint8_t LSEndposSBHSudGleis2State = 0;
- uint8_t LSEndposSBHSudGleis3State = 0;
- uint8_t LSEndposSBHSudGleis4State = 0;
- uint8_t LSEndposSBHSudGleis5State = 0;
- uint8_t SensorFahrstromState = 0;
- // Ausgaenge
- const int FahrstromSBHSudGleis1 = PA0; // An Abschalten
- const int FahrstromSBHSudGleis2 = PA1; // An Abschalten
- const int FahrstromSBHSudGleis3 = PB11; // An Abschalten
- const int FahrstromSBHSudGleis4 = PA5; // An Abschalten
- const int FahrstromSBHSudGleis5 = PA4; // An Abschalten
- const int UFahrSBHSudEinfahrt = PB0; // Regelung PWM
- const int UFahrKreuzungWendelSud = PA3; // Regelung PWM
- const int UFahrSBHSudAbstell = PA6; // Regelung PWM für alle Abstellgleise
- const int UFahrSBHSudAusfahrt = PB1; // Regelung PWM ausfahrtsgleis aus SBH Sued
- const int FahrstromModulNotHalt = PA7; // An Abschalten
- const int FahrstromWendelSudKreuzung = PB10; // An Abschalten
- uint8_t FahrstromSBHSudGleis1State = 0;
- uint8_t FahrstromSBHSudGleis2State = 0;
- uint8_t FahrstromSBHSudGleis3State = 0;
- uint8_t FahrstromSBHSudGleis4State = 0;
- uint8_t FahrstromSBHSudGleis5State = 0;
- uint8_t UFahrSBHSudEinfahrtState = 0;
- uint8_t UFahrKreuzungWendelSudState = 0;
- uint8_t UFahrSBHSudAbstellState = 0;
- uint8_t UFahrSBHSudAusfahrtState = 110;
- uint8_t FahrstromModulNotHaltState = 0;
- uint8_t FahrstromWendelSudKreuzungState = 0;
- // Variablen
- // 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 = 100; // transmission interval (milliseconds) Intervall in dem gesendet wird
- CAN_msg_t CAN_TX_msg; // Initialisierung Senden
- CAN_msg_t CAN_RX_msg; // Initialisierung EMPFANGEN
- // Sonstige Variablen
- bool FahrstromFehlerModul4 = 0;
- // ----------------------------- Funktionen
- // CAN senden
- void CANMSG0x100003()
- {
- // Auslesen der Sensoren
- // AUSLESENSENSOREN();
- // ---------------------------- CAN Nachricht 0x10003 senden
- // eigentliche Daten werden eingefüllt
- bitWrite (CAN_TX_msg.data[0], 0, LSEndposSBHSudGleis1State); // 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, LSEndposSBHSudGleis2State);
- bitWrite (CAN_TX_msg.data[0], 2, LSEndposSBHSudGleis3State);
- bitWrite (CAN_TX_msg.data[0], 3, LSEndposSBHSudGleis4State);
- bitWrite (CAN_TX_msg.data[0], 4, LSEndposSBHSudGleis5State);
- bitWrite (CAN_TX_msg.data[0], 5, FahrstromFehlerModul4);
- CAN_TX_msg.len = 1;
- 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 = 0x100003; // nachrichten ID
- }
- CANSend(&CAN_TX_msg); // Übergabe der Nachricht an die Hardware
- }
- }
- void AUSLESENSENSOREN()
- {
- LSEndposSBHSudGleis1State = digitalRead (LSEndposSBHSudGleis1);
- LSEndposSBHSudGleis2State = digitalRead (LSEndposSBHSudGleis2);
- LSEndposSBHSudGleis3State = digitalRead (LSEndposSBHSudGleis3);
- LSEndposSBHSudGleis4State = digitalRead (LSEndposSBHSudGleis4);
- LSEndposSBHSudGleis5State = digitalRead (LSEndposSBHSudGleis5);
- }
- enum MODUL4ENDPOS
- {
- BEREIT, SENDEN1, WARTEN, SENDEN2,
- };
- MODUL4ENDPOS akt_state_MODUL4ENDPOS = BEREIT;
- MODUL4ENDPOS next_state_MODUL4ENDPOS = BEREIT;
- 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(LSEndposSBHSudGleis1, INPUT);
- pinMode(LSEndposSBHSudGleis2, INPUT);
- pinMode(LSEndposSBHSudGleis3, INPUT);
- pinMode(LSEndposSBHSudGleis4, INPUT);
- pinMode(LSEndposSBHSudGleis5, INPUT);
- pinMode(SensorFahrstrom, INPUT);
- pinMode(FahrstromSBHSudGleis1, OUTPUT);
- pinMode(FahrstromSBHSudGleis2, OUTPUT);
- pinMode(FahrstromSBHSudGleis3, OUTPUT);
- pinMode(FahrstromSBHSudGleis4, OUTPUT);
- pinMode(FahrstromSBHSudGleis5, OUTPUT);
- pinMode(UFahrSBHSudEinfahrt, OUTPUT);
- pinMode(UFahrKreuzungWendelSud, OUTPUT);
- pinMode(UFahrSBHSudAbstell, OUTPUT);
- pinMode(UFahrSBHSudAusfahrt, OUTPUT);
- pinMode(FahrstromModulNotHalt, OUTPUT);
- pinMode(FahrstromWendelSudKreuzung, OUTPUT);
- CANMSG0x100003(); // CAN Nachricht einmalig versenden
- }
- void loop()
- {
- // ---------------------------- Begin CAN Empfangen
- // ---------------------------- CAN Nachricht 0x100011 Daten Fahrgeschwindigkeit SBH Sud und allgemein
- 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 == 0x100011) // Empfang der nachricht 0x100011 von von Zentrale (alle Variabelen zu SBH Sued)
- {
- FahrstromSBHSudGleis1State = bitRead (CAN_RX_msg.data[0], 0);
- FahrstromSBHSudGleis2State = bitRead (CAN_RX_msg.data[0], 1);
- FahrstromSBHSudGleis3State = bitRead (CAN_RX_msg.data[0], 2);
- FahrstromSBHSudGleis4State = bitRead (CAN_RX_msg.data[0], 3);
- FahrstromSBHSudGleis5State = bitRead (CAN_RX_msg.data[0], 4);
- UFahrSBHSudEinfahrtState = CAN_RX_msg.data[1];
- UFahrSBHSudAbstellState = CAN_RX_msg.data[2];
- UFahrKreuzungWendelSudState = CAN_RX_msg.data[3];
- UFahrSBHSudAusfahrtState = CAN_TX_msg.data[4];
- }
- }
- }
- //------------------------ ENDE CAN
- // ----------------------- State Maschine
- {
- if (next_state_MODUL4ENDPOS != akt_state_MODUL4ENDPOS)
- {
- switch (next_state_MODUL4ENDPOS)
- {
- case BEREIT:
- {
- break;
- }
- case SENDEN1:
- {
- break;
- }
- case WARTEN:
- {
- break;
- }
- case SENDEN2:
- {
- break;
- }
- }
- akt_state_MODUL4ENDPOS = next_state_MODUL4ENDPOS; // Zustand in akt zustand schreiben
- }
- switch (akt_state_MODUL4ENDPOS)
- {
- case BEREIT:
- {
- AUSLESENSENSOREN();
- // if (LSEndposSBHSudGleis1State == HIGH || LSEndposSBHSudGleis2State == HIGH || LSEndposSBHSudGleis3State == HIGH || LSEndposSBHSudGleis4State == HIGH || LSEndposSBHSudGleis5State == HIGH)
- {
- // next_state_MODUL4ENDPOS = SENDEN1;
- }
- }
- case SENDEN1:
- {
- digitalWrite(FahrstromSBHSudGleis1, HIGH);
- CANMSG0x100003();
- next_state_MODUL4ENDPOS = BEREIT;
- break;
- }
- }
- }
- // Ausgaenge schalten
- {
- //--------------------------- begin PWM Ausgaenge setzten
- analogWriteFrequency(100);
- analogWrite(UFahrSBHSudAbstell, UFahrSBHSudAbstellState);
- analogWrite(UFahrSBHSudEinfahrt, UFahrSBHSudEinfahrtState);
- analogWrite(UFahrKreuzungWendelSud, UFahrKreuzungWendelSudState);
- analogWrite(UFahrSBHSudAusfahrt, UFahrSBHSudAusfahrtState);
- // ------------------------- Begin An bzw Abschalten Abstellgleise
- digitalWrite(FahrstromSBHSudGleis1, FahrstromSBHSudGleis1State);
- digitalWrite(FahrstromSBHSudGleis2, FahrstromSBHSudGleis2State);
- digitalWrite(FahrstromSBHSudGleis3, FahrstromSBHSudGleis3State);
- digitalWrite(FahrstromSBHSudGleis4, FahrstromSBHSudGleis4State);
- digitalWrite(FahrstromSBHSudGleis5, FahrstromSBHSudGleis5State);
- // ------------------------- Begin An bzw Abschalten der Zufahrten
- digitalWrite(UFahrSBHSudAbstell, UFahrSBHSudAbstellState);
- digitalWrite(FahrstromModulNotHalt, FahrstromModulNotHaltState);
- digitalWrite(FahrstromWendelSudKreuzung, FahrstromWendelSudKreuzungState);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment