Чтение состояний выходов

std
Offline
Зарегистрирован: 05.01.2012

Здравия тебе, all.

Суть вопроса: я настраиваю некоторый вывод на выход (pinMode(x,OUTPUT); или DDRx=0x(...)1(...);) и затем пишу туда значение, 0 или 1. В следующем цикле я не помню это значение, можно ли его прочитать? То есть, можно ли делать такие вещи:

boolean bOn=0;

void setup(){
  DDRB=0x00000001;
}
void loop(){
  if(something){
    PORTB=0x00000001;
  }else{
    PORTB=0x00000000;
  }
  bOn=PORTB==0x00000001; // true if on  
}

Или обязательно заводить переменную и из неё писать в порт, а при надобности узнать что там в порту - читать эту переменную?

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Можно, только имей в виду, если ты выдал 1, а нога просажена в 0, то прочитаешь 0.

Схема порта до кучи:

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

std    bOn=PORTB==0x00000001; // true if on  

что это за глубокомысленное выражение ? :)

std
Offline
Зарегистрирован: 05.01.2012

Не, тут имеется в виду случай, когда к порту присоединено нечто с высоким (относительно) входным сопротивлением, типа транзисторов или входов TTL. Я всегда сперва собираю устройство, а только потом пишу скетч чтобы точно знать что кнопки и т. п. у меня на портах, объявленных как вход. Чтобы что-нибудь не пожечь.

Хотя, мб надо выработать привычку, на все выводы ставить резисторы.

dimax пишет:
что это за глубокомысленное выражение ? :)

Ну скобок нету :) С++ же, родимый. Страуструповский.

Datak
Offline
Зарегистрирован: 09.10.2014

Andy пишет:
Можно, только имей в виду, если ты выдал 1, а нога просажена в 0, то прочитаешь 0.

Немного не так. Если читать PORTB, как в примере у ТС - прочитается именно то, что туда записывали.

А реальное состояние вывода читается из PINB, и да, в каких-то случаях оно может отличаться от PORTB.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

std пишет:

я настраиваю некоторый вывод на выход (pinMode(x,OUTPUT); или DDRx=0x(...)1(...);) и затем пишу туда значение, 0 или 1. В следующем цикле я не помню это значение, можно ли его прочитать? 

Вообще-то конструкция типа

digitalWrite(PIN, ! digitalRead(PIN));

используется практически во всех классических "блинках".

std
Offline
Зарегистрирован: 05.01.2012

Datak, да понятно что там по маске. ЕвгенийП, спасибо за ответ, теперь ясно.