Mega2560 and encoder

Тема в разделе "Arduino & Shields", создана пользователем my_name_Виктор, 24 мар 2024.

  1. Добрый день, уважаемые форумчане!
    Скетч, обрабатывающий вращения энкодера, прекрасно работает с Arduino NANO, Arduino UNO.
    Вопрос: Как нужно изменить код скетча, чтобы энкодер можно было подключить ко второму и третьему пинам MEGA2560 соответственно?

    Код (C++):
    /*
        Rotary Encoder - Interrupt Example

        The circuit:
          encoder pin A to Arduino pin 2
          encoder pin B to Arduino pin 3
          encoder ground pin to ground (GND)
    */

    #include <Rotary.h>
    Rotary r = Rotary(2, 3);

    int n;

    void setup() {
      Serial.begin(9600);
      r.begin();
      PCICR |= (1 << PCIE2);                    
      PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
      sei();

      n = 0;
    }
    void loop() {
      for (int i = 0; i <= 9; i++) {
        lcd.setCursor(8, 1); lcd.print(i);
        delay (1000);
      }
    }
    ISR(PCINT2_vect) {
      unsigned char result = r.process();
      if (result == DIR_NONE) {
        // do nothing
      }
      else if (result == DIR_CW) {
        n = n + 1;
        Serial.println(n);
      }
      else if (result == DIR_CCW) {
        n = n - 1;
        Serial.println(n);
      }
    }
     
  2. P.S. Совершенно не обязательно энкодер должен подключаться ко второму и третьему пинам.
     
  3. parovoZZ

    parovoZZ Гуру

    это викторина?
    Всё же просто!
    Ответ: код скетча нужно изменить так, чтобы энкодер можно было подключить ко второму и третьему пинам MEGA2560 соответственно.
     
    DetSimen и my_name_Виктор нравится это.
  4. :) Я тоже люблю юмор! Это не викторина!
    Ну а если переформулировать так: Что нужно изменить в коде скетча, чтобы этот скетч работал загруженный в Мегу2560?
    Я действтельно не знаю. У меня не получается сделать так, чтобы он работал на Меге2560! Поэтому и вышел с вопросом на форум.
    Иногда простое кажется сложным, иногда - наоборот!
     
  5. parovoZZ

    parovoZZ Гуру

    Надо взять даташит на 2560 и посмотреть, на каких pcint сидят 2 и 3 пины. Разобраться, за что отвечает регистр pcie2. Возникнут вопросы - велкам.
    Я 2560 никогда не занимался, поэтому тоже надо смотреть шпору))
     
  6. Ariadna-on-Line

    Ariadna-on-Line Гуру

    1. Скетч не компилируется для 2560-ой, или вы не знаете куда тыкать энкодер ?
    2. Не понял. Вам нужно именно 2 и 3 пины ? Или нужно чтобы данный код вообще работал?
    3. Сомнительно, что код рабочий. Используется LCD, но он никак не прописан в коде. Ни инициализации, ни конфигурации. ))))))
    По логике вещей - если скетч не менять - то для 2560-ой PCINT18, 19 - будут пины А10, А11.
    Если вам непременно нужны 2 и 3 пин, то код надо переделывать под использование INT4, INT5
    ПС. Выкинул LCD и скомпилил для А10, А11. Работает
    ППС. Никогда не имел дела с 2560-й.
     

    Вложения:

    • Без.png
      Без.png
      Размер файла:
      34,1 КБ
      Просмотров:
      48
    Последнее редактирование: 25 мар 2024
  7. Я вообще-то задал конкретный попрос по конкретному коду.
    Если с МЕГОЙ2560 не работали и не знаете ответ на мой вопрос, что же.... Спасибо за участие в обсуждении! Успехов!
     
  8. 1. Код компилируется и загружается. Энкодер подключается ко второму и третьему пинам.

    2. Данный код использует библиотеку. Он хорошо работает на UNO или NANO. Когда я загрузил его в MEGA2560 (там на 2 и 3 пинах так же как и в UNO "сидят" прерывания 0 и 1) код не стал работать. Мне это стало интересно почему он не работает в МЕГЕ.

    3. Код 100%-но рабочий. Что касается LCD, неактуально. Просто забыл удалить при вставке в пост форума.

    Вы это сделали именно с этим кодом и именно на MEGA2560?

    Я написал код без библиотеки, старым проверенным способом с использованием "attachInterrupt(0, int0, CHANGE); " и "attachInterrupt(0, int1, CHANGE);" с прерыванием на втором и третьем пинах, без библиотек. всё работает хорошо.
     
    parovoZZ нравится это.
  9. parovoZZ

    parovoZZ Гуру

    Программирование - это не про знания.
    Программирование - это про логику.
    Логика управления энкодером понятна? Если понятна, то берём даташит на выбранный проц и пишем код. Если не понятна - сперва разбираемся с ней.
     
  10. parovoZZ

    parovoZZ Гуру

    энкодер оптический, без дребезга?
     
  11. Да. обычный механический. Из Поднебесной.
    Энкодер.jpg
     
  12. parovoZZ

    parovoZZ Гуру

    видимо, обработка дребезга спрятана в process().
     
  13. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Именно с этим кодом, но как уже сказал - изменил 2,3 пины на пины А10, А11. Потому что в 2560-й PCINT18, 19 находятся на этих пинах. А что на 2560-й - вы видели на картинке. Это скрин симулятора Протеус 8.6 Реальной 2560й у меня нет и не было.
    #include <Rotary.h>
    Rotary r = Rotary(A10, A11);
     
    Последнее редактирование: 25 мар 2024
  14. parovoZZ

    parovoZZ Гуру

    Глянул разблюдовку кристалла 2560. Прерывание PCINT доступно далеко не на всех выводах. На портах А и С нет точно. На INTx тоже нет. Поэтому если делать на прерываниях, то вот так
    в данном контексте вопроса является единственным решением.
     
    my_name_Виктор нравится это.
  15. Видимо придётся поверить вам на слово. Проверил на реальной MEGA2560 - не получилось.
    Но, как говорят, "отрицательный результат - тоже результат.
    Придётся остановиться на старом дедовском методе, без библиотеки.
     
  16. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Спецом ради вас еще раз нарисовал и запустил. Работает. Вот сосканировал видео.
    ПосмОтрите - напишите. Удалю чтоб не жрало память на сервере.
     

    Вложения:

    • RqqP9jRxzr.zip
      Размер файла:
      485,6 КБ
      Просмотров:
      43
    Последнее редактирование: 25 мар 2024
  17. Спасибо. Посмотрел. На реальном железе у меня не работает. Если не пойму почему, сниму видео и выложу.

    До встречи на форуме.
     
  18. Да! Этот скетч работает на пинах A10, A11 MEGA2560.
     
  19. b707

    b707 Гуру

    Нет, это не так. В Уно на пинах 2 и 3 сидят прерывания 0 и 1, а в Меге на этих же пинах - прерывания 4 и 5. Поэтому у вас и не работает.

    А вообще, не работайте напрямую с номерами прерываний, это неправильно. Используйте функцию pinToInterrupt()
     
    my_name_Виктор нравится это.

  20. Оспаривать ваши утверждения я не буду, но тень сомнения в них всё-таки есть.
    1. Я использую скетч для обработки энкодера в Меге2560 в котором, как я уже писал выше, используется функция "attachInterrupt(0, int0, CHANGE)"
    и "attachInterrupt(0, int1, CHANGE)". Энкодер подключен к пинам 2 и 3.
    2. Часто в интернете (в частности на сайте "Arduino.ru" можно встретить такую информацию:
    1.jpg
    https://arduino.ru/Reference/AttachInterrupt
    3. На сайте "amperka.ru" представлена такая информация: 2.jpg
    https://amperka.ru/product/arduino-...tm_campaign=arduino-mega-2560&utm_medium=wiki

    Не сочтите мои сомнения, как покушение на Ваш авторитет, но право сомневаться имеет каждый.
    Как известно "Практика - критерий истины"
    За участие в обсуждении и совет спасибо!