Forum: Compiler & IDEs AT90Can128 Receive Interrupt


von Dirk R. (dira)


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ß

von Alex (Gast)


Lesenswert?

sei() ?

von Dirk R. (dira)


Lesenswert?

ja wird gemacht, es läuft auch ein Timer ( für eine blinkende led)

von Lutz (Gast)


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

von Dirk R. (dira)


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ß

von Lutz (Gast)


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

von Erwin R. (er-tronik)


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

von Dirk R. (dira)


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....

von Sirsendu R. (Firma: Exide Technologies Büdingen) (xairoy)


Lesenswert?

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