Moin,
ich betreibe einen Mega8 und einen MCP2515 um Nachrichten vom CanBus zu
Empfangen. Der Empfang der Nachrichten funktioniert auch soweit.
Programmiert wird mit AVR-GCC.
Der µC soll nun bei bestimmten Nachrichten, die er vom Bus empfängt
Ausgänge (Relais) schalten. Bisher lese ich in meiner Hauptschleife
sämtliche Can Nachrichten aus und schalte dann über Switch/Case die
entsprechenden Ausgänge. Nun habe ich aber ein kleines Problem. Manche
Nachrichten auf dem Bus kommen bis zu 100 mal hintereinander (habe
leider keinen Einfluss darauf), immer mit dem selben Inhalt. Dadurch
kommt es natürlich dazu, dass das Relais nicht dauerhaft durchschaltet,
sondern "oszilliert" im Takt der Nachrichten. Ich bräuchte nun also eine
Art "Pufferfunktion" um dies zu verhindern. Mein bisheriger Ansatz war
einfach ein Zähler, der bis 100 zählt und dann erst das Relais schaltet.
Leider funktioniert dies nicht wie gewünscht, da jetzt die Verzögerung
zwischen der ersten empfangenen Nachricht und dem Schalten des Relais zu
groß wird.
Hat vllt. jemand einen Ansatz oder eine Idee, wie ich das Problem lösen
könnte?
Gruß, echolot
Hi Echolot,
schalte doch direkt ein, aber nur nach einer gewissen Hysterese wieder
aus.
Ist die Nachricht zum Ein- und Ausschalten die gleiche?
Gruß
Sebastian
Hallo,
habe mich vllt. etwas unklug ausgedrückt, das Relais muss nicht
dauerhaft geschaltet bleiben, es wird nur ein mal getriggert (200ms)
Die Nachricht ist immer die selbe.
Gruß, echolot
echolot schrieb:> habe mich vllt. etwas unklug ausgedrückt, das Relais muss nicht> dauerhaft geschaltet bleiben, es wird nur ein mal getriggert (200ms)
Ein Relais wird normalerweise nicht getriggert, sondern es wird
durchgeschaltet oder eben nicht. Wann es anschalten soll und wann es
ausschalten soll, musst du in deinem Programm festlegen und zwar
entsprechend deine CAN-Nachrichten.
Was sollen die 200ms sein und wer legt die fest?
echolot schrieb:> Manche> Nachrichten auf dem Bus kommen bis zu 100 mal hintereinander (habe> leider keinen Einfluss darauf), immer mit dem selben Inhalt.
Das ist völlig normal.
> Dadurch kommt es natürlich dazu, dass das Relais nicht dauerhaft> durchschaltet, sondern "oszilliert" im Takt der Nachrichten.
Das ist nicht "natürlich" und hat auch nichts mit dem CAN zu tun. :-)
Hysterese ist wie erwähnt eine Lösung.
Alternativ, reagier doch einfach auf den Inhalt der Botschaft?
Hi,
wie soll sich denn das Relais verhalten, wenn viele dieser Nachrichten
in kurzer Zeit ankommen?
Wenn du weißt, was du willst, kannst du es dann sicher auch in der SW
umsetzen.
Gruß
Sebastian
Ich interpretiere jetzt mal aus deiner Beschreibung heraus:
du hast irgendwo ein auslösendes Event - ein Taster, eine Lichtschranke
oder so - welches die Nachricht auf dem Bus erzeugt.
Diese Nachricht soll bewirken dass irgendwo anders ein Aktor (Licht,
Motor, Hupe) für eine bestimmte Zeit arbeitet.
Ich würde dann mit der ersten Nachricht das Relais einschalten und einen
Timer starten, der 200ms lang abläuft, und bei Ablauf des Timers das
Relais wieder ausschalten. Wenn der Timer läuft (Abfrage im Programm),
kannst du entweder nichts tun - das Relais ist ja bereits geschaltet -
oder den Timer zurücksetzen. Dadurch bleibt das Relais geschaltet bis
200ms nach Empfang der letzten Nachricht.
Wenn es sein kann dass die Nachrichten über einen längeren Zeitraum als
200ms empfangen werden, du aber das Relais nur genau 200ms schalten
willst, löst du bei jeder Nachricht einen weiteren Timer aus und
resettest diesen auf einen Zählwert größer als der Abstand zwischen Zwei
Nachrichten. Erreicht der dann seinen Ablaufwert, setzt er eine Variable
die signalisiert dass das Relais wieder bereit ist. Und natürlich
schaltest du das Relais auch nur ein wenn die Flag gesetzt ist.
So ganz im Zustandsautomaten-Style.
echolot schrieb:> Hallo,>> habe mich vllt. etwas unklug ausgedrückt, das Relais muss nicht> dauerhaft geschaltet bleiben, es wird nur ein mal getriggert (200ms)> Die Nachricht ist immer die selbe.
Dann mach dir doch eine Variable, in der du den Schaltzustand des Relais
vermerkst.
Die erste Nachricht triggert den Schaltvorgang, alle weiteren jeweiligen
Nachrichten werden ignoriert, weil das Relais ja schon geschaltet wurde.
Edit: falls ich dein Problem richtig verstanden habe.
Wenn der Sender natürlich 100 mal hintereinander
ein/aus/ein/aus/ein/aus/... schickt, dann flattert das Relais natürlich.