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
Ist dir der Unterschied zwischen pollen und interrup im allgemeinen bekannt? Ich meine unabhängig von CAN.
Je nach dem was du machen willst ist pollen oder Interrupt besser. Wenig Zeitverzögerung spricht im allgemeinen für Interrupt. Aber um was genaueres zu sagen ist deine Frage zu schwammig.
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.
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 ...
Nicht ganz korrekt. Nachdem eine Nachricht empfangen wurde, nimmt der entsprechende MOb keine neuen Nachrichten mehr an. Dazu muss er erneut wieder auf Empfang geschaltet werden.
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.
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
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.