после эксперимента есть вопросы.один меня смутил: 3. Что будет, если стереть из программы строчку pinMode(LED_PIN, OUTPUT)? строчкуpinMode(POT_PIN, INPUT)? я взял и по честному закомментил сначала одну строчку. прокомпиллировал, увидел что ничего не изменилось. закоментил вторую и опять никаких изменений в работе программы. так и должно быть? void setup() { // пин со светодиодом — выход, как и раньше... //pinMode(LED_PIN, OUTPUT); // ...а вот пин с потенциометром должен быть входом // (англ. «input»): мы хотим считывать напряжение, // выдаваемое им pinMode(POT_PIN, INPUT); }
Аналоговые порты работают только на вход и в отличие от цифровых портов их не требуется конфигурировать с помощью вызова функции pinMode. По цифровым, не задавался вопросом, всегда пишу pinMode, так проще потом понять программу.
С цифровыми, поинтереснее. По умолчанию, все цифровые порты определены на вход. Поэтому если закомментировать строку //pinMode(LED_PIN, OUTPUT); Мы получаем порт настроенный на вход. Вероятнее всего в функции analogWrite, есть защита от новичка и она проверяет как настроена ножка. Для цифровых портов всегда пишите pinMode, если хотите избежать проблем. В противном случае забыв указать, Вы получаете порт на вход и команда digitalWrite(pin, HIGH); создаст проблемы, поэтому ни когда так не делайте. Навряд ли составители экспериментов предполагали, что Вы будете лазить по сети/читать мануалы и т.д., наверно ответ на 3 вопрос должен звучать, как программа должна перестать работать, так как...
Это не так. У микроконтроллеров ATmega48/88/168/328 есть 8 каналов АЦП, из них 6 подключены к параллельно к обычным цифровым пинам и еще 2 выведены отдельно. Вот те отдельные два на выход не работают в принципе, но на ардуине они и не выходят на разъемы. А остальные 6 просто совмещены с остальными функциями на этих ногах и эти выводы могут работать и на выход тоже. Но таки да, после сброса и цифровые и цифро-аналоговые включаются в режим входа.
Не очень понял. Вы наверно говорите, о использовании ножек A0-An как цифровых? На сколько мне известно, у UNO (ATmega328) нет аналоговых выходов. От этого и отталкивался. Получается, что для аналоговых входов, должен явно указывать pinMode? Или речь идет о том, что при использовании ножек A0-An как цифровых, обязан указать направление, это понятно. UPD. Ни когда не указывал для аналоговых входов pinMode, вот и решил уточнить, чем мне это грозит, заинтриговали. UDP1. Дошло, не правильно выразил свою мысль Аналоговые порты A0-An, могут работать как в режиме аналоговых, так и в режиме цифровых. Если они работают в режиме цифровых, то необходимо указать режим работы, с помощью команды pinMode. Если они работаю в режиме аналоговых портов (для них только вход), то указать режим работы, с помощью команды pinMode, нет необходимости. Пример с офф. сайта http://arduino.cc/en/Reference/AnalogRead
Да нет у них никаких отдельных режимов. Там внутри запараллелено всё. Можно даже так сделать: Код (Text): pinMode(A0, OUTPUT); digitalWrite(A0, LOW); Serial.println(analogRead(A0)); digitalWrite(A0, HIGH); Serial.println(analogRead(A0));
Спасибо за пояснение. Раньше думал, что 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 как цифровые датчики, так и аналоговые и просто переключать их к примеру сдвиговым регистром, не знал, спасибо.
Сдвиговым регистром нельзя, т.к. он сам цифровой, но можно аналоговым мультиплексором типа 74HC4051 (4052, 4053).
так как будет в итоге звучать ответ?программа продолжит работать, потому что А0 по умолчанию является входом и не требует конфигурирования в сетап в данном эксперименте, хорошо, а пин 9 по умолчанию выход как и другие пины с тильдой, поддерживающие шим?
Я бы сказал так—все пины по умолчанию входы. И аналоговые и цифровые. Точнее все они цифровые а только некоторые из них А0—А5 могут работать как аналоговые. Чтоб они стали выходами их надо обьявить как выходы. Если использовать пины работающие в режиме ШИМ то их можно не обьявлять как выходы. Типа так Код (Text): void setup() {// ничего не декларируем //читаем с А0 выводим на PIN3 } void loop() { // ШИМ на 3 пин, 1023/4 = 255 analogWrite(3, analogRead(0) / 4); } Краткость—сестра таланта!