Autor Tema: Comunicación a alta velocidad del CAN BUS en diferentes PIC  (Leído 2740 veces)

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

Desconectado Pablo León

  • PIC10
  • *
  • Mensajes: 6
Comunicación a alta velocidad del CAN BUS en diferentes PIC
« en: 04 de Marzo de 2020, 15:04:36 »
Hola buenas tardes, tengo un problema con comunicar 3 pic18f4580 por su CAN BUS, necesito que un Pic, digamosle el nodo A, se comunique con otro, el nodo B, a una velocidad de 20 ms y que del mismo modo, el nodo B esté recibiendo de otro pic, nodo C, datos cada 100 ms. Y el nodo B, envía datos cada 100 ms al nodo A y C. Si coloco sólo el nodo A y B no tengo ningún problema pero al añadirle el nodo C, comienza a fallar la recepción de datos en los nodos, no al mismo tiempo pero se van muriendo uno por uno, los nodos siguen enviando sin problema, el fallo es sólo al recibir y es cuando reinicio el nodo que falló y sigue funcionando y se muere otro nodo al recibir datos, SÓLO FALLA PARA RECIBIR, ya que envía normalmente, esto lo revisé con un toggle y un led cada que llega un dato. Primero lo recibía en una sola interrupción:
Código: [Seleccionar]
#int_canrx0 // Interrupción del CAN
void canrx0_int(){

 can_getd(RX_ID,&buffer_datos,RX_LEN,RXSTAT);
 
  if(RX_ID==0x45){ //ID
  }
}

void main(){

   enable_interrupts(int_canrx0);
   enable_interrupts(GLOBAL);
}

Pero después buscando encontré que está #int_canrx0 y #int_canrx1, y para configurarlos pongo:
Código: [Seleccionar]

#int_canrx0 // Interrupción del CAN
void canrx0_int(){

 can_getd(RX_ID,&buffer_datos,RX_LEN,RXSTAT);
 
  if(RX_ID==0x45){ //ID
  }
}

#int_canrx1 // Interrupción del CAN
void canrx1_int(){

 can_getd(RX_ID,&buffer_datos,RX_LEN,RXSTAT);
 
  if(RX_ID==0x40){ //ID
  }
}

void main(){
  can_set_mode(CAN_OP_CONFIG);
  can_set_id(RX0MASK, 0x45, CAN_USE_EXTENDED_ID);  //set mask 0 Donde entiendo aquí va mi ID de una interrupción
  can_set_id(RX0FILTER0, 0x45, CAN_USE_EXTENDED_ID);  //set filter 0 of mask 0
  can_set_id(RX1MASK, 0x40, CAN_USE_EXTENDED_ID);  //set mask 1 y aquí entiendo va mi segunda ID  de la otra dirección
  can_set_id(RX1FILTER2, 0x40, CAN_USE_EXTENDED_ID);  //set filter 0 of mask 1

  can_set_mode(CAN_OP_NORMAL);

   enable_interrupts(int_canrx0);
   enable_interrupts(int_canrx1);
   enable_interrupts(GLOBAL);

}

Entonces mi pregunta sería que cuál me recomiendan ustedes usar o si lo estoy usando bien la segunda opción, ya que en la segunda se me llegan a trabar menos veces los nodos, sólo es al recibir, o alguna recomendación que me digan para recibir datos se los agradecería mucho.

Nota: ya revisé el tema de "Mis experiencias con el BUS CAN" pero no aclara mis dudas, gracias!!!

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7918
Re:Comunicación a alta velocidad del CAN BUS en diferentes PIC
« Respuesta #1 en: 04 de Marzo de 2020, 15:20:22 »
Si usas el mismo codigo en los tres nodos CAN, estas cometiendo un gran error, tendras que cambiarlo en los demás, todos deben tener distintos IDs.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Pablo León

  • PIC10
  • *
  • Mensajes: 6
Re:Comunicación a alta velocidad del CAN BUS en diferentes PIC
« Respuesta #2 en: 04 de Marzo de 2020, 15:34:29 »
no, los tres códigos tienen diferentes ID, te los especifico:

Nodo A):

Código: [Seleccionar]
#int_canrx0 // Interrupción del CAN
void canrx0_int(){

 can_getd(RX_ID,&buffer_datos,RX_LEN,RXSTAT);
 
  if(RX_ID==0x50){ //ID
  }
}

void main(){
can_init();
can_set_mode(CAN_OP_CONFIG);
     can_set_id(RX0MASK, 0x50, CAN_USE_EXTENDED_ID);  //set mask 0
   can_set_id(RX0FILTER0, 0x50, CAN_USE_EXTENDED_ID);  //set filter 0 of mask 0

   enable_interrupts(int_canrx0);
    enable_interrupts(GLOBAL);

while(true){
contador=10;
delay_ms(20);
datos_recibir3[0] = contador;                 
can_putd(0X80,datos_recibir3,1,1,TRUE,false);
}
}

Nodo C):

Código: [Seleccionar]
#int_canrx0 // Interrupción del CAN
void canrx0_int(){

 can_getd(RX_ID,&buffer_datos,RX_LEN,RXSTAT);
 
  if(RX_ID==0x60){ //ID
  }
}

void main(){
can_init();
can_set_mode(CAN_OP_CONFIG);
     can_set_id(RX0MASK, 0x60, CAN_USE_EXTENDED_ID);  //set mask 0
   can_set_id(RX0FILTER0, 0x60, CAN_USE_EXTENDED_ID);  //set filter 0 of mask 0

   enable_interrupts(int_canrx0);
    enable_interrupts(GLOBAL);

while(true){
contador=10;
delay_ms(20);
datos_recibir3[0] = contador;                 
can_putd(0X70,datos_recibir3,1,1,TRUE,false);
}
}

Nodo B):

Código: [Seleccionar]
#int_canrx0 // Interrupción del CAN
void canrx0_int(){

 can_getd(RX_ID,&buffer_datos,RX_LEN,RXSTAT);
 
  if(RX_ID==0x70){ //ID
  }
}

#int_canrx1 // Interrupción del CAN
void canrx1_int(){

 can_getd(RX_ID,&buffer_datos,RX_LEN,RXSTAT);
 
  if(RX_ID==0x80){ //ID
  }
}

void main(){
can_init();
can_set_mode(CAN_OP_CONFIG);
     can_set_id(RX0MASK, 0x70, CAN_USE_EXTENDED_ID);  //set mask 0
   can_set_id(RX0FILTER0, 0x70, CAN_USE_EXTENDED_ID);  //set filter 0 of mask 0
 
   can_set_id(RX1MASK, 0x80, CAN_USE_EXTENDED_ID);  //set mask 1
   can_set_id(RX1FILTER2, 0x80, CAN_USE_EXTENDED_ID);  //set filter 0 of mask 1

   enable_interrupts(int_canrx0);
    enable_interrupts(GLOBAL);

while(true){
contador2=10;
delay_ms(100);
datos_recibir3[0] = contador2;                 
can_putd(0X50,datos_recibir3,1,1,TRUE,false);
can_putd(0X60,datos_recibir3,1,1,TRUE,false);
}
}

Son los de los 3 pic, tienen diferentes ID  pero el problema es al recibir datos, alguna sugerencia que me pudieras dar de favor! gracias