viernes, 19 de octubre de 2012

5.- Programa en C de CCS. Lee Puerto despliega valor en Display 7 segmentos

Bien, para esta práctica, se usará el compilador de PIC C de CCS, debido a que el MPASM me resulto muy engorroso, oo decepcion, así es. Lo que no pude hacer en dos días en MPLABX lo hice en 5 minutos en PIC C.

Si tienes la IDE de programación de CCS la puedes conseguir aquí

Aclaro que sólo con fines didácticos si en realidad deseas desarrollar con esto, recomiendo que la compres.

He aquí también el Manual de referencia de CCS:
* CCS Reference Manual
Puedes descargarlo de la pagina oficial de CCS también.

Como funciona un Display de 7 Segmentos:

Cabe aclarar que un displays de 7 segmentos no es otra cosa que leds arreglados de una forma bonita de tal suerte que al encender los leds correspondientes a la vez se dibuje un símbolo, número o letra.

Existen muchos tipos de displays, entre los de 7 segmentos también existen variaciones, por 7 segmentos nos referimos a 7 leds (quizá 8 si contamos los que poseen punto decimal en algunas versiones). Podemos encontrar generalmente dos tipos muy comunes, clasificándolos de acuerdo a su manera de uso, los de Anodo Comun y los de Cátodo común.

Una imagen vale mucho más:
Y aquí está la imagen que vale mucho más.

Podemos observar los leds, por tanto, observamos que los de Cátodo Común debemos conectar su pin común a tierra y mandando un voltaje necesario (un uno lógico) a su pin correspondiente haremos que se encienda el led, si encendemos los ciertos leds al mismo tiempo podremos formar números etc etc bla bla bla bla...

Lo contrario para ánodo común.


Preparando el terreno:

Primero hacemos una prueba sencilla, tomaremos el codigo de la práctica anterior y lo usaremos aquí, pero en lugar de tener simples leds, tendremos los displays de 7 segmentos, de acuerdo a la entrada que le demos al pic por medio del dipswitch serán las barras de los displays que se encenderan:

Esquemático Prueba:
Esquemático para la prueba. El display que esta en la parte inferior izquierda solo es  de prueba
para que se observe como conectar un cátodo común



Codigo en Assembler (mpasm):


 1 ;Hazael Fernando Mojica García
 2 ;Villeurbanne, Francia
 3 ;18/10/2012
 4 ;GPL
 5
 6 #include <p16f887.inc>
 7
 8 ;Definicion de variables
 9
10
11
12 ;Comienzo del programa
13 org 00h                 ;Vector de Reset
14
15
16 Start
17
18     clrw                ;Limpiamos el registro del acumulador W
19     bsf STATUS,RP0
20     clrf TRISB          ;Declaramos como salida el Puerto B colocando en 0 todos sus pines
21     movlw 0xFF          ;Colocamos 11111111b en W
22     movwf TRISD         ;Declaramos como entrada el Puerto D colocando el 1 todos sus pines
23     bcf STATUS,RP0
24
25 Main
26     movfw PORTD
27     movwf PORTB
28     goto Main
29     end
30



Código en C:
#include <16f887.h>
#fuses NOWDT                                                //Deshabilita Watchdog
//#fuses INTRC                                                //Cristal Interno RC
#fuses NOMCLR                                               //No Master Clear
#use delay(clock=4000000)                                   //Clock interno de 4MHZ


void main()
{
   int numeroDecimal[10];
   

   set_tris_d(0xFF);          //Puerto D como entrada, colocando 1 en cada Pin
   set_tris_b(0x00);          //Puerto B como salida, colocando 0 en cada pin
   set_tris_c(0x00);          //Puerto C como salida
   
   output_c(0xFF);
   
   while(1)
   {
      output_b(input_d());
      //output_b(0b11111110);
      delay_ms(100);
   }
}




Podemos observar en el codigo de arriba que lo unico que hacemos es tomar el valor de puerto D y ponerlo en el puerto B. 

 Por medio de esto, podemos saber que barra del display se enciende y por tanto saber así que pines del pic es necesario colocar en 1 para formar cierto número.

Proyecto de prueba en PIC C de CCS y esquematico Proteus: aqui


*****____________________________________________________*********
PROYECTO COMPLETO

Y bueno ahora viene el bueno, he aquí el proyecto completo: 


 En este lo que se hace a grandes rasgos, es tomar el valor del puerto D, del mismo, se separa  ese numero en unidades, decenas y centenas, después se despliega en cada unos de los displays correspondientes cada valor colocando el valor en el puerto B y encendiendo el transistor correspondiente para llevar a tierra el común del display respectivo. 

  En este sencillo programa desplegaremos en 3 displays de 7 segmentos el numero correspondiente en decimal al introducido en binario al Puerto D por medio del dip switch. Para esto, usaremos algo conocido como barrido, es decir, debido a que solo tenemos un puerto (Puerto B) para manejar los 3 dislpays encenderemos cada uno a la vez con el numero correspondiente a tal velocidad que parecera que todos estan encendidos. 


  Para este propósito, contamos con un transistor que usamos como interruptor Cuando hay un cero lógico en la base del transistor no hay paso entre catodo y anodo (circuito abierto) Cuando hay un uno lógico en la base del transistor es cuando existe coducción entre catodo y anodo (circuito cerrado) Llevando el común de los displays de 7 segmento a tierra, cerrando el circuito y haciendo que enciendan 

Esquemático:
Esquematico Final
Código C:

Hay viene lo bueno ¬¬



/*
   Hazael Fernando Mojica García
   Villeurbanne, France, 19/10/2012
   GPL
*/

#include <16f887.h>
#fuses NOWDT                                                //Deshabilita Watchdog
//#fuses INTRC                                                //Cristal Interno RC
#fuses NOMCLR                                               //No Master Clear
#use delay(clock=4000000)                                   //Clock interno de 4MHZ

/*
   En este sencillo programa desplegaremos en 3 displays de 7 segmentos
   el numero correspondiente en decimal al introducido en binario al Puerto D
   por medio del dip switch.
   Para esto, usaremos algo conocido como barrido, es decir, debido a que solo tenemos
   un puerto (Puerto B) para manejar los 3 dislpays encenderemos cada uno a la vez con el
   numero correspondiente a tal velocidad que parecera que todos estan encendidos.
   Para este propósito, contamos con un transistor que usamos como interruptor
   Cuando hay un cero lógico en la base del transistor no hay paso entre catodo y anodo (circuito abierto)
   Cuando hay un uno lógico en la base del transistor es cuando existe coducción entre catodo y anodo (circuito cerrado)
   Llevando el común de los displays de 7 segmento a tierra, cerrando el circuito y haciendo que enciendan
*/

void main()
{
   int numeroDecimal[10];
   int c_unidades = 0b00000001;        //Cuando toque unidades encendemos solo RC0
   int c_decenas  = 0b00000010;        //Cuando toque decenas encendemos solo RC1
   int c_centenas = 0b00000100;        //Cuando toque centenas encendemos solo RC2
   int numeroObtenido = 0;
   int unidades = 0;
   int decenas = 0;
   int centenas = 0;
   
   numeroDecimal[0] = 0b11111110;      //Representacion del 0 en nuestro display de 7 segmentos
   numeroDecimal[1] = 0b00110000;      //Representacion del 1 en nuestro display de 7 segmentos
   numeroDecimal[2] = 0b01101101;      //Representacion del 2 en nuestro display de 7 segmentos
   numeroDecimal[3] = 0b01111001;
   numeroDecimal[4] = 0b00110011;
   numeroDecimal[5] = 0b01011011;
   numeroDecimal[6] = 0b01011111;
   numeroDecimal[7] = 0b01110001;
   numeroDecimal[8] = 0b11111111;
   numeroDecimal[9] = 0b11111011;
   

   set_tris_d(0xFF);                   //Puerto D como entrada, colocando 1 en cada Pin
   set_tris_b(0x00);                   //Puerto B como salida, colocando 0 en cada pin
   set_tris_c(0x00);                   //Puerto C como salida
   
   output_c(0xFF);
   
   while(1)
   {
      //Tomaremos en cuenta que deseamos representar el numero 255, 0b11111111, 0xFF
      
      numeroObtenido = input_d();                                       //Leemos el numero que deseamos representar en los displays
      centenas = numeroObtenido / 100;                                  //255/100 = 2.55 = 2
      decenas = (numeroObtenido - (centenas * 100)) / 10;               //(255 - (2*100))/10 = 5.5 = 5
      unidades = numeroObtenido - (centenas * 100) - (decenas * 10);    //255 - (2*100) - (5*10) = 5
      
      //Desplegamos el numero en los displays
      //Unidades
      output_c(c_unidades);
      output_b(numeroDecimal[unidades]);
      output_b(0x00);
      //Decenas
      output_c(c_decenas);
      output_b(numeroDecimal[decenas]);
      output_b(0x00);
      //Centenas
      output_c(c_centenas);
      output_b(numeroDecimal[centenas]);
      output_b(0x00);
   }
} 

Chan chan, se acabó

Descargas Proyecto Final completo:
Proyecto final en PIC C y esquematico .DSN proteus: aqui



Tags:
  • Leer puerto
  • PIC C CCS
  • Encender leds
  • Displays 7 segmentos
  • Pic
  • Assembler
  • MPASM
  • MPLABX
  • Pic C
  • CCS
  • XC8

3 comentarios: