Sensor no funciona

0

Tengo el siguiente código que se supone que enciende un led (Puerto D, pin 5) cada vez que se activa un sensor de distancia digital. Verificó dos veces el pinout y el sensor está funcionando.

¿Hay algún problema en el fragmento?

#include <avr/io.h>
#define F_CPU 1000000
#include <util/delay.h>

void init()
{
    DDRD |=  _BV(PIN5) | _BV(PIN6); //enable the pins
//    PORTD |= _BV(PD3); //playing here
}

int main(void)
{
    init();

    while(1){
        if ((PIND & _BV(PD3)) == 0) {
            _delay_ms(100);

            if ((PIND & _BV(PD3)) == 0) {
                PORTD |= _BV(PIN5);
            } else {
                PORTD &= ~_BV(PIN5);
            }
        }
    }
}
    
pregunta sitilge

1 respuesta

1

EDIT4:

así que esperaría que el código ingrese una señal active low para que la salida de un LED alto se vea similar a:

//#include <avr/io.h>
#define F_CPU 1000000
#include <util/delay.h>

void init()
{
    DDRD |=  (1<<5); // output on port D, pin 5
    DDRD &=  ~(1<<6); // input on port D, pin 6
}

int main(void)
{
    init();

    while(1)
    {
        //if ((PIND & _BV(PD3)) == 0)
        if( !(PIND & (1<<6)) ) 
        { // then sensor input is 'active' low
            _delay_ms(100);

            // perform some debounce
            // if ((PIND & _BV(PD3)) == 0)
            if ( !(PIND & (1<<6)) )
            { // then input definitely low
                // set output pin for LED high 
                PORTD |= (1<<5); // (LED ON)
            }

            else
            {
               PORTD &= ~(1<<5); // (LED OFF)
            }
        }

        else
        {
             PORTD &= ~(1<<5); // (LED OFF)  
        }
    }
}

sin embargo, esto solo deja el LED ENCENDIDO mientras la señal de entrada sea baja.

No se publica una descripción del sensor. Sin ese detalle, intentaría tener un retraso antes de verificar si la entrada aún es baja.

I.E.

           if ( !(PIND & (1<<6) ) )
            { // then input definitely low
                // set output pin for LED high
                PORTD |= (1<<5);
                delay_sec(1);
            }

Pondría el retraso de 1 segundo en, o varias razones, incluyendo un LED que está siendo pulsado por períodos cortos de tiempo no será fácilmente visible a simple vista.

Sugiera conectar el alcance de un doble rastreo a los dos pines de interés y ver si el código realmente funciona.

    
respondido por el user3629249

Lea otras preguntas en las etiquetas