Autor Tema: Analizador Tramas VAN BUS  (Leído 5741 veces)

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

Desconectado facundo_10

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 179
    • DAVINCIPIC
Analizador Tramas VAN BUS
« en: 28 de Junio de 2011, 11:04:20 »
Hola, ya he visto un tema en el foro que trata sobre mas que nada CAN BUS, estoy queriendo hacer un dispositivo que lea las tramas provenientes del auto, pero estas son VAN BUS, es un sistema de multiplexado propietario del grupo PSA. (viene en algunos peugeot)...

La informacion que pude recolectar sobre el sistema no es mucha ya que es bastante cerrado

El protocolo usa 2 lineas para la comunicacion, las cuales supongo seran una especie de tx/rx del bus van, dentro del coche, el multiplexado mas interesante es el de confort, el cual corre a una velocidad de unos 125000 kbits, en este punto es similar al CAN BUS.

La informacion del VAN BUS es transmitida de la siguiente manera :

Example Line:    9C4C0080D4E2
Splits into    9C4    C    0080    D4E2
Section    IDEN    Flags    Data    Checksum

Es decir hay unos 12 bits que son la identificacion del comando, 4 bits que son un flag, 16 bits mas que son la data, (EL MAXIMO DE LOS DATOS ES DE 28 bytes), y unos ultimos 16 bits es decir 2 bytes que son el CHECKSUM.

El circuito que estoy utilizando es bastante simple :



La mayor parte de la informacion la encontre en la siguiente pagina web:
http://graham.auld.me.uk/projects/vanbus/van-pc.html

El protocolo en si, no esta muy bien especificado en muchos lugares, sin embargo hay un dispositivo de atmel, que es SPI y se dedica a la decodificacion de estos comandos, y el data del dispositivo en cuestion tiene bastante informacion del protocolo.

http://graham.auld.me.uk/projects/vanbus/datasheets/tss461f.pdf




Ese es un ejemplo de trama, nose si estoy en lo correcto, pero segun mis calculos a 125000 bits por segundo, 1 bit dura unos 8 microsegundos, como veran en la trama, hay un SOF (Start of file )

El mismo esta compuesto por

0000 1111 01 -- Esta es la secuencia SOF y es unica e igual para todos los comandos, por lo cual mi punto de partida con el pic, seria poder identificar el comienzo del comando en este punto.

Hay ademas un EOF, por lo cual aqui podria cortar el dato, es decir a este punto ya recibi todo.

Por lo cual sabiendo esto, puedo descartar usar un timer para saber donde termina el dato, ademas sabiendo que los datos que puede enviar un comando pueden tener distintas longitudes, eso no estaria contemplado en el timer.

Ahora les pregunto a los que tengan mas experiencia aqui del foro, la idea es con el puerto del micro registrar los 1 y 0 , para eso mi idea era usar un timer con una resolucion de unos 8 microsegundos que es lo que teoricamente dura un bit a 125000 kbits, cuando recibo un uno, cuento con el timer el tiempo hasta recibir un 0, sabiendo cuanto tiempo paso, puedo saber la cantidad de unos que sucedieron e igual para los ceros, queria saber si alguien tiene algun ejemplo por casualidad, se que hay un proyecto aqui con el BUS CAN, pero esto es totalmente diferente.

Un saludo


« Última modificación: 28 de Junio de 2011, 11:11:18 por facundo_10 »
PICMANIACO!

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Analizador Tramas VAN BUS
« Respuesta #1 en: 28 de Junio de 2011, 14:58:34 »
Creo , sin haberme metido a fondo en el tema, que estas errado.
Para mi si esta basado en el Bus CAN, pero tiene una capa de software que mejora su manejo.
Si esto es cierto, lo mejor que te podría ocurrir seria usar un PIC con CAN, ya que el que pusiste no lo tiene.
Podrías elegir un PIC18F2680 o un PIC18F2685, que son compatibles pin a pin con el PIC18F2620 que tienes en el esquema.

Eso si, deberías cambiar los pines B0 y B1 por B2 y B3 que son los de CAN y también pueden trabajar por interrupción en caso de necesitarlo.

La trama tiene todo de CAN, y si el hardware es CAN, no te compliques la vida, usa un hardware que ya te resuelve los detalles de comunicación, y vas a renegar menos.

Muchas veces un hardware sencillo lo único que hace es complicarte al tiempo de programar un proyecto.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado facundo_10

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 179
    • DAVINCIPIC
Re: Analizador Tramas VAN BUS
« Respuesta #2 en: 28 de Junio de 2011, 16:44:10 »
Mmm.. No sabría decirte , van bus puede que sea parecido a can bus pero creeme que no son compatibles, y eso plantea una duda al menos a nivel hardware( en el auto no funciona lo can con lo van) a la hora de analizar las tramas, no vi mucho de can bus me
voy a leer tu post pero si me decís que es igual el método de envió, pues podría funcionar, el hardware que uso es un adaptador de niveles para can asique supongo que manajen los mismos niveles, seria cuestión de leer un poco mas y probar el tema es que hay muy poca info sobre van bus.

Te agradezco por haber contestado al tema, 
PICMANIACO!

Desconectado facundo_10

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 179
    • DAVINCIPIC
Re: Analizador Tramas VAN BUS
« Respuesta #3 en: 28 de Junio de 2011, 18:11:13 »
PARA MGLSOFT:

VANBUS esta codificado usando enchanced manchester code, el mismo usa 5 bits cada paquetito de 4.

Es decir a 125kbits hay 8,13us por tiempo de bit, pero usando manchester code, se transmiten 5 bits, por ejemplo:

Si quiero transmitir una A o un 10 decimal, en binario es
1010
En Manchester Code: 10101 tengo 4 bits, y el ultimo bit es creado invirtiendo el cuarto bit.


binary 0000 = enhanced manchester 00001

Por esto, nose si VAN seria tan compatible con CAN bus.
PICMANIACO!

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Analizador Tramas VAN BUS
« Respuesta #4 en: 29 de Junio de 2011, 08:48:33 »
No entiendo porque utilizar un adaptador de niveles de CAN si entonces seria algo así como una comunicación en RS485, lo mas probable es que necesites ese chip especial que dices para adaptarte a los niveles.
El MCP2551 no solo es un transceiver sino que ademas controla otras cosas especificas del BUS CAN.
Por eso no creo que te sirva.  Salvo que hayas visto un proyecto donde lo utilizan con éxito.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado facundo_10

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 179
    • DAVINCIPIC
Re: Analizador Tramas VAN BUS
« Respuesta #5 en: 29 de Junio de 2011, 13:00:51 »
El circuito, esta probado y es funcional, el chip especial al que te referis es el TSS463 ? Es un dispositivo spi comun, que interpreta los datos y que es bastante dificil de conseguir, a mi tambien me parecio en un principio raro, pero quizas es solo para adaptar los niveles,

En la pagina que puse al principio del post, podras ver que el circuito es el mismo, y funciona perfecto.
PICMANIACO!

Desconectado facundo_10

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 179
    • DAVINCIPIC
Re: Analizador Tramas VAN BUS
« Respuesta #6 en: 29 de Junio de 2011, 22:41:10 »
Porfin algo de codigo ya realizado, el bus VAN, utiliza 2 lineas diferenciales, en concepto de diferencial, es que llevan los mismos datos pero invertidos, (una muy buena solucion al ruido), mas dentro de un coche, supongo que el MCP2551 tiene un papel importante en esto..

Luego de haber leido varios posts del amigo RedPic del foro, he podido empezar a fabricar algo de codigo:

Código: [Seleccionar]
#include "C:\Users\Facu\Desktop\Espejos Electricos\VAN BUS MONITOR\vancbus.h"
//DECLARACION DE VARIABLES-----------------------------------------------------
int i;
int1 flagToggleFlanco;
int16 t1=0x00,t2=0x00,tt=0x00;              // Variables para guardar estados de ...
float st=0.0;                               // TMR1 en cada flanco y hacer la resta
int1  flagHayDatos=0;                       // Flag para indicar que ya hay datos de ..
                                           // dos flancos (de subida y bajada)
int1  flagHayTransmitir=0;                  // Flag para indicar que hay datos para ...
                                           // Transmitir al PC.
                                           
//DECLARACION DE CONSTANTES---------------------------------------------------
float const uSxTick = 0.8;   
//-------------------------INTERRUPCION EXTERNA PIN_B0-------------------------
//UN time_Slice dura unos 8,3 microsegundos, por lo cual 1 tick a 40mhz, PLLX4,
//Usando divisor por 8, me da un tiempo de 0,8 us. Lo cual es bastante aceptable,
//por lo tanto un bit en alto/bajo me dura 10 ticks.
    #int_ext
    void handle_ext_int(){
     
      if(flagToggleFlanco==0){                 // He recibido Flanco de Subida
         
         t1=get_timer1();                      // En T1, almaceno el ancho del bit en estado alto.
         ext_int_edge(0,H_TO_L);               // Configuro para capturar siguiente flanco de Bajada
         flagToggleFlanco=1;                   // Indico que el siguiente flanco será de Bajada
     
      } else {                                 // He recibido Flanco de Bajada
     
         t2=get_timer1();                      // Guardo en t2 el valor de TMR1 al Flanco de Bajada
         ext_int_edge(0,L_TO_H);               // Configuro para capturar siguiente flanco de subida
         flagToggleFlanco=0;                   // Indico que el siguiente flanco será de Subida
         set_timer1(0);                        // Reinicio TMR1
         if(flagHayDatos==0){                  // Si los datos anteriores han sido procesados ...
            flagHayDatos=1;                    // Indico que ya hay nuevos datos de flancos para calcular
         }
      }
    }
     
//---------------------------------------------------------------------------
// CONFIGURACION DE LOS PUERTOS
//-----PUERTO TRANSMICION/RECEPCION--- PIN_B0
//-----PUERTO TRANSMICION/RECEPCION--- PIN_B1
//Los datos son enviados mediante un bus diferencial, por lo tal ambos cables
//poseen la misma informacion.
//CONFIGURACION RS-232
//xmit=PIN_C6
//rcv=PIN_C7
//----------------------------------------------------------------------------
void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF|ADC_TAD_MUL_0);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_OFF); // cada 8 us
   setup_timer_1(T1_external | T1_DIV_BY_4);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

      ext_int_edge(0,L_TO_H);                  // Configuro captura de 1er flanco de subida
      flagToggleFlanco = 0;                    // inicializo el Flag para cambiar de flanco
      enable_interrupts(int_ext);              // Habilito las interrupciones necesarias
      enable_interrupts(global);
     
  ext_int_edge(0,L_TO_H);                  // Configuro captura de 1er flanco de subida
  flagToggleFlanco = 0;                    // inicializo el Flag para cambiar de flanco
 

  printf("\r\nMidiendo un pulso : Width High\r\n");
  printf("By Redpic para Foro TODOPIC\r\n\n");
 
  do {
 
     if(flagHayDatos==1){                  // Detecto que ya hay datos de flancos ...
        if(t2 > t1){                       // Compruebo que estoy en la misma vuelta de TMR1
           tt = t2 - t1;                   // Calculo en Tick's de TMR1 el tiempo entre flancos
           st = uSxTick * tt * 10;              // Calculo en uS el tiempo.
           flagHayTransmitir=1;            // Indico que tengo nuevo valor para transmitir
        }
        flagHayDatos=0;                    // Indico que ya han sido procesados los datos.
     }
                       // Si el comando es 'T' (Transmite) ...
           if(flagHayTransmitir==1){       // Si hay algo pendiente de transmitir ...
 
              printf("Ticks %Lu - %Lu = %Lu = %3.1fuS \r\n",t2,t1,tt,st);
             
              flagHayTransmitir=0;         // Indico que ya he transmitido lo pendiente.
           }
       
  } while (TRUE);
}

El micro que estoy utilizando es un 18f2620, CON PLL ACTIVADO, con un cristal de cuarzo de 10mhz, por lo tanto obtengo unos 40 mhz, al ser la comunicacion a 125000 kbps, tenemos un bit cada 8us, por lo tanto teniendo en cuenta que la frecuencia de conteo, es la cuarta parte de la frecuencia de reloj (fosc/4), hice algunos calculos y a 40mhz me dio:

Por lo tanto un TimeSlice(tick) a 40 mhz, seria = 4/40000000 = 0,0000001 seg, lo cual seria 0,1 us, multiplicado por 8, es decir con un divider de 8, obtengo unos 0,8 us, lo cual no estan bueno como obtener 8us por conteo, pero significa que 10 timeslices, son 1 bit, ya sea en alto o en bajo.

Ahora va una pregunta para Redpic, si es que puede darse una vuelta por aqui, o para cualquiera que lo sepa, al usar interrupcion por el portb.0, en la trama VAN BUS nunca paran de llegar datos, asique supongo que voy a tener que tener una segunda interrupcion por timer0, o timer2, que tenga en cuenta el final del archivo, para que el analizador sea en tiempo real, tengo que capturar lo mas importante y que me sobre tiempo para poder hacer los calculos aritmeticos y muestrearlos, (la velocidad de rs232 es de 1mbps), por lo tanto lo mas importante seria el preambulo (para saber donde empieza el dato); el comando; flags; datos; CRC; y saber que ahi termina, al ser los datos variables ( la cantidad de datos van desde 1 byte, hasta 28 bytes) por lo tanto nose que tiempo puede durar el comando, debere usar el EOD (end of data como una interrupcion) para volver al main, hacer los calculos y muestrar.. Si hacemos las cuenta me queda muy poco tiempo, no creo que me quedan algo mas que unos 200us, (CON SUERTE)..

Un saludo!
PICMANIACO!

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Analizador Tramas VAN BUS
« Respuesta #7 en: 30 de Junio de 2011, 07:42:02 »
Si, lo de bus diferencial lo maneja el Bus CAN, aunque también lo hace el RS485.
El transceiver MCP2551 presenta ventajas, tanto en su velocidad máxima como en la tolerancia al ruido.
Ya vi la pagina, esta interesante.
Asumo que primero probaras el firmware que pone el autor, antes de largarte solo, no??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.