hallo, ich habe zwei at90can controller die per can kommunizieren, habe auf beiden den selben stack implementiert. can send per polling und empfang als ISR routine. controller 1 kann senden und empfangen. controller 2 kann nur senden. die ISR dazu wird nicht aufgerufen scheinbar. ich lasse direkt am anfang der isr mir eine LED als debug möglichkeit anzeigen. die led funktioniert wunderbar nur in der isr wird sie nie aktiviert. benutzen tu ich die "ISR ( CANIT_vect )", wie auch im beitrag zum controller steht. der controller der sendet zieht seine send funktion voll durch das sehe ich. gewartet wird über "while(!( (CANSTMOB&(1<<TXOK)) ));" jedoch reagiert der zweite controller scheinbar garnicht darauf obwohl es die selbe funktion wie beim anderen ist. ich versteh ehrlich gesagt nicht woran es liegt :( ob da jemand vllt eine zündende idee hat ? danke im voraus !! liebe grüße
Hallo Tim, hast Du den Empfangsinterrupt für das Message Object (MOB) im empfangenden Controler gesetzt? Dazu gibt es das CAN-MOB - Interupt enable register. Das sind 2 Bytes. Jedes einzelne MOB muß enabled werden, wenn es die ISR auslösen soll. Hast du im Empfänger die ID des Sender als zu EMPFANGENDE Botschaft eingestellt? Wenn das MOB im Empfänger auf Senden steht, wirst Du lange auf einen Interrupt warten müssen. Wenn Dein Empfänger nicht mit Acknowledge quittiert, müßte der Sender permanent die Botschaft senden, weil der AT90CANxxx keinen One-Shot-Modus kennt. Wenn der BUS nicht vollgemüllt ist, dann klappt jedoch der Empfang. Mit einer LED als Debugmöglichkeit wirst Du noch lange suchen. Hast Du kein Scope? Hast Du den Stack selbst geschrieben?
danke für deine antowort du meinst sicher CAN Enable Interrupt MOb Registers - CANIE2 and CANIE1. die habe ich aktiviert/enable gesetzt. jedoch habe ich gerade darüber noch CAN Enable MOb Registers - CANEN2 and CANEN1 gefunden das sollte ich mir wohl mal zu genüge führen das habe ich glaub ich nicht im code. ich habe für beide controller jeweils einen send und receive mob. der receive mob hat dabei eine mehr oder weniger beliebige ID. die ID des senders wird im interrupt des empfängers ausgewertet, ob diese gebraucht wird oder nicht. auf dem oszi habe ich nur einmal eine nachricht gesehen somit sollte dauersenden ausgeschlossen sein der bus wird wie gesagt nur von zwei controllern (Die nicht dauerhaft senden) genutzt. ich denke der bus sollte nicht zugemüllt sein :) den stack habe ich von hier: Beitrag "CAN-USB SJA1000T <-> AT90CAN128" sehr einfache routine, etwas schwerlig geschriebener code aber dennoch akzeptbael denke ich. wollte keinen großen aufgeblähten stack für diese kommunikation ich werde eben nochmal das enable register anschauen aber es ging bisher auch ohne was mich etwas wundert edit: mitlerweile bin ich soweit, dass ich von controller 1 etwas zu controller 2 senden kann. den empfang lass ich mir per led quittieren. was ich merkwürdig finde sie geht zwischenzeitig einmal aus, was für mich wie ein reset aussieht. von controller 2 kann ich dann aber nicht mehr zurücksenden. senden wird ausgeführt aber empfangen wird nichts. merkwürdig
CANEN1 CANE2 habe ich beide enable, aber das ergebnis ist das selbe... weiss jemand vllt noch einen weiteren rat ? :(
Sag mal Tim wieso setzt Du alle Bits im CANIE1 / CANIE2 ? Hast Du im CANGIE das Bit ENIT gesetzt? Erst dann ist der globale Interrupt arbeitsfähig? Außerdem mußt Du noch ENBX im gleichen Register setzen. Siehe dazu auch Siehe dazu Kapitel Interrupt im CAN-Controler-Abschnitt des Datenblattes. Du hast keinen Debugger, oder? Was meinst Du damit, dass Du Dir den Empfang per LED quittieren läßt, wenn der Interrupt nicht auslöst?. Pollst Du? Wie ermittelst Du, dass Du etwas empfangen hast?
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.