Forum: Mikrocontroller und Digitale Elektronik ISR CAN löst nicht aus


von Tim R. (herrvorragend)


Lesenswert?

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

von cskulkw (Gast)


Lesenswert?

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?

von Tim R. (herrvorragend)


Lesenswert?

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

von Tim R. (herrvorragend)


Lesenswert?

CANEN1 CANE2 habe ich beide enable, aber das ergebnis ist das selbe...
weiss jemand vllt noch einen weiteren rat ? :(

von cskulkw (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.