www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Receive Interrupt beim At90can128 wird nicht ausgelöst


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich sitze heute schon den ganzen Tag an folgendem Problem:

Ich versuche mit dem dvk90can- entwicklerboard von Atmel Can-Nachrichten 
zu empfangen. Dabei will ich Interrupts verwenden.
Die relevanten Register sind zum Empfang der can-Nachrichten über eine 
ISR eingerichtet. (siehe auch code unten)
Es werden auch Nachrichten empfangen, das Flag im CANGIT-Register geht 
auf 1.
Trotzdem wird mein Code in der ISR nicht ausgeführt.
Es scheint als wenn das Rrogramm einfach nicht springt.

Es gibt im Forum auch noch weitere Thread mit diesem Problem, jedoch 
wird es am Ende immer mit Polling gelöst, das will ich aber eigentlich 
nicht.

Konnte das problem irgendwie schon behoben werden.? Oder liegt da ein 
Hardwarefehler vor, bzw. gibt es dann einen workaround?

Habt ihr noch irgendwelche Tipps dazu..ich bin langsam echt am 
verzweifeln.



ich füge mal meinen code noch an:
void initCan(void){
  //Initializes all registers, etc#
  cli();
  CANGCON = (1<< SWRES); //reset can interface

  //clear all message objects due to undefined initial values
  uint8_t i;
  for (i=0; i<15; i++)
    {
      CANPAGE = (i<<4);            //select MOb

      CANCDMOB = 0;              //disable MOb
      CANSTMOB = 0;              //clear status
      CANIDT1 = 0;              //clear ID
      CANIDT2 = 0;
      CANIDT3 = 0;
      CANIDT4 = 0;
      CANIDM1 = 0;              //clear mask
      CANIDM2 = 0;
      CANIDM3 = 0;
      CANIDM4 = 0;

      uint8_t j;
      for (j=0; j<8; j++)
        CANMSG = 0;              //clear data
    }


  //bit timings
  CANBT1 = 0x02;
  CANBT2 = 0x04;
  CANBT3 = 0x13;

  CANGCON = (1<<ENASTB); //enable can interface

  //configure MOb0
  CANPAGE = (0<<4);
  CANIDT1 = 0;                //ID
  CANIDT2 = 0;
  CANIDT3 = 0;
  CANIDT4 = 0;
  CANIDM1 = 0;                //get all messages
  CANIDM2 = 0;                //1 = check bit
  CANIDM3 = 0;                //0 = ignore bit
  CANIDM4 = 0;//(1<<IDEMSK);
  CANCDMOB = (1<<CONMOB1) | (1<<IDE);    //reception, ext. ID

  //interrupts
  CANGIE = (1<<ENIT); //enable all interrupts
  CANGIE = (1<<ENRX);  //enable receive interrupts
  CANIE2 = (1<<IEMOB0); //enable interrupt for message object 0

  while(!(CANGSTA & (1<<ENFG))); //wait for can interface to activate

  sei();
}
ISR( CANIT_vect ){  
        canFlags |= (1<<NEWMSG);  
        CANSTMOB &= ~(RXOK);
}

Autor: ein anderer Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim grob drüber gucken fällt mir das auf

  //interrupts
  CANGIE = (1<<ENIT); //enable all interrupts
  CANGIE = (1<<ENRX);  //enable receive interrupts

du überschreibst dir das ENIT bit wieder.

probier mal so:
  CANGIE = (1 << ENIT) | (1 << ENRX) | (1 << ENTX);

Gruß,
Daniel

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe mich nicht weiter beschäftigt damit, aber hier löscht du dein 
enable all interrupts wieder.
 //interrupts
  CANGIE = (1<<ENIT); //enable all interrupts
  CANGIE = (1<<ENRX);  //enable receive interrupts
  CANIE2 = (1<<IEMOB0); //enable interrupt for message object 0

Autor: ein anderer Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich war schneller :-)

Noch ein Tip:
Die Can-Lib von http://www.kreatives-chaos.com ist sehr gut.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
meine Güte, so ein blöder Fehlen..
typischer Fall von: Man sieht den Wald vor lauter Bäumen nicht.

naja... vielen Dank Jungs! :-)

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.