Forum: Mikrocontroller und Digitale Elektronik CAN Netzwerk mit Gateway - mbed | NXP LPC 1768


von Tobias H. (Gast)


Angehängte Dateien:

Lesenswert?

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
von Johannes S. (Gast)


Lesenswert?

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.

von Tobias H. (Gast)


Lesenswert?

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.

von Johannes S. (Gast)


Lesenswert?

AnalogIn, aber den Rest der Hausaufgaben solltest du selber hinbekommen.

von Jim M. (turboj)


Lesenswert?

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.

von Alexander K. (alexander_43)


Lesenswert?

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
Noch kein Account? Hier anmelden.