Mehrere verschiedene Can Nachrichten mit Arduino versenden

#5200523
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
}
Moderator (Firma: Titel) Persönliche Seite #5200539
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... ;-)
Moderator (Firma: Titel) Persönliche Seite #5200557
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...
#5201332
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
Gast #5201340
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.
#5201407
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
#5201440
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... :(

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren