jueves, 27 de agosto de 2015

Programando un microcontrolador 8051 ( STC 89c52 )

Para introducirme en la programación de microcontroladores (en adelante μC) adquirí hace tiempo una placa de desarrollo para la anciana arquitectura del 8051 de Intel (8bits), ya considerada un estándar de la industria. La placa incluía el μC STC 89c52RC de la casa STC Microcontrollers. Ésta es otra compañía china que fabrica derivados del original 8051 de los 1980’s, totalmente compatibles. Tales evoluciones del 8051 u 8052, igualmente compatibles, existen también de muchos otros fabricantes como la serie AT89 de Atmel, la XC800 de Infineon, la C8051 de Silicon Labs. y otros de NXP, Philips, Dallas, etc. e incluso la primera generación de la popular serie AVR de Atmel, AT90, aunque en este caso requiriendo alguna modificación menor. Por otro lado, también serían “adaptables”, al menos al mismo soporte físico (con el mismo pin-out o mediante adaptadores), los AVR posteriores de Atmel usados incluso en Arduino como el ATMega162, etc.

Adquirí este modelo precisamente porque era el más barato que encontré por el mercado chino y porque, a fin de cuentas, es más que suficiente para dar unos primeros pasos en este área.
https://lh3.googleusercontent.com/e_x8GpdwGb4s19-wJz5S4fra4V6LowwAqpS6kM0faw859yX5EIREluEf_ipgDSOkF8ufNv6mTJG9PD8g4Np_47h0206UYqf_zXu3ryeGOsVWsxGDBf9ZPIKSYla0ii653LvTsZJ5JwegcJub2g6BKe-3HkbfpxxZ7cjRiCgDt0SyPBedVHIVTELgTyeDZXuR-00lrVmSKpYSn51AkWJku2Rt-QFq_yB1s81n_Auh8hjBR8WPoGxNMSuuLVee7SUnuU1VfT8ee8UpgH4OpzNm_-ca8pRXABhSXH951YIwjnlI9HOZIpD0x-GuCPwV01VnT2-VfIYZAstDzZHXSOxPJcoFcnMGXzPAShQ3PvtrxkpO5Kjpq1b12608b3DGDireaETX2QtowBSPviqO_83joNdYrRzxwTJ_TRYhL6hGZtY0Tch2xE1ma6yBxWMCN35tOheQIW91hTj7puylH2Pays-GcNF-4A3-IwBt2yzE4b8M-b_qX9Xgvt9fPAXbalxPXGl6sXXKwcxSY6jAzPPjCgB21FHTdJnVYRD8aMySSlAHEsdHpcrAWBcJjIDSNpmRN7xLm_2Uq1jsWCUHHcyTJz7p7bdexztTndFV5oIY_QqtkoOalNm3vlW9O8vMfFuMRfs8CajBZHzd8McX1i54i3HACuJ5mcbSXSw=s310-no
El μC STC 89c52RC en un clásico encapsulado DIP de 40 pines. 
El principal problema de estos económicos µC’s STC es su menor documentación en idiomas distintos al chino y un peor reconocimiento por los programas habituales de programación. Sin embargo, una vez programados funcionarán igual que sus análogos de otros fabricantes. Por ello, me pareció interesante recopilar aquí toda la información encontrada del proceso que seguí para lograr programar uno de ellos (para continuar se recomiendan unos conocimientos mínimos de electrónica y lenguajes de programación, no obstante, intentaré explicarlo de la forma más llana y descriptiva).

Conceptos básicos necesarios para preparar y comprender el proceso:
  1. Una placa de desarrollo del µC.
  2. Un compilador cruzado.
  3. Un programador.

  1. Placa de desarrollo del µC.
    Consiste en una PCB (placa de circuito impreso) que aloja al chip del µC e incluye otros componentes para probar los programas. Tales componentes pueden ser otros IC (circuitos integrados) o componentes discretos como LED’s, botones y relés, así como pines, conectores y zócalos de expansión.

    Placa de desarrollo basada en microcontrolador (single-board microcontroller).
    Ésta en concreto es una 51/AVR Development Board con el STC 89c52RC incluido, arquitectura “8051”. Muy económicas ~20$ por el mercado chino, ya sean totalmente montadas o en kit para ensamblar uno mismo.
  2. Compilador cruzado:
    Un compilador cruzado es aquel capaz de crear el código máquina ejecutable de un programa para otra plataforma distinta a aquélla en la que el compilador se ejecuta. Precisamente lo que vamos a hacer, compilando desde la arquitectura del PC x86 ó AMD64 hacia la del μC 8051.

    Existen multitud de opciones pero la más simple para empezar sería Keil que ya incluye un IDE (entorno de desarrollo) µVision5 y el compilador cruzado C51 para lenguaje C.
    Hay una versión gratuita (https://www.keil.com/demo/eval/c51.htm) con la única limitación de 2kB para el programa objeto, algo suficiente para nuestros comienzos (nuestro µC sólo almacena hasta 8KB).

    Existen otros compiladores o IDE’s de código abierto y gratuitos válidos para el 8051 como:
    Atmel Studio 6 (http://www.atmel.com/tools/atmelstudio.aspx)
    MCU 8051 IDE (https://sourceforge.net/projects/mcu8051ide/)
    SDCC - Small Device C Compiler (http://sdcc.sourceforge.net/)
    Éstos últimos pueden ser más complicados de configurar así que, al menos para empezar, Keil sería una buena opción.


  3. Programador:
    Es una herramienta para transferir el código máquina generado por el compilador a la memoria del µC. Está conformado por una parte de hardware y una de software.
La parte física sería la placa o tarjeta programadora y su conexión con el PC.  En nuestro caso podremos programar directamente el µC mediante los puertos serie UART que dispone el µC y la propia placa de desarrollo (ya sea mediante interfaz RS232 o directamente a los pines del µC con niveles TTL, como veremos más adelante). Por supuesto, también podríamos programarlo mediante alguna tarjeta programadora dedicada.
La parte de software es el programa específico para reconocer y programar correctamente una serie de µC’s de un fabricante. En concreto, para nuestro STC necesitaremos el programa gratuito que facilita tal fabricante: STC-ISP v6.86 (en inglés) www.stcmcudata.com/STCISP/stc-isp-15xx-v6.86G.zip (revisar futuras actualizaciones).
Alternativamente y para entorno Linux, existen también los programadores STCgal y STCdude
(símiles del conocido AVRdude).


Una vez hayamos recopilado todas las herramientas necesarias y comprendamos algo su funcionamiento, vamos a programar el µC paso a paso con algún sencillo código de ejemplo.

Entrando en materia:

Paso 1: Instalar los drivers de algún adaptador USB-Serie (los hay ya muy económicos gracias a la invasión Arduino), sólo si no disponemos de ningún puerto 'serie' o COM; algo casi extinto en computadores actuales.

Tenemos dos opciones de adaptador serie: El USB-Serie RS232 que nos habilita un clásico ‘puerto serie’ UART con niveles lógicos de la interfaz RS232 (-10V, +10V), o bien un adaptador USB-Serie TTL cuyo puerto serie UART generado es de niveles TTL (0V, 5V).

El primer tipo [USB-Serie RS232] lo conectaríamos al puerto RS232 (generado por algún IC driver como MAX232) mediante el conector DE9 de la tarjeta programadora, mientras que el segundo tipo [USB-Serie TTL] lo podríamos conectar directamente a los pines RxD y TxD del µC (pins 10 y 11 del 8051, respectivamente), fácilmente accesibles en cualquier placa de desarrollo mediante cables Dupont. En este último caso, recordar permutar las conexiones Rx-Tx y Tx-Rx entre dispositivos y emplear cables cortos (<1m). (Aquí no son necesarios, si los hubiera, los pines RTS, CTS ni VCC. Sólo GND (tierra) y los RxD y TxD mencionados)

Los drivers del adaptador USB-Serie que empleemos se corresponderán con el modelo de chip que lleve, son habituales los siguientes: Prolific PL2303, HL340, FTDI FT232, CP2102, … fácilmente localizables por la web. Una vez instalados y conectado el adaptador, comprobamos que se haya creado correctamente un nuevo puerto serie (COM n) en el administrador de dispositivos.

http://dxg49ziwjgkgt.cloudfront.net/wp-content/uploads/2011/06/win7-04.png 
Paso 2: Probar el software programador, STC-ISP:

Descargar, descomprimir y simplemente ejecutar stc-isp-15xx-v6.86G.exe (al fin en inglés).
(Versiones anteriores a ésta última dejaron de soportar la serie 89c a partir de la v4.80 (sólo en chino) o la v1.80 (en inglés), además, en éstas anteriores puede ser necesario instalar algunas dependencias para correrlo en Win7 o bien ejecutar alguna versión instalable de las mismas. Por lo tanto, recomiendo ir directamente a la última versión de la web del fabricante si todavía existe).

En este punto podemos aprovechar para verificar el correcto funcionamiento del puerto serie y las conexiones. Conectamos la placa de desarrollo a un puerto serie de cualquiera de las formas ya explicadas y comprobamos que la herramienta STC-ISP detecta el µC. Para ello, desde su ventana principal pulsamos Check MCU y justo después alimentamos o encendemos la placa de desarrollo, no antes. Si todo está correcto, nos devolverá el modelo de µC detectado y podremos continuar al siguiente paso.
image

Paso 3: Instalar un entorno de desarrollo (o la cadena de herramientas: editor de texto, compilador, enlazador, ensamblador, depurador). Por sencillez, instalaremos el IDE Keil µVision y a continuación lo configuraremos para utilizarlo con nuestro modelo de µC.
Tras descargarlo de la web de Keil (Herramientas de desarrollo - C51) e instalarlo, necesitamos configurarlo para usarlo con los microcontroladores de STC. Aunque este fabricante no está disponible por defecto en la librería de dispositivos del Keil, afortunadamente STC Microcontrollers proporciona los recursos para incorporarlo a dicha base de datos.
Podemos hacerlo de dos formas:
  • Automáticamente, mediante una función incluida en el software programador que ya descargamos, STC-ISP v6.85 (este método sólo es válido desde la v6.16).
    Dentro del STC-ISP, pestaña "Keil settings", clicar en "Add MCU type to Keil", para añadir el faricante STC a la librería del Keil (nos pedirá la ubicación del programa).
O bien:
  • Manualmente, por si lo anterior falla, lo podemos descargar de STC Artifact o la web del fabricante.
  1. Copiar uv4.cdb en c:\keil\uv4\uv4.stc.cdb o la ubicación del Keil.
    (usar uv4.cdb para versión uVision 4 o posteriores)
  2. Actualizar el archivo c:\keil\tools.ini con lo siguiente: [uv2]
    CDB0=uv4\uv4.stc.cdb ("STC")
Desde ahora ya podremos ver los todos dispositivos de STC disponibles en el Keil µVision (File->Device Database).
image
Añadir las funciones específicas de los µC de STC (opcional): STC tiene su propio conjunto de SFR (Special Function Registers), éstas se definen en C mediante un archivo de cabecera de STC, consultar STCMCU.com o STC Artifact.

 
Paso 4: Escribir un programa sencillo en C usando el IDE Keil:

Iniciar Keil (IDE µVision5), crear un nuevo proyecto (Project - New µVision Project), darle nombre y seleccionar nuestro µC de la lista como Target Device.

Crear un archivo de código fuente en C y añadirlo al proyecto (doble clic sobre carpeta Source Group y añadir el archivo *.c con el código en C). (Os subo aquí este código de ejemplo de un sencillo programa que va activando secuencialmente las salidas de un puerto del µC 8051: ddisp2.c, ddisp2.hex)
image 
Compilar (Project – Build target) y depurar si oportuno, como haríamos en cualquier otro IDE.

Tras conseguir compilar sin errores, ya podemos crear el archivo *.hex que contiene el código máquina binario (codificado en sistema hexadecimal) que podemos cargar en nuestro µC. Para ello, configuramos algunos parámetros del µC, habilitamos la salida del archivo *.hex y compilamos de nuevo, tal y como se muestra en las siguientes imágenes:

image
image

Tras compilar de nuevo se nos habrá generado, entre otros, el archivo *.hex del programa, buscarlo en la carpeta de nuestro proyecto del Keil.


Paso 6: Cargar el código *.hex en el microcontrolador:
1 - Conectamos la placa al puerto serie, COM n (podemos comprobar en el administrador de dispositivos de windows el número de puerto asignado).
2 - Abrimos el programador de nuestro µC, en este caso STC-ISP (alternativa linux: STCgal).
3 - Seleccionamos nuestro tipo de µC de la lista.
4 - Cargamos el archivo *.hex del programa (por ejemplo ddisp2.hex), pulsando en Open Code File.
5 - Dejando el resto de parámetros por defecto, iniciamos la carga pulsando Download/Program.


Portapapeles-2
En este momento el programador se pone a la espera de un reinicio del µC. No se transferirá nada hasta entonces.
6 - Tras reiniciar o alimentar la placa de desarrollo comenzará automáticamente la descarga del código del programa a la memoria Flash ROM del µC.
Si todo termina sin errores, inmediatamente después ya veremos ejecutarse nuestro programa en la placa de desarrollo. Espero que la entrada haya sido útil y/o mínimamente didáctica.



image

Placa de desarrollo 'AVR/85' con el µC recién programado mediante un adaptador USB a Serie en niveles TTL (directamente a los pines RxD y TxD del µC). Alimentada también aprovechando el pin VCC de +5V del propio puerto USB.


Fuentes y enlaces de interés:

http://www.8052.com/ – Biblia de esta familia de microcontroladores y derivados (8051, 8052, 8031, 8032, …).
http://www.keil.com/download/list/c51.htm – Programas de ejemplo en C para la familia 8051.
http://openhardware.ro/stc-microcontrolers/ – Información y recursos para los microcontroladores STC.
http://www.stcmcu.com/ (chino) – Traducida al ingles – Web del fabricante STC Microcontrollers (software, datasheets, etc).

Los enlaces, programas y demás documentación caerán, cambiarán de dominio o quedarán obsoletos; solución: motor de búsqueda.

lunes, 17 de agosto de 2015

BGA Rework Machine. GarageRework.

Proyecto de una BGA rework (reball & reflow) machine modesta y funcional para este verano. Muy útil para reparaciones esporádicas, ejecutada con un presupuesto low-cost y filosofía DIY. Humildemente bautizada como GarageRework.

IMG_20150817_212235b


Descripción y proceso constructivo:
  • Chasis o bastidor:
    Mediante perfiles de acero y aluminio, chapa de acero de 0.5-1mm y demás placas, eles, remaches y tornillería. También podríamos aprovechar, como otros han hecho, algún gabinete de aparatos obsoletos (VHS, DVD, torre de PC,…) y ahorrarnos unas cuantas horas de trabajo. En mi caso ya fue por pura adicción al bricolaje.

    IMG_20150620_231036IMG_20150624_165323
  • Pre-Heater:
    Se optó por un pre-calentador con superficie útil de 20x30cm concebido mediante lámparas halógenas de cuarzo de 24cm (3x400W), portalámparas y reflector todo extraído de un calefactor por radiación doméstico (en concreto uno en oferta del Amazonas, ~20€).

    estufa halog 1200w    IMG_20150621_225613

    Para alcanzar las temperaturas de precalentamiento, 130-150ºC (usualmente ~70% de la temperatura de reflow máx.), las lámparas no trabajan ni a la mitad de su potencia máx. con lo que se espera una larga vida de las mismas a pesar de su dudoso origen.
  • Top-Heater:
    Para el calentador superior elegí un pequeño emisor de IR cerámico de 60x60mm y 250W (Aliexpreso, ~15€), alojado en un conveniente foco artesanal. Asimismo, también mecanicé unas placas obturadoras para obtener diferentes huellas de calor acordes con el tamaño del chip (de 25x25, 35x35 y 45x45mm), todo protegido con pintura anticalórica.
    IMG_20150715_134045IMG_20150715_132919IMG_20150716_223101b
    En mi caso, emisor 60x60mm, con sumo cuidado logré trabajar con las típicas GPU’s de hasta 33x33mm sin problemas, al menos en el reflow con bolas de Sn-Plomo a ≤200ºC. La extracción de bolas sin plomo ≤230ºC se hizo de rogar pero también se consiguió. Sin embargo, para estos y otros chips más grandes serían recomendables emisores de 80x80mm o mayores (la zona uniforme aprovechable de la huella de calor siempre es bastante menor que el emisor).
  • Electrónica de control:
    La más sencilla para lograr resultados aceptables y replicada por igual para el Pre y el Top-Heater. En total: dos controladores PID de temperatura, dos relés SSR y dos clásicos reguladores de potencia por ángulo de fase mediante triac. Estos últimos, fundamentales para controlar y poder corregir las pendientes de temperatura a voluntad. Todo ello, evitando recurrir a los controladores de perfil completo por rampas, más costosos y/o complejos, como el PC410 u otros implementados mediante microcontroladores en Arduino u otra plataforma que, por supuesto, hubiesen sido una mejor solución.
    En fin, concretando componentes: 
    • Controladores PID de acción inversa: se optó por el modelo más sencillo disponible, REX-C100F (marcas Berme, RKC,… ~15€/ud), con sondas termopar Tipo K
    • Relés de estado sólido o SSR de ≥20A (Fotek, ~5€/ud), con una larga vida útil para estos niveles de potencia.
    • Y reguladores de potencia mediante triac BT139 de 16A (u otro similar). Para ensamblar estos últimos podemos basarnos en infinidad de circuitos en la red (como éste) o podemos comprarlos ya ensamblados (~5€/ud).
    IMG_20150706_173124IMG_20150708_022732b
También se dispusieron en la placa frontal del gabinete los correspondientes interruptores para alimentar a voluntad cada resistencia y módulo del equipo.
  • Seguridad eléctrica y refrigeración:
    • Toma de tierra, siempre obligatoria para todo aparato eléctrico con chasis metálico accesible. Garantizar la buena interconexión entre todas sus partes (cuidado con los metales galvanizados que pueden llegar a aislar de tierra una parte del chasis cuando menos te lo esperas). (PRECAUCIÓN, aquí trabajamos con tensiones peligrosas! Siempre bajo la propia responsabilidad individual. Repetida advertencia en todo proyecto de electricidad con tensiones superiores a 50v que nunca estará de más recordar; al invisible riesgo eléctrico jamás se le puede perder el respeto.)
    • Fusible de protección (10A) o algún magneto-térmico contra sobrecargas y cortocircuitos.
    • Aislamiento adecuado y resistente al calor de todos los conductores y borneras. Eliminar o evitar los bordes afilados del chasis. Deben fijarse bien todos los conductores al chasis y es muy recomendable proteger o enfundar los cables más finos (de sondas, potenciómetros, ...).
    • Lámina de mica, alúmina o silicona aislante para los triacs BT139, fijados directamente al chasis (su patilla estará a la tensión de red!), o usar algunos con la patilla aislada como los BTA16, …
    • Pasta térmica entre los triacs, los relés SSR y una amplia chapa del chasis (para la potencia empleada no se requiere más refrigeración pasiva que esa).
Pruebas y calibración:

IMG_20150721_235829bIMG_20150814_212503
En estas imágenes podemos observar la máquina acabada funcionando con sus dos sondas termopar tipo K conectadas como señal 'salida de proceso' (o punto actual) hacia los respectivos PID (conceptos básicos de controladores PID). A la derecha tenemos los ensayos de huella de calor del top-heater, imprescindibles para conocer su posicionamiento óptimo y obtener una adecuada distribución de temperaturas sobre el chip.

Es muy recomendable, al menos en los primeros reworks que hagamos, disponer de sondas de temperatura adicionales situadas en las esquinas del chip para corroborar la uniforme distribución de temperaturas sobre el mismo.

El proceso es delicado, así que más vale empaparse bien de información al respecto, ya sea desde las especificaciones y estándares de la industria que rigen estos procesos (JEDC/IPC J-Std-020D, especificaciones del flux utilizado como el NC-559, etc.) hasta la experiencia compartida en la red por expertos y aventureros (consultar bgamods, reballing.es, eevblog u otros foros dedicados). Por otro lado, no deberían adoptarse valores de temperaturas como dogmas de fe ya que éstos, o mejor expresado, su efectividad en las bolas del chip, se verán muy influenciados por el diseño y configuración específicas de cada máquina; disponer de ellos confundiría más que ayudar (por ello he evitado en lo posible precisarlos aquí, aunque para saber por donde nos movemos más abajo dejo un perfil de temperaturas de referencia). Es decir, habrá que tener muy presente la desigualdad siempre existente entre la temperatura medida por las sondas y la realmente alcanzada por las bolas. Así pues, calibrar un adecuado perfil de temperaturas Tª/t para nuestra máquina (pendientes, tiempos, temperatura preheat y temperatura máx.), realizando las pruebas necesarias, será un paso previo fundamental para no mandar a la basura chips potencialmente reparables.

 
Un posible perfil de temperaturas para bolas Sn-Pb (usar sólo como referencia).
Cada etapa ocupa unos 90 segundos. Enfriamiento entre 2-4ºC/s
https://upload.wikimedia.org/wikipedia/commons/archive/a/a9/20121209171017%21Bga-1.jpg
Ejemplo de un buen reballing.

Primeros resultados (futuras entradas del blog?):
-Rework de chip GPU nVidia 8600m-GT G84-600-A2 602 603 de laptop en tarjeta MXM-II. OK.
-Rework de memorias DDR de ATI All-in-Wonder Radeon 9000 Pro para pruebas preliminares. OK.