Autor Tema: Contador Ascendente y Descendente con PIC18f2550  (Leído 3500 veces)

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

Desconectado daniermac

  • PIC10
  • *
  • Mensajes: 3
Contador Ascendente y Descendente con PIC18f2550
« 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.



* contador.jpg
(184.29 kB, 1360x768 - visto 1427 veces)


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
« Última modificación: 26 de Julio de 2017, 22:52:01 por daniermac »

Desconectado daniermac

  • PIC10
  • *
  • Mensajes: 3
Re:Contador Ascendente y Descendente con PIC18f2550
« Respuesta #1 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
« Última modificación: 26 de Julio de 2017, 22:50:20 por daniermac »

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4154
Re:Contador Ascendente y Descendente con PIC18f2550
« Respuesta #2 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.
Todos los días se aprende algo nuevo.

Desconectado daniermac

  • PIC10
  • *
  • Mensajes: 3
Re:Contador Ascendente y Descendente con PIC18f2550
« Respuesta #3 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