Forum: Mikrocontroller und Digitale Elektronik CAN sender überprüfen


von Johannes (Gast)


Lesenswert?

Hallo,
wie kann ich am besten die Antworten von CAN-Teilnehmern überprüfen?
Also ich schicke eine Nachricht raus (alle 10 millisekunden), mit der 
Frage, ob noch alle Teilnehmer da sind (es sind mit mir 4 Teilnehmer 
dabei). Diese sollen mir innerhalb dieser Zeit antworten. Jetzt bin ich 
am überlegen, wie ich das am besten machen kann. Meine Überlegung ist 
es, mit dem Senden der Nachricht einen Timer zu starten und bei Ablauf 
des Timers zu überprüfen ob alle geantwortet haben (Dabei bin ich mir 
ziemlich sicher, dass ich es so machen werde). Die überlegung ist nun, 
wie vergleiche ich das? Erstelle ich einen Array mit allen Teilnehmer 
als referenz und einen Array mit allen die geantwortet haben und 
vergleiche ich die dann? Dann müsste ich ja entweder mit ein paar 
for-schleifen alle kombinationen durchgehen und den Array vergleichen 
oder den array nach größe Sortieren (was wäre schnelle?). Oder gibt es 
da eine ganz andere möglichkeit? Wenn ja, wie wäre diese?

Johannes

von Rüdiger Schutz (Gast)


Lesenswert?

Das kommt wohl auf Deine Plattform an, wo programmierst Du?

bei einem schnellen µC würde ich eher im ISR ein flag setzten und vor 
dem nächsten Sendezyklus auswerten ob alle Flags vorhanden sind, fehlt 
eines, hat wohl ein teilnehmer nicht mehr geantwortet.

Unter C# wirst DEu wohl einen Timer benötigen, wenn dann aber zwei 
Teilnehmer fastz zur selben Zeit senden musst Du aufpassen dass die 
Nachricht im Rx-Buffe nicht verloren geht (Stichwort Ringpuffer und 
Multimessage)


Wo läuft Dein Programm, welche Plattform, welche Hardware, welche 
Programmiersprache?

von Johannes (Gast)


Lesenswert?

Das ganze Programmiere ich in C soll mit einem dsPIC30F6011 ausgeführt 
werden. Programmiren mache ihc mit MPLABX.
Dass mehrere Nachrichten gleichzeitig ankommen könnten, hatte ich mir 
auf meinen Notizzettel schon einmal aufgeschrieben das ich das 
berücksichtigen muss. Zunächst sende ich die antworten mit tasterdruck 
(dafür gebe ich 5 Sekunden Zeit). wodurch das gleichzeitige senden 
ebenfalls unterdrückt wird.

von Thomas F. (igel)


Lesenswert?

Johannes schrieb:
> Dass mehrere Nachrichten gleichzeitig ankommen könnten,

Hast du mehrere Busse? Ansonsten kommen bei CAN alle Nachrichten 
nacheinander.

Was spricht gegen einzelne Bits?
Nach dem Senden der 1. Botschaft werden Bit 0 bis Bit 3 in einem Byte 
gesetzt.
Beim Eintreffen einer Nachricht wird das entsprechende Bit gelöscht.
Nach Ablauf des Timers muss das Byte=0 sein, sonst fehlt was.

von Rüdiger Schutz (Gast)


Lesenswert?

Auf einem µC bietet es sich an, das ohne Timer zu machen sondern einen 
Interrupt beim empfangen einer CAN-Nachricht auszulösen.
Im Interrupt setzt Du dann einzelne Bits ("Flags") die anzeigen, dass 
gerade eben von SlaveXY eine Antwort empfangen wurde.

Vor dem nächsten Senden schaust Du, ob alle Bits gesetzt sind, wenn ein 
Bit fehlt, hat ein Slave nicht mehr geantwortet.

Die Flags bzw. Bits muss Du natürlich in 2-er Potenz hoch setzen, d.h. 
der erste Slave bekommt das erste bit (0x01), der dritte slave bekommt 
das 3. Bit (0x04)....

mal auf die schnelle und nur sinngemäß....
1
#define Rx_SLAVE_01  0x01
2
#define Rx_SLAVE_02  0x02
3
#define Rx_SLAVE_03  0x04
4
#define Rx_SLAVE_04  0x08
5
6
uint Rx_Flag;
7
8
9
// Das hier im Empfangsinterupt
10
if (Rx_Message == Slave_1)
11
   Rx_Flag |= Rx_SLAVE_01;
12
13
else if (Rx_Message == Slave_2)
14
   Rx_Flag |= Rx_SLAVE_02;
15
16
else if (Rx_Message == Slave_3)
17
   Rx_Flag |= Rx_SLAVE_03;
18
19
else if (Rx_Message == Slave_4)
20
   Rx_Flag |= Rx_SLAVE_04;
21
22
23
// Das hier vor dem senden
24
if (Rx_Flag != 0x0F)  // 00001111b
25
  "irgendwas stimmt nicht, eine Slave fehlt
26
else
27
  Rx_Flag = 0;  // Zurücksetzen
28
  Sende_Neue_Anfrage();

von Johannes (Gast)


Lesenswert?

Ahh, super, ich habe es hinbekommen.
Zumindestens manuell mit Taster. JEtzt versuche ich das ganze noch mit 
Timern zu machen und dann funktioneiert es.

besten dank

Johannes

von Johannes (Gast)


Lesenswert?

Super, auch mit den Timern habe ich hinbekommen.
Noch einmal einr recht großes Dankeschön

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.