Gast
#5294473
Hallo Zusammen, bin recht neu im Geschäft und muss ein CAN Netzwerk mit drei Teilnehmern programmieren. Habe drei µ-Controller im Highspeed Netz inplementiert und zwei im Lowspeed. Die einzelnen Funktionen sind i.O, lediglich die "Überstzungsfunktion" schlägt fehl. Das Problem liegt jetzt nur in der Übersetzung (Teilnehmer2 mit Gateway). Ich muss ja eine Variable, bzw zwei Variablen nutzen, die sich den Zustand merkt/merken und übergibt/übergeben. -> in diesem Code habe ich versucht int a; zu vergeben, leider funzt das nicht wie gedacht. Weiterhin muss ich an Teilnehmer 3 ein Poti einlesen, welches die Helligkeit an Teilnehmer 2 über lowspeed regelt. Damit tue ich mich auch schwer. Habe dafür 8 Bit vorgesehen, bekomme aber dies nicht zugeordnet und am Teilnehmer 2 ausgewertet. Anbei der Code von Teilnehmer 2 (Gateway) #include "mbed.h" #include "CAN.h" #include <iostream> #include <stdio.h> Ticker ticker; DigitalOut LED_21(LED1); //Visuelle Darstellung Tx DigitalOut LED_22(LED2); //Visuelle Darstellung Rx DigitalOut LED_23(LED3); //Visuelle Darstellung Taster T_21 // DigitalOut LED_24(LED4); //Ansteuerung durch Teilnehmer1 T_11 (Highspeed-Bus) PwmOut LED_25 (p21); //Ausgang LED die via TN 3 geschaltet und gedimmt wird DigitalIn T_21 (p20); //Taster für die Ansteuerung einer LED an Teilnehmer 3 (ID601 Bit 0) DigitalIn T_22 (p15); // Taster für die Ansteuerung einer LED an Teilnehmer 1 (ID501 Bit 0) CAN can1 (p9,p10); // Definieren der CAN-Highspeed-Schnittstelle zur Kommunikation mit Teilnehmer 1,3 CAN can2 (p30,p29); // Kommt spärer ---- Globale Variable definieren -- Definition der CAN-Lowspeed-Schnittstelle zur Kommunikation mit Teilnehmer 1,3 int a; void sendhighlowspeed() { char data = 0; char data2 = 0; data ^= (-T_21 ^ data) & (1UL << 0); data ^=(a ^ data) & (1UL << 1); data2 ^=(-T_22 ^ data2) & (1UL << 0); // Hier muss die Variable übernommen werden, die aus der Lowspeed-Botschaft 502 Byte 2 Bit 9 von Teilnehmer 3 kommt. --- Wird dann von Teilnehmer 1 ausgewertet. - Nachricht muss so aussehen: ID 601 Byte 1 Bit 1 LED_21 = true; if(!can1.write(CANMessage(601, &data, 1))) { //Die Nachricht(CANMessage) "wird on the fly" erstellt; printf("Error sending CAN highspeed message"); } if(!can2.write(CANMessage(501, &data2, 1))) { printf("Error sending CAN lowspeed message"); } LED_21 = false; } int main() { printf("main()\n"); ticker.attach(&sendhighlowspeed, 0.1); // Nachricht soll alle 100 ms (0.1s) gesendet werden CANMessage msg; char d; // Variable wird übergeben in if Abfrage, array der Bits......// while(1) { if(can1.read(msg)) { // Datenbotschaft CAN einlesen if (msg.id == 600){ // Weiter wenn Nachricht die ID 600 hat d = msg.data [0]; bool t1; t1=(d>>0) & (1UL); // Bit Null aus Botschaft ID 600 Byte 1 Bit 0 auswerten, damit LED_24 angesteuert werden kann. if(t1){ LED_25 = 1; } else { LED_25 = 0; } } } if(can2.read(msg)) { // Datenbotschaft CAN einlesen if (msg.id == 502){ // Weiter wenn Nachricht die ID 600 hat d = msg.data [0]; bool t2; bool t3; t2=(d>>0) & (1UL); // Bit Null aus Botschaft ID 600 Byte 1 Bit 0 auswerten, damit LED_24 angesteuert werden kann. t3=(d>>1) & (1UL); if(t2){ LED_24 = 1; a= 1; } else { LED_24 = 0; } if(t3){ LED_23 =1; } else { LED_23=0; } } } LED_22 = !LED_22; wait(0.02); // Es wird alle 200ms der Status eingelesen } } Ich hoffe es kann mir jemand helfen. Ich denke es wird keine wilde Sache werden, habe aber nur wenig Erfahrung in diesem Thema. Danke im Vorfeld, viele Grüße To_be
