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?
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 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ñaló brhans, PORTC |= ~(1 << PC0);
debería ser PORTC &= ~(1 << PC0);
en su lugar.
PINx
es 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 PINx
tendrá 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:
DDRD
y PORTD
.
makoto
brahans
abel tom
brahans
abel tom
brahans
abel tom
abel tom
G36