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