Помогите нубу

Тема в разделе "Arduino & Shields", создана пользователем Andrey_user, 22 июл 2017.

  1. Andrey_user

    Andrey_user Нерд

    Здравствуйте Все. Я в программировании полный ноль, поэтому и вопрос соответствующий: он касается объявления переменных.

    С простой переменной типа 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 - это другой вопрос, просто мне хочется понять логику). Заранее Спасибо.
     
  2. akl

    akl Гуру

    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, т.к. они аналоговые.
     
    Последнее редактирование: 22 июл 2017
  3. rkit

    rkit Гуру

    Пин это такая железка, которая торчит из платы. И ей, в среде ардуино, присвоен условный номер 13.
    Передаете этот номер процедуре управления пином, например digitalRead, и процедура пином управляет.
     
  4. Andrey_user

    Andrey_user Нерд

    Большое спасибо за ответ: пока вкуриваю, потом отпишусь, что не понятно.
     
  5. Высокоуровневые функции вроде 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ЦП, выходы ШИМ и др. - устройств обычно больше чем выводов).
     
    Последнее редактирование: 22 июл 2017
  6. Andrey_user

    Andrey_user Нерд

    Итак, если я правильно понял, среда Ардуино, присваивает порту B, значение 13, затем макрокоманда #define PIN 13, заменяет в коде программы слово PIN, на 13?
     
  7. akl

    akl Гуру

    только не всему порту, а шестой по счету его ноге.

    [​IMG]
     
  8. http://forum.amperka.ru/threads/Прошу-разъяснений.12155/#post-119013

    Три команды в приведенном коде (in/eor/out) меняют состояние бита порта на противоположное. Установить/сбросить бит можно одной командой (sbi/cbi), вызовы pinMode() и digitalWrite() в данном коде можно ими заменить. Это самый низкий доступный уровень и с точки зрения разбирательства в происходящем самый правильный, ИМХО.
     
    Последнее редактирование: 22 июл 2017
  9. Vovan777

    Vovan777 Нуб

    тема не раскрыта , ответившие выше совершенно не поняли вопроса , действительно имеет место путаница , задаю тот же вопрос и надеюсь на ответ грамотного человека.
    Формулирую по другому : почему командой задать значение переменной мы присваиваем ей номер пина?
    таких примеров в интернете масса один из них я прикрепил к сообщению. Безымянный1.png Безымянный2.png
     
  10. Airbus

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

    И в чем вопрос?
     
  11. Потому что мы хотим, чтобы переменная содержала номер пина, может быть?
     
    Последнее редактирование: 1 янв 2019
  12. Vovan777

    Vovan777 Нуб

    ответ найден , товарищи всё оказывается просто. Ранее я сталкивался с неверным толкованием.
    Командой int red = 2 - мы не номер пина для переменной задаём ( как объясняется в большинстве справочников , ни в коем случае не так) мы задаем исключительно числовое значение.
    А номер пина по этому значению мы определяем уже в следующей команде
    pinMode (red (((именно вместо этого red и есть наше число 2, заданное выше))) , OUTPUT);
    Вопрос непременно возникнет у всех наблюдательных новичков , спасибо всем откликнувшимся)
     
  13. parovoZZ

    parovoZZ Гуру

    это не номер пина, а номер контакта на плате ардуино. У МК пинов с такими номерами НЕТ.
     
  14. DetSimen

    DetSimen Guest

    на пятый день заключения Зоркий Глаз заметил, что у сарая нет одной стены.
     
    parovoZZ и Andrey12 нравится это.