PLC clónico de Hitachi EC

Puerto serie en PDA Acer n35

Programador Pablin 2 Reloaded

Hasta ahora he estado usando un grabador de PIC comercial. Eso no tiene ningún interés, voy a construir uno casero. Me ha gustado el Pablin II, parece bastante bueno.

He visitado http://personales.ya.com/cepalacios/ProgramadorMarco.htm y he copiado el esquema del programador. El funcionamiento y configuración del Icprog105D están también explicados en esa misma página. Sin embargo he visto el foro de ARDE posts de gente quejándose de problemas con la alimentación y el funcionamiento del circuito. Efectivamente, este programador se alimenta a 13,5 Voltios y eso complica un poco encontrar un alimentador adecuado.

Analizando un poco el circuito se ve la razón de esa tensión de alimentación tan rara. Los PIC necesitan entre 11 y 13,5 V para MCLR/VPP durante la lectura o la grabación de su memoria interna. En el Pablin 2 del esquema de abajo esta tensión se consigue cuando cualquiera de las salidas D3 o D4 del puerto LPt están a 1. Entonces Q2 está saturado y corta a Q1 al poner R7 a masa (si no Q1 se se satura a gracias a +13,5 V a través de R6 y R7). Con Q1 cortado en la pata VPP aparecen los 13,5 V a través de R4 de 1K (que actúa de limitadora de corriente) y ¡el diodo led D4!. El diodo led D4, que no luce durante la programación porque la corriente que absorbe VPP es muy pequeña) tiene una caída de tensión típica de 1,5 V (si es rojo). Entonces tenemos que 13,5 V – 1,5 V = 12 V que es la tensión adecuada para VPP. Si usamos 12 V de alimentación en VPP solo tendremos 10,5 V, que está por debajo de las recomendaciones de MICROCHIP. Si alguien pone un LED verde en D4 (2 V de caída) o de otro color verá que el programador funciona cuando le da la gana porque la tensión que le llega a VPP no llega a 11 V..

Esquema grabador

Con esta pequeña modificación conseguimos los 12 V a partir de una alimentación de 12 V. Ya podemos reciclar los alimentadores de los móviles viejos o los del módem de 33K. Este es el esquema de la modificación:

Detalle alimentación

Se trata de quitar el LED D4 del colector de Q1 de forma que la alimentación pasa sólo por R4 y va a VPP sin más caídas de tensión (excepto la caída en R4, pero como la corriente por R4 y VPP es muy pequeña no es apreciable). Para seguir teniendo señalización del estado de la grabación pongo en LED D4 en el colector de Q2 con una resistencia en paralelo de 1K (el único componente que hay que añadir). De esta forma el LED D4 se enciende DURANTE LA LECTURA o PROGRAMACIÓN, al contrario que en el Pablin 2 original. Me parece más lógico: LED rojo encendido PELIGRO no toques nada!! EL diodo en esta situación no interfiere para nada en el corte o la saturación de Q1 (resta 1,5 V pero la corriente sigue siendo suficientemente alta para saturarlo). La nueva resistencia R8 en paralelo con el LED sirve para evitar que la pequeña corriente que circula por D4, R6, R7 y base emisor de Q1 encienda débilmente el LED cuando no se está programando (Q2 cortado). Hace que la tensión en los extremos de D4, con esta pequeña corriente, baje de 1,5 V y ya no puede encenderse. Cuando Q2 conduce la corriente es mucho mas alta y se enciende sin problemas.

También he puesto un jack para aprovechar un alimentador viejo y un interruptor de encendido – apagado (ON/OFF) para evitar tener que poner y quitar el PIC con tensión.

Esta es una foto de mi versión del Pablin 2 con un 16F876A pinchado y listo para ser programado:

Grabador montado

He utilizado placa protoboard (de “topos”) e hilo de 2 décimas aislado en teflón, creo que es la forma más rápida y segura de hacer prototipos. Pueden verse unos jumpers de colores y un 7812, modificación de última hora, para poner o quitar diodos serie a la pata de masa del 7812, y poder variar la tensión de salida a 12,7 V ó 13,4 V. De esta forma puedo alimentar con 15V o más sin problemas.

Grabador pistas

Probado satisfactoriamente con: PIC18F252, PIC16F877A, PIC16F876A, PIC16F628A, PIC16F84, PIC16F84A

Fallos conocidos:

NO es posible programar los PIC16F628 si se configura la pata MCLR como I/O (casilla MCLR desactivada). Parece ser que el algoritmo de programación que usan tanto Icprog105D como WinPic800 NECESITAN resetear el PIC poniendo MCLR/VPP a 0. Si se pone el bit MCLR a 0 la pata MCLR/VPP no resetea el micro y la grabación falla siempre.

How to: Bootloader para PIC16F876A

Después del éxito del “Pablin 2 reloaded” había pensado en diseñar un programador propio con ICSP, porque algunos detalles del diseño del programador Pablin 2 siguen sin gustarme. Pero he oído hablar del Bootloader y me he decidido por él, para micros con bastante memoria es mucho más cómodo.

¿Que es un Bootloader? Es un programa muy pequeño (256 bytes en este caso) que permite descargar programas al PIC usando únicamente el puerto serie, sin ningún hardware adicional.
¿Que ventajas tiene? Solo es necesario utilizar un grabador de PIC una vez, para grabar el programa Bootloader. Podemos hacerlo con un grabador prestado. Una vez cargado el Bootloader en el PIC ya podemos descargar en él nuestros programas vía serie, sin necesidad de grabador, todas las veces que queramos. Si nuestro hardware incorpora puerto serie no es necesario quitar el PIC de su zócalo: usando el puerto serie de nuestro proyecto hacemos la descarga.
¿Como funciona? El Bootloader se carga en el final de la flash de programa del PIC y coloca el vector de interrupción de arranque apuntandolo. Arranca cuando alimentamos el procesador y espera un comando por el puerto serie. Si no lo recibe continua con la ejecución normal de nuestro programa. Si lo recibe comienza a recibir un programa por el puerto serie y a grabarlo en la flash de programa del PIC.
¿Que necesito? Es necesario tener el Bootloader configurado para nuestro hardware y cargado en el PIC, una conexión serie con el PC y el programa descargador (por ejemplo PICbootPlus).
¿Tiene algún inconveniente? Si. Es necesario modificar nuestros programas para que puedan trabajar con el Bootloader. Según el entorno de desarrollo Mplab, CCS, Hitech-C etc es más o menos complejo, pero la modificaciones suelen ser incluir unas pocas líneas de código. Además no podemos usar los últimos 256 bytes de memoria (en un PIC16F876 de 8K de memoria es el 3,1 % inutilizable)

Cómo se hace:

Yo he usado el Bootloader de Microchipc: http://www.microchipc.com/PIC16bootload/index.php, he descargado la última versión: Download Shane Tolmie PIC bootloader v9-50.

Alternativamente pueden descargarse los archivos de mi servidor: Shane Tolmie PIC bootloader v9-50. Una modificación del software de comunicación, con mini terminal y alguna opción para depuración de protocolo serie (incluye fuentes en Builder 6): picbootplus2.rar

Una vez descomprimido el archivo vemos que contiene muchos ficheros. En la carpeta “bootloader hex files for 16F87xA compatible bootloader” hay Bootloaders ya ensamblados y configurados para distintos cristales y velocidades de comunicación, para el PIC 16F876A, y para el PIC 16F876 en “bootloader hex files for 16F87x compatible bootloader”. Sin embargo nos advierten que son versiones antiguas y que es mejor compilar nosotros mismos la última con los parámetros adecuados.

En “assembly source for 16F87xA compatible bootloader” tenemos un proyecto para MPLAB con un fuente en ensamblador (bootldra.asm) que tenemos que modificar según nuestras necesidades. Esta es la zona a modificar:

;================== User setting section ======================================

list p=16f877a ; <<< ajusta el tipo de PIC ( por defecto 16F877a, ponerlo a 16F876a ) ; poner el mismo PIC en las opciones del proyecto de MPLAB #define ICD_DEBUG 0 ; <<< si se usa el depurador MPLAB ICD, bajar el downloader 256 bytes para hacerle sitio [0|1] #define FOSC D'20000000' ; <<< Poner la frecuencia de nuestro cristal [Hz], max. 20 MHz ;#define BAUD D'38400' ; <<< poner la velocidad de comunicación con el PC: baud rate [bit/sec] #define BAUD D'19200' ; <<< set baud rate [bit/sec] #define BAUD_ERROR D'4' ; <<< Poner el error de velocidad de comunicación [%] NO LO HE TOCADO #define TIME ; <<< Poner el método de arranque del bootloadert PIN/TIME ; PIN : arranca al poner el pin de aranque a cero ; TIME: arranca si se recibe el comando IDENT dentro de un tiempo definido por TIMEOUT #define TRIGGER PORTB,7 ; <<< solo si se usa PIN - poner el puerto y el bit: PORT_X,PIN_NR #define TIMEOUT D'2' ; <<< solo si se usa TIME - poner el tiempo [0.1s], max. 25 sec #define WATCHDOGTIMER 0 ; <<< Watchdog timer por defecto a OFF/ON [0|1] Una vez modificado ensamblamos nuestro proyecto (yo he usado el MPLAB 7.01) y obtenemos un " bootldra.hex" que es lo que tenemos que grabar en el PIC, usando un grabador convencional. En las carpetas "Downloader.... " hay varios descargadores para diverss sistemas operativos, según nuestras necesidades. En "Downloader Windows in BC++ plus terminal" tenemos el "PICbootPlus.exe" que es el descargador que he usado yo. En la sección de Microchipc Frequently Asked Questions (FAQ) encontramos preguntas y respuestas a problemas comunes con el Bootloader. Yo uso el compilador CCS 3.236, y me informa que para adecuar mis programas al uso del Bootloader tengo que incluir esta línea en mi fuente en C:

#org 0x1F00, 0x1FFF void loader16F876(void) {} //protect bootloader code for the 8k 16F876/7

Que sirve para que el compilador reserve memoria para el Bootloader e informe si mi programa lo va a machacar.

Una vez que hemos grabado el PIC con el Bootloader y pinchado en nuestro hardware, con su puerto serie conectado al PC, y hemos compilado nuestro programa con la modificación correspondiente podemos descargarlo en el PIC. Ejecutamos el “PICbootPlus.exe” y con el botón “search” buscamos el fichero .hex que queremos descargar. El nombre aparecerá en la ventana a la izquierda de “search”. Ajustamos el puerto COM1 o el que usemos en el apartado Port y la velocidad igual a la que hayamos configurado en el Bootloader en el apartado BaudRate. MArcando EEPROM descargamos también en el PIC la eeprom de datos. Estos datos son memorizados en un fichero .ini para la próxima vez que usemos el “PICbootPlus.exe”.

Pulsamos el botón “Write” y en la ventana “info” aparecerá “Reset” ya al momento “Searching for Bootloader”. El “PICbootPlus.exe” está enviando el comando IDENT al PIC, y espera contestación. En este momento alimentamos nuestro PIC y, si la comunicación es correcta, aparecerá “Writing, please wait” y una barra de progreso comenzará a avanzar de izquierda a derecha. Cuando haya terminado aparecerá “ALL OK!” y ya está grabado. Cada vez que recompilemos nuestro programa solo tenemos que repetir este proceso y ya estará grabado el PIC de nuevo.

En la parte inferior del “PICbootPlus.exe” tenemos un mini terminal serie con el que podemos comunicarnos con nuestro programa una vez que ha sido cargado en el PIC. Solo tenemos que ajustar la velocidad acorde con la que hayamos puesto en nuestro programa (que no tiene nada que ver con la que tenía el Bootloader).

IMPORTANTE:

Desde que arranca el programa Bootloader hasta que le transfiere el control a nuestro programa, TIMEOUT segundos que por defecto son 0,2 segundos, las patas del PIC están todas como ENTRADAS lo que significa que, las que tengan que ser salidas, serán vistas por los chips auxiliares como a 1. Durante la carga del programa esta situación se prolonga TODO EL TIEMPO que dura la carga (varios segundos). En mi caso el L293D que controla los motores “ve” las salidas PWM a 1 durante este tiempo y se conectan los dos motores a la vez, hasta que arranca mi programa y controla las patas del PIC. Hay que tenerlo en cuenta y usar lógica negativa en las salidas (que activen las cosas con un 0), si es posible, o poner un interruptor de corte de potencia para evitar movimientos incontrolados durante este tiempo.

Si se coloca un inversor en las salidas PWM para que sean activas a 0 en vez de a 1 en el programa escribir un valor 0 en el PWM dará la máxima salida y un valor 255 (para 8 bit) dará la mínima salida. En C de CCS se puede escribir:

unsigned int ciclo;

set_pwm1_duty (ciclo): // Para lógica positiva de las salidas

set_pwm1_duty(255-ciclo); // Para lógica negativa de las salidas

Conversor RS232 a TTL

Creo que todo el mundo conoce el modo de hacer un conversor de niveles RS232 a TTL usando el MAX232 o similar. Aquí propongo hacer un “cable conversor” que sirva para todos nuestros proyectos donde la comunicación sea ocasional. Esto evita tener que poner un conversor en cada montaje.

Este es el esquema del conversor, no tiene mayor complicación. Seguro que ya lo hemos visto muchas veces.

Esquema conversor

Esta es la lista de materiales:

1 Circuito MAX232CPE. Puede utilizarse cualquier otro compatible o similar, adecuando los valores de los condensadores a las necesidades del circuito.
4 condensadores de tántalo de 1 microfaradio 25V. Algunos circuitos compatibles con el MAX232 solo necesitan 100 nanofaradios.
1 condensador 1 microfaradio 16V. Es para desacoplar la alimentación y evitar que el ruido generado por el circuito produzca interferencias en otros componentes.
1 conector DB9 hembra. Es el que conecta con el puerto serie del ordenador.
1 conector macho o hembra de 4 pines para cable.
N conectores complementarios del anterior para poner en cada uno de nuestros proyectos.
2 metros, o lo que creamos más conveniente, de cable de 4 x 0,25 o similar. Cuanto más flexible mejor.

Esta es la foto de mi conversor con 3 metros de cable. He usado un conector hembra en el cable y pongo un macho en cada circuito que hago.

Cable

Aquí se ve el detalle del conversor. He usado placa de circuito impreso pretaladrada de islas y cable de 0,2 mm aislado para hacer las conexiones. Luego he fijado con pegamento térmico el conector DB9 y el cable para que no se mueva con el uso. Los condensadores los he puesto bajo el circuito integrado, que se monta elevado mediante dos zócalos. La alimentación se obtiene por el conector de 4 pines del circuito con el que comuniquemos.

De esta forma el tamaño es casi como un conector DB9 con carcasa.

Detalle del cable

Una ventaja importante de este sistema es que, además, sustituimos el conector DB9 caro y grande por otro de 4 pines de un modelo a nuestra elección, que puede ser más pequeño y barato. Es importante que este conector de 4 pines que usemos lleve algún tipo de polarizador o “llave” para evitar que podamos conectarlo al revés. El que yo he usado no puede ponerse al revés gracias a la forma de la carcasa de plástico.

Una buena forma de poner llave (o polarizar) en un conector es usar uno de un un pin más de lo necesario. Se corta el pin sobrante del conector macho y se introduce en el conector hembra con pegamento. Además podemos cortar un pin distinto en cada conector de nuestro montaje, de manera que no podamos intercambiar las conexiones por error, aunque los conectores tengan el mismo número de pines.

Pines con key

Utilizando este “cable conversor” ahorramos tener que poner en cada montaje un conversor, útil cuando la comunicación es solo ocasional (si va a haber comunicación RS232 permanente es mejor poner el conversor en el propio montaje). Ahorramos dinero, centímetros cuadrados de circuito impreso, peso y consumo de baterías, poco pero todo cuenta para el total…

Reciclando y cargando baterías

Es fácil encontrar baterías estropeadas en teléfonos móviles, juguetes, videocámaras y muchos otros chismes de electrónica de consumo. Reciclarlas también es fácil cuando se conoce un poco sobre su funcionamiento.

Estos 3 teléfonos móviles (del año 2000) pueden servir muy bien como fuente de baterías para nuestros proyectos.

Teléfonos

Después de abrir los paquetes de baterías comprobamos que cada uno contiene 4 células de NIMh de 650mAh. Abrir los paquetes es fácil, llevan unas pestañas que hace que enganchen las dos piezas de la carcasa, aunque la mayor parte llevan, además, pegamento. Cuidado de no perforar las baterías o hacer un cortocircuito al apalancar para abrirlas.

Ahora hay que comprobarlas a ver cuales están en buen estado. Para ello lo primero es cargarlas. Al ser de NIMh se cargan igual que las de NICA, a corriente constante. Podemos alimentarlas a 65 mA durante 12 horas (1/10 de la capacidad nominal) , aunque yo voy usar 325 mA durante 2 horas (1/2 de la capacidad nominal: 650mAh). En este último caso hay que acordarse de respetar el tiempo de carga para no sobrecargarlas. Para conseguirlo coloco una resistencia de 2,7 Ohmios en serie con la batería y en serie con un amperímetro y alimento con una tensión variable hasta conseguir los 325 mA. Conforme la batería se carga disminuye la corriente y hay que aumentar la tensión. Esto se soluciona con el cargador que propongo más adelante pero de momento sirve para probar las baterías. Si no es posible conseguir la corriente deseada con una tensión prudencial es que hay una célula en la serie que esta averiada (demasiada resistencia interna). En ese caso hay que intentar cargarlas una a una. La que no absorba corriente es la averiada. Se elimina de la serie y se continua con una célula menos en esta batería.

Cargando baterias

Una vez que se han cargado (una batería de NICA o NiMh tiene 1,42V recién cargada, en vacío) se conecta un voltímetro en paralelo con UNA de las células y se descarga con 1/5 de la corriente nominal. En el caso de 650 mA son 130mA que corresponde con una resistencia de 9,2 Ohmios (1,2V nominales / 0,130 A), podemos usar una de 10 Ohmios. La resistencia disipará (1,2 V * 0,130 A = 0,156 Watios), hay que dimensionarla de forma adecuada porque puede salir un valor alto de potencia y calentarse mucho con baterías de alta capacidad. Si la tensión se mantiene por encima de 1,2V más de un par de minutos la batería está bien (puede que envejecida, pero no averiada). Si la tensión cae rápidamente la baterías esta averiada, no ha aceptado la carga y hay que desecharla. Estas baterías hay que depositarlas en los contenedores adecuados, son muy contaminantes.

Estas pruebas son muy genéricas, pero sirven para aproximarnos al estado cada célula de las baterías. En mi caso están bien todas las células. Desmonto las 3 baterías de 4,8 V (4 células) y construyo dos de 7,2 V (6 células). En la foto pueden verse los materiales que voy a utilizar para construir un cargador para dos baterías, con dos modos de carga: rápida de 2 horas o lenta de 12 horas.

Piezas cargador

Este es el listado de materiales:

2 baterías de 7,2 V 650 mA recicladas.
2 conectores de 3 pines para las baterías.
Tubo termoretractil para sujetar las baterías. Pueden pegarse con pegamento térmico pero luego es más complicado desmontarlas si se avería una célula. No aconsejo cinta aislante porque se ablanda con el calor.
Cable y conector de 3 pines. Cada par es de un color distinto para distinguir las baterías. Uso un conector de 3 pines aunque solo hay 2 cables porque así no es posible conectar la batería al revés, importantísimo.
Alimentador de 12 V 700 mA CC reciclado de un switch ethernet roto.
Conector hembra, adecuado al macho del alimentador utilizado.
Radiador reciclado de un 486.
3 Tornillos de 3 mm.
2 separadores aislantes, en la foto no se ven las láminas de silicona.
2 reguladores LM317
Circuito impreso de islas pretaladrado.
2 Diodos 1N4007.
2 conmutadores de 1 circuito
Juego de resistencias. Depende de las corrientes de salida. En este caso 2 de 18 Ohmios para la salida de 65 mA y dos de 3,7 Ohmios para la de 325 mA (construidas con el paralelo de 3,9 y 100 Ohmios).
1 Resistencia de 1K y un led verde para un indicador de funcionamiento, no se ven en la foto.

Este es el esquema del cargador. En la posición A del conmutador se carga a 325 mA 2 horas y en la B a 65 mA 12 horas. Es posible cargar las 2 baterías a la vez, con la misma o distinta corriente. Cuando se usa el modo de carga rápida hay que acordarse de respetar el tiempo de carga, el circuito no lleva temporizador y tenemos que desconectar la batería nosotros mismos. En el modo de carga lenta a 1/10 de la corriente nominal no pasa nada si mantiene más de 12 horas.

Esquema  del cargador

Este cargador está basado en una nota de aplicación de National sobre el LM317. El regulador trata de mantener entre la pata ADJ (R) y Vout (S) una tensión de 1,25 V (en otros datasheet del LM317 dicen 1,20 V, depende de fabricantes). Si se usa el montaje de la foto en la resistencia siempre caen 1,25 V y la corriente de salida depende de la fórmula: Iout=1,25/R1 los límites de R1 dependen de la mínima y máxima corriente regulable por el LM317.

Las fórmulas usadas para los cálculos son:

Valor de la resistencia para una corriente dada: R = 1,25 V / Iout
Potencia disipada en la resistencia (1,25 V * Iout) Watios. Para 3,75 Ohmios (3,9 en paralelo con 100 Ohmios) 1,25 V * 0,333 A = 0,416 basta con una resistencia de 1/2 Watio. (Realmente al haber un paralelo de dos resistencias de distinto valor hay que hacerlo independiente para cada resistencia). Estos calculos solo dependen de la corriente de salida, son independientes de la tensión.
Potencia disipada en el regulador: caen (Vin – 1,25 V – Vout) Voltios, multiplicado por Iout salen los Watios. En el peor caso: batería descargada completamente Vout = 0 V sale: 12 V – 1,25 V – 0,7 V – 0 = 10,05V (hay un diodo en serie con la batería donde caen 0,7 V). Esta es la máxima tensión que entregará el circuito que lo limita a cargar baterías de menos de 10 V. Para otras baterías de mayor tensión hay que usar más de 12 V de alimentación y repetir los cálculos de potencia disipada en el regulador. La potencia es: 10.05 V * 0,333 A = 3,35 Watios. Con un pequeño radiador bastará. Conforme la batería se valla cargando Vout aumenta y la disipación disminuye.
Corriente en el LED verde 10 mA: sale una resistencia de 12 V – 2 V / 0,010 A = 1000 Ohmios. La caída de tensión en los LED verdes es de 2 V, en los rojos de 1,5 V.
Corriente máxima del alimentador = Iout1 + Iout2 + ILED = 0,333 A + 0,333 A + 0,01 A = 0,676 A. Bastará uno de 700 mA

Los 325 mA es el valor teórico que busco, se consiguen con 3,7 Ohmios, pero como uso un valor real de 3,75 Ohmios salen 333 mA. Hay que repetir los cálculos para 0,65 mA, salen unos valores de disipación tan bajos que con 1/4 de Watio de resistencia y el LM317 sin disipador funcionaría.

Cargador LM317

Este es el cargado terminado y cargando las dos baterías.

Cargador

Esta es la cara de “pistas” (yo he usado cables) del cargador. Solo falta pegar una lámina de plástico para protegerlo de cortocircuitos.

Cargador pistas

Espero que haya quedado claro como construir este cargador y las fórmulas para hacerlo “a la medida”, en cualquier caso acepto consultas…