LED en el botón presione ATMEGA328p

1

Estoy usando un botón Tinkerkit como entrada para Arduino PORTD pin0 y espero una salida en PORTC, pin0 como salida.

Código:

void wait_for_button()
{

  if( (PORTD & (1<<PD0)) )
      PORTC|=(1<<PC0);
  else
      PORTC|=~(1<<PC0);

}
int main (void)
{

  DDRD=0x00;   //PORTD pin 0 as input
  PORTD=0x00;
  DDRC=0xFF;   //PORTC as output
  PORTC=0x00;

   while(1)
   {
     _delay_ms(200);
     wait_for_button();
   }

}

Configuración de HW: enlace

TinkerKit: enlace

El LED no se enciende al presionar el botón. ¿Qué estoy haciendo mal?

    
pregunta Abel Tom

2 respuestas

3

El problema está en el código que detecta la pulsación de un botón. Usted escribió:

if( (PORTD & (1<<PD0)) )

Sin embargo, debes escribir esto en su lugar:

if(PIND & (1 << PD0))

Esto se debe a que PORTD es el registro de salida. Solo reflejará los valores que escriba en el pin, no un voltaje externo. PIND es el registro de entrada, que refleja el voltaje leído en el pin.

Y como señalaron los brhans, PORTC |= ~(1 << PC0); debería ser PORTC &= ~(1 << PC0); en su lugar.

    
respondido por el HaLailah HaZeh
1

Como soy nuevo en stackexchange, tengo que escribir una respuesta.

Algunas cosas que haría:

  1. Compruebe que no haya activaciones internas en los pines de entrada.
  2. Mida la tensión de salida del botón cuando se presiona.
  3. Use un depurador para verificar los estados de registro cuando se presiona o suelta el botón.
  4. Asegúrese de que UART no esté habilitado en el pin RX "arduino".
respondido por el Nejc Deželak

Lea otras preguntas en las etiquetas