Объясните за что отвечают pinmode

Тема в разделе "Arduino & Shields", создана пользователем Danil0000, 23 мар 2023.

  1. Danil0000

    Danil0000 Нуб

    Вот в этом видео человек собирает машинку. Он приложил код. Мне интересно за что отвечают эти строки кода:
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(9, OUTPUT);
    Это датчики линий?
    Это моторы?






    https://youtu.be/v57MEBL3XG0
    https://youtu.be/v57MEBL3XG0
    https://youtu.be/v57MEBL3XG0
    Код (C++):
    int leftSensor = 4;
    int rightSensor = 13;
    void setup() {
      Serial.begin(9600);
      pinMode(5, OUTPUT);
      pinMode(6, OUTPUT);
      pinMode(7, OUTPUT);
      pinMode(8, OUTPUT);
      pinMode(9, OUTPUT);
      pinMode(leftSensor, INPUT);
      pinMode(rightSensor, INPUT);
    }

    void loop() {
      Serial.print(digitalRead(leftSensor));
      Serial.println(" ");
      Serial.print(digitalRead(rightSensor));
      if (digitalRead(leftSensor) == 0 && digitalRead(rightSensor) == 0) {
        forward();
      } else if (digitalRead(leftSensor) == 1 && digitalRead(rightSensor) == 0) {
        left();
      } else if (digitalRead(leftSensor) == 0 && digitalRead(rightSensor) == 1) {
        right();
      }
    }
    void forward() {
      analogWrite(5, 255);
      digitalWrite(6, HIGH);
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      digitalWrite(9, HIGH);
      analogWrite(10, 255);
    }

    void back() {
      analogWrite(5, 255);
      digitalWrite(6, LOW);
      digitalWrite(7, HIGH);
      digitalWrite(8, HIGH);
      digitalWrite(9, LOW);
      analogWrite(10, 255);
    }

    void left() {
      analogWrite(5, 120);
      digitalWrite(6, HIGH);
      digitalWrite(7, LOW);
      digitalWrite(8, HIGH);
      digitalWrite(9, LOW);
      analogWrite(10, 120);
    }

    void right() {
      analogWrite(5, 120);
      digitalWrite(6, LOW);
      digitalWrite(7, HIGH);
      digitalWrite(8, LOW);
      digitalWrite(9, HIGH);
      analogWrite(10, 120);
    }
     

    Вложения:

    • FERMI_5.ino
      Размер файла:
      1,3 КБ
      Просмотров:
      66
  2. Airbus

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

    Судя по коду могу сказать что 6,7,8,9 отвечают за направление движения а 5 и 10 за скорость движения. Датчики линии 4 и 13
     
  3. Danil0000

    Danil0000 Нуб

    Спасибо тебе друг. Ты столько знаешь о программировании, со скольки лет занимаешься?
     
  4. Airbus

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

    Недавно
     
  5. a1000

    a1000 Гуру

    Если упрощённо, то цифровые выводы могут работать как на вход, так и на выход. Функция pinMode() как раз и устанавливает режим работы. Например строка
    Код (C++):
    pinMode(5, OUTPUT);
    конфигурирует вывод 5 как выход. После этого мы из программы можем можем выставлять на нём 0 или 1.
    Если мы напишем
    Код (C++):
    pinMode(5, INPUT);
    мы сконфигурируем вывод 5 как вход. После этого мы из програмы можем "посмотреть" что поступает из внешнего мира на этот вывод.
     
    Ariadna-on-Line и DetSimen нравится это.
  6. Airbus

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

    Вставлю свои 5 копеек:
    [​IMG]
    вывод 5 работает как ШИМ. Поэтому analogWrite(5,xxx); Где ххх число от 0 до 255. 0 это 0 ежу понятно а 255 это тапок в пол тобишь полный газ тобишь 100%
     
  7. a1000

    a1000 Гуру

    Честно скажу, код даже не смотрел. Человеку было интересно за функцию pinMode(), я как мог объяснил. А так вы абсолютно правы. Цифровой вывод 5 (по распиновке Arduino) это 5 вывод порта D. Кроме функций обычного вывода I/O порта к нему привязаны функции Т1 - подсчёт внешних импульсов для таймера/счётчика 1 и OC0B - вывод сравнения таймера/счётчика 0. Последняя функция и позволяет реализовывать на этом выводе
    PWM. Но даташит чётко требует, для использования PWM перевести вывод в состояние OUTPUT, что и выполняется в начале кода. Не буду говорить как поведёт себя PWM при конфигурации ввода на INPUT, как-то не задумывался об этом вопросе, но если необходимо выводом что-то включать, то переводить его в состояние OUTPUT обязательно. Иначе получите на входе ограничение через внутренний pull-up резистор.
     
  8. parovoZZ

    parovoZZ Гуру

    где это написано? Лишние бесполезные действия. По схеме
    upload_2023-3-24_17-21-58.png
    периферия самостоятельно управляет драйвером выходного порта. Достаточно в регистре блока сравнения указать, что он работает на выходную ногу, а не только на прерывание. Тогда сигналы DDOE и PVOE соберутся самостоятельно и регистры DIR и PORT будут отключены от управления выходным драйвером. Также из этой схемы мы видим, что регистр PIN ВСЕГДА подключен к пину. Выключить его можно только на тех пинах, которые подключены к аналоговому мультиплексору для исключения помех от триггера Шмитта на АЦП. Отключение происходит записью в специальный регистр. Не автоматически.
    Если мы не активируем выходной драйвер, нога МК находится в третьем состоянии. Вот такие дела.
     
    Последнее редактирование: 25 мар 2023
    Airbus нравится это.
  9. Airbus

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

    Все правильно ненада
     
  10. a1000

    a1000 Гуру

    Datasheet на ATmega328P страница 70. Описание альтернативных функций порта D.
     
  11. a1000

    a1000 Гуру

    Так в чём суть возникшего разногласия. ТС прямо задал вопрос
    Для ответа на него остальной код смотреть не нужно.
     
  12. Airbus

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

    Да нет никаких разногласий. Я бы тоже также написал бы. Паровоз прав декларировать необязательно. Точно также как необязательно декларировать INPUT но я всегда делаю. Да и подтяжку можно делать по разному. Пишите как удобно именно Вам
     
  13. a1000

    a1000 Гуру

    Я могу ошибаться, но я учился по лекциям этого человека. Да, он не конечная инстанция и может тоже быть не прав. В своих лекциях он рассматривает ATmega8. Возможно в 328 что-то поменяли и регистр DDRx уже не влияет на работу перефирии. Вот видео о работе ТС1. Если лень смотреть его полностью, посмотрите с 13:40. Если не прав, поправьте.

     
  14. Airbus

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

    Как бывший ассемблерщик с Вами ассемблерщиком абсолютно согласен. И с дядькой тоже. С одним уточнением—в асме нет analogWrite/digitalWrite/analogRead/analogRead и многих других фич которые есть в Ардуино IDE. Понимаете куда я клоню?Какие то вещи она делает за програмиста по умолчанию а какие то упрощает до предела.За это я ее и полюбил соскочив сначала с асма а потом с CVAVR с его чистым Си. Дискутировать о регистрам—это к паровозу! За сим откланиваюсь
     
  15. parovoZZ

    parovoZZ Гуру

    Таки да. Посмотрел внимательно - DDOE не привязан к таймеру. Только SPI и TW.
     
  16. a1000

    a1000 Гуру

    Решил проверить на сколько умная Arduino IDE. К D5 через резистор на 220 Ом подключил светодиод. Загрузил пару строк (назвать это скетчем язык не поворачивается)
    Код (C++):
    void setup() {

      pinMode(5, OUTPUT);
      digitalWrite(5, HIGH);
    }
    void loop() {

    }
    Как и ожидалось, светодиод нормально светит. Но стоило закоментировать строку с pinMode, яркость свечения светодиода резко уменьшилась. Функция digitalWrite() на регистр DDRx не действует, а они при старте обнулились и как следствие все выхода оказались в положении INPUT. Выполнив digitalWrite(), мы не подали на ногу 1, а подключили pull-up резистор. А там где-то 20-50 кОм. Так что для digitalWrite() указывать режим работы обязательно.
    Для digitalRead() с одной стороны по барабану в каком режиме нога. Ибо
    Но если пин останется в режиме выхода, мы рискуем либо получить неверное значение, либо вообще спалить порт.
    В функцию analogWrite() перевод пина на выход включен. Тут всё работает не зависимо от предварительно установленного режима пина.
     
    DetSimen нравится это.
  17. Airbus

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

    Так ведь я про это и говорю! А Вы со мною спорите
    Я же дал ссылку на Маркса первоисточник? Тама говорят
    Перевести с Шайтанского?
     
  18. parovoZZ

    parovoZZ Гуру

    что значит в режиме выхода? Сразу после подачи питания или после ресета все регистры (кроме MCUSR) сброшены. А это значит, что все выводы в состоянии входа. Сбрасывать сброшенное бессмысленно. А в каком состоянии находятся пины, определяется смехотехникой.
    Даже если вывод в состоянии выход, его значение всегда можно прочитать регистром PIN.
     
  19. a1000

    a1000 Гуру

    Да я ни разу не против. Никаких споров. Просто решил проверить на железе, ну и не удержался, что-бы не поделиться полученными результатами.;)
     
  20. a1000

    a1000 Гуру

    Да всё правильно, при старте все I/O регистры обнуляются (за MCUSR не знал, спасибо за информацию). Но даже на этом форуме полно примеров когда пытаются объеденить несовместимые куски кода. Вполне вероятно, что может быть попытка применить digitalRead() к пину который в другом куске был поставлен в режим выхода. В лучшем случае мы просто получим из регистра PIN копию регистра PORT. В худшем варианте можно устроить КЗ.