Светодиод при нажатии кнопки ATMEGA328p

Я использую кнопку 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

Светодиод не загорается при нажатии кнопки. Что я делаю не так?

Вы подтвердили настройку своего оборудования, запустив пример кода, указанный в вашей ссылке TinkerKit?
Первое, что вы делаете неправильно, - это не включать все соответствующие детали в тело вашего вопроса.
@brhans Что именно не подробно? Это довольно прямолинейно, верно?
Все, что я вижу, это куча ссылок, на которые я не нажимаю.
@Makoto Этот пример программы Arduino, кажется, работает нормально!
Ваша строка "PORTC|=~(1<<PC0);" вероятно, должно быть "PORTC&=~(1<<PC0);" вместо.
Нет, все равно не работает
Я попытался выполнить настройку HW так же, как в примере с Tinkerkit, т.е. PB3 как выход и PC0 как вход, по-прежнему не работает, похоже, проблема с ПО
Ваша кнопка подключена между pind.0 и GND?

Ответы (2)

Проблема в коде, определяющем нажатие кнопки. Вы написали:

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

Однако вместо этого вы должны написать это:

if(PIND & (1 << PD0))

Это потому, что PORTDэто выходной регистр. Он будет отражать только значения, которые вы записываете на вывод, а не внешнее напряжение. PINDявляется входным регистром, который отражает напряжение, считанное с вывода.

И, как указал Брханс, PORTC |= ~(1 << PC0);должно быть PORTC &= ~(1 << PC0);вместо этого.

Спасибо, я этого не знал! Это сделало это!
Я рад, что смог помочь. Я надеюсь, что вы успешно возиться!
Да конечно! Итак, если я правильно понял, PINx в основном используется для запроса состояния соответствующего PIN-кода (1 или 0), а использование периферийных устройств, таких как ADC, не имеет значения, верно?
Да. PINxявляется обычным регистром, поэтому он может хранить только 1 или 0. Таким образом, существует определенное напряжение отсечки (я думаю, около 3 В), выше которого PINxбудет храниться 1, в противном случае 0. АЦП — единственный способ получить более высокое разрешение по напряжению.

Поскольку я новичок в stackexchange, я должен написать ответ.

Некоторые вещи, которые я бы сделал:

  1. Убедитесь, что никакие внутренние подтяжки на входных контактах не активированы.
  2. Измерьте выходное напряжение кнопки при ее нажатии.
  3. Используйте отладчик для проверки состояния регистров при нажатии или отпускании кнопки.
  4. Убедитесь, что UART не включен на контакте «arduino» RX.
Он гарантировал, что внутренние подтяжки не будут включены, записав 0 в оба DDRDи PORTD.
Мой ответ носил более общий характер. Я особо не думал о том, как работает AVR ISA. Но спасибо, я постараюсь сделать свои ответы более конкретными для используемой архитектуры.