Autor Tema: Iniciandome con el Bus CAN  (Leído 7878 veces)

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

Desconectado microcarsil

  • PIC10
  • *
  • Mensajes: 44
Iniciandome con el Bus CAN
« en: 19 de Diciembre de 2006, 18:19:55 »

Hola amigos pues eso que quiero iniciarme con ese protocolo de comunicación, estuve bajando información acerca de dicho Bus, más o menos me ha quedado claro lo que tengo que hacer para poder implementarlo tanto a nivel hardware como software.
En la parte de software estoy utilizando el copilador ccs especificante el ejemplo ExCan.c y lo que trato de hacer es mandar datos de 8 bits del nodo B al nodo A, basándome en el mismo ejemplo para cada placa.


Código: [Seleccionar]
Nodo A:

#include <18F248.h>
#fuses HS,NOPROTECT,NOLVP,NOWDT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#include <can-18xxx8.c>

void main()
{
   struct rx_stat rxstat;
   int32 rx_id;
   int in_data[8];
   int rx_len;
   
   int i;

   for (i=0;i<8;i++)
   {
      in_data[i]=0;
   }

   printf("\r\n\r\nCCS CAN EXAMPLE\r\n");

   can_init();
   
  // can_set_mode(CAN_OP_LOOPBACK); // Added this line

   printf("\r\nRunning...");

   while(TRUE)
   {

      if ( can_kbhit() )   //if data is waiting in buffer...
      {
         output_high(PIN_B7);
         if(can_getd(rx_id, &in_data[0], rx_len, rxstat))
         { //...then get data from buffer
            printf("\r\nGOT: BUFF=%U ID=%LU LEN=%U OVF=%U ", rxstat.buffer, rx_id, rx_len, rxstat.err_ovfl);
            printf("FILT=%U RTR=%U EXT=%U INV=%U", rxstat.filthit, rxstat.rtr, rxstat.ext, rxstat.inv);
            printf("\r\n    DATA = ");
            for (i=0;i<rx_len;i++)
            {
               printf("%X ",in_data[i]);
            }
            printf("\r\n");
         }
         else
         {
            printf("\r\nFAIL on GETD\r\n");
         }

      }
   }
}


Nodo B:

#include <18F248.h>
#fuses HS,NOPROTECT,NOLVP,NOWDT
#use delay(clock=20000000)

#include <can-18xxx8.c>

int16 ms;

#int_timer2
void isr_timer2(void) {
   ms++; //keep a running timer that increments every milli-second
}

void main()
{
   
//send a request (tx_rtr=1) for 8 bytes of data (tx_len=8) from id 24 (tx_id=24)
   int out_data[8];
   int32 tx_id=24;
   int1 tx_rtr=1; //1
   int1 tx_ext=0; //0
   int tx_len=8;
   int tx_pri=3;

   int i;

   for (i=0;i<8;i++)
   {
      out_data[i]=8;
   }
 
   setup_timer_2(T2_DIV_BY_4,79,16);   //setup up timer2 to interrupt every 1ms if using 20Mhz clock

   can_init();

   enable_interrupts(INT_TIMER2);   //enable timer2 interrupt
   enable_interrupts(GLOBAL);       //enable all interrupts (else timer2 wont happen)


   while(TRUE)
   {
      //every two seconds, send new data if transmit buffer is empty
      if ( can_tbe() && (ms > 2000))
      {
         ms=0;
         output_high(PIN_B7);
         delay_ms(200);
          output_low(PIN_B7);
         
         i=can_putd(tx_id, out_data, tx_len,tx_pri,tx_ext,tx_rtr); //put data on transmit buffer
      }
   }
}



En la parte de hardware utilizo el PIC18F248 que tiene implementado el controlador CAN y como transceiver utilizo el mcp2551 de microchip, el esquema de conexión de ambos nodos es el siguiente:





El circuito MCP2551 es el siguiente:





Pues bien he implementado todo lo anterior y no funciona, no se si alguien con alguna experiencia en el bus CAN me pueda ayudar, ya que llevo un tiempo considerable y no lo he hecho andar, yo considero que el problema viene mas en la parte de hardware, no se si necesita otra cosa el bus para que funcione.


Bueno que tengan buen dia y FELICES FIESTAS    :-/



Microcarsil

Desconectado pepepaco82

  • PIC10
  • *
  • Mensajes: 21
Re: Iniciandome con el Bus CAN
« Respuesta #1 en: 19 de Diciembre de 2006, 23:48:01 »
Buenas

YO tb estoy iniciando un proyecto que incorpore CAN bus, pero estoy mucho mas verde que tu, todavia estoy comenzando y no te puedo ayudar.

Me gustaria usar el picc de CCS para programar los pic si me puedes pasar el link donde esta el ejemplo ExCan.c u otros links para la programacion en C te lo agradeceria.

Salu2 y suerte
Mientras tu descansas, tu enemigo se entrena

Desconectado microcarsil

  • PIC10
  • *
  • Mensajes: 44
Re: Iniciandome con el Bus CAN
« Respuesta #2 en: 20 de Diciembre de 2006, 03:01:03 »

Pues estoy usando la version 4.017 del ccs y dentro de la carpeta examples se encuentra tal archivo, de hay es donde me estoy basando para probar el protocolo, aqui te dejo unos enlaces:


www.canpic.com/CANPIC_project.htm

www.can-cia.org/can/


Tambien tengo unos manuales pero estan algo pesados para subirlos.

Bueno seguire intentando haber que se puede hacer...

Saludos
Microcarsil

Desconectado Mario_2004

  • PIC10
  • *
  • Mensajes: 30
Re: Iniciandome con el Bus CAN
« Respuesta #3 en: 20 de Diciembre de 2006, 10:35:23 »
Hola Carsil,

te recuerdo que las masas de los diferentes nodos deben de estar unidas, tal y como está en el proteus es la misma, pero si en el montaje utilizas fuentes de alimentación distintas tienes que unirlas.

A ver si hay suerte y es tu problema.

saludos,
Mario

Desconectado microcarsil

  • PIC10
  • *
  • Mensajes: 44
Re: Iniciandome con el Bus CAN
« Respuesta #4 en: 20 de Diciembre de 2006, 17:00:07 »

Gracias por responder mario, mira que como a penas estoy probando  esto, y si  tengo las masas unidas, y sigue esto sin funcionar  :x , estuve probando una modificacion del codigo que hicieron en el foro de ccs poniendo la funcion:

Código: [Seleccionar]
for (i=0;i<8;i++)
{
out_data[i]=0xFC; // Newguy uses 0xFC for data
in_data[i]=0;
}
can_set_mode(CAN_OP_LOOPBACK);
int1 tx_rtr=0; // Changed to 0 int1 tx_ext=1;
// Changed to 1

Running...
PUT 1: ID=24 LEN=8 PRI=3 EXT=1 RTR=0
   DATA = FC FC FC FC FC FC FC FC

GOT: BUFF=0 ID=24 LEN=8 OVF=0 FILT=0 RTR=0 EXT=1 INV=0
    DATA = FC FC FC FC FC FC FC FC   

Y funciona bien en modo LOOPBACK, eso me dice que la programacion es correcta, pero el problema es cuando conecto los 2 nodos tal como esta en el esquema del proteus, no hay manera de que haiga comunicacion.


http://www.ccsinfo.com/forum/viewtopic.php?t=23825&start=0&postdays=0&postorder=asc&highlight=

Saludos
Microcarsil

Desconectado microcarsil

  • PIC10
  • *
  • Mensajes: 44
Re: Iniciandome con el Bus CAN
« Respuesta #5 en: 24 de Diciembre de 2006, 00:26:00 »
FUNCIONA!!!  :-/ :-/ :-/

El problema que tenia es que no estaba configurando adecuadamente tx_rtr y el tx_ext los cuales deben de ponerse como sigue:

int1 tx_rtr=0;
int1 tx_ext=1;

y yo quebrandome la cabeza pensando que el problema venia en la parte de hardware incluso llegue a comprar nuevos componentes mcp2551, pero por fin ya funciono



SALUDOS  :-/
Microcarsil

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Iniciandome con el Bus CAN
« Respuesta #6 en: 24 de Diciembre de 2006, 20:03:39 »
perdonene pero soy neofito en lo de bus CAN,  podrian explicar asi breve nomas q es y para q sirve? gracias.  :-/
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado microcarsil

  • PIC10
  • *
  • Mensajes: 44
Re: Iniciandome con el Bus CAN
« Respuesta #7 en: 24 de Diciembre de 2006, 20:44:50 »

Hola micro_cadaver con gusto puedo explicar un poco de lo que se hacer acerca del Bus CAN y creeme que es un protocolo de comunicacion bastante robusto.

Un poco de lo que he leido dice que es un bus de comunicaciones serie en tiempo real desarrollado para el ramo automotriz de alemania mas o menos por los años 80 por Robert Bosch. Su objetivo principal era hacer que los automoviles fueran mas seguros, fiables y mas eficientes.
Sus principales aplicaciones como ya comente es para el ramo automotriz pero cada dia se esta extendiendo mas al area industrial y a otros mercados ya que posee ciertas caracteristicas unicas que lo hacen favorable para tal proposito, por ejemplo:

1.- La comunicacion esta basada en mensajes y no en direcciones.
2.- Todos los nodos CAN son capaces de transmitir y recibir datos y pueden acceder al bus de datos simultaneamente
3.- Se puede añidir nodos adicionales al bus sin necesidad de reprogramar todo el sistema.
4.- Detecta errores, ademas que puede trabajar en condiciones ambientales ruidosas.
5.- La velocidad de transmicion depende de la longitud de la red, pero mas o menos cada red  puede alcanzar los 1000 metros de longitud.





Hay mucha informacion que hablan sobre la arquitectura del Bus CAN y manuales por doquier, dime si necesitas algun manual y con gusto lo subo a un servidor.

SALUDOS Y FELIZ NAVIDAD :-/
Microcarsil

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Iniciandome con el Bus CAN
« Respuesta #8 en: 24 de Diciembre de 2006, 21:06:44 »
añap excelente amigo gracias, dime su aplicacion tb se extiende a los plcs?
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado microcarsil

  • PIC10
  • *
  • Mensajes: 44
Re: Iniciandome con el Bus CAN
« Respuesta #9 en: 24 de Diciembre de 2006, 21:16:19 »

Bueno la aplicacion que le queremos dar es principalmente monitoreo remoto para invernaderos, y acerca de plcs no se mucho acerca de ellos llevo un buen de tiempo sin programar uno  :D , pero no creo que sea cosa del otro mundo si soportan el protocolo CAN. Por cierto que protocolos manejan los plcs?

Saludos
Microcarsil

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Iniciandome con el Bus CAN
« Respuesta #10 en: 25 de Diciembre de 2006, 10:54:47 »
Los bus de las plc's suele ser el MPI y el PROFIBUS.


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Iniciandome con el Bus CAN
« Respuesta #11 en: 25 de Diciembre de 2006, 11:33:19 »
gracias con uds siempre aprendo algo nuevo dia a dia. feliz navidad amigos :-/
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Iniciandome con el Bus CAN
« Respuesta #12 en: 26 de Diciembre de 2006, 15:39:12 »

Hola amigos pues eso que quiero iniciarme con ese protocolo de comunicación, estuve bajando información acerca de dicho Bus, más o menos me ha quedado claro lo que tengo que hacer para poder implementarlo tanto a nivel hardware como software.
En la parte de software estoy utilizando el copilador ccs especificante el ejemplo ExCan.c y lo que trato de hacer es mandar datos de 8 bits del nodo B al nodo A, basándome en el mismo ejemplo para cada placa.


Código: [Seleccionar]
Nodo A:

#include <18F248.h>
#fuses HS,NOPROTECT,NOLVP,NOWDT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#include <can-18xxx8.c>

void main()
{
   struct rx_stat rxstat;
   int32 rx_id;
   int in_data[8];
   int rx_len;
   
   int i;

   for (i=0;i<8;i++)
   {
      in_data[i]=0;
   }

   printf("\r\n\r\nCCS CAN EXAMPLE\r\n");

   can_init();
   
  // can_set_mode(CAN_OP_LOOPBACK); // Added this line

   printf("\r\nRunning...");

   while(TRUE)
   {

      if ( can_kbhit() )   //if data is waiting in buffer...
      {
         output_high(PIN_B7);
         if(can_getd(rx_id, &in_data[0], rx_len, rxstat))
         { //...then get data from buffer
            printf("\r\nGOT: BUFF=%U ID=%LU LEN=%U OVF=%U ", rxstat.buffer, rx_id, rx_len, rxstat.err_ovfl);
            printf("FILT=%U RTR=%U EXT=%U INV=%U", rxstat.filthit, rxstat.rtr, rxstat.ext, rxstat.inv);
            printf("\r\n    DATA = ");
            for (i=0;i<rx_len;i++)
            {
               printf("%X ",in_data[i]);
            }
            printf("\r\n");
         }
         else
         {
            printf("\r\nFAIL on GETD\r\n");
         }

      }
   }
}


Nodo B:

#include <18F248.h>
#fuses HS,NOPROTECT,NOLVP,NOWDT
#use delay(clock=20000000)

#include <can-18xxx8.c>

int16 ms;

#int_timer2
void isr_timer2(void) {
   ms++; //keep a running timer that increments every milli-second
}

void main()
{
   
//send a request (tx_rtr=1) for 8 bytes of data (tx_len=8) from id 24 (tx_id=24)
   int out_data[8];
   int32 tx_id=24;
   int1 tx_rtr=1; //1
   int1 tx_ext=0; //0
   int tx_len=8;
   int tx_pri=3;

   int i;

   for (i=0;i<8;i++)
   {
      out_data[i]=8;
   }
 
   setup_timer_2(T2_DIV_BY_4,79,16);   //setup up timer2 to interrupt every 1ms if using 20Mhz clock

   can_init();

   enable_interrupts(INT_TIMER2);   //enable timer2 interrupt
   enable_interrupts(GLOBAL);       //enable all interrupts (else timer2 wont happen)


   while(TRUE)
   {
      //every two seconds, send new data if transmit buffer is empty
      if ( can_tbe() && (ms > 2000))
      {
         ms=0;
         output_high(PIN_B7);
         delay_ms(200);
          output_low(PIN_B7);
         
         i=can_putd(tx_id, out_data, tx_len,tx_pri,tx_ext,tx_rtr); //put data on transmit buffer
      }
   }
}



En la parte de hardware utilizo el PIC18F248 que tiene implementado el controlador CAN y como transceiver utilizo el mcp2551 de microchip, el esquema de conexión de ambos nodos es el siguiente:





El circuito MCP2551 es el siguiente:





Pues bien he implementado todo lo anterior y no funciona, no se si alguien con alguna experiencia en el bus CAN me pueda ayudar, ya que llevo un tiempo considerable y no lo he hecho andar, yo considero que el problema viene mas en la parte de hardware, no se si necesita otra cosa el bus para que funcione.


Bueno que tengan buen dia y FELICES FIESTAS    :-/





Hola Carsil!!
Puedes publicar aqui el archivo de simulacion de Proteus??
Te anduvo bien la simulacion??

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

Desconectado microcarsil

  • PIC10
  • *
  • Mensajes: 44
Re: Iniciandome con el Bus CAN
« Respuesta #13 en: 26 de Diciembre de 2006, 20:19:16 »

No lo simule en el proteus lo unico que hice fue elaborar el esquema para presentarlo aqui en el foro, lo implemente fisicamente ya que por lo que se la ultima version del proteus no simula redes CAN, incluso no posee el componente mcp2551.

Cualquier cosa por aqui andamos.. 8)

SALUDOS
Microcarsil

Desconectado jon66

  • PIC10
  • *
  • Mensajes: 11
Re: Iniciandome con el Bus CAN
« Respuesta #14 en: 31 de Diciembre de 2006, 13:11:53 »
hola carsil, te queria hacer una pregunta. La velocidad del CAN como se configura? Mi intencion es hacer lo funcionar a 500 kb y no se como hace. Gracias.


 

anything