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:
#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!