Receive Interrupt beim At90can128 wird nicht ausgelöst

Gast #1141042
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:
1
void initCan(void){
2
  //Initializes all registers, etc#
3
  cli();
4
  CANGCON = (1<< SWRES); //reset can interface
5

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

12
      CANCDMOB = 0;              //disable MOb
13
      CANSTMOB = 0;              //clear status
14
      CANIDT1 = 0;              //clear ID
15
      CANIDT2 = 0;
16
      CANIDT3 = 0;
17
      CANIDT4 = 0;
18
      CANIDM1 = 0;              //clear mask
19
      CANIDM2 = 0;
20
      CANIDM3 = 0;
21
      CANIDM4 = 0;
22

23
      uint8_t j;
24
      for (j=0; j<8; j++)
25
        CANMSG = 0;              //clear data
26
    }
27

28

29
  //bit timings
30
  CANBT1 = 0x02;
31
  CANBT2 = 0x04;
32
  CANBT3 = 0x13;
33

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

36
  //configure MOb0
37
  CANPAGE = (0<<4);
38
  CANIDT1 = 0;                //ID
39
  CANIDT2 = 0;
40
  CANIDT3 = 0;
41
  CANIDT4 = 0;
42
  CANIDM1 = 0;                //get all messages
43
  CANIDM2 = 0;                //1 = check bit
44
  CANIDM3 = 0;                //0 = ignore bit
45
  CANIDM4 = 0;//(1<<IDEMSK);
46
  CANCDMOB = (1<<CONMOB1) | (1<<IDE);    //reception, ext. ID
47

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

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

55
  sei();
56
}
57
ISR( CANIT_vect ){  
58
        canFlags |= (1<<NEWMSG);  
59
        CANSTMOB &= ~(RXOK);
60
}
Gast #1141063
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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.