CAN-Bus und UART stören

Ich habe einen PIC18F4680 und möchte gleichzeitig eine Schnittstelle mit einem Ecan-Modul und UART herstellen. Ich sende die UART-Nachricht korrekt und lese den CAN-Bus richtig, aber wenn ich versuche, beide Dinge gleichzeitig zu tun, funktioniert der Mikrocontroller nicht mehr. Ist der PIC18F4680 in der Lage, beide Kommunikationen ohne Absturz zu verwalten?

Wenn es nicht möglich ist, mit beiden Kommunikationen gleichzeitig zu arbeiten, welchen Mikrocontroller sollte ich verwenden? Der Programmiercode ist für MicroC erstellt, daher würde ich einen Mikrocontroller bevorzugen, der von MicroC unterstützt wird.

Ich habe versucht, die Firmware-Architektur zu vereinfachen, aber es funktioniert immer noch nicht. Hier ist der Code:

Msg_Rcvd = CANRead(&CAN_RxID, data_rx, &rx_DLC, CAN_Rcv_Flags);
id = CAN_RxID;
dato = data_rx;
UART1_Write('$');
UART1_Write(dato[0]);
UART1_Write(dato[1]);
UART1_Write(dato[2]);
UART1_Write(dato[3]);
UART1_Write(dato[4]);
UART1_Write(dato[5]);
UART1_Write(dato[6]);
UART1_Write(dato[7]);

Ich habe die vom CAN-Bus gelesenen Werte in verschiedenen Variablen gespeichert, um zu vermeiden, dass beide Kommunikationen gleichzeitig verwendet werden, aber es funktioniert nicht. Ich bin mit Interrupts nicht vertraut und weiß nicht genau, wie man sie benutzt. Hat jemand etwas Ähnliches mit Interrupts gemacht?

Ist der pic18F4680 in der Lage, beide Kommunikationen zu verwalten, ohne zu zerquetschen? - Die MCU ist in der Lage. Ihr Code möglicherweise nicht.
@ Eugen: Genau. Ich habe dies ohne Probleme getan. Andererseits denke ich über die Firmware-Architektur nach, bevor ich Code schreibe, und schreibe ihn dann sorgfältig, wobei ich die Hardware-Eigenschaften im Auge behalte.
Wäre hilfreich, wenn Sie etwas mehr Code bereitstellen würden. Wie werden Variablen definiert, wie wird die gezeigte Routine aufgerufen usw. Insbesondere, worauf zeigt dato?

Antworten (1)

Der PIC 18F4680 kann sein UART- und CAN-Modul gleichzeitig ausführen. Wenn diese getrennt arbeiten, aber nicht zusammen, wenn beide stark genutzt werden, wird wahrscheinlich etwas überrannt.

Ihre Firmware-Architektur spielt hier eine große Rolle. Sie haben wahrscheinlich eine überlastete Interrupt-Routine. Ich habe CAN- und UART-I/O zusammen auf mehreren PICs durchgeführt, darunter einige in der 18F-Serie. Ich verwende für solche Dinge ein minimales kooperatives Multitasking-System. Es vereinfacht die Firmware-Architektur erheblich, um eine Aufgabe dem Empfangen von jedem Kommunikationsport zu widmen. Im UART-Fall stopft die Interrupt-Routine empfangene Bytes in einen FIFO, den die UART-Leseaufgabe dann leert, wenn sie dorthin gelangt. Für CAN verwende ich überhaupt keine Interrupts, sondern lasse einfach die CAN-Empfangstask nach dem nächsten verfügbaren CAN-Frame abfragen, verarbeite ihn, gehe dann zurück und mache es erneut. Beachten Sie, dass das Abfragen eines Ereignisses im Multitasking-System eine Schleife ist, die bei jeder Iteration einen Aufruf von TASK_YIELD enthält. Dadurch können andere Tasks den Prozessor verwenden.

Das offensichtlichste, was Sie zuerst tun müssen, ist zu überprüfen, ob Sie den PIC mit seiner maximalen Taktrate betreiben. Machen Sie danach keine dummen Dinge in der Firmware. Dies ist ein Fall, in dem eine gut durchdachte Firmware-Architektur wirklich wichtig ist. Überprüfen Sie insbesondere Ihre Interrupt-Strategie. Machen Sie so wenig wie möglich im Interrupt, um die Latenzzeit des Hardwaredienstes zu reduzieren, und erledigen Sie dann die meisten Dinge im Vordergrundcode. Es kann eine gute Idee sein, die Interrupt-Routine in Assembler zu schreiben. Ich habe Compiler gesehen, die Interrupt-Routinen viel aufgebläht haben.

Wenn Sie Ihre 20 Pfund Code immer noch nicht auf eine vernünftige Größe von 10 Pfund bringen können, dann besorgen Sie sich einen 30-Pfund-PIC. Es gibt zum Beispiel die 33EP-Serie, die ebenfalls sowohl UART- als auch CAN-Module hat. Die schnellere Befehlsausführungsrate ermöglicht mehr Nachlässigkeit, bevor das System bricht. Aber auch hier ist eine gute Codearchitektur die wirkliche Lösung.

Was ist, wenn Macht ein Problem ist? Soll es sozusagen kleine Nickerchen machen?
Wenn die Stromversorgung ein Problem darstellt, versuchen Sie, die Taktung auf das zu reduzieren, was Sie benötigen, und/oder versetzen Sie den Prozessor wann immer möglich in den Ruhemodus.