Я использую кнопку Tinkerkit в качестве входа в Arduino PORTD pin0 и ожидаю вывода на PORTC, pin0 в качестве вывода.
Код:
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();
}
}
Настройка аппаратного обеспечения: http://ibb.co/ek6R7a
TinkerKit: http://www.mouser.com/catalog/specsheets/TinkerKitPushButton.pdf
Светодиод не загорается при нажатии кнопки. Что я делаю не так?
Проблема в коде, определяющем нажатие кнопки. Вы написали:
if( (PORTD & (1<<PD0)) )
Однако вместо этого вы должны написать это:
if(PIND & (1 << PD0))
Это потому, что PORTD
это выходной регистр. Он будет отражать только значения, которые вы записываете на вывод, а не внешнее напряжение. PIND
является входным регистром, который отражает напряжение, считанное с вывода.
И, как указал Брханс, PORTC |= ~(1 << PC0);
должно быть PORTC &= ~(1 << PC0);
вместо этого.
PINx
является обычным регистром, поэтому он может хранить только 1 или 0. Таким образом, существует определенное напряжение отсечки (я думаю, около 3 В), выше которого PINx
будет храниться 1, в противном случае 0. АЦП — единственный способ получить более высокое разрешение по напряжению.Поскольку я новичок в stackexchange, я должен написать ответ.
Некоторые вещи, которые я бы сделал:
DDRD
и PORTD
.
Макото
брахи
Абель Том
брахи
Абель Том
брахи
Абель Том
Абель Том
G36