Error en el código de mi BOTÓN AVR [cerrado]

0

¿Alguien puede ayudarme a entender qué es incorrecto en mi lógica al escribir un botón que enciende un LED de esta manera? Conozco la forma XOR, solo quiero averiguar por qué no funciona cuando está escrito en este formulario.

Aquí está el código:

#include <avr/io.h>

#define LED 5
#define BUTTON 0

int main(void)
{
    DDRD |= (1<<LED);
    DDRD &= ~(1<<BUTTON);

    unsigned char flag = 0;

    while(1)
    {
        if(PIND & (1<<BUTTON) && flag == 0)
        {
            PORTD |= (1<<LED);
            flag = 1;
        }

        if(PIND & (1<<BUTTON) && flag == 1)
        {
            PORTD &= ~(1<<LED);
            flag = 0;
        }
    }
}

Editar: ahora el código funciona bien después de agregar la demora, pero ¿podría explicar por qué la necesito (demora) cuando alterno el led de esta manera pero no cuando alterna usando el método XOR? Aquí está el código para el método xor:

#define F_CPU 8000000Ul
#include <avr/io.h>
#define led 5
#define pb 0

int main(void)
{
    DDRD|= 1<<led;
    PORTD &= ~(1<<led);
    unsigned char press=0;

    while(1)
    {
        //TODO:: Please write your application code
        if(PIND&(1<<pb))
        {
            if (press == 0 )
            {
                PORTD ^= (1<<led);        //toggling the led
                press =1;
            }
        }

        else
        {
            press = 0;
        }
    }
}
    

2 respuestas

0

El código puede estar alternando el LED de la forma que pretendía. Sin embargo, puede estar cambiando el LED tan rápido que no se puede ver. A su ojo le lleva un poco de tiempo percibir que el LED está apagado. Y si el LED se vuelve a encender demasiado pronto, entonces su ojo percibirá que el LED está encendido, o un poco oscuro, en lugar de encenderse y apagarse.

Intente agregar un poco de retraso (100 ms o más) después de cada vez que se encienda y apague el LED.

    
respondido por el kkrambo
2

Su código está bien con respecto a los registros de dirección de datos, establece las direcciones GPIO correctamente.

Si establece un bit (en 1) en el Registro de dirección de datos, se emitirá el pin correspondiente. Si lo borra (a 0) será una entrada.

Su problema parece estar en su hardware, falta de conocimiento de su hardware. Un botón pulsador puede estar activo bajo o activo alto.

  1. En el primer caso, el botón está bajo activo. Así que cuando lo empujes, el pin leerá 0, ya que estará conectado a GND. Cuando no se empuja, se leerá 1 cuando el pin sea jalado a VCC por una resistencia.

    En este caso, su código no funcionará porque comprueba si el pin es 1, que no lo estará si se presiona el botón.

    if(PIND & (1<<BUTTON) && flag == 0)
    

    Probablemente esta sea la configuración de tu botón, por lo que deberías verificar si es 0.

    if(!(PIND & (1<<BUTTON)) && flag == 0)  // note the '!' operator
    
  2. En el segundo caso, el botón está activo alto. Cuando se presiona, el pin leerá 1, ya que estará vinculado a VCC. Si no se pulsa, se leerá 0 debido a la resistencia desplegable a GND. En este caso, su código debería funcionar.

respondido por el Bence Kaulics

Lea otras preguntas en las etiquetas