Hallo Zusammen,
ich versuche gerade via Labview mit meinem PIC18F66K80 (mit 18Mhz
externem Oszillator) und dem dazugehörigen CAN-Transceiver MCP2551 zu
kommunizieren. Ich habe eine Übertragungsgeschwindigkeit von 1Mbit/s
eingestellt. Der uC hat die Rolle eines Slave und antwortet nur auf
Befehl des Master. Das funktioniert im Sekundenbereich einwandfrei:
Messdatenanforderung an PIC -> Senden von 12 CAN-Datenframes mit je 8 X
Datenbytes an den Master -> Wieder Messdatenanforderung. Jedoch muss ich
an meinem Master eine Wartezeit von mind. 1300 ms zwischen Senden und
Empfangen einhalten, um alle 12 CAN-Datenframes zu empfangen. Je weiter
ich die Zeit reduziere, desto chaotischer und unvollständiger sind die
Daten. Ich kann sehen das mein uC-Code ca. 700us zum durchlaufen der
FOR-Schleife mit 12 Durckläufen benötigt. Die theoretische
Übertragungszeit für den CAN-Datenframe sind 126 us -> 12 x 126 = ca.
1,5 ms. Zusammen sind das, großzügig gerechnet, 3ms vom Empfang der
Nachricht bis die Daten theoretische auf dem Bus sein müssten. Ich kann
mir einfach nicht erklären woher die Differenz von den theoretischen 3
ms zu den praktischen 1300 ms kommt. Das Datenblatt des MCP hat mir die
Antwort auch nicht verraten.
Hier mein C-Code:
1 | while (!Msg_Rcvd) Msg_Rcvd = CANRead(&Rx_ID, Rx_Data, &Rx_Data_Len, &Can_Rcv_Flags);
|
2 | PORTC = 0xff;
|
3 | if(Rx_ID == IDmodule)
|
4 | {
|
5 | Lcd_Cmd(_LCD_CLEAR); // Clear display
|
6 | Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
|
7 | sprintf(lcd_line1, "ID Module = %u OK", IDmodule); //The pec_error variable is simply set negative if any PEC errors
|
8 | Lcd_Out(1,1, lcd_line1);
|
9 | Delay_ms(1000);
|
10 |
|
11 | if (Rx_Data[0] == 9) //CAN-Init from master
|
12 | {
|
13 | Lcd_Cmd(_LCD_CLEAR); // Clear display
|
14 | Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
|
15 | sprintf(lcd_line1, "ID Module = %u", IDmodule); //The pec_error variable is simply set negative if any PEC errors
|
16 | Lcd_Out(1,1, lcd_line1);
|
17 | Lcd_Out(2,1, "CAN INIT OK");
|
18 |
|
19 | Tx_ID = IDmaster;
|
20 | cell_count[0] = 12; //LTC1 Cellcount
|
21 | cell_count[1] = 5; //LTC2 Cellcount
|
22 | Tx_Data[0]= IDmodule-1;
|
23 | Tx_Data[1]= cell_count[0];
|
24 | Tx_Data[2]= cell_count[1];
|
25 | CANWrite(Tx_ID, Tx_Data,3, Can_Send_Flags);
|
26 | }
|
27 |
|
28 | if (Rx_Data[0] == 10) //Data acquisation from master
|
29 | {
|
30 |
|
31 | for (j=0; j<12; j++)
|
32 | {
|
33 | Tx_ID = IDmaster; //ID receiver
|
34 | Tx_Data[0]= 0x40; //Lowbyte voltage
|
35 | Tx_Data[1]= 0x9C; //Highbyte voltage
|
36 | Tx_Data[2]= 0x45; //Lowbyte temperature
|
37 | Tx_Data[3]= 0x9C; //Highbyte temperature
|
38 | Tx_Data[4]= 0x50; //Lowbyte current
|
39 | Tx_Data[5]= 0x9C; //Highbyte current
|
40 | Tx_Data[6]= j; //Lowbyte cell information (Cellnumber)
|
41 | Tx_Data[7]= 0x0; //Highbyte cell information (Modulenumber)
|
42 |
|
43 | CANWrite(Tx_ID, Tx_Data,8, Can_Send_Flags);
|
44 | Delay_ms(1);
|
45 | PORTC = 0x00;
|
46 | }
|
47 |
|
48 | }
|
49 | if(Rx_Data[0] != 9 && Rx_Data[0]!=10) //Send errorcode
|
50 | {
|
51 | Tx_ID = IDmaster;
|
52 | Tx_Data[0]= 0xAB;
|
53 | CANWrite(Tx_ID, Tx_Data,1, Can_Send_Flags);
|
54 | // PORTC = 0x3;
|
55 | // delay_ms(10000);
|
56 | }
|
57 | }
|
Ich gehe von einer korrekten Beschaltung des MCP's aus, da das
prinzipielle Kommunizieren sauber funktioniert. Jemand hier der
unterstützen kann, ich weiß echt nicht mehr weiter.
VG und DANKE!!!!