CAN sender überprüfen

Gast #4118258
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
Gast #4118271
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?
Gast #4118283
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.
#4118299
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.
Gast #4118321
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();

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.