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

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado afelio

  • PIC16
  • ***
  • Mensajes: 130
Re: Mis experiencias con el BUS CAN
« Respuesta #1350 en: 18 de Febrero de 2013, 07:42:55 »
Buenas,

Ya he cambiado como me dijiste lo de los mensajes.

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

La verdad que (como ya se ve no me entero mucho) no se muy bien como manejar los datos, estoy bastante liado en ese aspecto, cuando miro el manual del Bus CAN del fabricante, veo lo siguiente:

messageWord[0] y messageWord[1] está compuesto por:

SID
ID
DLC
...
...
...

Total, que para messageWord[2] y messageWord[3] hay 8 datos de 1 byte para cada uno, por eso puse lo que puse.
Entonces, yo diría que tendría que probar con messageWord[2], en lugar de con messageWord[1], ¿No?

Como veis mis conocimientos de esto es prácticamente nulo, muchas gracias por la ayuda.

Un saludo.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #1351 en: 18 de Febrero de 2013, 08:12:12 »
Revisa bien en el principio del hilo, como se compone una trama del bus CAN.
Eso te clarificara mucho.
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 #1352 en: 18 de Febrero de 2013, 08:50:05 »
Si, va a ser lo mejor, echarle un vistazo para recordarlo y enterarme en condiciones y luego seguir con el código.

¿Crees que puede ser por eso que no entre a la interrupción?No, la verdad que no, será otra cosa..pero primero he de tener claras algunas cosas.
Muchas gracias.
Cuando lo tenga claro y vuelva al código comento como va el CAN.

Un saludo.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #1353 en: 18 de Febrero de 2013, 08:51:45 »
Vas mejorando, al menos ya te vas dando cuenta que quieres ir muy rapido... :D :D :D
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Mil24.

  • PIC12
  • **
  • Mensajes: 78
Re: Mis experiencias con el BUS CAN
« Respuesta #1354 en: 20 de Febrero de 2013, 14:33:43 »
MGLSOFT sos un groso, de corazon eh, y tambien los que aportaron tanta data, como pere y otros, hoy me levante con los ojos colorados de tanto leer anoche, me llevo unas horitas pero me lei todo el post.

Ahora les cuento que tengo unos pic18f4585 y  2585 y los mcp2551 los cuales, como buen ignaro del can, compre pensando que eran una especie de max232 o max485, que podia conectar al serie del micro y listo, pero bue, despues tuve claramente que mandar a pedir los 18fXX8 para poder laburar, lo que tengo que hacer basicamente es comunicarme con un equipo comercial, utilizado para el agro y a perdido el nodo unico que lleva, del cual no se consigue reemplazo, por tanto debo leer los datos interpretarlos y enviar data tambien, eso va a ser lo complicado, para no decir casi imposible, pero bueno, sera una ardua tarea que tiene el respaldo de toda la data de la gente grosa que aporto al tema.

Esta tardecita arranco a armar una placa y le meto mano al trabajito, pero antes queria agradecerles por la informacion aqui presente y seguramente estare molestando con alguna consulta, espero que no, pero no le pidamos peras al olmo, jeje! Un abrazo

JuanPablo.
mas de 5 millones de años de evolucion y aun no entendemos el valor de una vida... seguimos hacia adelante por la inercia de la codicia... ahogandonos en un mar de excesos e incomprension... presos de una dictadura neuronal que nos condena a la absoluta e irremediable extincion...

Desconectado joscar66

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: Mis experiencias con el BUS CAN
« Respuesta #1355 en: 28 de Febrero de 2013, 11:34:00 »
Excelente tema!

De casualidad alguien conoce de un monitor para canopen ?
Esfuércense por ser mejor cada día...
¡Saludos desde COLOMBIA!

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #1356 en: 28 de Febrero de 2013, 11:45:17 »
Depende de a que te refieres con Monitor para CanOpen.

Si lo que buscas es una herramienta Sniffer, si los hay.

Si te refieres a un HMI que se comunique por CanOpen, te dire que no se si hay, ya que si hay un HMI, normalmente esta asociado a un PLC y comunicado a el en otro estandar industrial y el PLC es quien en el maestro de la red CanOpen.
Por esa razon dudo que un HMI se comunique directo a CanOpen, pero no descarto que los haya.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado joscar66

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: Mis experiencias con el BUS CAN
« Respuesta #1357 en: 28 de Febrero de 2013, 12:06:08 »
Hola MGLSOFT

Si, realmente me referia a un sniffer.  He visto algunos, pero no ofrecen la identificacion de tramas canopen. Me gustaria conocer de uno que permina identificar ese tipo de tramas para su analisis.
Esfuércense por ser mejor cada día...
¡Saludos desde COLOMBIA!

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #1358 en: 28 de Febrero de 2013, 13:38:46 »
Yo pude probar este modelo de ADFWEB:



http://www.adfweb.com/Home/products/CAN_BUS_analyzers.asp?frompg=GooHardware

Anda bastante bien y no es muy caro.

Tengo este otro, de DELTA y aunque no da todas las posibilidades del otro y es USB y muy portable:



http://www.delta.com.tw/product/em/control/cm/control_cm_product.asp?pid=3&cid=5&itid=20
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado joscar66

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Esfuércense por ser mejor cada día...
¡Saludos desde COLOMBIA!

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #1360 en: 28 de Febrero de 2013, 22:03:03 »
Parece bueno, el Can Festival es gratuito??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado joscar66

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: Mis experiencias con el BUS CAN
« Respuesta #1361 en: 02 de Marzo de 2013, 14:09:36 »
Si, es gratis pero hasta ahora solo he podido conseguir es el codigo fuente. Debo leer los tutoriales para ver como se hace para poner en ejecucion uno de los ejemplos.
Esfuércense por ser mejor cada día...
¡Saludos desde COLOMBIA!

Desconectado afelio

  • PIC16
  • ***
  • Mensajes: 130
Re: Mis experiencias con el BUS CAN
« Respuesta #1362 en: 04 de Marzo de 2013, 18:10:03 »
Buenas MGLSOFT,

Vuelvo a dar guerra, tras revisarme la documentación del CAN y de enterarme de algunas cosas más, mañana podré ir a provar con el snifer, a ver si entrase en la interrupción del CAN. en modo loopback no he podido hacer nada. No avancé.

pongo aquí el código que voy a probar.

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

Me falta cambiar el modo de operación.
Y en el SW del sniffer cambiar el baudrate.

Mañana os comentaré. Cruzo los dedos.

Un saludo.

Desconectado AioriaG

  • PIC10
  • *
  • Mensajes: 19
Re: Mis experiencias con el BUS CAN
« Respuesta #1363 en: 14 de Marzo de 2013, 13:05:34 »
Hola que tal, soy nuevo en el foro, antes que nada pues felicidades por esta excelente liga sobre el bus "can" mi resumen para describirla es esta expresión "si no esta en esta pagina no esta en internet". Bueno esta pagina en general es mi enciclopedia del "pic", muchas gracias a todos por que aunque nunca había posteado he sido uno de los muchos beneficiados por tantas y tantas veces que me ha sacado de apuros. Volviendo al tema de esta liga tengo un problema con el bus can, apenas estoy comenzando a usarlo, he logrado hacer comunicación can muy simple con CCS pero el problema al que me enfrento es el siguiente, necesito comunicar una tarjeta programada con CCS (por mí) con otra que esta programada en mikroC (por otra persona), el código fuente de la tarjeta transmisora  esta en mikroC y la receptora en CCS, cuando ambas tarjetas las programamos en mikroC o en CCS la comunicación siempre funciona pero cuando se pone una y una entonces la comunicación se queda colgada, la transmisión siempre es a 125kb. Imagino que el problema debe ir con los filtros o mascaras pero no entiendo bien como configurar eso. Les agradecería mucho su ayuda mientras tanto volveré a leer las 69 paginas que llevan sobre el modulo can.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #1364 en: 14 de Marzo de 2013, 23:05:48 »
Hola que tal, soy nuevo en el foro, antes que nada pues felicidades por esta excelente liga sobre el bus "can" mi resumen para describirla es esta expresión "si no esta en esta pagina no esta en internet". Bueno esta pagina en general es mi enciclopedia del "pic", muchas gracias a todos por que aunque nunca había posteado he sido uno de los muchos beneficiados por tantas y tantas veces que me ha sacado de apuros. Volviendo al tema de esta liga tengo un problema con el bus can, apenas estoy comenzando a usarlo, he logrado hacer comunicación can muy simple con CCS pero el problema al que me enfrento es el siguiente, necesito comunicar una tarjeta programada con CCS (por mí) con otra que esta programada en mikroC (por otra persona), el código fuente de la tarjeta transmisora  esta en mikroC y la receptora en CCS, cuando ambas tarjetas las programamos en mikroC o en CCS la comunicación siempre funciona pero cuando se pone una y una entonces la comunicación se queda colgada, la transmisión siempre es a 125kb. Imagino que el problema debe ir con los filtros o mascaras pero no entiendo bien como configurar eso. Les agradecería mucho su ayuda mientras tanto volveré a leer las 69 paginas que llevan sobre el modulo can.

Si pones ambos codigos, creo que podremos ayudarte...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.