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:
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:
Codigo en Assembler (mpasm):
Código en C:
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
*****____________________________________________________*********
Código C:
Hay viene lo bueno ¬¬
Descargas Proyecto Final completo:
Proyecto final en PIC C y esquematico .DSN proteus: aqui
Tags:
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 |
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
Relamente bueno compañero. Gracias por compartir tus conocimientos
ResponderEliminarUn placer ayudar
EliminarSaludos
UNA MIERDA ESTO
ResponderEliminar