CAN bus y UART interfieren

2

Tengo un PIC18F4680 y quiero interactuar con un módulo Ecan y UART al mismo tiempo. Estoy enviando el mensaje UART correctamente y leyendo el bus CAN correctamente, pero al intentar hacer ambas cosas al mismo tiempo, el microcontrolador deja de funcionar. ¿El PIC18F4680 puede administrar ambas comunicaciones sin fallar?

Si no es posible trabajar con ambas comunicaciones al mismo tiempo, ¿qué microcontrolador debo usar? El código de programación se realiza para MicroC, por lo que preferiría un microcontrolador que sea compatible con MicroC.

He intentado simplificar la arquitectura del firmware, pero aún así no funciona. Aquí está el código:

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]);

He guardado los valores leídos del bus CAN en diferentes variables para evitar usar ambas comunicaciones al mismo tiempo, pero no funciona. No estoy familiarizado con las interrupciones, y no sé exactamente cómo usarlas. ¿Alguien ha hecho algo similar con interrupciones?

    
pregunta javijavier97

1 respuesta

2

El PIC 18F4680 es capaz de ejecutar su módulo UART y CAN al mismo tiempo. Si estos funcionan por separado, pero no juntos cuando ambos se usan mucho, es probable que algo se esté superando.

Su arquitectura de firmware importa mucho aquí. Probablemente tienes una rutina de interrupción congestionada. Hice CAN y UART I / O juntos en varios PIC, incluidos algunos en la serie 18F. Utilizo un sistema de multitarea cooperativo mínimo para tales cosas. Simplifica enormemente la arquitectura del firmware para dedicar una tarea a recibir desde cada puerto de comunicaciones. En el caso de UART, la rutina de interrupción rellena los bytes recibidos en un FIFO, que la tarea de lectura de UART luego drena a medida que se acerca. Para CAN, no uso interrupciones en absoluto, solo tengo la CAN que recibe la encuesta de tareas para el siguiente marco CAN que está disponible, la procesa, luego regresa y vuelve a hacerlo. Tenga en cuenta que el sondeo de un evento en el sistema multitarea es un bucle que incluye una llamada a TASK_YIELD en cada iteración. Eso permite que otras tareas utilicen el procesador.

Lo primero que debe hacer es verificar que está ejecutando el PIC a su velocidad máxima de reloj. Después de eso, no hagas tonterías en el firmware. Este es un caso donde una arquitectura de firmware bien pensada realmente importa. Particularmente examina tu estrategia de interrupción. Haga lo menos posible en la interrupción para reducir la latencia del servicio de hardware, luego maneje la mayoría de las cosas en el código de primer plano. Escribir la rutina de interrupción en el ensamblador puede ser una buena idea. He visto a los compiladores agregar una gran cantidad de información para interrumpir las rutinas.

Si aún no puede bajar sus 20 libras de código a un tamaño razonable de 10 libras, entonces obtenga un PIC de 30 libras. Hay series 33EP, por ejemplo, que también tienen módulos UART y CAN. La velocidad de ejecución de instrucciones más rápida permite un mayor descuido antes de que el sistema se rompa. Sin embargo, una vez más, una buena arquitectura de código es la solución real.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas