Me gustaria compartir con ustedes mis conocimientos sobre programadores.
Prologo (No es necesario leerlo
)
Mis inicios en la electronica se remontan al rededor de 1990. Yo con 6 años ya me dedicaba a romper todo aparato electronico que caia en mis manos desmenuzandolo pieza por pieza. Años mas tarde mi aficion empezaba a ser menos apocaliptica, desarmaba todos los aparatos electronicos,
y si podia los volvia a armar
Desde una linterna hasta mi Super Nintendo. Gracias a dios mi Snes sigue viva! Cuando consegui volver a armar con exito las cosas que habia desarmado me interese en aprovechar las cosas que no consegui volver a armar, utilizandolas en "algo". Ese "algo" fue mi primer gran proyecto. Un robot a radio control! Montado sobre la estructura de mi Typhon II Hovercraft R/C de Tyco.
Por supuesto desarme el juguete mil y una vez... hasta que no volvio a funcionar.
Desde entonces hasta el dia de hoy he montado (y desmontado) muchas cosas, y cada vez mas complejas. Pero me tope con un proyecto en el que me di cuenta que mi electronica basica no era suficiente. Asi que hace 2 años me inscribi en una formacion profesional de electronica. A los pocos meses de inscribirme descubri este foro... Y me di cuenta que aqui encontraria toda la informacion necesaria, pero sobre todo gente con la que colaborar y compartir ideas. Es por eso que deje de estudiar (y porque las clases eran por la mañana
).
Cuando descubri los PICs me dio un poco de panico, el potencial que estos ofrecen es mucho mayor a la complejidad y conocimientos necesarios para poder utilizarlos. Pero poco a poco fui dandome cuenta que con un poco de ganas puedes hacer de todo con estos bichitos. Lo primero que tuve que hacer para empezar a jugar ellos fue un programador. Encontre el Pablin II que parecia sencillo y lo construi. Por supuesto que por muy sencillo que fuera no entendia el porque de cada componente. Logico, si aun no entendia que era y como funcionaba un PIC. La verdad tuve muchos problemas con mi programador. Vi demasiadas veces el error de verificacion 0x00
Esto me ha hecho buscar soluciones y hacer un programador nuevo aprendiendo de mis errores, y agregando mejoras. Ya voy por el 4º programador que armo, implementando en cada uno mejoras sobre el anterior.
Todo este camino ha hecho que sepa muchas cosas que me hubiera gustado saber desde el principio. Un programador QUE FUNCIONE es la base de un aficionado a los PICs. Por eso me gustaria compartir estas experiencias con el foro del que aprendi CASI TODO LO QUE SE.
Que es un programador?Un programador es una herramienta fundamental en la vida de un aficionado o profesional de los microcontroladores. Pero que es un programador?
Un programador se encarga de guardar un programa dentro de un microcontrolador. Para este proceso necesitamos el programa compilado en un archivo HEX que especifica la informacion bit a bit que se almacenara en la memoria del microcontrolador. El programa se puede realizar en multitud de lenguajes (C, ASM, Basic, etc..) pero luego hay que compilar este programa, es decir "traducirlo" a HEX, que es el lenguaje que habla nuestro programador y el microcontrolador.
Para programar se necesita un software y un hardware. El hardware es el que grabara fisicamente el microcontrolador, y el software es el intermediario entre nuestra PC y el hardware.
Modos de grabacionLos microcontroladores puen ser programados de 2 maneras:
- En un zocalo: Lo mas habitual es que nuestro programador tenga un zocalo donde insertar el microcontrolador y sea alli donde se programa.
- En el propio circuito de destino: Por muchos motivos es interesante poder programar el microcontrolador en el propio circuito donde luego hara su funcion. Esta manera de programacion se llama ICSP (In Circuit Serial Programing, o programacion serial en el circuito ) y basicamente es la extension de las "señales de programacion" desde el hard hasta el circuito definitivo del PIC.
Señales de programacionUn microcontrolador de la marca Microchip (PIC) necesita 5 señales para el proceso de grabacion. Esas señales salen del programador y llegan a las patitas de nuestro PIC. Las señales son las siguientes:
- Vss: Tambien conocido como Gnd es la alimentacion negativa. Los demas voltajes seran con respecto a el.
- Vdd: Es el archienemigo de Vss, si se juntan saltan chispas . Es el terminal positivo. La mayoria de las veces seran 5v, pero hay PICs que necesitan 3.3v. Estos incluyen la letra J o K en el modelo. No preocuparse por esto, probablemente no te toparas con estos individuos. No confundir "Low Voltage Programing" con los PICs que funcionan a 3.3v! (Si no sabes lo que significa esto, olvidalo)
- Vpp: Voltaje de programacion. Es el voltaje necesario para que el PIC entre en modo programaion y el programador pueda escribir el HEX. Coincide siempre con el pin MCLR del PIC. Para no confundirte, si Vpp vale sobre 13v esta bien. Dependiendo el PIC el margen es mayor o menor, pero nunca superior a 14v!. AQUI hay una tabla con los valores de Vpp admitidos por algunos PICs.
- PGC: Linea de reloj para la cominicacion serial. En algunos PICs aparece como "ICSPCLK". Por esta linea el programador transmite una señal de onda cuadrada entre Vss y Vdd marcando el pulso para la linea de datos.
- PGD: Linea de datos para la comunicacion serial. En algunos PICs aparece como "ICSPDATA". Por aqui el programador envia los datos a programar. Cada bit se transfiere en un flanco de bajada de PGC, es decir, en la transicion de Vdd a Vss.
Una vez sabido esto, es muy facil saber si un hard programador es compatible con el PIC que queremos programar. Primero si tiene ICSP es compatible por coj**es. Y sino, tendra uno o mas zocalos para colocar el PIC, hay que ver si alguno de los zocalos tiene una distribucion de los pines de programacion que coincida con nuestro PIC. Bien visto, cualquier PIC es compatible con cualquier programador, ya que si no tenemos el zocalo donde coincidan los pines de programacion de nuestro PIC, siempre podemos sacar 5 cablecitos desde el programador hasta un protoboard y programarlo alli... un ICSP casero
Señales de controlLas mencionadas anteriormente son las 5 señales que necesita un programador y
son las que se transmitiran al PIC. Para que el hard programe necesita la informacion proveniente de la PC, por eso nuestro hard programador puede ser por:
- Puerto serie
- Puerto paralelo (El que tratare mas a fondo)
- USB
Para el puerto paralelo (LPT) las lineas de control que tienen que venir desde el PC al hard son:
- Ground: Negativo.
- Vpp1: Señal de Vpp.
- Clock: Señal de clock.
- Data: Señal de datos.
Tambien hay una linea de control que es Data In, que va del hard al PC.
Como veis hay dos cosas curiosas aqui. Primero, las señales de control son las mismas que las de programacion. Esto es porque la informacion que reciba nuestro hard desde el PC, sera la misma que luego el hard enviara al PIC. ¿Y para que sirve el hard si la informacion la puede enviar el PC directamente? El hard lo que hace es acondicionar las señales que llegan y adaptarlas. El puerto LPT trabaja con señales TTL de 0v y 5v en la teoria. En la practica los voltajes
TTL comprenden de 0.2v y 0.8v para un CERO logico, y de 2.4v y Vcc para un UNO logico. Estos voltajes no se adaptan a lo que necesita nuestro PIC. Por eso nuestro hard se encargara de "convertir" un CERO logico a 0v, y un UNO a 5v.
Tambien ocurre que nuestro puerto paralelo no nos provee de voltaje suficiente para que el PIC entre en estado de programacion (13v), por eso el hard tambien se encargara de "convertir" una señal de Vpp de control, en 13v para la programacion.
La segunda cosa curiosa es que necesiamos solo 4 lineas de control, pero son 5 las de programacion.
Esto es asi porque no hace falta (aunque se puede) controlar Vdd. Es por eso que nuestro hard puede tener un regulador 7805 dando 5v constantemente a Vdd.
Aun habiendo 4 lineas fundamentales, existen otras que añaden funcionalidades extra. Pueden ser:
- Data In: Esta la utiliza el software de programacion para comprobar si el hardware esta funcionando correctamente. Cada bit que envia el soft al hard, luego el hard la devuelve por la linea de Data In. El soft combrueba que lo que se envio y lo que se recibio es lo mismo, y si no lo es hay algun problema en algun sitio. Creo que tambien se utiliza para leer la programacion del PIC y seguro para algo mas que no se :oops
- Vdd: Como dijimos antes no hace falta controlar Vdd desde el PC, pero hacerlo nos trae algunas ventajas (AQUI se puede ver una).
- Vpp2: Cumple la misma funcion que Vpp y solo se utiliza para la programacion en un zocalo. Debido a que cada familia de PICs (incluso dentro de la misma familia de PICs) tiene una distribucion diferente de los pines, seria imposible realizar un zocalo que se acomodara a todos ellos. Por eso alguna gente muy inteligente diseño zocalos que proveen el Vpp en un pin o en otro dependiendo que PIC sea, y asi utilizar un mismo zocalo para todos. Hay casos incluso de Vpp3 que cumplen la misma funcion.
- MCLR ICSP: Cuando programamos por ICSP nos puede interesar que una vez acabada la programacion, nuestro PIC se ponga a andar automaticamente. Esta linea se encarga de enviar un RESET al pin MCLR del PIC para que, concluida la programacion, comience a correr el programa recien grabado.
El puerto paralelo o LPTBien! Ya sabemos cuales son las señales que se necesitan para grabar un PIC, y cuales son las señales con las que podemos controlar nuestro hard. Ahora veamos como funciona el puerto paralelo.
AQUI y
AQUI encontrareis todo lo que necesitais saber y mas sobre este puerto, pero a modo de resumen esto es lo que hay que saber:
El puerto paralelo es un puerto fisico de nuestro ordenador, y puede haber hasta 3: LPT1, LPT2 y LPT3 con direcciones
base 0x378, 0x278 y 0x3BC respectivamente.
Cada uno de estos puerto cuenta con 3 "subpuertos" por decirlo de alguna manera. Estos 3 subpuertos se acceden independientemente el uno del otro teniendo su propia direccion, y es:
Bits de datos: Son los 8 bits de la direccion base. Se utilizan como SALIDA.
Bits de estado: Son los 5 mas significativos de la direccion base +1. Se utilizan como ENTRADA.
Bits de control: Son los 4 bits menos significativos de la direccion base +2. Son SALIDAS, pero pueden usarse tambien como entradas si se sabe como. (estos no los usaremos en el programador)
En esta imagen se puede ver la asignacion de pines y sus 3 tipos. Tambien se aprecia que hay pines "invertidos". En los bits de estado significa que cuando ese pin invertido este a "1", el PC leera un "0" y viceversa. Para los bits de control, significa que si enviamos un "1" a ese bit, saldra un "0" por el pin del puerto y viceversa
Si quereis jugar un poco con el puerto LPT podeis bajaros un programita que hice, y que sirve para controlar y monitorizar el puerto LPT. El programita se encuentra
AQUI y es este:
Suponiendo que queremos hacer un programador "con todas las de la ley" le pondremos 8 lineas de control:
GND, Vdd,
Vpp1, Vpp2,
Data,
Data In y
Clock y ICSP MCLR, siendo imprescindibles las subrayadas.
Ahora debemos asignarle un pin del puerto a cada una.
- GND no tiene opcion, se conectara al GND del propio puerto.
- Vdd, Vpp1, Vpp2, ICSP MCLR, Data y Clock son SALIDAS, y se deben asignar dentro de los bits de datos
- Data In es una ENTRADA y se asignara a un bit de ESTADO
Por defecto la configuracion de los pines es la siguiente:
PIN SEÑAL
2 Data
3 Clock
4 Vdd
5 Vpp1
6 Vpp2
7 ICSP MCLR
10 Data In
Si nuestro soft permite configurar los bits para las señales de control podremos diseñar nuestro hard a nuestro antojo. Un ejemplo practico seria la configuracion del
WinPic800- 1- Direccion base del puerto.
- 2- "Bit" nos permite asignas cada linea de control a un bit que queramos.
- 3- "Addr" nos permite seleccionar el registro que vamos a usar. Recordar: Datos = +0, Estado = +1, Control = +2
No es tan dificil una vez que sabemos como, verdad?
Tambien es bueno saber que la corriente maxima de salida de este puerto es de 2.6mA, y la corriente maxima de entrada es de 24mA. Con lo cual todo lo que supere estos valores hara PLOF a nuestro puerto.
Diseñar el HardwareComo dijimos antes, nuestro hardware se encargara de acondicionar las señales que nos lleguen por el puerto paralelo y las transmitira fidedignamente al PIC.
GND se conectara directamente con el GND de nuestro circuito, asi como con el Vss del PIC.
El resto de señales de entrada deben "pasar por algun lado" para convertirse en niveles validos. Hay MUCHAS maneras de conseguir esto, dos son las mas utilizadas:
Un integrado: hay muchos para elegir, entre ellos el 74LS04 (Inversor), 74LS07 (Buffer o seguidor, colector abierto), ULN2003 (Darlington, permiten hasta 500mA de salida!). Si vamos a utilizar un integrado de la familia
74xx, la mejor opcion seran los que tengan intercalada las letras "LS". Esto es porque son de la gama schottky de bajo consumo, esto nos garantiza una velocidad muy alta de transicion en la señal. Supongo que deberian funcionar bien tambien los "AS", "ALS" y "F", ya que en principio son mas rapidos que los "LS". Descartar por completo los "L", "H" y los "S", son lentos y obsoletos.
Transistores: hay miles de transistores diferentes, y muchisimas configuraciones posibles. Transistores NPN de uso habitual suelen ser: BC547 (100ma), 2N3904 (200mA) y BC337 (800mA). Y PNP, sus complementarios: BC557 (100mA), 2N3906 (200mA) y BC327 (800mA). Segun las necesidades usaras unos u otros.
Acondicionar Data y Clockes tarea sencilla. Simplemente haciendo pasar la señal por un integrado conseguiremos que se adapte a los valores que necesitamos, teniendo en cuenta que si utilizamos un inversor deberemos configurar nuestro soft para que envie la señal invertida, asi a la salida del inversor, la señal esta nuevamente "del derecho". Tambien podemos acondicionar Data y Clock con un transistor y un par de resistencias por cada uno.
Data In es probablente la mas facil de todas de acondicionar. Dado que es una linea de entrada, y por ella tiene que volver el dato que vino por Data, bastara con conectar Data In a la salida acondicionada de Data.
Acondicionar Vdd puede ser casi tan sencillo como Data y Clock. Un transistor y otro par de resistencias bastaran. Pero si pensamos en usar ICSP para programar, y queremos que esos mismos 5v sean los que den corriente al circuito, entonces necesitaremos un diseño mas cauteloso, mirando que nuestro circuito no demande mas corriente que la que el transistor pueda entregar.
La opcion mas facil y sin complicaciones seria no usar linea de control para Vdd, y simplemente podemos usar una fuente de alimentacion de 5v o si es mayor usar un regulador de tension como el 7805 para obtener los 5v. Estaran permanentemente encendidos y conectados al pin de Vdd. No hay mayor problema por esto.
Vpp1 y opcionalmente Vpp2 requieren algo mas de trabajo. Recordad que necesitaremos 13v para poder programar efectivamente. De donde sacamos 13v? Partimos de la base que un programador por puerto paralelo NO PUEDE darnos corriente suficiente para trabajar correctamente, por lo que se hace imprescindible la utilizacion de una fuente externa. Estas son las opciones:
Opcion 1: La mas facil, pero menos habitual, conseguir una fuente de alimentacion regulada que nos entregue entre 12.5v y 13.5v.
Opcion 2: nuestra fuente es de entre 15v y 30v, entonces podemos utilizar un regulador 7812 con 2 diodos entre Gnd del cricuito y Gnd del regulador, esto hara que haya una caida de 1.2v (0.6v en cada diodo) y en vez de entregar 12v como es habitual, nos entregara 13.2v, perfectos para Vpp.
Opcion 3: definitivamente la mas complicada, pero la mas recurrida cuando no hay de donde sacar suficiente voltaje (por ejemplo USB). Un STEP-UP, es decir, un elevador de tension. A partir de un voltaje conseguimos un voltaje superior. Pueden ser con voltaje de salida fija o voltaje de salida ajustable. El 34063AP es un integrado que hace exactamente esa funcion.
Opcion 4: Usar una fuente de 12v sera la opcion elegida por MUCHOS. Por suerte gran parte de los PICs les alcanzaran 12v para poder programarse efectivamente. Pero hay que tener cuidado, un LED mal colocado en la linea de Vpp puede hacer que nos caiga el voltaje (por la misma caida de tension del LED) y no sea suficiente para programar. Luego vienen los problemas de verificacion 0x00. Cosa muy habitual en los programadores tipo Pablin.
ICSP MCLR es una linea de control algo desconocida por mi de momento. Lo que tiene que conseguir es hacer un reset al PIC, es decir una bajada y luego una subida de tension en MCLR. Hay circuitos por ahi que utilizan esta funcion. Por ejemplo el
GTP Remake. Si os interesa incluir esta funcion investigad un poco. Solo se usa cuando programamos por ICSP. Esta linea de control es totalmente prescindible para los que recien estan empezando.
Aqui dejo algunas de las configuraciones mas utilizadas para comandar Vpp y Vdd
La señal del puerto paralelo entra por la base del transistor.
En el transistor NPN, cuando la señal enviada por el puerto sea un "1" pondra en saturacion el transistor y conducira, haciendo que la salida sea "0". Si la señal en la base es de "0", el transistor no conduce y la señal de salida es "1".
En el transistor PNP ocurre exactamente lo contrario, mientras haya un "0" en la base, el transistor estara en saturacion poniendo la salida en "1". Cuando la señal es un "1" el transistor entra en corto y la salida sera "0".
Una tabla de verdad para ambos transistores seria:
Entrada Salida
0 1
1 0
En este esquema se utilizan como ejemplo un integrado 74LS07 (buffer) y un 74LS04 (inversor).
En el caso del buffer y el NPN, la señal a la entrada sera igual que la salida del buffer (a la salida hay que poner un pull up, porque es open collector), por lo que si la señal enviada por el puerto es un "0", a la salida del buffer tambien lo sera, como tambien en la base del transistor, dejandolo en corto, por lo que la salida esta a "1". En el caso de un "1" proveniente del puerto ocurre lo contrario.
Tabla de verdad:
Entrada Salida Buffer Salida
0 0 1
1 1 0
Con el inversor y el PNP ocurre diferente. La señal a la salida del inversor sera la opuesta a la que haya a la entrada. Por lo que si viene un "1" por el puerto, a la salida del inversor tendremos un "0" que activara el transistor poniendo la salida a "1". La señal contraria dara lugar al caso opuesto.
Tabla de verdad:
Entrada Salida Buffer Salida
0 1 0
1 0 1
Cuando veamos en nuestra tabla de verdad que la salida es opuesta a la entrada deberemos configurar nuestro soft para que invierta la señal que se envia, sino cuando este dando una orden de poner a "1" la linea, estaria haciendo lo contrario.
Como veis no puse valores a las resistencias. Estas dependeran del tipo de transistor que utiliceis y de la intensidad que querramos que circule por el transistor. Podeis encontrar informacion de como calcular las resistencias de los transistores
AQUI Recordar que en la base del transistor no podemos poner nunca mas intensidad que la que nos puede entregar el puerto paralelo o el circuito integrado (mirar el datasheet del integrado).
Y hasta aqui llegan mis conocimientos. Espero haber sentado unas minimas bases para que cualquiera que quiera hacerse su propio programador pueda hacerlo sin DEMASIADOS problemas
Al que le interese puede encontrar mi programador actual
AQUI. En un par de dias subire el esquema.
Si necesitais esquemas para entender mejor y construir un programador dejo aqui unos links:
Por puerto paralelo:
Programador LPTPablin 1Pablin 2 (mi primer programador)
Programador Marco (mi segundo programador)
GTP - Remake+Por puerto serie:
Pipo2Simple PIC programmerPablin por puerto seriePor USB:
EclipseSalu2!
PS: llevo desde las 9 de la noche escribiendo, y ahora son casi las 6 de la mañana!
eso si, hice un descansito para cenar, y otro para ir al baño...
EDITO: estos dias hice alguna que otra pequeña modificacion sobre el texto, pero hoy agregue unos esquemitas de ejemplo para la creacion del hardware. (12/9/08)
EDITO2: agregue un link a un programita que monitoriza el LPT y que puede ser util (13/9/08)