TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Pablo León 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:
#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:
#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!!!
-
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.
-
no, los tres códigos tienen diferentes ID, te los especifico:
Nodo A):
#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):
#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):
#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