Обсуждаем контроллеры компании Atmel.
Ответить

Attiny13 пин на вход

Вт июн 28, 2022 17:28:48

Здравствуйте! Подскажите
прогу пишу на 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ов

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

Вт июн 28, 2022 17:37:23

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

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); ...

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

Вт июн 28, 2022 18:27:14

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

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

Вт июн 28, 2022 18:33:52

да, все эти сравнения с 0 и 1 в данном случае не нужны. Это намекает, что может быть и 2 и 3 и символ... сведение к булевым делает всё более однозначно читаемым.

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

Вт июн 28, 2022 19:11:05

Значит условие if (PINB == 0b00000001); не будет выполнено?

Даже если на других пинах будут не нули, то условие и тоже не будет выполнено.
Издревле на языке Си принято проверять состояние отдельного бита (или группы бит) в байте через логическую операцию AND и получение её результата в виде false (=0) или true (не =0):
if (port & PIN_MASK) { ... },
где port - содержимое регистра чтения порта,
PIN_MASK - маска для проверяемых пинов, в которой единицы в позициях бита разрешают эти биты к проверке. Можно проверять как один бит, так и любую комбинацию битов.
Результатом лог.операции будет либо 0 (false), когда в проверяемой позиции содержится 0. Либо отличное от 0 значение (true), когда в проверяемой позиции есть 1. Таким образом, условие if() не будет выполняться, если на проверяемом пине 0, и будет выполняться, когда на проверяемом пине 1.

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

Вт июн 28, 2022 19:42:18

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 такт
...
...
...

смотрю и думаю... как мы дошли до жизни такой))
:)))

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

Вт июн 28, 2022 19:58:18

roman.com писал(а):каждый день смотрю Асемблер))
А, ну если "Асемблер", тогда ладно, сойдет.

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

Вт июн 28, 2022 20:08:12

вот ты нудный какой...
:)))

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

Вт июн 28, 2022 20:37:03

Ну тогда сравни

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

Вт июн 28, 2022 20:52:55

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

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

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

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

но это только у нормальных людей ))
:)))

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

Вт июн 28, 2022 21:00:22

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