LED encendido pulsador ATMEGA328p

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: http://ibb.co/ek6R7a

TinkerKit: http://www.mouser.com/catalog/specsheets/TinkerKitPushButton.pdf

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

¿Ha confirmado la configuración de su hardware ejecutando el código de ejemplo proporcionado en su enlace de TinkerKit?
Lo primero que está haciendo mal es no incluir todos los detalles relevantes en el cuerpo de su pregunta.
@brhans ¿Qué es exactamente lo que no se detalla? Es bastante sencillo, ¿verdad?
Todo lo que veo es un montón de enlaces en los que no estoy haciendo clic.
@Makoto ¡Ese programa Arduino de ejemplo parece funcionar bien!
Su línea "PORTC|=~(1<<PC0);" probablemente debería ser "PORTC&=~(1<<PC0);" en cambio.
No, sigue sin funcionar
Intenté hacer la configuración de HW igual que en el ejemplo de Tinkerkit, es decir. PB3 como salida y PC0 como entrada, todavía no funciona, parece ser un problema de SW
¿Su botón está conectado entre pind.0 y GND?

Respuestas (2)

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

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

Sin embargo, deberías escribir esto en su lugar:

if(PIND & (1 << PD0))

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

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

Gracias, no sabia eso! ¡Eso lo hizo!
Me alegro de haber podido ayudar. Espero que tengas retoques exitosos!
¡Si seguro! Entonces, si entendí correctamente, PINx se usa principalmente para consultar el estado del PIN relevante (1 o 0), mientras que usar periféricos como ADC es irrelevante, ¿verdad?
Sí. PINxes un registro regular, por lo que solo puede contener 1 o 0. Por lo tanto, hay un voltaje de corte particular (creo que alrededor de 3V), por encima del cual PINxtendrá un 1, de lo contrario un 0. El ADC es la única forma de obtener un mayor resolución de voltaje.

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

Algunas cosas que haría:

  1. Verifique que no se activen pull-ups internos en los pines de entrada.
  2. Mida el voltaje de salida del botón cuando se presiona.
  3. Use un depurador para verificar los estados del registro cuando se presiona o suelta el botón.
  4. Asegúrese de que UART no esté habilitado en el pin RX "arduino".
Se aseguró de que los pull-ups internos no estén habilitados escribiendo un 0 en ambos DDRDy PORTD.
Mi respuesta fue más de naturaleza general. No estaba pensando particularmente en cómo funciona el AVR ISA. Pero gracias, intentaré que mis respuestas sean más concretas para la arquitectura que se está utilizando.