Senden auf dem CAN-BUS

OP #4248360
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?
OP #4248836
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?
#4249025
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.
#4249036
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
Gast #4249208
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.

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.