5 ene 2009

Luces secuenciales. Oda al 4017.

Muy bien ya estamos mas o menos empapados de este asunto de ls protoboards, la programada, compilación y montaje del Atmega8.

Ahora vamos a hacer un juego de luces secuenciales programables. Si son los suficientemente viejos, o corrieron con suerte similar a la mia, recordaran aquellos kits que incluian un NE555 y un MC4017 que prendian un juego de 1o leds en secuencia o 6 de ida y vuelta, causaban sensación por que recordaban las luces del Auto Increible. Otra vez con mis traumas jejeje. Bueno, a lo nuestro. Primero vamos a armar nuestro circuito en la protoboard. Nos podemos basar en la siguiente ilustración, aunque bien podemos elegir la nuestra en función de nuestas capacidades.


Recuerde que los colores de los cables son solo para facilitar su localización. Incluyo tambien este esquematico para aquellos lectores mas avanzados.



Antes de entrar de lleno a la programada vamos a hablar del sistema binario. En electronica digital es comun de hablar de bits. Ya saben esas cositas que pueden valer 1 ó 0 que de algun modo se las arreglan para formar numeros enormes. Bien, para empezar eso ya no es del todo cierto, ahora se conoce un estado llamado indeterminado que si bien no sirve para contar si es util para crear algoritmos, pero eso no nos interesa en este momento. Hablemos en 0's y 1's. En lo referente a este adorable chip un nivel 1 (H o alto) significa un voltaje casi igual al que alimenta al circuito (5v en este caso) y un nivel 0 (L o bajo) significa un voltaje casi nulo cercano al 0v.

Ok vamos a contar en binario. Es mas o menos lo mismo que contar en decimal, solo que en lugar de aumentar un digito al llegar el anterior a 9 lo haremos al llegar a 1. Usaremos un Byte, es decir una cifra de 8 digitos, recuerda que al igual que en decimal los ceros a la izquierda no valen nada (como las promesas de campaña).

Bien pues:

000 Decimal = 00000000
001 Decimal = 00000001
002 Decimal = 00000010
003 Decimal = 00000011
004 Decimal = 00000100
005 Decimal = 00000101
006 Decimal = 00000110
007 Decimal = 00000111
...
050 Decimal = 00110010
...
255 Decimal = 11111111

Buenas noticias, no necesitas aprender a contar en binario, solo entender que cualquier valor entre 0 y 255 se puede representar con solo 8 bits.

Al conectar los LED como los conectamos en esta ocación podemos ver de forma ordenada el octeto que forma el PORTB. Ahora bien vamos intentar un poco analisis de pulqueria.

"Si cualquier numero entre 0 y 255 se puede representar con combinaciones de focos prendidos y apagados, entonces, cualquier combinación de focos prendidos y apagados se puede representar con un numero entre 0 y 255." - Todolomeo.

Supongamos que quiero aparentar que los focos prendidos de los extremos se acercan y chocan. Me refiero a que quiero hacer una secuencia como la siguiente;

1 0 0 0 0 0 0 1
2º 0 1 0 0 0 0 1 0
3º 0 0 1 0 0 1 0 0
4º 0 0 0 1 1 0 0 0

Entonces lo que necesitamos es primero convertir esos numeros binarios en decimales. Afortunadamente cualquier calculadora cientifica (incluida la te windows) hace esto por ti. Claro que si aprendes a hacerlo por cuenta propia pues te va a facilitar algunas cosas a futuro, pero, pues de momento no hay bronca. Esto quedaria asi:

1 0 0 0 0 0 0 1 = 128+1 = 129
2º 0 1 0 0 0 0 1 0 = 64+2 = 66
3º 0 0 1 0 0 1 0 0 = 32+4 = 36
4º 0 0 0 1 1 0 0 0 = 16+8 = 24
Nuestra secuencia sera pues {129,66,36,24}. Vamos a probarla.

Ok. Vamos a abrir CodeVisión y vamos a elegir las mismas opciones que en el post anterior, es decir, vamos a definir el AVR como Atmega8 a 1Mhz, el tipo de programa como Aplication y vamos a programar todos los bits del PORTB como salida (out). Solo que esta vez el proyecto se llamara 2 (2.cwp, 2,prj, 2.c). Recuerde que vamos a guardar todos los programas que trataremos en este blog en la carpeta c:\atmega8.



En las librerias vamos a incluir #include<delay.h> debajo de la libreria #include<mega8.h>.


#include <mega8.h>
#include <delay.h>

Esta libreria es la que nos permite crear retrasos de tiempo con solo un comando.

Debajo de estas encontratemos un comentario que dice // Declare your global variables here. Debajo de este comentario vamos a anotar la secuencia y vamos a llamarla sec. Quedando asi:

// Declare your global variables here
char sec []={129,66,36,24};

Lo anterior significa: sec es un caracter, y toma los siguientes valores {129,66,36,24}. Caracter se refiere a que su valor va desde 0 a 255 nada mas, que es suficiente para este programa.

Ahora vamos a agregar una variable que va a ser un entero (integer) y la llamaremos l, esta variable nos va a decir cual de los numeros de la secuencia vamos a utilizar, quedando asi toda las sección:

// Declare your global variables here
char sec []={129,66,36,24};
int l;


Ahora en la parte final, que es donde se coloca el verdadero programa incluimos los siguientes comandos:



while (1)
{

if(l>3) // Se lee: Si l es mayor que 3
l=0; // entonces cambia el valor de l a 0

PORTB=sec[l]; // Esto envia los numero de la secuencia a PORTB
delay_ms(500); // Produce una pausa de 500 milisegundos
l++; // Esto le suma un 1 al valor de l
};
}



Ahora si, compila y monta el programa, recuerda que este se llama 2.hex asi que cuando estes en la carpeta c:\Atmega8\Exe deberas llamar al avrdude de la siguiente manera.

avrdude -p m8 -c usbasp -e -u -V -U flash:w:2.hex

Si te da flojera puedes pegarlo, pero a veces por una razón que desconosco no funciona. Recuerda respetar mayusculas y minusculas.

Cosas a hacer una vez logrado que funcione este experimento:

1.- Cambia los valores de la secuencia para que genere diferentes efectos. Recuerda que en el comando if(l>3) el numero (en este caso 3) es igual al numero de elementos de la secuencia menos 1. Es decir si tienes 6 elementos, seria if(l>5).

Ejemplo:


char sec []={129,66,36,24,36,66};
int l;
...
while (1)
{
if(l>5) // Se lee: Si l es mayor que 5
l=0; // entonces cambia el valor de l a 0

PORTB=sec[l]; // Esto envia los numero de la secuencia a PORTB
delay_ms(200); // Produce una pausa de 500 milisegundos
l++; // Esto le suma un 1 al valor de l

};
}


Esto causara un "rebote" simulado en los leds.

Pues Bien. Eso es todo por esta entrada. Espero con ansia sus comentarios, dudas, sugerencias y espero que esto les este siendo util. Hasta la proxima entrada.

Nota: Por alguna razón al incluir lineas de codigo en c y la revoltura con html que se forma no he podido usar el corrector ortográfico. Asi que ustedes perdonaran uno que otro error de dedo. En la parte del codigo, comandos, valores y nombres todo ha sido revisado y no hay mayor problema. Si de pronto ven palabrejas como Jue, Vides, Ansina y algún otro arcaismo, éstas si son totlmente intencionales y nacen de una raiz muy rupestre en mi pasado, no pretenden ser una falta de respeto.

Recuerden que la mayor parte de mis imagenes son originales y estan protegidas por la Ley Federa de Derechos de Autor y su Reglamento. Asi que si desean usarlas en otros sitios deberan mantenerlas sin modificación y mencionar este sitio como fuente. En caso de utilizarse con fines comerciales requeriran una autorización por escrito que podra o no tener un costo.

2 comentarios:

  1. HOOOOOOLAAA ME LLAMO PABLO...MUY INTERESANTE TU BLOG ME SIRVIO MUCHO PARA UN PROYECTO....FELICITACIONES....UNA PREGUNTA TALVZ M PUEDS AYUDAR: COMO PUEDO HACER UN DIRECTORIO TELEFÓNICO,ALMACENANDO LOS NUMEROS EN EL ATMEGA32 Y LUEGO TENER ACCESO A ELLOS A TRAVES D UN PROGRAMA DESD LA PC, MEJOR DICHO UNA INTERFAZ CON EL USUARIO.....SI SQ M PUEDES AYUDAR EN ALGO DESDE YA T AGRADEZCO MUCHOOOOO...

    ResponderEliminar
  2. Saludos Pablo. Probablemente podamos realizar lo que dices a travez de la USART (pines 14 y 15 en el atmega32) con un MAX232 al serial de la pc. (mi lap ahora mismo no tiene, pero en poco armo una pc pa probar). Ojala puedas mandar alguna forma de contactarte.

    ResponderEliminar