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

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

Desconectado AioriaG

  • PIC10
  • *
  • Mensajes: 15
Re: Mis experiencias con el BUS CAN
« Respuesta #1365 en: 15 de Marzo de 2013, 12:37:05 »
El código del receptor (en CCS) es:
Código: [Seleccionar]
#include <18F4580.h>
#include <stdlib.h>
#use delay (clock=20000000)
#use rs232(uart1, baud=9600,TIMEOUT=10)
#fuses HS,NOWDT,WDT256,NOPROTECT,NOPUT,BROWNOUT,NOLVP,NOCPD,NODEBUG,NOWRT

#byte port_c = 0xF82
#byte port_d = 0xF83

#define CAN_DO_DEBUG TRUE

#include "can-18F4580.c"
int16 ms;
const int word_size = 8;//TAMAÑO DE LAS PALABRAS
char XX[word_size];

#define TSE1   0x201

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

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

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);

can_init();
enable_interrupts(GLOBAL);
printf("INICIO");
SETUP_WDT(WDT_ON);//inicializa el wdt cada 2304 ms

while(true){
 if ( can_kbhit() ) {
   printf("\r\n");
   if(can_getd(rx_id, &buffer, rx_len, rxstat)) {//ID,DATO,TAMAÑO,...
        if (rx_id == TSE1) {
           for (i=0;i<word_size;i++) XX[i] = buffer[i];
           printf("RECIBE: %c%c%c%c%c%c%c%c\r\n",XX[0]XX[1]XX[2]XX[3]XX[4]XX[5]XX[6]XX[7]);
        }//END IF IDENTIFICACION RX CAN
   }//END IF CAPTURA CAN
 }//end can kbhit
 restart_wdt();
 }//end while
}//end main
El código del transmisor (mikroC) es:
Código: [Seleccionar]
unsigned char Can_Init_Flags, Can_Send_Flags, Can_Rcv_Flags; // can flags
unsigned char Rx_Data_Len;                                   // received data length in bytes
char RxTx_Data[8];                                           // can rx/tx data buffer
char Msg_Rcvd;
//const long transmisor = 102, receptor = 3;                       // node IDs
const long main_node = 0x201;
long Rx_ID;
unsigned int cnt;
unsigned int temp_res;
char envio1[]="ENVIO 01";

void main() {
  PORTC = 0;                                                // clear PORTC
  TRISA  = 0xFF;              // PORTA is input
  CMCON=7;
  T2CON  =  0x07;           // Timer2 settings
  TMR2IF_bit = 0;           // clear TMR2IF
  TMR2IE_bit = 1;           // enable Timer2 interrupt
  cnt =   0;                // initialize cnt
  INTCON = 0xC0;            // Set GIE, PEIE
  TRISC = 0;                                                // set PORTC as output
  LATD  = 0 ;
  TRISD = 0 ;             // set PORTD as output
  value = 0;                          // When program starts, DAC gives
                                        //   the output in the mid-range
  PORTC.F7 = 1;
  PORTC.F6 = 0;

  Can_Init_Flags = 0;                                       //
  Can_Send_Flags = 0;                                       // clear flags
  Can_Rcv_Flags  = 0;                                       //
  Can_Send_Flags = _CAN_TX_PRIORITY_0 &                     // form value to be used
                   _CAN_TX_XTD_FRAME &                      //     with CANWrite
                   _CAN_TX_NO_RTR_FRAME;

  Can_Init_Flags = _CAN_CONFIG_SAMPLE_THRICE &              // form value to be used
                   _CAN_CONFIG_PHSEG2_PRG_ON &              // with CANInit
                   _CAN_CONFIG_XTD_MSG &
                   _CAN_CONFIG_DBL_BUFFER_ON &
                   _CAN_CONFIG_VALID_XTD_MSG &
                   _CAN_CONFIG_LINE_FILTER_OFF;

  CANInitialize(1,3,3,3,1,Can_Init_Flags);                  // initialize external CAN module
  CANSetOperationMode(_CAN_MODE_CONFIG,0xFF);               // set CONFIGURATION mode
  CANSetBaudRate(1,1,8,8,3,_CAN_CONFIG_SAMPLE_ONCE & _CAN_CONFIG_PHSEG2_PRG_ON & _CAN_CONFIG_LINE_FILTER_OFF); //500
  CANSetMask(_CAN_MASK_B1,-1,_CAN_CONFIG_XTD_MSG);          // set all mask1 bits to ones
  CANSetMask(_CAN_MASK_B2,-1,_CAN_CONFIG_XTD_MSG);          // set all mask2 bits to ones
  CANSetFilter(_CAN_FILTER_B2_F3,ID_1001,_CAN_CONFIG_XTD_MSG);// set id of filter B2_F3 to 1st node ID
  CANSetOperationMode(_CAN_MODE_NORMAL,0xFF);               // set NORMAL mode
  while (1) {
    CANWrite(main_node, envio1 , 8, Can_Send_Flags);
    Delay_ms(1000);
   }
}
Ambos códigos son para el pic 18F4580 con cristales de 20Mhz
« Última modificación: 15 de Marzo de 2013, 12:59:30 por AioriaG »

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7839
Re: Mis experiencias con el BUS CAN
« Respuesta #1366 en: 15 de Marzo de 2013, 23:59:22 »
Estas seguro que el codigo en Mikro C es para ese PIC ??

En el comentario de la inicializacion dice que es para u modulo externo...
Porque no lo compruebas??
Y si hay un MCP2515, dinos que cristal tiene, asi vemos la velocidad a que esta prefijada... :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado AioriaG

  • PIC10
  • *
  • Mensajes: 15
Re: Mis experiencias con el BUS CAN
« Respuesta #1367 en: 16 de Marzo de 2013, 12:33:22 »
Si es para ese pic, lo del modulo externo si ya hicimos pruebas quitando esa linea que se supone configura de forma rápida el modulo can pero hizo lo mismo. Usa un mcp2551 por lo que no tiene otro cristal. Voy hacer otras pruebas cambiando las velocidades haber como responde y comento si hubo cambios.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7839
Re: Mis experiencias con el BUS CAN
« Respuesta #1368 en: 16 de Marzo de 2013, 14:26:00 »
Creo que aca tienes dos errores.

Código: C
  1.   CANSetBaudRate(1,1,8,8,3,_CAN_CONFIG_SAMPLE_ONCE & _CAN_CONFIG_PHSEG2_PRG_ON & _CAN_CONFIG_LINE_FILTER_OFF); //500 <<< es para 500K
  2.   CANSetMask(_CAN_MASK_B1,-1,_CAN_CONFIG_XTD_MSG);          // set all mask1 bits to ones
  3.   CANSetMask(_CAN_MASK_B2,-1,_CAN_CONFIG_XTD_MSG);          // set all mask2 bits to ones
  4.   CANSetFilter(_CAN_FILTER_B2_F3,ID_1001,_CAN_CONFIG_XTD_MSG);// set id of filter B2_F3 to 1st node ID

Deberias probar con esto:

Código: C
  1.   CANSetBaudRate(4,1,8,8,3,_CAN_CONFIG_SAMPLE_ONCE & _CAN_CONFIG_PHSEG2_PRG_ON & _CAN_CONFIG_LINE_FILTER_OFF); //500 <<< para 125 K
  2.   CANSetMask(_CAN_MASK_B1,-1,_CAN_CONFIG_XTD_MSG);          // set all mask1 bits to ones
  3.   CANSetMask(_CAN_MASK_B2,-1,_CAN_CONFIG_XTD_MSG);          // set all mask2 bits to ones
  4.   CANSetFilter(_CAN_FILTER_B2_F3,0x0000,_CAN_CONFIG_XTD_MSG);// set id of filter B2_F3 to 1st node ID
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado AioriaG

  • PIC10
  • *
  • Mensajes: 15
Re: Mis experiencias con el BUS CAN
« Respuesta #1369 en: 16 de Marzo de 2013, 16:20:08 »
Hola que tal, hicimos los cambios que indicaste pero el problema continuo, pero intentamos configurar la velocidad de una forma mas directa (así como lo hiciste tu al modificar el registro en la libreria de ccs) pero en mikroc y asunto resuelto, agrego el codigo donde se configuro en mikroc para compartirlo
Código: [Seleccionar]
CANSetOperationMode(_CAN_MODE_CONFIG,0xFF);               // set CONFIGURATION mode
BRGCON1 = 0x03;
BRGCON2 = 0xBA;
BRGCON3 = 0x07;
CANSetOperationMode(_CAN_MODE_NORMAL,0xFF);               // set NORMAL mode
Así por fin nos quedo configurada bien la velocidad para 125kbps. Te comento que estamos trabajando en un mando a distancia con un touch glcd razón por la cual utilizamos mikroc (en lo particular no me gusta jeje) ya que tiene una herramienta llamada visual glcd y ayuda mucho en la creación del código para el touch.
Te agradezco que hayas estado al pendiente tratando de ayudarnos, muchas gracias.
Como dato curioso yo también soy Lazcano jejeje

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7839
Re: Mis experiencias con el BUS CAN
« Respuesta #1370 en: 16 de Marzo de 2013, 16:28:36 »
Me parece una solucion muy inteligente, usar la herramienta de programacion mas adecuado, segun lo que necesites hacer.
Felicitaciones por haberlo sacado en marcha, y ademas por ser Lazcano seras muy inteligente !! Ja..ja..!! :D :D

Una pregunta que me mata y me corroe:
Que recibes del otro lado cuando mandas ese mensaje desde MikroC ?

Me refiero a este:

Código: C
  1. char envio1[]="ENVIO 01";
  2.  
  3. CANWrite(main_node, envio1 , 8, Can_Send_Flags);
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado AioriaG

  • PIC10
  • *
  • Mensajes: 15
Re: Mis experiencias con el BUS CAN
« Respuesta #1371 en: 18 de Marzo de 2013, 18:39:27 »
Recibo esa cadena de 8 bytes "ENVIO 01", son 8 caracteres de 1 byte, del otro lado lo imprimo como char por el puerto serial para comprobar el mensaje. En esta instrucción CANWrite(main_node, envio1 , 8, Can_Send_Flags); main_node es el id, envio1 es el arreglo que tiene la información a transmitir,8 es el tamaño de los datos que espera transmitir (es decir 8 bytes) y Can_Send_Flags son las banderas, del otro lado también espero recibir un dato de 8 bytes. No se si eso es lo que me preguntabas, también pude transmitir números enteros con 1 byte, o cualquier cosa pero que sea siempre en paquetes de 1 byte
« Última modificación: 18 de Marzo de 2013, 18:50:31 por AioriaG »

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7839
Re: Mis experiencias con el BUS CAN
« Respuesta #1372 en: 18 de Marzo de 2013, 18:59:44 »
Excelente !! :mrgreen: :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Andr1c

  • PIC10
  • *
  • Mensajes: 8
Re: Mis experiencias con el BUS CAN
« Respuesta #1373 en: 03 de Abril de 2013, 00:53:48 »
¡Hola a todos!, recién me han dejado implementar el protocolo BUS CAN en la Universidad, pero no tengo idea de nada, me iré leyendo todo desde el inicio y espero poder entender, la verdad estoy muy novato en esto, y pregunto ¿Los códigos que han puesto pueden ser grabados en el PIC e iniciar las pruebas de inmediato? me refiero a que si hicieron uso de las librerías originales o hubo modificaciones en algunas de ellas, de ser así ¿Podrían decirme cuales?. Espero no haber interrumpido nada y si las preguntas que hice ya tienen respuestas en este tema perdonen pero como dije apenas inicié leer y ponerme al tanto de sus avances. Ojalá cuente con su ayuda.  :)

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7839
Re: Mis experiencias con el BUS CAN
« Respuesta #1374 en: 03 de Abril de 2013, 11:20:54 »
Hasta donde yo se, lo que se ha colgado aqui, siempre anduvo...
Y lo que se cambio, esta explicado donde y como cambiarlo.
No debieras tener problema en compilarlos...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Andr1c

  • PIC10
  • *
  • Mensajes: 8
Re: Mis experiencias con el BUS CAN
« Respuesta #1375 en: 03 de Abril de 2013, 18:19:10 »
Ok, mi tarea fue implementarlo para un solo nodo, pero para que de verdad se note el protocolo como mínimo deberán de haber 2 o 3 nodos en los que se tenga comunicación mútua... Recién iniciaré a entender y compilar los programas, espero no tener problemas (Tendrás algún correo en donde poder contactarte). Buen día.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7839
Re: Mis experiencias con el BUS CAN
« Respuesta #1376 en: 03 de Abril de 2013, 18:32:04 »
Si es tu primer prueba, hazlo punto a punto, es decir, sólo dos nodos, y cuando ya vayas tomándole el tiro, vas agregando nodos.
Tres o cuatro nodos ya te dan una buena experiencia.
Debajo de mi Nick hay un icono de sobre (mail), esa es mi dirección de correo, nunca estuvo oculta, de hecho muchos foristas me han escrito, y los ayudo dentro de mis posibilidades, pero insisto, tu aporte al hilo estará mejor si escribes aquí, ya que quedan nuevas experiencias para otros nuevos usuarios...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Andr1c

  • PIC10
  • *
  • Mensajes: 8
Re: Mis experiencias con el BUS CAN
« Respuesta #1377 en: 03 de Abril de 2013, 23:22:16 »
He tomado los programas de los nodos e intente compilarlos en "PIC Compiler" pero al momento de hacerlo el programa deja de funcionar, no se si sea problema de la instalación (del programa) o será que debo hacer uso de otro software para compilarlos y generar los archivos *.hex para después proceder a quemarlos en los PIC. Perdón por tantas dudas  :oops:

Desconectado Andr1c

  • PIC10
  • *
  • Mensajes: 8
Re: Mis experiencias con el BUS CAN
« Respuesta #1378 en: 03 de Abril de 2013, 23:26:03 »
Otra cosa, ¿Usted mismo creo los MCP2551 dentro de Proteus? el Proteus con que contaba no los tiene y me bajé la última versión pero cual fue mi sorpresa de que tampoco los incluye.  :shock:

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7839
Re: Mis experiencias con el BUS CAN
« Respuesta #1379 en: 03 de Abril de 2013, 23:35:05 »
Ahh!!
Estas intentando usarlo en Proteus !! :D :D :D :D

Es simple, NO HAY programas emuladores que puedan emular el funcionamiento del bus CAN, y si encuentras uno, por favor avisanos !!! :mrgreen: :mrgreen:

eso ya lo aclare por lo menos 5 veces en este hilo a diferentes personas.

Solo puedes probar en un montaje real, y cuidado si lo armas en protoboard, ya que los cristales HS suelen traer problemas por la falla de sus contactos, y no funcionara el bus CAN.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.