top of page

Para la creación del software del microcontrolador PIC18F458, se utilizó el programa Flowcode for PICMicros V4 de Matrix Multimedia ( http://www.matrixmultimedia.com/ ).

 

El diagrama general del programa se muestra a continuación:

 

Software del prototipo

Como se puede apreciar en el diagrama general, el programa es cíclico. Se ejecutan las subrutinas de inicialización y luego se inicia un ciclo principal, en el que se establecen 3 modos principales de funcionamiento:

1. Modo Datos en tiempo real

2. Modo Escaner

3. Modo EEPROM (acceso a datos guardados)

 

En las subrutinas de inicialización, se cargan los procesos necesarios para el funcionamiento del display LCD, el bus i2c y la sincronización OBD2. En la inicialización LCD se cargan los caracteres personalizados que se visualizarán en la pantalla inicial.

 

 

Una vez desplegado el mensaje inicial con los caracteres personalizados, el programa consultará al módulo MicroOBD 200, por el último protocolo OBD utilizado, por lo que envía el comando AT DP (descripción de protocolo actual) seguido del caracter 0x0D, equivalente a ENTER o CAR RETURN en ASCII. El módulo MicroOBD 200 no ejecutará ninguna tarea si no se envía este caracter al final del comando. Posterior a esto, se inicia un proceso de 3 ciclos de lectura utilizando el macro de componente de Flowcode: RS232 Receive String.

Una vez que se ha indicado cuál es el protocolo OBD utilizado actualmente, el programa consultará si se desea cambiar, esto se debe a que si se revisa un vehículo con un protocolo diferente, será necesario establecer ese nuevo protocolo en el módulo MicroOBD 200. Si el usuario selecciona cambiar protocolo, se envía el comando AT SP 0, esto significa que se ajustará el protocolo a 0 (automático) por lo que el MicroOBD 200 se encargará de buscar el protocolo adecuado para establecer la comunicación con el vehículo.

 

MODO DATOS EN TIEMPO REAL

 

En este modo de operación se solicitan datos del vehículo reportados al sistema OBD II, estos datos o parámetros se conocen como PIDs (Parameter ID), existen una gran cantidad de los mismos, se pueden consultar en la dirección: http://en.wikipedia.org/wiki/OBD-II_PIDs . No todos los vehículos soportan todos los PIDs disponibles y es aqui donde esta herramienta se hace personalizable.  Dependiendo de la necesidad los valores solicitados se pueden variar. Como estos datos son en tiempo real, deben tener un ciclo de muestreo bastante rápido, por lo que cada comando debe enviarse en un ciclo máximo de 150 ms (mili-segundos). Al enviar el comando, se recomienda incluir un '1', de forma tal que el MicroOBD 200, se entere que la línea de respuesta a esperar es solo una, y no perderá tiempo esperando líneas de información inecesarias.  Una vez que se recibe la información, la misma debe descomponerse, separar las cadenas iniciales de 10 o 11 caracteres en cadenas más pequeñas, hasta llegar a valores de cadena de dos caracteres.  Esto es posible mediante la función de Flowcode, Right$ y Left$.  Estas funciones toman la cantidad de caracteres que le indiquemos a un lado o al otro de la cadena.  Una vez que tengamos separados los valores en cadenas de 2 caracteres, estos deberán transformarse a valores decimales, para poder aplicarles las ecuaciones necesarias para obtener su valor real. Esta conversión se realiza evaluando los caracteres ASCII obtenidos, si el valor es >64 o bién si éste es <64.  En el caso específico de este proyecto los datos solicitados se muestran en la siguiente serie de imágenes:

 

 

Finalmente, se realiza la operación de cálculo del valor y se envía al display LCD.  Como el display utilizado en este proyecto es pequeño (16X2) debe aprovecharse al máximo el espacio disponible para desplegar datos. Se realiza una distribución de datos en pantalla tal como se muestra en la imagen:

Cuando el usuario acciona un interruptor, se alternará entre las distintas pantallas que muestran los datos en tiempo real.  Al presionar el otro interruptor el programa saldrá del modo de datos en tiempo real y regresará al ciclo principal del programa.

 

MODO ESCÁNER:

 

En el Modo Escáner se solicitarán los códigos DTC activos. Cada código DTC es un código númerico que posee una descripción específica para cada uno. Estos códigos pueden ser genéricos (generales para todos los sistemas OBD II) y propietarios (específicos para cada fabricante).  El listado general de estos códigos lo pueden encontrar en la dirección: http://ebookbrowse.com/obd2-codigos-error-dtc-pdf-d346764394

Este listado de códigos se ha resumido y se ha cargado en las memorias EEPROM seriales 24C512. Cada código tendrá una descripción de 50 caracteres, separados por el símbolo (#). De esta forma en el primer banco de memoria 24C512, se podrán almacenar un total de 1310 descripciones de DTC de 50 caracteres, en el segundo banco se albergarán el resto. Cada código DTC tendrá una correspondencia en el banco de memoria, y esto se realizará mediante un 'offset' o desplazamiento de las posiciones de memoria, la cual está dada por la siguiente fórmula:  dtc1 = dtc + (dtc * 49)

 

El proceso de lectura es el siguiente:

1. Se envía el PID 01 01

Este PID devolverá una serie de bytes tal como lo muestra la siguiente respuesta típica: "41 01 81 67 54".  Nótese que este mensaje inicia con un 41, esto significa que se está respondiendo al servicio 01.  En los sistemas OBDII, para indicar respuesta a un servicio, se suma 40. Así una respuesta al servicio 1 iniciará con 41. Al servicio 2 se responderá con un 42, al servicio 3 con un 43 y así sucesivamente con todos los servicios del sistema OBDII.  Bien, volviendo a la respuesta típica del PID 0101, podemos notar que el tercer byte indica el valor 81.  En este byte se encuentra la cantidad de DTCs activos o reportados al sistema OBDII. Para obtener la cantidad de DTCs debemos restar 80 a este valor. Por tanto, de acuerdo a este ejemplo, la cantidad de DTCs activos es igual a 1. Una vez que conocemos la cantidad de DTCs activos y que se ha desplegado en el display LCD, podemos proceder con el siguiente paso.

 

2. Se envía el comando 03

Al enviar el comando 03 obtendremos una respuesta típica de la siguiente forma: "43 01 41 00 00 00 00" los sistemas OBDII reportan hasta 3 códigos DTC por línea.  En este ejemplo el código DTC será P0141.  El programa deberá aplicar la fórmula del offset y validar a cual banco de memoria 24C512 corresponde la posición de memoria 141. También se realiza una conversión a binario para determinar el número de dirección de memoria ALTA y BAJA.  Como este valor es inferior a 1310, corresponderá al banco 1. Iniciará entonces el proceso de extracción de caracteres de esta posición. Para realizar este proceso, se utiliza el componente de Flowcode I2C MASTER y se envían los comandos de escritura de posición, (primero se escribe la posición de memoria a ser leída) posteriormente se reinicia el componente I2C MASTER con su función Restart y se procede con la lectura de caracteres. Cada caracter es evaluado y si alguno corresponde con el valor 0x23 (#) se suspende el proceso de lectura.

Una vez leído se ofrecerá la opción de borrar el código DTC reportado mediante el servicio 04 del sistema OBD II.

 

3. Se envía comando 04

En este servicio por definición del sistema OBD II, se borrarán todos los códigos DTC presentes en el sistema, no es posible borrarlos de forma individual.  Una vez borrado la luz MIL o luz de CHECK ENGINE deberá borrarse.

MODO EEPROM

 

Finalmente se tiene el modo EEPROM, en el que se almacenan datos en la memoria interna del PIC18F458. Este modo puede modificarse para guardar mayor cantidad de datos.  Por el momento este dispositivo solo almacena el último DTC leído.

 

Adjunto se encontrará el código C del programa de este proyecto. Espero que les sea de utilidad. El archivo se encuentra en un sitio de almacenamiento gratuito, por lo que no es posible garantizar la integridad del mismo, que se encuentre libre de virus informáticos o cualquier afectación por ventanas publicitarias emergentes o publicidad incluída en la misma página.  La descarga se realiza bajo su propio riesgo.

 

Código C

 

 

Desarrollado por: Ing. Badir Paniagua

bottom of page