PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : TouCAN: CAN Nachrichten empfangen durch Polling



stefan_m
30.06.2006, 01:18
Hi,

Ich habe folgendes Prblem: Ich möchte CAN Nachrichten empfangen ohne Interrupts zu verwenden. (Die Anwendung hat strikte Deadlines und darf daher nicht unterbrochen werden. Denn falls auf dem CAN Bus viele Nachrichten übermittelt werden, könnte die Anwendung ihre Deadlines eventuell nicht mehr unterschreiten.) Die Nachrichtenpuffer sollen von der Anwendung zyklisch abgefragt werden: liegt eine neue Nachricht im Puffer wird diese verarbeitet. Das Problem hierbei ist, ich kann Nachrichten "verpassen", d.h. es werden 2 Nachrichten in einen Puffer geschrieben der nur eine aufnehmen kann.
Ich verwende einen MPC555 mit TouCAN Controller (mit 16 Nachrichtenpuffern). Ist es möglich diese Puffer so einzustellen, dass mehrere Puffer als Lesepuffer konfiguriert werden und diese nacheinander befüllt werden, so dass mehrere Nachrichten (anstatt einer) pro Zyklus gespeichert werden können? Wichtig dabei ist, dass alle Puffer alle möglichen eingehenden Nachrichten aufnehmen sollen, d.h. die Filtermaske für die Puffer auf 0x00000 steht. Dies ist wichtig, weil die Anwendung unterschiedlichste zur Laufzeit nicht bekannte Nachrichten empfangen und ggf. verarbeiten soll.

Vielen Dank im voraus,
Stefan

askazo
30.06.2006, 09:05
Ich kenne zwar den Controller nicht, aber ganz ohne Interrupts wird's nicht gehen, wenn Du keine Nachrichten verpassen darfst.

Ist das ganze denn so zeitkritisch, dass das reine Einlesen der Nachrichten in einen Puffer im µC schon zu lange dauern würde? Du musst ja im Interrupt die Nachricht nicht schon auswerten, dass könntest Du ja per Polling machen.

Ansonsten könnte ich mir höchstens vorstellen, dass Du eine kleine Funktion schreibst, in der Du den Nachrichtenpuffer, der für die nächste zu empfangende Nachricht benutzt wird, einstellst. Diese Funktion rufst Du dann in allen Empfangs-Interrupts so auf, dass immer der nächste Puffer eingestellt wird. Spätestens nach der 16. Nachricht musst Du dann aber zwangsweise alle Nachrichten speichern, sonst geht was verloren.

askazo

stefan_m
05.07.2006, 10:51
Vielen Dank für die Idee,


es ist nur nicht das Problem, dass Interrupts zu lange dauern würden, sondern dass der Controller zeitgesteuert ist.

Ich habe das jetzt so umgesetzt, dass auf einem Puffer alle unbekannten Nachrichten gelesen werden. Diese Nachrichten werden analysiert und wenn sich das System für eine Nachricht interessiert wird dem Identifier dynamisch ein eigener Lesepuffer zugewiesen.


stefan_m