Bueno en este post me dedicare un poco mas a lo que mas me apasiona que es la programacion en C .
Hoy venimos con la busqueda mas frecuente de los aficionado y amateur's de la electronica, como contar con un display de 7 segmentos y un micro en lenguaje C; lastimosamente google nos genera unas "soluciones" que no son muy utiles ya que la mayoria de estos proyectos estan hechos en basic o ensamblador o en Arduino, pero casi nunca en C.
Dejemonos de tanta parla y vamos a Programar!!!!!!!!!.
Los materiales para este proyecto son:
-Atmega16 (o cualquiera *)
-Display 7 segmentos Catodo comun (mas adelante explico porque Catodo y no Anodo)
-Fuente de 5v
-Resistencias de 220ohm (rojo,rojo,cafe,dorado)
*Aplican condiciones y restricciones
Ustedes se deben estar preguntado porque digo que cualquier micro y lo digo por que es asi, les sirve cualquier Atmega que tenga los puertos A, B, C o D completicos osea los 8pines (Recordar que si elijen como salida el Puerto C deben des habilitar el Fuse JTAGEN para que les funciones Full).
Como siempre voy a partir el post en Etapas en esta ocasion van a ser 3.
1ra Etapa el Display de 7 segementos
2da Etapa El Codigo en C
3ra Etapa El Montaje y Simulacion
-------------------------> PRIMERA ETAPA EL DISPLAY DE 7 SEGMENTOS<-------------------------
Para hablar sobre el display de 7 segmentos debemos meternos en nuestra cabeza que un display no es mas que 8 led's ubicados de cierta forma que generan una imagen o en este caso Numeros.
Como pueden ver cada led tiene asignada una letra desde la 'a' hasta la 'g' esto es denominado 7 segmentos de alli el nombre display de 7 segmentos, ya que hay de muchos mas segmentos. Este proyecto podria ser mas "breve" si usamos un decodificador BCD / 7 segmentos ya que solo usariamos 4 pines del Micro, pero bueno yo lo quise hacer asi jajaja.
Como todos ustedes saben un led es un semiconductor que posea dos "patas" para su alimentacion Anodo (+) Catodo (-), pues bueno en base a esto desarrolle el programa, ya que ustedes saben que cuando indico:
PORTB=0b00000001 //Pongo el Bit1 en Alto. Binario
PORTB=0x01; //Equivalente al de arriba solo que esto es Hexadecimal
Se genera un 1 logico en la salida del micro lo que es aproximadamente 5V osea (+), por esto es que uso display de Catodo comun, ya que este display tiene conectadas entre si todas los Catodos y solo se encenderan cuando se genere un "Anodo" en cualquier pin del 'a' al 'g'. Por esto es de CATODO COMUN .
------------------------->SEGUNDA ETAPA EL CODIGO EN C<-------------------------
Listo ya sabemos que lo que hace este programa no es mas que encender una secuencia de leds en un orden especifico. El orden lo damos sabiendo que el PRIMER pin del Puerto va a ser 'A' del display y el ANTEPENULTIMO va a ser 'G', el ultimo pin del puerto no se usa ya que ese corresponderia al Puntico del display.
Acontinuacion vamos a ver como se generan los 4 primeros numeros del display en Binario y Hexadecimal:
1 --> 0b0000110 (binario) 0x06 (hexadecimal). //Se cuenta de Derecha a Izquierda
2 --> 0b1011011 (binario) 0x5B (hexadecimal).
3 --> 0b1001111 (binario) 0x4F (hexadecimal).
4 --> 0b1100110 (binario) 0x66 (hexadecimal).
Les voy a mostrar los primeros cuatro numeros como se ven encendidos con 1 y 0 logicos. (simulacion)
Ami me gusta trabajar mas con Hexadecimales, pero tambien se puede hacer en binario u octal.
La lista de los numeros completos es esta:
1--> 0x06
2--> 0x5B
3--> 0x4F
4--> 0x66
5--> 0x6D
6--> 0x7C
7--> 0x07
8--> 0x7F
9--> 0x667
0--> 0x3F
Para aprender a manejar los Hexa hay muy buenos tutoriales en google y otras paginas que os apareceran cuando busquen sobre este tema tan importante al momento de la programacion.
El codigo COMPLETO queda asi:
/*
* Contador_Dis.c
*
* Created: 08/08/2012 11:48:50 a.m.
* Author: JUAN PABLO
*/
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRD=0xFF; //Defino el Puerto D como salida
int i;
int cont[9]={0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07,0x7F,0x67}; //Defino los numeros en Hexa del 0 a 9
while(1) //Ciclo Infinito
{
PORTD=0x3F; //Inicializo el Display en 0
for(i=0;i<=9;i++) //Comienzo a cargar Numero por Numero en el Display
{
_delay_ms(200);
_delay_ms(200);
_delay_ms(200);
_delay_ms(200);
_delay_ms(200); //Espero 1 segundo para cargar el siguiente Numero
PORTD=cont; //Imprimo el Numero en el Puerto D
// arriba no se ve bien pero es cont[ i ], quitan los espacion antes y despues de la i
}
}
}
Que hace este programa??
R:/ Inicializa un vector con unas salidas predeterminadas en hexa, abre un bucle o ciclo infinito y carga dato por dato del vector con retardo entre cada numero de 1 segundo aproximadamente.
------------------------->TERCERA ETAPA EL MONTAJE Y LA SIMULACION<-------------------------
Bueno el esquema es el siguiente para un Atmega16, pero como ya les dije pueden usar un Atmega8, atmega168 y otros que tengan las salidas del puerto completas ya lo habia mencionado.
Listoo eso es todo si tienen alguna duda o aporte no olviden en comentarlo muchas Gracias.
P.D: Hay una excelente pagina para los apasionados como yo al AVR y es esta:
Es un blog hecho por uno de los mejores profesores en C y unos estudiantes de mi Universidad.
Hoy venimos con la busqueda mas frecuente de los aficionado y amateur's de la electronica, como contar con un display de 7 segmentos y un micro en lenguaje C; lastimosamente google nos genera unas "soluciones" que no son muy utiles ya que la mayoria de estos proyectos estan hechos en basic o ensamblador o en Arduino, pero casi nunca en C.
Dejemonos de tanta parla y vamos a Programar!!!!!!!!!.
Los materiales para este proyecto son:
-Atmega16 (o cualquiera *)
-Display 7 segmentos Catodo comun (mas adelante explico porque Catodo y no Anodo)
-Fuente de 5v
-Resistencias de 220ohm (rojo,rojo,cafe,dorado)
*Aplican condiciones y restricciones
Ustedes se deben estar preguntado porque digo que cualquier micro y lo digo por que es asi, les sirve cualquier Atmega que tenga los puertos A, B, C o D completicos osea los 8pines (Recordar que si elijen como salida el Puerto C deben des habilitar el Fuse JTAGEN para que les funciones Full).
Como siempre voy a partir el post en Etapas en esta ocasion van a ser 3.
1ra Etapa el Display de 7 segementos
2da Etapa El Codigo en C
3ra Etapa El Montaje y Simulacion
-------------------------> PRIMERA ETAPA EL DISPLAY DE 7 SEGMENTOS<-------------------------
Para hablar sobre el display de 7 segmentos debemos meternos en nuestra cabeza que un display no es mas que 8 led's ubicados de cierta forma que generan una imagen o en este caso Numeros.
Como pueden ver cada led tiene asignada una letra desde la 'a' hasta la 'g' esto es denominado 7 segmentos de alli el nombre display de 7 segmentos, ya que hay de muchos mas segmentos. Este proyecto podria ser mas "breve" si usamos un decodificador BCD / 7 segmentos ya que solo usariamos 4 pines del Micro, pero bueno yo lo quise hacer asi jajaja.
Como todos ustedes saben un led es un semiconductor que posea dos "patas" para su alimentacion Anodo (+) Catodo (-), pues bueno en base a esto desarrolle el programa, ya que ustedes saben que cuando indico:
PORTB=0b00000001 //Pongo el Bit1 en Alto. Binario
PORTB=0x01; //Equivalente al de arriba solo que esto es Hexadecimal
Se genera un 1 logico en la salida del micro lo que es aproximadamente 5V osea (+), por esto es que uso display de Catodo comun, ya que este display tiene conectadas entre si todas los Catodos y solo se encenderan cuando se genere un "Anodo" en cualquier pin del 'a' al 'g'. Por esto es de CATODO COMUN .
------------------------->SEGUNDA ETAPA EL CODIGO EN C<-------------------------
Listo ya sabemos que lo que hace este programa no es mas que encender una secuencia de leds en un orden especifico. El orden lo damos sabiendo que el PRIMER pin del Puerto va a ser 'A' del display y el ANTEPENULTIMO va a ser 'G', el ultimo pin del puerto no se usa ya que ese corresponderia al Puntico del display.
Acontinuacion vamos a ver como se generan los 4 primeros numeros del display en Binario y Hexadecimal:
1 --> 0b0000110 (binario) 0x06 (hexadecimal). //Se cuenta de Derecha a Izquierda
2 --> 0b1011011 (binario) 0x5B (hexadecimal).
3 --> 0b1001111 (binario) 0x4F (hexadecimal).
4 --> 0b1100110 (binario) 0x66 (hexadecimal).
Les voy a mostrar los primeros cuatro numeros como se ven encendidos con 1 y 0 logicos. (simulacion)
Ami me gusta trabajar mas con Hexadecimales, pero tambien se puede hacer en binario u octal.
La lista de los numeros completos es esta:
1--> 0x06
2--> 0x5B
3--> 0x4F
4--> 0x66
5--> 0x6D
6--> 0x7C
7--> 0x07
8--> 0x7F
9--> 0x667
0--> 0x3F
Para aprender a manejar los Hexa hay muy buenos tutoriales en google y otras paginas que os apareceran cuando busquen sobre este tema tan importante al momento de la programacion.
El codigo COMPLETO queda asi:
/*
* Contador_Dis.c
*
* Created: 08/08/2012 11:48:50 a.m.
* Author: JUAN PABLO
*/
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRD=0xFF; //Defino el Puerto D como salida
int i;
int cont[9]={0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07,0x7F,0x67}; //Defino los numeros en Hexa del 0 a 9
while(1) //Ciclo Infinito
{
PORTD=0x3F; //Inicializo el Display en 0
for(i=0;i<=9;i++) //Comienzo a cargar Numero por Numero en el Display
{
_delay_ms(200);
_delay_ms(200);
_delay_ms(200);
_delay_ms(200);
_delay_ms(200); //Espero 1 segundo para cargar el siguiente Numero
PORTD=cont; //Imprimo el Numero en el Puerto D
// arriba no se ve bien pero es cont[ i ], quitan los espacion antes y despues de la i
}
}
}
Que hace este programa??
R:/ Inicializa un vector con unas salidas predeterminadas en hexa, abre un bucle o ciclo infinito y carga dato por dato del vector con retardo entre cada numero de 1 segundo aproximadamente.
------------------------->TERCERA ETAPA EL MONTAJE Y LA SIMULACION<-------------------------
Bueno el esquema es el siguiente para un Atmega16, pero como ya les dije pueden usar un Atmega8, atmega168 y otros que tengan las salidas del puerto completas ya lo habia mencionado.
Listoo eso es todo si tienen alguna duda o aporte no olviden en comentarlo muchas Gracias.
P.D: Hay una excelente pagina para los apasionados como yo al AVR y es esta:
Es un blog hecho por uno de los mejores profesores en C y unos estudiantes de mi Universidad.

