martes, 26 de junio de 2012

Programando un Atmel: Mi primer programa




Resumen:

Todos los que nos enseñan a programar microcontroladores empiezan haciendo un programa que hace que un Led se prenda y se apague, y esto es lo que nosotros vamos realizar, pero de una forma didactica y super facil de enterder.

Esquema Electrónico a utilizar:



Programando en C:

Para aprende a programar microcontroladores de la fábrica Atmel, vamos a utilizar el Atmel Studio 6.0
que lo pueden descargar se su pagina web.

Empecemos:

Iniciando el programa Atmel Studio 6.0, nos mostrara la siguiente página de Bienvenida:

El programa esta en ingles, además es un poco pesado, pero no importa al final a cabo solo es un único instalador, porque las versiones anteriores teníamos que instalar primero el núcleo o que diga el compilador, luego el programa para escribir en el lenguaje C, era todo un problema instalarlo, porque el programa trabajaba bien, pero a la hora de compilar, no generaba el archivo .HEX, que al final cabo es lo único que vale para llevar nuestro esquema al mundo real.

Así que empecemos a crear nuestro primer proyecto, le damos: New Proyect, en la pagina inicial y nos mostrara la siguiente imagen:


Elegimos en primer lugar el lugar en el cual vamos a crear el nuevo proyecto, para no hacernos problemas, creamos una carpeta y allí es donde vamos a guardar el proyecto.

Name: Ejem1
Location: C:\Documents and Settings\Administrador\Escritorio\Ejem1\ (Creamos una carpeta en el escritorio).
Solution name: Ejem1

Finalmente y lo más importante elegimos como lenguaje de programación en la primera opción:

GCC C Executable Project C/C++ (Es la mejor opción para iniciara programar microcontroladores de la Fabrica Atmel, nos creara una hoja para ser programado en lenguaje C y al compilar nos creara el archivo .HEX, que lo único que nos sirve para grabar el programa físicamente en el microcontrolador).

Le damos Ok, y nos aparecerá la siguiente imagen:




En esta parte  hay que seleccionar el microcontrolador a utilizar, para ello escribiremos atmega8 en el cuadro de búsqueda, este microcontrolador es ideal para aprender a programar microcontroladores de la fabrica Atmel, tiene buenas características y el costo para mi es mas barato que un microcontrolador Microchip.

Bueno, al hacer la búsqueda, nos muestra la siguiente imagen:



Después de tantos pasos para crear nuestro primer programa en lenguaje C para microcontroladores Atmel, así que le damos Ok, y nos presentara la siguiente imagen:


Veamos que la hoja presenta ya códigos, que por defecto nos ha sido creador por el programa, así que explicaremos un poco del código, para empezar a entender como es el lenguaje C para los microcontroladores Atmel, empecemos:

// Es el símbolo para introducir comentarios, pero de una sola linea.
/* Representa a un comentario más largo, solo recuerde que debe cerrarce con */

#include<avr/io.h>  
/* Esta es llamada a una librería, en este caso llamaremos la librería que hace referencia a todas las palabras reservadas, para el control de los puertos de entrada y salida.*/

int main (void){
 /*Bueno esta es la función principal, en el escribiremos todo el código necesario para manejar nuestros sistemas electrónicos, teniendo como cerebro un microcontrolador Atmel.*/
}

while(1){
 /*Esta palabra reservada del C, significa "mientras", en este caso while(1), hace que todo lo que este dentro se repita y otra vez.*/
}

Ya dejemos de explicaciones, así empecemos con el programa para el siguiente sistema electrónico que se debe de programar en un microcontrolador Atmel.





Para explicar las palabras reservadas, vamos a ampliar el código generado:


Veamos:

#include <avr/io.h> 
/*llama a nuestro hoja todas las funciones, para manejar los puertos de entrada y salida */

#include <util/delay> 
/*Libreria que contiene todas las funciones para manejar los retardos de tiempo*/

int main (void){
/*Función principal, es todo lo que ejecutar nuestro microcontrolador*/
}

DDRB = 0x00;
 /*La palabra reservada DDRB, hace referencia al puerto B, es decir le dice que vamos a configurar al los registros del puerto B, en este caso con un valor "0", le decimos que entrada, con el valor "0x00", le decimos que todos lo pines del puerto B, serán entradas.*/

DDRD = 0xFF; 
/*Configuracion de registros, pero con "1", le decimos que vamos a configurar al puerto D como salida, con el valor "0xFF", le decimos que todos los pines del D van ha ser salidas.*/

if(PINB==0x01) 
{}
/*Esta condicional dice que: si el el PINB0=1, entonces se ejecuta su contenido, tenga presente que estamos trabajando con valores hexadecimales y que cada valor binario hace referencia a cada PIN del microcontrolador*/

PORTD = 0x01;
/*Escribimos en el el puerto D el valor Hexadecimal de 01, en binario: 0000 0001, en los pines seria: D7D6D5D4 D3D2D1D0=0000 0001*/

_delay_ms(150); 
/*Hacemos un pequeño retardo de tiempo que nos indicara cuanto tiempo estará prendido después de presionar el Push Button.*/

PORTD = 0x00;
 /*Hacemos de prender el led se apagué, es decir regrese a su estado inicial*/

Después de escribir nuestro código, solo nos queda compilar para genera el archivo de extensión .HEX, para eso hacemos clic en Build:


 Hacemos clic en Buil Ejem1:



Luego en la parte inferior del programa empezara a compilar, y no hay error nos presentara la siguiente imagen:


Y en la carpeta que crearon su proyecto se habrán generado los siguiente archivos:

Y en la carpeta Debug:


En esta carpeta se encuentra un archivo de extensión .hex (Ejem1.hex), este archivo es lo único que necesitamos para grabar el programa en un microcontrolador, veamos su contenido con el editor de texto y nos mostrara la siguiente imagen:


Bueno creo nadie podría entenderlo, pues solo es código hexadecimal, son valores Hexadecimales, que no nos dan referencia de que es lo que hace nuestro programa.

Finalmente cargamos este archivo en proteus, para comprobar su funcionamiento.

Si deseas aprender mas sobre Programación de Microcontroladores, puedes ayudarnos a preparar el Curso:




15 comentarios:

  1. tengo un problema con un programa quiero cambiar una variable, cuando cuante un contador con la int de timer overflow, y despues en la funcion main en el while(1) verificar su estado y si tiene determinado valor detener el timer pero no se puede alguien me puede ayudar aqui les dejo el programa:

    #include
    #include

    volatile int c;
    volatile int sal;
    volatile int sal2;

    void INICIA_TIMER(void) //FUNCION DE CONFIGURACION DE IO
    {
    DDRC=0b111111;
    TCCR1B=0b1;
    TIMSK1=1; //ACTIVA INT DE TIMER1
    sei();
    }

    void DETIENE_TIMER(void)
    {
    TCCR1B=0b0;
    }
    int main()
    {
    sal=0;
    sal2=0;
    INICIA_TIMER();

    while(1);
    {
    if(sal2==1)
    {
    DETIENE_TIMER();
    }
    }
    }

    ISR(TIMER1_OVF_vect)
    {
    c=c+1;
    if(c>=100)
    {
    if(sal==0)
    {
    PORTC=0b100000;
    sal=1;
    c=0;
    }
    else if(sal==1)
    {
    PORTC=0b000000;
    sal=0;
    c=0;
    sal2=1;
    }
    }
    }

    el problema es que nunca se detiene el timer

    ResponderEliminar
  2. me podria decir como declarar los purtos Bit a Bit en atmel studio por k aun no e podido encontrar eso

    ResponderEliminar
    Respuestas
    1. Para declarar como salida o entrada, bit a bit :

      DDRA|=(0x01<<PINA1);// declara al pin A1 como salida

      DDRA&=~(0x01<<PINA1); // declara al pin A1 como entrada

      Eliminar
  3. hola, estuve programando y cuando lo compilo me sale siempre esta advertecia: #warning "F_CPU not defined for " [-Wcpp]
    eso es normal ??? ya lo revise todo y siempre me sale eso.

    ResponderEliminar
    Respuestas
    1. Este comentario ha sido eliminado por el autor.

      Eliminar
    2. tienes que definir la frecuencia con la que trabajara el AVR , antes de declarar util/delay.h

      #define F_CPU 4000000
      // define la frecuencia a 4MHz

      Eliminar
    3. con la frecuencia en 4MHz cuanto tardaria un segundo? osea que valor introduzco en el delay

      Eliminar
  4. q tal amigos, yo tengo una pequeña duda que creo que ustedes me la pueden resolver, yo quiero programar mi arduino (uC atmega1280) pero no tengo la quemadora del uC excepto la que trae el mismo controlador, yo estoy seguro que al programarlo en el lenguaue puro de atmega puedo sacarle mayor provecho al uC, ustede me pueden explicar como programarlo en el mismo software que trae arduino o necesito usar un software diferente???

    ResponderEliminar
  5. Que tal men, muy interesante tu primer programa, me pregunto si tienes mas tutoriales para seguir programando, otros ejemplos quizas, o mas sobre la programacion. Saludos

    ResponderEliminar
  6. men que tal, mira tengo mi grabador de atmega, hace años lo use cuando mi maquina era windows 7, ahora que tengo otra y es de windows 8 el driver no lo reconoce, tendras el driver para los grabadores de atmega? y porfavor ams tutoriales que esta demasiado interesante.
    saludos

    ResponderEliminar
  7. que programa uso para compilarlo en mi microcontrolador atmega?

    ResponderEliminar
  8. ¿cómo puedo utilizar las interrupciones externas(en lenguaje C no ensamblador? ayudenme por favor

    ResponderEliminar
  9. Hola muchas gracias por el tutorial es de mucha utilidad, soy nuevo programando con PIC de la marca atmel, queria saber si el avr studio trae librerias para manejo de LCD asi tipo ccs o hay que hacer las funciones?

    ResponderEliminar
  10. Claro que sí hay librerias para atmel studio. Visiten mi bloc que recién inicio
    Ok

    ResponderEliminar
  11. Muy buena explicación, me ayudó muchísimo. Gracias amigo!!!.

    ResponderEliminar