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


von Daniel (Gast)


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
}

von ein anderer Daniel (Gast)


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

von Hubert G. (hubertg)


Lesenswert?

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

von ein anderer Daniel (Gast)


Lesenswert?

Ich war schneller :-)

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

von Daniel (Gast)


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! :-)

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.