AT90Can128 Receive Interrupt

OP #897373
Lesenswert?

Hallo,
Ich bekomme es einfach nicht hin einen Can Receive Interrupt zu 
aktivieren, ich nutze die codesamlung von Atmel
Mein Code ( in Auszügen ):

volatile bool bNewMsg;

void initCan(void)
{ ...
  can_init(CAN_BAUDRATE);

  CANGIE = 0xfe;  //(1<<ENIT) | (1<<ENRX) | (1<<ENTX) |(1<<ENERR);//
    CANGIE |= (1<<ENIT) | ( 1<<ENRX );
  //Set MObs for which interrupts are enabled

  CANIE2 = (1<<IEMOB0) |  (1<<IEMOB1) |  (1<<IEMOB2) |  (1<<IEMOB3)| 
(1<<IEMOB4)|  (1<<IEMOB5)|  (1<<IEMOB6)|  (1<<IEMOB7);
  CANIE1 = 0;
              //enable MOb0 interrupt
   CANSIT1 = 0;
    CANSIT2 = 0;
...
}
int main (void)
{
...
  initCan();

if ( bNewMsg == true/*0x00 == doCanMsg(message)*/ )
{ ... }

}//main ende

SIGNAL(SIG_CAN_INTERRUPT1)
{
  bNewMsg=true;
}

Tja, also senden und empfangen klappt an sich wunderbar nur ich bekomme 
diese sch... Interrupt nicht hin

Achso WINAVR und AVR-Studio verwende ich...
Gruß
Gast #899808
Lesenswert?

Hallo Dirk,

ohne jetzt inhaltlich irgendwie eingesteigen zu sein:

volatile bool bNewMsg;
=> Compiler auch auf C99 umgestellt? Sonst müßten aber auch 
Fehlermeldungen kommen. Oder läuft der Code tatsächlich so durch?

CANIE2 = (1<<IEMOB0) |  (1<<IEMOB1) |  (1<<IEMOB2) |  (1<<IEMOB3)|
(1<<IEMOB4)|  (1<<IEMOB5)|  (1<<IEMOB6)|  (1<<IEMOB7);
=> Im Originalquellcode steht das hoffentlich in einer Zeile, sonst 
würde aber auch der Compiler meckern. Generell am besten kopierten Code 
posten und bei Bedarf kürzen, da Abtippen eventuelle Schreibfehler 
korrigiert.

CANGIE = 0xfe;  //(1<<ENIT) | (1<<ENRX) | (1<<ENTX) |(1<<ENERR);//
CANGIE |= (1<<ENIT) | ( 1<<ENRX );
=> Ist wohl doppelt gemoppelt und daher unnötig. Laß außerdem lieber die 
auskommentierte Zeile mit (1<<ENIT) etc. statt einem nichtssagenden 
HEX-Wert stehen; da weiß jeder gleich, was los ist.

if ( bNewMsg == true/*0x00 == doCanMsg(message)*/ )
=> Ich bin mir nicht sicher, ob ein Kommentar in der Bedingung zulässig 
ist. Unschön und verwirrend ist es auf jeden Fall.

Ich hab das Datenblatt grad nicht zur Hand. Es werden die richtigen 
Interrupts aktiviert und auch der richtige Interrupthandler geschrieben?

Gruß
Lutz
OP #899855
Lesenswert?

tja also es sieht alles so wild aus weil ich am probieren war...

Mein Problem ist eben das ich nicht genau weis welche Bits und Bytes ich 
setzen muss... Und so ganz schlau werde ich aus dem Datenlbatt nicht...

projekt habe ich mal angehängt, fals es hilft.

Wenn jemand ein gutes Beispiel hat, auch gut. Inder Code sammlung gibt 
es zwar ein bsp, aber das arbeitet nicht mit den Atmel-Sourcen und hilft 
mir daher nicht wirklich...

Gruß
Gast #900094
Lesenswert?

Der Anhang ist ein bischen dünn ...

Weiterhin sollte laut Datenblatt
CANGIE = (1<<ENRX);
ausreichen, um den Receive Interrupt zu aktivieren. Mit (1<<ENIT) werden 
alle Interrupts aktiviert, was viel Ärger bringen kann, zumal wenn kein 
entsprechender Interrupthandler implementiert ist. Also nur den ENRX 
aktivieren.
sei() hattest Du ja schon bestätigt, also sollte es auf den ersten Blick 
dann mit dem Receive Interrupt klappen.

Gruß
Lutz
#900565
Lesenswert?

@Dirk R.
Da stehst Du nicht alleine da. Ich habs auch in den letzten Tagen 
versucht, den RX-Interrupt auszulösen. Hab auch den IEMOBx sowie den 
ENRX (und natürlich auch sei()) gesetzt. Aber kein Interrupt nach 
Empfang eines Paketes. Hab dann erstmal wieder auf Polling umgestellt, 
da klappts problemlos. Vielleicht hat ja hier jemand eine gute Idee, 
würde mir sicher auch helfen.

Erwin
OP #900586
Lesenswert?

Kannst du mir sagen wie du es mit dem Polling machst ?

Ich habe mir zur Zeit so geholfen, dass ich endlos (while..) auf neue 
Nachrichten warten und meine Port in einer Timer-ISR auf Veränderung 
überprüfe. Ist zwar nicht sehr elegant Funktioniert aber erstmal...

@Lutz: Nicht falsch verstehen aber so einfach scheint es eben nicht zu 
sein:
( Weiterhin sollte laut Datenblatt CANGIE = (1<<ENRX);
ausreichen, um den Receive Interrupt zu aktivieren. )

Ich habe auch schon ne ziemlich ausführliche beschreibung gefunden, 
leider ist mein englisch nicht das beste:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=43263&start=0

und daher Blick ich noch nicht ganz durch....

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren