LED parpadeantes en orden inverso

0

El siguiente código destella algunos LEDs en orden: pin 1, pin 2, pin 3, pin 4.

Una vez completada esta secuencia, me gustaría invertir la dirección y mostrar el pin 4, pin 3, pin 2, pin 1.

Escribí el siguiente código, pero no funciona en orden inverso.

¿Qué podría estar mal?

#include <htc.h>

__CONFIG(1,OSCSDIS & HSPLL);
__CONFIG(2,BORDIS & PWRTDIS &WDTDIS);
__CONFIG(3,CCP2RC1);
__CONFIG(4,LVPDIS & STVREN);
__CONFIG(5,UNPROTECT);
__CONFIG(6,WRTEN);
__CONFIG(7,TRU);

#define _XTAL_FREQ   40000000


void delay_sec(unsigned char seconds)    // This function provides delay in terms of seconds
{
    unsigned char i,j;

    for(i=0;i<seconds;i++)
        for(j=0;j<100;j++)
            __delay_ms(10);
}
void led_display(char a)
{
    switch(a)
    {
        case 0: PORTB=0x01;PORTD=0x08;  break;
        case 1: PORTB=0x02;PORTD=0x04;  break;
        case 2: PORTB=0x04;PORTD=0x02;  break;
        case 3: PORTB=0x08;PORTD=0x01;  break;
    }
}

void main()
{
    TRISB=0x00;
    TRISD=0x00;
    char a,b;

    while(1)
    {
        led_display(a);

        a++;
        delay_sec(1);
        if(a==4)
        {
            a--;
        }
    }
}
    
pregunta user3768479

3 respuestas

3

Incrementas a cada vez y luego lo disminuyes si a == 4 . Entonces, a es igual a tres en el comienzo de tu ciclo, luego lo incrementas a cuatro y lo disminuyes, porque es igual a cuatro. Ahora son tres nuevamente cuando vuelves al inicio del bucle.

Prueba algo como:

bool directionForward == true;

while(1) {
    led_display(a);
    delay_sec(1);
    if(directionForward) {
        a++;
        if(a==4) directionForward = false;
    } else {
        a--;
        if(a==0) directionForward = true;
    }
}

Y otro punto: intente evitar el uso de esta función de retardo. Utilice una interrupción de temporizador en su lugar.

    
respondido por el GER_Moki
2

Como su código se encuentra actualmente, incrementará a hasta que alcance 4, luego lo disminuirá a 3 y luego lo incrementará de nuevo a 4.

Es decir, se llamará a led_display con los siguientes argumentos

0
1
2
3
3
3
....

Si te comprendo correctamente, desearías que se incrementara sucesivamente desde 0 hasta que alcance 3, y luego disminuya hasta llegar a 0

La forma en que lo implementaría es mediante el uso de una "variable de dirección", una forma de hacerlo sería la siguiente

TRISB=0x00;
TRISD=0x00;
char a=0, b, dir=1;


while(1)
{
    led_display(a);

    a+=dir;
    delay_sec(1);

    if(a==3)
    {
        dir=-1;
    }

    else

    if(a==0)
    {
        dir=1;
    }

}

NOTA: este código es en realidad el mismo que el de GER_Moki, solo la secuencia y las operaciones son detalladas y cercanas a su código original para mayor claridad

    
respondido por el Al Longley
0

Además de lo que se presenta en estas otras respuestas, no veo dónde se inicializa la variable a . Dado que es un local (en la pila) no se garantiza que sea 0 como si fuera una variable global.

El código actualmente se lee:

char a,b;

while(1)
{
    led_display(a);

Debería ser algo como:

char a,b;

a = 0;

while(1)
{
    led_display(a);

no importa qué otros cambios se hagan.

    
respondido por el tcrosley

Lea otras preguntas en las etiquetas