Эксперимент 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);
    }
     
    Alex777 нравится это.
  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 Гуру

    Спасибо.
     
  11. Alex777

    Alex777 Нуб

    так как будет в итоге звучать ответ?программа продолжит работать, потому что А0 по умолчанию является входом и не требует конфигурирования в сетап в данном эксперименте, хорошо, а пин 9 по умолчанию выход как и другие пины с тильдой, поддерживающие шим?
     
  12. Airbus

    Airbus Радиохулиган Модератор

    Я бы сказал так—все пины по умолчанию входы. И аналоговые и цифровые. Точнее все они цифровые а только некоторые из них А0—А5 могут работать как аналоговые. Чтоб они стали выходами их надо обьявить как выходы. Если использовать пины работающие в режиме ШИМ то их можно не обьявлять как выходы. Типа так
    Код (Text):
    void setup() {// ничего не декларируем
    //читаем с А0 выводим на PIN3
    }
    void loop() {
      // ШИМ на 3 пин, 1023/4 = 255
      analogWrite(3, analogRead(0) / 4);
    }
    Краткость—сестра таланта!
     
    Последнее редактирование: 22 июн 2023
    Alex777 нравится это.
  13. User248

    User248 Гик

    Аналоговые входы и ШИМ выходы объявлять не нужно.
     
    Alex777 нравится это.