1-Introducción:
Telecarga AVR es una aplicación que desarrollé en Visual.Net 2003 (VB.Net) con la intención de poder programar de forma sencilla los microcontroladores de 8 bits de la familia AVR - ATmega de Atmel desde Windows XP.

Este proyecto puede ser útil a aquellas personas que deseen comprender a bajo nivel como se programa esta familia de microcontroladores, a aquellos que deseen saber como interactuar con el puerto paralelo del PC desde Visual .NET, o a los que deseen emular una SPI en el PC. También puede interesarle a quienes, por la razón que sea, estén buscando la forma de incorporar a sus aplicaciones .NET la opción de programar microcontroladores AVR-ATmega ( únicamente lo he probado en Windows XP).

Quienes simplemente busquen un programa para poder programar los microcontroladores AVR-ATmega con el código de sus proyectos, les recomiendo que no se compliquen la vida y utilicen la herramienta gratuita AVRDude. Aunque funciona por línea de comandos, es fácilmente integrable a algunos IDEs de programación ( como Programer's Notepad ) y es mucho más rápida. Telecarga AVR está desarrollado en VB.Net y para el acceso al hardware hace uso de una DLL no muy rápida, lo que en conjunto, hace que sea mucho más lento que AVRDude el cual está desarrollado en C y hace uso de unas librerías de acceso al hadware más eficientes. Esta diferencia de velocidad no se nota mucho en micrococontroladores con poca Flash (P.ej AVR-8515 o 8535 8KB), pero se acentúa a medida que aumenta el tamaño del código a telecargar (P.ej. ATmega32 32KB o ATmega64 64KB ).
 
2-Descripción general:
Todos los microcontroladores AVR-ATmega disponen de varias modalidades de programación: paralela, por JTAG, por SPI o incluso por bootloader. Telecarga AVR implementa la programación vía SPI (Serial Downloading). En este modo de programación el software de programación y el microcontrolador se comunican intercambiándose comandos y datos vía SPI (Serial Peripheral Interface). Telecarga AVR emula una SPI a través de algunos de los pins del puerto paralelo del PC, y es través de estos, mediante los que envía los comandos y datos correspondientes a las operaciones que desea hacer sobre el micro: escribir en flash, escribir en eprom, consultar los fuse bits etc.

Los comandos y los pines para la programación SPI pueden variar en los diferentes modelos de AVR-ATmega, no obstante el programa es capaz de trabajar sobre diferentes modelos, solo hay que especificar en la lista desplegable el Microcontrolador con que se desea trabajar:
      - AT-x-8515
      - AT-x-8535
      - ATmega8
      - ATmega16
      - ATmega32
      - ATmega64


Telecarga AVR permite modificar el contenido de la memoria Flash, de la memoria Eprom, los Fuse bits o los Lock bits del micro ( en los modelos que lo permiten vía SPI). Así, para modificar el estado de las memorias basta con Resetearlas primero, Abrir luego el fichero .hex con el contenido a grabar, y finalmente Programarlo. Existen otras opciones, como las que permiten Leer el contenido de las memorias, Verificar que el contenido se ha grabado correctamente etc.

Intefaz de programación de las memorias


Para modificar los Fuse bits o los Lock bits, bastará con desplegar los correspondientes formularios ( pulsando en los botones Fuse bits o Lock bits) , Leer el estado actual de los bits, modificar los bits deseados y luego Programarlos de nuevo.
Intefaz de programación de los Fuse y Lock bits
 
3-Descripción general del proceso de programación
A continuación se describe a bajo nivel el proceso de programación de un microcontrolador AVR-8515, el cual es practicamente idéntico al proceso de programación de los demas microcontroladores de la familia. Existen algunas diferencias en los comandos, o en algunas de las temporizaciones, pero salvando estas pequeñas diferencias, lo aquí escrito debería permitir comprender el proceso completo de programación de todos los micros de la familia AVR-ATmega. Por fortuna Atmel describe con bastante detalle el proceso en el datasheet de cada uno de sus dispositvos, así que si alguien desea profundizar más en el tema le recomiendo que los consulte.
 
3.1-Programación del AVR-8515 y AVR-8535 vía SPI (Serial Downloading)
El proceso de grabación del microcontrolador consiste en enviar (via SPI) y grabar (mediante los comandos adecuados) el contenido que se desea tengan las memorias Flash y EEPROM del microcontrolador y que se encuentra en el fichero .hex generado por el compilador. La memoria Flash es la memoria de programa (contiene el código) mientras que la memoria EEPROM es la memoria de datos.

Como se ha dicho, todo el proceso de programación se realiza a través de la interfaz serie SPI (Serial Peripheral Interface) del microcontrolador, la cual se conecta a algunos de los pins del puerto paralelo del PC mediante los que la aplicación emula una SPI. Los pins implicados en el microcontrolador AVR-85 15 son SCK (PB7), MISO (PB6), MOSI (PB5), RESET y XTAL1. Estos varian en cada modelo. El pin XTAL1 no es obligatorio controlarlo desde el programador, y si se quiere ahorrar trabajo se puede conectar directamente a un cristal siguiendo el esquema convencional. La única restricción que se ha de cumplir es que el periodo de esta señal debe ser como mínimo la cuarta parte del empleado en la señal SCK.


El envio de los diferentes bytes, se hace bit a bit, al pin MOSI del microcontrolador: este considera un bit válido en el flanco de subida del pin SCK. En cambio para leer un byte, se captura bit a bit, del pin MISO del microcontrolador: los bits son validos en el flanco de bajada del pin SCK.

En general el proceso de programación del microcontrolador se estructura en los siguientes pasos:
-Secuencia de activación de la programación.
-Envío de la instrucción de Inicialización del Modo de Programación.
-Envío de la instrucción de la operación que se quiera realizar:
          - Instrucción de Borrado del Chip
          - Instrucción de Escritura en la Memoria de Programa (Flash)
          - Instrucción de Lectura de Memoria de Programa (Flash)
          - Instrucción de Escritura en la Memoria EEPROM
          - Instrucción de Lectura de la Memoria EEPROM
 
3.2-Envío y recepción de un byte a través de la SPI
Antes de todo, hay que comprender como se realiza el intercambio de datos a través de la SPI, ya que este es el canal utilizado durante todo el proceso. Básicamente lo que se hace es enviar en serie cada uno de los bits del byte a transferir, empezando por el bit de más peso y acabando con el de menos peso. Para ello hay que colocar el bit a enviar en MOSI y una vez este está listo, dar un pulso a SCK para que el microcontrolador lo capture. El microcontrolador captura el valor al subir SCK, mientras que su respuesta se considera valida al bajar SCK. Un ejemplo del algoritmo a seguir es:
procedimiento enviar_recibir(byte_enviado tipo byte, ref byte_recibido tipo byte)
     para peso=7 hasta 0 hacer
          ClearSck ‘se baja la señal SCK
          GeneraClocks (4) 'si hay cristal no es necesario
          SacarBitMOSI(byte_enviado,peso) ‘se pone el bit corresopondiente en MOSI
          GeneraClocks (4) 'si hay cristal no es necesario
          SetSck ‘se sube la señal SCK
          GeneraClocks (4) 'si hay cristal no es necesario
          EntrarBitMISO(byte_recivido,peso) ‘se lee el bit recibido del micro
     fin_para
fin procedimiento
 
3.3-Inicialización del microcontrolador en el modo de programación
Por defecto, tras desactivar la linea de restet el microcontrolador este se pone en "modo ejecución de código" y ejecutará el código con que ha sido progrmado. Si se desea programar se deberá poner en modo "programación SPI". Para ello se debe seguir un proceso de inicialización específico. El primer paso es mantener !RESET y SCK a 0V en el momento que se da alimentación al microcontrolador. Si no existe un oscilador conectado habrá que dar un pulso de clock a XTAL1. Si por alguna razón no se puede mantener SCK y RESET a 0V en el momento del encendido, habrá que dar un pulso a !RESET de al menos dos ciclos de XTAL1 de duración. A continuación hay que esperar unos 20 ms. El siguiente paso es el envío de la Instrucción de Inicialización del Modo de Programación.

Un algoritmo válido para implementar la activación de la programación seria el siguiente:
procedimiento activa_programacion()
     ClearReset ‘se deja !RESET a 0
     ClearSck ‘se deja SCK a 0
     ActivarVcc ‘se activa la alimentación
     GeneraClocks(1) ‘se aplica un pulso de clock a la senyal Xtal1
     SetReset ‘se da un pulso a !RESET
     GeneraClocks(4)
     ClearReset
     Espera 20 msg ‘se espera 20 msg
fin procedimiento
Ejemplo de activación seguida de envío y recepción : se puede observar el proceso de activación y parte del envío de la secuencia de inicialización del modo de programación.
 
3.4-Instrucción de inicialización del modo de programación en el modelo AVR-85x5
Una vez se ha ejecutado la secuencia de inicialización anterior, hay que enviar al microcontrolador la secuencia correspondiente a la Instrucción de Inicialización del Modo de Programación: “10101100 , 01010011 , XXXXXXXX , XXXXXXXX” (X=cualquier valor). Si existe sincronización con el microcontrolador este aceptará la secuencia y devolverá el eco del segundo byte e irá respondiendo a medida que le vayamos enviando el resto de bytes. Es decir que si todo va bien durante la transmisión del tercer byte este nos enviara un 01010011 (53h). Si el microcontrolador no responde es que algo no ha salido bien, y deberemos intentar enviar la secuencia de nuevo. En el datasheet se especifica que si después de 32 intentos no se recibe respuesta es que no hay microcontrolador o esta mal conectado, pero lo mas seguro es que si en un par o dos de intentos no recibimos respuesta el microcontrolador no responda en los siguientes 30 intentos restantes, así que con probarlo 2 o 3 veces ya es suficiente.
 
3.5-Instrucción de borrado de la memoria en el modelo AVR-85x5
Esta instrucción borra el contenido de la memoria Flash, memoria EPROM y de los Lock Bit, mientras que no modifica los Fuse Bits. Es aconsejable ejecutar esta instrucción antes de programar el microcontrolador. La secuencia a enviar es: “10101100 , 100XXXXX , XXXXXXXX , XXXXXXXX” (X=cualquier valor). No hace falta decir que antes de poder enviar esta secuencia hay que haber activado el modo de programación y haber enviado la Instrucción de Inicialización del Modo de Programación correctamente.
 
3.6-Instrucción de escritura en la memoria de programa (Flash) en el modelo AVR-8515
El microcontrolador AVR8515 dispone de una memoria de programa de 8k organizada en 4096 posiciones de 16bits, cada una de las cuales se divide en una parte alta y en una parte baja, amabas de 8 bits. El contenido de esta memoria se modifica mediante la Instrucción de Escritura en la Memoria de Programa: se hacen dos accesos para cada dirección. En el primer acceso se actualiza la parte alta de la dirección de memoria, y en el segundo la parte baja, o viceversa. La secuencia es: “0100H000 , XXXXAAAA , BBBBBBBB , IIIIIIII” (H=bit que indica si se modifica la parte alta H=1, o la parte baja H=0 , X=cualquier valor, AAAA = bits altos 11..8 de la dirección, BBBBBBBB = bits bajos 7..0 de la dirección, IIIIIIII = byte a guardar en la memoria). Por tanto hay que enviar dos secuencias de 4 bytes cada una: una para actualizar la parte alta, y la otra para actualizar la parte baja.

La actualización de un byte en memoria no es inmediata, por lo que después de escribir un valor en la memoria de programa hay que esperar un pequeño intervalo de tiempo antes de escribir el siguiente valor, este intervalo se especifica en el datasheet como Twd_prog. Una alternativa a la espera es hacer lecturas succesivas sobre la dirección escrita, de forma que si este todavía no ha terminado de escribir el valor, retornara el valor 7Fh, mientras que si la escritura ha terminado retornara el valor escrito, lo que indica que el microcontrolador ya esta listo para escribir el siguiente valor. Lógicamente el método de polling no es útil cuando se guarda el valor 7Fh en memoria, y en este caso solo queda la opción de esperar Twd_prog.

Como con todas las demás instrucciones, es obvio que antes de poder enviar la secuencia de Escritura en la Memoria de Programa hay que haber Activado el programador y haber enviado la Instrucción de Inicialización del Modo de Programación correctamente.
 
3.7-Instrucción de lectura de memoria de programa (Flash) en el modelo AVR-85x5
Como la memoria de programa se estructura en 4096 posiciones de 16 bits, y la instrucción de Lectura de Memoria de Programa solo permite leer un byte, hay que hacer 2 accesos a la misma dirección de memoria por tal de leer su contenido completo: en un primer acceso se lee la parte alta, y en un segundo acceso se lee la parte baja, o viceversa. La secuencia de la instrucción de Lectura de Memoria de Programa es la siguiente: “0010H000 , XXXXAAAA , BBBBBBBB , oooooooo” ( H=bit que indica si se consulta el byte de la parte alta H=1, o el de la parte baja H=0 , X=cualquier valor, AAAA = bits altos 11..8 de la direccion, BBBBBBBB = bits bajos 7..0 de la direccion, ooooooo byte en el que el micrcontrolador envia el valor). Asi, cuando se envia el ultimo byte de la secuencia, el microcontrolador responde a traves de MISO con el byte almacenado en la parte alta o baja de la posicion consultada.

Al contrario que en la escritura, al leer succesivos valores de memoria, no es necesario hacer ninguna pausa.

Como sucede con todas las demas instrucciones, antes de poder enviar la secuencia de Lectura en la Memoria de Programa hay que haber Activado el programador y haber enviado la Instrucción de Inicialización del Modo de Programación correctamente.
 
3.8-Instrucción de escritura en la memoria de datos (EEPROM) en el modelo AVR-85x5
El microcontrolador AVR8515 dispone de una memoria EEPROM de 512 bytes organizada en 512 posiciones de 8bits, para datos. El contenido de esta memoria se programa mediante la Instrucción de Escritura en la Memoria EEPROM. La secuencia correspondiente a esta instrucción es: “11000000 , XXXXXXXA , BBBBBBBB , IIIIIIII” ( A = bit alto 8 de la dirección, BBBBBBBB = bits bajos 7..0 de la dirección, IIIIIIII = byte a guardar en la memoria). Cada dirección de la memoria EPROM se programa mediante un único acceso a memoria, es decir de una sola vez, al contrario de lo que sucede con la memoria de programa.

Al igual que con la memoria Flash, la actualización de un byte en esta memoria no es immediata, por lo que después de escribir un valor hay que esperar un pequeño intervalo de tiempo antes de escrbir el siguiente, la duración de este se especifica en el datasheet como Twd_prog. También se pueden utilizar técnicas de polling, pero lo más aconsejable es esperar siempre el intervalo de tiempo Twd_prog.

Como con todas las demás instrucciones, no hace falta decir que antes de poder enviar la secuencia de Escritura en la Memoria de Programa hay que haber Activado el programador y haber enviado la Instrucción de Inicialización del Modo de Programación correctamente.
 
3.9-Instrucción de lectura de la memoria EEPROM en el modelo AVR-85x5
La lectura del contenido de una posición de la memoria EEPROM se hace en único acceso a la memoria mediante la instrucción de Lectura de Memoria EEPROM. La secuencia de la instrucción de Lectura de Memoria EEPROM es la siguiente: “10100000 , XXXXXXXA , BBBBBBBB , oooooooo” ( A = bit alto 8 de la dirección, BBBBBBBB = bits bajos 7..0 de la dirección, ooooooo byte en el que el micrcontrolador envía el valor). Así, cuando se envía el último byte de la secuencia, el microcontrolador responde a través de MISO con el byte almacenado en la posición consultada. Al contrario que en la escritura, al leer sucesivos valores de memoria, no es necesario hacer ninguna pausa. Como sucede con todas las demás instrucciones, antes de poder enviar la secuencia de Lectura en la Memoria EEPROM hay que haber activado el programador y haber enviado la Instrucción de Inicialización del Modo de Programación correctamente.
 
4-Acceso al puerto paralelo (IMPORTANTE)
Como se ha dicho ya, Telecarga AVR emula una SPI a través de algunos de los pins del puerto paralelo. Para ello ha sido necesario localizar alguna librería que permita acceder a bajo nivel a los registros de este puerto desde Visual .NET, ya que por defecto éste no lo permite. Esta librería es la dll inpout32.dll, y el acceso al puerto se realiza mediante las rutinas Out para escribir, e Inp para leer:

'Librerias de acceso al puerto paralelo
Public Declare Function Inp Lib "inpout32.dll" Alias "Inp32" (ByVal PortAddress As Integer) As Integer
Public Declare Sub Out Lib "inpout32.dll" Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer)

Es importante remarcar también que para que esta dll funcione correctamente deberá "abrirse" el acceso al puerto paralelo, ya que por defecto Windows XP no nos lo permitirá. Para ello debermos instalar antes la aplicación UserPort, la cual habilitará el acceso al hardware de este puerto a todas las aplicaciones que lo soliciten. De no ejecutarse, todos los accesos al puerto generarán excepción causando el cierre de la aplicación.

El siguiente esquema muestra las conexiones necesarias para programar cualquier microcontrolador de la familia AVR-ATmega con el programa Telecarga AVR. Las lineas de la SPI emulada por el puerto paralelo deberán conectarse a las correspondientes líneas de programación SPI de cada micrcontrolador, las cuales son distintas en cada modelo y no tienen porqué coincidir con los periféricos SPI internos del micro:

Conexiones entre el microcontrolador y el puerto paralelo

Si se desea modificar el conexionado y utilizar otros pines del puerto paralelo bastará con modificar el código de las funciones que controlan el acceso al puerto ( módulo Comunicacion )
 
5-Descarga del proyecto
Aquí puedes descargarte todos los ficheros del proyecto Telecarga AVR. La utilización de cualquier información o programa disponible en este sitio web implica la aceptación de las siguientes condiciones:
- Licencia: ( licencia by-nc-sa de Creative-Commons ) : Reconocimiento - NoComercial - CompartirIgual (by-nc-sa): No se permite un uso comercial de la obra original ni de las posibles obras derivadas, la distribución de las cuales se debe hacer con una licencia igual a la que regula la obra original.
- Responsabilidad y garantia: el material e información aquí publicado se proporciona tal como es, sin garantías de ningún tipo, y es el usuario el único responsable de analizar y determinar la conveniencia de usarlo y compartirlo asumiendo a su vez los riesgos que ello pueda conllevar. El autor no se responsabiliza bajo ningún concepto, de ningún tipo de daño, directo o indirecto que el uso del material e información aquí publicada pueda causar.
 
 
. . . Label, Program & Audiovisuals 2006 Tolaemon . . .
Creative Commons License