jueves, 28 de junio de 2012

Parpadeo de Leds en un Atmega

Resumen:

En esta segunda leccion de programacion de microcontroladores de la fabrica Atmel con lenguaje C, vamos a realizar un programa que haga que una fila de leds, tengan un parpadeo que nos da la sensacion del movimiento de una luz que se desplaza.

Esquema Electronico:


Programando en C:

1. Abrimos el programa Atmel Studio 6.0, nos mostrara la siguiente pantalla:



2. Hacemos clic en New Proyect, nos aparece la pantalla en cual vamos a especificar, el nombre del proyecto, el tipo de lenguaje de programación que vamos a utilizar (tenemos dos lenguanje C++ y C), así que escribimos y seleccionamos la ruta donde se guardaran los archivos que nos genere al compilar el programa, todo lo dejamos tal como  nos muestra la siguiente imagen:



3. Le damos OK, luego nos aparece el cuadro en el cual vamos a seleccionar el microcontrolador Atmel que vamos a utilizar, vamos a utilizar el microcontrolador Atmega8, tal como se muestra a continuación:


4. Finalmente le damos OK, y nos aparecerá la pagina principal, en el cual vamos a escribir todo nuestro programa en lenguaje C, la imagen que nos presenta es la siguiente:


5. Empecemos con la programación, así que les presento el programa elaborado, que posteriormente se explicara paso a paso, cada una de las funciones y palabras reservadas usadas.



6. Analizando el código del programa:

//Se utiliza para introducir comentarios.

#include <avr/io.h>
 /*Llamamos a nuestra hoja la librería que contiene las funciones para la configuración y manejo de los puertos de entrada y salida del microcontrolador*/

#include <util/delay.h>
/*Llamamos a nuestra hoja la librería que contiene todas las funciones para el control de retardos de tiempo, entre las funciones mas usadas son: _delay_ms(), _delay_loop_1(), delay_loop_2(), entre otras funciones que miden el tiempo de retardo que deseemos dar al realizar una acción.*/

int main(void){
}
/*Función principal, en el se encuentra todo lo que va ha realizar nuestro microcontrolador*/

DDRD = 0xFF;
/*Con la función DDRD, le decimos que vamos a configurar el puerto D, si fuera DDRB, configuramos el puerto B, etc.
El valor 0xFF, el un valor Hexadecimal, 0x...Significa que vamos a escribir un valor Hexadecimal, 0xb..,significa que vamos a escribir un valor binario, para este caso FF = 255, es decir que todos los pines del puerto D, van ha ser configurados como salidas (0 = entrada; 1 = salida).*/


while(1){
}
/*Es una sentencia de control, es decir, esta función proviene del lenguanje C, lo que dice es que mientras sea 1, hacemos todo lo que esta dentro, para este caso al introducir en su parámetro (1), esto siempre sera verdadero y por lo tanto se ha creado un lazo cerrado, siempre se va ha repetir todo lo que esta dentro de esta función de control.

for(int i=1; i<=128; i=i*2){
}
/*Esta es otra función de control, el cual hace uso de una variable llamada i de tipo int (valor de 8 bits), bueno lo que dice esta función es que configuramos a la variable i con int(valor de 0 a 255), todo lo que este dentro se va ha repetir mientras i<=128, y cada vez que se repita i va ha tomar el valor de i*2, es decir cada vez que el bucle se repita la variable i se va ha multiplicar por 2 (i=i*2) y esto se va ha repetir hasta que i sea menor o igual a 128 (i<=128).*/

PORTD = i;
/*A todos los pines del puerto D, o mejor aun todo el puerto D va ha tomar el valor de i, es decir cada pin del puerto D, va ha funcionar como un dígito de una numero de 8 bits.*/

_delay_loop_2(30000);
/*Esta función hace que el proceso anterior se repita por el tiempo que engloba su parámetro, para este caso es de 30000, recuerde que _delay_loop_2(), es una función que genera tiempo cortos, es decir en el orden de los micro segundo (us) así que cuando decimos _delay_loop_2(30000), le estamos dando 30000us de retardo.*/


for( int i=128; i>=1; i-=i/2){
}
/*En esta parte del programa vamos a hacer una lectura inversa, si se han dado cuenta en el primer for, el puerto D toma los valores de 1, 2, 4, 8, 16, 32, 64, 128, estos valores en forma física son los valores que tiene por separado cada pin del puerto D, en este for se hace el proceso inverso, es decir empezamos del valor mas alto 128, 64, 32..., 1; y así logramos el efecto del encendido o mejor dicho del recorrido de un led en toda una fila de 8 leds.

7. Finalmente compilamos el programa, si no tenemos errores, nos mostrara la siguiente ventana, al compilar:




Lo que nos importa es que al final, en la parte de la salida nos muestre la siguiente frase:

Build succeeded.
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========

Esto nos indica que se ha creado correctamente nuestro archivo hexadecimal, así como nos muestra la siguiente imagen:



Bueno eso es  todo, espero que lo simulen en proteus e intente modificar el código, para que se familiaricen con la programación de microcontroladores Atmel, con lenguanje C.

1 comentario:

  1. hola gracias por el tuto, cuando simulo en proteus el procesador solo realiza el ciclo una vez luego deja encendido el ultimo led permanentemente

    ResponderEliminar