На какой таймер вешать кнопку?

Тема в разделе "Arduino & Shields", создана пользователем UnSstrennen, 19 авг 2018.

  1. UnSstrennen

    UnSstrennen Нерд

    Умные люди подсказали, что прерывания - вещь нестабильная и следует юзать прерывания по таймеру для опроса кнопок.
    На какой таймер лучше вешать кнопку (1, 2, 3) и почему?
    Если кто сталкивался, подскажите оптимальную частоту опроса.
    Предполагаю что это 20Гц
     
  2. DIYMan

    DIYMan Guest

    Да вообще вся Вселенная - вещь нестабильная, чо уж там: энтропия, все дела. Нормально всё с прерываниями у нормальных МК, вполне себе стабильно. Есть нюансы, но, как обычно - в даташитах всё перетёрто.
     
  3. parovoZZ

    parovoZZ Гуру

    В абдурино первый таймер занят, третий тоже в какой-то библе светится. Поэтому "почему" вопрос не уместен.
     
  4. Daniil

    Daniil Гуру

    доверяй, но проверяй.
    Смотря какой код и схемотехника
     
  5. parovoZZ

    parovoZZ Гуру

    И в чем же заключается нестабильность?
     
  6. DetSimen

    DetSimen Guest

    Просто пристрели их, и читай умные книшки.
     
    Daniil и vvr нравится это.
  7. SergeiL

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

    Интересно, чем это занят первый таймер? :)
    На нулевом millis() висит. ;)
    Если через библиотеки - есть такая: TimerOne.h
     
  8. DetSimen

    DetSimen Guest

    Я вполне себе использую 0 таймер, не шыбко-то и мешая millis()-у.
    Единственно что, на Atmega 8 нулевой таймер не имеет прерывания по сравнению, приходится с первым работать.

    Вот из проекта выдрано.
    Код (C++):
    #include "TTimerList.h"
    #include "TButton.h"

    #define ACTIVE_LOW  true
    #define ACTIVE_HIGH false


    extern TTimerList TimerList;


    TButton btnManual(9, ACTIVE_LOW);   // кнопка на 9-м пине, 0 - нажата

    THandle hReadButton = INVALID_HANDLE;     // хэндл для таймера чтения кнопки


    void tmrReadButton(void) {     // таймер.  срабатывает каждые 25 миллисекунд.
        btnManual.Read();          // чтение кнопки
    }


    void setup(void) {

        if (hReadButton == INVALID_HANDLE) {
            hReadButton = TimerList.Add(tmrReadButton, 25);  // раз в 25 миллисекунд читаем кнопку
        }
    }

     
    а кнопка потом сама генерит событие нажатия. Заметь, даже loop() нету, всё асинхронна.
     
    Последнее редактирование модератором: 20 авг 2018
    Mitrandir и arkadyf нравится это.
  9. Ум так и прет.
     
  10. parovoZZ

    parovoZZ Гуру

    От того, что он называется Timer0, он нулевым по счету не стал. Он первый.
     
  11. parovoZZ

    parovoZZ Гуру

    у меня даже setup нету. Слишком оне прожорливоё.

    как это? В атмеге8 асинхронный Timer2.
     
  12. DetSimen

    DetSimen Guest

    имеется ввиду, нажатие кнопки происходит асинхронно со всей остальной программой, ни к чему не привязано, кроме таймера0. Можно в лупе хоть преобразование Фурье считать, хоть рендерить свою дачную лужайку, если прерывания не запрещены - событие от кнопки всё равно сработает.
     
    Limoney и arkadyf нравится это.
  13. parovoZZ

    parovoZZ Гуру

    скажем так - прерывание отработает. А вот дойдет ли до события - вопрос к программисту)))
     
  14. Limoney

    Limoney Гик

    Datasheet заглядывали, или как всегда....
     
  15. parovoZZ

    parovoZZ Гуру

    По твоей логике там 2 таймера? Или все-таки три? Который из них третий?
     
  16. SergeiL

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

    Вы тут людей не путайте, они и сами запутаются. :)
    Таймер0 - это нулевой таймер.
    Таймер1 - это первый.
     
    Limoney и arkadyf нравится это.
  17. Limoney

    Limoney Гик

    как в datasheet указана нумерация такой и номер таймера.
     
    Последнее редактирование: 23 авг 2018
    arkadyf нравится это.
  18. parovoZZ

    parovoZZ Гуру

    Таймер ноль
    Таймер один
    но уж никак не нулевой и не первый.
    Счет в русском языке начинается с единицы, а не с нуля.
     
  19. Limoney

    Limoney Гик

    Ты в трезвом состоянии был, когда писал? Может на измерительную шкалу посмотришь линейки, вольтметра, амперметра.
     
  20. SergeiL

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

    @parovoZZ не позориться! :)

    У Тех, кто пишут на чистом "Си" - все начинается с "0" ! ;)