Autor Tema: Mis experiencias con el BUS CAN  (Leído 597579 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado afelio

  • PIC16
  • ***
  • Mensajes: 130
Re: Mis experiencias con el BUS CAN
« Respuesta #1320 en: 13 de Febrero de 2013, 09:35:03 »
Pues me lo descargué hace tiempo (cuando empecé) con el CAN. Y lo utilicé en su momento para ver como funcionaba...pero cuando empecé con la configuración del CAN lo obvie y lo configuré como el del 2515 (pues pensaba que tenía que ser igual).

Un slaudo.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7839
Re: Mis experiencias con el BUS CAN
« Respuesta #1321 en: 13 de Febrero de 2013, 09:57:07 »
No se que calculo hacen (tal vez muestran otra cosa), porque con cristal de 20 MHz en el MCP2515 (segun el diagrama del manual) es muy raro como lo configuran.
Igual ellos pueden usar el valor 3 alli, pero si miras en el calculador, prefieren usar 5 en el segmento 1, para ese Quanta.

Y eso esta basado en el mismo documento de Microchip, de como seleccionar el Baudrate. :D :D :D
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado afelio

  • PIC16
  • ***
  • Mensajes: 130
Re: Mis experiencias con el BUS CAN
« Respuesta #1322 en: 13 de Febrero de 2013, 10:00:29 »
Bueno, primero probare con Loopback que seguro que me da tiempo antes de ir al laboratorio.

Supongo que el funcionamiento será el mismo, quiero decir, las interrupciones, etc....

Os mantendré informados.

Un saludo.

Desconectado afelio

  • PIC16
  • ***
  • Mensajes: 130
Re: Mis experiencias con el BUS CAN
« Respuesta #1323 en: 13 de Febrero de 2013, 15:59:12 »
Otra duda que tengo es sobre la memoria FIFO, el tamaño que hay que asignar a las FIFOS, en este caso, como en el ejemplo de microchip asigno:

BYTE CAN1MessageFifoArea[2 * 8 * 16];

He de suponer que 2 porque son dos fifos, una para Tx y una para Rx.
8 por los octetos.
Y 16??

Un saludo.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7839
Re: Mis experiencias con el BUS CAN
« Respuesta #1324 en: 13 de Febrero de 2013, 16:11:32 »
Cual es la razon por ahora de liarte con los fifo, cuando aun no has podido recepcionar tu primer Hola, mundo!!

Los toreros arrancan con un pequeño ternero, antes de llegar al toro malo, en tu caso deberías ir haciendo tus primeras cruces en esto, paso a paso.
Ya habra tiempo de meterte en ese barro, pero solo cuando las comunicaciones no representen un problema para ti.
El Quijote encaro los molinos de viento y mira como le fue !! :D :D
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado afelio

  • PIC16
  • ***
  • Mensajes: 130
Re: Mis experiencias con el BUS CAN
« Respuesta #1325 en: 13 de Febrero de 2013, 16:25:35 »
Jejejeje, llevas razón, pues porque veo el código que tengo y aprovecho y digo todas las dudas, jejejej.

Pues he estado haciendo pruebas con el LOOPBACK, bueno, intentandolo, y nada, nunca llega a operar como loopback, se me queda en el while

CANSetOperatingMode(CAN1, CAN_NORMAL_OPERATION);
while(CANGetOperatingMode(CAN1) != CAN_LOOPBACK);

Tengo que buscar el post donde el compañero explicaba el loopback.

Un saludo.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7839
Re: Mis experiencias con el BUS CAN
« Respuesta #1326 en: 13 de Febrero de 2013, 16:51:02 »
En la primer instrucción lo estas poniendo en modo Normal, y en la segunda le estas diciendo que espere estar en modo LoopBack !!
Nunca va a ocurrir !!
 :mrgreen: :mrgreen: :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado afelio

  • PIC16
  • ***
  • Mensajes: 130
Re: Mis experiencias con el BUS CAN
« Respuesta #1327 en: 14 de Febrero de 2013, 05:32:30 »
MGLSOFT ayer cuando leí tu respuesta no daba crédito....
A si que decidí que era mejor dejarlo para otro día y que me relajase un poco pues no estaba pensando correctamente, jejejej.

Lo probaré hoy.

Un saludo.

Desconectado afelio

  • PIC16
  • ***
  • Mensajes: 130
Re: Mis experiencias con el BUS CAN
« Respuesta #1328 en: 14 de Febrero de 2013, 16:12:33 »
Corregido el error infantil, le doy a correr el programa en modo debug, pongo puntos de ruptura, apareciendo el cuadradito rojo en el MPLAB X, pero cuando le doy a correr el programa algunos puntos de ruptura aparecen rotos, ¿Por qué?

Segundo, partiendo del modo Loopback, y que si que entra en la función para transmitir,..., no salta la interrupción a la recepción.

 :shock:  :5]

Código: C
  1. #include <p32xxxx.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <plib.h>
  5. //#include <peripheral\system.h>
  6. #include <peripheral\CAN.h>
  7. #include "GenericTypeDefs.h"
  8.  
  9.  
  10.  
  11.  
  12. #define SYSTEM_FREQ 80000000
  13. #define CAN_BUS_SPEED 125000
  14.  
  15. /*Fsys = 80MHz */
  16. /*Fpb = 80MHz  */
  17. #pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, FWDTEN = OFF
  18. #pragma config POSCMOD = HS, FNOSC = PRIPLL, FPBDIV = DIV_1
  19.  
  20. BYTE CAN1MessageFifoArea[2 * 8 * 16];
  21. BOOL isCAN1MsgReceived = FALSE;
  22. CANRxMessageBuffer * messageRx;
  23. CANTxMessageBuffer * messageTx;
  24. int prueba=0;
  25.  
  26.  
  27. void CAN1Init(void);
  28. void CAN1TxSendRTRMsg(void);
  29.  
  30.  
  31. /************************************/
  32. /************************************/
  33. /* Función Principal                */
  34. /************************************/
  35. /************************************/
  36.  
  37. void main (void){
  38.  
  39.     /*Ponemos los puertos Analógicos-Digitales*/
  40.     AD1PCFG = 0xFFFF;
  41.     /*Pin del Led como salida*/
  42.     _TRISF3=0;
  43.     _LATF3 = 0;
  44.     /*Pines del CAN como entrada y Salida Respectivamente.*/
  45.     _TRISF0=1;
  46.     _TRISF1=0;
  47.  
  48.     INTEnableSystemMultiVectoredInt();
  49.  
  50.     /*Configuramos CAN1*/
  51.     CAN1Init();
  52.     prueba=0;
  53.  
  54.  
  55.     while(1){
  56.         if(prueba==0){
  57.             CAN1TxSendRTRMsg();
  58.         }
  59.         //CAN1TxSendRTRMsg();
  60.         //CAN1RxMsgProcess();
  61.         /*Verificamos si Tx = Rx*/
  62.         if ((messageRx->messageWord[2]==0)){
  63.             _LATF3 = 1;
  64.         }
  65.         else
  66.             _LATF3 = 0;
  67.     }
  68. }
  69.  
  70.  
  71.  
  72.  
  73. /***************************/
  74. /***************************/
  75. /*Configuración del Bus CAN*/
  76. /***************************/
  77. /***************************/
  78.  
  79. void CAN1Init(void)
  80. {
  81.     CAN_BIT_CONFIG canBitConfig;
  82.     UINT baudPrescalar;
  83.  
  84.     /*Ponemos el módulo CAN en modo configuración*/
  85.     CANEnableModule(CAN1,TRUE);
  86.     CANSetOperatingMode(CAN1, CAN_CONFIGURATION);
  87.     /*Esperamos hasta que entre en modo configuración*/
  88.     while(CANGetOperatingMode(CAN1) != CAN_CONFIGURATION);
  89.  
  90.     /*Configuramos el reloj del módulo CAN*/
  91.     canBitConfig.phaseSeg2Tq            = CAN_BIT_3TQ;
  92.     canBitConfig.phaseSeg1Tq            = CAN_BIT_5TQ;
  93.     canBitConfig.propagationSegTq       = CAN_BIT_1TQ;
  94.     canBitConfig.phaseSeg2TimeSelect    = TRUE;
  95.     canBitConfig.sample3Time            = FALSE;
  96.     canBitConfig.syncJumpWidth          = CAN_BIT_1TQ;
  97.  
  98.     CANSetSpeed(CAN1,&canBitConfig,SYSTEM_FREQ,CAN_BUS_SPEED);
  99.  
  100.     /*Asignamos el tamaño del Búfer*/
  101.     CANAssignMemoryBuffer(CAN1,CAN1MessageFifoArea,(2 * 8 * 16));
  102.  
  103.     /*Seleccionamos las FIFOS                     */
  104.     /*FIFO0 para Tx                               */
  105.     /*FIFO1 para Rx                               */
  106.     /*FIFO0 con RTR deshabilitado y prioridad baja*/
  107.     /*FIFO1 recepción del mensaje completo*/
  108.     CANConfigureChannelForTx(CAN1, CAN_CHANNEL0, 8, CAN_TX_RTR_DISABLED, CAN_LOW_MEDIUM_PRIORITY);
  109.     CANConfigureChannelForRx(CAN1, CAN_CHANNEL1, 8, CAN_RX_FULL_RECEIVE);
  110.  
  111.     /*Configuramos Filtros y máscaras         */
  112.     /*Filtro0 para aceptar SID 0x201          */
  113.     /*Máscara0 para comparar todos los ID     */
  114.     /*El mensaje debe ser almacenado en FIFO1 */
  115.     CANConfigureFilter      (CAN1, CAN_FILTER0, 0x001, CAN_SID);
  116.     CANConfigureFilterMask  (CAN1, CAN_FILTER_MASK0, 0x7FC, CAN_SID, CAN_FILTER_MASK_IDE_TYPE);
  117.     CANLinkFilterToChannel  (CAN1, CAN_FILTER0, CAN_FILTER_MASK0, CAN_CHANNEL1);
  118.     CANEnableFilter         (CAN1, CAN_FILTER0, TRUE);
  119.  
  120.     /*Habilitamos interrupciones y eventos      */
  121.     /*Habilitamos la recepción si hay un evento */
  122.     /*Habilitamos la interrupción               */
  123.     CANEnableChannelEvent(CAN1, CAN_CHANNEL1, CAN_RX_CHANNEL_NOT_EMPTY, TRUE);
  124.     CANEnableModuleEvent (CAN1, CAN_RX_EVENT, TRUE);
  125.  
  126.     INTSetVectorPriority(INT_CAN_1_VECTOR, INT_PRIORITY_LEVEL_4);
  127.     INTSetVectorSubPriority(INT_CAN_1_VECTOR, INT_SUB_PRIORITY_LEVEL_0);
  128.     INTEnable(INT_CAN1, INT_ENABLED);
  129.     //IEC1SET = 0x04000000;
  130.  
  131.     /*Ponemos el módulo CAN en modo normal */
  132.     CANSetOperatingMode(CAN1, CAN_LOOPBACK);
  133.     while(CANGetOperatingMode(CAN1) != CAN_LOOPBACK);
  134.  
  135.     CANClearModuleEvent(CAN1, CAN_OPERATION_MODE_CHANGE_EVENT);
  136.  
  137. }
  138.  
  139.  
  140.  
  141.  
  142. /***************************************************/
  143. /***************************************************/
  144. /*Función para enviar un mensaje al bus CAN        */
  145. /***************************************************/
  146. /***************************************************/
  147.  
  148. void CAN1TxSendRTRMsg(void)
  149. {
  150.     //CANTxMessageBuffer * messageTx;//Lo saco a variable global
  151.  
  152.     /*Actualizamos el índice en la FIFO0 */
  153.     messageTx = CANGetTxMessageBuffer(CAN1,CAN_CHANNEL0);
  154.  
  155.     /*Mensaje a enviar */
  156.     messageTx->messageWord[0] = 0;
  157.     messageTx->messageWord[1] = 0;
  158.     messageTx->messageWord[2] = 0;
  159.     messageTx->messageWord[3] = 0;
  160.  
  161.     messageTx->msgSID.SID = 0x201;
  162.     messageTx->msgEID.IDE = 0;
  163.     messageTx->msgEID.RTR = 1;
  164.     messageTx->msgEID.DLC = 0;
  165.  
  166.     /*Actualizamos el índice a la nueva posición de la FIFO0*/
  167.     CANUpdateChannel(CAN1,CAN_CHANNEL0);
  168.  
  169.     /*Limpiamos la FIFO0 permitiendo enviar cualquier mensaje de Tx*/
  170.     CANFlushTxChannel(CAN1,CAN_CHANNEL0);
  171. }
  172.  
  173.  
  174.  
  175.  
  176. /***************************************************/
  177. /***************************************************/
  178. /*Manejador de la interrupción del CAN1            */
  179. /*Todos los eventos se habilitan en CanEnableEvent */
  180. /*En este caso un evento en la recepción           */
  181. /***************************************************/
  182. /***************************************************/
  183.  
  184. void __ISR (_CAN_1_VECTOR, ipl4) CAN1Interrupt(void)
  185. {
  186.     /*Verifica si hay un evento en la recepción*/
  187.     if((CANGetModuleEvent(CAN1) & CAN_RX_EVENT) != 0)
  188.     {
  189.         /*Se podría verificar que causó el evento mediante*/
  190.         /*CANGetModuleEvent(), que devuelve el código     */
  191.         /*que representa la prioridad más alta del evento */
  192.         /*pendiente                                       */
  193.                 if(CANGetPendingEventCode(CAN1) == CAN_CHANNEL1_EVENT)
  194.                 {
  195.                     /*Verificamos si se ha producido un evento en la FIFO1    */
  196.                     /*El evento CAN_RX_CHANNEL_NOT_EMPTY es persistente       */
  197.                     /*Se puede leer la FIFO por la interrupción para borrar   */
  198.                     /*la condición de evento o deshabilitar el origen de      */
  199.                     /*de los eventos y hacerlo mediante una función como aquí */
  200.                     CANEnableChannelEvent(CAN1, CAN_CHANNEL1, CAN_RX_CHANNEL_NOT_EMPTY, FALSE);
  201.                     messageRx = (CANRxMessageBuffer *)CANGetRxMessage(CAN1,CAN_CHANNEL1);
  202.                     CANUpdateChannel(CAN1, CAN_CHANNEL1);
  203.                     CANClearModuleEvent (CAN1, CAN_RX_EVENT);
  204.                     prueba=1;
  205.                 }
  206.     }
  207.     /*Se borra la bandera de la interrupción  */
  208.     /*Siempre al final para que si se produce */
  209.     /*otra interrupción no tenga efecto       */
  210.     INTClearFlag(INT_CAN1);
  211. }
  212.  
Desmoralizado me hallo.

Un saludo.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7839
Re: Mis experiencias con el BUS CAN
« Respuesta #1329 en: 14 de Febrero de 2013, 16:24:15 »
No, esa velocidad esta bien, pero tienes mal el segmento Propagation Delay, con un Time Quante de 3 cuando debiera ser de 1...


Citar

    /*Configuramos el reloj del módulo CAN*/
    canBitConfig.phaseSeg2Tq            = CAN_BIT_3TQ;
    canBitConfig.phaseSeg1Tq            = CAN_BIT_3TQ;
    canBitConfig.propagationSegTq       = CAN_BIT_3TQ;    <-------------------<<  Aqui esta tu problema !!  Ponle solo uno
    canBitConfig.phaseSeg2TimeSelect    = TRUE;
    canBitConfig.sample3Time            = FALSE;
    canBitConfig.syncJumpWidth          = CAN_BIT_1TQ;

Como regla de oro:
La suma de Time Quanta de los cuatro valores debe dar igual al prescripto como Number of Time Quanta in one bit

Hasta aquí habíamos llegado antes...

Pero aquí haces otra cosa distinta, Porque ??


Citar
canBitConfig.phaseSeg2Tq            = CAN_BIT_3TQ;
    canBitConfig.phaseSeg1Tq            = CAN_BIT_5TQ;
    canBitConfig.propagationSegTq       = CAN_BIT_1TQ;
    canBitConfig.phaseSeg2TimeSelect    = TRUE;
    canBitConfig.sample3Time            = FALSE;
    canBitConfig.syncJumpWidth          = CAN_BIT_1TQ;

No entiendo porque llegas a este valor de 5.
Es por mi comentario sobre el analizador CAN ??
Ese comentario era valido solo para el analizador CAN, no para el PIC !!
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado afelio

  • PIC16
  • ***
  • Mensajes: 130
Re: Mis experiencias con el BUS CAN
« Respuesta #1330 en: 14 de Febrero de 2013, 16:30:56 »
Comooorrr?? :oops: :oops: :oops:

Dejame que me apunte en la agenda pedirme vacaciones, jejejej

OK, pues entonces tenía bien el bit time que puse al principio, no??

Un saludo.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7839
Re: Mis experiencias con el BUS CAN
« Respuesta #1331 en: 14 de Febrero de 2013, 16:37:20 »
Ponle este:

Citar

    canBitConfig.phaseSeg2Tq                 = CAN_BIT_3TQ;
    canBitConfig.phaseSeg1Tq                 = CAN_BIT_3TQ;
    canBitConfig.propagationSegTq          = CAN_BIT_1TQ;
    canBitConfig.phaseSeg2TimeSelect    = TRUE;
    canBitConfig.sample3Time                  = FALSE;
    canBitConfig.syncJumpWidth              = CAN_BIT_1TQ;

 :mrgreen: :mrgreen:  Es el dia de los enamorados !!
Eso te pasa!!
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado afelio

  • PIC16
  • ***
  • Mensajes: 130
Re: Mis experiencias con el BUS CAN
« Respuesta #1332 en: 14 de Febrero de 2013, 16:56:18 »
Bueno ya está cambiado:

tras hacer el while la primera vez del main:

Código: C
  1. while(1){
  2.         if(prueba==0){
  3.             CAN1TxSendRTRMsg();
  4.         }
  5.         //CAN1TxSendRTRMsg();
  6.         //CAN1RxMsgProcess();
  7.         /*Verificamos si Tx = Rx*/
  8.         if ((messageRx->messageWord[2]==0)){
  9.             _LATF3 = 1;
  10.         }
  11.         else
  12.             _LATF3 = 0;
  13.     }
  14.  
  15.  
Se para el debug indicando Target Halted, y no se donde. Pues no debería parar creo yo.
Aún así...tampoco atiende a la interrupción.

Tengo que decir, que en el HW no  uno a la salida del Transceiver MCP2551 Rx - Tx de ninguna manera, (ni a la entrada)...pues en el manual dice que no utiliza el bus.

Un saludo.

Desconectado afelio

  • PIC16
  • ***
  • Mensajes: 130
Re: Mis experiencias con el BUS CAN
« Respuesta #1333 en: 14 de Febrero de 2013, 17:08:46 »
Tampoco entiendo por qué nada más iniciar el debugg el punto de ruptura de la interrupción...entra en un estado "extraño"



Sin ni siguiera llegar correr el debugg

En cambio otros (por los que paso a paso termina llegando a él) tienen el formato correcto:



Un saludo.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7839
Re: Mis experiencias con el BUS CAN
« Respuesta #1334 en: 14 de Febrero de 2013, 17:15:44 »
El primero es un breakpoint roto.
Has comentado una linea que tenia un breakpoint, sacalo y listo.

Por lo demas, deberias ir corriendo los breakpoints de lugar hasta ver que ejecuta y que no.

Si pasa la linea del envio del mensaje, barbaro, sino hay un problema.

Algo que puede estar pasandote es que habilitas los filtros y mascaras, y si no estan preparados para recibir el ID del mensaje enviado, este no pasara, por lo tanto no habra interrupcion tampoco.
Te diria que los dejes con valores 0 a todos, asi eliminas esa posibilidad (lo vi pero no lo comente antes, para no hacerte mas lio del que ya tenias)...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.


 

anything