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
:
Verschoben durch User
erstmal sollte Code so formattiert werden wie es in 'Antwort schreiben - Wichtige Regeln - erst lesen' steht, so ist das kaum lesbar. Dann verwendest du das xor wo du vermutlich ein einfaches or haben möchtest, also | statt ^. Und zum negieren von bits nimmt man ~ statt -. Eine globale Variable kann man nehmen, aber 'a' ist als Bezeichner recht nichtssagend. Und sendhighlowspeed() wird über den Ticker im Interrupt Context aufgerufen, da gehören keine lange, evtl. sogar blockierende, Funktionen rein. Das sollte auch im main laufen, du kannst einen Timer nehmen und in dem zyklischen Aufruf abfragen ob der Timer > x ms ist und dann die Aktion ausführen.
1 | wait(0.02); // Es wird alle 200ms der Status eingelesen |
wartet 20 ms, aber wirst du am hektischen Blinken der LED sehen.
Hallo Johannes, danke für Deine Antwort. Wie am Anfang erwähnt bin ich recht neu. Wo muss ich denn die globale Variable hinsetzen (void main, send) und wie würdest Du diese benennen? Die Nachrichten per se funktionieren ja alle. Nur halt die "Übersetzungsfunktion" nicht von Teilnehmer 1 auf 2 und übersetzt auf drei und umgekehrt. Hast Du einen Lösungsansatz wie ich ein Byte mit dem Werten des Potis belegen kann? Danke im Vorfeld.
AnalogIn, aber den Rest der Hausaufgaben solltest du selber hinbekommen.
Tobias H. schrieb: > Wo muss ich denn die globale Variable hinsetzen (void main, send) > und wie würdest Du diese benennen? Bei solcher Art Fragen sollte man mal ein Buch über die Programmierspreche C bzw. in diesem Fall sogar C++ lesen. Diese Sprechen sind nicht selbsterklärend. Du offenbarst hier verdammt große Wissenslücken, die ein Formum nur ungenügend füllen kann.
Tobias H. schrieb: > Wo muss ich denn die globale Variable hinsetzen (void main, send) > und wie würdest Du diese benennen? Wenn man Variablen außerhalb von Funktionen deklariert (main ist auch eine Funktion!), dann ist diese eine Globale Variable. Durch das Schlüsselwort static hat man den Gültigkeitsbereich File scope, mit dem Schlüsselwort extern den Gültigkeitsbereich Program scope. Lässt man das Schlüsselwort weg, hat man den Gültigkeitsbereich Program scope. Variablennamen kann man nach der ungarischen Notation machen also zum Beispiel: int iBeispiel; Dabei gibt der erste Buchstabe (Präfix) Auskunft über den Datentyp und der Name dahinter (Bezeichner) solle ein aussagekräftiger Name sein.
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.