Заблудился в двух соснах одного порта атмеги.

Обсуждаем контроллеры компании Atmel.
Ответить
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 157
Зарегистрирован: Пн мар 14, 2016 15:38:50
Откуда: Питер

Сообщение kotarnold »

Работаю с одним портом, причем один его вывод использую, как логический вход, второй - как логический выход. Суть - по нажатию на кнопку, соединенную с портом РВ2 должен загораться светодиод, соединенный с портом РВ3.

Схема:
Изображение

Код:

Код: Выделить всё

int main(void)
{
	DDRB &= ~(0<<PB2)|(1<<PB3); // РВ2 на вход, PB3 на выход 
	PORTB |= (1<<PB2)|(0<<PB3); // Логическое состояние порта В на старте
	
	while(1)
	{
		if (PORTB = (0<<PB2))
			{
				PORTB |= (1 << PB3);
			}
	}
}
В чем может быть ошибка?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

вход это PINB

Добавлено after 2 minutes 15 seconds:
и условие сделано неправильно - надо маску использовать: if (PINB&(1<<3))
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 157
Зарегистрирован: Пн мар 14, 2016 15:38:50
Откуда: Питер

Сообщение kotarnold »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3372692#p3372692"]вход это PINB

Добавлено after 2 minutes 15 seconds:
и условие сделано неправильно - надо маску использовать: if (PINB&(1<<3))[/uquote]

Странно, потому что

Код: Выделить всё

{
		if (PINB&(0<<PB2))
			{
				PORTB |= (1 << PB3);
			}
	}
также не работает.
ЗЫ: а где можно прочитать про смысл "==", "|=", "~" и "&"?
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Спойлер

Код: Выделить всё

   DDRB |= (0<<2)|(1<<3); // РВ2 на вход, PB3 на выход
   PORTB |= (1<<2)|(0<<3); // Логическое состояние порта В на старте
   
   while(1)
   {
      if (!(PINB&(1<<2)))
         {
            PORTB |= (1 << 3);
         }
   }
}
Реклама
Эиком - электронные компоненты и радиодетали
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 157
Зарегистрирован: Пн мар 14, 2016 15:38:50
Откуда: Питер

Сообщение kotarnold »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3372726#p3372726"]
Спойлер

Код: Выделить всё

   DDRB |= (0<<2)|(1<<3); // РВ2 на вход, PB3 на выход
   PORTB |= (1<<2)|(0<<3); // Логическое состояние порта В на старте
   
   while(1)
   {
      if (!(PINB&(1<<2)))
         {
            PORTB |= (1 << 3);
         }
   }
}
[/uquote]

Благодарю!
Реклама
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

kotarnold писал(а): DDRB &= ~(0<<PB2)|(1<<PB3); // РВ2 на вход, PB3 на выход
Эта операция погасит бит 2 DDRB и оставит неизменным (то есть нулём) бит 3 DDRB, т.е. оба бита порта будут работать на ввод. Если рассчитывать, что где-то раньше могли поманипулировать другими битами DDRB и все биты, кроме 2 и 3 надо сохранить неизменными, то надо отдельно погасить бит 2 (DDRB &= 0xFB;) и отдельно взвести бит 3 (DDRB |= 0x08;). Ну, а, учитывая, что остальные биты в этой задаче не задействованы, можно, по-простому, сделать DDRB = 0x08;

Да, не стоит подключать светодиод напрямую к выходу МК - добавь последовательно с ним балластный резистор, 1 кОм будет в самый раз.

Вторая ошибка - при ненажатой кнопке PB2 висит "в воздухе", его потенциал будет определяться утечками по плате, неизвестно что там будет читаться, скорее всего, всегда ноль. Надо включить "подтяжку" к плюсу, т.е. взвести в единицу бит 2 PORTB, и не забыть оставить его в единице при манипуляции с битом 3.

Дальше, вроде-бы, уже без меня подсказали.
kotarnold писал(а):ЗЫ: а где можно прочитать про смысл "==", "|=", "~" и "&"?
Ой, как все запущено!.. Берешь учебник по простому (не приплюснутому) Си и изучаешь до полного просветления.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

по началу можешь использовать побитовое обращение к портам: DDRB.3=0; PORTB.3=1; if (PINB.3==0)
по началу - потому что не все порты так можно адресовать (вроде до порта Е), поэтому всёже правильней использовать более универсальные конструкции.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Ответить

Вернуться в «AVR»