Эксперимент 3. вопрос по вопросам)

Тема в разделе "Arduino & Shields", создана пользователем shx, 14 янв 2015.

  1. shx

    shx Нуб

    после эксперимента есть вопросы.один меня смутил:
    3. Что будет, если стереть из программы строчку pinMode(LED_PIN, OUTPUT)? строчкуpinMode(POT_PIN, INPUT)?

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

    void setup()
    {
    // пин со светодиодом — выход, как и раньше...
    //pinMode(LED_PIN, OUTPUT);
    // ...а вот пин с потенциометром должен быть входом
    // (англ. «input»): мы хотим считывать напряжение,
    // выдаваемое им
    pinMode(POT_PIN, INPUT);
    }
     
  2. shx

    shx Нуб

    я не понимаю, никто не делал эксперименты из Вики?
     
  3. Alex19

    Alex19 Гуру

    Аналоговые порты работают только на вход и в отличие от цифровых портов их не требуется конфигурировать с помощью вызова функции pinMode.

    По цифровым, не задавался вопросом, всегда пишу pinMode, так проще потом понять программу.
     
  4. Alex19

    Alex19 Гуру

    С цифровыми, поинтереснее.

    По умолчанию, все цифровые порты определены на вход.

    Поэтому если закомментировать строку
    //pinMode(LED_PIN, OUTPUT);
    Мы получаем порт настроенный на вход.

    Вероятнее всего в функции analogWrite, есть защита от новичка и она проверяет как настроена ножка.

    Для цифровых портов всегда пишите pinMode, если хотите избежать проблем. В противном случае забыв указать, Вы получаете порт на вход и команда digitalWrite(pin, HIGH); создаст проблемы, поэтому ни когда так не делайте.

    Навряд ли составители экспериментов предполагали, что Вы будете лазить по сети/читать мануалы и т.д., наверно ответ на 3 вопрос должен звучать, как программа должна перестать работать, так как...
     
    Последнее редактирование: 17 янв 2015
  5. Unixon

    Unixon Оракул Модератор

    Это не так. У микроконтроллеров ATmega48/88/168/328 есть 8 каналов АЦП, из них 6 подключены к параллельно к обычным цифровым пинам и еще 2 выведены отдельно. Вот те отдельные два на выход не работают в принципе, но на ардуине они и не выходят на разъемы. А остальные 6 просто совмещены с остальными функциями на этих ногах и эти выводы могут работать и на выход тоже. Но таки да, после сброса и цифровые и цифро-аналоговые включаются в режим входа.
     
    Alex19 нравится это.
  6. Alex19

    Alex19 Гуру

    Не очень понял.

    Вы наверно говорите, о использовании ножек A0-An как цифровых?
    На сколько мне известно, у UNO (ATmega328) нет аналоговых выходов.

    От этого и отталкивался.

    Получается, что для аналоговых входов, должен явно указывать pinMode?
    Или речь идет о том, что при использовании ножек A0-An как цифровых, обязан указать направление, это понятно.

    UPD. Ни когда не указывал для аналоговых входов pinMode, вот и решил уточнить, чем мне это грозит, заинтриговали:).

    UDP1. Дошло, не правильно выразил свою мысль
    Аналоговые порты A0-An, могут работать как в режиме аналоговых, так и в режиме цифровых.

    Если они работают в режиме цифровых, то необходимо указать режим работы, с помощью команды pinMode.

    Если они работаю в режиме аналоговых портов (для них только вход), то указать режим работы, с помощью команды pinMode, нет необходимости. Пример с офф. сайта http://arduino.cc/en/Reference/AnalogRead
     
    Последнее редактирование: 17 янв 2015
  7. Unixon

    Unixon Оракул Модератор

    Да нет у них никаких отдельных режимов. Там внутри запараллелено всё.
    Можно даже так сделать:
    Код (Text):

    pinMode(A0, OUTPUT);
    digitalWrite(A0, LOW);
    Serial.println(analogRead(A0));
    digitalWrite(A0, HIGH);
    Serial.println(analogRead(A0));
     
     
    Alex19 нравится это.
  8. Alex19

    Alex19 Гуру

    Спасибо за пояснение.
    Раньше думал, что pinMode(14, OUTPUT); переводит ножку A0 в цифровой режим. Теперь знаю, что это не так.

    Даст такой же результат как и Ваш код.
    Код (Text):
    pinMode(14, OUTPUT);
    digitalWrite(14, LOW);
    Serial.println(analogRead(14));
    digitalWrite(14, HIGH);
    Serial.println(analogRead(14));
    Такой код, так же работает
    Код (Text):
    pinMode(14, OUTPUT);
    digitalWrite(14, LOW);
    Serial.println(digitalRead(14));
    digitalWrite(14, HIGH);
    Serial.println(digitalRead(14));
    Разница лишь в возвращаемых значениях. Тогда удобнее писать A0, как более нагляднее.

    Получается, что мы можем повесить на один выход A0 как цифровые датчики, так и аналоговые и просто переключать их к примеру сдвиговым регистром, не знал, спасибо.
     
  9. Unixon

    Unixon Оракул Модератор

    Сдвиговым регистром нельзя, т.к. он сам цифровой, но можно аналоговым мультиплексором типа 74HC4051 (4052, 4053).
     
    Alex19 нравится это.
  10. Alex19

    Alex19 Гуру

    Спасибо.