код для КНОПОК - помогите разобраться

Тема в разделе "Микроконтроллеры AVR", создана пользователем Alexandro77, 26 сен 2019.

Метки:
  1. Asper Daffy

    Asper Daffy Иксперд

    Не нашёл, похоже я тогда забыл выложить. Но, нашёл черновик двухлетней давности и выложил сейчас.
     
    Andrey12, Daniil, akl и 2 другим нравится это.
  2. SergeiL

    SergeiL Оракул Модератор

    Вот решил проверить millis:

    Код (C++):
    void setup() {
      Serial.begin(115200);
    }
    void loop()
    {
      static uint32_t prev_mill=0;
      uint32_t        result_mill=0;
      result_mill= millis() - prev_mill;
      prev_mill=millis();
        if( result_mill > 1)
        {
          Serial.println(result_mill,HEX);
        }
    }
    Код (Text):
    35
     
  3. Asper Daffy

    Asper Daffy Иксперд

    Не верю. Сам только что перепроверял (см здесь), всё нормально пропускает. И дело не только в практике - просто из кода миллиса понятно, что она должна пропускать примерно каждое 42-ое число. Ищите проблему. Может скорость монитора не та и туда ни хрена не печатается или ещё чего. Или может, Вы когда-то wiring сами меняли и у Вас миллис "самогонный", но так быть не должно.
     
    Andrey12 и DetSimen нравится это.
  4. SergeiL

    SergeiL Оракул Модератор

    Я на ESP запустил. Там частота выше :).
     
  5. DetSimen

    DetSimen Guest

    Так нечесна.
     
    Andrey12 и Asper Daffy нравится это.
  6. b707

    b707 Гуру

    да...я был уверен, что Аспер Даффи совсем другой участник :)
    .упс :)
     
    KindMan нравится это.
  7. DetSimen

    DetSimen Guest

    Та Вы шо, Петровича не признали? Бахатым будет. :)
     
    Andrey12 и KindMan нравится это.
  8. akl

    akl Гуру

    это неспроста
     
    Daniil нравится это.
  9. SergeiL

    SergeiL Оракул Модератор

    Код (Text):
    35
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2

     
     
  10. SergeiL

    SergeiL Оракул Модератор

    Почему? Перечитал начало темы - про железо не было ни слова.
    Только код на Си и Ардуино. Так и есть :).
    Да просто интересно стало как будет millis себя вести на более быстром процессоре.
     
    Последнее редактирование: 23 ноя 2019
  11. offigate

    offigate Нерд

    Прерывание через 1.024 мс, а не через 1 мс - это заморочки конкретного семейства процессоров. А пропуск некоторых значений millis(), чтобы получить в среднем более-менее правильное значение в миллисекундах - соответствующий этой заморочке костыль. В процессорах, способных выдавать прерывание точно раз в миллисекунду, millis() будет выдавать все значения, без пропусков.
     
  12. offigate

    offigate Нерд

    Все-таки можно. Проверочный код:
    Код (C++):

    #define SIGN(x)  (x & 0x80)
    byte ts, ms;
    void setup(void)
    {
        ts = 0;
        Serial.begin(115200);
    }

    void loop(void)
    {
        ms = (byte)millis();
        if ((SIGN(ts) == SIGN(ms)) && (ms >= ts))
        {
            ts = ms + 10;
            Serial.println(ms);
        }
    }
     
    Распечатка:
    0
    10
    20
    30
    ...
    230
    240
    250
    4
    14
    24
    ...
    234
    244
    254
    8
    18
    28
    и т.д.
     
  13. offigate

    offigate Нерд

    "Учите матчасть" (с)
     
  14. b707

    b707 Гуру

    ага - отработку знака добавили, лишнее условие - лишь бы не признавать очевидное
    Читерство чистой воды.
     
    SergeiL и DetSimen нравится это.
  15. offigate

    offigate Нерд

    Ваша формулировка допускает разные толкования. Вы можете уточнить, что именно надо признавать? И не забудьте перечитать #68. "Перечитать" - потому что в #72 вы на него отвечали. Правда, тот ваш ответ содержал ложное утверждение, что я якобы "доказываю. что в данном конкретном коде все отлично" (не знаю, может, вы перепутали и мне ответ #23 приписали). Так что перечитайте #68 несколько раз, пока не поймете, что там написано, и скажите, что именно я должен признать.
     
  16. Asper Daffy

    Asper Daffy Иксперд

    Конкретно для 10 - можно, а вот если другое чего :( Проверочный код: замените у себя 10 на 1 и запустите.

    Так что, всё-таки нельзя. Вернее, можно, наверное, для известной категории граждан: им и закон-то не писан, не то, что правила арифметики.

    В общем,
     
    Andrey12 нравится это.
  17. Asper Daffy

    Asper Daffy Иксперд

    b707,
    помните, что я вчера говорил:
    Оно? :)
     
    Andrey12 нравится это.
  18. akl

    akl Гуру

    учитывая что тема находится в разделе "авр" и вообще под ардуино чаще всего подразумевают атмегу328, всякие вемосы надо рассматривать скорее как исключение ящитаю
     
    Andrey12 нравится это.
  19. ИгорьК

    ИгорьК Гуру

    Ожидал подобной фразы с момента вашей регистрации, даже написал вам личное сообщение с просьбой бережно относиться к форуму, не так ли?
     
    Andrey12 нравится это.
  20. offigate

    offigate Нерд

    С этим вполне можно согласиться. Но на платформе AVR можно поставить такой кварц, что millis() будет отрабатывать каждую миллисекунду, а не раз в 1.024 мс. Ну а выдавать свойства конкретной платформы Ардуино за "правила арифметики" - это как называется? Иксперд изобрел новую арифметику, что ли?