Autor Tema: Contador ascendente y descendente de 0 a 999 con PIC16F887 en MikroC  (Leído 187 veces)

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

Desconectado Oscar Agmen

  • PIC10
  • *
  • Mensajes: 1
Contador ascendente y descendente de 0 a 999 con PIC16F887 en MikroC
« en: 18 de Noviembre de 2019, 03:03:36 »
Hola amigos :lol:, en esta ocasion quiero ver si me pueden proporcionar ayuda para que por medio de un sensor pueda realizar un conteo que se vea reflejado en 3 displays, con un boton realizaria el desconteo en una unidad por cada pulso igual que el conteo, tengo un codigo solo me faltaria la parte del "while" que esta dentro de "void main" que seria la parte que haga interactuar las otras partes del programa que seria "conteo" y "desconteo" por medio de sentencias "if". El circuito con el que quiero que esto funcione lo anexe en el mensaje Gracias de antemano.

unsigned char unidades;
unsigned char decenas;
unsigned char centenas;
unsigned char TABLA[]={0x77,0x41,0x3B,0x6B,0x4D,0x6E,0x7E,0x43,0x7F,0x6F};

void conteo();
void desconteo();
void multiplexado(unsigned char veces);

void main()
{
TRISC=0x00;
TRISD=~0x07;
OPTION_REG=OPTION_REG & 0x7F;
ANSELH=0x00;
PORTB=0;

unidades=0;
decenas=0;
centenas=0;

           while(1)
           {
           if(PORTB & 0x01)
           {





           multiplexado(25);
           }
}

void conteo()
{
     unidades++;
     if(unidades==10)
     {
                     unidades=0;
                     decenas++;
                     
                     if(decenas==10)
                     {
                                    decenas=0;
                                    centenas++;
                                   
                                    if(centenas==10)
                                    {
                                                    centenas=0;
                                    }
                     }
     }
}

void desconteo()
{
     if(unidades==0)
     {
                    unidades=9;
                    if(decenas==0)
                    {
                                  decenas=9;
                                  if(centenas==0)
                                  {
                                                 centenas=9;
                                  }
                                  else centenas--;
                    }
                    else decenas--;
     }
     else unidades--;

}

void multiplexado(unsigned char veces)
{
PORTD.RD0=0;
PORTD.RD1=0;
PORTD.RD2=0;

            while(veces)
            {
            PORTC=TABLA[unidades];
            PORTD.RD2=1;
            delay_ms(3);
            PORTD.RD2=0;
           
            PORTC=TABLA[decenas];
            PORTD.RD1=1;
            delay_ms(3);
            PORTD.RD1=0;
           
            PORTC=TABLA[centenas];
            PORTD.RD0=1;
            delay_ms(3);
            PORTD.RD0=0;
            }
}
« Última modificación: 18 de Noviembre de 2019, 03:11:21 por Oscar Agmen »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7426
Re:Contador ascendente y descendente de 0 a 999 con PIC16F887 en MikroC
« Respuesta #1 en: 18 de Noviembre de 2019, 08:56:43 »
Un sensor seria exactamente igual en tu programa que un boton.

Mi recomendacion es que actues de otra forma:

Boton/sensor conteo: Aumenta una variable, Atento a no aumentar pasado los 999
Boton/sensor desconteo: Disminuye una variable, atento a no disminuir si es 0.

Podras observar que digo UNA variable. Y asi es , una sola. Luego creas una funcion que te separe las decenas/centenas/unidades y finalmente mostras.
Como la funcion que separa las centenas etc, es tal ves un poco lenta y a veces no necesaria si no cambia el valor de la variable, podrias usar alguna otra varible para indicar si cambio o no (al presionar los botones lo activas) y antes de pasarlo a BCD preguntas si es necesario.

Tambien lo mejor es llevar el multiplexado a una interrupcion, haciendo que cada ves que entre a la interrupcion te muestre otro display, sin delays entre medio ya que esto lo fija la interrupcion. Pero si es muy avanzado esto, entonces solo tenes que tener en cuenta que los botones/sensores, si tu Main es MUY rapido (que siempre lo es ) podria aumentar de mas de 1, por lo que vas a tener que buscar una forma un poco mas complicada al actuar sobre los botones, preguntando si se mantiene presionado, si se solto, etc.


 

anything