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
- 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
- */
- // -------------------------------------- Umbenenen der STM Pins
- // Bliotheken
- //------------------------------------------------------------------------------------------------------------Testweise auskommentiert #include <assert.h>
- #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 LSVmaxSBHSud = PB13; // Messung der aktuellen Geschwindigkeit um Fahrspannung Fest zu legen
- const int LSEinfahrtWendelSud = PB14;
- uint8_t LSEinfahrtSBHSudState = 0;
- uint8_t LSVmaxSBHSudState = 0;
- uint8_t LSEinfahrtWendelSudState = 0;
- // Ausgaenge
- const int WeicheEinfahrtSBHSudGeradeaus = PA0;
- const int WeicheEinfahrtSBHSudAbbiegen = PA1;
- uint8_t WeicheEinfahrtSBHSudGeradeausState = 0;
- uint8_t WeicheEinfahrtSBHSudAbbiegenState = 0;
- // nur zum Test
- uint8_t LSEinfahrtSBHSudGleis1State = 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
- 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
- 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(LSEinfahrtSBHSud, INPUT);
- pinMode(LSVmaxSBHSud, INPUT); // Messung der aktuellen Geschwindigkeit um Fahrspannung Fest zu legen
- pinMode(LSEinfahrtWendelSud, INPUT);
- pinMode(WeicheEinfahrtSBHSudGeradeaus, OUTPUT);
- pinMode(WeicheEinfahrtSBHSudAbbiegen, OUTPUT);
- }
- void loop()
- {
- // put your main code here, to run repeatedly:
- // ---------------------------- Begin CAN
- {
- {
- // ---------------------------- Begin CAN Senden
- // ---------------------------- CAN Nachricht 0x10001 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, LSVmaxSBHSudState);
- bitWrite (CAN_TX_msg.data[0], 2, LSEinfahrtWendelSudState);
- 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 = 0x100001; // 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 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
- {
- WeicheEinfahrtSBHSudGeradeausState = bitRead (CAN_RX_msg.data[0], 0);
- WeicheEinfahrtSBHSudAbbiegenState = bitRead (CAN_RX_msg.data[0], 1);
- }
- }
- }
- }
- }
- //------ Auslesen der Eingaenge (Sensoren)
- {
- LSEinfahrtSBHSudState = digitalRead(LSEinfahrtSBHSud);
- LSVmaxSBHSudState = digitalRead(LSVmaxSBHSud);
- LSEinfahrtWendelSudState = digitalRead(LSEinfahrtWendelSud);
- }
- //------ Schalten der AUsgänge
- {
- if (WeicheEinfahrtSBHSudGeradeausState == 1)
- {
- digitalWrite(WeicheEinfahrtSBHSudGeradeaus, HIGH);
- }
- else
- {
- digitalWrite(WeicheEinfahrtSBHSudGeradeaus, LOW);
- }
- if (WeicheEinfahrtSBHSudAbbiegenState == 1)
- {
- digitalWrite(WeicheEinfahrtSBHSudAbbiegen, HIGH);
- }
- else
- {
- digitalWrite(WeicheEinfahrtSBHSudAbbiegen, LOW);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment