5

Click here to load reader

Tutorial III - Contador Decimal usando pulsadores y displays de 7 segmentos-

Embed Size (px)

DESCRIPTION

Tutorial III - Contador Decimal usando pulsadores y displays de 7 segmentos-

Citation preview

Page 1: Tutorial III - Contador Decimal usando pulsadores y displays de 7 segmentos-

TUTORIAL III

OBJETIVOS

• Crear códigos en C de mayor complejidad.

• Atender interrupciones por cambio de estado en Puerto B y por cambio de estado en el pin RB0/INT.

• Realizar el Tercer Proyecto: Contador Decimal usando pulsadores y displays 7 segmentos.

• Aprender a utilizar del sistema multiplexado de displays 7 segmentos e identificar las ventajas de este sistema respecto de uno no multiplexado.

• Repasar y reafirmar los conceptos vistos hasta el momento.

• Aplicar lógica inversa en el código y en las conexiones. PROYECTO 3: Contador Decimal usando pulsadores y displays de 7 segmentos.

Este proyecto es básicamente el mismo que el proyecto 2, pero haciendo uso de una mejor visualización para el contador interno, que una vez mas se va a modificar con un par de pulsadores, uno conectado al pin RB0 y el otro al RB7. El valor de la variable será visualizado esta vez en sistema numérico decimal y no en binario Para esto se utilizaran un par de displays 7 segmentos de ánodo común como los mostrados en los diagramas de conexiones. Cada display tiene usualmente 10 pines para su conexión. Siete de ellos controlan la visualización como tal del dígito, cada uno controlando un segmento del numero 8. Vienen identificados por convención con letras de la “a” a la g” Su activación selectiva es la que genera los dígitos del 0 al 9. Otro pin activa o desactiva el punto decimal y los otros 2, ambos, trabajan como ánodo común. Dependiendo también del modelo existen displays de cátodo común que son parecidos a los que acá se van a usar con una diferencia fundamental: el modo de conexión y alimentación. Los pines de ánodo común se conectan a V+ y cada segmento se activa enviando 0V por cada pin correspondiente. En caso de que sea display de cátodo común, los pines de cátodo común se conectan a GRND (Tierra) y cada segmento se activa enviando V+. Por eso en este tutorial se dice que la activación se efectúa con lógica inversa: para activar los display envío 0V por los pines del microcontrolador y no 5 V como hasta ahora se había hecho. Para generar los dígitos como tal, se configuran los pines del puerto del PIC al que este conectado el display para que envíe 0V solo a los pines que se me generan el dígito, por ejemplo para el cero, y suponiendo que los pines a, b, c...g vayan al RC0, RC1, RC2... RC6 respectivamente, desde el código en C se puede configurar TRISC=0 como

Page 2: Tutorial III - Contador Decimal usando pulsadores y displays de 7 segmentos-

salida, y PORTC=0b11000000; (el “g” que controla la raya horizontal interna del 8 se le han enviado 5 V para indicar que lo quiero desactivado)

Lo que hacemos con los display es conectarlos al microcontrolador usando sistema multiplexado. Multiplexar evita un uso innecesario de pines en el microcontrolador. Como se mencionó cada display tiene 7 pines que deben ir conectados al microcontrolador. Supongamos que vamos a visualizar valores entre 0 y 100000, por ejemplo para una aplicación de conteo de personas que ingresan a un concierto a un partido de fútbol. Para mostrar el máximo número posible se necesitarían al menos 6 displays de 7 segmentos, cada uno con 7 pines que deben conectar al microcontrolador, 42 pines en total. El PIC16F877A se queda corto ya que solo tiene 40 pines, de los cuales no todos sirven como salidas de señales digitales. Peor aun habría que implementar un microcontrolador para cada display o algo así. Una de las mejores soluciones a este problema es multiplexar los displays. Para ello se conectan todos a un mismo microcontrolador, de modo que todos los pines “a” de los displays vayan a una línea común que conecte a un pin del micro y así con todos los pines de los displays de la “a” a la “g”. Lo que hacemos entonces es controlar la alimentación de los displays de modo que podamos ver uno a la vez. Para este control conectamos cada ánodo común al colector de un transistor 2n3906, cuyo emisor va a V+ (5v) y base a otro pin del micro. Por medio de estos últimos pines mencionados activamos la visualización de los display. Entonces lo que hacemos por programa es un refrescamiento continuo de los displays mostrando a intervalos muy cortos únicamente el valor que va en uno de los displays, mostrando cada vez uno el valor que va en uno distinto. Si este refrescamiento se hace lo suficientemente rápido el ojo no percibe los dígitos como intermitentes sino como un continuo. Supongamos que con una frecuencia de refrescamiento de 30 Hz es suficiente (30 Hz indica que hay 30 ciclos de refrescamiento por segundo) El periodo de refrescamiento (el inverso de la frecuencia) es 1/30 = 33 ms aprox. Como vamos a usar dos display cada uno va a mostrar su valor por (33ms)/2 = 16 ms. En el código en C indicamos por medio de delay ese valor ó uno menor.

Haciendo un ultimo comentario veamos que el ejemplo de los 6 displays multiplexado tomaría únicamente 13 pines del PIC (7 de segmentos + 6 de control de alimentación=13) en cuyo caso el PIC16F877A si podría con la aplicación. Para el proyecto en MPLAB y PICC hacemos exactamente los mismos pasos para crear un proyecto en C visto en los dos primeros proyectos copiamos el siguiente código, compilamos y lo probamos según el diagrama de conexiones en la protoboard para verificar que lo hemos hecho bien:

Page 3: Tutorial III - Contador Decimal usando pulsadores y displays de 7 segmentos-

#include <pic.h> #include <stdlib.h> #include "delay.h" #include "delay.c" unsigned char contador=57, FLAG=0; // FLAG es una variable bandera cuya activación implica actualización de los valores… // …de los display void interrupt inter(void) { // Inicio de Atención a Interrupciones If (RBIF==1) //Pregunto por Interrupción por los pines RB4-RB7 { if (contador==99) //En caso que llegue a 99 que es máximo valor visualizable… contador=0; // …se reinicia el conteo en 0 el valor mínimo (ciclo) else contador++; //No hay problema para que sume RBIF=0; //Pongo la bandera respectiva en 0 para indicar que ya Sumé } else // Como no hubo interrupción por cambio de estado en… // …Puerto B es porque la hubo por el pin RB0 { If (contador==0) //En caso que llegue a 0 que es mínimo valor visualizable… contador=99; // …se reinicia el conteo desde 99, el valor máximo else contador--; //No hay problemas para que reste INTF=0; //Pongo la bandera respectiva en 0 para indicar que ya Resté } FLAG=1; //Activo la bandera de actualización de los displays } //Fin de Atención a interrupciones void ver(unsigned char x) //Códigos de activación de los dígitos de los display… // …de 7 segmentos { if (x==0) PORTC=0b11000000; //Código del 0 if (x==1) PORTC=0b11111001; //Codigo del 1 if (x==2) PORTC=0b10100100; //Codigo del 2 if (x==3) PORTC=0b10110000; //Codigo del 3

Page 4: Tutorial III - Contador Decimal usando pulsadores y displays de 7 segmentos-

if (x==4) PORTC=0b10011001; //Codigo del 4 if (x==5) PORTC=0b10010010; //Codigo del 5 if (x==6) PORTC=0b10000010; //Codigo del 6 if (x==7) PORTC=0b11111000; //Codigo del 7 if (x==8) PORTC=0b100000000; //Codigo del 8 if (x==9) PORTC=0b10011000; //Codigo del 9 } void main(void) { //Configuración de puertos TRISC=0; //Puerto C como salida (bus de datos del display) TRISB=0b11111001; //RB1 y RB2 como salida INTCON=0b10011000; //Activamos las interrupciones por RB4-RB7, RB0…

// …y colocamos las banderas en 0 OPTION=0b01111111; //Activamos pull-ups para que al recibir 0…

// …cree las interrupciones por cambio de estado for(;;) //Ciclo infinito { If (FLAG==1) //Pregunto por el estado de la bandera de visualización { div_t x; //Invocamos la función para dividir x=div(contador,10); //La variable contador la divido por 10 FLAG=0; //Coloco la bandera en su estado natural "0" ver(x.quot); //El cociente de la división son las Decenas, las visualizo RB1=0; //Activo el display Decenas y… RB2=1; // …desactivo display Unidades… DelayMs(8); // …durante8 milisegundos ver(x.rem); //El residuo de la división son las Unidades, las visualizo RB1=1; // Activo el display Unidades y… RB2=0; // …desactivo display Decenas… DelayMs(8); // …durante 8 milisegundos } } //Cierra el FOR } //Cierra el main

Page 5: Tutorial III - Contador Decimal usando pulsadores y displays de 7 segmentos-

DIAGRAMA DE CONEXIONES