Control de un display de 7 segmentos con PIC

Buenas a todos tengo una duda hice un contador de 4 digitos .
les explico las conexiones del pic al display y corriganme sime equivoque en algo claro esta que el contador me esta funcionando ok .

conecte los segmentos a,b,c,d,e,f,g al pic en serie con una resistencia de 330 ohm y el comun
tambien lo conecte directo al pic en serie con una resistencia de 330 ohm.
mi pregunta es:

el pic terminara estropeandose en algun momento?

sabiendo que la resistencia de 330 ohm conectada ala salida de va al comun del display esta limitando bastante la cooriente que esta pasando por ella y es por eso que tambien tengo el brillo del display bajo.

tengo el contador funcionando una semana las 24 horas del dia y sigue igual no he tenido problemas estoy usando el pic 16f628a


o es necesario conectar transistores ala salida para aumentar el brillo y proteger los pines del pic. esta parte la tengo clara y se que es lo correcto y lo mejor prar el pic
Justamente stoy probando esto por que no he visto a nadie que haya publicado algun circuito
sin usar transistores ala salida.

espero susu respuestas gracias
 
Mira el brillo del display es directamente proporcional a la corriente que circula por el, supongamos que por cada segmento haces pasar unos 15mA para obtener un brillo aceptable para ti pues basta multiplicar 15 X 7 y esa es la cantidad de corriente que el pic necesitaria suministrar para darte la funcionalidad que deseas, ahora si checas las hojas de datos podras darte cuenta que en ese aspecto el pic tiene una limitacion y habra que cuidar el dato o de lo contrario si se dañaria.
Te recomiendo usar transistores para manejar cada display, pero repito dependera del brillo que desees obtener.
 
Hola 97872372

Ten en consideración un detalle:
Si cada segmento en el Display requiere para encender 20mAmp.
Cuando enciende un 1 en el Display solo hay 2 segmentos encendidos. +/- 40mAmp.
Cuando enciende un 2 en el Display tenemos 5 segmentos encendidos. +/- 100mAmp.

Así que por la resistencia conectada al común del Display pasará esas corrientes según el número que aparezca en el Display.

V = I x R. . .

Quiere decir que cuando circulan 40mAmp: 0.040 x 330 = 13.2 Volts caerían en la resistencia.
Quiere decir que cuando circulan 100mAmp: 0.140 x 330 = 33 Volts caerían en la resistencia.
Como que no es muy lógico verdad ??. . . puesto que el PIC no puede proporcionar esos voltajes.

Pero esto viene a demostrar que mientras más segmentos enciendan menos voltaje habrá para encenderlos.
De ahí que según la cantidad de segmentos encendidos es el brillo de ellos.

La resistencia en el común del Display NO se requiere.

Tendrás que analizar las hojas de datos de ese PIC16F628 indagando qué tanta corriente puede proporcionar en sus salidas.

Por las salidas en donde están conectados los segmentos se requerirá que el PIC pueda proporcionar la corriente para encender el segmento conectado a ella.

En cambio a donde está conectado el común del Display será el peor caso pues cuando enciendan todos los segmentos se requerirá 0.02 x 7 = 140 mAmp.
Si la terminal del PIC a donde está conectado el Display soporta más de esa corriente ¡perfecto! Si No habría que utilizar un transistor que pueda manejar esa corriente.
Lo mismo ocurre con las terminales a donde están conectados los segmentos del Display.

saludos
a sus ordenes
 
Hola 97872372, si podés hacer lo que planteas, pero como te indicaron debes contemplar el caso que se enciendan los ocho led's del dígito, y esto es lo que ve el pin común, la suma de todas las corrientes.
fijate en estas páginas, aquí desarrollan un frecuencímetro, y lo hacen como lo planteas Vos,

http://www.eeweb.com/project/circuit_projects/frequency-counter-by-pic16f628

http://www.qsl.net/dl4yhf/freq_counter/freq_counter.html

hablan del caso e indican que tipo de led display emplear, a esos los supe encontrar en la casa de electrónica en Argentina, de casualidad, los había traido accidentalmente. siempre empleo led display más grandes, cuando vi la disposición de los pines se me quería caer el cabello, porque Yo los monto directamente en un zócalo DIP 40 de los grandes para no soldar nada, además son incómodos de presentar en la protoboard, única forma de montarlos es como muestro en la foto.
En mi caso las resistencias fueron de 910ohm-
Los Led Display FYS-3911AE (buscá, tienen "datasheet")

Porque no ponés un "driver" como el ULN2803, si tu problema es la corriente, solo incorporás un integrado.
De seguír con lo planteado, quemarás el PIC...
 

Adjuntos

Última edición:
y porque colocar el comun del display al PIC???? no tiene sentido para NADA, chauuuuuuuuuuu


PD: por favor coloca un diagrama hoy no es dia de adivinanzas, chauuuuuuu
 
mmmhhh..... estamos esperando con gran espectativa que nos "desburres" de como controlar los led´s display en la cuestión de hacer el "barrido" si no colocamos el pin común de los mísmos a algún pin del micro que los controle....
(a buen entendedor, pocas palabras, y si las palabras son las exactas, tampoco hace falta un grafico)
 
mmmhhh..... estamos esperando con gran espectativa que nos "desburres" de como controlar los led´s display en la cuestión de hacer el "barrido" si no colocamos el pin común de los mísmos a algún pin del micro que los controle....
(a buen entendedor, pocas palabras, y si las palabras son las exactas, tampoco hace falta un grafico)
Pues te "desburro" no se debe colocar a los pines del PIC por obvias razones y si se hace por barrido se deben conectar a TRs y estos SI se deben colocar al PIC, chauuuuuuuuuuuu
 
Gracias a todos por sus respuestas como les dije la intencion mia era de ver si los transistores eran necesarios o no? y el daño que podian causar al pic? pero pues bueno modifique mi diseño y ahora tengo otro contador con transistor use el 3609 el brillo del display es excelente
y no tengo que preocuparme por daños en el pic.

AHHhhh eso no quiere decir que el contador anterior se daño aun lo tengo funcionando sin problemas, lo instale en una faja transportadora y trabaja todo el dia claro esta que lo tengo a prueba pues mi intencion es saber el tiempo que puede aguantar este proyecto sin usar transistores para amplificar la corriente, sino tan solo colocando resistencias para proteger el pic.

Bueno un gusto y gracias a todos por los comentarios y tambien alas criticas
 
Gente, buenas noches.
Al final del post adjunto fotos y el codigo del programa para que vean el problema.

Pasa esto: Hice un codigo sencillo para que el Pic cuente del 0 al 9 y lo muestre en el display de 7 segmentos. El codigo esta bien hecho y lo pasè a la practica (luego de probarlo primero en el Proteus). Cuando llega a la practica, ahi presenta errores, el error es que hay veces que el pic no da las salidas para que mande el conteo del 0 al 9 hacia el display.

Hablando mas detalladamente pasa esto:

Le doy 5V al circuito --> no funciona nada --> Dèjo de darle 5V al circuito.
Vuelvo a darle 5V al circuito --> Se quedan encendidos 2 de los 7 segmentos del display (Ya sea de manera aleatoria) --> Dèjo de darle 5V al circuito.
Le doy otra vez 5V al circuito --> Ahi si funciona todo como deberia.

Para aclarar: Tengo un cristal de 4MHZ con sus capacitores de 22pF conectados a masa, en la entrada MCLR (pin 1) hay una resistencia de 10k Ohm y un capacitor de 30 pF conectado a masa. Este problema me lo presento cuando hice el codigo con el display, anteriormente habia hecho un pwm para hacer aumentar el brillo de un LED y no hubo problema alguno.




Codigo:

C:
#include <stdio.h>
#include <stdlib.h>
#include "Config.h"
#define _XTAL_FREQ 4000000

void main(){
    TRISB = 0x00;
    int num;
    while(1){
        switch (num){
        case 0: PORTB = 0b0111111; break;
        case 1: PORTB = 0b0000110; break;
        case 2: PORTB = 0b1011011; break;
        //                gfedcba
        case 3: PORTB = 0b1001111; break;
        case 4: PORTB = 0b1100110; break;
        case 5: PORTB = 0b1101101; break;
        case 6: PORTB = 0b1111101; break;
        case 7: PORTB = 0b0000111; break;
        case 8: PORTB = 0b1111111; break;
        case 9: PORTB = 0b1101111; break;
    }
        num=num+1;
        __delay_ms(750);
    if (num==10){
       num=0;
    }
    }
}
El "Config.h"

C:
#pragma config FOSC = XT
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF

#include <xc.h>
Foto 1.jpgFoto 4.jpgFoto 3.jpg
 
Última edición:

D@rkbytes

Moderador
Le doy 5V al circuito --> no funciona nada --> Dejo de darle 5V al circuito.
Vuelvo a darle 5V al circuito --> Se quedan encendidos 2 de los 7 segmentos del display (Ya sea de manera aleatoria) --> Dejo de darle 5V al circuito.
Le doy otra vez 5V al circuito --> Ahí sí funciona todo como debería.
Por código no se ve problema. Podrían ser falsos contactos en el protoboard, sobre todo en el cristal.

¿No es más fácil así?
Contador ascendente 0-9:
C:
#define _XTAL_FREQ 4000000
#include <xc.h>

#pragma config FOSC = XT, PWRTE = ON, WDTE = OFF, LVP = OFF

// Tabla para displays de 7 segmentos cátodo común.
char const tabla_7segs[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void main (void)
{
    char numero = 0;
    
    TRISB = 0b10000000; // RB6 a RB0 como salidas.
    
    while (1)
    {
        PORTB = tabla_7segs[numero];    // Cargar el valor de la tabla en el puerto B
        __delay_ms(1000);   // Esperar 1 segundo
        
        if(++ numero > 9) numero = 0;
    }
}
O para hacerlo ascendente y descendente:
C:
#define _XTAL_FREQ 4000000
#include <xc.h>

#pragma config FOSC = XT, PWRTE = ON, WDTE = OFF, LVP = OFF

// Tabla para displays de 7 segmentos cátodo común.
char const tabla_7segs[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void main (void)
{
    char numero;
    
    TRISB = 0b10000000; // RB6 a RB0 como salidas.
    
    ADCON1 = 0x06;      // Puertos analógicos como digitales.
    
    if(PORTAbits.RA0)
        // Si RA0 está en 1 la cuenta será ascendente y se empieza desde el 0
        numero = 0;
    else
        // Si RA0 está en 0 la cuenta será descendente y se empieza desde el 9
        numero = 9;
    
    while (1)
    {
        PORTB = tabla_7segs[numero];    // Cargar el valor de la tabla en el puerto B
        __delay_ms(1000);   // Esperar 1 segundo
        
        if(PORTAbits.RA0)
        {   // Si RA0 está en 1 se suma.
            if(++ numero > 9) numero = 0;
        }
        else
        {   // Si RA0 está en 0 se resta.
            if(-- numero > 9) numero = 9;   // El desborde (255) será mayor a 9
        }
    }
}
 
Buenas tardes o noches espero se encuentren bien. MauroSL prueba darle un tiempo como de un segundo antes que inicie tu programa principal no se si puede hacer este retardo antes de entrar al void main .
 
Última edición:
Buenas tardes o noches espero se encuentren bien. MauroSL prueba darle un tiempo como de un segundo antes que inicie tu programa principal no se si puede hacer este retardo antes de entrar al void main .
¿Que utilidad tiene eso aparate de perder un segundo?


Es curioso porque lo suelo ver en muchos programas, se ve que sobra el tiempo o algo. Porque sentido nunca le he visto.
O que alguien que no sabía por qué lo hizo y el resto que tampoco lo saben, lo copian. Porque esperar a que se estabilice algo un segundo es bastante tonto.
 
D@rkbytes Al parecer mi codigo sì presentaba fallas, y hasta ahora estoy investigandolas.. porque a tu codigo lo use y me andubo perfecto (a pesar de que tiene la misma finalidad). Le di 5V al circuito varias veces y todas esas veces que le di los 5V, el micro me andubo perfecto.

Si bien todavia soy principiante y ahora veo que dependiendo de como lo programes, sabiendo que tiene una misma finalidad.. puede presentar fallas o no.

Muchas gracias por la ayuda!
Buenas tardes o noches espero se encuentren bien. MauroSL prueba darle un tiempo como de un segundo antes que inicie tu programa principal no se si puede hacer este retardo antes de entrar al void main .
Le puse el delay de un segundo antes y despues del void main, poniendolo antes, no me dejaba compilar y poniendolo despues me hacia el mismo error solo que tardaba un segundo en arrancar, es decir, iniciaba con ese segundo y despues pasaba lo de "Hablando detalladamente"
 
Codigo:

C:
#include <stdio.h>
#include <stdlib.h>
#include "Config.h"
#define _XTAL_FREQ 4000000

void main(){
    TRISB = 0x00;
    int num;
    while(1){
        switch (num){
        case 0: PORTB = 0b0111111; break;
        case 1: PORTB = 0b0000110; break;
        case 2: PORTB = 0b1011011; break;
        //                gfedcba
        case 3: PORTB = 0b1001111; break;
        case 4: PORTB = 0b1100110; break;
        case 5: PORTB = 0b1101101; break;
        case 6: PORTB = 0b1111101; break;
        case 7: PORTB = 0b0000111; break;
        case 8: PORTB = 0b1111111; break;
        case 9: PORTB = 0b1101111; break;
    }
        num=num+1;
        __delay_ms(750);
    if (num==10){
       num=0;
    }
    }
}
El "Config.h"

C:
#pragma config FOSC = XT
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF

#include <xc.h>
El problema es que a "num" nunca lo inicializaste en 0 y al usar "if(num==10)", probablemente nunca se resetee.

Correcciones:

C:
...

void main(){
    ...
    int num=0;
    while(1){
        switch (num){
        ...
    }
       ...
    if (num>=10){
       ...
    }
    }
}
 
El problema es que a "num" nunca lo inicializaste en 0 y al usar "if(num==10)", probablemente nunca se resetee.

Correcciones:

C:
...

void main(){
    ...
    int num=0;
    while(1){
        switch (num){
        ...
    }
       ...
    if (num>=10){
       ...
    }
    }
}

Aca viene la frase "Pequeño gran detalle", estuve metido en el protoboard mas que en el codigo, perdon 😅

Hice la prueba de encender y apagar el modulo de 5V y todas esas veces el codigo me funciono perfecto en el protoboard. Gracias fulanito
 

Arriba