Forum: Mikrocontroller und Digitale Elektronik Senden auf dem CAN-BUS


von Dirk P. (crunso)


Lesenswert?

Hallo Cummonity,

ich hab ein sehr großes Problem mit meiner µC-Programmierung. Ich habe 
mir Funktionen zum Senden von CAN-Botschaften geschrieben. Mein 
Mikrocontroller kann zwei CAN-Tranceiver ansprechen und ich benutze auch 
beide.

Jetzt möchte ich im 10msec Bereich oder im 1sec Bereich regelmäßig an 
beide Busse Nachrichten versenden. Dazu habe ich einen Timer Programmier 
dessen Interrupt alle 10msec auslöst.

Wenn ich jetzt aber den den Interrupt des Timers schreibe:

send_message_can1 ....;
send_message_can2 ....;

Dann wird immer nur eine Nachricht auf dem einem Bus gesendet aber NIE 
die andere.

wenn ich 30 mal send_message_can1 mit anderen Daten untereinander 
schreiben, wird alles auf dem Bus gesendet.

Wenn ich send_message_can1 in der main-Funktion in einer while schleife 
ausführe und send_message_can2 in dem Timer funktioniert es ... . Dann 
wird auf dem can1 so schnell wie möglich gesendet und auf dem can2 jede 
10msec oder 1sec.

Aber warum funktioniert es nicht send_message_can1 und ..._can2 in den 
Timer zu packen und beides wird gesendet.

Ich bin schon am verzweifeln, für mich ergibt das keinen Sinn. Hat 
jemand eine Idee, eine RIchtugn wo das Problem liegen könnte?

von Rudolph R. (rudolph)


Lesenswert?

Dirk P. schrieb:
> Ich bin schon am verzweifeln, für mich ergibt das keinen Sinn.

Tröste Dich, für uns ergibt das bis hierher auch kaum Sinn.

von Bülent C. (mirki)


Lesenswert?

Der Fehler liegt in Zeile 42

von TestX (Gast)


Lesenswert?

gleiche messagebox/buffer verwendet oder sowas... aber ohne den 
passenden quelltext, libs und infos zu deinem Controller wird das hier 
nichts...

von Dirk (Gast)


Lesenswert?

Hallo, dein programmaufbau ist falsch.

In deiner isr setzt du ein Flag wenn du deine zeit erreicht hast und in 
dem Main loop fragst du den Flag ab und sendest dementsprechend deine 
Nachricht.

von Dirk (Gast)


Lesenswert?

Die Auflösung deines Timers kannst du auf 10msec setzten durch 
inkrementierung einer Variable kannst du dir die anderen zeitbasen 
erstellen.

von Dirk P. (crunso)


Lesenswert?

Das Senden funktioniert auch nicht wenn ich beide Sendefunktionen in der 
While-Schleife schreibe unabhängig von der Verwendung des Timers.

den gleichen Buffer kann ich doch nicht verwendet haben oder?
Der eine Buffer ist ja von dem CAN1 und der andere Buffer von CAN2.
Außerdem werden die Funktionen ja nacheinander abgearbeitet, da dürfte 
es doch gar nicht schlimm sein den gleichen Buffer zu nehmen oder?

von Rolf M. (rmagnus)


Lesenswert?

Dirk P. schrieb:
> Das Senden funktioniert auch nicht wenn ich beide Sendefunktionen in der
> While-Schleife schreibe unabhängig von der Verwendung des Timers.
>
> den gleichen Buffer kann ich doch nicht verwendet haben oder?

Woher soll das hier jemand wissen? Es wird wohl keiner auf magische 
Weise erahnen können, was für Hardware du hast und wie dein Code 
aussieht.

> Der eine Buffer ist ja von dem CAN1 und der andere Buffer von CAN2.

Soso, ist er das?

> Außerdem werden die Funktionen ja nacheinander abgearbeitet, da dürfte
> es doch gar nicht schlimm sein den gleichen Buffer zu nehmen oder?

Sofern ihn der CAN-Controller nach Rückkehr aus der Funktion nicht mehr 
braucht.

von Andreas H. (enochroot)


Lesenswert?

Hallo Dirk,

zunächst solltest Du immer Deinen Code posten, wenn Du Hilfe für einen 
speziellen Code benötigst.

Grundsätzlich gilt beim Programmieren mit Interrupts die 
Interruptroutine so kurz wie möglich zu halten.
Du setzt also, wie Dirk(2) beschrieben hat lediglich ein Flag in Deiner 
isr und dann raus aus der isr.
Dieses Flag frägst Du in der main-loop bei jedem Durchlauf ab und wenn 
es gesetzt wurde, dann sendest Du Deine Nachricht.

Du solltest nebenbei auch Warteschleifen in der main vermeiden, da es 
sonst zu Timingproblemen kommen kann.

Ich hoffe das hilft weiter.

Gruß
Andreas

von Soul E. (Gast)


Lesenswert?

Dirk P. schrieb:
>
> Dann wird immer nur eine Nachricht auf dem einem Bus gesendet aber NIE
> die andere.

Bist Du mit Dir selber alleine am Bus oder hängen da noch andere Knoten 
dran? Falls nicht, schließ mal ein zweites Steuergerät mit an. Der Typ 
ist egal, nur die Datenrate muss passen.

Wenn keiner Deine Botschaften liest, wird kein Acknowledge gesendet. 
Dann gilt die Botschaft als nicht zugestellt und Du kommst nie bis zur 
zweiten.

von Steffen R. (steffen_rose)


Lesenswert?

Geht CAN2 überhaupt? Dazu machst Du keine Aussage.

von Bülent C. (mirki)


Lesenswert?

Dirk P. schrieb:
> Wenn ich send_message_can1 in der main-Funktion in einer while schleife
> ausführe und send_message_can2 in dem Timer funktioniert es ... . Dann
> wird auf dem can1 so schnell wie möglich gesendet und auf dem can2 jede
> 10msec oder 1sec.

von Steffen R. (steffen_rose)


Lesenswert?

Beantwortet nicht direkt die Frage.
Könnte hier z.B. auch bedeuten, dass CAN2 nur senden kann, wenn 
irgendetwas in der CAN1-Sendefunktion gesetzt wird.

Was scheinbar nicht geht ist das Senden auf CAN2 ohne "Hilfe" von CAN1.
Nur, um eine der vielen Spekulationen zu nennen, die mir in den Sinn 
kommen.

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.