Attiny13 пин на вход

Обсуждаем контроллеры компании Atmel.
Ответить
Konter
Родился
Сообщения: 7
Зарегистрирован: Чт июн 02, 2022 11:31:26

Attiny13 пин на вход

Сообщение Konter »

Здравствуйте! Подскажите
прогу пишу на atmel studio 7 Для attiny13
Выставляю направления для порта B:
DDRB = 0b00011100;
B0 вход
B1 вход
B2 выход
B3 выход
B4 выход

B5 пин reset (ставлю 0)
B6,B7,B8 Этих пинов нету (ВЫСТАВЛЯЮ 0 ЕСЛИ НЕ ТАК !ПОДСКАЖИТЕ!!)
Выставляю подтяг. резисторы:
PORTB |= 1<<0;
PORTB |= 1<<1;
ТЕПЕРЬ ВОПРОС!!!
как запрашивать состояние пина B0 и B1 (если на них подключины кнопки)???
if (PINB == 0b00000001); ??? if (PINB == 0b00000010); ???
А если нажать 2 кнопки одновремено значение PINB будет 0b00000011??
Значит условие if (PINB == 0b00000001); не будет выполнено?
Если можете подскажите как правильно запрашивать состояние PINов
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Attiny13 пин на вход

Сообщение roman.com »

можно по всякому))

CodeVisionAVR:
if (PINB.0 == 1); ...
if (PINB.1 == 1); ...
...
if (PINB.0); ...
if (PINB.1); ...
...
if ( ! PINB.0); ...
if ( ! PINB.1); ...
...
if (PINB & 0b00000001); ...
if (PINB & 0b00000010); ...
...
и т.д.

мне так удобней
if (PINB.0 == 1); ...
if (PINB.1 == 1); ...
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: Attiny13 пин на вход

Сообщение Dimon456 »

roman.com писал(а):мне так удобней
if (PINB.0 == 1); ...
if (PINB.1 == 1); ...
:facepalm: Ты ассемблер хоть смотрел?

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

if (PINB.0); ...
if (PINB.1); ...
Спойлер

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

#define ClearBit(reg, bit)       reg &= (~(1<<(bit)))
//пример: ClearBit(PORTB, 1); //сбросить 1-й бит PORTB

#define SetBit(reg, bit)          reg |= (1<<(bit))	
//пример: SetBit(PORTB, 3); //установить 3-й бит PORTB

#define BitIsClear(reg, bit)    ((reg & (1<<(bit))) == 0)
//пример: if (BitIsClear(PINB,1)) {...} //если бит очищен

#define BitIsSet(reg, bit)       ((reg & (1<<(bit))) != 0)
//пример: if(BitIsSet(PINB,2)) {...} //если бит установлен

#define InvBit(reg, bit)	  reg ^= (1<<(bit))
//пример: InvBit(PORTB, 1); //инвертировать 1-й бит PORTB
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: Attiny13 пин на вход

Сообщение Martian »

да, все эти сравнения с 0 и 1 в данном случае не нужны. Это намекает, что может быть и 2 и 3 и символ... сведение к булевым делает всё более однозначно читаемым.
Up2805
Встал на лапы
Сообщения: 148
Зарегистрирован: Сб июн 04, 2022 05:21:07

Re: Attiny13 пин на вход

Сообщение Up2805 »

Значит условие if (PINB == 0b00000001); не будет выполнено?
Даже если на других пинах будут не нули, то условие и тоже не будет выполнено.
Издревле на языке Си принято проверять состояние отдельного бита (или группы бит) в байте через логическую операцию AND и получение её результата в виде false (=0) или true (не =0):
if (port & PIN_MASK) { ... },
где port - содержимое регистра чтения порта,
PIN_MASK - маска для проверяемых пинов, в которой единицы в позициях бита разрешают эти биты к проверке. Можно проверять как один бит, так и любую комбинацию битов.
Результатом лог.операции будет либо 0 (false), когда в проверяемой позиции содержится 0. Либо отличное от 0 значение (true), когда в проверяемой позиции есть 1. Таким образом, условие if() не будет выполняться, если на проверяемом пине 0, и будет выполняться, когда на проверяемом пине 1.
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Attiny13 пин на вход

Сообщение roman.com »

Dimon456 писал(а):Ты ассемблер хоть смотрел?
каждый день смотрю Асемблер))

/INC R22 // Increment++ -1 такт
//DEC R22 // Decrement-- -1 такт
//LDI R22, 0b11111111 // Запись регистра -1 такт
//ORI R22, 0b11111111 // Register | Constant -1 такт
//EOR R22, R21 // Очистить регистр (Registers ^ Registers) -1 такт
//SBR R22, 0b11111111 // Set Bit Register -1 такт
//CBR R22, 0b00000010 // Clear Bit Register -1 такт
//LSL R22 // Сдвиг << 1 -1 такт
//LSR R22 // Сдвиг >> 1 -1 такт
...
...
...

смотрю и думаю... как мы дошли до жизни такой))
:)))
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: Attiny13 пин на вход

Сообщение Dimon456 »

roman.com писал(а):каждый день смотрю Асемблер))
А, ну если "Асемблер", тогда ладно, сойдет.
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Attiny13 пин на вход

Сообщение roman.com »

вот ты нудный какой...
:)))
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: Attiny13 пин на вход

Сообщение Dimon456 »

Ну тогда сравни
Спойлер

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

   while (1)
	{
        if(PINB.1 == 1) PORTD++;
	};

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

   while (1)
	{
        if(PINB.1) PORTD++;
	};
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Attiny13 пин на вход

Сообщение roman.com »

да вот я сижу и сравниваю...
:))
и какой дурак подаёт на кнопки "+" ? ))

у нормальных людей в исходном состоянии на кнопке всегда "+" т.е. логическая "1"

а когда кнопка нажата то получаем логический "0"

if (PINB.0 == 0); ... // кнопка нажата
if (PINB.1 == 0); ... // кнопка нажата
...
и т.д.

но это только у нормальных людей ))
:)))
Up2805
Встал на лапы
Сообщения: 148
Зарегистрирован: Сб июн 04, 2022 05:21:07

Re: Attiny13 пин на вход

Сообщение Up2805 »

Вовсе не обязательно! Организация кнопок может быть различной, срабатывание кнопки может быть как по лог.0 так и по лог.1, и даже через R-2R матрицу и АЦП.
Тем более, что проверка бита на 0 отличается от проверки на 1 всего лишь инверсией маски. Штудируйте язык Си!
Ответить

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