TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: artemis en 21 de Noviembre de 2019, 16:41:43

Título: consulta píc transistores y display 7 segmentos
Publicado por: artemis en 21 de Noviembre de 2019, 16:41:43
hola gente que tal?? soy nuevo en esto de programar PIC y no entiendo mucho
Adjunto el esquema que tengo en proteus.
Estoy utilizando display de 7 segmentos de ánodo común y quiero ir multiplexando entre los distintos dígitos del display pero no me funciona, vi varios ejemplos en internet pero al momento de correr la simulación sólo se apaga un display cuando el contador cuenta 4 veces y luego permanece encendido sin multiplexar con el otro..
EDIT: Estoy utilizando ccs compiler y proteus profesional versión 8.
Código: [Seleccionar]
#include <16F877A.h>
#fuses XT,NOWDT,PUT,NOLVP
#use delay (clock=800) // declaro el cristal
#use STANDARD_IO(B)

      VOID decimalBinario (int numero) ;

void main()
{
   INT i;
   SET_TRIS_A (0b11111111); //todas entradas
   SET_TRIS_B (0b00000000); //todas salidas
   SET_TRIS_C (0b00000000); //todas salidas
   WHILE (1)
   {
     
     
      FOR (i = 0; i < 10; i++)
      {
         decimalBinario (i);
         IF (!input (PIN_C0))
         {output_high (PIN_C0);
          output_low (PIN_C1);
         }
         ELSE
         {output_high(PIN_C1);
          output_low(PIN_C0);
         }
         delay_ms (2000);
      }
   }
}

void decimalBinario(INT numero)
{
   SWITCH (numero)
   {
      CASE 0:
      output_b (0b1000000);
      BREAK;

      CASE 1:
      output_b (0b11111001);
      BREAK;

      CASE 2:
      output_b (0b0100100);
      BREAK;

      CASE 3:
      output_b (0b0110000);
      BREAK;

      CASE 4:
      output_b (0b0011001);
      BREAK;

      CASE 5:
      output_b (0b0010010);
      BREAK;

      CASE 6:
      output_b (0b0000010);
      BREAK;

      CASE 7:
      output_b (0b1111000);
      BREAK;

      CASE 8:
      output_b (0b0000000);
      BREAK;

      CASE 9:
      output_b (0b0011000);
      BREAK;
   }
}
saludos
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: elreypic2 en 21 de Noviembre de 2019, 19:10:54
Que tal artemis,

Por lo que veo no hay delay entre un display y el otro, lo que significa que enciendes uno e inmediatamente lo apagas y enciendes el otro, como es tan rápido, la sensasión que te dará es que ambos displays están encendidos. De hecho esa es la idea cuando se usa la técnica de multiplexación. En realidad se usa un delay de 1ms aprox entre cada display de esa manera al final te da la sensación de que muestras diferentes valores en los displays.
Si lo que quieres es ver cuando se enciende un display y cuando se apaga el otro, coloca un delay de 1 segundo o mayor, para que puedas ver el efecto.

elreypic.
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: artemis en 21 de Noviembre de 2019, 19:22:24
Que tal artemis,

Por lo que veo no hay delay entre un display y el otro, lo que significa que enciendes uno e inmediatamente lo apagas y enciendes el otro, como es tan rápido, la sensasión que te dará es que ambos displays están encendidos. De hecho esa es la idea cuando se usa la técnica de multiplexación. En realidad se usa un delay de 1ms aprox entre cada display de esa manera al final te da la sensación de que muestras diferentes valores en los displays.
Si lo que quieres es ver cuando se enciende un display y cuando se apaga el otro, coloca un delay de 1 segundo o mayor, para que puedas ver el efecto.

elreypic.
hola elreypic que tal? como se setea el delay?? vi en algunos lados que ponian delay_ms pero no se si requiere de alguna libreria en especial o como es?
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: remi04 en 21 de Noviembre de 2019, 19:37:01
Requiere usar el macro
#use delay (clock=8000000)  “la cifra es la velocidad del oscilador de tu pic)

 Luego la función la llamas:

delay_ms(10);    // genera retardo de 10 milisegundos.

O bien

 delay_us(10);     // genera retardo de 10 microsegundos.

  10,o 100, o 1000 , lo que quieras.
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: artemis en 21 de Noviembre de 2019, 20:05:44
Requiere usar el macro
#use delay (clock=8000000)  “la cifra es la velocidad del oscilador de tu pic)

 Luego la función la llamas:

delay_ms(10);    // genera retardo de 10 milisegundos.

O bien

 delay_us(10);     // genera retardo de 10 microsegundos.

  10,o 100, o 1000 , lo que quieras.
mi compilador no me reconoce "#use", utilizo el hpdpic
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: elreypic2 en 21 de Noviembre de 2019, 21:19:02
Para el ya obsoleto compilador C de Hitech, la forma de hacerlo es:

_XTAL_FREQ  freq        //freq es el valor en hertz del oscilador, Ejemplo (4MHz): 4000000

__delay_ms(x);           //request a delay in miliseconds
__delay_us(x);            //request a delay in microseconds

elreypic
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: artemis en 21 de Noviembre de 2019, 23:22:23
Para el ya obsoleto compilador C de Hitech, la forma de hacerlo es:

_XTAL_FREQ  freq        //freq es el valor en hertz del oscilador, Ejemplo (4MHz): 4000000

__delay_ms(x);           //request a delay in miliseconds
__delay_us(x);            //request a delay in microseconds

elreypic
Puse lo siguiente:
#define _XTAL_FREQ 1000
Pero cuando pongo __delay_ms(1000); no me reconoce la función y me lanza esta advertencia "function declared implicit int", sin generarse el hexa
Me falta alguna librería o algo??
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: elreypic2 en 22 de Noviembre de 2019, 11:22:56
¿Podrías especificar cuál compilador estas usando?
Parece que no es el compilador C de Hitech, ya que este ocupa que incluyas el archivo htc.h

#include <htc.h>

y no veo que lo tengas.

elreypic.
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: artemis en 22 de Noviembre de 2019, 11:25:57
¿Podrías especificar cuál compilador estas usando?
Parece que no es el compilador C de Hitech, ya que este ocupa que incluyas el archivo htc.h

#include <htc.h>

y no veo que lo tengas.

elreypic.
utilizo el hi-tech pero en la carpeta "includes" no tengo el htc.h sino que tengo uno llamado hitech.h  pero no se si es lo mismo
saludos
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: elreypic2 en 22 de Noviembre de 2019, 15:14:33
Parece ser que la versión que estás usando es muy antigua y la verdad no estoy seguro si ambos archivos sean lo mismo.

¿Tienes el manual de usuario de esa versión en particular?
¿Podrías indicar cuál es la versión del compilador que estás usando?
Usa un command promt de windows y ejecuta el comando:

PICC --VER

Este te mostrará la versión del compilador qeu estás usando. Pero lo mejor sería que tuvieras el manual. Para buscar el uso de los delays. Este pudiera estar en la carpeta de instalación del compilador.

elreypic.
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: artemis en 22 de Noviembre de 2019, 15:58:06
Parece ser que la versión que estás usando es muy antigua y la verdad no estoy seguro si ambos archivos sean lo mismo.

¿Tienes el manual de usuario de esa versión en particular?
¿Podrías indicar cuál es la versión del compilador que estás usando?
Usa un command promt de windows y ejecuta el comando:

PICC --VER

Este te mostrará la versión del compilador qeu estás usando. Pero lo mejor sería que tuvieras el manual. Para buscar el uso de los delays. Este pudiera estar en la carpeta de instalación del compilador.

elreypic.
adjunto el manual que tiene la carpeta donde está instalado el compilador, no encontré ninguna función delay yo
https://mega.nz/#!sVNQ2AiK!9u_NwLF7Z7DiW5mfK_CRONM8PBGfethAAjbLAAlJnFI (https://mega.nz/#!sVNQ2AiK!9u_NwLF7Z7DiW5mfK_CRONM8PBGfethAAjbLAAlJnFI)
pd: lo tuve que subir a mega porque no deja adjuntar archivos de mas de 400kb
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: elreypic2 en 22 de Noviembre de 2019, 20:14:20
¿Me puedes decir que version de compilador tienes, usando el comando que te mencioné?

elreypic
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: artemis en 22 de Noviembre de 2019, 21:36:29
¿Me puedes decir que version de compilador tienes, usando el comando que te mencioné?

elreypic
hola acá adjunto la captura del cmd
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: KILLERJC en 22 de Noviembre de 2019, 22:23:18
Yo opino que no se de mas soporte a compiladores extremadamente viejos.

Considero que lo mejor es que baje XC8 y que haga el programa ahi, se terminarían los problemas para el y también para aquel que le quiere ayudar.
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: elreypic2 en 23 de Noviembre de 2019, 00:47:34
Que tal artemis,

Desafortunadamente esa versión de C no tiene las rutinas de delay. Como bien te dice KILLERJC, va a ser mejor que descargues una version actual del XC de Microchip (la versión gratuita) y uses esa para tu proyecto. De esa manera te quitarás de cualquier problema.

O bien si puedes conseguir una versión más actualizada (creo que la última fue la 9.83).

elreypic.
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: artemis en 26 de Noviembre de 2019, 00:31:58
Que tal artemis,

Desafortunadamente esa versión de C no tiene las rutinas de delay. Como bien te dice KILLERJC, va a ser mejor que descargues una version actual del XC de Microchip (la versión gratuita) y uses esa para tu proyecto. De esa manera te quitarás de cualquier problema.

O bien si puedes conseguir una versión más actualizada (creo que la última fue la 9.83).

elreypic.
hola reypic estuve haciendo modificaciones, instalé el ccs compiler que trabaja con mas librerias y probé el siguiente código:
Esto lo armé según el manual y algunos tutoriales que estoy viendo, pero sigue sin "apagarse" uno de los displays  cuando voy multiplexando entre los pines del puerto C que están conectados a los transistores, a que se debe??
Código: [Seleccionar]
#include <16F877A.h>
#fuses XT,NOWDT,PUT,NOLVP
#use delay (clock=800) // declaro el cristal
#use STANDARD_IO(B)

      VOID decimalBinario (int numero) ;

void main()
{
   INT i;

   WHILE (1)
   {
     
      SET_TRIS_A (0b11111111); //todas entradas
      SET_TRIS_B (0b00000000); //todas salidas
      SET_TRIS_C (0b00000000); //todas salidas
     
      FOR (i = 0; i < 10; i++)
      {
         decimalBinario (i);
         
         IF (input_state (PIN_C0) == 0)
         {
            output_c (0b11111101);
         }

         ELSE
         {
            output_c (0b11111110);
         }

         delay_ms (4000);
      }
   }
}

void decimalBinario(INT numero)
{
   SWITCH (numero)
   {
      CASE 0:
      output_b (0b1000000);
      BREAK;

      CASE 1:
      output_b (0b11111001);
      BREAK;

      CASE 2:
      output_b (0b0100100);
      BREAK;

      CASE 3:
      output_b (0b0110000);
      BREAK;

      CASE 4:
      output_b (0b0011001);
      BREAK;

      CASE 5:
      output_b (0b0010010);
      BREAK;

      CASE 6:
      output_b (0b0000010);
      BREAK;

      CASE 7:
      output_b (0b1111000);
      BREAK;

      CASE 8:
      output_b (0b0000000);
      BREAK;

      CASE 9:
      output_b (0b0011000);
      BREAK;
   }
}

Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: remi04 en 26 de Noviembre de 2019, 05:23:32
Dos cositas:

  1- saca los tris del while. Ponlos encima del int i; por ejemplo. No es la causa del problema es absurdo meterlo en el bucle.

 2- la función input_state(); no cambia la dirección del pin que lees. Ten en cuenta que los pines C son salidas, por ello input_state te va a devolver siempre cero.

Podrías hacer:
Código: C
  1. if (!input(PIN_C0) {output_high(PIN_C0);output_low(PIN_C1);}
  2. else {output_high(PIN_C1);output_low(PIN_C0);}
Sustituyendo tu actual if else.

   
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: artemis en 26 de Noviembre de 2019, 12:27:22
Dos cositas:

  1- saca los tris del while. Ponlos encima del int i; por ejemplo. No es la causa del problema es absurdo meterlo en el bucle.

 2- la función input_state(); no cambia la dirección del pin que lees. Ten en cuenta que los pines C son salidas, por ello input_state te va a devolver siempre cero.

Podrías hacer:
Código: C
  1. if (!input(PIN_C0) {output_high(PIN_C0);output_low(PIN_C1);}
  2. else {output_high(PIN_C1);output_low(PIN_C0);}
Sustituyendo tu actual if else.

 
hola probé con ese if pero me sigue manteniendo los leds encendidos a pesar de que las salidas de C van cambiando de 0 a 1 y viceversa
adjunto captura del proteus
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: remi04 en 26 de Noviembre de 2019, 13:08:16
Fíjate que a la entrada a la resistencia R9 hay un cero lógico y en la R8 hay un uno lógico. Sin embargo ambos transistores están en conducción.

  Revisa la conexión de la resistencia R8, no se por que tiene como dos uniones en los extremos de la resistencia mientras las demás no.  Yo es que no uso simuladores.
y qué tipo de display estás usando , ¿Anodo común o cátodo común?
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: artemis en 26 de Noviembre de 2019, 13:16:16
Fíjate que a la entrada a la resistencia R9 hay un cero lógico y en la R8 hay un uno lógico. Sin embargo ambos transistores están en conducción.

  Revisa la conexión de la resistencia R8, no se por que tiene como dos uniones en los extremos de la resistencia mientras las demás no.  Yo es que no uso simuladores.
y qué tipo de display estás usando , ¿Anodo común o cátodo común?
estoy utilizando ánodo común y por eso puse transistores PNP, para mi el problema está en que siempre tienen corriente por el lado del emisor, y los mantiene prendidos pero no se porque los ejemplos que vi con ese tipo de ánodo lo planteaban de esa forma
La idea seria que como uno de las salidas del puerto C está apagada, también se apague un display
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: elreypic2 en 26 de Noviembre de 2019, 13:20:20
Que tal artemis,

Vamos aponer algo de orden en tu simulación.

1) La entrada del R8 no sé a que puerto está conectado y pareciera que esta en corto con varios pines
2) De igual manera los pines 1 y 2 del display hacia los colectores del transistores PNP, hay que definirlos bien, pareciera que están cortocircuitados.

Los displays que se usan en PROTEUS en realidad no son analógicos, son algo como digitales, entonces las resistencias R1-R7 en realidad no pueden ser de 10K, ya que el voltaje que usas es de solo 5V, esas resistencias deberían ser de unos 220 ohms, pero a proteus no le importa eso.

No está indicado cual transistor PNP estás usando, lo que es importante, ya que posiblemente la resistencia de base no es suficiente para poner el transistor en corte o saturación. ¿Qué transistor estás usando? ¿BC557, 2N3906, 2N2907?

Algo que me ha pasado con este display es que necesitas apagar todos los dígitos antes de encender solamente un solo dígito.

elreypic.
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: artemis en 26 de Noviembre de 2019, 13:36:57
Que tal artemis,

Vamos aponer algo de orden en tu simulación.

1) La entrada del R8 no sé a que puerto está conectado y pareciera que esta en corto con varios pines
2) De igual manera los pines 1 y 2 del display hacia los colectores del transistores PNP, hay que definirlos bien, pareciera que están cortocircuitados.

Los displays que se usan en PROTEUS en realidad no son analógicos, son algo como digitales, entonces las resistencias R1-R7 en realidad no pueden ser de 10K, ya que el voltaje que usas es de solo 5V, esas resistencias deberían ser de unos 220 ohms, pero a proteus no le importa eso.

No está indicado cual transistor PNP estás usando, lo que es importante, ya que posiblemente la resistencia de base no es suficiente para poner el transistor en corte o saturación. ¿Qué transistor estás usando? ¿BC557, 2N3906, 2N2907?

Algo que me ha pasado con este display es que necesitas apagar todos los dígitos antes de encender solamente un solo dígito.

elreypic.
Hola elreypic  te comento:
1- R8 está conectado a la pin RC1
2- Estaba utilizando un PNP genérico, ahora puse uno especifico (el 2N3906) y ahora si se apaga uno pero no vuelve a encender. así que no está andando del todo bien

Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: remi04 en 26 de Noviembre de 2019, 14:00:14
Fíjate si el indicador del pin enciende y apaga según tenga que suceder. Si prenden los indicadores pero el dígito dice que nanai pues es problema de simulación con ese display.

 
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: artemis en 26 de Noviembre de 2019, 14:12:00
Fíjate si el indicador del pin enciende y apaga según tenga que suceder. Si prenden los indicadores pero el dígito dice que nanai pues es problema de simulación con ese display.

 
uno de los display se apaga recién cuando cuenta hasta 4 y no entiendo por qué, luego no vuelve a prenderse más.. sigue el contador con un display solo
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: elreypic2 en 26 de Noviembre de 2019, 15:14:09
artemis,

¿Podrías subir tu código y compartirnos tu archivo de imulación de proteus?
¿Cuál versión de proteus estás usando?

elreypic.
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: artemis en 26 de Noviembre de 2019, 15:22:56
artemis,

¿Podrías subir tu código y compartirnos tu archivo de imulación de proteus?
¿Cuál versión de proteus estás usando?

elreypic.
acá adjunto el código  y el archivo del proyecto en proteus, utilizo la version 8 profesional de proteus
Código: [Seleccionar]
#include <16F877A.h>
#fuses XT,NOWDT,PUT,NOLVP
#use delay (clock=800) // declaro el cristal
#use STANDARD_IO(B)

      VOID decimalBinario (int numero) ;

void main()
{
   INT i;
   SET_TRIS_A (0b11111111); //todas entradas
   SET_TRIS_B (0b00000000); //todas salidas
   SET_TRIS_C (0b00000000); //todas salidas
   WHILE (1)
   {
     
     
      FOR (i = 0; i < 10; i++)
      {
         decimalBinario (i);
         IF (!input (PIN_C0))
         {output_high (PIN_C0);
          output_low (PIN_C1);
         }
         ELSE
         {output_high(PIN_C1);
          output_low(PIN_C0);
         }
         delay_ms (2000);
      }
   }
}

void decimalBinario(INT numero)
{
   SWITCH (numero)
   {
      CASE 0:
      output_b (0b1000000);
      BREAK;

      CASE 1:
      output_b (0b11111001);
      BREAK;

      CASE 2:
      output_b (0b0100100);
      BREAK;

      CASE 3:
      output_b (0b0110000);
      BREAK;

      CASE 4:
      output_b (0b0011001);
      BREAK;

      CASE 5:
      output_b (0b0010010);
      BREAK;

      CASE 6:
      output_b (0b0000010);
      BREAK;

      CASE 7:
      output_b (0b1111000);
      BREAK;

      CASE 8:
      output_b (0b0000000);
      BREAK;

      CASE 9:
      output_b (0b0011000);
      BREAK;
   }
}
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: elreypic2 en 26 de Noviembre de 2019, 19:12:59
Mil disculpas artemis. No pude abrir tu archivo de simulacián de proteus. Tengo la versió. 8.6 y requiro una superior.

Pero más tarde que llegue a casa recapturo tu esquemático y veo que es lo que está pasando

saludos

elreypic.
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: elreypic2 en 26 de Noviembre de 2019, 21:58:16
Que tal artemis,

Pues lo prometido es deuda. Analizando tu código a detalle, el siguiente código es como debería quedar:

Código: [Seleccionar]
#include <16F876A.h>
#fuses XT,NOWDT,PUT,NOLVP
#use delay(crystal=4000000)
#use FIXED_IO( B_outputs=PIN_B7,PIN_B6,PIN_B5,PIN_B4,PIN_B3,PIN_B2,PIN_B1,PIN_B0 )
#use FIXED_IO( C_outputs=PIN_C1,PIN_C0 )

void decimalBinario(int numero);


void main()
{
   
   int i;
   while(1)
   {
      for (i=0;i<10;i++)
      {
         decimalBinario(i);
         if (!input(PIN_C0))
         {
            output_high(PIN_C0);
            output_low(PIN_C1);
         }
         else
         {
            output_high(PIN_C1);
            output_low(PIN_C0);
         }
         delay_ms(2000);
      }

   }

}

void decimalBinario(int numero)
{
   switch (numero)
   {
      case 0:
      output_b (0b1000000);
      break;

      case 1:
      output_b (0b11111001);
      break;

      case 2:
      output_b (0b0100100);
      break;

      case 3:
      output_b (0b0110000);
      break;

      case 4:
      output_b (0b0011001);
      break;

      case 5:
      output_b (0b0010010);
      break;

      case 6:
      output_b (0b0000010);
      break;

      case 7:
      output_b (0b1111000);
      break;

      case 8:
      output_b (0b0000000);
      break;

      case 9:
      output_b (0b0011000);
      break;
   }
}

Debes agregar unas resitencias de pull-down en los colectores de los transistores (R11 y R12), ya que este display necesita ver un nivel bajo (0) para saber que el digito está apagado correctamente (es una especie de bug que tiene proteus). En la realidad no son necesarias esas resistencias.

Aquí un snapshot de mi simulación:

  - Tienes que ingresar para ver archivos adjuntos -  

No se cual sea la frecuencia del cristal que estes usando pero yo lo definí como de 4MHz. Eso también lo tienes que definir en las propiedades del microcontrolador en el simulador del proteus. Ojo el agregar un cristal de 4MHz, no significa que proteus simula a esa frecuencia, tienes que seleccionar el microcontrolador, darle click derecho y en donde dice Porecesso Clock Frequency colocar: 4MHz.

saludos y espero esto te sirva

elreypic.

Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: artemis en 27 de Noviembre de 2019, 00:53:00
Que tal artemis,

Pues lo prometido es deuda. Analizando tu código a detalle, el siguiente código es como debería quedar:

Código: [Seleccionar]
#include <16F876A.h>
#fuses XT,NOWDT,PUT,NOLVP
#use delay(crystal=4000000)
#use FIXED_IO( B_outputs=PIN_B7,PIN_B6,PIN_B5,PIN_B4,PIN_B3,PIN_B2,PIN_B1,PIN_B0 )
#use FIXED_IO( C_outputs=PIN_C1,PIN_C0 )

void decimalBinario(int numero);


void main()
{
   
   int i;
   while(1)
   {
      for (i=0;i<10;i++)
      {
         decimalBinario(i);
         if (!input(PIN_C0))
         {
            output_high(PIN_C0);
            output_low(PIN_C1);
         }
         else
         {
            output_high(PIN_C1);
            output_low(PIN_C0);
         }
         delay_ms(2000);
      }

   }

}

void decimalBinario(int numero)
{
   switch (numero)
   {
      case 0:
      output_b (0b1000000);
      break;

      case 1:
      output_b (0b11111001);
      break;

      case 2:
      output_b (0b0100100);
      break;

      case 3:
      output_b (0b0110000);
      break;

      case 4:
      output_b (0b0011001);
      break;

      case 5:
      output_b (0b0010010);
      break;

      case 6:
      output_b (0b0000010);
      break;

      case 7:
      output_b (0b1111000);
      break;

      case 8:
      output_b (0b0000000);
      break;

      case 9:
      output_b (0b0011000);
      break;
   }
}

Debes agregar unas resitencias de pull-down en los colectores de los transistores (R11 y R12), ya que este display necesita ver un nivel bajo (0) para saber que el digito está apagado correctamente (es una especie de bug que tiene proteus). En la realidad no son necesarias esas resistencias.

Aquí un snapshot de mi simulación:

  - Tienes que ingresar para ver archivos adjuntos -  

No se cual sea la frecuencia del cristal que estes usando pero yo lo definí como de 4MHz. Eso también lo tienes que definir en las propiedades del microcontrolador en el simulador del proteus. Ojo el agregar un cristal de 4MHz, no significa que proteus simula a esa frecuencia, tienes que seleccionar el microcontrolador, darle click derecho y en donde dice Porecesso Clock Frequency colocar: 4MHz.

saludos y espero esto te sirva

elreypic.
perfecto agregando esas resistencias ahora funciona la mutliplexación
muchas gracias.
pd: voy a abrir otro tema porque tengo unas dudas sobre PWM
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: remi04 en 27 de Noviembre de 2019, 04:10:53
Por eso hay que evitar al máximo los simuladores. Te hacen perder un huevo de tiempo y te vuelves loco para solucionar cosas irreales.  Matas el tiempo haciendo funcionar bug de aplicaciones en vez de desarrollando.

  El mejor simulador es la placa de desarrollo. Todo lo demás es una pérdida de tiempo bestial y asimilar conceptos erróneos.

  Imagínate que a alguien le da por llevar ese circuito a la práctica con esas resistencias en los colectores  ;-)

  De hecho estuve apunto de decirte que probases poniendo resistencias pull down en las bases de los transistores. Pero siendo los puertos C de ese micro TTL lo veía innecesario para asegurar el nivel lógico cero. 
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: dago2000 en 19 de Mayo de 2020, 14:30:04
#include <multitime.h>

#include <DS1307.C>

#int_TIMER0
void TIMER0_isr(void){ 
   digito=digito<<1;
   conta1 = conta1+2;
   if(digito==0x80){digito=0x10; conta1=0;}
   output_high(ERA_595);
   output_b(~digito);
   if(conta1==4){
      write_REG(digi7S[1][Display[conta1+0]],digi7S[1][Display[conta1+1]]);
   }else{
      write_REG(digi7S[1][Display[conta1+0]],digi7S[dt][Display[conta1+1]]);
   }
   delay_us(900);
   output_low(ERA_595);
   set_timer0(140);
}

#INT_TIMER1
void  TIMER1_isr(void){
   set_timer1(3036);       //100ms Over flow
   if(mil_seg<5){++mil_seg;}
   if(mil_seg==5){
      mil_seg=0;
      dt=!dt;
      output_toggle(PIN_A1);
      if(modo<=1){
         if(modo==1){
         
         }
     
      }
     
   }
   
}

#INT_EXT
void  EXT_isr(void){
   p=0;
   while((~BTN_MODO)&&(p<27000)){p++;}
   
}

#INT_RDA
void  RDA_isr(void){

}

#INT_CCP2
void  CCP2_isr(void){

}

void main(){
   tris_porta = 0x00; porta = 0x00;
   tris_portb = 0x01; portb = 0xF0;
   tris_portc = 0x81; portc = 0x00;
   
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128|RTCC_8_BIT);    //06.6 ms overflow
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);                  //104 ms overflow  = (65536 – TMR1) * P * (4/FOSC)
   setup_timer_2(T2_DIV_BY_16,255,1);                       //819 us overflow, 819 us interrupt

   setup_ccp2(CCP_CAPTURE_FE);
   //rtc_init();
   set_timer0(140);       //100ms Over flow
   set_timer1(3036);       //100ms Over flow
   
   enable_interrupts(INT_TIMER0);
   enable_interrupts(INT_TIMER1);   
   enable_interrupts(INT_EXT);
   ext_int_edge(L_TO_H);
   enable_interrupts(INT_RDA);
   enable_interrupts(INT_CCP2);
   enable_interrupts(GLOBAL);

   while(TRUE){

      Display[0]=1;
      Display[1]=2;
      Display[2]=3;
      Display[3]=4;
      Display[4]=5;
      Display[5]=6;
     
      delay_ms(200);
   }

}
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: dago2000 en 19 de Mayo de 2020, 14:31:23
#include <16F876A.h>
#device ADC=10

#fuses NOWDT, HS, PUT, PROTECT, NOBROWNOUT, NOLVP, NOCPD
#use delay(clock=20000000)

#ZERO_RAM

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)

#byte tris_porta = 0x85
#byte tris_portb = 0x86
#byte tris_portc = 0x87

#byte porta = 0x05
#byte portb = 0x06
#byte portc = 0x07

#define ERA_595   PIN_A0
#define BTN_MODO  PIN_B0
#define DATO_595  PIN_B1
#define CLK_595   PIN_B2
#define STH_595   PIN_B3
#define BTN_START PIN_C0
#define TX        PIN_C6
#define RX        PIN_C7

#use rs232(baud=9600,parity=N,xmit=TX,rcv=RX,bits=8,stream=PORT1)

#define cargar output_high(STH_595); delay_cycles(1);  output_low(STH_595);
#define clk    output_high(CLK_595); delay_cycles(1);  output_low(CLK_595);

/***********************************  0    1    2    3    4    5    6    7    8    9    -    F       ****/
const unsigned int8 digi7S[2][13]={{0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0xC0,0xF1,0x80},
                                   {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40,0x71,0x00}};

int1 dt=false;
unsigned int8 mil_seg=0, digito=0x10, conta1=0;
unsigned char modo=0;
static unsigned int8 Display[8]={0,0,0,0,0,0,0,0};
unsigned long p=0;
////////////////////////////////////////////////////////////////////////
//           DESPLAZAMIENTO 4094 Y PARALELO ULN2803
////////////////////////////////////////////////////////////////////////
void write_REG(int8 dato1, int8 dato2) {
int16 total;
   
   total = (dato2*0x100) | dato1;
   output_low(STH_595); output_low(CLK_595);
   
   for(int8 i=0;i<16;i++){
      output_bit(DATO_595,shift_left(&total,2,0));  //MSB first
      clk;
   }
   cargar;
}
Título: Re:consulta píc transistores y display 7 segmentos
Publicado por: Fer_TACA en 19 de Mayo de 2020, 17:29:29
¿ Y cuál es la pregunta?