1 | // Definitionen MOb-Selektierung
|
2 | #define MO_1 1
|
3 |
|
4 | // Definitionen MOb-Konfiguration
|
5 | #define RX 2
|
6 | #define DLC_1 1
|
7 | #define NO_IDE 0
|
8 | #define NO_Reply 0
|
9 |
|
10 | const char info1[]PROGMEM = "CAN_Receive_Data";
|
11 | const char info2[]PROGMEM = "20kBis/s, ID: 123h";
|
12 | //////////////////////////////////////////////////////////
|
13 | // Funktionen für CAN Initialisierung
|
14 | //////////////////////////////////////////////////////////
|
15 |
|
16 | // Löschen der Konfigurationen von MOb0 ... MOb14
|
17 | void CanClearMOB(void)
|
18 | {
|
19 | unsigned char i, j;
|
20 | for(i=0;i<=14;i++)
|
21 | {
|
22 | CANPAGE = (i << 4); // XXXX0000 -> Autoincrement aktiviert
|
23 | CANSTMOB = 0;
|
24 | CANCDMOB = 0;
|
25 | CANIDT4 = 0;
|
26 | CANIDT3 = 0;
|
27 | CANIDT2 = 0;
|
28 | CANIDT1 = 0;
|
29 | CANIDM4 = 0;
|
30 | CANIDM3 = 0;
|
31 | CANIDM2 = 0;
|
32 | CANIDM1 = 0;
|
33 | for(j=0;j<=8;j++)
|
34 | {
|
35 | CANMSG=0; //Autoincrement aktiv
|
36 | }
|
37 | }
|
38 | }
|
39 |
|
40 | ///////////////////////////////////
|
41 | // CAN-Initialisierungen //
|
42 | ///////////////////////////////////
|
43 |
|
44 | void CanInit(void)
|
45 | {
|
46 | CanClearMOB(); // Alle MOb's löschen
|
47 |
|
48 | // Einstellung der Baudrate 20kBit/s
|
49 | CANBT1 = 0x62; // Teiler = 49
|
50 | CANBT2 = 0x0C; // PRS = 7 TQs, PHS1= 7 TQs, PHS2= 7 TQs
|
51 | CANBT3 = 0x36; // ==> Sample Point bei 75 %
|
52 |
|
53 | // Initialisierung MOb1 (Sender)
|
54 | CANPAGE = (MO_1 << 4) | (AINC << 1); // Selektierung von MOb1
|
55 | CANCDMOB|=1; // 1 Datenbyte empfangen
|
56 | CANCDMOB|=NO_IDE<<4; // Botschaft als Standard Frame
|
57 | CANCDMOB|=NO_Reply<<5;
|
58 | CANCDMOB|=RX<<6; // Empfangsmodus einstellen
|
59 |
|
60 | // Initialisierung des Identifier (ID=0x123)
|
61 | CANIDT1 = 0x123 >>3; // Zuweisung ID-Bit 10 - 3
|
62 | CANIDT2 = 0x123 <<5; // Zuweisung ID-Bit 2 - 0
|
63 |
|
64 | // CAN Controller aktivieren
|
65 | CANGCON |= 0X02;
|
66 |
|
67 | //CANMSG =0x35; // Nutzdatenbyte 35h eintragen
|
68 | }
|
69 |
|
70 | // Hauptprogramm
|
71 | int main(void)
|
72 | {
|
73 | char display_buffer[21];
|
74 | unsigned int i=0;
|
75 | unsigned char data=0;
|
76 | lcd_init( LCD_DISP_ON );
|
77 | G_DISPLAY = (1<<BELEUCHTUNG);
|
78 | lcd_puts_p(info1); //Ausgabe von "ROM-Texten" Überschrift
|
79 | lcd_gotoxy(0,1);
|
80 | lcd_puts_p(info2);
|
81 | CanInit(); // Konfiguration und Sendung der Botschaft
|
82 |
|
83 | while(1){
|
84 | CANPAGE = (MO_1 << 4); // Selektierung von MOb1
|
85 | if(CANSTMOB & 0X20){ // nur wenn Botschaft vorhanden
|
86 | i++;
|
87 | lcd_gotoxy(0,2); // Anzahl der empfangenen Botschaften
|
88 | sprintf(display_buffer,"Anz: %5d",i);
|
89 | lcd_puts(display_buffer);
|
90 | data=CANMSG;
|
91 | lcd_gotoxy(0,3);
|
92 | sprintf(display_buffer,"Data: %02X ",data); // Botschaftsinhalt
|
93 | lcd_puts(display_buffer);
|
94 | CANSTMOB=0X00; //MO-Status löschen
|
95 | CANCDMOB|=RX<<6; // Empfangsmodus einstellen
|
96 |
|
97 | }
|
98 | else{
|
99 | if(i==0){
|
100 | lcd_gotoxy(0,3);
|
101 | lcd_puts("Keine Daten auf BUS!");
|
102 | }
|
103 | }
|
104 | }
|
105 | return 0;
|
106 | }
|