Gast
#2599845
Salu zusammen Ich habe ein kleines Problem mit meinem PIC18F46K80 und dem internen CAN-Bus. Der Treiber basiert auf dem von Microchip Maestro. Musste diverse Register ect. anpassen bis es sich kompilieren liess, aber das funktioniert nun. Ich muss dazu sagen, dass dies mein erster Versuch mit CAN ist, also bitte nicht schlagen wenn ich einen riesen Anfängerfehler begehe ;o) Was funktioniert: Ich habe meine HW mit einem CAN Dongle von IXXAT verbunden. Im Terminalprogramm kann ich sehen, dass Daten von meiner HW am PC ankommen. Leider nicht alle. Ich habe auf meiner HW einen Timer Interrupt welcher mir alle 500ms eine Variable setzt. Ist diese Variable gesetzt wird eine andere Variable einfach um 1 inkrementiert und der neue Wert via CAN-Bus an den PC geschickt. Ich kann ja bis zu 8 Datenbytes schicken (von HW an PC). Sende ich nun nur 1 Datenbyte klappt alles recht gut. Die Werte kommen ca. alle 500ms am PC an. Bei 2 Datenbytes habe ich immer wieder mal „Löcher“ in den Daten. Sprich z.b. 0x01,0x02,0x04. Wenn ich 3 oder mehr Datenbytes schicke kommt nichts mehr an, oder dann nur alle paar Sekunden. In diesem Zustand kommt dann auch rel. schnell ein Bus Error (sehe ich im Terminalprogramm (MiniMon), aber leider ist er nicht genauer beschrieben um was für einen Error es sich handelt, jedoch erhöht sich der TXErrorCounter) Ich kann jedoch sagen, dass die HW nicht Bus Off geht, sprich, der Bus läuft immer noch weiter (mit Oszi gemessen) Er hängt sich also nicht komplett auf. Auch habe ich keinen Overflow ect. da leuchten alle LED grün. Wenn ich Daten vom PC an die HW schicke kommen diese ebenfalls an (Interrupt auf HW wird angesprungen und Daten gelesen) Hier habe ich aber dasselbe Phänomen, die ersten Bytes sind korrekt und danach wird’s immer wilder Untersucht und i.O - Die Signale (CAN_H/CAN_L) habe ich mit dem Oszi untersucht, sehen sauber aus - Die Baudrate habe ich auf 125kB gesetzt. Das Terminalprogramm stellt auch 125kB ein wenn ich Auto Baudrate drücke und das ist auch die einzige Einstellung in der Daten ankommen, respektive gesendet werden können. Hier meine Senderoutine, can_send wird alle 500ms auf 1 gesetzt: if(can_send == 1) { TX_Message.Address = MY_ADDRESS_IDENTIFIER;//Set the address to My identifier #ifdef MY_ADDRESS_IS_STANDARD TX_Message.Ext=0;//If the identifier is standard, clear the Ext flag else TX_Message.Ext=1;//If the identifier is extended, set the Ext flag #endif TX_Message.NoOfBytes = 1; TX_Message.Data[0] = TX_Message.Data[0] + 1; TX_Message.Data[1] = 0x02; TX_Message.Data[2] = 0x03; TX_Message.Data[3] = 0x04; TX_Message.Data[4] = 0x05; TX_Message.Data[5] = 0x06; TX_Message.Data[6] = 0x07; TX_Message.Data[7] = 0x08; TX_Message.Remote = 0; //clear the remote flag TX_Message.Priority = 3;//Internal CAN module priority 0-> least priority, 3-> most priority CANPut(TX_Message); //Put the message in the FIFO can_send = 0; } Die eigentliche CANPut könnt ihr der angehängten can.c entnehmen, die ist dort enthalten. Das ist eben diese Datei welche von Maestro erzeugt wurde. Header kann ich noch nachreichen falls die jemand auch anschauen möchte. Ich denke es könnte etwas mit der Baudrate sprich den Phase Segments nicht stimmen. Hier noch meine Einstellungen #define BAUD_RATE_PRESC 21 #define SJW_TIME 1 #define SAMPLES 1 #define PROP_TIME 1 #define PH_SEG_1 8 #define PH_SEG_2 2 Ich habe am PIC einen Quarz mit 16MHz und die interne PLL ist aktiviert, also 64MHz Clock. Hat vielleicht jemand von Euch Erfahrung mit den obengenannten Phänomenen, oder hat jemand bereits diesen Treiber von Microchip erfolgreich zum laufen gebracht? Oder mache ich sonst einen Anfängerfehler? Wäre über jede Hilfe dankbar! Grüessli Candongle