1 | #include <avr/io.h>
|
2 | #include <stdio.h>
|
3 | #include <avr/interrupt.h>
|
4 | #include <avr/pgmspace.h>
|
5 | #include "avr/wdt.h"
|
6 |
|
7 | void LedInit () {
|
8 | DDRE = 0x10;
|
9 | PORTE = 0x00; /*Die Logik der LED ist invertiert 0=AN*/
|
10 | }
|
11 |
|
12 | ISR ( CANIT_vect )
|
13 | {
|
14 | cli(); /* Interrupts abschalten */
|
15 | if (PORTE == 0xFF){PORTE = 0x00;}
|
16 | else {PORTE = 0xFF;};
|
17 |
|
18 |
|
19 | /*Reset the Object for further use - wir wissen dass es objekt 1 war*/
|
20 | CANCDMOB = 0x88; /* Empfang und DLC 8 Byte */
|
21 | CANIDT4 = 0x00; /*RTRTAG, RB0TAG*/
|
22 | CANIDT3 = 0x00; /*Initialized for compatibility Reasons, does nothing*/
|
23 | CANIDT2 = (uint8_t) (0x124 << 5); // 0001 0010 0(100 X XXXX)
|
24 | CANIDT1 = (uint8_t) (0x124 << 3); // (0001 0010 0)100
|
25 | for ( uint8_t i_msg = 0; i_msg < 8 ; i_msg++){
|
26 | CANMSG = 0x00; /* Messageobjekt löschen */
|
27 | /* Der µC inkrementiert INDX automatisch.
|
28 | Im übertragenen Sinn enthält
|
29 | CANMSG[INDX] die Nachrichten.
|
30 | CANPAGE:3 enthält NOT(AINC)*/
|
31 | }
|
32 | sei(); /* Interrrupts einschalten */
|
33 | }
|
34 |
|
35 | void CanInit ()
|
36 | {
|
37 | CANGCON = 0x01 ; /* Reset CAN interface */
|
38 | CANGIE = 0x00; /* CAN interrupts zunächst aus */
|
39 |
|
40 | // Disable Message Objects
|
41 | for ( uint8_t i_mob = 0; i_mob < 15; i_mob++ ) {
|
42 | /* Select the right MOB-Page */
|
43 | CANPAGE = i_mob << 4 ;
|
44 | /* Reset and Disable MOB */
|
45 | CANSTMOB = 0; //Status Register
|
46 | CANCDMOB = 0; //Control Register
|
47 | CANIDT1 = 0x00; //IDT
|
48 | CANIDT2 = 0x00; //IDT
|
49 | CANIDT3 = 0x00; //IDT
|
50 | CANIDT4 = 0x00; //IDT
|
51 | CANIDM4 = 0x00; //Maske
|
52 | CANIDM3 = 0x00; //Maske
|
53 | CANIDM2 = 0x00; //Maske
|
54 | CANIDM1 = 0x00; //Maske
|
55 | for ( uint8_t i_msg = 0; i_msg < 8 ; i_msg++){
|
56 | CANMSG = 0x00; /* Messageobjekt löschen */
|
57 | /* Der µC inkrementiert INDX automatisch.
|
58 | Im übertragenen Sinn enthält
|
59 | CANMSG[INDX] die Nachrichten.
|
60 | CANPAGE:3 enthält NOT(AINC)*/
|
61 | }
|
62 |
|
63 | }
|
64 | /* Initialiesieren von MOB-PAGE 1 auf Empfang*/
|
65 | CANPAGE |= 1 << 4 ; /* MOB-Page 1 auswählen */
|
66 | CANCDMOB = 0x88; /* Empfang und DLC 8 Byte */
|
67 | CANIDT4 = 0x00; /*RTRTAG, RB0TAG*/
|
68 | CANIDT3 = 0x00; /*Initialized for compatibility Reasons, does nothing*/
|
69 | CANIDT2 = (uint8_t) (0x124 << 5); // 0001 0010 0(100 X XXXX)
|
70 | CANIDT1 = (uint8_t) (0x124 << 3); // (0001 0010 0)100
|
71 | CANIDM4 = 0x00; /*RTRMSK, IDEMSK*/
|
72 | CANIDM3 = 0x00; /*Initialized for compatibility Reasons, does nothing*/
|
73 | CANIDM2 = (uint8_t) (0x7F0 << 5); // 0111 1111 0(000 X XXXX)
|
74 | CANIDM1 = (uint8_t) (0x7F0 << 3); // 0(111 1111 0)000
|
75 | /* Resulting Span
|
76 | Mask 0x7F0 111 1111 0000
|
77 | IDT 0x124 001 0010 0100
|
78 | Results in
|
79 | First IDT 001 0010 0000 = 0x120
|
80 | Last IDT 001 0010 1111 = 0x12F */
|
81 |
|
82 | /* General Interrupt Mask*/
|
83 | CANGIE = 0xA0;
|
84 | /* MOB Interrupt Mask*/
|
85 | CANIE2 =0x02;
|
86 | CANIE1 =0x00;
|
87 | /*Set Bit Timing BPR 4, PRS 6, PHS1 3, PHS2 3, SJW 0 */
|
88 | CANBT1 = 0x08;
|
89 | CANBT2 = 0x0C;
|
90 | CANBT3 = 0x37;
|
91 |
|
92 | // Start CAN interface
|
93 |
|
94 | CANGCON = _BV(ENASTB) ;
|
95 |
|
96 | // (Active wait!!) Wait until the CAN interface is ready
|
97 |
|
98 | while ( !( CANGSTA & ( 1 << ENFG ) ) ) ;
|
99 | }
|
100 |
|
101 | void InitDevices(){
|
102 | cli(); /* Interrupts aus */
|
103 | MCUSR = 0;
|
104 | wdt_disable(); //Watchdog abschalten
|
105 | CanInit (); /* CAN initialisieren */
|
106 | LedInit();
|
107 | sei(); /* Interrupts ein */
|
108 | }
|
109 |
|
110 | int main(void)
|
111 | { InitDevices();
|
112 | while(1){}
|
113 | return 0;
|
114 | }
|