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

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

Desconectado robertdanyel

  • PIC10
  • *
  • Mensajes: 26
Re: Mis experiencias con el BUS CAN
« Respuesta #765 en: 30 de Marzo de 2010, 03:19:24 »
Amigos de verdad que no se la razon por la que no compila este codigo, es el nodo1 de una red bus CAN de tres nodos, echenle un vistazo a ver que tal.............

Código: [Seleccionar]
char Can_Init_Flags, Can_Send_Flags, Can_Rcv_Flags;                           // can flags
char Rx_Data_Len;                                                             // received data length in bytes
char RxTx_Data[8];                                                            // can rx/tx data buffer
char Msg_Rcvd;                                                                // reception flag
long Tx_ID, Rx_ID;                                                            // can rx and tx ID
char ErrorCount;
// CANSPI module connections
sbit CanSpi_CS at PORTB.B0;                                                   // Chip select (CS) pin for CANSPI board
sbit CanSpi_CS_Direction at DDRB.B0;                                          // Direction register for CS pin
sbit CanSpi_Rst at PORTB.B2;                                                  // Reset pin for CANSPI board
sbit CanSpi_Rst_Direction at DDRB.B2;                                         // Direction register for Reset pin
// End CANSPI module connections
void main(){
  ADCSRA.B7 = 0;                                                              // Configure analog pins as digital I/O
  PORTB  = 0; DDRB = 255;                                                     // Initialize ports
  PORTD  = 0; DDRD = 255;
  PORTC  = 0; DDRC = 255;

  ErrorCount     = 0;                                                         // Error flag
  Can_Init_Flags = 0; Can_Send_Flags = 0; Can_Rcv_Flags = 0;                  // clear flags

  Can_Send_Flags = _CANSPI_TX_PRIORITY_0 &                                    // form value to be used
                   _CANSPI_TX_XTD_FRAME &                                     // with CANSPIWrite
                   _CANSPI_TX_NO_RTR_FRAME;

  Can_Init_Flags = _CANSPI_CONFIG_SAMPLE_THRICE &                             // form value to be used
                   _CANSPI_CONFIG_PHSEG2_PRG_ON &                             // with CANSPIInit
                   _CANSPI_CONFIG_XTD_MSG &
                   _CANSPI_CONFIG_DBL_BUFFER_ON &
                   _CANSPI_CONFIG_VALID_XTD_MSG;

  SPI1_Init();
  Spi_Rd_Ptr = SPI1_Read;                                                     // initialize SPI module
  CANSPIInitialize(1, 3, 3, 3, 1, Can_Init_Flags);                            // Initialize external CANSPI module
  CANSPISetOperationMode(_CANSPI_MODE_CONFIG, 0xFF);                          // set CONFIGURATION mode
  CANSPISetMask(_CANSPI_MASK_B1, -1, _CANSPI_CONFIG_XTD_MSG);                 // set all mask1 bits to ones
  CANSPISetMask(_CANSPI_MASK_B2, -1, _CANSPI_CONFIG_XTD_MSG);                 // set all mask2 bits to ones

  CANSPISetFilter(_CANSPI_FILTER_B2_F4, 0x12, _CANSPI_CONFIG_XTD_MSG);        // Node1 accepts messages with ID 0x12
  CANSPISetFilter(_CANSPI_FILTER_B1_F1, 0x13, _CANSPI_CONFIG_XTD_MSG);        // Node1 accepts messages with ID 0x13

  CANSPISetOperationMode(_CANSPI_MODE_NORMAL,0xFF);                           // set NORMAL mode
  RxTx_Data[0] = 0x40;                                                        // set initial data to be sent

  Tx_ID = 0x10;                                                               // set transmit ID for CAN message

  CANSPIWrite(Tx_ID, &RxTx_Data, 1, Can_Send_Flags);                          // Node1 sends initial message

  while (1)                                                                   // endless loop
    {
      Msg_Rcvd = CANSPIRead(&Rx_ID, RxTx_Data, &Rx_Data_Len, &Can_Rcv_Flags); // attempt receive message
      if (Msg_Rcvd) {                                                         // if message is received then check id

          if (Rx_ID == 0x12)                                                  // check ID
              PORTC = RxTx_Data[0];                                           // output data at PORTC
          else
              PORTD = RxTx_Data[0];                                           // output data at PORTD
          Delay_ms(50);                                                       // wait for a while between messages
          CANSPIWrite(Tx_ID, RxTx_Data, 1, Can_Send_Flags);                   // send one byte of data
          Tx_ID++;                                                            // switch to next message
          if (Tx_ID > 0x11) Tx_ID = 0x10;                                     // check overflow


        }
      else {                                                                  // an error occured, wait for a while

          ErrorCount++;                                                       // increment error indicator
          Delay_ms(10);                                                       // wait for 10ms
          if (ErrorCount > 10) {                                              // timeout expired - process errors
            ErrorCount = 0;                                                   // reset error counter
            Tx_ID++;                                                          // switch to another message
            if (Tx_ID > 0x11) Tx_ID = 0x10;                                   // check overflow
            CANSPIWrite(Tx_ID, RxTx_Data, 1, Can_Send_Flags);                 // send new message
          }

        }
    }
}
« Última modificación: 30 de Marzo de 2010, 03:35:51 por robertdanyel »

Desconectado robertdanyel

  • PIC10
  • *
  • Mensajes: 26
Re: Mis experiencias con el BUS CAN
« Respuesta #766 en: 30 de Marzo de 2010, 03:22:58 »
Aqui les dejo una imagen adjunta donde se observa el error arrojado por mikroC... La adjunte porque no se aun como pegar imagenes en el foro.  sorry:D
« Última modificación: 30 de Marzo de 2010, 03:33:30 por robertdanyel »

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #767 en: 30 de Marzo de 2010, 08:46:15 »
Segun lo que dice el error que marca el compilador, busca un ; y encuentra CanSpiCS.
Seguramente se quedo un caracter de terminacion de una instruccion en el camino, suele ocurrir al escribir el codigo.

En el codigo que adjuntaste no se encuentra ese error, pero puede ser una libreria o algo asi...

respecto a pegar imagenes en el cuerpo de los mensajes, levanta tus imagenes a imageshack o algun lugar por el estilo y luego con el boton Image de la barra de herramientas pegas el link que te da imageshack dentro de sus corchetes, de esa forma se visualiza tu imagen dentro del mensaje.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado InfectedDAS

  • PIC10
  • *
  • Mensajes: 12
Re: Mis experiencias con el BUS CAN
« Respuesta #768 en: 31 de Marzo de 2010, 12:12:38 »
Hola ayer hice una pequeña conexión, el módulo del sensor de lluvia conectado a la PC del carro y el CAN BUS High y Low puenteados a la placa de prueba..... comenzó a salir algo de humo, no pasó nada grave, después opté por la conexión sencilla del módulo a la placa de prueba y me arrojo algunos resultados interesantes, al menos un ID, el detalle es que no puedo replicar le experimento  :? -el screenshot de esto lo deje en la lap, lo publicaré al rato-

Así que, el siguiente camino a seguir será.... tratar de reproducir lo anterior, si no se puede, bueno tendré que modificar un conectar OBD-II a serial y leer la avalancha de datos.

PD. gracias por el tip para postear imágenes  :D


El módulo de sensor de lluvia


Las placas funcionando  :-/


El cablerio para hacer la conexión.... hace falta un poco de orden  :oops:


....creo que salieron exageradamente grandes
« Última modificación: 31 de Marzo de 2010, 12:15:49 por InfectedDAS »

Desconectado InfectedDAS

  • PIC10
  • *
  • Mensajes: 12
Re: Mis experiencias con el BUS CAN
« Respuesta #769 en: 31 de Marzo de 2010, 23:48:39 »
Aquí esta el posible ID del sensor, solo que no he podio reproducir la respuesta  :( así que dudo el resultado.


Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #770 en: 01 de Abril de 2010, 00:14:53 »
Mira la ventana de abajo, donde te muestra los errores en una ventana Debug, solo son errores....
Minimamente deberas probar 250 Kbps, pero me inclino a que trabaja en menos que 125 Kbps, que creo que no existe en el software del sniffer de Microchip, no es asi??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado InfectedDAS

  • PIC10
  • *
  • Mensajes: 12
Re: Mis experiencias con el BUS CAN
« Respuesta #771 en: 01 de Abril de 2010, 00:21:37 »
así es el mínimo es 150kbit/s
de hecho creo que funciona a 75-85kbit/s según alguna vez leí sobre el CAN BUS B que utiliza el carro, de hecho estoy comenzando a dudar un poco en la forma como lo conecte  :?


Desconectado robertdanyel

  • PIC10
  • *
  • Mensajes: 26
Re: Mis experiencias con el BUS CAN
« Respuesta #772 en: 01 de Abril de 2010, 05:39:45 »
Existe algun simulador de modulo CAN??? especificamente para los dspic o para cualquier otra gama??

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #773 en: 01 de Abril de 2010, 08:01:43 »
Si alguno encuentra un simulador que sirva, por favor postearlo, porque yo no lo encontre, ni siquiera en versiones pagas.. :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado InfectedDAS

  • PIC10
  • *
  • Mensajes: 12
Re: Mis experiencias con el BUS CAN
« Respuesta #774 en: 01 de Abril de 2010, 10:48:23 »
Intentaste con el Proteus??
su nombre completo es Proteus Design Suite, puede simular varios pics y según tengo entendido tiene una librería de dspics, mas no sé si se tenga que descargar aparte, no pierdes nada con revisarlo, ojalá te sirva ;-).

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #775 en: 01 de Abril de 2010, 10:51:16 »
Proteus NO simula CAN, no tiene libreria del MCP2551 ni algun otro Transceiver de CAN.
Como el transceiver resuelve una buena parte del protocolo, es imposible simularlo en Proteus.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado InfectedDAS

  • PIC10
  • *
  • Mensajes: 12
Re: Mis experiencias con el BUS CAN
« Respuesta #776 en: 01 de Abril de 2010, 10:53:33 »
demonios!! con el planeaba simular el PIC18F4580 y el MCP2551 ya teniendo el ID y la trama del módulo  :(

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #777 en: 01 de Abril de 2010, 11:08:53 »
Si encuentran el MCP2551 me avisan, por favor!!
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado robertdanyel

  • PIC10
  • *
  • Mensajes: 26
Re: Mis experiencias con el BUS CAN
« Respuesta #778 en: 09 de Abril de 2010, 18:29:04 »
Les pido su ayuda escribi estos codigos para establecer una red de 2 nodos, cada nodo deberia enviar y recibir, y no tengo transceiver asi que conecte el TX de un DSPIC30f4011 con el RX del otro y viceversa. Pero no me funciona!!!!! no entiendo, que puedo hacer para saber si el pin Tx esta enviando algo ?? porque el mio siempre esta activado. :?

NODO 1

Código: [Seleccionar]
unsigned int aa, aa1, len, aa2,data;
unsigned long id;
unsigned int zr;

void int_INT1 () org 0x34  //Funcion de INT1
{
  PORTFbits.RF4=1;
  delay_ms(3000);
  data=PORTEbits.RE1;
  delay_ms(1000);
  PORTB=data;
  delay_ms(1000);
  id=2;
  CAN1Write(id,data,1,aa1);
  IFS1bits.INT1IF = 0;     //Desahabilitar bandera de INT1
}

void int_INT2 () org 0x42  //Funcion de INT2
{
  PORTFbits.RF5=1;
  delay_ms(3000);
  data=PORTEbits.RE2;
  delay_ms(1000);
  PORTB=data;
  delay_ms(1000);
  id=2;
  CAN1Write(id,data,1,aa1);
  IFS1bits.INT2IF = 0;     //Desahabilitar bandera de INT2
}

void main()
{
  ADPCFG=0xFFFF;           //Configurar E/S como digitales
  TRISB=0;                 //Puert B como salida
  TRISD=3;                 //RD1-RD0 como entradas
  TRISE=0xFF;             //RE como entrada
  TRISF = 0;

  aa  = 0;
  aa1 = 0;
  aa2 = 0;

  INTCON1bits.NSTDIS = 1;  //Deshabilitar interrupciones anidadas
  INTCON2bits.ALTIVT = 0;  //Deshabilitar la AIVT

  INTCON2bits.INT1EP = 1;  //Activacion de INT1 por flanco de bajada
  INTCON2bits.INT2EP = 1;  //Activacion de INT2 por flanco de bajada

  IEC1bits.INT1IE = 1;     //Habilitar INT1
  IFS1bits.INT1IF = 0;     //Desactivar bandera de INT1

  IEC1bits.INT2IE = 1;     //Habilitar INT2
  IFS1bits.INT2IF = 0;     //Desactivar bandera de INT2

  aa1 =   CAN_TX_PRIORITY_0 &                   // Form value to be used
          CAN_TX_XTD_FRAME &                    //  with CANSendMessage
          CAN_TX_NO_RTR_FRAME;

  aa =    CAN_CONFIG_SAMPLE_THRICE &            // Form value to be used
          CAN_CONFIG_PHSEG2_PRG_ON &            //  with CANInitialize
          CAN_CONFIG_STD_MSG &
          CAN_CONFIG_DBL_BUFFER_ON &
          CAN_CONFIG_MATCH_MSG_TYPE &
          CAN_CONFIG_ALL_VALID_MSG &
          CAN_CONFIG_LINE_FILTER_OFF;


  data = 0;
  CAN1Initialize(1,3,3,3,1,aa);   // initialize CAN
  CAN1SetOperationMode(CAN_MODE_CONFIG,0x00);   // set CONFIGURATION mode
  id = -1;
  CAN1SetMask(CAN_MASK_B1,id,CAN_CONFIG_MATCH_MSG_TYPE & CAN_CONFIG_XTD_MSG);   // set all mask1 bits to ones
  CAN1SetMask(CAN_MASK_B2,id,CAN_CONFIG_MATCH_MSG_TYPE & CAN_CONFIG_XTD_MSG);   // set all mask2 bits to ones
  CAN1SetFilter(CAN_FILTER_B1_F1,1,CAN_CONFIG_XTD_MSG);  // set id of filter B1_F1 to 3
  CAN1SetOperationMode(CAN_MODE_NORMAL,0x00);   // set NORMAL mode

  while(1)
  {
    PORTB=0;
    PORTF=0;
    zr = CAN1Read(&id , data , &len, &aa2);
    if ((id == 1) && zr) {
      PORTB = data;                          // output data at portC
      Delay_ms(8000);
            }
  }
}


NODO 2

Código: [Seleccionar]
unsigned int aa, aa1, len, aa2,data;
unsigned long id;
unsigned int zr;

void int_INT1 () org 0x34  //Funcion de INT1
{
  PORTFbits.RF4=1;
  delay_ms(3000);
  data=PORTEbits.RE1;
  delay_ms(1000);
  PORTB=data;
  delay_ms(1000);
  id=1;
  CAN1Write(id,data,1,aa1);
  IFS1bits.INT1IF = 0;     //Desahabilitar bandera de INT1
}

void int_INT2 () org 0x42  //Funcion de INT2
{
  PORTFbits.RF5=1;
  delay_ms(3000);
  data=PORTEbits.RE2;
  delay_ms(1000);
  PORTB=data;
  delay_ms(1000);
  id=1;
  CAN1Write(id,data,1,aa1);
  IFS1bits.INT2IF = 0;
}

void main()
{
  ADPCFG=0xFFFF;           //Configurar E/S como digitales
  TRISB=0;                 //Puert B como salida
  TRISD=3;                 //RD1-RD0 como entradas
  TRISE=0xFF;             //RE como entrada
  TRISF = 0;

  aa  = 0;
  aa1 = 0;
  aa2 = 0;


  INTCON1bits.NSTDIS = 1;  //Deshabilitar interrupciones anidadas
  INTCON2bits.ALTIVT = 0;  //Deshabilitar la AIVT

  INTCON2bits.INT1EP = 1;  //Activacion de INT1 por flanco de bajada
  INTCON2bits.INT2EP = 1;  //Activacion de INT2 por flanco de bajada

  IEC1bits.INT1IE = 1;     //Habilitar INT1
  IFS1bits.INT1IF = 0;     //Desactivar bandera de INT1

  IEC1bits.INT2IE = 1;     //Habilitar INT2
  IFS1bits.INT2IF = 0;     //Desactivar bandera de INT2

  aa1 =   CAN_TX_PRIORITY_0 &                   // Form value to be used
          CAN_TX_XTD_FRAME &                    //  with CANSendMessage
          CAN_TX_NO_RTR_FRAME;

  aa =    CAN_CONFIG_SAMPLE_THRICE &            // Form value to be used
          CAN_CONFIG_PHSEG2_PRG_ON &            //  with CANInitialize
          CAN_CONFIG_STD_MSG &
          CAN_CONFIG_DBL_BUFFER_ON &
          CAN_CONFIG_MATCH_MSG_TYPE &
          CAN_CONFIG_LINE_FILTER_OFF;

  data = 0;
  CAN1Initialize(1,3,3,3,1,aa);   // initialize CAN
  CAN1SetOperationMode(CAN_MODE_CONFIG,0x00);   // set CONFIGURATION mode
  id = -1;
  CAN1SetMask(CAN_MASK_B1,id,CAN_CONFIG_MATCH_MSG_TYPE & CAN_CONFIG_XTD_MSG);   // set all mask1 bits to ones
  CAN1SetMask(CAN_MASK_B2,id,CAN_CONFIG_MATCH_MSG_TYPE & CAN_CONFIG_XTD_MSG);   // set all mask2 bits to ones
  CAN1SetFilter(CAN_FILTER_B2_F3,2,CAN_CONFIG_XTD_MSG);  // set id of filter B1_F1 to 3
  CAN1SetOperationMode(CAN_MODE_NORMAL,0x00);   // set NORMAL mode


  while(1)
  {
    PORTB=0;
    PORTF=0;
    zr = CAN1Read(&id , data , &len, &aa2);
    if ((id == 2) && zr) {
      PORTB = data;                          // output data at portC
      Delay_ms(8000);

     }
  }
}

Estoy usando un oscilador de 10Mhz
« Última modificación: 09 de Abril de 2010, 18:46:31 por robertdanyel »

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #779 en: 09 de Abril de 2010, 18:59:49 »
Citar
Les pido su ayuda escribi estos codigos para establecer una red de 2 nodos, cada nodo deberia enviar y recibir, y no tengo transceiver asi que conecte el TX de un DSPIC30f4011 con el RX del otro y viceversa. Pero no me funciona!!!!! no entiendo, que puedo hacer para saber si el pin Tx esta enviando algo ?? porque el mio siempre esta activado. Confused

La respuesta estaba antes hecha... :mrgreen:

Proteus NO simula CAN, no tiene libreria del MCP2551 ni algun otro Transceiver de CAN.
Como el transceiver resuelve una buena parte del protocolo, es imposible simularlo en Proteus.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.


 

anything