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

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

Desconectado arameo

  • PIC10
  • *
  • Mensajes: 17
Re: Mis experiencias con el BUS CAN
« Respuesta #555 en: 07 de Febrero de 2009, 17:22:58 »
Buenas, lo prometido es deuda. Aca les adjunto las fotitos del circuito y al lado se encuentra el programador que estoy utilizando.



Esquematico:


http://img14.imageshack.us/my.php?image=esquematicofinalposteadom8.pdf

El codigo utilizado es el siguiente:

Código: [Seleccionar]


#include "main.h"


#define CAN_USE_EXTENDED_ID FALSE
#include <can-18xxx8.c>

#byte porta = 0
#byte portb = 6
#byte portc = 7


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

   //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;
   int1 tx_ext=0;
   int tx_len=8;
   int tx_pri=3;
   int corrida;
   int i;

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


   set_tris_a(0b11111111);
   set_tris_b(0b00001000);
   set_tris_c(0b10000000);

   porta=0;
   portb=0;
   portc=0;


   can_init();
   
   can_set_mode(CAN_OP_CONFIG);
   

//Configuracion CAN 500 kbps

      BRGCON1.brp=2;
      BRGCON1.sjw=1;
      BRGCON2.prseg=1;
      BRGCON2.seg1ph=4;
      BRGCON2.sam=FALSE;
      BRGCON2.seg2phts=FALSE; 
      BRGCON3.seg2ph=4;
      BRGCON3.wakfil=TRUE;



   can_set_mode(CAN_OP_NORMAL);
 

 
   corrida = 0;
 
while (corrida < 31)  //Numero aleatorio de corrida para una lectura mas limpia y analisis posterior.
   {


if ( can_kbhit() ) //if data is waiting in buffer...
    { 

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]);
            }
           

        }
else
{
            printf("\r\nFallo can_getd()\r\n");
        }
    }



    if ( can_tbe() )
    {
       
         i=can_putd(tx_id, out_data, tx_len,tx_pri,tx_ext,tx_rtr); //put data on transmit buffer
         if (i != 0xFF)
{
            printf("\r\nPUT %U: ID=%LU LEN=%U ", i, tx_id, tx_len);
            printf("PRI=%U EXT=%U RTR=%U\r\n   DATA = ", tx_pri, tx_ext, tx_rtr);
            for (i=0;i<tx_len;i++) {
               printf("%X ",out_data[i]);
            }
            printf("\r\n");
         }
         else
{ //fail, no transmit buffer was open
            printf("\r\nFallo can_putd(); \r\n");
         }
      }


   corrida++;
   }

}



Respuesta del Auto (Clio 1.2 16V año 2007) Conectandola interface a la linea CANH - CANL del conector OBDII
Código: [Seleccionar]

Entro al main...

Previo a can_init();

CAN Inicializado ...

Modo CAN en Configuracion

500 kps...

Modo CAN en Normal

Previo a can_kbhit(); ...

Previo a can_tbe(); - Analisis del buffer de emision - Si esta vacio entra

Entro can_tbe(); - Buffer de Transmision Vacio, puedo escribir - Espero 4seg.

PUT 1: ID=24 LEN=8 PRI=3 EXT=0 RTR=0
   DATA = 00 00 00 00 00 00 00 00

Termino corrida bandera ...

Entro can_tbe(); - Buffer de Transmision Vacio, puedo escribir - Espero 4seg.

PUT 1: ID=24 LEN=8 PRI=3 EXT=0 RTR=0
   DATA = 00 00 00 00 00 00 00 00

Entro can_tbe(); - Buffer de Transmision Vacio, puedo escribir - Espero 4seg.

PUT 1: ID=24 LEN=8 PRI=3 EXT=0 RTR=0
   DATA = 00 00 00 00 00 00 00 00

-----------------------------------------------------------------------------
RESPUESTA DEL AUTO EN MARCHA
-----------------------------------------------------------------------------


Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 00 00 32 10 00 32 32

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 00 00 32 10 00 32 32

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 00 00 32 10 00 32 32

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 00 00 32 10 00 32 32

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 00 00 32 10 00 32 32

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 00 00 32 10 00 32 32

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 00 00 32 10 00 32 32

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 00 00 32 10 00 32 32

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 00 00 32 10 00 32 32

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 00 00 32 10 00 32 32

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 00 00 32 10 00 32 32

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 00 00 32 10 00 32 32

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 00 00 32 10 00 32 32

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 00 00 32 10 00 32 32

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 00 00 32 10 00 32 32

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=442 LEN=5 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 00 35 00 3E 09

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 1C CC 33 10 00 31 31

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 1B 6B 34 10 00 32 32

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 1B EB 32 10 00 32 32

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 1B AE 32 10 00 31 31

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 1B 77 33 10 00 32 32

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 1B 1B 33 10 00 31 31

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 1B 56 34 10 00 31 31

Entro al main...

Previo a can_init();

CAN Inicializado ...

Modo CAN en Configuracion

500 kps...

Modo CAN en Normal

Previo a can_kbhit(); ...

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 1A AD 34 10 00 31 32

Previo a can_tbe(); - Analisis del buffer de emision - Si esta vacio entra

Entro can_tbe(); - Buffer de Transmision Vacio, puedo escribir - Espero 4seg.

PUT 1: ID=24 LEN=8 PRI=3 EXT=0 RTR=0
   DATA = 00 00 00 00 00 00 00 00

Termino corrida bandera ...

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 1A 73 34 10 00 32 32

Entro can_tbe(); - Buffer de Transmision Vacio, puedo escribir - Espero 4seg.

PUT 1: ID=24 LEN=8 PRI=3 EXT=0 RTR=0
   DATA = 00 00 00 00 00 00 00 00

-----------------------------------------------------------------------------
RESPUESTA DEL AUTO EN MARCHA Acelerado
-----------------------------------------------------------------------------


Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 1A 69 33 10 00 31 31

Entro can_tbe(); - Buffer de Transmision Vacio, puedo escribir - Espero 4seg.

PUT 1: ID=24 LEN=8 PRI=3 EXT=0 RTR=0
   DATA = 00 00 00 00 00 00 00 00

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 18 DF 33 10 00 32 32

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 18 D7 33 10 00 32 32

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 18 D8 34 10 00 31 31

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=442 LEN=5 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 00 33 00 3D 09

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 17 F2 33 10 00 32 32

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 18 4B 33 10 00 31 31

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 17 FF 33 10 00 31 31

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=442 LEN=5 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 00 34 00 3D 09

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 17 8A 34 10 00 31 32

Se supero can_kbhit(); - Hay datos en Buffer de entrada esperando...
GOT: BUFF=0 ID=250 LEN=7 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 16 EA 33 10 00 32 32



Problemillas a solucionar:

1) ICSP no lo logro hacer funcionar, testee el cable y todo el patillaje se encuentra bien. WinPic800 no me lo detecta e Icprog no lee el PIC. Algun consejo ?
2) Switch en el puertoA sin funcionar. Probe varias cosas, tampoco insisti mucho. Creeria que es alguna configuracion del puerto. Saben como setearlopara que me lo tome ?
3) Interpretacion correcta de los datos recibidos.

Espero les sirva de algo y sus aportes.

Saludos.

Desconectado teleko

  • PIC10
  • *
  • Mensajes: 41
Re: Mis experiencias con el BUS CAN
« Respuesta #556 en: 07 de Febrero de 2009, 19:42:09 »
Muy interesante lo que has conseguido, aunque creo que no tiene nada que ver lo que envias para ver lo recibido.

¿En que pines del OBD conectas, el 6 y 14? Es que en esos pines suele estar la BCAN, que generalmente va a menos velocidad (sobre 50, 62.5, 125 kbps). Aquí va la información de confort y otras básicas.
Después el coche tiene otro bus más rápido, (a 250 o 500kbps), pero no suele ir en el conector de diagnosis de un modo fácil de leer. Es el bus principal de motor, ABS, y no se conoce lo que cada fabricante usa para numerar sus centralitas, o el tipo de infromación que se envían entre ellas.

Siempre hay que acceder a traves de los pines 6 y 14. Y enviando una serie de comandos a la dirección 01 (por ejemplo, es el motor), este nos responde. Aunque en realidad no estamos accediendo al bus can de sistema del motor, sino que estamos comunicando con una centralita auxiliar del habitáculo del coche (donde va la información del marcador del coche, por ejemplo).

Desconectado arameo

  • PIC10
  • *
  • Mensajes: 17
Re: Mis experiencias con el BUS CAN
« Respuesta #557 en: 07 de Febrero de 2009, 21:49:27 »
teleko, si tengo que sentarme a ver que serian esos datos....

Contestando tu pregunta, si me conecto en los pines 6 y 14 (CANH y CANL) a 500 kbps.

Tengo la esperanza que el auto respete el standard y responda a ciertos PID's soportados.

Sigo probando... y les cuento los avances.

Si tenes algunos consejos para que vaya probando y segun las respuestas hagamos algunos analisis mejor...

Gracias.

Saludos

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #558 en: 07 de Febrero de 2009, 22:25:42 »
Muy buen avance!! :-/ :-/

Justo me encuentran retomando actividades y despues de armar mi rinconcito electronico, estoy armando mi sistema de pruebas, asi que pronto reaparecere poniendo fotos y pruebas de lo que estoy haciendo... :mrgreen: :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado teleko

  • PIC10
  • *
  • Mensajes: 41
Re: Mis experiencias con el BUS CAN
« Respuesta #559 en: 08 de Febrero de 2009, 09:19:45 »
Es raro que tenga el can de alta velocidad en el conector de diagnosis. Por ejemplo en el fiat Stilo, viene sólo a 50kbit en el conector, y e de alta velocidad va a 500kbps. En esta página (en inglés) prueban a conectarlo desde la bomba eléctrica de dirección. Stilo can

Hay un esquema que explica lo que yo digo sobre los 2 buses a diferente velocidad.


Aquí tienes el standar de comunicación con el coche: Sae OBD a partir de la página 63.

Aunque también es recomendable mirar las instrucciones del ELM, viene un ejemplo de comunicación sencilla.

Desconectado teleko

  • PIC10
  • *
  • Mensajes: 41
Re: Mis experiencias con el BUS CAN
« Respuesta #560 en: 12 de Febrero de 2009, 14:17:35 »
Me falta el ISO 15765, lo ando buscando y no lo encuentro por ningún sitio (sólo pagando y muchos $$$).

Aunque buscando y rebuscando he encontrado esto:

Citar
> The PID for MAP is 0B, MAF is $10, intake temp is $0F, RPM is 0C and
> vehicle speed is $0D.
>
> If you send this into a CAN vehicle with OBDII: You use Srvice 01 for this
> request:
>
> 7DF 02 01 0C I think you will get the RPM returned.
>
> It will look like this:
>
> 7E8 04 41 00 xx yy where xx yy is the RPM 1/4 RPM per bit.
>
> 1st line - 7DF - CAN ID - to all OBDII modules. 02 - 2 bytes of data
> following, 01 - service 1, 0C - get RPM
> 2nd line - 7E8 - a OBDII module responding (its adrress is 7E8 - 8 = 7E0),
> 04 - 4 data bytes following, 41 - service 01+40, 00 - RPM, xx yy the two
> byte data.
>
> I think this is correct - if you get no response, msend 8 data bytes with
> rest of frame with $FF in the unused data bytes.
>

Así que puedes probar, envía una trama con el ID 7DF, longitud 2, datos: 01 0C (hex). A ver que te responde el auto.

Desconectado arameo

  • PIC10
  • *
  • Mensajes: 17
Re: Mis experiencias con el BUS CAN
« Respuesta #561 en: 16 de Febrero de 2009, 23:08:15 »
teleko, ahi hice la prueba, te adjunto los resultados.

Sigo sin enteder mucho... cualquier ayuda es bienvenida.

Hice varias pruebas, cambiando los datos de la funcion can_putd(). [ can_putd(tx_id, out_data, tx_len,tx_pri,tx_ext,tx_rtr); ]
tx_id esta definido como entero [ int32 rx_id; ] aqui es donde debo setear el ID que me comentaste ? , pasado a decimal ?
de esta forma: "int32 tx_id=2024;"

La respuesta obtenida es con esa configuracion y cambiando la logitud TX a 2 y en los datos simplemente poniendo 01 0C


En la prueba antes realizada con un numero aleatoreo en tx_id (2000) y armando la trama de datos de la siguiente forma: "DATA = 07 DF 02 01 0C 00 00 00"
Las respuestas obtenidas son muy parecidas a las posteadas en el anterior mensaje.


Saludos. gracias por la ayuda !!!


Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #562 en: 16 de Febrero de 2009, 23:12:46 »
Cuidado como escribes el Id, si usas 2000 solamente esta en decimal, si es interpretado en hexadecimal por la funcion can_putd() estaras escribiendo como si fuera ID 7D0.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado teleko

  • PIC10
  • *
  • Mensajes: 41
Re: Mis experiencias con el BUS CAN
« Respuesta #563 en: 17 de Febrero de 2009, 12:38:58 »
lo que yo he hecho es poner:

Código: [Seleccionar]
#define tx_id 0x7DF


Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #564 en: 17 de Febrero de 2009, 15:07:30 »
Si, vi que asi lo habias puesto, solo era advertirles del error, que dicho sea de paso es comun cometerlo... :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado teleko

  • PIC10
  • *
  • Mensajes: 41
Re: Mis experiencias con el BUS CAN
« Respuesta #565 en: 18 de Febrero de 2009, 07:56:34 »
Arameo, viendo las tramas que has recibido, si te fijas en todas vienen con el flag INV en 1. Eso quiere decir que te las están marcando como inválidas.

Si te fijas en la libreria can, viene en el can_getd:

Código: [Seleccionar]
stat.inv=CAN_INT_IRXIF;

Y en el datasheet del 2580, por ejemplo, viene que el Registro PIR3, que el bit IRXIF es:

Código: [Seleccionar]
IRXIF: CAN Invalid Received Message Interrupt Flag bit
1 = An invalid message has occurred on the CAN bus
0 = No invalid message on CAN bus

Así que algo raro está ocurriendo en el bus.

Desconectado teleko

  • PIC10
  • *
  • Mensajes: 41
Re: Mis experiencias con el BUS CAN
« Respuesta #566 en: 20 de Febrero de 2009, 12:41:53 »
Acabo de encontrar una información muy interesante, un extracto del iso 15765-2 iso

Se define que se deben enviar tramas de 8 bytes de largo (campo de datos). Pero se usa un campo PCI (Protocol Control Information), en donde se marca si la trama es simple o extendida y la longitud de los datos. O sea, la trama CAN siempre es de lonitud 8, y el primer campo (o más si es una multitrama) es un flag que nos marca si la trama es extendida o simple, y la longitud de los datos enviados.

Tipos de tramas:
PDU Type                         PCI Type                   byte
Single Frame                      (SF)                            0
First Frame                         (FF)                           1
Consecutive Frame             (CF)                            2
Flow Control                       (FC)                            3

Para enviar una trama con menos de 7 bytes de datos, se usa el flag SF, o sea, el primer Byte del campo de datos es 0x, donde x es la longitud del campo de datos.

Por ejemplo, queremos pedir a la centralita el valor de las revoluciones del motor, en este caso la petición sería 01 0C, al construir la trama, habría que poner:

ID= 7E0, lenght= 8, data= 02 01 0C 00 00 00 00 00

Y la respuesta será de la forma:

ID= 7E8, length= 8, data= 04 41 0C xx yy 00 00 00

donde xx yy es el valor de las revoluciones del motor en hexadecimal, el valor entero es:

RPM = ((xx*256) + yy)/4

Desconectado arameo

  • PIC10
  • *
  • Mensajes: 17
Re: Mis experiencias con el BUS CAN
« Respuesta #567 en: 21 de Febrero de 2009, 13:27:49 »
teleko, muchas gracias por la info. Ahi puli bien la trama a enviar. Pero algo raro sucede

1) Al analizar lo recibido, me di cuenta que solamente realiza el can_putd() , 3 veces por corrida [una por cada buffer de TX], investigando en el foro de CSS alguien comento que eso era un comportamiento debido al error de velocidad. Entonces tuve que buscar bien lo del baud rate y configurarlo adecuadamente.

Segun entiendo, actualmente me estoy comunicando a 250 kbps , con la siguiente configuracion:

//250 Kbps - Cristal 20 Mhz - guiandome en la formula:
//baud rate generator prescalar (def: 4) ( Tq = (2 x (PRE + 1))/Fosc )
//Que si el PRE es 1, da 0.2us (500 kbps), PERO leyendo y analizando el programa de Microchip bit timing, al yo utilizar un Cristal de 20 Mhz, este PRE se encuentra multiplicado por 2
//Ademas de restarle a todos los valores una unidad


Código: [Seleccionar]

    BRGCON1.brp=1;                     //prescaler
    BRGCON1.sjw=0;                    //SYNCH_JUMP 0+1
    BRGCON2.prseg=2;                 //propagation 2+1
    BRGCON2.seg1ph=7;              //7+1
    BRGCON2.sam=FALSE;
    BRGCON2.seg2phts=FALSE; 
    BRGCON3.seg2ph=7;             //7+1
    BRGCON3.wakfil=TRUE;


Con esta configuracion logre que el buffer 0 de TX se "vacie" y realice un PUT cada 2 seg. constantemente.

2) Mi segundo problema es el "vacie" antes puesto entre comillas... :-p
Tengo puesto unos LED's tanto en TX y RX del Serie del PIC y en TX y RX del CAN del PIC
EL led de TX del PIC NUNCA prende (ya lo teste y funciona bien)

Asi que imagino que tengo cierto problema con la funcion can_putd() , estoy investigando sobre ello.

La buena noticia es que con la configuracion de baud_rate antes mencionada recibo la siguiente trama una sola vez al principio:

Código: [Seleccionar]

CAN_GETD(): BUFF=0 ID=000007E8 LEN=8 OVF=0 FILT=0 RTR=0 EXT=0 INV=1
    DATA = 03 7F 01 11 AA AA AA AA


Es la primera vez que recibo una trama con ID 7E8, asi que eso me pone contento y pilas para seguir. Tambien tengo que descifrar el significado de la misma.

Bueno, cualquier otra novedad se las comentare a la brevedad.
Agradezco nuevamente por la ayuda brindada.

Desconectado teleko

  • PIC10
  • *
  • Mensajes: 41
Re: Mis experiencias con el BUS CAN
« Respuesta #568 en: 21 de Febrero de 2009, 14:02:32 »
Yo también tuve problemas a la hora de configurar el ccs para la velocidad del bus. me di cuenta que los valores de la librería no son enteros, si no hexadecimales. Mira los registros de configuración del 2580 para ver lo que es cada bit y así configurarlo.

Hay otro programa para configurar los bits, después te paso el enlace, que lo tengo en otro pc.

La respuesta recibida, es de 7E8, o sea, es una respuesta al identificador 7E0. Y el campo datos es de 8 bytes (era de esperar). Si desglosamos la respuesta tenemos:
03 = PCI, son 3 bytes de información.
7F 01 11. Si revisas la norma SAE que yo puse, 7F es una respuesta negativa.

TABLE 9—NEGATIVE RESPONSE MESSAGE FORMAT FOR ISO 14230-4, ISO 15765-4
Data Byte     Parameter Name                                                 Cvt                 Hex Value                 Mnemonic
     #1         Negative Response Service Identifier                       M                           7F                      SIDNR
     #2         Request Service Identifier                                       M                           xx                      SIDRQ
     #3         ResponseCode                                                       M                           xx                        RC_

En este caso, te ha puesto una respuesta negativa al codigo de servicio pedido 01, resultado 11: servicio no soportado.

¿Que has puesto en el mensaje enviado?

Desconectado arameo

  • PIC10
  • *
  • Mensajes: 17
Re: Mis experiencias con el BUS CAN
« Respuesta #569 en: 21 de Febrero de 2009, 14:18:53 »
Supuestamente envie:

CAN_PUTD(): BUFF=0 ID=000007E0 LEN=8 PRI=3 EXT=0 RTR=0
  DATA = 02 01 0C 00 00 00 00 00

Pongo supuestamente por lo antes comentado.

Una duda, esta configuracion del PORTB, esta bien ?
/****

set_tris_b((*0xF93 & 0xFB ) | 0x08);   //b3 is out, b2 is in

*****/

Es realizada en can_init()