Вы находитесь на странице: 1из 5

CONTADOR 0 - 9999 UTILIZANDO EL PIC 16F628A

PROYECTO N 1: CONTADOR 0 9999 UTILIZANDO EL PIC 16F628A

Empecemos con este simple, pero muy interesante proyecto, el cual servir de antesala y estmulo ante lo que es la microelectrnica de control. Este proyecto es bsico tanto en su implementacin como en lo que respecta a la programacin, lo cual se hizo utilizando el lenguaje C. Primeramente, veamos el hardware que har posible este proyecto. Como cerebro, encontramos al microcontrolador 16F628A: un PIC econmico, no muy complejo y prctico. Usaremos un display de 4 pantallas, cada una a 8 segmentos, los cuales se controlar mediante los pines A,B,C,D,E,F,G,H (para formar el smbolo en la pantalla) y los pines 1,2,3,4 (para seleccionar que pantalla prender en cada instante). Para controlar los segmentos de cada pantalla, estamos usando el puerto B del PIC, mediante el cual mandaremos 0s (seales a tierra o GND, es decir, cero voltios) para seleccionar que segmento de la pantalla prenderemos. El puerto A se encargar de seleccionar las pantallas mandando 1s (seales a VDD, VCC, 5 voltios generalmente). En otras palabras, el puerto A actuar como fuente de voltaje para el display. Pero hay que tener cuidado en este punto: la corriente necesaria para activar cada display llega, en el caso extremo, a unos 160mA. Esta corriente es suficiente para daar tanto al pin encargado de activar al display, como al puerto entero. Para ello, nos valemos de la alta impedancia de entrada de los transistores. Utilizamos el 2N2222 en modo de conmutacin para que este transistor maneje esa elevada corriente. El puerto B actuar como sumidero para todas las corrientes. Se usarn resistores de 110 ohmios en el puerto B, para evitar que el PIC se dae por la elevada corriente que se generar en el circuito (los segmentos del display no son ms que diodos LED, ello justifica el hecho de usar resistores). Tambin utilizaremos la entrada MCLR activa en bajo del PIC, para resetear el programa que estemos corriendo (en este caso, reiniciar la cuenta a cero). Para ello, el circuito conectado a dicha entrada se encarga de generar un pulso bajo cada que se presionar el interruptor tipo PUSH. Tenga en cuenta adems que este PIC es un dispositivo CMOS, y por ende, todos los pines que no utilicemos debern conectarse a ALTO (+5V) para evitar que se dae. Por ltimo, el PIC requiere una seal de reloj precisa para sincronizar sus acciones. Esta seal puede ser generada de varias formas: utilizando un condensador y un resistor, utilizando el timer 555, utilizando un circuito con cristal de cuarzo. Particularmente aconsejo el uso del cristal de cuarzo; debido a que es muy preciso, fcil de obtener y no es muy caro.

Simulacin del proyecto utilizando el software de simulacin PROTEUS.

El cdigo C se compil utilizando el CCS Compiler Ahora, pasemos a la programacin. Como les mencion anteriormente, en esta ocasin hemos utilizado el lenguaje C. El programa es el siguiente:

************************************************************************************ *** #include <16f628a.h> #fuses XT,NOWDT,NOPUT #use delay (clock=4000000) #byte port_a=0x05 #byte port_b=0x06 #byte tris_a=0x85 #byte tris_b=0x86 void main() { int i,j,k,l,repeticion; //Variables para los bucles byte CONST cifra_display[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98}; byte CONST pantalla[5]={0x00,0x01,0x02,0x04,0x08}; tris_a=0x00; tris_b=0x00; while(1) { for(l=0;l<10;l++) { for(k=0;k<10;k++) { for(j=0;j<10;j++) { for(i=0;i<10;i++) { for(repeticion=0;repeticion<20;repeticion++) { port_a=pantalla[1]; port_b=cifra_display[i]; delay_us(12500); if((j==0)&&(k==0)&&(l==0)) delay_us(12500); else {port_a=pantalla[2];

port_b=cifra_display[j]; delay_us(12500); } if((k==0)&&(l==0)) delay_us(12500); else {port_a=pantalla[3]; port_b=cifra_display[k]; delay_us(12500); } if(l==0) delay_us(12500); else {port_a=pantalla[4]; port_b=cifra_display[l]; delay_us(12500); } } } } } } } }

************************************************************************************ **

Como les dije antes, el programa es bsico. Pesa solo unos 1.54 Kb. Si lo ve complejo, no se preocupe. Si es la primera vez que se enfrenta al lenguaje C, lo tpico es sentirse algo fuera de lugar. Para ayudarlo, procedo a explicar el programa cdigo por cdigo. Las primeras tres instrucciones son decirle al compilador que PIC hemos de utilizar, para configurar el modo de operacin del PIC y la frecuencia a la que trabajar, respectivamente. Mediante la directiva #include <nombre_pic.h>el compilador carga un librera exclusiva para ese PIC, de manera que el cdigo de particularice y se haga ms fcil el trabajo de dar instrucciones. La directiva #fuses fusibles_del_pic se usa para activar o desactivar los fusibles internos del PIC. En esta caso, activamos XT (el reloj ser un cristal de cuarzo externo, desactivamos el perro guardin NOWDT (ms adelante explicar de qu se trata este fusible) y desactivamos el fusible PUT mediante NOPUT. La ltima directiva, #use delay (clock=frecuencia) determina la frecuencia de operacin del microcontrolador. Se debe tener en cuenta que esta frecuencia se divisar internamente entre cuatro, de manera que la frecuencia til del PIC es slo la cuarta parte de la frecuencia ingresada. En este caso,

los 4 MHz proporcionados por el circuito oscilador de cristal de cuarzo nos proporcionarn una frecuencia til de 1 MHz, lo cual para este proyecto es ms que suficiente. Mediante directivas #byte port_x direccin_memoria_en_hexadecimal se definen las variables que utilizaremos para controlar los pines de I/O del PIC. No es necesario memorizar estas direcciones. Solo basta con observar la hoja de datos del PIC y ver la parte que habla sobre los puertos u organizacin de memoria. Ahora, el registro TRIS determina la configuracin de cada PIC de cada puerto (es decir, si determinado pin es de entrada o salida), y el registro PORT, determina el estado (es decir, si determinado pin est en alto o en bajo). Despus de todo, viene lo ms interesante: el programa principal. Primero, definimos las variables con las controlaremos los bucles o repeticiones. Cuando lean un libro de programacin en C, vern que estas repeticiones se pueden hacer de varias formas y utilizando distintas instrucciones. En este caso, usaremos el bucle for, al que controlaremos con las variables definidas al inicio. Luego, definimos un arreglo de bytes llamado cifra_display de 10 elementos, en donde cada elemento representa el cdigo en ceros que mandaremos al display para formar determinado nmero. Esto es sencillo, considerando el hecho de que cada pantalla del display est formada por 8 segmentos, denominados A, B, C, D, E, F, G, H; en donde H corresponde al punto decimal. Ahora, si queremos encender el segmento A, pues simplemente mandamos un 0 en su posicin, y 1s al resto, para mantenerlos apagados. Luego, definimos otro arreglo de bytes denominado pantalla de cinco elementos, con la cual elegiremos que pantalla del display encenderemos. Vean que la posicin pantalla[0] corresponde al todas las pantallas apagadas, pues no selecciona ninguna (manda el cdigo 0x00). Hecho esto, ya hemos culminado con la declaracin de variables. Luego vemos las siguientes dos instrucciones: tris_a=0x00; tris_b=0x00. Estas dos instrucciones configuran a los puertos A y B como salidas. Qu quiere decir esto? Que estos pines solo pueden funcionar como fuentes de seal, mas no como detectores. Ms adelante, en otros programas veremos como utilizar pines como entradas de seal, para comparar voltajes, corrientes, o como interruptores. Asimismo, veremos como manejar las directivas de puertos para manejar los puertos de una manera ms sencilla. Ahora s, pasemos al programa en s. Vemos un bucle while(1){programa_principal}; Este es el llamado bucle de repeticin infinita, es decir, el encargado de que el PIC realice el programa principal mientras est funcionando. Si no estuviera esta instruccin, dada la primera cuenta hasta 9999, el PIC dejara de correr el programa y la pantalla permanecera apagada hasta que o bien se resetee el PIC, o se apague y encienda de nuevo. Luego tenemos 4 bucles for uno dentro del otro. Estos bucles llevaran la cuenta interna del display en sus variables de control; y un bucle for de repeticin, encargado de evitar el parpadeo. Ahora, en cada turno, el programa inicialmente muestra en la pantalla 1 (unidades) la cantidad almacenada en la variable ms interior de todos los bucles de control de la cuenta interna (en este caso i) pues esta contiene la cantidad de unidades del contador. Luego de mostrarlo, se hace un retraso de 12500 us. Luego, se analiza si las dems variables se han incrementado. Por ejemplo, si las decenas se incrementan en 1, el programa muestra primero la pantalla 1 y la cantidad almacenada en i, luego la pantalla 2 y la cantidad almacenada en j, y como las dems siguen en cero, simplemente realiza un retraso de 12500 us por las pantallas 3 y 4. Y ahora, por qu 12500 us? Pues la respuesta es sencilla: un retraso de 12500 us para la pantalla 1 encendida, otro retraso de 12500 us para la pantalla 2 encendida, otro retraso de 12500 us por la pantalla 3, y por ltimo, un retraso de 12500 us por la pantalla 4; total suman un retraso de 50000 us, que equivalen a un retraso total de 50 ms. Pero ello, ms el bucle de repeticin, que repite el mismo programa 20 veces, hacen un total de 1000 ms, es decir 1 segundo. El hecho de usar este tipo de algoritmo radica en el hecho de que no podramos encender todas las pantallas del display y mostrar nmeros distintos en cada uno al mismo tiempo. El truco consiste en mostrar la informacin en cada pantalla, una a la vez, encenderla y mantenerla prendida por un tiempo, luego la otra y as sucesivamente, y hacerlo tan rpido, de manera que la vista humana

no perciba las transiciones y vea al display como si todas las pantallas estuviesen encendidas al mismo tiempo. Una frecuencia mnima de operacin es 50 Hz. Frecuencias inferiores implican un ligero parpadeo en el programa. Frecuencias superiores son mejores, aunque implican manejar cantidades de tiempo ms pequeas (us o ns), lo cual a su vez implica que el PIC trabaje con frecuencias altas. En este caso, el PIC 16F628A no presenta problemas, pues su frecuencia mxima de trabajo es de 20 MHz: ms que suficiente para culminar este proyecto. En este link encontrar un archivo .rar que contiene el cdigo fuente, la simulacin en PROTEUS y el archivo .HEX para cargarlo en el PROTEUS. Gracias... http://www.mediafire.com/?1vegveb4kzz3ef8 Y bueno, eso es todo. Si quieren armar el proyecto, primero hganlo en un protoboard, y tengan en cuanta los requerimientos de hardware (conectar los pines sueltos a +5V, utilizar un circuito de reloj con cristal y una buena alimentacin VDD). Si tienen dudas sobre el programa, por favor, comntenlas para intentar despejarlas. Si tienen sugerencias para mejorar el cdigo, igualmente, hganlas saber comentando, pues cada uno de nosotros tenemos distintas formas de plantear los problemas y solucionarlos, y quiz lo que para uno es complejo, para otro es simple vindolo desde otro punto de vista. Hasta pronto, y practiquen, que la electrnica es un arte que requiere prctica, esfuerzo y paciencia.

Вам также может понравиться