Interruptor de inicio y led con cualquier controlador [duplicado]

1

Estoy tratando de conectar la interfaz y el led. Quiero escribir un programa en el que si presiono y suelte el interruptor, el led debería brillar y si presiona nuevamente, el led del interruptor debería apagarse. No puedo escribir la lógica para ello porque soy un novato en el sistema integrado. ¿Puede alguien simplemente ayudarme a escribir la lógica para ello? Gracias.

Este es mi código de encendido y apagado del led usando el interruptor CÓDIGO

int main(void)
 {
    DDRC |= (1<<PC0); //Makes first pin of PORTC as Output
    DDRD &= ~(1<<PD0);//Makes firs pin of PORTD as Input

    while(1) //infinite loop
    {
        if(PIND & (1<<PD0) == 1) //If switch is pressed
        {
            PORTC |= (1<<PC0); //Turns ON LED
            _delay_ms(3000); //3 second delay
            PORTC &= ~(1<<PC0); //Turns OFF LED
        }
    }
}
    
pregunta anna carolina

5 respuestas

1

No soy un programador, pero después de leer su pregunta sobre la solución, se me ocurrió lo que explicaré a continuación.

Para la siguiente lógica, su LED y el interruptor deben controlarse con un pin de E / S diferente del controlador. El primer controlador debe detectar la lógica presionada del interruptor y, en función de la lógica del interruptor, primero debe detectar la lógica de los pines de E / S del LED para la condición previa de lógica baja o alta. Si la lógica del pin LED es ALTA, luce BAJA y viceversa. Tenga en cuenta que el E / S del pin del LED debe invertirse solo después de presionar el interruptor.

A continuación se puede seguir la lógica

Switched pressed (Y/N)
{

If Y
    {
      changed the logic of LED port pin // If HIGH, change it to LOW if LOW, change it to HIGH

        else N
              { Do nothing}
        }
}
    
respondido por el Sanjeev Kumar
1

El único cambio que debe hacerse puede ser desde esto a

if(PIND & (1<<PD0) == 1) //If switch is pressed
        {
            PORTC |= (1<<PC0); //Turns ON LED
            _delay_ms(3000); //3 second delay
            PORTC &= ~(1<<PC0); //Turns OFF LED
        }

esto:

if(PIND & (1<<PD0) == 1) //If switch is pressed
        {
            //Toggle PC0
            // a few 10s of mili-second delay
        }

Puede considerar el uso de Interruptor como interrupción, el PD0 se puede configurar como interrupción, de modo que pueda hacer un trabajo útil hasta que el usuario presione el interruptor. El código de activación de LED puede ser parte de ISR (rutina de servicio de interrupción). También, busca el cambio de rebote ...

    
respondido por el Umar
1

Sugerencia # 1) Realice una búsqueda en Internet usando c program operator precedence y luego estudie la expresión lógica de su sentencia if (). Específicamente, considere el orden de evaluación de las subexpresiones en una expresión cuya forma es

a & b == c

Sugerencia n. ° 2) La expresión lógica if () se debe reescribir para probar un resultado cero (= falso) o no cero (= verdadero), en lugar de probar un valor de resultado de exactamente '1' (uno ). ¿Por qué es una prueba cero / no cero una práctica preferible cuando se prueban valores de bits como este?

    
respondido por el Jim Fischer
0

el problema con el código publicado es con esta línea:

if(PIND & (1<<PD0) == 1)

Dado: Si se estuviera probando el bit 0 PIND, entonces el resultado sería 0 o 1

Sin embargo, si 'PD0' no está definido como 0, entonces

entonces el valor resultante de 'PIND & (1 <

Sugerir:

if( (PIND & (1<<PD0)) == 1<<PD0 )

Tenga en cuenta que utilice parens para no tener que preocuparse por el orden de evaluación y la prioridad del operador.

Al usar la declaración de código sugerida, ambos lados de '==' están comparando con el mismo valor.

Además, la pregunta no mencionó qué chip se está programando.

Algunos chips requieren más de una instrucción para cambiar el estado de un pin GPIO.

Sugiere agregar una declaración que ofrezca el chip de destino.

    
respondido por el user3629249
0

El problema con su código es que está apagando el LED después de un retraso. Que no es el requisito. En su lugar, debe encender el LED cada vez que se presiona el botón. Compruebe el siguiente código:

int main(void)
 {
    int flag=0;
    DDRC |= (1<<PC0); //Makes first pin of PORTC as Output
    DDRD &= ~(1<<PD0);//Makes firs pin of PORTD as Input

    while(1) //infinite loop
    {
        if(PIND & (1<<PD0) == 1) //If switch is pressed
        {
            flag=~flag;
        }
        PORTC = (1<<PC0) | flag  ; //Toggle the LED
    }
}
    
respondido por el Arun Kumar

Lea otras preguntas en las etiquetas