CAN Receive Polling oder Interrupt

OP #719932
Lesenswert?
• ▲
▼
hallo,
ich versuch grad nen can-bus mit einem at90can aufzubauen.
kann mich mal jem etwas über polling- und interruptbetrieb bei nem 
canbus aufklären, ich bin da absolut unerfahren??
der controller soll in regelmäßigen abständen daten in einer 
can-botschaft übermittelt bekommen.
ich möchte erhaltene nachrichten gerne einmal pro schleifendurchlauf 
einlesen.
muss ich dann denn bei jeder abfrage in einer schleife solange warten, 
bis eine nachricht am port ankommt, oder kann der controller auch 
automatisch das message-register mit jeder neu ankommenden nachricht 
updaten und ich les es dann aus, wenn ich es brauche.
oder wäre dieses automatische updaten schon der interrupt-betrieb??

mir ist halt wichtig, dass ich möglichst wenig zeitverzögerung in meinem 
programm hab. was ist die günstigste variante??

hoffe jem versteht das da oben
grüsse
andreas
OP #720067
Lesenswert?
• ▲
▼
hi, der unterschied müsste klar sein.
es ist so, dass ich dachte, dass der interrupt mehr zeit kostet, denn 
wenn in zu kleinen zeitabständen nachrichten eingehen, werden doch 
andauernd interrupts ausgelöst.
es würde mir reichen, wenn ich einmal pro programmdurchlauf die 
can-message zyklisch abfrage.
meine frage war, muss ich, wenn ich keinen interrupt-betrieb möchte, mit 
meinem programm beim abfragen des can-eingangs jedesmal solange warten, 
bis aktuell eine nachricht am eingang ankommt?? quasi ne warteschleife??
oder kann ich den avr so einstellen, dass er eine eingehende nachricht 
automatisch und "parallel" zum hauptprogramm empfängt und solange im 
register behält, bis ich die nachricht auslese. danach setze ich den 
can-eingang wieder zurück, und er wartet auf die nächste message, usw.. 
geht das? und wenn ja, welche bits muss ich setzen, für den 
betriebsmodus??

das ist jetzt etwas anders formuliert als oben. bin mir noch nicht so 
ganz im klaren was ich genau will bzw. kann mit den at90can.
Gast #720219
Lesenswert?
• ▲
▼
Die Nachricht in einer Mailbox wird erst überschrieben, wenn die nächste 
Nachricht komplett empfangen wurde. Wann das ist hängt von deiner 
Baudrate und Framelänge ab, das kannst du dir selbst ausrechnen.

Wenn du es schaffst, in dieser Zeit mindestens einmal in deiner 
Main-Loop die CAN-Mailbox zu checken hast du kein Problem, sonst schon.

Den Overhead einer Interrupts kannst du, wenn du nicht gerade bei 1 MBit 
und einem DLC von 0 arbeitest (Interruptfrequenz etwa 20 kHz) in den 
Skat drücken, von daher nutze ihn.

Stelle aber sicher, dass andere ISRs oder dein Hauptprogramm nie die 
Interrupts länger als o.g. worst-case Zeit sperren, sonst hast du ein 
Problem, dass du aber im Polling auch gehabt hättest ...
Gast #720253
Lesenswert?
• ▲
▼
Hi,

das hast du recht, kannte den AT90CAN128 nicht.

Laut Datenblatt wäre ein Workaround, jeweils 2 MOB identisch zu 
konfigurieren, die Nachricht landet dann zunächst im erstbesten und das 
zweite könnte noch einen weiteren Frame aufnehmen, während das erste MOB 
von der Applikation gelesen wird.

Der "Frame buffer receive mode" erscheint mir aber eher unpraktisch, da 
man wissen muss wie viele Frames als burst kommen.
OP #720589
Lesenswert?
• ▲
▼
hi, danke für die hilfe. ich habs gestern zum laufen bekommen. habs nun 
so, wie jupp es sagte. ich aktiviere den empfänger, er liest die 
nachricht ein und speichert diese solange, bis ich sie aus dem MOb 
auslese und diesen von neuem aktiviere.
die nachrichten die ich in dieser zeit nicht empfangen kann, weil der 
MOb voll ist und sperrt, sind nicht so zeitkritisch, dass ich unbedingt 
jede eingehende nachricht bearbeiten muss.
es ist immer dieselbe nachricht, die ich empfange. nur die daten ändern 
sich (relativ langsam). der polling betrieb müsste dafür also geeignet 
sein.

danke+gruß
andreas

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.