[TUTORIAL] Programar un AT90S8515 con Arduino

Hola foreros!! Volvamos a la época jurásica. Ha venido un dinosaurio!! :smiley:

** **Introducción** **

¿Qué pasa si necesitamos un microcontrolador especial para un proyecto que no lo tiene la plataforma Arduino? ¿Y qué pasa si tenemos un microcontrolador antiquísimo y queremos usarlo para algún proyecto de baja importancia o simplemente porque sus características son compatibles con nuestro proyecto por muy antiguo que sea el microcontrolador? Pues que en un principio, "no podemos", pero solo en un principio, porque veremos más adelante que sí se puede, y lo bueno de Arduino es que nos permite hacerlo. :wink:

Este tutorial tiene como origen no la necesidad de programarlo, sino la necesidad generada por la curiosidad de programarlo hoy, al encontrar en casa una tarjeta de desarrollo compuesta por una EEPROM 24LC256 y un microcontrolador (µC) AT90S8515 de Atmel, al que cariñosamente llamaremos "dinosaurio". :wink: Tras hacer consultas en el foro logré programarlo con éxito habiéndome tropezado varias veces (como nos pasa siempre :D) y tras hacer varias pruebas para hacerlo funcionar de manera "estable", me veo en la "obligación" de compartir los éxitos conseguidos para que a otra persona le pueda servir de guía programar el dinosaurio u otro similar. Además, se suma a la motivación el hecho de que, aunque no todo el mundo lo pregunta, sí hay un número "importante" de entradas en Google sobre gente que pregunta cómo programar este bicho, e incluso algunos dicen que es directamente imposible. Ya veremos que esa gente no tiene razón. :wink:

A día de hoy, programar un µC antiguo puede suponer un problema, debido a que requiere software antiguo, programadores antiguos y lo que es peor: puertos antiguos como el puerto serie o paralelo. A esto se suma la posibilidad de que dichos programas no funcionen en los sistemas operativos actuales y que solo estén para Windows. Arduino facilita esta tarea ya que es un programa actual y todo funciona por USB sin problemas. Hoy, programar un µC de arquitectura AVR, por muy antiguo que sea, es posible en máquinas modernas multiplataforma.

Este tutorial se divide en varias partes:

-Objetivo del tutorial
-Características del dinosaurio
-Descripción de patas
-Qué puede hacer y qué no
-Configuración de hardware
-Configuración de software

** **Objetivo del tutorial** **

El objetivo principal de este tutorial es el de conectar el dinosaurio al ordenador para poder cargarle un programa y que éste funcione. No es un objetivo de este tutorial cómo exprimir todas las características del dinosaurio cuando existen µC mejores y más modernos. Sin embargo, sí daremos un paseo por algunas de sus características.

El dinosaurio es un µC muy antiguo. No merece la pena invertir dinero en uno de estos. Sí puede merecer la pena si ya posees alguno y antes de tenerlo guardado en un cajón acumulando polvo, pues queda la opción de usarlo en algún proyecto poco exigente.

Si has venido hasta aquí buscando información sobre cómo programar otro µC que no es éste pero es Atmel y de arquitectura AVR, no te vayas porque puedes encontrar información que te resulte muy interesante. :wink:

** **Resumen de características** **

El dinosaurio, aunque es antiguo, tiene algunas características que pueden resultar interesantes, sobre todo para proyectos de bastantes patas. Algunas características principales:

-AT90S8515-4: Funciona entre 2,7 y 6v a 4Mhz
-AT90S8515-8: Funciona entre 4 y 6v a 8Mhz
-32 E/S digitales
-Las salidas digitales dan ~2,2v, lo que posibilita conectar LEDs directos a la salida
-No tiene entradas analógicas
-8K de memoria
-512 bytes de SRAM
-512 bytes de EEPROM
-Un reloj de 8bit
-Un reloj de 16bit
-Comparador analógico
-Tiene conexiones SPI
-Tiene puerto serie
-No tiene I2C
-Dos interrupciones

Hoja de especificaciones del AT90S8515

** **Descripción de patas** **

Una imagen vale más que mil palabras. :smiley:

patas.png

Enlace externo a la imagen

Los números entre paréntesis hacen referencia al número de puerto usado en el IDE de Arduino. Por ejemplo, digitalRead (14) hace referencia a la pata 7 puerto PB6 y digitalRead (29) hace referencia a la pata 34 puerto PA5. :wink:

** **Qué puede hacer y qué no** **

El Arduino UNO puede hacer "prácticamente" todo lo disponible, si nos ceñimos a sus características. No le podemos pedir una salida PWM por el pin 13, pero a su hermano mayor, el Leonardo, sí. El dinosaurio, al ser un µC con bastantes años encima, puede hacer una serie de cosas pero no otras, al menos, en el entorno Arduino.

Funciones probadas que funcionan:

-pinMode como INPUT, OUTPUT y como INPUT_PULLUP, sí, funciona la resistencia interna en todas sus patas
-digitalWrite
-digitalRead
-delay
-attachInterrupt
-millis
-IF ELSE
-FOR
-byte, long y unsigned long entre otras
-LED_BUILTIN que tiene un valor de 13
-Interrupciones con LOW, RISING, FALLING y CHANGE
-Otras funciones estándares
-Funciones Ensamblador como DDR, PIN y PORT

analogWrite funciona también, pero el resultado es un 1 o un 0 en la salida asignada.

Funciones probadas que no funcionan:

-Serial; pese a tener puerto serie, el compilador genera error como si Serial no estuviese declarado para este µC

No se han probado todas las funciones disponibles, pero entiendo que funciona la gran mayoría de ellas.

** Continúa en el siguiente mensaje por límite de caracteres **

s8515.zip (3.19 KB)

** **Configuración de hardware** **

Bien. Si has llegado hasta aquí, has visto "de lo que es capaz" el dinosaurio y te seduce, podemos continuar con la chicha. :smiley: Veamos qué piezas necesitamos para echarlo a andar. Material necesario:

-El propio dinosaurio
-1 Programador USB ASP a 5v
-1 Placa de prototipos opcional pero altamente recomendada
-1 Cristal de ocho megahercios
-2 Condensador cerámico de 22 picofaradios
-Varios cables macho-macho para conectar los elementos en la placa de prototipos
-Recomendado un LED para hacer las primeras pruebas, no necesita resistencia

El programador USB ASP que tengo es el siguiente y me costó en total aproximadamente seis euros, poquito más de seis dólares americanos:

Programador AVR USBASP

NOTA: La teoría dice que cualquier Arduino programado como programador y debidamente configurado sustituye a este programador. Personalmente no lo he probado aún.

Conexión de los elementos. Conectamos el cristal en las patas 18 y 19 del µC. A su vez, conectamos un condensador en la pata 18 y éste a masa y hacemos lo mismo para la 19. Alimentamos el dinosaurio con 5v a través de la pata 40 y conectamos la masa o retorno en la pata 20. La salida para probar con un LED no requiere de resistencia limitadora.

Conexión básica.png

Enlace externo a la imagen

Quiero hacer especial hincapié en que el cristal es ABSOLUTAMENTE necesario. Sin el cristal, el programador no podrá programarlo. Si no tienes un cristal a mano pero quieres intentar programarlo, no te molestes: no va a funcionar.

Las conexiones para la programación son las siguientes.

Enlace externo a la imagen

Las patas MISO, MOSI, SCK y RESET las conectaremos a nuestro programador, ya sea un programador USB o el propio Arduino. La alimentación y la masa la tomaremos también del conector ICSP.

Si para la primera programación quieres probar con un pulsador, la pata que vaya asociada a él, necesita, de la misma forma que el resto de placas Arduino, una resistencia de mínimo 2k2Ω, recomendado 10kΩ a masa. Nada nuevo en este punto. :wink:

** **Configuración de software** **

Si ya tienes en tu poder el cristal y los condensadores que no te han permitido programarlo o has omitido el paso anterior para ganar tiempo hasta que tengas los componentes, podemos pasar ya a configurar Arduino. :smiley:

NOTA: Las rutas de los archivos y las capturas de pantalla serán de Mac, que es mi sistema principal. Para Windows, desconozco las rutas aunque no deben ser muy distintas.

Preparar el IDE de Arduino para el dinosaurio

Es evidente que hay que modificar el programa para poder integrar nuestro dinosaurio en él. Existen dos maneras de hacerlo, y cada una de ellas tiene sus ventajas y sus inconvenientes. Existe la manera rápida y la manera buena de hacerlo.

Forma rápida: Lo justito para que aparezca y pueda programarlo.

Esta es la manera más rápida de integrar el dinosaurio en Arduino. Consiste en la modificación del archivo boards.txt en el que añadiremos al principio, entre medias o al final del archivo, una serie de líneas que "autorizarán" al µC. Recomiendo hacerlo al final. Este archivo está localizado en:

Mac:

Arduino/Contents/Java/Hardware/Arduino/AVR/boards.txt

Windows:

Todavía por probar

Añadiremos las siguientes líneas con Arduino cerrado:

s8515.name=Atmel AT90S8515-8PC

s8515.upload.tool=avrdude
s8515.upload.maximum_data_size=8192
s8515.upload.protocol=usbasp
s8515.upload.speed=9600
s8515.upload.using=USBasp

s8515.build.mcu=at90s8515
s8515.build.f_cpu=8000000L
s8515.build.board=AVR_8515
s8515.build.core=arduino
s8515.build.variant=standard

Abrimos Arduino de nuevo y en la selección de placa, ya tenemos nuestro dinosaurio listo para ser seleccionado!! :smiley:

La ventaja de usar esta forma de añadir el dinosaurio a Arduino es la rapidez de modificar un simple archivo de texto y la disponibilidad de programarlo inmediatamente. Sin embargo, la desventaja de esta forma es que solo podremos acceder a 20 de las 32 E/S teniendo el puerto D completo pero los puertos B y C solo con seis E/S. Si queremos programar el puerto A o usar las otras E/S, tenemos que usar lenguaje Ensamblador: no hay otra manera haciéndolo de esta forma. De igual manera, se quedan sin poder usarse varias características como el puerto serie, el comparador analógico o la salida PWM, al estar estos o fuera de especificaciones, o fuera de los puertos A, B, C o D.

Forma buena: Las cosas bien hechas, bien parecen.

Esta forma de integrar nuestro dinosaurio en Arduino no es mucho más complicada, y habiendo hecho ya el trabajo de modificar y crear unos archivos, es menos trabajo del que me costó a mí. :smiley: Consiste en modificar, de igual manera, el archivo boards.txt pero en este caso, sustituyendo el "standard" de la última línea por "s8515". Adjunto aún así el código:

s8515.name=AT90S8515-8PC

s8515.upload.tool=avrdude
s8515.upload.maximum_data_size=8192
s8515.upload.protocol=usbasp
s8515.upload.speed=9600
s8515.upload.using=USBasp

s8515.build.mcu=at90s8515
s8515.build.f_cpu=8000000L
s8515.build.board=AVR_8515
s8515.build.core=arduino
s8515.build.variant=s8515

Tras guardar el archivo, no nos movemos de la carpeta donde está boards.txt y nos vamos a la carpeta llamada "variants". Ahí descomprimimos el ZIP adjunto en este hilo, que lo forman una carpeta y un archivo llamado "pins_arduino.h". Ahora se pueden acceder a más E/S!! :wink:

Enlace externo a la imagen

La ventaja de hacerlo de esta forma es que ahora podemos acceder a las 32 E/S del dinosaurio: ya no necesitamos usar Ensamblador. Sin embargo, siguen quedándose fuera las otras características que antes no se podían usar. LED_BUILTIN, al contrario que la inmensa mayoría de placas, está configurado en la pata 8, pero esto se puede modificar a gusto del usuario, si es que llega a usar esta constante alguna vez. :wink:

NOTA: Si se desea modificar el archivo "pins_arduino.h" se recomienda hacerlo con un editor de texto sin formato, ya que Arduino, por las buenas, no nos dejará guardarlo.

NOTA: He comprobado que todo esto solamente funciona si está instalada la versión 1.6.20 de placas Arduino AVR dentro del gestor de tarjetas. Versiones más modernas hacen que no aparezca esta configuración. Se puede bajar de versión desde el Gestor de tarjetas sin problema alguno.

Hayamos elegido lo que hayamos elegido, podremos seleccionar ya el µC en cuestión. :smiley:

Enlace externo a la imagen

Hay que tener en cuenta qué hemos elegido finalmente para programar el dinosaurio, si el programador USB ASP o hemos convertido nuestro Arduino en un programador. Si has elegido el Arduino, simplemente hay que programarlo con el ejemplo ArduinoISP en el menú Archivo/Ejemplos/ArduinoISP. Si has elegido el programador USB no hay que hacer nada: ya viene el programa cargado y no necesitaremos modificarlo nunca: conectar y listo.

** Continúa en el siguiente mensaje por límite de caracteres **

Programar con un programador USB

Controladores. Siempre dependiendo de qué programador elegiste, para Mac y Linux no hay que instalar absolutamente nada. En Windows, si has elegido el mismo que el que tengo u otro con el mismo chip necesitarás descargar su controlador.

Fisch.de

Antes de meternos en faena de programar nuestro querido dinosaurio, podemos hacer unas prácticas con nuestro USB ASP intentando programar nuestro UNO, MEGA (siempre que sea AVR) o lo que tengamos a través de su conector ICSP. Esto nos dejará el terreno preparado para programar el µC eliminando errores y aprendiendo el funcionamiento de este programador, que es ligeramente diferente. Así descartamos posibles problemas, al menos en esta parte, cuando intentemos programar el dinosaurio y nos salte algún error de comunicación o imposibilidad de programarlo.

Para programar el Arduino con este programador hay que hacer algún cambio en la configuración. El cambio menos llamativo es el de la elección de la placa que hay DETRÁS del programador. Aunque usemos el programador, hay que seleccionar lo que hay conectado en el programador. Si es un UNO, el UNO y si es el MEGA, pues el MEGA. El puerto que usaremos es... Ninguno. :smiley: No saldrán puertos disponibles, o al menos algún puerto donde esté conectado el programador. No te preocupes, esto es así. Sin embargo, sí hay que realizar un ajuste. En el mismo menú de Herramientas, donde seleccionamos nuestra placa y el puerto a usar, hay otra opción que es "Programador". Para este caso, hay que seleccionar USB ASP.

Enlace externo a la imagen

¿Y entonces, cómo se programa si no puedo seleccionar el puerto? Sencillo. En vez de darle al botón habitual de la flecha verde orientada a la derecha, nos vamos al menú Programa. Ahí tenemos la opción de Subir, la de la flecha verde, y otra que es la que buscamos, "Subir usando programador".

Enlace externo a la imagen

Para las pruebas, usaremos un programa sencillo, el conocido Blink. Si todo está bien conectado, si estás en Windows y tienes instalado el controlador correcto, Arduino empezará a compilar y a subir el programa a tu placa Arduino, y tu programador empezará a encender los LEDs de comunicación. Si todo está bien, en este momento habrás programado tu placa Arduino, puede que por primera vez, a través del puerto ICSP. :smiley:

Si has podido programar tu Arduino de esta manera, ya estás listo para programar el dinosaurio con éxito!! :wink:

Programar con un Arduino como programador

Para este cometido necesitamos previamente cargar el programa AruinoISP con la configuración estándar, esto es, seleccionando nuestra placa Arduino y el puerto en el que esté conectada. Con esto, transformaremos el Arduino en un programador ASP. Subimos el programa y listo!! :smiley:

Enlace externo a la imagen

Ahora necesitamos hacer algún ajuste. En el menú Programa debemos seleccionar el Arduino que tenemos DETRÁS del transformado, no el que usamos para programar. Si nuestro Arduino transformado es un UNO pero queremos programar un MEGA, seleccionaremos el Arduino MEGA. Una vez hecha esta configuración, nos vamos al mismo menú pero al apartado "Programador". Estará seleccionado el AVR ISP 2. Debemos cambiarlo por "Arduino as ISP".

Enlace externo a la imagen

Ejemplo de diagrama de conexiones para programar un Arduino a través de otro Arduino:

Enlace externo a la imagen

Para el ejemplo, cargaremos el Blink para saber que todo funciona. Ya no podemos usar el botón verde de la flecha a la derecha para programarlo. De lo contrario, cargaremos el Blink en el Arduino transformado y posiblemente nos arroje un error. :smiley: Para hacer esto correctamente debemos ir al menú "Programa". Aquí tenemos la opción de "Subir", que es la misma que el botón de la flecha verde que usamos habitualmente, pero esa opción no nos sirve, ya que no tenemos una configuración "estándar". Debemos seleccionar "Subir usando programador". Si todo está bien y los cables están bien puestos, el programa subirá con éxito y habrás programado un Arduino, imagino que por primera vez, con el puerto ICSP. :smiley:

Enlace externo a la imagen

NOTA: Al programar un µC o un Arduino a través de este puerto, PERDEREMOS EL BOOTLOADER y no podremos volver a programar, en este estado, el Arduino con el método original. Para volver a subir un programa de la forma original, hay que quemar el bootloader de nuevo de la misma manera que estamos programando el otro Arduino. Para ello, nos vamos, SIN TOCAR NI UN CABLE NI OPCIÓN ALGUNA, al menú Herramientas/Quemar bootloader. El bootloader se quemará de nuevo y ya podremos usar de nuevo nuestro Arduino de forma totalmente normal. :wink:

Y finalmente, hemos programado nuestro dinosaurio!! :smiley: Y al contrario que como dice Homer Simpson (u Homero para los latinos), que "podrás comprar lo que quieras menos un dinosaurio", pues bueno, no es cierto, tampoco especificó qué dinosaurio... :smiley:

Bueno, pues aquí llega el fin de este tutorial. Espero que al menos sirva de ayuda para alguien o sirva de guía para que otra persona pueda añadir un µC distinto a la lista de placas disponibles y poder trabajarlo sin problema!! :wink:

Saludos!!

s8515.zip (3.19 KB)