Ayuda con el código PIC C eficiente y concisa

0

Soy bastante nuevo en la programación de microcontroladores PIC, pero me estoy quedando atrapado en él y me encanta. Hoy mi pequeño proyecto era hacer que un número de pantalla de 7 segmentos contara de 0 a 9, multiplexando cada segmento a medida que los números progresaban.

Terminé con este enorme trozo de código. Ahora, como soy bastante nuevo en esto, estoy 100% seguro de que hay una mejor manera de hacer que una pantalla de 7 segmentos cuente, utilizando multiplexación, porque simplemente atascé lo que sabía. Tengo temporizadores y bucles y cosas idk por todo el lugar, aunque funciona. Me encantaría poner todo en carpetas, hacerlo limpio y asegurarme de que mi código sea tan eficiente como sea posible (¡y no tener la función declarada como implícita warnigs en la compilación)

¡Por favor, ayuda a un hermano!

Gracias.

Aquí es cómo se veía main.c:

(definiciones.h contiene _XTAL_FREQ y PORTbits, y config.h contiene bits de configuración)

#include <xc.h>
#include "config.h"
#include "definitions.h"

void delay(void)
{
        INTCONbits.T0IF = 0;        //Clear the Timer 0 interrupt flag
        TMR0 = 0b11111010;          
        INTCONbits.T0IE = 1;        //Enable the Timer 0 interrupt

        while(INTCONbits.T0IF == 0) //Wait for the interrupt to occur. This
        {                           //happens when the TMR0 register rolls over.
            NOP();
        }
}

int main(void)
{
    TRISD=0x00;

    OPTION_REGbits.PSA = 0;     //Prescaler assigned to Timer 0 (other option is to
                                //the Watchdog timer (WDT))

    OPTION_REGbits.PS = 0b111;  //Set the prescaler to 1:256
    OPTION_REGbits.T0CS = 0;    //Use the instruction clock (Fcy/4) as the timer
                                //clock. Other option is an external oscillator
                                //or clock on the T0CKI pin.

    while(1)
    {
        no0();
        __delay_ms(1);
        no1();
        __delay_ms(1);
        no2();
        __delay_ms(1);
        no3();
        __delay_ms(1);
        no4();
        __delay_ms(1);
        no5();
        __delay_ms(1);
        no6();
        __delay_ms(1);
        no7();
        __delay_ms(1);
        no8();
        __delay_ms(1);
        no9();
        __delay_ms(1);
    }
}

int no0()
{
    unsigned int a;

    for(a=0;a<100;a++)
        {
        SEG1=1;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=1;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=1;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=1;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=1;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=1;
        delay();
        }
}

int no1()
{
    unsigned int b;

    for(b=0;b<300;b++)
        {
        SEG1=0;
        SEG2=0;
        SEG3=1;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=1;
        SEG7=0;
        delay();
        }
}

int no2()
{
    unsigned int c;

    for(c=0;c<120;c++)
    {
        SEG1=1;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=1;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=1;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=1;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=1;
        delay();
    }
}

int no3()
{
    unsigned int d;

    for(d=0;d<120;d++)
    {
        SEG1=1;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=1;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=1;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=1;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=1;
        delay();
    }
}

int no4()
{
    unsigned int e;

    for(e=0;e<150;e++)
    {
        SEG1=0;
        SEG2=1;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=1;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=1;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=1;
        SEG7=0;
        delay();       
    }
}

int no5()
{
    unsigned int f;

    for(f=0;f<120;f++)
    {
        SEG1=1;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=1;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=1;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=1;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=1;
        delay();
    }
}

int no6()
{
    unsigned int g;

    for(g=0;g<100;g++)
    {
        SEG1=1;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=1;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=1;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=1;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=1;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=1;
        delay();
    }
}

int no7()
{
    unsigned int h;

    for(h=0;h<200;h++)
    {
        SEG1=1;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=1;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=1;
        SEG7=0;
        delay();
    }
}

int no8()
{
    unsigned int i;

    for(i=0;i<86;i++)
    {
        SEG1=1;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=1;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=1;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=1;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=1;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=1;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=1;
        delay();
    }
}

int no9()
{
    unsigned int j;

    for(j=0;j<100;j++)
    {
        SEG1=1;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=1;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=1;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=1;
        SEG5=0;
        SEG6=0;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=1;
        SEG7=0;
        delay();
        SEG1=0;
        SEG2=0;
        SEG3=0;
        SEG4=0;
        SEG5=0;
        SEG6=0;
        SEG7=1;
        delay();
    }
}
    
pregunta ezra_vdj

1 respuesta

2

Hay algunas cosas que puedo ver de inmediato que haría, pero creo que esto es más una cuestión de programación general.

Tienes muchas repeticiones de código

Este fragmento:

SEG1=1;
SEG2=0;
SEG3=0;
SEG4=0;
SEG5=0;
SEG6=0;
SEG7=0;

aparece una y otra vez, junto con otros como este. Ponlo en su propia función y llámalo cuando sea necesario. Esto le ayudará de dos maneras: una es que su código sea más fácil de leer y, en segundo lugar, si desea cambiar este fragmento, solo tiene que hacerlo en un solo lugar. También puedes poner esta función en un archivo externo incluido.

Tienes números mágicos en tu código

for(a=0;a<100;a++)

¿Qué sucede si desea mostrar el número durante un período de tiempo mayor o menor? Haga que el número de repetición sea variable y páselo a la función o (debido a que varía según el número de segmentos que está iluminando) pase una unidad de tiempo (por ejemplo, milisegundos) que desea retrasar a la función y calcule el conteo de bucles en la función.

Tu código no está bien comentado

¿Cuánto tiempo dura la función de retardo? ¿Qué pasa cuando vuelves a este código dentro de 2 meses? ¿O un año?

Te quedas atascado en el ralentí con mucho retraso

Esta es una pregunta más importante, pero su código no es muy portátil para usarlo como un reloj (por ejemplo) porque no puede responder a eventos externos. Configuraría un temporizador vinculado a una rutina de servicio de interrupción (ISR) que marcaba los intervalos que definí. Implementaría una máquina de estados con todo el comportamiento que necesitaba y actualizaría esta máquina en cada marca ISR. Por ejemplo, podría tener una máquina de estado que tomó dos entradas: el número de tics (que incrementa cada vez que se ejecuta el ISR) y el número de siete segmentos a la salida. Cada vez que verifica la máquina, dependiendo de estos dos, usted decide qué segmento se ilumina y luego regresa, sin perder tiempo en el bucle de retardo. Esto le permitiría responder a eventos como presionar botones, etc. en su ciclo principal, y actualizar la pantalla solo a través del ISR.

Me doy cuenta de que este último punto es un gran salto y utiliza un par de técnicas de programación con las que quizás no estés familiarizado. Le sugiero que se familiarice con todo lo siguiente (estos son enlaces de Wikipedia que presentan los principios generales; querrá buscar más información y ejemplos que sean más específicos del tipo de procesador que está usando).

Máquina de estados finitos

Rutina de servicio de interrupción

    
respondido por el stefandz

Lea otras preguntas en las etiquetas