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ß
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
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ß
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
@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
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....
Hallo Dirk, Kannst du bitte dein code für Receive zeigen. Bei mir funktioniert the receive interrupt, aber ich kann die Byte nicht richtig emfangen. Vielen Dank. Roy
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.