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

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

1.0

|Views: 4.153|Likes:
Publicado porKelly Johnson
Tutorial III - Contador Decimal usando pulsadores y displays de 7 segmentos-
Tutorial III - Contador Decimal usando pulsadores y displays de 7 segmentos-

More info:

Published by: Kelly Johnson on Feb 01, 2010
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

06/23/2013

pdf

text

original

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

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:

#include #include #include #include unsigned

<pic.h> <stdlib.h> "delay.h" "delay.c" 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 //Pregunto por Interrupción por los pines RB4-RB7 //En caso que llegue a 99 que es máximo valor visualizable… // …se reinicia el conteo en 0 el valor mínimo (ciclo) //No hay problema para que sume //Pongo la bandera respectiva en 0 para indicar que ya Sumé // Como no hubo interrupción por cambio de estado en… // …Puerto B es porque la hubo por el pin RB0 //En caso que llegue a 0 que es mínimo valor visualizable… // …se reinicia el conteo desde 99, el valor máximo //No hay problemas para que reste //Pongo la bandera respectiva en 0 para indicar que ya Resté //Activo la bandera de actualización de los displays //Fin de Atención a interrupciones

{ If (RBIF==1) { if (contador==99) contador=0; else contador++; RBIF=0; } else { If (contador==0) contador=99; else contador--; INTF=0; } FLAG=1; } 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; if (x==1) PORTC=0b11111001; if (x==2) PORTC=0b10100100; if (x==3) PORTC=0b10110000;

//Código del 0

//Codigo del 1

//Codigo del 2

//Codigo del 3

if (x==4) PORTC=0b10011001; if (x==5) PORTC=0b10010010; if (x==6) PORTC=0b10000010; if (x==7) PORTC=0b11111000; if (x==8) PORTC=0b100000000; if (x==9) PORTC=0b10011000; } void main(void) { TRISC=0; TRISB=0b11111001; INTCON=0b10011000; OPTION=0b01111111; for(;;) { If (FLAG==1) { div_t x; x=div(contador,10); FLAG=0; ver(x.quot); RB1=0; RB2=1; DelayMs(8); ver(x.rem); RB1=1; RB2=0; DelayMs(8); } } }

//Codigo del 4

//Codigo del 5

//Codigo del 6

//Codigo del 7

//Codigo del 8

//Codigo del 9

//Configuración de puertos //Puerto C como salida (bus de datos del display) //RB1 y RB2 como salida //Activamos las interrupciones por RB4-RB7, RB0… // …y colocamos las banderas en 0 //Activamos pull-ups para que al recibir 0… // …cree las interrupciones por cambio de estado //Ciclo infinito //Pregunto por el estado de la bandera de visualización //Invocamos la función para dividir //La variable contador la divido por 10 //Coloco la bandera en su estado natural "0" //El cociente de la división son las Decenas, las visualizo //Activo el display Decenas y… // …desactivo display Unidades… // …durante8 milisegundos //El residuo de la división son las Unidades, las visualizo // Activo el display Unidades y… // …desactivo display Decenas… // …durante 8 milisegundos //Cierra el FOR //Cierra el main

DIAGRAMA DE CONEXIONES

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->