Construcción de un dado electrónico con Arduino, modificando la configuración (fuses) para que funcione con su oscilador interno de 8 MHz. El dado electrónico se controla con un ATmega8A, alimentado con una batería de 3,7V y gobernado con el pulsador táctil capacitivo TTP223.
Arduino es una plataforma de desarrollo con código abierto, y dispone de librerías para controlar infinidad de sensores y dispositivos sin apenas tener que escribir código. Esto facilita a cualquier aficionado a la electrónica, para que pueda realizar diseños a medida sin apenas tener conocimientos de programación. Como consecuencia, Arduino ha tomado una gran popularidad, y actualmente se puede encontrar código abierto para realizar cualquier proyecto que se nos ocurra. A pesar de esto, Arduino es mucho más potente y versátil del uso que normalmente se le está dando, porque la potencia y versatilidad de los procesadores ATmega es muy superior al uso que normalmente se le está dando.
El IDE de Arduino facilita mucho la programación de un microprocesador ATmega, porque sólo es necesario seleccionar la placa de desarrollo con la que se está trabajando (UNO, Mega, Leonardo) y el IDE se encarga de grabar todos los parámetros de configuración y adaptar el código escrito cuando se realiza la compilación y se programa. En la mayoría de los casos esto es suficiente, pero es posible avanzar un poco más y sacar más provecho en los montajes, reduciendo el tamaño y costo de los componentes. El primer paso sería montar el micro controlador, una vez programado, en un PCB aparte y montar únicamente los periféricos que fueran necesarios. Pero si queremos realizar un proyecto de tipo profesional y venderlo, tendremos que modificar los parámetros de configuración para evitar que alguien pueda leer el código y realizar copias. La manera más fácil de cambiar la configuración de un ATmega, es utilizar AVRDUDEy ejecutar las órdenes a través de la ventana de comandos del PC.
Como la mejor forma de aprender algo es hacerlo, he contruido un dado electrónico con un ATmega8A, funcionando con su oscilador interno de 8MHz.
Para programar el ATmega8A he utilizado una placa de desarrollo Arduino UNO, haciéndola funcionar como programador ISP. Como el código del programa está escrito en el IDE de Arduino, la compilación la hará para funcionar con un oscilador a cristal de 16 MHz. Lo primero que hay que tener en cuenta para que todo funcione correctamente, es reducir los retardos que hayamos definido en el programa a la mitad, porque cuando cambiemos la configuración del microprocesador para que funcione a 8 MHz, los valores de retardo que hayamos escrito durarán el doble.
Una vez programado el microprocesador, sin desmontarlo del zócalo de programación, abriremos la ventana de comandos de Windows en el PC, y modificaremos la configuración (fuses) del ATmega8A / ATmega328P ejecutando AVRDUDE. Los argumentos que tenemos que añadir al ejecutar AVRDUDE, dependerán del tipo de microprocesador ATmega que estemos programando, y el puerto COM con el que se haya conectado el PC con Arduino.
Configuración de un ATmega8A para hacerlo funcionar en un Arduino UNO. Si utilizas Arduino, te aconsejo que no te pierdas este artículo, porque encontrarás la información que necesitas para saber cómo funciona y esclarecer algunas dudas.
Contenido
Descripción comparativa entre el ATmega8A y el ATmega328P (capacidad de memoria, rango de tensiones, frecuencia máxima de trabajo). Configuración del IDE de Arduino (software de programación) y sus diferentes modos de funcionamiento. Convertir un Arduino UNO en programador ISP, cunstruyendo un ‘shield’ con zócalo de 28 pines, para programar cualquier ATmega compatible… y en el video final encontrarás las explicaciones, consejos y algunos trucos.
ATmega328P / ATmega8A
El microprocesador ATmega8A tiene una arquitectura muy parecida al ATmega328P, ambos son AVR, aunque existen algunas diferencias en cuanto a sus prestaciones.
El ATmega8A podría utilizarse en la placa de desarrollo de Arduino UNO en sustitución del ATmega328P, siempre que se tengan en cuenta sus limitaciones.
Ambos circuitos integrados son compatibles en cuanto a su encapsulado conexiones y funcionamiento, de hecho el ATmega8A es uno de los primeros microprocesadores que se empezaron a utilizar con Arduino. Antes de montar un ATmega8A en la placa de desarrollo Arduino UNO, habría que programar su Boot Loader, y colocarlo en el lugar adecuado de su memoria Flash.
Boot Loader
El Boot Loader es el mecanismo de auto programación que permite cargar y descargar el código del programa desde el propio micro controlador. Esta característica permite que las actualizaciones del software sean controladas por el propio micro controlador, y esto lo hace utilizando un pequeño programa de arranque, llamado Boot Loader… y este ocupa una pequeña parte de la memoria Flash.
El Boot Loader o cargador de arranque, puede utilizar cualquier interfaz de datos y protocolo para leer y escribir el código del programa, tanto el de la memoria Flash como el de la memoria de programa.
El código del programa alojado en la sección del Boot Loader tiene la capacidad de escribir en toda la Flash, incluido el propio gestor de arranque de memoria. O dicho de otra manera, el Boot Loader tiene la capacidad de modificarse y borrarse a sí mismo.
El tamaño de la memoria del Boot Loader se puede configurar mediante el estado de unos bits denominados ‘fusibles’, y dispone de dos conjuntos separados, aparte de los bits Boot Lock (bits de bloqueo), los cuales permiten seleccionar los diferentes niveles de protección del micro procesador.
Secciones de la memoria FLASH
La memoria flash está organizada en dos secciones principales, la sección de la aplicación y la sección del cargador de arranque. El tamaño de las diferentes secciones está configurado por los fusibles BOOTSZ. Estas dos secciones pueden tener diferentes niveles de protección, ya que tienen diferentes conjuntos de bits de bloqueo.
Sección de la aplicación
La sección de la aplicación se encuentra dentro de la memoria Flash, y es la que se utiliza para almacenar el código principal del programa. Los niveles de protección para la sección de la aplicación se configuran con los bits del Boot Lock. Dentro de la sección de la aplicación no se puede almacenar ningún código del cargador de arranque, ya que la instrucción SPM quedaría deshabilitada cuando se ejecuta esta sección.
BLS – Sección del cargador de arranque
Si bien la sección de la aplicación se utiliza para almacenar el código de principal del programa, el software del Boot Loader debe almacenarse dentro de la sección de arranque (BLS), ya que la instrucción SPM sólo puede iniciar una programación cuando se ejecuta desde el sector de arranque (BLS). La instrucción SPM puede acceder a todo el contenido de la memoria Flash, incluso al propio sector de arranque (BLS). El nivel de protección para la sección Boot Loader puede seleccionarse mediante los bits de bloqueo del cargador de arranque.
Secciones de lectura sin escritura y sin lectura mientras se graba
Si la CPU admite la lectura mientras escribe (Read-While-Write) o si la CPU se detiene durante un software Boot Loader, la actualización depende de la dirección que se está programando. Además de las dos secciones, que son configurables mediante los fusibles BOOTSZ, la memoria Flash también se divide en dos secciones fijas: la sección leer mientras se escribe (RWW) y la sección sin lectura mientras se escribe (NRWW). El límite entre las secciones RWW y NRWW depende del modelo de micro controlador que se utilice.
La principal diferencia entre las dos secciones es:
Al borrar o escribir dentro de la sección RWW, la sección NRWW puede leerse durante la operación.
Al borrar o escribir dentro de la sección NRWW, la CPU se detiene hasta que finalice el proceso.
El software del usuario no puede leer ningún código que se encuentre dentro de la sección RWW durante la ejecución del sector de arranque.
El significado de leer mientras escribe (Read-While-Write) se refiere a cuando se borra o escribe en la memoria, es decir, cuando se está programando. Y esto no es posible hacerlo cuando se está ejecutando el gestor de arranque.
RWW – Sección de lectura mientras se escribe
Cuando se actualiza el programa con el Boot Loader y se está cargando código dentro de la sección RWW, es posible leer código del Flash, pero solo el código que se encuentra en la sección NRWW. Durante un proceso continuo de programación, el software debe garantizar que la sección RWW nunca se lea. Si a través de software se intentara leer dentro de la sección RWW durante la programación, el software podría terminar en un estado desconocido. Para evitar esto, las interrupciones tienen que deshabilitarse o moverse dentro de la sección del Boot Loader, porque la sección Boot Loader siempre se encuentra en sección NRWW.
NRWW – Sección sin lectura mientras se escribe
El código ubicado en la sección NRWW se puede leer cuando el software Boot Loader está programando la sección RWW. Cuando el código Boot Loader programa la sección NRWW, la CPU se detiene hasta que termine la operación.
Bits de bloqueo del cargador de arranque (Boot Loader)
Cuando no se programa el Boot Loader, toda la capacidad de la memoria el Flash queda disponible para el programa. El cargador de arranque tiene dos conjuntos separados de bits de bloqueo, los cuales se pueden configurar de forma independiente y permiten diferentes niveles de protección.
Modos de protección contra una posible actualización realizada a través del micro procesador
Proteger la escritura en toda la memoria Flash
Proteger la escritura sólo en la sección del cargador de inicio (Boot Loader)
Proteger la escritura sólo en la sección Flash del programa
Permitir la actualización del software en toda la memoria Flash
Los bits de bloqueo o protección (Boot Lock) se pueden configurar en ambos modos de programación, tanto serie como paralelo, pero solo pueden borrarse cuando se borra toda la memoria. El bloqueo de escritura general no controla la programación de la memoria flash mediante instrucción de auto programación (SPM). Del mismo modo, el bloqueo de lectura / escritura general no controla la lectura ni la escritura por LPM / SPM.
Si necesitas saber las posibles configuraciones de algún micro-controlador AVR, puedes consultar en esta Web: http://www.engbedded.com/fusecalc/
Desde aquí puedes realizar una configuración, calcular los valores en hexadecimal y copiar los argumentos de la cadena que le tendrías que añadir a la aplicación AVRDUDE, para programar los fusibles del micro-controlador.
SPM – Self-Programming Mode
El modo de auto programación (SPM) es una función que permite que un micro controlador programe su propia memoria flash. Usando el SPM, un micro controlador puede programarse con un nuevo código SPM. El modo de auto programación (SPM) se usa comúnmente con los códigos de cargador de arranque del micro controlador que ayudan a su programación en serie. El SPM está disponible solo para el código que se ejecuta en el Boot Loader (BLS) de la memoria flash. Con la ayuda de SPM, un código en el Boot Loader puede reescribir la memoria flash de la aplicación por completo o una parte de ella. Incluso puede reescribir su propio código en la sección BLS.
El modo de auto programación (SPM) es un factor clave del código Boot Loader, ya que su principal función es la de cargar el programa dentro de la sección destinada a la aplicación de la memoria flash. El Boot Loader puede recibir el código binario de otros chips de memoria, tarjetas SD o a través del puerto serie del micro controlador en caso de programación en serie. Es entonces con la ayuda de modo de auto programación (SPM) que el micro controlador escribe el código binario en la sección flash de la aplicación.
Programador ISP con Arduino UNO
El IDE (Integrated Development Environment) de Arduino dispone de un código en la sección de los ejemplos: Archivo – Ejemplos – 11.ArduinoISP, que permite convertir la placa de desarrollo de Arduino en un programador ISP. Este código puede controlar el encendido de 3 diodos LED, para indicar su estado de funcionamiento durante la programación.
Funcionamiento del programador
Fluctúa la iluminación de uno de sus indicadores LED cuando el programador está disponible (LED azul), muestra otra indicación durante la escritura (LED amarillo), y también puede mostrar la indicación de error (LED rojo).
He añadido un cuarto LED al circuito, conectando un diodo LED en la línea SCK (LED verde). Esta señalización nos permite saber si un micro-controlador tiene cargado el Boot-Loader:
…al pulsar el botón RESET del programador, el LED verde (conectado a la línea SCK) debería parpadear durante un instante.
Autoprogramación
La memoria del programa se actualiza página por página (64 palabras en ATmega328P / 32 palabras ATmega8A). Antes de programar una página con los datos almacenado en el buffer de página temporal, la página debe borrarse. El buffer de página temporal se llena uno palabra a la vez usando SPM y el buffer se puede llenar antes del comando de borrado de página o entre una página borrada y una operación de escritura de página:
Alternativa 1. Llenar el buffer antes de borrar una página
Rellenar el buffer temporal de la página
Realizar un borrado de página
Realizar una escritura de página
Alternativa 2. Completar el buffer después de borrar la página