mikrocontroller.net

Forum: Compiler & IDEs AT90Can128 Receive Interrupt


Autor: Dirk R. (dira)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sei() ?

Autor: Dirk R. (dira)
Datum:

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

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dirk R. (dira)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Erwin Reuss (er-tronik)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dirk R. (dira)
Datum:

Bewertung
0 lesenswert
nicht 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&f...

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

Autor: Sirsendu Roy (Firma: Exide Technologies Büdingen) (xairoy)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.