Здравствуйте Все. Я в программировании полный ноль, поэтому и вопрос соответствующий: он касается объявления переменных. С простой переменной типа int val = 100, более-менее всё понятно: создаётся целочисленная (тип int) переменная с именем val, и ей присваивается значение 100 (теперь в ящике val, лежит 100). А вот с объявлением пина, мне не понятно: пин это что переменная с именем 13, или константа имеющая значение 13? (тогда непонятно, как значение этих констант меняется, например, аналоговый пин 0, может получать значения от 0, до 1023). Следуя вышесказанной логике декларация переменной int pin = 13, также записывает значение 13, в переменную pin. А теперь вопрос такой: если пин 13 сконфигурирован, как INPUT, то почему, если в переменной pin, находится значение 13 (если я конечно правильно понимаю), при чтении этой переменной val = digitalRead (pin), в переменную val, записывается именно состояние пина HIGH или LOW (5v, или 0), а не значение 13. Правильно ли я понимаю, что для того, чтобы вытащить значение 13, из переменной pin, и присвоить его val, мне нужно написать val = pin? И ещё непонятно вот что: если пины 0-13 - это константы, тогда каким образом - эти значения меняются (константы насколько я знаю изменить нельзя), скажем на аналоговом входе 0 (int analog =0), здесь и пин 0, и значение 0, и переменных ещё можно кучу создать со значением 0, - как вообще компилятор отличает скажем int analog =0, аналогового входа от int digital = 0 цифрового, или просто переменной (не по имени же переменной - оно вообще любое может быть)? (зачем, нужно вытаскивать значение 13 - это другой вопрос, просто мне хочется понять логику). Заранее Спасибо.
http://wiki.amperka.ru/программирование:константы-переменные-арифметика digitalRead() - это оператор, который считывает состояние пина с неким номером (или названием), которое надо засунуть в эту скобочку. это считанное значение можно сохранить в какой-то переменной, или нет. номера пинов принято соотносить с их именами путем #define, тогда они будут константами. компилятор никак не отличает int analog =0 от int digital = 0 - это просто две переменные с разными именами - для получения аналогового состояния пина используется оператор analogRead(), в скобочки которого ставится номер (или имя) пина, с которого надо считать. то есть например если в начале мы определили что #define ANALOG_PIN 13 - это значит что у 13 пина всегда будет имя ANALOG_PIN затем в сетапе настроили этот пин на вход pinMode(ANALOG_PIN, INPUT); (хотя это не обязательно, точно так же можно считывать состояние пинов, являющихся выходами) то выражение int analog = analogRead(ANALOG_PIN); значит, что переменная analog сохраняет в себе состояние пина 13 (целое число от 0 до 1023) только тут надо было не 13 пин испольозвать, а A0-A7, т.к. они аналоговые.
Пин это такая железка, которая торчит из платы. И ей, в среде ардуино, присвоен условный номер 13. Передаете этот номер процедуре управления пином, например digitalRead, и процедура пином управляет.
Высокоуровневые функции вроде digital/analog-Read/Write это конечно хорошо, но происходящее скрывает. В реальности контроллер обычно содержит Энегронезависимую память программ Энегронезависимую память параметров (она же EEPROM) Память данных Регистры Порты mega328 содержит все перечисленное. Переменная val может размещаться в памяти данных или в регистре - как решит компилятор, адрес ячеек памяти/номера регистров он назначит. Порт - обычно тоже ячейка памяти, но ее адрес фиксирован изготовителем микросхемы и с ней связана некоторая схема (возможно, имеющая выведенные наружу входы/выходы). Пин 13 Arduino в mega328 соответствует пятому биту порта B (PORTB.5, нумеруются с нуля). Если непосредствено (PORTB |= 1<<5, или на ассемблере sbi PORTB, 5) изменить его состояние, светодиод загорится (перед этим необходимо настроить 5-й вывод порта как выход (DDRB |= 1<<5). В mega328 номера портов PORTB и DDRB - 5 и 4 соответственно, но возможно и обращение к ним как к ячейкам памяти с адресами 0x25 и 0x24. pinMode и digitalWrite это и делают, но также выполняют преобразование номера пина Arduino в номер порта/номер бита и ряд других действий, т.к. некоторые выводы контроллера могут использоваться и для других целей (входы AЦП, выходы ШИМ и др. - устройств обычно больше чем выводов).
Итак, если я правильно понял, среда Ардуино, присваивает порту B, значение 13, затем макрокоманда #define PIN 13, заменяет в коде программы слово PIN, на 13?
http://forum.amperka.ru/threads/Прошу-разъяснений.12155/#post-119013 Три команды в приведенном коде (in/eor/out) меняют состояние бита порта на противоположное. Установить/сбросить бит можно одной командой (sbi/cbi), вызовы pinMode() и digitalWrite() в данном коде можно ими заменить. Это самый низкий доступный уровень и с точки зрения разбирательства в происходящем самый правильный, ИМХО.
тема не раскрыта , ответившие выше совершенно не поняли вопроса , действительно имеет место путаница , задаю тот же вопрос и надеюсь на ответ грамотного человека. Формулирую по другому : почему командой задать значение переменной мы присваиваем ей номер пина? таких примеров в интернете масса один из них я прикрепил к сообщению.
ответ найден , товарищи всё оказывается просто. Ранее я сталкивался с неверным толкованием. Командой int red = 2 - мы не номер пина для переменной задаём ( как объясняется в большинстве справочников , ни в коем случае не так) мы задаем исключительно числовое значение. А номер пина по этому значению мы определяем уже в следующей команде pinMode (red (((именно вместо этого red и есть наше число 2, заданное выше))) , OUTPUT); Вопрос непременно возникнет у всех наблюдательных новичков , спасибо всем откликнувшимся)