Как узнать состояние цифрового выхода?

Cool Smile
Offline
Зарегистрирован: 09.07.2013

Т.е. pin был установлен в режим выхода 

pinMode(ledPin, OUTPUT);

На него был подан один из уровней хай или лоу.

Могу я как то узнать, какой из уровней был подан последним? Понятно, что я сам их подаю и  можно отследить, что подавалось, но может есть возможность просто считать состояние?

vovken1997
vovken1997 аватар
Offline
Зарегистрирован: 09.07.2013

Cool Smile пишет:

Понятно, что я сам их подаю и  можно отследить, что подавалось, но может есть возможность просто считать состояние?

А смысл? Заведите переменную и когда пишете в выход, пишите и в неё. Я бы так и сделал.

maksim
Offline
Зарегистрирован: 12.02.2012

В вашем случает это digitalRead().

Cool Smile
Offline
Зарегистрирован: 09.07.2013

maksim пишет:

В вашем случает это digitalRead().

Не меняя pinMode?

toc
Offline
Зарегистрирован: 09.02.2013

Cool Smile,

да, можно так

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Cool Smile пишет:

Не меняя pinMode?

pinMode, с точки зрения физики, это наличие/отсутствие резистора на выходе, а не возможность только читать или только писать... :)

__Alexander
Offline
Зарегистрирован: 24.10.2012

какого резистора? pinMode устанавливает направление порта. или я не понял о чем вы.

 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

__Alexander пишет:

какого резистора? pinMode устанавливает направление порта. или я не понял о чем вы.

Ну, мне прямо даже неудобно: http://arduino.ru/Tutorial/DigitalPins

"Сконфигурированные порты ввода находятся в высокоимпедансном состоянии."

Подробнее есть на http://easyelectronics.ru/avr-uchebnyj-kurs-ustrojstvo-i-rabota-portov-v...

__Alexander
Offline
Зарегистрирован: 24.10.2012

ну. так топикстартер вроде как спрашивал как узнать состояние порта вывода, а не ввода, т.к. он туда "выводит". 

 

зы. эт я крапаль намекаю что ответ немножко другой.

rus2014
Offline
Зарегистрирован: 11.09.2014

Хотел бы задать тот же вопрос.

в скетче при включении монитор порта ардуина перезагружается, и состояние светодиода становится LOW,

в монитор порта шлет постоянно LOW,

если нажать цифру 1 светодиод вкл и в порт передает постоянно HIGH

0 светодиод выкл и в порт передает постоянно LOW.

вопрос

1. как узнать первоначальное состояние если бы ардуина не перезагружалась?

2. как написать что бы в порт передавалось один раз HIGH или LOW а не постоянно?

// при включение пишет состояние светодиода в порт, при нажатии 1 загорается светодиод 13 и пишет HIGH, при нажатии 0 пишет LOW

int outputPin = 13;                    //здесь храним номер выхода светодиода № 13
int val;                               //здесь будет храниться принятый символ

void setup()
{
  Serial.begin(9600);                  //установка порта на скорость 9600 бит/сек
  pinMode(outputPin, OUTPUT);          //устанавливаем 13 контакт в режим вывода
}

void loop()
{
 if(digitalRead(outputPin)==HIGH)      //     если светодиод горит 
  {
    Serial.println("HIGH");             //     ПИШЕМ в порт HIGH 
  } 
  else//если не горит... 
  { 
    Serial.println("LOW");              //     ПИШЕМ в порт LOW  
  } 

 if (Serial.available()) {             //     если есть принятый символ,
    val = Serial.read();                //    то читаем его и сохраняем в val
    if (val == '1') {                   //    если принят симовол '1',...
      digitalWrite(outputPin, HIGH);    //    то включаем светодиод   
      //Serial.println("HIGH 1");      //     ПИШЕМ В ПОРТ HIGH 1
    }
    
  if (val == '0') {                     //    если принят симовол '0',
      digitalWrite(outputPin, LOW);     //    то выключаем светодиод
      // Serial.println("LOW 0");      //     ПИШЕМ В ПОРТ HIGH 1
    }
  }
}




 

rus2014
Offline
Зарегистрирован: 11.09.2014

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

Buldakov
Offline
Зарегистрирован: 17.01.2016

Немного не по теме. Но раз здесь описаны цифровые выходы попробую задать вопрос сдесь.

По умолчанию arduino выводы находятся в Z состоянии (высокоимпедансное). Потом я могу настроить вывод на ввод или на вывод.

У меня вопрос: Как можно в теле Loop менять состояние выхода. Сначала он настроен на вывод, затем в Z состояние, затем опять на вывод. Нигде не нашел как перевести вывод из состояния как выход в Z состояние?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

http://arduino.ru/Reference/PinMode
Правда тут нет про резистор привязки.
А как аы думаете работает термометр по однопроводной шине?
https://www.arduino.cc/reference/en/language/functions/digital-io/pinmode/

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

"вход" и "Z-состояние" - это одно и то же.

Перевести из любого состяния в любое, естественно, pinMode();

Чтобы перевести в состояние выхода: pinMode(pin, OUTPUT);

Чтобы перевести в состояние входа: pinMode(pin, INPUT);

 
Buldakov
Offline
Зарегистрирован: 17.01.2016

Этот вариант про z состояние и про вход непрокатит. При конфигурировании "как вход" входной ток может быть слишком большим. Допускается до 1 мка. У меня выходной ток около 10 мка. Это дает большую погрешность.  Надо получить что то типа как входной ток аналогового входа 0.05 мка.

nik182
Offline
Зарегистрирован: 04.05.2015

Такой ток может беспечить специальный операционник, если включиь его как буфер к входу процессора. Не встречал я z состояния и что бы вход был. Выходы в z состоянии - это видел.  

VasiliyV
Offline
Зарегистрирован: 09.07.2018

1. Режим работы пина Вход-Выход можно менять в любом месте программы. Хоть в setup, хоть в loop. Причём любое количество раз. Если того требует алгоритм работы программы. 

2. Режим INPUT не всегда означает Z-состояние то есть высокое сопротивление. Можно притянуть pullup резистор. При этом входное сопротивление не будет равно бесконечности, точнее очень высоким.

3. Пин может находиться в следующих состояниях:

а. Вход, Z-состояние, входное сопротивление очень высокое.

б. Вход, притянутый к Vcc, сопротивление и смещение определяется резистором pullup. При отсутствии входного напряжения будет присутствовать уровень HIGH.

в. Выход. Выходное напряжение определяется состоянием выходных транзисторов. Закрыты, открыты.

PS: если установить режим работы пина 13 (к нему подключен светодиод) как вход, записать в него значение HIGH, то можно увидеть слабое свечение встроенного светодиода. Тока через pullup резистор вполне достаточно чтобы диод открылся.

Топикстартеру: Независимо от значения регистра DDRx (настройка режима порта вход - выход) выходное значение можно считать из регистра PINx. Или же digitalRead().

p-a-h-a
Offline
Зарегистрирован: 17.01.2019
void setup() {
  Serial.begin(9600);
DDRD|=(1<<4);// то же что и pinMode(4, OUTPUT);

}

void loop() {

  Serial.print("D4=PORTD.4=");Serial.println(!(~PORTD&(1 << PD4)));//Читаем состяние PORTD.4 (Смотри соответствие портов Atmega пинам ардуино)  
  PORTD ^= (1 << 4);//Инвертируем состояние пина

  delay(1000); // одна секунда
}

http://arduino.ru/forum/programmirovanie/bitovye-operatsii-proverit-bit#comment-433615