TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: daniermac en 26 de Julio de 2017, 22:40:08

Título: Contador Ascendente y Descendente con PIC18f2550
Publicado por: daniermac en 26 de Julio de 2017, 22:40:08
consulta, tengo que realizar un TP con las siguientes características:

- realizar botón que funcione como un contador ascendente para la unidad y la decena,
- con un botón de selección entre la unidad y la decena, un botón de play y pausa, de modo decreciente, que al llegar a 0, suene el buzzer por 500ms y accione un relé, el cual
- enciende un led, luego de los 500ms se apague.


 - Tienes que ingresar para ver archivos adjuntos -

acá el código

#include <18f2550.h>
#use Delay (clock=4M)
#fuses XT
#fuses cpudiv1
#byte TRISA = 0xf92
#byte TRISB = 0xf93
#byte TRISC = 0xf94
#byte PORTA = 0xf80
#byte PORTB = 0xf81
#byte PORTC = 0xf82
#bit Ps_Incremento = 0xf80.0
#bit Ps_Inicio     = 0xf80.1
#bit Ps_Seleccion  = 0xf80.2
#bit TR_Display_1 = 0xf82.0
#bit TR_Display_2 = 0xf82.1
#bit TR_Display_3 = 0xf82.2
#bit TR_Display_4 = 0xf82.4
#bit TR_Rele_5  = 0xf82.5
#bit TR_Buzzer_6 = 0xf82.6

BYTE CONST Display_Tabla[10] =
{
   0b11000000, //0
   0b11111001, //1
   0b10100100, //2
   0b10110000, //3
   0b10011001, //4
   0b10010010, //5
   0b10000010, //6
   0b11111000, //7
   0b10000000, //8
   0b10011000}; //9 tabla dada vuelta
   
signed int Unidad = 0, Decena = 0;
int flag = 0; // bandera de Inicio-Pausa

void Escribir_displays()
{
   int t = 100;// tiempo exagerado
   
      IF (Decena != 0)
                  {
                     PORTB = Display_Tabla[Unidad];
                     TR_Display_1 = 0;
                     Delay_ms (t);
                     TR_Display_1 = 1;
                     PORTB = Display_Tabla[Decena];
                     TR_Display_2 = 0;
                     Delay_ms (t);
                     TR_Display_2 = 1;
                 
                  }
       ELSE
                  {
                     PORTB = Display_Tabla[Unidad];
                     TR_Display_1 = 0;
                     Delay_ms (t);
                     TR_Display_1 = 1;
                  }
}
void Play()

   
         {
            WHILE (Ps_Inicio == 0); // Esperamos a que se suelte el pulsador
               {
                  delay_ms (50); // Generamos un retardo de 50mSeg para evitar el rebote
               }
            flag = !flag;
            while (flag == 1)
               {
                  delay_ms (250);
                  Escribir_displays ();
                  TR_Rele_5 = 1;// el relé se cierra                 
                  unidad = Unidad -1;
                  if (Unidad < 0)
                     {
                        Decena = Decena - 1;
                        Unidad = 9;
                     }
                  if (Ps_Inicio == 0)
                     {
                        delay_ms (50);
                        flag = !flag;
                        TR_Rele_5 = 0; // relay se abre
                     }
                  if (Decena == 0 && Unidad == 0)
                     {
                        flag = !flag;
                        TR_Rele_5 = 0; // relay abierto
                        TR_Buzzer_6 = 1;
                        delay_ms (500);
                        TR_Buzzer_6 = 0;
                     }
               }
         }
   }
void main()
{
   TRISA = 255;
   TRISB = 0;
   TRISC = 0;
   PORTB = 255;
   PORTC = 0b00010111;
   WHILE (true)
   {
      IF (Ps_Incremento == 0)
      {
         Unidad = Unidad + 1;
         IF (Unidad == 10)
            {
               Unidad = 0;           
            }
         
         WHILE (Ps_Incremento == 0); // Esperamos a que suelte el pulsador
            {
               delay_ms (50); // Generamos un retardo de 50mSeg para evitar el rebote
            }
            TR_Buzzer_6 = 1;
            delay_ms (300);
            TR_Buzzer_6 = 0;
      }
      if (Ps_Seleccion == 0)
         {
            Decena = Unidad;                 
            Unidad = 0;
            WHILE (Ps_Seleccion == 0); // Esperamos a que suelte el pulsador
               {
                  delay_ms (50); // Generamos un retardo de 50mSeg para evitar el rebote
               }
            TR_Buzzer_6 = 1;
            delay_ms (20); // Doble bip
            TR_Buzzer_6 = 0;
            delay_ms (10);
            TR_Buzzer_6 = 1;
            delay_ms (20);
            TR_Buzzer_6 = 0;
         }
     
      Escribir_displays ();
     
     IF (Ps_Inicio == 0 && ( Decena != 0 || Unidad != 0))
         {
            Play();
         }
   }
}


el tema es que no me muestran los displays, creo que el error debe estar el los BC337 que no están alimentados, si alguno me puede dar una mano, les agradecería, saludos

Daniel
Título: Re:Contador Ascendente y Descendente con PIC18f2550
Publicado por: daniermac en 26 de Julio de 2017, 22:43:28
creo que el código de los displays están para ánodo y no para cátodo, y me parece que eso también hace que dé error, y más de ahí no tengo idea, saludos
Título: Re:Contador Ascendente y Descendente con PIC18f2550
Publicado por: Fer_TACA en 27 de Julio de 2017, 05:11:16
Si los colectores de los transistores van al terminal que enciende los puntos de los displays entonces estos deben de ser de anodo comun.
Lo mismo sucede si ese pin es el de alimentacion.
Título: Re:Contador Ascendente y Descendente con PIC18f2550
Publicado por: daniermac en 27 de Julio de 2017, 08:26:30
Debe ser entonces ese el error, lo único es q no me deja subir el archivo en dsn de proteus 7