Autor Tema: consulta píc transistores y display 7 segmentos  (Leído 877 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado artemis

  • PIC10
  • *
  • Mensajes: 14
Re:consulta píc transistores y display 7 segmentos
« Respuesta #15 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;
   }
}

« Última modificación: 26 de Noviembre de 2019, 00:51:56 por artemis »

Desconectado remi04

  • PIC18
  • ****
  • Mensajes: 264
Re:consulta píc transistores y display 7 segmentos
« Respuesta #16 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);}
  3.  
Sustituyendo tu actual if else.

   
« Última modificación: 26 de Noviembre de 2019, 06:39:08 por remi04 »

Desconectado artemis

  • PIC10
  • *
  • Mensajes: 14
Re:consulta píc transistores y display 7 segmentos
« Respuesta #17 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);}
  3.  
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

Desconectado remi04

  • PIC18
  • ****
  • Mensajes: 264
Re:consulta píc transistores y display 7 segmentos
« Respuesta #18 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?

Desconectado artemis

  • PIC10
  • *
  • Mensajes: 14
Re:consulta píc transistores y display 7 segmentos
« Respuesta #19 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
« Última modificación: 26 de Noviembre de 2019, 13:19:06 por artemis »

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re:consulta píc transistores y display 7 segmentos
« Respuesta #20 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.

Desconectado artemis

  • PIC10
  • *
  • Mensajes: 14
Re:consulta píc transistores y display 7 segmentos
« Respuesta #21 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


Desconectado remi04

  • PIC18
  • ****
  • Mensajes: 264
Re:consulta píc transistores y display 7 segmentos
« Respuesta #22 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.

 

Desconectado artemis

  • PIC10
  • *
  • Mensajes: 14
Re:consulta píc transistores y display 7 segmentos
« Respuesta #23 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

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re:consulta píc transistores y display 7 segmentos
« Respuesta #24 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.

Desconectado artemis

  • PIC10
  • *
  • Mensajes: 14
Re:consulta píc transistores y display 7 segmentos
« Respuesta #25 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;
   }
}

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re:consulta píc transistores y display 7 segmentos
« Respuesta #26 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.

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re:consulta píc transistores y display 7 segmentos
« Respuesta #27 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:

 

* artemis_sim.JPG
(152.69 kB, 967x704 - visto 35 veces)


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.


Desconectado artemis

  • PIC10
  • *
  • Mensajes: 14
Re:consulta píc transistores y display 7 segmentos
« Respuesta #28 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

Desconectado remi04

  • PIC18
  • ****
  • Mensajes: 264
Re:consulta píc transistores y display 7 segmentos
« Respuesta #29 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.