Arduino.ru
Как аналоговые пины A0 A1 A2. использовать как цифровые?
- Войдите на сайт для отправки комментариев
10 ответов [Последнее сообщение]
Чт, 10/04/2014 — 10:55
Зарегистрирован: 12.12.2013
подскажите хочу перенести внешние сигналы с цифровых d2 d3 на аналоговые a0 a1 как написать в программе?
int Enable_Sensor_1 = 2; // датчик 1 int Enable_Sensor_2 = 3; // датчик 2 void setup() < digitalWrite(Enable_Sensor_1, HIGH); // деактивация датчика 1 digitalWrite(Enable_Sensor_2, HIGH); // деактивация датчика 2 >
- Войдите на сайт для отправки комментариев
Чт, 10/04/2014 — 11:10
Зарегистрирован: 29.09.2011
Вы не поверите ;), но нужно просто сказать о своем желании не форуму, а ардуине 😉
int Enable_Sensor_1 = A0; // датчик 1
Только ваш код скоре всего не будет ни на аналоговых, ни на цифровых работать. Не знаю что вы хотели сделать, но сдели вот что: «включили подтягивающий резистор на пинах Enable_Sensor_1, и Enable_Sensor_2). Вернее может быть и будет работать, но «если повезет». «Плавающие глюки» — могут появится влюбой момент.
P.S. Кстати, ответ на свой вопрос, вы могли найти в документации http://arduino.ru/Reference/DigitalWrite . Там «чуть-чуть по другому выглядит», но работать будет так-же.
P.S.S. И зачем тип int использовался?
- Войдите на сайт для отправки комментариев
Чт, 10/04/2014 — 11:24
Зарегистрирован: 12.12.2013
я конечно подозревал что все так просто, но проверю попозже сейчас нет под рукой платы.
какой тип использовать ? boolean?
брал с примеров. да даже в примере по ссылке int стоит
int ledPin = 13; // Светодиод подключенный к вход/выходу 13
| void setup() |
| pinMode(ledPin, OUTPUT); // устанавливает режим работы — выход |
пропущены строки ? я их не указал специально.
pinMode(Enable_Sensor_1, OUTPUT); // устанавливает режим работы — выход
pinMode(Enable_Sensor_2, OUTPUT); // устанавливает режим работы — выход
ну насчет работы на цифровых все работает, а почему то недолжен?, да правильно включил высокий на датчиках на обоих это в setup, ниже я им по очереди LOW подключаю.
- Войдите на сайт для отправки комментариев
Чт, 10/04/2014 — 11:28
inspiritus
Зарегистрирован: 17.12.2012
А еще 14 , 15, 16 , 17, 18, 19.
не так — Вы не провели инициализацию пинов, как OUTPUT, командой pinMode, потому пины работают, как входы с подтяжкой к плюсу, через резистор 20 кОм.
- Войдите на сайт для отправки комментариев
Чт, 10/04/2014 — 11:35
Зарегистрирован: 12.12.2013
да это есть, просто не стал выкладывать ибо понятно, а вот со входами аналоговыми было не понятно.
- Войдите на сайт для отправки комментариев
Чт, 10/04/2014 — 11:49
Зарегистрирован: 29.09.2011
> а почему то недолжен?
Не, ну вы смешной. Ну представте что вы позвали соседа-автоэлектрика. Помочь поменять в фарах лампочки с обычных на ксенон. Так как «через час в дорогу. а светят очень плохо». В процессе он заглядывает под капот и восклицает «куда ты ехать собрался? У тебя же вместо тросика газа какая-то ниточка привязана. Далеко ты не уедешь». На что вы удивленно(!) смотрите на него: «Почему это не уеду? Запросто уеду. Я тросик в багажник специально спрятал. Да и со старыми лампами, пробовал газ нажимать — нормально движок обороты набирает».
> да правильно включил высокий на датчиках
Срочно прекращайте ожидать на форуме телепатов. Иначе либо игронить будут, либо троллить все кому не лень. По коду который вы ПОКАЗАЛИ, вы не включали высокий. Вы включали подтягивающий резистор. И что в итоге будет на пине, высокий или низкий — зависит от сопротивления нагрузки на пине и фазы луны.
Вообщем всегда перечитывайте свое сообщение глазами человека которые не видит вашей схемы, не знает что вы делаете, не смотрит вам через плечо, не знает что вы задумали. Представте себе что вы взяли себе советчика-помошника. Который парализован и сидит за ширмой. Может только слышать вас и посмотреть на бумажку которую вы ему принисете. К тому же — со склерозом (может через пол часа забыть что вы ему говорили раньше). Вот такому «консультанту» вы и должны объяснить «что у вас происходит и что вы хотите».
> какой тип использовать ? boolean?
А почему boolean? Какие возможные значения бывают у булеан? Что вам нужно сохранить туда? Номер пина. Каким может быть номер пина? Может быть дробным? насколько большим может быть? Может быть отрицательным? Возмите бумажку, ответте на все эти вопросы. Потом идете в раздел програмирование, читаете про ВСЕ типы данных. И подбираете какой «минимально подходит» (сможет не потерять значение и при этом не расходовать лишнюю память).
Вообщем вам нужно самому научится подбирать нужный тип данных под конкретную ситуацию, а не «потому что кто-то на форуме сказал» или «в примере так». И на форуме и авторы примеров — люди. Которые могут быть ошибаться, могут быть не аккуратными (а. и так сойдет), могут быть «вредителями».
- Войдите на сайт для отправки комментариев
Arduino.ru
Понимаю что тупой вопрос, но элементарно на пльцах: читать A0 как High или low, понимаю что нужно понимать что подразумевается 0 или 1 и то что скорость считывания меньше чем на цифровом . В схеме подтягивающий резистор на землю на 10кОм есть (возможно его мало?). ардуино читает всегда high. (по крайней мере в протеусе ибо только начиню ваять ) Что не находил в инете — нету вообще и слова об этом. Значит вопрос реально тупой..((
— перебросил на цифровые, так будет проще но все же для понимая-
[code] int vklLamp1 = A0; // включение лампы 1 int zakr1 = A6; // рефлектор закрыт на 1 лампе int otkr1 = A5; // рефлектор открыт на 1 лампе int konveerGO = A15; // конвеер работает int obruvPered = 53; //обрыв лениты впереди int obruvZad = 53; //обрыв лениты сзади int GOlamp1 = 43; //запуск лампы 1 long previousMillis = 0; // время последнего задействования long intervaLampGO = 1000; // интервал для ВКЛЮЧЕНИЯ ЛАМПЫ void setup() < pinMode(vklLamp1, INPUT); pinMode(zakr1, INPUT); pinMode(otkr1, INPUT); pinMode(konveerGO, INPUT); pinMode(obruvPered, INPUT); pinMode(obruvZad, INPUT); pinMode(obruvZad, INPUT); pinMode(GOlamp1, OUTPUT); pinMode(Alarmlamp1, OUTPUT); >void loop() < if (digitalRead(vklLamp1) == HIGH && zakr1 == HIGH); //ЕСЛИ КНОПКА 1НАЖАТА И РЕФЛЕКТОР ЗАКРЫТ < unsigned long currentMillis = millis(); //запускаю отсчет if(currentMillis - previousMillis >intervaLampGO)// отсчитываю время ДЛЯ ВКЛЮЧЕНИЯ ЛАМПЫ < digitalWrite(GOlamp1,HIGH); // ЗАПУСКАЮ ЛАМПУ 1 >> > [/code]
- Войдите на сайт для отправки комментариев
Чт, 29/09/2016 — 15:23
Клапауций 232
Зарегистрирован: 05.04.2016
Аналоговые входы (analog pins) могут быть использованы как цифровые вход/выходы (digital pins). Обращение к ним идет по номерам от 14 (для аналогового входа 0) до 19 (для аналогового входа 5).
- Войдите на сайт для отправки комментариев
Чт, 29/09/2016 — 15:34

Зарегистрирован: 25.05.2015
maxvalin пишет:
скорость считывания меньше чем на цифровом .
Ни в какой мере — точно такая же скорость.
maxvalin пишет:
Правильно написать код. Если бы Вы в строке 36 сравнивали бы с HIGH не номер пина, как Вы это делаете, а значение на нём, а заодно убрали бы из конца всё той же строки точку с запятой, то всё было бы нормально с божьей помощью.
// У Вас if (digitalRead(vklLamp1) == HIGH && zakr1 == HIGH); // Надо if (digitalRead(vklLamp1) == HIGH && digitalRead(zakr1) == HIGH)
- Войдите на сайт для отправки комментариев
Чт, 29/09/2016 — 15:54
Зарегистрирован: 22.02.2016
Именно так уже и сделал, не увидел сначала ошибки))
И с аналога читает HIGH без проблем, а проблема вот в протеусе оказалась. Эмуляция в нем никудышняя. После исправления запустиось как надо, но не всегда . Тупо старт стоп в эмулторе клацаю- срабатывает раз через четыре примерно. Код прошивки при этом не меняю! . Плюнул на протеус- начал набирать потихоньку так. Пока придут блоки реле и пока залужу плату с оптронами для входов (жаль что на том же алиекспресе еще модули входов не придумали продавать) Попутно вопрос :
застрял в последних строчках:
if (digitalRead(konveerGO) == HIGH) //ЕСЛИ КОНВЕЕР ЗАПУСТИЛСЯ < unsigned long currentMillis = millis(); //запускаю отсчет if(currentMillis - previousMillis >PauseOpenReflektor)// ОТСЧИТЫВАЮ ВРЕМЯ НА ПОВОРОТ РЕФЛЕКТОРА if (digitalRead(vklLamp1) == HIGH //(понимаю что два if постановлен не совсем верно, вот как раз мозгую над этим // но надо чтоб после запуска конвеера , после определенного времени был сделан опрос датчика, если LOW то соответственный сигнал на выход. >
- Войдите на сайт для отправки комментариев
Чт, 29/09/2016 — 15:58
Зарегистрирован: 22.02.2016
Клапауций 232 пишет:
Аналоговые входы (analog pins) могут быть использованы как цифровые вход/выходы (digital pins). Обращение к ним идет по номерам от 14 (для аналогового входа 0) до 19 (для аналогового входа 5).
тоисть обрщаясь к ним я имею например ввиду A0 но пишу int 14? а как же тогда от A6 и до A15? в случае с мегой.
Млин, реально не написали ниразу пример этого случая.
- Войдите на сайт для отправки комментариев
Чт, 29/09/2016 — 16:06

Зарегистрирован: 25.05.2015
maxvalin пишет:
тоисть обрщаясь к ним я имею например ввиду A0 но пишу int 14? а как же тогда от A6 и до A15? в случае с мегой.
Млин, реально не написали ниразу пример этого случая.
Правильнее писать A0.
А так, технически это без разницы. В одном из включаемых файлов у Вас есть такая строчка
- Войдите на сайт для отправки комментариев
Чт, 29/09/2016 — 16:08
Клапауций 232
Зарегистрирован: 05.04.2016
maxvalin пишет:
Клапауций 232 пишет:
Аналоговые входы (analog pins) могут быть использованы как цифровые вход/выходы (digital pins). Обращение к ним идет по номерам от 14 (для аналогового входа 0) до 19 (для аналогового входа 5).
тоисть обрщаясь к ним я имею например ввиду A0 но пишу int 14? а как же тогда от A6 и до A15? в случае с мегой.
Млин, реально не написали ниразу пример этого случая.
не писали — рисовали.
распечатай себе картинко на память — твой случай: нижний левый угол платы — пины A0-A5, бирюзовым цветом аналоговые номера, сиреневеньким — цифровые номера пинов

- Войдите на сайт для отправки комментариев
Чт, 29/09/2016 — 16:09

Зарегистрирован: 25.05.2015
maxvalin пишет:
застрял в последних строчках:
if (digitalRead(konveerGO) == HIGH) //ЕСЛИ КОНВЕЕР ЗАПУСТИЛСЯ < unsigned long currentMillis = millis(); //запускаю отсчет if(currentMillis - previousMillis >PauseOpenReflektor)// ОТСЧИТЫВАЮ ВРЕМЯ НА ПОВОРОТ РЕФЛЕКТОРА if (digitalRead(vklLamp1) == HIGH //(понимаю что два if постановлен не совсем верно, вот как раз мозгую над этим // но надо чтоб после запуска конвеера , после определенного времени был сделан опрос датчика, если LOW то соответственный сигнал на выход. >
Нужен совет, давайет скетч целиком. Я не понимаю откуда эти строчки и в каком мест Вашего изначального скетча они стоят, а потому ничего не могу сказать.
- Войдите на сайт для отправки комментариев
Чт, 29/09/2016 — 16:23
Зарегистрирован: 22.02.2016
[code] int vklLamp1 = 37; // включение лампы 1 int vklLamp2 = 36; // включение лампы 2 int vklLamp3 = 35; // включение лампы 3 int vklLamp4 = 34; // включение лампы 4 int vklLamp5 = 33; // включение лампы 5 int zakr1 = 32; // рефлектор закрыт на 1 лампе int otkr1 = 31; // рефлектор открыт на 1 лампе int zakr2 = 30; // рефлектор закрыт на 2 лампе int otkr2 = 29; // рефлектор открыт на 2 лампе int zakr3 = 28; // рефлектор закрыт на 3 лампе int otkr3 = 27; // рефлектор открыт на 3 лампе int zakr4 = 26; // рефлектор закрыт на 4 лампе int otkr4 = 25; // рефлектор открыт на 4 лампе int zakr5 = 24; // рефлектор закрыт на 5 лампе int otkr5 = 23; // рефлектор открыт на 5 лампе int konveerGO = 22; // конвеер работает int obruvPered = 53; //обрыв лениты впереди int obruvZad = 53; //обрыв лениты сзади int GOlamp1 = 43; //запуск лампы 1 int GOlamp2 = 44; //запуск лампы 2 int GOlamp3 = 45; //запуск лампы 3 int GOlamp4 = 46; //запуск лампы 4 int GOlamp5 = 47; //запуск лампы 5 int Alarmlamp1 = 38; //авария лампы 1 int Alarmlamp2 = 39; //авария лампы 2 int Alarmlamp3 = 40; //авария лампы 3 int Alarmlamp4 = 41; //авария лампы 4 int Alarmlamp5 = 42; //авария лампы 5 long previousMillis = 0; // время последнего задействования long intervaLampGO = 1000; // интервал для ВКЛЮЧЕНИЯ ЛАМПЫ long PauseOpenReflektor = 5000; // интервал для ВКЛЮЧЕНИЯ АВАРИИ void setup() < pinMode(vklLamp1, INPUT); pinMode(vklLamp2, INPUT); pinMode(vklLamp3, INPUT); pinMode(vklLamp4, INPUT); pinMode(vklLamp5, INPUT); pinMode(zakr1, INPUT); pinMode(otkr1, INPUT); pinMode(zakr2, INPUT); pinMode(otkr2, INPUT); pinMode(zakr3, INPUT); pinMode(otkr3, INPUT); pinMode(zakr4, INPUT); pinMode(otkr4, INPUT); pinMode(zakr5, INPUT); pinMode(otkr5, INPUT); pinMode(konveerGO, INPUT); pinMode(obruvPered, INPUT); pinMode(obruvZad, INPUT); pinMode(obruvZad, INPUT); pinMode(GOlamp1, OUTPUT); pinMode(GOlamp2, OUTPUT); pinMode(GOlamp3, OUTPUT); pinMode(GOlamp4, OUTPUT); pinMode(GOlamp5, OUTPUT); pinMode(Alarmlamp1, OUTPUT); pinMode(Alarmlamp2, OUTPUT); pinMode(Alarmlamp3, OUTPUT); pinMode(Alarmlamp4, OUTPUT); pinMode(Alarmlamp5, OUTPUT); >void loop() < if (digitalRead(vklLamp1) == HIGH && digitalRead(zakr1) == HIGH) //ЕСЛИ КНОПКА 1НАЖАТА И РЕФЛЕКТОР ЗАКРЫТ < unsigned long currentMillis = millis(); //запускаю отсчет if(currentMillis - previousMillis >intervaLampGO)// ОТСЧИТЫВАЮ ВРЕМЯ НА ЗАПУСК ЛАМПЫ < digitalWrite(GOlamp1,HIGH); // ЗАПУСКАЮ ЛАМПУ 1 >previousMillis = currentMillis; //сохраняю сразу время последнего включения > if (digitalRead(vklLamp1) == LOW)// ЕСЛИ КНОПКА ПУСКА ПЕРВОЙ ЛАМПЫ ВЫКЛЮЧЕНА < digitalWrite(GOlamp1,LOW); // ВЫКЛЮЧАЮ ЛАМПУ >if (digitalRead(vklLamp1) == HIGH && digitalRead(otkr1) == HIGH && digitalRead(konveerGO) == HIGH) //ЕСЛИ КНОПКА 1НАЖАТА И РЕФЛЕКТОР ОТКРЫТ И ТРАНСПОРТЕР КРУТИТСЯ < digitalWrite(GOlamp1,HIGH); // ЗАПУСКАЮ ЛАМПУ 1 ПРИ РАБОТАЮЩЕМ ТРАНСПОРТЕРЕ >if (digitalRead(konveerGO) == HIGH) //ЕСЛИ КОНВЕЕР ЗАПУСТИЛСЯ < unsigned long currentMillis = millis(); //запускаю отсчет if(currentMillis - previousMillis >PauseOpenReflektor)// ОТСЧИТЫВАЮ ВРЕМЯ НА ПОВОРОТ РЕФЛЕКТОРА < previousMillis = currentMillis; >if (digitalRead(otkr1) == LOW) < digitalWrite(Alarmlamp1,HIGH); // Включаю сигнализацию первой лампы >> > [/code] сделал так, может и прокатит) Вот опять таки: как добавить чтоб при появлении сигнала digitalRead(otkr1)отключить аварию. в этом же if надо вкладывать или выносить на наружу. Это самая сильная проблема для меня при написании( Мечтаю знать наизусть порядок установки условий! Принцип как идет цикл и вообще как читается программа процессором понимаю но эти правила.
- Войдите на сайт для отправки комментариев
Чт, 29/09/2016 — 16:32
Зарегистрирован: 22.02.2016
Клапауций 232]
[quote=maxvalin]
[quote=Клапауций 232 пишет:
Аналоговые входы (analog pins) могут быть использованы как цифровые вход/выходы (digital pins). Обращение к ним идет по номерам от 14 (для аналогового входа 0) до 19 (для аналогового входа 5).
распечатай себе картинко на память — твой случай: нижний левый угол платы — пины A0-A5, бирюзовым цветом аналоговые номера, сиреневеньким — цифровые номера пинов
скачал с того же пигиса на свою мегу, и раньше смотрел на эту картинку но чето недогнал что при написании кода смотреть на сопоставимость входов/выходов. Думал другие правила нужны(
- Войдите на сайт для отправки комментариев
Могу ли я использовать аналоговые выводы на Arduino для моего проекта как цифровые?
Я новичок в использовании Arduino, и у меня есть Arduino Uno. Для проектов, которые я сделал, я использовал только цифровые контакты.
Я строю небольшой автомобиль, который использует шаговые двигатели. У меня закончились контакты для управления моторами для этого автомобиля. Для чего нужны аналоговые контакты? Могу ли я использовать аналоговые контакты для управления остальными шаговыми двигателями, которые я подключаю к Arduino, или мне нужно купить Arduino большего размера, чем Arduino Uno, чтобы управлять этой штуковиной?
Да, аналоговые контакты Arduino можно использовать как цифровые выходы.
Это описано в документации по входным контактам Arduino в разделе Pin Mapping:
Отображение
контактов Аналоговые контакты могут использоваться идентично цифровым контактам с использованием псевдонимов A0 (для аналогового входа 0), A1 и т. Д. Например, код будет выглядеть следующим образом, чтобы установить аналоговый контакт 0 на выход и установить ВЫСОКИЙ:
pinMode (A0, OUTPUT);
digitalWrite (A0, HIGH);
Да извини. Я помню, что было поздно, когда я опубликовал это, и я становился сонным и терял концентрацию. Я удалил комментарий.
Вы всегда можете использовать аналоговые контакты для цифровой записи.
- digitalRead() работает на всех выводах. Он просто округлит полученное аналоговое значение и представит его вам. Если analogRead(A0) больше или равно 512, digitalRead(A0) будет 1, иначе 0.
- digitalWrite() работает на все штырьки, с параметром разрешена 0 или 1. digitalWrite(A0,0) таким же , как analogWrite(A0,0) и digitalWrite(A0,1) тем же, analogWrite(A0,255)
- analogRead() работает только на аналоговых выводах. Может принимать любое значение от 0 до 1023.
- analogWrite() работает на всех аналоговых выводах и на всех цифровых выводах ШИМ . Вы можете указать любое значение от 0 до 255.
Аналоговые выводы позволяют вам читать / записывать аналоговые значения — в основном, вместо выдачи напряжения 0 или 5 (как с цифровым), они могут давать диапазон напряжений от 0 до 5 (как на входе, так и на выходе). Обратите внимание, что напряжение на аналоговом выходе является только наблюдаемым напряжением с помощью мультиметра. В действительности аналоговые выводы посылают импульсы сигналов 0 В и 5 В, чтобы получить выход, который «выглядит» аналогом (это ШИМ).
Относительно количества выводов: имейте в виду, что выводы PWM могут использоваться для аналогового выхода. Если у вас закончились булавки, вы можете использовать мультиплексирование, чтобы заработать больше. Не нужно приобретать еще один Arduino.
AnalogWrite () не выводит напряжения в диапазоне от 0 до 5 (за исключением срока)! AnalogWrite () изменяет только широтно-импульсную модуляцию сигнала. Выходное напряжение по-прежнему составляет 5 вольт (или любой другой VCC). Контакты с пометкой «аналоговый» будут выводить только 0 В или 5 В. Они не являются переменными и являются примечанием
@ JamesC4S: Хороший вопрос, отредактировано. Спасибо 🙂
Намного лучше! 🙂
На аналоговых выводах digitalRead () и digitalWrite () работают медленнее? Если digitalRead () округляет значение, я могу представить, что оно намного медленнее, чем digitalRead () на цифровом выводе?
Это очень кратко и информативно, спасибо, однако я считаю, что есть одна маленькая ошибка. Согласно штрафным документам : the Arduino (ATmega) will report HIGH if: a voltage greater than 3.0V is present at the pin (5V boards) что противоречит утверждению в этом посте If analogRead(A0) is greater than or equal to 512, digitalRead(A0) will be 1, else 0 .
Аналоговые Ghosh указывают, что аналоговые контакты на Arduino могут быть использованы в качестве цифровых выводов.
Однако, даже если у вас закончились булавки для управления шаговыми двигателями, вам не нужно покупать другую доску. Вы можете просто использовать промежуточный компонент, такой как регистр или мультиплексор, для управления соответствующим шаговым двигателем.
Если вы можете себе это позволить, и вы действительно хотите сделать работу со степпером очень простой, попробуйте Easy Stepper . Я был очень доволен.
Example 1: Basic Arduino setup This is the most basic example you can have with an Arduino, an Easy Driver, and a stepper motor. Connect the motor's four wires to the Easy Driver (note the proper coil connections), connect a power supply of 12V is to the Power In pins, and connect the Arduino's GND, pin 8 and pin 9 to the Easy Driver. Then load this sketch and run it on your Arduino or chipKIT: void setup() pinMode(8, OUTPUT); pinMode(9, OUTPUT); digitalWrite(8, LOW); digitalWrite(9, LOW); > void loop() digitalWrite(9, HIGH); delay(1); digitalWrite(9, LOW); delay(1); >
Также на той же странице приведен пример кода для запуска двух двигателей с двумя панелями easystepper с ускорением / замедлением: http://www.sc-fa.com/blog/wp-content/uploads/2013/04/20130414- 081018.jpg
#include // Define two steppers and the pins they will use AccelStepper stepper1(1, 9, 8); AccelStepper stepper2(1, 7, 6); int pos1 = 3600; int pos2 = 5678; void setup() stepper1.setMaxSpeed(3000); stepper1.setAcceleration(1000); stepper2.setMaxSpeed(2000); stepper2.setAcceleration(800); > void loop() if (stepper1.distanceToGo() == 0) delay(500); pos1 = -pos1; stepper1.moveTo(pos1); > if (stepper2.distanceToGo() == 0) delay(500); pos2 = -pos2; stepper2.moveTo(pos2); > stepper1.run(); stepper2.run(); >
Это действительно не отвечает на вопрос; было бы лучше в качестве комментария. Не могли бы вы конкретизировать это, чтобы он ответил на вопрос?
@AnnonomusPerson: драйвер шагового двигателя EasyDriver представляется активным продуктом, в наличии и всем остальным .
Green Oak Studio
Кому-то может не хватить тринадцати цифровых входов Arduino, и для таких людей сегодня я расскажу, как превратить шесть аналоговых входов в цифровые. Нам опять потребуется немного низкоуровневой магии, но пусть вас это не пугает.
Пока АЦП не работает, доступны другие функции ног процессора, занятых под преобразование.
Смотрим на картинку и видим, что аналоговые входы 0. 5 находятся на ногах 23. 28. Однако основная функция этих ног — PC0. 5.
PC означает PORTC, или по-русски «Порт Цэ». Порт — это устройство ввода-вывода, где каждый бит может вводиться или выводиться отдельно, а может и в составе байта. У процессора ATmega328 три семибитных порта: B, C и D. Каждый пин порта управляется тремя битами в трех регистрах: DDxn, PORTxn, PINxn. Нам сейчас не интересны порты B и D, поэтому поглядим на регистры порта C.
DDRC — регистр направления данных порта C
| 7 bit | 6 bit | 5 bit | 4 bit | 3 bit | 2 bit | 1 bit | 0 bit | |
| DDRC | — | DDC6 | DDC5 | DDC4 | DDC3 | DDC2 | DDC 1 | DDC 0 |
Каждый бит в этом регистре отвечает за направление данных на соответствующем пине:
Значение по умолчанию — 0.
PORTC — регистр данных порта C
| 7 bit | 6 bit | 5 bit | 4 bit | 3 bit | 2 bit | 1 bit | 0 bit | |
| PORTC | — | PORTC6 | PORTC5 | PORTC4 | PORTC3 | PORTC2 | PORTC1 | PORTC0 |
Если пин сконфигурирован как вход, то при записи 1 в соответствующий бит этого регистра активируется подтягивающий резистор. При записи 0 подтягивающий резистор отключается.
Если пин сконфигурирован как выход, то при записи 1 в соответствующий бит этого регистра пин подтягивается к питанию. При записи 0 пин притягивается к земле.
Значение по умолчанию — 0.
PINC — Адреса входов порта C
| 7 bit | 6 bit | 5 bit | 4 bit | 3 bit | 2 bit | 1 bit | 0 bit | |
| PINC | — | PINC6 | PINC 5 | PINC 4 | PINC 3 | PINC 2 | PINC 1 | PINC 0 |
Каждый бит этого регистра содержит значение соответствующего пина. Прочитать значение можно независимо от значения DDxn.
Значение по умолчанию — не определено.
Blink, 1 способ
Напишем всем известную программу Blink для аналогового входа (гы-гы). Подключим светодиодик к аналоговому входу 0:

Для начала назначим бывший аналоговый вход A0 как цифровой выход. Для этого запишем единицу в бит DDC0 регистра DDRC:
void setup () <
DDRC = (1 >
Чтобы включать и выключать светодиод, будем записывать то 1, то 0 в бит PORTC0 регистра PORTC:
void loop () <
PORTC = PORTC | (1 delay (1000);
PORTC = PORTC ^ (1 delay (1000);
>
Blink, способ 2
Есть более читерский способ, который сокращает программу еще на 2 строчки. В гайде ATmega328 пишут, что запись единицы в PINxn переключает значение PORTxn, независимо от значения DDRxn. Ну то есть если там был 0, то становится 1, а если был 1, то становится 0. За сим накалякаем следующий код:
void setup () <
DDRC = (1 >
void loop () <
PINC = PINC | (1 delay (1000);
>
Вот и весь код. Работает прямо так же, как на предыдущем видео. Можно было бы еще избавиться от строчки с DDRC=(1 <
Чтобы было весело, займем все 6 аналоговых входов. На 0-4 повесим светодиоды, а на 5 — кнопку:

Теперь назначим пины PC0. 4 как выходы, а PC5 как вход. Помня, что выход — это 1 в DDCn, а вход — это 0, можно написать строчку, которая все сделает, так:
DDRC = B00011111;
Для того, чтобы сделать что-то по нажатию кнопки, надо сдетектировать это самое нажатие. Ждем единицу на PINC5, и по ней запускаем бегущие огни — записываем по очереди единицы в PORTCn, а потом записываем нули точно так же. Полный код:
void setup () <
Программа в основном цикле содержит сколько же строк, сколько было бы при использовании стандартных цифровых выходов и конструкций digitalWrite(). Поэтому единственная сложность возникает лишь в ненаглядности функций.