Измерение времени

Тема в разделе "Закажу проект", создана пользователем dim3740, 31 янв 2022.

  1. Рокки1945

    Рокки1945 Гуру

    хз - ну тут только по захвату - остальное фигня
     
  2. akl

    akl Гуру

    входная частота очень низкая, тем более скорее всего ее будет задавать человек с кнопки - то есть измерять можно не особо точно - обычное millis() справится. тогда измеряем время между нажатиями, делим на 24 и по таймеру высылаем f8. должно работать более-менее
    измерять нажатия можно двумя вариантами - либо парные нажатия - нажал раз - начался отсчет, нажал два - закончился. Либо непрерывно обновлять измерение, при этом должно быть задано какое-то максимальное время, после которого будет считаться что нажимать дальше не будут (конец серии нажатий).
     
  3. parovoZZ

    parovoZZ Гуру

    Если вы так строите алгоритм работы с UART, то это полное днище, а не алгоритм.
     
  4. a1000

    a1000 Гуру

    Я думал, что так организовует ардуино.
     
  5. akl

    akl Гуру

    это мидюшная команда для синхронизации
     
    issaom нравится это.
  6. liahim55

    liahim55 Нерд

    USART в авр работает независимо от процессора. Достаточно послать данные в UDR (UDR0 = 0xF8 и он без задержки отправит в Tx. Но предварительно в сетапе должно быть Serial.begin().
    Деление на 24 то же прилично времени съедает. Где то видел быстрый алгоритм деления на 3. Так что наверное делить на 3 и сдвигом ввправо на 3 разряда доделить на 8.
    И вместо millis() может лучше напрямую с регистрами.
     
  7. akl

    akl Гуру

    если таймеры по нормальному использовать можно все очень точно и быстро сделать, тем более что тут даже не килогерцы, а сотня герц максимум. Другое дело, что ТС как я понял планирует все это перемещать на другие микросхемы, поэтому не хочет использовать функционал в обход стандартной ардуины. Хотя если знать какие микросхемы, и если это атмеги, то можно заранее предусмотреть, там всего то пара названий регистров будет отличаться.
     
  8. Рокки1945

    Рокки1945 Гуру

    он же сказал атмега8
     
  9. a1000

    a1000 Гуру

    Не знаю как это можно организовать на уровне ардуино, но используя идею
    можно сделать так.
    Atmega 8 запускае на 16 МГц, что-бы считала побыстрее, предделитель таймера 1 на 1024, что-бы насчитал поменьше. На вход ICP1 сенсорную кнопку, что-бы не заморачиваться с дребезгом. UART, что-бы успевал, на скорость 250К или 0,5М. Там и отклонение частоты нулевое.
    По нажатию кнопки падаем в прерывание захвата. Обнуляем счётчик таймера, забираем значение из регистра захвата. Делим и отправляем в UART. Я думаю что при
    будет вполне успевать.
    Первое нажатие, естественно, выдаст фигню.
     
  10. akl

    akl Гуру

    если на кнопку будет нажимать человек, то никаких ICP не нужно, даже вообще без прерываний можно обойтись, нет надобности до наносекунд измерять нажимания человека, таймер лучше использовать только для отправки.

    никакой скорости уарта 250к не получится - это миди и там скорость всегда 31250

    первое нажатие вообще не должно ничего выдавать - оно должно запускать отсчет, а выдавать должны последующие нажатия. заканчивать серию нажатий можно по истечению времени - например если сколько-то секунд не нажимали, тогда следующее нажатие снова станет первым. Ну либо нажимать попарно - первое старт второе измеряет
     
  11. akl

    akl Гуру

    зачем отправлять что-то деленное? отправлять надо F8, причем не абы как, а с определенной частотой. можно сделать и отправку и измерение на одном таймере, но проще на двух разных, причем если жмет человек, то для измерения лучше вообще использовать миллис(), т.к. точность не нужна

    сенсорную кнопку? а как он на нее будет ботинком нажимать?
    в чем проблема заморочиться с дребезгом? достаточно словить первый фронт, а потом 50-100мс не реагировать.