Forum: Mikrocontroller und Digitale Elektronik Arduino Blue Pill CAN bibliothek


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Kay L. (kgbrus)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

ich nutze Arduino Blue Pill & CAN mit SN65HVD230 zur Kommunikation 
zwischen den einzelnen Blue Pills. Das funktioniert soweit ganz gut nur 
das niedrig priorisierte Nachrichten sehr lange unterwegs sind. Das 
Grund dürfte sein, das ich alle Nachrichten im Intervall alle 200 ms 
sende. Und wenn dann noch einen Nachricht nicht ankommt wird es auf dem 
Bus voll. final sollen ca 60 Teilnehmer (Blue Pill) auf den CAN Bus 
zugreifen.
Also habe ich umgestellt auf "event gesteuertes versenden" sprich, es 
wird immer dann gesendet wenn ich ein Eingang am Blue pill ändert. Auch 
das funktioniert soweit.
Mit ist dabei aufgefallen, das wenn der Sender zB Nachricht 0x100011 
sendet, sich der Empfänger der Nachricht nicht im CAN befindet, die 
Nachricht trotzdem als empfangen quittiert wird und somit auch nicht 
mehr gesendet wird.
Mein letzter Versuch Aufbau:
1 Blue Pill als Zentrale versendet Nachricht 0x100011 es ist nur ein 
Empfänger im CAN Netz. Der Soll aber Nachricht 0x100020 empfangen.
nachdem ich die Zentrale eingeschaltet habe wird Nachricht 0x100011 
gesendet und zwar immer wieder da das ACK Bit nicht vom Empfänger 
quittiert wird. Sobald ich den Empfänger für die Nachricht 0x100020 
einschalte und dieser im loop ist, wird die Nachricht 0x100011 als 
empfangen gekennzeichnet.

Ich bin bis dato davon aus gegangen das nur der Empfänger die Nachricht 
quittieren kann, der auch für diese Nachricht vorgesehen ist. Liege ich 
da falsch?

Selbstverständlich habe ich mehrere Blue Pills und auch 
Transiverbausteine verwendet

Im Anhang findet Ihr:
Meine CAN programierung in der Zentrale : CANsenden
Die Bivliotheken von github : stm32f103.ccp & stm32f103.h
Mein Code vom Empfänger: Modul 1
Mein programmcode der Zentrale: Zentrale


Kann mal jemand schauen, wo da der Fehler liegt?

PS: ich habe die intervallschleife in der Funktion für CAN senden noch 
nicht entfernt, falls ich die doch noch brauche.
PPS noch eine bitte, ich weiß das der Blue Pill kein Arduiono ist, ich 
weiß das dieser  häufig geklont und gefaked wird. Also bitte keine 
Diskussion über Sinn der Verwendung des STM32 Blue Pill. Danke.

Gruß

Kay

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Kay L. schrieb:
> Ich bin bis dato davon aus gegangen das nur der Empfänger die Nachricht
> quittieren kann, der auch für diese Nachricht vorgesehen ist. Liege ich
> da falsch?

Ja das ist falsch. Jeder CAN Empfänger der die Nachricht intakt 
empfangen hat quittiert via ACK-Bit, auch wenn die Nachricht dann via 
Filter wieder verworfen wird. Außer man hat dem Empfänger auf "Silent 
Mode" (oder wie das hieß) gestellt.

Das ACK-Bit ist nicht dafür da, den korrekten Empfang durch den 
gewünschten Empfänger zu signalisieren, sondern nur dazu da, die 
grundlegende Funktionalität des CAN Bus zu prüfen (Layer 1-2).

Kay L. schrieb:
> Also bitte keine Diskussion über Sinn der Verwendung des STM32 Blue Pill

IMO eine bessere Wahl als ein Arduino mit externem CAN-Controller ...

: Bearbeitet durch User
von Kay L. (kgbrus)


Lesenswert?

Niklas G. schrieb:
> Kay L. schrieb:
>> Ich bin bis dato davon aus gegangen das nur der Empfänger die Nachricht
>> quittieren kann, der auch für diese Nachricht vorgesehen ist. Liege ich
>> da falsch?
>
> Ja das ist falsch. Jeder CAN Empfänger der die Nachricht intakt
> empfangen hat quittiert via ACK-Bit, auch wenn die Nachricht dann via
> Filter wieder verworfen wird. Außer man hat dem Empfänger auf "Silent
> Mode" (oder wie das hieß) gestellt.
>
> Das ACK-Bit ist nicht dafür da, den korrekten Empfang durch den
> gewünschten Empfänger zu signalisieren, sondern nur dazu da, die
> grundlegende Funktionalität des CAN Bus zu prüfen (Layer 1-2).
>
> Kay L. schrieb:
>> Also bitte keine Diskussion über Sinn der Verwendung des STM32 Blue Pill
>
> IMO eine bessere Wahl als ein Arduino mit externem CAN-Controller ...

Hallo Niklas,

vielen Dank, da hab ich wieder was gelernt!

LG

Kay

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Gern, viel Erfolg 👍

CAN-Nachrichten nur dann zu senden wenn sich was ändert ist eventuell 
nicht so optimal weil wenn eine Nachricht verloren geht, bekommt der 
Empfänger die Änderung nie mit. Die simpelste Art der Fehlerkorrektur 
ist es, die Nachricht immer wieder zu senden.

Kay L. schrieb:
> alle 200 ms

Das ist ja eigentlich ziemlich harmlos. Eine CAN-Nachricht bei 1Mbps 
braucht unter 1ms IIRC. Wie viele verschiedene Nachrichten senden alle 
Controller zusammen?

von Kay L. (kgbrus)


Lesenswert?

Niklas G. schrieb:
> Gern, viel Erfolg 👍
>
> CAN-Nachrichten nur dann zu senden wenn sich was ändert ist eventuell
> nicht so optimal weil wenn eine Nachricht verloren geht, bekommt der
> Empfänger die Änderung nie mit. Die simpelste Art der Fehlerkorrektur
> ist es, die Nachricht immer wieder zu senden.
>
> Kay L. schrieb:
>> alle 200 ms
>
> Das ist ja eigentlich ziemlich harmlos. Eine CAN-Nachricht bei 1Mbps
> braucht unter 1ms IIRC. Wie viele verschiedene Nachrichten senden alle
> Controller zusammen?

Das ist genau mein Problem, das Nachrichten verloren gehen können. 
Besonders im Einschaltmoment, wenn der Empfänger der Nachricht noch 
nicht bereit war.
Ich steuere dammit meine Modellbahn und alle 200ms zu senden ist bereits 
zu langsam, weil es passieren kann das Loks eine Lichtschranke fahren 
aber das vom CAN nicht an die Zentrale gemeldet wird. Ich habe das mit 
Zählern überprüft, einen am Modul an dem die Lichtschranke hängt und 
einem in der Zentrale. bei 50 Durchfahrten wurde 3 oder 4 nicht erkannt. 
Die sind aber essentiell für die weitere Steuerung.
Auch werden niedrig priorisierte Nachrichten sehr weit "nach Hinten" 
verschoben. Die Anzeige auf dem Stellwerk hat teilweise ein oder zwei 
Sekunden gebraucht um zu wechseln.  Dadurch das das Modul "vor ort" den 
zustand an die Zentrale melde und dann aufgrund der Antwort der zentrale 
was zu machen ist arbeitet, vergehen im schlimmsten fall 400ms bis der 
Fahrstrom zb abgeschaltet wird.
Ich habe dann mal die maximale Anzahl der Nachrichten ausgerechnet bei 
1Kbit passen im Optimalfall ca 7000 Nachrichten pro Sekunde auf den bus. 
ich arbeite aber mit 500 k bit also nur noch 3500. Bei Übertragung alle 
100ms passen rechnerich nur 350 Nachrichten pro Sekunde auf den Bus.

Die Anzahl der Teilnehmer auf dem Bus wird am ende knappe 100  sein die 
hin und her kommunizieren müssen. Also 200 Nachrichten. das wird am ende 
nicht passen.

da muß ich mal überlegen wie ich das löse

Gruß

kay

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Kay L. schrieb:
> bei 50 Durchfahrten wurde 3 oder 4 nicht erkannt.

Das ist ein ziemlich hoher Verlust. Du hast vermutlich Störungen auf dem 
Bus. Die sind leider nicht so leicht zu identifizieren. Durch bessere 
Verdrahtung kann man das verbessern.

Also kurze/keine Stichleitungen, korrekte Terminierung, gute 
Masseführung, Schirmung...

von Kay L. (kgbrus)


Lesenswert?

Niklas G. schrieb:
> Kay L. schrieb:
>> bei 50 Durchfahrten wurde 3 oder 4 nicht erkannt.
>
> Das ist ein ziemlich hoher Verlust. Du hast vermutlich Störungen auf dem
> Bus. Die sind leider nicht so leicht zu identifizieren. Durch bessere
> Verdrahtung kann man das verbessern.
>
> Also kurze/keine Stichleitungen, korrekte Terminierung, gute
> Masseführung, Schirmung...

Ich denke das die situation eher folgende ist:
- CAN Nachricht gesendet - die zu übertragende Variable ist LOW
- Lok kommt in Lichtschranke - die zu Übertragende Variable wechselt zu 
High
- Lok fährt aus Lichtschranke wieder auf - die Zu übertragende Variable 
wechselt wieder zu Low
- Nächstes mal CAN senden- dementsprechend wird die Variable als Low 
gesendet.

Das ganze passiert nur bei relativ kurzen und oder schnellen Loks.

Ich will Störungen nicht ausschließen. Aber ich denke nicht das die die 
Hauptursache sind. Terminierung hab ich zwischen 100 und 200 Ohm an 
beiden Enden probiert. Den bus hab ich verkürzt so das nur die 5 Module 
für einen Schattenbahnof angeklemmt sind. Die einzelnen Module sind mit 
geschirmten D-Sub Kabeln verbunden. Auf den Modulen ist die Stichleitung 
möglichst kurz und die beiden Kabel sind verdrillt.  Jegliche Änderung 
am Bus hat keine Verbesserung gebracht, zumindest soweit ich das 
beurteilen kann, also keine entscheidende. Die Geschwindigkeit der Loks 
zu verringern oder Wagon anhängen, damit die Lichtschranke länger 
geschlossen ist aber schon.

Ich überlege gerade das das so löse

Wenn Nachricht A vom richtigen Empfänger empfangen wurde, sendet dieser 
Empfänger eine Nachricht an die Zentrale. Diese wird dann ausgelesen und 
das senden beendet.

Bedeutet zwar pro Nachricht eine Nachricht mehr, da ich aber 
ereignisabhängig sende sollte das kein Problem sein.
Rein theoretisch sollen auf der Anlage später 30 Züge gleichzeitig 
unterwegs sein. Macht also im schlimmsten fall 60 Nachrichten nahezu 
gleichzeitig plus ein paar für die Beleuchtung und irgendwelche Aktionen 
bzw Szenerien in der Landschaft. zumal das nun der absolute theoretisch 
fall wäre das alle 30 Loks gleichzeitig irgendeine Aktion auslösen

von Peter L. (pelikan)


Lesenswert?

moin Kay,

der F103 hat 2 CAN Module, nutzt du beide?

VG
Peter

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Peter L. schrieb:
> der F103 hat 2 CAN Module,

Das bezweifle ich.

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.