Aprendiendo a programar microcontroladores [I]

Hola, buenas noches amigos de esta gran comunidad llamada identi, el motivo de mi post es para compartir un poco de mi conocimiento, en esta ocasión, les daré una pequeña introducción al gran mundo de los microcontroladores.

En esta ocaciones, aprenderemos a crear un programa que despliegue una cuenta de 0-9 en un display de 7 segmentos.


Materiales:

*Display 7 segmentos de catodo comun (o anodo).


*Protoboard


*Multimetro


*Cable

*7 resistencias de 220[Ohms]


*Pic 18f4550

*Pic & play

*Pickit 3 (o el programador que les guste).




Buscando en internet encontré esta definición que me parece bastante clara, en los libros mas especializados es bastante tecnica por lo cual no quise ponerla aquí.

Un microcontrolador es un circuito integrado que en su interior contiene una unidad central de procesamiento (CPU), unidades de memoria (RAM y ROM), puertos de entrada y salida y periféricos. Estas partes están interconectadas dentro del microcontrolador, y en conjunto forman lo que se le conoce como microcomputadora. Se puede decir con toda propiedad que un microcontrolador es una microcomputadora completa encapsulada en un circuito integrado.
Un microntrolador por lo tanto requiere un programa que le diga que hacer, para esto, tenemos dos opciones, la primera es crear programas en lenguaje ensamblador que es mas dificil de entender, y que hace uso de nemonicos y se programa directamente a los registros ó programar en C, que es bastate sencillo y muy facil de entender.
Por lo cual, en este post, programaremos en C, si tienen curiosidad sobre el lenguaje ensamblador es dejare en la bibliografia algunas fuentes de informacion que les ayudaran, desde comprender el lenguaje ensamlador, hasta tener un conocimiento mas preciso hacerca de los microcontroladores, mas especificamente del PIC 18F4550.
Bien ahora el software que necesitamos es el siguiente:

*CCS PIC C COMPILER
*PROTEUS (EL 8 ES ESTABLE)
*PICKIT 3 (para quienes usan el programador pickit).


DESARROLLO.-

Lo primero que debemos hacer es comprobar que tipo de Display tenemos, si es el de anodo comun o catodo comun.

Recordemos que un led es un diodo emisor de luz, por lo cual seleccionamos en el multimetro la opcion check diode.

En los display de 7 segmentos, la pata centran tanto de arriba como de abajo es el catodo/anodo comun, por lo cual ponemos la punta comun del multimetro en una de estas patas, posteriormente con la otra punta del multimetro tocamos cualquier otra pata, si enciende el led, quiere decir que es de catodo comun, si no enciende, colocamos la punta positiva del multimetro a la pata central del display y la punta comun del multimetro a cualquier pata, si el led prende significa que es de anodo comun.

Una vez que sabemos que display tenemos procedemos a crear una tabla de verdad, en la cual, se definen los segmentos que estaran encedidos para formar el numero deseado.


En mi caso, mi display es de anodo comun, por lo cual un led se encendera cuando un 0 logico llegue a la pata indicada.

A continuacion muestro la tabla de verdad utilizada para generar los primeros numeros:

 

Una ves definida la tabla de verdad completamente, abrimos el PIC C compiler, e inicializamos un nuevo proyecto.

Las primeras lineas de nuestro codigo seran las siguientes:

1) #include <18f4550.h>
2) #fuses NOWDT,HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT, CPUDIV1
3)  #use delay (clock = 20000000 )


donde en la linea 1 definimos el microcontrolador que utilizaremos, la linea 2 configura los fuses a usar, por ejemplo NOWDT desactiva el perro guardian, otras definen la frecuencia etc.

En la linea 3 definimos la frecuencia de operacion del PIC, en este caso utilizamos la frecuencia maxima de trabajo del PIC 18f4550 que es 20 [MHz].

Si tienen mas curiosidad para saber que son los fuses, les recomiendo leer el libro que dejare en la bibliografia.

Despues generamos un arreglo de 10, ya que necesitamos generar 10 numeros 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.

4)  int8 segmentos[10]={0b11000000,0b11111001, 0b10100100, 0b10110000,0b10011001, 0b10010010,0b10000010, 0b11111000, 0b10000000, 0b10010000};
0bhgfedcba

los bits son ordenados del mas significativo al menos significativo.


Posteriormente dentro del main configuramos al puerto B como salida
5)  set_tris_b(0x00);                      //Configuro el puerto b como salidas
6)  output_b(0b00000000);                  //Apago el puerto b


y posteriormente creamos una variable que nos ayudara a cambiar la matriz de segmentos para desplegar los numeros:

7)  int c=0;

finalmente crearemos un ciclo while, en el cual vamos a hacer que los numeros en el dislay cambien:

8)  while(c<=9)
9)  {
10) output_b(segmentos[c]);
11) delay_ms(1000);
12) c++;
13) }



podeos ver que le di un tiempo de 1000 mili segundos, lo cual equivale a un segundo, así, los numeros cambiaran en aproximadamente 1 segundo.

Compilamos nuestro codigo, y una vez que ya no tenga errores (revisa los punto y coma jeje) abrimos el proteus y generamos un circuito como en la siguiente imagen:


Nota: si tu display es de catodo comun la logica es inversa y deberas seleccionar y programar sabiendo que el catodo comun es tierra comun y enciende con 1 logico.


Dentro de proteus le damos doble click al microcontrolador y seleccionamos en program file el archivo .hex que se genera dentro de la carpeta donde guardamos nuestro codigo de PIC C COMPILER.



En la parte que dice Procesor Clock Frequency le ponemos los 20 Mhz y finalmento OK


Por ultimo damos play a la simulacion y deberemos ver el incremento en el display:




Ahora procedemos a programar el PIC, para esto primero armamos el circuito en la protoboard y conectamos a los pines correspondientes el display, una vez que tenemos alambrado correctamente el display a los puertos B del pic, abrimos el pickit 3 y cargaos el archivo .hex de nuestro codigo y vemos los resultados.




Finalmente les dejo el video de como funciono:
https://drive.google.com/file/d/0B2IH0H4_SyTsRi1oWF8xOExyNWs/view

Bibliografia recomendada:
ramesh s. gaonkar fundamentals of microcontrollers and applications in embedded systems
An introduction to programming. The Microchip PIC in CCS C. By Nigel Gardner



Bueno Amigos de identi, comenten que les parecio el post y si les fue de utilidad, para saber cuales pines son el puerto A, B C, D ETC consulten el datashet del PIC 18F4550.


Programa completo:
#include <18f4550.h>
#fuses NOWDT,HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT, CPUDIV1
#use delay (clock = 20000000 )

int8 segmentos[10]={0b11000000,0b11111001, 0b10100100, 0b10110000,0b10011001, 0b10010010,0b10000010, 0b11111000, 0b10000000, 0b10010000};


void main()
{
set_tris_b(0x00);                      //Configuro el puerto d como salidas
output_b(0b00000000);                  //Apago el puerto d  
port_b_pullups(TRUE);
int c=0;

while(c<=9)
{
output_b(segmentos[c]);

delay_ms(1000);

c++;


}

}



  
descargar peliculas - descargar programas
13 Puntos Score: 1.9/10
Visitas: 1540 Favoritos: 7
Ver los usuarios que votaron...
12 Comentarios Aprendiendo a programar microcontroladores [I]
Tema interesante amigo, lastima te fallaron las capturas. Te recomiendo esta pagina para subir tus capturas, no suele tener problemas con identi. Un saludo cordial.

https://images.snoork.com/
@Germlokura No se ven? extraño, en mi pc y celular si se ven, gracias por comentar, probare la pagina gracias  
Pues asi se ve amigo...

@Germlokura Gracias por avisarme amigo, listo ya quedo corregido.
un aporte que si se le puede sacar mucho provecho mil gracias
Buen post
PD: Esto es solo un consejo pero si fuera vos firmaría el cuaderno con mi nombre de usuario y luego sacaría las fotos,así certificaría que el aporte es auténtico. Saludos.
Gracias por este post tan didáctico.
@antrax126 Genial!, gracias a vos amigo!
@CATAN454 jejeje tienes mucha razon, con un poco de mejor ortografia esto califica como reporte, gran consejo... L proxima firmare mi cuaderno
si se pueden ver las imágenes.
Creo que con un título un poco más grande quedaría perfecto... de todas maneras muy buen aporte
Para dejar un comentario Registrate! o.. eres ya usuario? Accede!
Facebook Identi