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?
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.
gleiche messagebox/buffer verwendet oder sowas... aber ohne den passenden quelltext, libs und infos zu deinem Controller wird das hier nichts...
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.
Die Auflösung deines Timers kannst du auf 10msec setzten durch inkrementierung einer Variable kannst du dir die anderen zeitbasen erstellen.
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?
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.
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.