Vous êtes sur la page 1sur 17

TUTORIAL PARA PROGRAMAR UN

ATMEGA8
Este tutorial está diseñado para las personas que nunca han utilizado un microcontrolador de Atmel, y
quieren empezar a desarrollar sus proyectos con esta tecnología. Para este caso utilizaremos un Atmega8
para ilustrar todo el proceso, que es exactamente el mismo para los demás micros.
Primero cabe resaltar algunas de las ventajas que encontramos al utilizar esta clase de micro controladores,
entre las que se encuentran:
• El software para la programación es totalmente gratuito y se puede descargar desde la página
principal de Atmel, incluyendo las herramientas para programar en C o C++.
• Se pueden programar con tan solo un cable paralelo y 4 resistencias, sin gastar en programadores
excesivamente costosos.
• Incluye un cristal interno programable, lo cual permite ahorrar en componentes y simplifica los
montajes.
• Y la mejor ventaja que se tiene, es que puede simularse en PROTEUS junto con muchos de los
dispositivos que se utilizan comúnmente, permitiendo ajustar el diseño sin tener que estar
reprogramando el micro una infinidad de veces.

ANTES DE EMPEZAR
Lo primero que se necesita para programa un ATMEGA8 es el software para escribir el código, el cual lo
distribuye ATMEL completamente gratis y se puede descargar de:
http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725
De aquí se debe descargar la última versión del AVRStudio, incluyendo el Service Pack más actualizado. Para
este tutorial vamos a trabajar con el AVR Studio Versión 4.13.
Ahora, si lo que queremos es programar nuestro micro en C o C++, es necesario instalar el WINAVR, el cual
se puede descargar de:
http://winavr.sourceforge.net/
Para la simulación se puede utilizar el mismo AVRStudio, sin embargo lo más recomendable y práctico es
utilizar el PROTEUS de VSM (http://www.ieeproteus.com/), el cual lamentablemente no es gratis, pero se
puede conseguir (bajo la responsabilidad de cada uno) en el Emule o en:

http://elakt.mforos.com/1426006/6725101-proteus/
Finalmente, para “quemar” el programa en el micro, es necesario tener el PONYPROG, el cual puede
descargarse de:
http://www.lancos.com/ppwin95.html
Y el plano del quemador:
http://elakt.mforos.com/1426006/6722430-plano-quemador-atmega/

ELAKT
En resumen, antes de empezar lo más recomendable es tener:
• AVRStudio con Service Pack
o • http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725
• WinAVR
o http://winavr.sourceforge.net/
• PROTEUS
o http://elakt.mforos.com/1426006/6725101-proteus/
• PonyProg
o http://www.lancos.com/ppwin95.html
• Quemador del micro
o http://elakt.mforos.com/1426006/6722430-plano-quemador-atmega/

CREANDO UN NUEVO PROYECTO


Para ilustrar como es el proceso de crear un primer proyecto en un ATmega8, se va a ilustrar paso a paso
un sencillo programa que se encargará de hacer titilar un LED, con un segundo de espera entre el
encendido y el apagado.
Se va a mostrar en primer lugar el proceso para hacer el proyecto en assembler, y después se mirarán los
cambios necesarios en el caso del programa en C.

Assembler

En primer lugar se abre el AVRStudio, que es el programa en donde vamos a escribir el código del proyecto
y hacer la primera simulación del mismo.
Lo primero que se ve al abrir el programa es algo como la imagen, donde le damos click en New Project.

Una vez aquí se tienen las opciones de generar un proyecto en Assembler o C. Para este caso se escoge la
opción de Assembler y le damos como nombre Led. Aquí pregunta en donde se quiere guardar el proyecto,

ELAKT
y da la opción de crear una nueva carpeta que lo contenga, con el mismo nombre, que es lo más
recomendable para organizar todos los proyectos que se vayan a hacer.

Finalmente se debe escoger la herramienta que vamos a usar para la depuración en el caso de tener alguna
tarjeta de desarrollo. Como este no es el caso, se escoge la opción de simulador (AVR Simulator), y se
escoge el micro que se va a programar (ATmega8).

ELAKT
Ahora, una vez creado el proyecto se va a encontrar una pantalla como la siguiente:

Donde se tiene:
1. Los archivos que tiene nuestro proyecto. En este caso solo se muestra el archivo Led.asm, dado que
aún no se ha compilado nada.
2. Espacio para escribir el código que se va a programar en el micro.
3. Los puertos que dispone el microcontrolador, cada uno con su nombre y su dirección de memoria,
lo cual es muy útil a la hora de hacer el código y de la simulación, como se verá más adelante.
4. El panel de mensajes, que se usa principalmente para mostrar los errores y las advertencias que se
tengan con respecto al código escrito.

Teniendo esto en cuenta, el siguiente paso es copiar el código que se da a continuación y compilarlo.
Código
.include “m8def.inc”
.def temp=r16
.def cero=r17
.def tiempo=r18
.def tiempo1=r19
.def tiempo2=r20

.org 0x0000
rjmp reset
reset:
ldi R25,LOW(ramend)
out SPL,R25
ldi R25,HIGH(ramend)
out SPH,R25

ELAKT
ser temp
out DDRD,temp ;Puerto D como salida
ldi cero,$00
inicio: com temp ;Inicia bit0 prendido
out Portd,temp
rcall Delay
rjmp inicio
Delay: ldi tiempo,100 ;Número de milisegundos
For: ldi tiempo1,10 ;Simulamos un ciclo for que
For1: ldi tiempo2,249 ;demora1000 ciclos(1ms)
For2: dec tiempo2
cpse tiempo2,cero
rjmp For2
dec tiempo1
cpse tiempo1,cero
rjmp For1
dec tiempo
cpse tiempo,cero
rjmp For
ret

Básicamente este código define el puerto D como salida, y hace que cambie el nivel lógico de todo el
puerto después de una rutina de espera Delay, programado para durar aproximadamente un segundo. Para
entender mejor el código debe mirarse la hoja de datos del micro donde vienen todas las instrucciones
explicadas y se muestra el manejo de todos los registros, lo cual se sale del alcance de este tutorial.

Una vez copiado el código, para compilar se puede ir al menu Build – Build, darle click en el ícono que se
muestra en la imagen, o simplemente presionar F7.

Una vez hecho esto, vemos la información que se muestra en la parte inferior, donde, como no existe
ningún error en la compilación, se tiene el espacio que este código genera en cada uno de los bloques de
memoria del microcontrolador, que en este caso queda ocupado tan solo en un 0.6%.
También puede observarse los nuevos archivos que nos muestra y que se generan al compilar el código,
todos relacionados con el proyecto que se está trabajando.

ELAKT
En este punto ya hemos completado nuestro proyecto, ya que al compilar el código se genera en archivo
.hex, que es el que utiliza el PonyProg para quemar el micro; sin embargo vamos a ver la opción de
simulación que nos da el AVRStudio.

SIMULACIÓN
AVRStudio

Vamos a ver en primera instancia, la simulación utilizando el AVRStudio, el cual tiene la ventaja de permitir
ver que pasa individualmente con cada registro del micro, además del contador de programa y el contador
de ciclos para aplicaciones en las cuales el control del tiempo resulta crucial.
Para tener habilitada la opción del contador de ciclos y de programa, hay que activar la opción en View –
Toolbars – Processor, lo cual va a abrir una nueva pestaña como se muestra en la figura.
Para iniciar la simulación se puede acceder a Build – Build and Run o darle click al ícono número 1 de la
figura, o presionar Ctrl + F7. Una vez hecho esto vemos como aparece una flecha en el campo del código, la
cual indica la línea que se está ejecutando en cada momento de la simulación.

Una vez aquí, se tienen varias opciones para controlar la forma en la cual se va mirar el flujo del programa,
ya sea línea por línea utilizando el ícono 2, ejecutando el programa hasta donde tengamos el cursor
utilizando el ícono 3, dejando que se ejecute sin ninguna restricción, utilizado breakpoints etc.
Para visualizar los valores que va manejando el micro, se tiene en primer lugar la lista de registros en la
parte derecha, donde se muestra el valor que va tomando cada registro en el punto del programa en el que
nos encontremos. Para las variables, se abre la ventana Watch en el menú View – Watch, en la cual
escribiendo el nombre de cada variable tenemos acceso a su respectivo valor en cada instante de la
simulación.
Ahora, vamos a utilizar la simulación para mirar el tiempo que demora la rutina Delay utilizando el contador
de ciclos de la ventana processor.

ELAKT
Para esto, se debe ir haciendo click en el ícono 2 (Step into) o presionando F11 hasta que el cursor se sitúe
en la rutina Delay. Mientras se va corriendo dentro del programa, se puede ir viendo como se van
actualizando los valores de los registros y de los contadores de programa.

Entonces, para ver cuánto tiempo utiliza la rutina Delay, vamos a poner en 0 el contador de ciclos y el reloj
haciendo click derecho en la ventana processor como en la figura.

Una vez hecho esto llevamos el cursor al final de la rutina haciendo click en la línea de código ret.

ELAKT
Luego le damos click al ícono Run to cursor, con el fin de que se ejecute el programa automáticamente
hasta el punto donde se encuentra el cursor, que es el final de la rutina en este caso. Dado la cantidad de
pasos que tiene que hacer el programa para llegar a este punto, se debe esperar algunos segundos antes de
que se tenga acceso de nuevo a la simulación. Si se da el caso en el que la ejecución se quede en algún ciclo
infinito o tome demasiado tiempo en terminar, se debe darle Stop para poder retomar la simulación.

ELAKT
Finalmente podemos ver el tiempo que demoró la ejecución de la rutina, que como se quería es de un
segundo, con un pequeño desfase de 400us, que no va a ser relevante para este proyecto dado que el ojo
no va a lograr percibirlo.

Proteus

Proteus es una herramienta de simulación muy poderosa, la cual va a permitir un análisis del circuito
completo del diseño, enfocado hacia todos los componentes del montaje y no solo lo que sucede con el
microcontrolador.
Lo primero que se va a hacer para empezar con la simulación es buscar los componentes que necesitamos.
Para esto, se debe tener en cuenta que este seleccionado el ícono que se muestra en la figura con una
flecha (que aparece por defecto cuando abrimos el proteus), o el ícono que está debajo de este
(Componentes). Una vez se tiene seleccionado, hay que hacer click en la P (Pick Devices) para abrir el
cuadro de diálogo que muestra todos los componentes disponibles.

Una vez aquí, se escribe ATmega8 (o el micro que se esté utilizando) en el cuadro Keywords, lo cual
automáticamente muestra que el componente puede simularse y permite verificar la posición de los pines.
Finalmente al darle click en OK, se ve como el componente aparece ahora listado en el panel de Devices
(Esto siempre y cuando se esté trabajando con el ícono Components, de lo contrario se mostrarán otras
opciones en la lista).

ELAKT
Ahora, para colocar el componente en la hoja de simulación, simplemente se selecciona de la lista Devices y
se le da click donde se quiera colocar.

Para el Led se sigue el mismo procedimiento que para buscar el ATmega, pero ahora en Keywords se
escribe Led blue (puede escribirse Led, pero para ser un poco más específicos se va a buscar uno azul), le
damos click en LED – BLUE y OK. Y de la misma forma que antes lo colocamos en la hoja de simulación.

ELAKT
Una vez tenemos ambos componentes, para hacer el cableado hay que acercar el mouse a uno de los pines
del puerto D del micro, hasta que el apuntador del mouse que se ve en forma de lápiz cambie a un color
verde y salga un cuadro rojo bordeando la punta del pin del micro. En este punto se hace click, y se vuelve a
hacer click en el otro punto que se desea conectar, en este caso el pin del ánodo del Led.

Ahora falta conectar la tierra del circuito. Para esto hay que activar el ícono Terminals Mode (el que se ve
en la figura), selccionar GROUND y colocarlo en la hoja como cualquier componente. Hecho esto, se
conecta la tierra al cátodo del Led para completar el montaje.

ELAKT
Nota: Hay que tener en cuenta que este montaje no debe implementarse físicamente, dado que sin una
resistencia en serie con el Led se produce un corto y puede causarle daños al microcontrolador. Para
efectos de simulación esto no es importante, pero cuando se vaya a montar el circuito se debe colocar una
resistencia típicamente de 220ohm o de mayor valor.

Una vez se tiene ubicado todo el circuito, hay que cargar el programa del micro. Para esto se le da “doble
click” al microcontrolador en la hoja de simulación, lo cual abre un cuadro de diálogo donde se pueden ver
y modificar las características con las que se va a simular el micro. Dado que el programa lo hicimos con un
reloj de 1MHz (que viene por defecto tanto en el micro, como en el AVR y el proteus) dejamos esta opción
como esta y le damos click en el ícono de Program File.

ELAKT
Se busca el archivo .hex en la carpeta del proyecto, que es el archivo que genera el AVRStudio una vez que
hemos compilado satisfactoriamente el programa, se carga y click en OK.

Ya con el programa cargado, solo resta comenzar con la simulación.

ELAKT
Para la simulación se pueden resaltar cuatro puntos importantes:

1. Botón de play para iniciar la simulación.


2. Cada pin del microcontrolador tiene un indicador que muestra su nivel lógico en cada instante de la
simulación. Se puede como va cambiando con la ejecución del programa, asi como el Led del
circuito.
3. El reloj de la simulación. Es muy importante tener en cuenta que la velocidad a la cual se simula el
programa no es exactamente la velocidad real del circuito, es así que puede parecer que el
parpadeo del Led es un poco lento en el programa, pero al mirar el reloj de la simulación se puede
ver como efectivamente cambia su estado cada segundo.

ELAKT
Finalmente otra de las opciones más interesantes del Proteus es el osciloscopio, el cual permite ver las
señales que se manejan en el circuito junto con la simulación. Esta y otras opciones interesantes se pueden
ver en el ícono Virtual Instruments Mode.

PROGRAMACIÓN
Una vez se tiene el proyecto diseñado y simulado satisfactoriamente, el último paso es la programación
física del micro. Para esto vamos a usar el PonyProg (Version 2.06f Beta para este caso).
Una vez que abrimos el programa, lo primero es definir el micro que vamos a utilizar, ATmega8 en este
caso, como se muestra en la figura.

Una vez hecho esto, debemos definir el tipo de programador para que se ajuste al del plano que tenemos.
Para esto se entra en Setup – Interface Setup, y dar click en las opciones Parallel Port, Avr ISP I/O y puerto
LPT1.
Ahora, se debe CONECTAR el quemador y se le da la opción Probe, la cual verifica que el computador tenga
acceso correcto al puerto y el quemador este bien montado. En caso que la prueba de un resultado
negativo, se debe revisar el cableado del quemador y los permisos del puerto que tenga el Windows XP.

ELAKT
Una vez se tiene configurado el quemador de manera adecuada, se carga el archivo del programa que
generamos “Led.hex”, accediendo a File – Open Device File, o haciendo click en el ícono de la carpeta
amarilla. Haciendo esto se muestra inmediatamente en el programa el contenido que va a ser programado
en la memoria del micro, que corresponde al código que se hizo.

Finalmente queda solo tener acceso físico al micro, para lo cual debemos tener el quemador junto con el
microcontrolador alimentado de manera adecuada conectados al PC (Para esto se debe revisar el datasheet
del micro utilizado para alimentar los pines de Vcc y de Gnd).

ELAKT
Lo primero que se debe hacer es borrar el contenido del micro, haciendo click en el ícono 1 de la figura o
accediendo a Command – Erase, para eliminar cualquier información que tuviere, y para comprobar que se
tiene bien configurado el acceso al microcontrolador. En caso de recibir un error en este punto se deben
revisar las conexiones y el microcontrolador.
Una vez se ha borrado la información del micro, se le da click en el ícono 2 de la figura, o accediendo a
Command – Write Program (FLASH), para finalmente terminar con la programación de nuestro primer
proyecto en un micro de ATMEL. Ya después lo único que resta es hacer el montaje con el LED (sin olvidar
una resistencia en serie, normalmente de 220 ohm o más, para evitar cortos y daños en el micro) y verlo
titilar.

ELAKT