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

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

  1. dim3740

    dim3740 Нерд

    Написать скетч для ардуино для измерения периода времени между нажатиями кнопки и выдачи в СОМ порт фиксированного (0xF8) с частотой, пропорциональной (коэф 24) измеренному периоду. F8 используется для синхронизации подключаемых музыкальных устройств.

    Без библиотек и таймеров, только через millis(). Больше в скетче ничего не будет. Только пин входа, и TX выхода. Скетч должен потом портироваться на Atmegy 8. Ардуино - для проверки и отладки значений в мониторе.

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

    Пробовал сам, но даже команда Serial.print для отладки в мониторе занимает время процессора и вносит неточность в результаты измерения.

    До 3 тыс. руб. с частичным авансом.

    Для проверки на вход вместо кнопки подключаем стабильный низкочастотный генератор. На выходе частотомер должен показать достаточно стабильную и пропорциональную частоту относительно входного сигнала в вышеуказанном диапазоне периодов.
     
  2. b707

    b707 Гуру

    это как-то неопределенно. Какие частоты на выходе предполагаются? - герцы, килогерцы, мега? какая ошибка допустима?
    Вход вижу:
    а про выход ничего нет
     
  3. Рокки1945

    Рокки1945 Гуру

    не учли погрешность и время обработки дребезга - программного естсвенннно
     
  4. sser

    sser Гик

  5. akl

    akl Гуру

    чтоб нормально было придется использовать прерывания и таймер. и прерывания по таймеру
     
  6. sser

    sser Гик

    Там нужно и библиотеки ещё писать, т.к этот скетч должен с ардуино на Атмегу8 ставиться.
     
  7. Рокки1945

    Рокки1945 Гуру

    да не - там же есть old - да таймер по захвату
     
  8. a1000

    a1000 Гуру

    А вы считаете, что она выполняется за один такт? В мире ардуино привязать прерывание к работе с USART невозможно. Так, что там должно происходить примерно так:
    Забрасываем ваш байт в UDR (буфер приёма-передачи)
    Топчемся на месте ожидая флага окончания передачи (TXC) и только потом двигаемся дальше.
    Пока мы топчемся на месте, приёмо-передатчик USART по одному биту пихает наш байт в линию с частотой в разы меньше тактовой частота микроконтроллера.
     
    issaom нравится это.
  9. akl

    akl Гуру

    дак вроде в ардуине используются прерывания USART_UDRE_vect и USART_RX_vect
    то есть ничего не топчется.
     
  10. a1000

    a1000 Гуру

    Как-то я не совсем представляю как туда вставлены прерывания.
    Представим такой кусок кода
    Код (C++):
    int data=300;
    Serial.println(data);
    digitalWrite(LED_PIN, HIGH);
    Переменная data интовая, т.е двухбайтная. Если используются прерывания, то сначала будет передан на отправку один байт. Пока он будет отправляться включится светодиод, а потом программа возвратится к отправке второго байта. Мне как-то не верится.
    Скорее всего программа будет висеть на Serial.println, пока не отправит всё, и только потом пойдёт дёргать ногу светодиода.
     
  11. akl

    akl Гуру

    Serial.print напихивает байты в циклический буфер, из которого они отправляются по прерываниям
    в файле HardwareSerial0.cpp к прерываниям прикреплены соответствующие функции класса

    и кстати в этом примере будет отправлено 3 байта, т.к. оно преобразует 300 в "300"
     
    issaom нравится это.
  12. akl

    akl Гуру

    вот если циклический буфер переполнится - тогда вроде будет ждать.
     
  13. Рокки1945

    Рокки1945 Гуру

    Можно вклиниться :D - задание - "Период нажатия 1 - 4 нажатия в секунду."
    Считать необходимо время от первого нажатия до повторного - потом это время выплёвывать в уарт.
     
  14. issaom

    issaom Гуру

    Используются, только я так понимаю ТС хочет, чтобы 0xF8 прилетал моментально и не входил в интервал полученного измерения. На отправку все равно уйдет время, хоть средствами Arduino Wiring хоть через регистры. В том виде в котором данная задача поставлена она не реализуема в принципе.
     
  15. akl

    akl Гуру

    я так понял надо не просто что-то выплевывать в уарт, а выплевывать туда 0xF8 через одинаковые промежутки времени, равные измеренному периоду нажатия, деленному на 24
     
  16. a1000

    a1000 Гуру

    Не сильно разбирался, думал всё устроено попроще.
    Я, если честно, не совсем понял задачу поставленную ТС. Он, что хочет скетч, который по нажатию кнопки отправлял бы в UART байт 0xF8. Попутно стоит задача измерить промежуток времени между нажатием кнопки и выпаданием флага TXC?
     
  17. parovoZZ

    parovoZZ Гуру

    Какие мегагерцы на тухлой аврке? Тут на килогерцах джиттер будет, что мать его. Здесь ПЛИС нужна, а не МК.
     
  18. akl

    akl Гуру

    я так понял надо измерять время между нажатиями кнопки - типа тап-темпо. и одновременно слать F8 с частотой в 24 раза больше измеренного.
     
    issaom нравится это.
  19. Рокки1945

    Рокки1945 Гуру

    F8 - это же преамбула просто
     
  20. Рокки1945

    Рокки1945 Гуру

    ну конечно - тем более аврка аппаратно не умеет делить