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.

5 comentarios:

  1. Hola David. La información sobre la programación de los STC me ha sido de mucha ayuda. He encargado unos micro STC15L204 con interfaz para el NRF24L01 y estaba perdido, no sabia como empezar a estudiarlos.

    Si tienes alguna información sobre la programación de estos micros te agradecería que la compartieras conmigo.

    Gracias.

    Ernesto Garcia

    ResponderEliminar
  2. buenas tardes. necesito saber donde puedo adquirir ese lector de stc mi correo es azaz.misrain@gmail.com, muchas gracias

    ResponderEliminar
    Respuestas
    1. Buenas, pues yo lo encontré en Aliexpress. Palabras clave: 51 avr developer, los hay muy baratos <10 $/€ en kit o premontados.

      Eliminar
  3. HOLA GRACIAS POR LA INFORMACION. TENGO ALGUNAS DUDAS.1) ¿PUEDE TRABAJAR TOTALMENTE EN LINUX?? YA QUE USO LINUX. 2)¿ SE PUEDE PROGRAMAR EN LENGUAJE ENSAMBLADOR?? ES EL LENGUAJE QUE MANEJO. SE MUY POCO DE LENGUAJE C

    ResponderEliminar
    Respuestas
    1. Para Linux sigue activo el programador STCgal. Desde ensamblador seguro puedes programarlos, pero no estoy actualmente inmerso en Linux y no sabría dicirte que IDE's usar aunque seguro tendrás para hartarte.

      Eliminar