Autor Tema: Problema Can 3 Pic  (Leído 3094 veces)

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

Desconectado rasengan04

  • PIC10
  • *
  • Mensajes: 11
Problema Can 3 Pic
« en: 03 de Marzo de 2020, 20:02:16 »
Buen dia:
Tengo un problema al usar el Protocolo Can , cuando trato de enviar simultáneamente  entre 3 pics se congela la comunicación en uno de los buffer , uso filtros para especificar cada una de la interrupciones
Código: [Seleccionar]

#include <18F4580.h>
#device ADC=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

#use delay(crystal=20000000)
#include <can-18xxx8.c>
int Buffer_Datos_Out_Lcd[8],BUFFER_DATOS_IN[8];
INT32 Rx_Id=0,Dir_Tarjeta_Pruebas=0x35;
Int flag=0;
INT RX_LEN,RXSTAT;
#ZERO_RAM
#int_canrx0
void canrx0_int ( ) {

   can_getd(RX_ID,BUFFER_DATOS_IN,RX_LEN,RXSTAT);
    Output_toggle(Pin_A5);

}
#int_canrx1
void canrx1_int ( ) {

  can_getd(RX_ID,BUFFER_DATOS_IN,RX_LEN,RXSTAT);
  Output_toggle(Pin_D0);
}
#int_timer1
void timer_1(){
set_timer1(55422); ////16ms
      flag=1;
}
void main()
{
 can_init();

   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);      //104 ms overflow
   set_timer1(15120);//16ms
   can_set_mode(CAN_OP_CONFIG);
   can_set_id(RX0MASK, 0x51, CAN_USE_EXTENDED_ID);  //set mask 0
   can_set_id(RX0FILTER0, 0x51, CAN_USE_EXTENDED_ID);  //set filter 0 of mask 0
   can_set_id(RX1MASK, 0x40, CAN_USE_EXTENDED_ID);  //set mask 1
   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(int_timer1);
    enable_interrupts(GLOBAL);
   while(TRUE)
   {
      if(flag==1){
         flag=0; 
      Can_Putd(Dir_Tarjeta_Pruebas,Buffer_Datos_Out_Lcd,8,1,TRUE,TRUE);
      }       
   }
}

el código como el pic son los mismos para los tres dispositivos conectados;
con el código lo que hago es cuando recibe de una dirección especifica se activa el respectivo led cada dispositivo recibe datos de los otros 2 el problema viene cuando después de un tiempo de recibir uno de los los dispositivos  pierde comunicación con un dispositivo pero la mantiene con otro, y así sucede  después de un rato con otro pic;
no se que podría ser.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7918
Re:Problema Can 3 Pic
« Respuesta #1 en: 03 de Marzo de 2020, 22:44:28 »
Hola, buenas tardes.

No entiendo que deseas hacer, ya que deberías poner el código de los otros pics también.

Algo que veo aquí es que no pones un ID al cual le pides el dato o datos, en ese caso si los otros no tienen un ID van a contestar juntos y ahi es donde tienes el problema de buffer, porque en realidad estarías recibiendo dos o tres mensajes al mismo tiempo, ya que los otros micros tienen el mismo ID.

Si tienes dudas en como funciona el protocolo CAN, puedes ir al hilo de CAN donde podras consultar.
En el inicio hay un menu y podras saltar bastante, recomiendo leer desde el principio asi no te pierdes ni tendras preguntas que ya fueron contestadas a lo largo del hilo.

Aqui estaremos para apoyarte.

Saludos
« Última modificación: 03 de Marzo de 2020, 23:29:00 por MGLSOFT »
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:Problema Can 3 Pic
« Respuesta #2 en: 04 de Marzo de 2020, 15:12:47 »
Yo tengo el mismo problema  :shock: :shock: :shock:, ya pudiste resolverlo?

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7918
Re:Problema Can 3 Pic
« Respuesta #3 en: 04 de Marzo de 2020, 15:17:25 »
Los diferentes nodos en una red CAN deben tener distintos IDs, al usar el mismo código usan el mismo ID en todos, de allí viene su problema, corrijanlo y veran que les funciona.
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:Problema Can 3 Pic
« Respuesta #4 en: 04 de Marzo de 2020, 15:19:21 »
Eso lo entiendo, si pudieras ver mi tema por favor, lo tengo un poco más detallado, gracias

Desconectado rasengan04

  • PIC10
  • *
  • Mensajes: 11
Re:Problema Can 3 Pic
« Respuesta #5 en: 04 de Marzo de 2020, 15:37:54 »
Los diferentes nodos en una red CAN deben tener distintos IDs, al usar el mismo código usan el mismo ID en todos, de allí viene su problema, corrijanlo y veran que les funciona.
es el mismo codigo para los tres lo que cambio es a que dirección envía y los filtros de recepción

Código: [Seleccionar]
#include <18F4580.h>
#device ADC=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST   
#use delay(crystal=20000000)
#include <can-18xxx8.c>
INT32 Dir_Tarjeta_Pruebas=0x40; ///especifico a que tarjeta va
int8 Buffer_Datos_Out_Lcd[8],BUFFER_DATOS_IN[8],BUFFER_DATOS_IN2[8];
#int_canrx0
void canrx0_int ( ) {

   can_getd(RX_ID,BUFFER_DATOS_IN,RX_LEN,RXSTAT);

    Output_toggle(Pin_A5);

}
#int_canrx1
void canrx1_int ( ) {
  can_getd(RX_ID,BUFFER_DATOS_IN2,RX_LEN,RXSTAT);
  Output_toggle(Pin_D0);
}

void main()
{
 can_init();

   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);      //104 ms overflow
   set_timer1(15120);//16ms ///para emular la velocidad de envio de datos
       can_set_mode(CAN_OP_CONFIG);
   can_set_id(RX0MASK, 0x55, CAN_USE_EXTENDED_ID);  //set mask 0
   can_set_id(RX0FILTER0, 0x55, CAN_USE_EXTENDED_ID);  //set filter 0 of mask 0
   can_set_id(RX1MASK, 0x50, CAN_USE_EXTENDED_ID);  //set mask 1
   can_set_id(RX1FILTER2, 0x50, 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(int_timer1);
    enable_interrupts(GLOBAL);
   while(TRUE)
   {

      if(flag==1){
         flag=0; 
         Buffer_Datos_Out_Lcd[0]++;
      Can_Putd(Dir_Tarjeta_Pruebas,Buffer_Datos_Out_Lcd,8,1,TRUE,TRUE);
      }
}
}

es para el pic 1


Código: [Seleccionar]
INT32 Dir_Tarjeta_Pruebas=0x50; ///especifico a que tarjeta va
int8 Buffer_Datos_Out_Lcd[8],BUFFER_DATOS_IN[8],BUFFER_DATOS_IN2[8];
#int_canrx0
void canrx0_int ( ) {

   can_getd(RX_ID,BUFFER_DATOS_IN,RX_LEN,RXSTAT);
   // if(RX_ID==0x55){
    Output_toggle(Pin_A5);

}
#int_canrx1
void canrx1_int ( ) {
  can_getd(RX_ID,BUFFER_DATOS_IN2,RX_LEN,RXSTAT);
  Output_toggle(Pin_D0);
}

void main()
{
 can_init();

   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);      //104 ms overflow
   set_timer1(15120);//16ms ///para emular la velocidad de envio de datos
       can_set_mode(CAN_OP_CONFIG);
   can_set_id(RX0MASK, 0x65, CAN_USE_EXTENDED_ID);  //set mask 0
   can_set_id(RX0FILTER0, 0x65, CAN_USE_EXTENDED_ID);  //set filter 0 of mask 0
   can_set_id(RX1MASK, 0x60, CAN_USE_EXTENDED_ID);  //set mask 1
   can_set_id(RX1FILTER2, 0x60, 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(int_timer1);
    enable_interrupts(GLOBAL);
   while(TRUE)
   {

      if(flag==1){
         flag=0; 
         Buffer_Datos_Out_Lcd[0]++;
      Can_Putd(Dir_Tarjeta_Pruebas,Buffer_Datos_Out_Lcd,8,1,TRUE,TRUE);
      }
}
}

para el pic 2

Código: [Seleccionar]

INT32 Dir_Tarjeta_Pruebas=0x60; ///especifico a que tarjeta va
int8 Buffer_Datos_Out_Lcd[8],BUFFER_DATOS_IN[8],BUFFER_DATOS_IN2[8];
#int_canrx0
void canrx0_int ( ) {

   can_getd(RX_ID,BUFFER_DATOS_IN,RX_LEN,RXSTAT);
    Output_toggle(Pin_A5);

}
#int_canrx1
void canrx1_int ( ) {
  can_getd(RX_ID,BUFFER_DATOS_IN2,RX_LEN,RXSTAT);
  Output_toggle(Pin_D0);
}

void main()
{
 can_init();

   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);      //104 ms overflow
   set_timer1(15120);//16ms ///para emular la velocidad de envio de datos
       can_set_mode(CAN_OP_CONFIG);
   can_set_id(RX0MASK, 0x45, CAN_USE_EXTENDED_ID);  //set mask 0
   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
   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(int_timer1);
    enable_interrupts(GLOBAL);
   while(TRUE)
   {

      if(flag==1){
         flag=0; 
         Buffer_Datos_Out_Lcd[0]++;
      Can_Putd(Dir_Tarjeta_Pruebas,Buffer_Datos_Out_Lcd,8,1,TRUE,TRUE);
      }
}
}
En si la estructura es la misma solo cambiamos la dirección de envió y los filtros de recepción y otra duda que tengo es si puedo tener 2 instrucciones Can_putd con diferente ID para que un pic envié específicamente a cada pic??
Y segun entiendo con los filtros ya no necesito comparar con un if(RX_ID==0x15) ya que solo activa la interrupción si el mensaje tiene esa ID.
Gracias por tu atención
« Última modificación: 04 de Marzo de 2020, 15:47:05 por rasengan04 »

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7918
Re:Problema Can 3 Pic
« Respuesta #6 en: 05 de Marzo de 2020, 09:34:15 »
Ahora si, como lo habías planteado, interpretaba que tenias 3 id iguales.

Hasta no conocer bien el manejo de filtros, sugiero que utilices el filtrado por software.
Si usas mal los filtros y mascaras, posiblemente se descarte el mensaje antes de ocurrir la interrupción y no tengas mensajes siquiera.

Prueba inicialmente hacer el filtro en software por la ID de respuesta.

Y respecto a enviar "preguntas" a distintos IDs, te ayudara a conocer como funciona el BUS.

En síntesis, te aconsejo aprender desde abajo hacia arriba, luego incorporar complejidad a la aplicación.

Saludos
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado rasengan04

  • PIC10
  • *
  • Mensajes: 11
Re:Problema Can 3 Pic
« Respuesta #7 en: 05 de Marzo de 2020, 15:42:47 »
Ahora si, como lo habías planteado, interpretaba que tenias 3 id iguales.

Hasta no conocer bien el manejo de filtros, sugiero que utilices el filtrado por software.
Si usas mal los filtros y mascaras, posiblemente se descarte el mensaje antes de ocurrir la interrupción y no tengas mensajes siquiera.

Prueba inicialmente hacer el filtro en software por la ID de respuesta.

Y respecto a enviar "preguntas" a distintos IDs, te ayudara a conocer como funciona el BUS.

En síntesis, te aconsejo aprender desde abajo hacia arriba, luego incorporar complejidad a la aplicación.

Saludos

Me podrías recomendar un Libro para poder aprender mas sobre CAN, lo que pasa es que si necesito filtrar los mensajes para que el pic no se interrumpa cada rato.
Gracias

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7918
Re:Problema Can 3 Pic
« Respuesta #8 en: 05 de Marzo de 2020, 18:02:19 »
Hola, si rezas todas las noches, se acordaran de ti, jaja!!   :D :D ((:-)) ((:-))
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.


 

anything