Forum: Mikrocontroller und Digitale Elektronik Mehrere verschiedene Can Nachrichten mit Arduino versenden


von Joni A. (joni_arb)


Lesenswert?

Hallo Zusammen

Ich bin Newbie in Sachen Arduino, C(++), sowie CAN aber wollte dennoch 
in einem kleinen Projekt mal mehr darüber lernen, darum bitte ich um 
Nachsicht ;)

Ich versuche mit meinem Arduino und einem CAN-Shield (Seed und Sparkfun 
vorhanden) mehrere Nachrichten mit verschiedenen ID zu senden. Zur 
Kontrolle lese ich die Nachrichten mit einem USB-Can-Sniffer aus. Leider 
sehe ich immer nur die ersten 3 Nachrichten meines Programmes. Zudem 
setzte ich jedesmal das Programm zurück sonst würde bei einem neuen Loop 
nur noch die letzte der 3 Nachrichten gesendet. Ich bin mir sicher das 
hat etwas mit dem mcp2515 zu tun. Leider bin ich wie gesagt komplett 
Neuling in Sachen Mikrokontroller und deren Programmierung und darum um 
jeden Tipp froh.

Code basierend auf dem Write-Demo von Sparkfun:
1
/****************************************************************************
2
CAN Write Demo for the SparkFun CAN Bus Shield. 
3
4
Written by Stephen McCoy. 
5
Original tutorial available here: http://www.instructables.com/id/CAN-Bus-Sniffing-and-Broadcasting-with-Arduino
6
Used with permission 2016. License CC By SA. 
7
8
Distributed as-is; no warranty is given.
9
*************************************************************************/
10
11
#include <Canbus.h>
12
#include <defaults.h>
13
#include <global.h>
14
#include <mcp2515.h>
15
#include <mcp2515_defs.h>
16
17
//********************************Setup Loop*********************************//
18
19
void setup() {
20
  Serial.begin(9600);
21
  Serial.println("CAN Write - Testing transmission of CAN Bus messages");
22
  delay(1000);
23
  
24
  if(Canbus.init(CANSPEED_500))  //Initialise MCP2515 CAN controller at the specified speed
25
    Serial.println("CAN Init ok");
26
  else
27
    Serial.println("Can't init CAN");
28
    
29
  delay(1000);
30
}
31
32
//********************************Main Loop*********************************//
33
34
void loop() 
35
{
36
tCAN message;
37
38
        message.id = 0x631; //formatted in HEX
39
        message.header.rtr = 0;
40
        message.header.length = 8; //formatted in DEC
41
        message.data[0] = 0x40;
42
  message.data[1] = 0x05;
43
  message.data[2] = 0x30;
44
  message.data[3] = 0xFF; //formatted in HEX
45
  message.data[4] = 0x00;
46
  message.data[5] = 0x40;
47
  message.data[6] = 0x00;
48
  message.data[7] = 0x00;
49
50
 tCAN message2;
51
52
        message.id = 0x231; //formatted in HEX
53
        message.header.rtr = 0;
54
        message.header.length = 8; //formatted in DEC
55
        message.data[0] = 0x40;
56
 message.data[1] = 0x05;
57
  message.data[2] = 0x30;
58
  message.data[3] = 0xFF; //formatted in HEX
59
  message.data[4] = 0x00;
60
  message.data[5] = 0x40;
61
  message.data[6] = 0x00;
62
  message.data[7] = 0x00;
63
64
 tCAN message3;
65
66
        message.id = 0x240; //formatted in HEX
67
        message.header.rtr = 0;
68
        message.header.length = 8; //formatted in DEC
69
        message.data[0] = 0x40;
70
 message.data[1] = 0x05;
71
  message.data[2] = 0x30;
72
  message.data[3] = 0xFF; //formatted in HEX
73
  message.data[4] = 0x00;
74
  message.data[5] = 0x40;
75
  message.data[6] = 0x00;
76
  message.data[7] = 0x00;
77
78
 tCAN message4;
79
80
        message.id = 0x221; //formatted in HEX
81
        message.header.rtr = 0;
82
        message.header.length = 8; //formatted in DEC
83
        message.data[0] = 0x40;
84
 message.data[1] = 0x05;
85
  message.data[2] = 0x30;
86
  message.data[3] = 0xFF; //formatted in HEX
87
  message.data[4] = 0x00;
88
  message.data[5] = 0x40;
89
  message.data[6] = 0x00;
90
  message.data[7] = 0x00;
91
92
93
 tCAN message5;
94
95
        message.id = 0x110; //formatted in HEX
96
        message.header.rtr = 0;
97
        message.header.length = 8; //formatted in DEC
98
        message.data[0] = 0x40;
99
 message.data[1] = 0x05;
100
  message.data[2] = 0x30;
101
  message.data[3] = 0xFF; //formatted in HEX
102
  message.data[4] = 0x00;
103
  message.data[5] = 0x40;
104
  message.data[6] = 0x00;
105
  message.data[7] = 0x00;
106
107
mcp2515_bit_modify(CANCTRL, (1<<REQOP2)|(1<<REQOP1)|(1<<REQOP0), 0);
108
109
mcp2515_send_message(&message);
110
delay(1000);
111
112
mcp2515_send_message(&message2);
113
delay(1000);
114
115
mcp2515_send_message(&message3);
116
delay(1000);
117
118
mcp2515_send_message(&message4);
119
delay(1000);
120
121
mcp2515_send_message(&message5);
122
delay(1000);
123
124
software_Reset();
125
}
126
127
void software_Reset() // Restarts program from beginning but does not reset the peripherals and registers
128
{
129
asm volatile ("  jmp 0");  
130
}

von Bastian W. (jackfrost)


Lesenswert?

Hi,

Nim nur ein tCAN struct und ändere vor jedem senden die Daten. Siehst du 
dann 5 Nachrichten ? Lies nach jeder Nachricht den Status aus und schau 
ob alles passt.

Gruß JackFrost

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

1
tCAN message5;
2
3
        message.id = 0x110; //formatted in HEX
4
        message.header.rtr = 0;
5
        message.header.length = 8; //formatted in DEC
6
        message.data[0] = 0x40;
7
 message.data[1] = 0x05;
8
  message.data[2] = 0x30;
9
  message.data[3] = 0xFF; //formatted in HEX
10
  message.data[4] = 0x00;
11
  message.data[5] = 0x40;
12
  message.data[6] = 0x00;
13
  message.data[7] = 0x00;
Fehlen da nicht elf 5er (und vorher 4er, 3er, 2er)?

Bastian W. schrieb:
> Nim nur ein tCAN struct
Tut Joni eigentlich sowieso. Ich vermute, da kommen nur Mesages mit ID 
0x110 auf dem Bus. Typischer Copy-Paste-Code... ;-)

: Bearbeitet durch Moderator
von Walter S. (avatar)


Lesenswert?

Joni A. schrieb:
> Zudem
> setzte ich jedesmal das Programm zurück sonst würde bei einem neuen Loop
> nur noch die letzte der 3 Nachrichten gesendet.

das verstehe ich nicht

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Walter S. schrieb:
> Joni A. schrieb:
>> Zudem setzte ich jedesmal das Programm zurück
> das verstehe ich nicht
Hört sich nach Programmfehler an. Man setzt einen µC nicht per Sprung an 
Adresse 0 zurück. Und wenn schon ein Zurücksetzen, dann bestenfalls per 
Reset. Ansonsten verharrt der µC ewig und drei Tage in seiner 
Mainloop...

: Bearbeitet durch Moderator
von Walter S. (avatar)


Lesenswert?

Lothar M. schrieb:
> Ich vermute, da kommen nur Mesages mit ID
> 0x110 auf dem Bus.

eher Messages mit undefiniertem ID denn beim Senden dreht er die Ziffern 
schon hoch

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Walter S. schrieb:
> eher Messages mit undefiniertem ID denn beim Senden dreht er die Ziffern
> schon hoch
Oder mit ID 0 und Länge 0, weil der Speicher mit 0 initialisiert wird?

von Joni A. (joni_arb)


Lesenswert?

Lothar M. schrieb:
>
1
> tCAN message5;
2
> 
3
>         message.id = 0x110; //formatted in HEX
4
>         message.header.rtr = 0;
5
>         message.header.length = 8; //formatted in DEC
6
>         message.data[0] = 0x40;
7
>  message.data[1] = 0x05;
8
>   message.data[2] = 0x30;
9
>   message.data[3] = 0xFF; //formatted in HEX
10
>   message.data[4] = 0x00;
11
>   message.data[5] = 0x40;
12
>   message.data[6] = 0x00;
13
>   message.data[7] = 0x00;
14
>
> Fehlen da nicht elf 5er (und vorher 4er, 3er, 2er)?
>
> Bastian W. schrieb:
>> Nim nur ein tCAN struct
> Tut Joni eigentlich sowieso. Ich vermute, da kommen nur Mesages mit ID
> 0x110 auf dem Bus. Typischer Copy-Paste-Code... ;-)

Hallo Zusammen

Erstmals vielen Dank für das Feedback. Beim Code von oben sehe ich im 
Bus Nachrichten mit ID: 631, 231 und 240. Wenn ich denn Reset nicht 
hätte würde der Loop einmal durchlaufen, also alle 3 Nachrichten 
erscheinen und dann wird nur noch die Nachricht mit ID 240 gesendet, 
obwohl der Loop durchläuft. Alle anderen Nachrichten werden ignoriert...

Das Ziel ist es nicht nur die Daten zu ändern sondern mehrere 
Nachrichten mit verschiedenen ID's. Kann es etwas mit dem 
Zwischenspeicher des Mcp2515 Chip zu tun haben?

Vielen Dank für eure Hilfe

Joni

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Joni A. schrieb:
> Beim Code von oben sehe ich im Bus Nachrichten mit ID: 631, 231 und 240
Mit genau diesem Code? Das würde mich sher wundern. Denn du 
manipulierst dort immer nur auf der ersten tCAN message herum...

> Vielen Dank für eure Hilfe
Liest du eigentlich die Antworten auf deine Frage?

: Bearbeitet durch Moderator
von holger (Gast)


Lesenswert?

> Beim Code von oben sehe ich im
>Bus Nachrichten mit ID: 631, 231 und 240.

Mit dem Code von oben siehst du das garantiert nicht!
Du füllst immer nur message mit Daten, aber
message2, message3, message4 und message5 nicht.

von Bastian W. (jackfrost)


Lesenswert?

Joni A. schrieb
>
> Das Ziel ist es nicht nur die Daten zu ändern sondern mehrere
> Nachrichten mit verschiedenen ID's. Kann es etwas mit dem
> Zwischenspeicher des Mcp2515 Chip zu tun haben?
>
> Vielen Dank für eure Hilfe
>
> Joni

Deine fünf "Nachrichten" liegen im RAM vom uC und nicht vom MCP. Es ist 
egal ob du 5 verschiedene Nachrichten hast oder nur eine und dann diese 
vor dem Senden die Werte änderst.

Du hast 5 Nachrichten von den nur die erste Daten enthält. Die Werte der 
ersten werden geändert aber an den MCP werden nach den ersten senden im 
Loop nur noch die Leeren übergeben.

Ich sende bei meinem CAN im Keller verschiedene IDs mit verschiedenen 
Daten und Längen und das alles mit nur einem Nachtichtenpuffer im uC.

Gruß JackFrost

von Joni A. (joni_arb)


Lesenswert?

Lothar M. schrieb:
> Joni A. schrieb:
>> Beim Code von oben sehe ich im Bus Nachrichten mit ID: 631, 231 und 240
> Mit genau diesem Code? Das würde mich sher wundern. Denn du
> manipulierst dort immer nur auf der ersten tCAN message herum...
>
>> Vielen Dank für eure Hilfe
> Liest du eigentlich die Antworten auf deine Frage?

Sorry war wohl etwas früh am morgen..

Ich denke es müsste eher so aussehen (Mit diesem Code sehe ich 
Nachrichten im Bus mit ID 631, 231 UND 240):
1
#include <Canbus.h>
2
#include <defaults.h>
3
#include <global.h>
4
#include <mcp2515.h>
5
#include <mcp2515_defs.h>
6
7
//********************************Setup Loop*********************************//
8
9
void setup() {
10
  Serial.begin(9600);
11
  Serial.println("CAN Write - Testing transmission of CAN Bus messages");
12
  delay(1000);
13
  
14
  if(Canbus.init(CANSPEED_500))  //Initialise MCP2515 CAN controller at the specified speed
15
    Serial.println("CAN Init ok");
16
  else
17
    Serial.println("Can't init CAN");
18
    
19
  delay(1000);
20
}
21
22
//********************************Main Loop*********************************//
23
24
void loop() 
25
{
26
tCAN message;
27
28
        message.id = 0x631; //formatted in HEX
29
        message.header.rtr = 0;
30
        message.header.length = 8; //formatted in DEC
31
        message.data[0] = 0x40;
32
  message.data[1] = 0x05;
33
  message.data[2] = 0x35;
34
  message.data[3] = 0xFF; //formatted in HEX
35
  message.data[4] = 0x00;
36
  message.data[5] = 0x60;
37
  message.data[6] = 0x00;
38
  message.data[7] = 0x00;
39
40
 tCAN message2;
41
42
        message2.id = 0x231; //formatted in HEX
43
        message2.header.rtr = 0;
44
        message2.header.length = 8; //formatted in DEC
45
        message2.data[0] = 0x40;
46
 message2.data[1] = 0x05;
47
  message2.data[2] = 0x30;
48
  message2.data[3] = 0xFF; //formatted in HEX
49
  message2.data[4] = 0x60;
50
  message2.data[5] = 0x40;
51
  message2.data[6] = 0x00;
52
  message2.data[7] = 0x00;
53
54
 tCAN message3;
55
56
        message3.id = 0x240; //formatted in HEX
57
        message3.header.rtr = 0;
58
        message3.header.length = 8; //formatted in DEC
59
        message3.data[0] = 0x40;
60
 message3.data[1] = 0x05;
61
  message3.data[2] = 0x30;
62
  message3.data[3] = 0xFF; //formatted in HEX
63
  message3.data[4] = 0x80;
64
  message3.data[5] = 0x40;
65
  message3.data[6] = 0x00;
66
  message3.data[7] = 0x00;
67
68
 tCAN message4;
69
70
        message4.id = 0x221; //formatted in HEX
71
        message4.header.rtr = 0;
72
        message4.header.length = 8; //formatted in DEC
73
        message4.data[0] = 0x40;
74
 message4.data[1] = 0x05;
75
  message4.data[2] = 0x30;
76
  message4.data[3] = 0xFF; //formatted in HEX
77
  message4.data[4] = 0x00;
78
  message4.data[5] = 0x40;
79
  message4.data[6] = 0x00;
80
  message4.data[7] = 0x00;
81
82
83
 tCAN message5;
84
85
        message5.id = 0x110; //formatted in HEX
86
        message5.header.rtr = 0;
87
        message5.header.length = 8; //formatted in DEC
88
        message5.data[0] = 0x40;
89
 message5.data[1] = 0x05;
90
  message5.data[2] = 0x30;
91
  message5.data[3] = 0xFF; //formatted in HEX
92
  message5.data[4] = 0x00;
93
  message5.data[5] = 0x40;
94
  message5.data[6] = 0x00;
95
  message5.data[7] = 0x00;
96
97
mcp2515_bit_modify(CANCTRL, (1<<REQOP2)|(1<<REQOP1)|(1<<REQOP0), 0);
98
99
mcp2515_send_message(&message);
100
delay(1000);
101
102
mcp2515_send_message(&message2);
103
delay(1000);
104
105
mcp2515_send_message(&message3);
106
delay(1000);
107
108
mcp2515_send_message(&message4);
109
delay(1000);
110
111
mcp2515_send_message(&message5);
112
delay(1000);
113
114
software_Reset();
115
}
116
117
void software_Reset() // Restarts program from beginning but does not reset the peripherals and registers
118
{
119
asm volatile ("  jmp 0");  
120
}

Oder verstehe ich das mit den leeren Daten nicht... :(

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Schalte mal nach jeder Message eine LED an einem Portpin ein. Oder mache 
eine Endlosschleife hinter die letzte Message. Evtl. kommt da der 
Watchdog und du kommst nie weiter als bis zur dritten Message...

von soundso (Gast)


Lesenswert?

Frage:

du hast schon einen weiteren CAN Knoten am Bus der dir die CAN-Msg 
bestätigt?
evtl. ist dein Sniffer nur zum Horchen da und niemand bestätigt deine 
CAN-Msg auf dem Bus ...

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.