Написать скетч для ардуино для измерения периода времени между нажатиями кнопки и выдачи в СОМ порт фиксированного (0xF8) с частотой, пропорциональной (коэф 24) измеренному периоду. F8 используется для синхронизации подключаемых музыкальных устройств. Без библиотек и таймеров, только через millis(). Больше в скетче ничего не будет. Только пин входа, и TX выхода. Скетч должен потом портироваться на Atmegy 8. Ардуино - для проверки и отладки значений в мониторе. Кнопка, подтянута к плюсу, может иметь дребезг, надо ловить первый перепад. Период нажатия 1 - 4 нажатия в секунду. Пробовал сам, но даже команда Serial.print для отладки в мониторе занимает время процессора и вносит неточность в результаты измерения. До 3 тыс. руб. с частичным авансом. Для проверки на вход вместо кнопки подключаем стабильный низкочастотный генератор. На выходе частотомер должен показать достаточно стабильную и пропорциональную частоту относительно входного сигнала в вышеуказанном диапазоне периодов.
это как-то неопределенно. Какие частоты на выходе предполагаются? - герцы, килогерцы, мега? какая ошибка допустима? Вход вижу: а про выход ничего нет
А вы считаете, что она выполняется за один такт? В мире ардуино привязать прерывание к работе с USART невозможно. Так, что там должно происходить примерно так: Забрасываем ваш байт в UDR (буфер приёма-передачи) Топчемся на месте ожидая флага окончания передачи (TXC) и только потом двигаемся дальше. Пока мы топчемся на месте, приёмо-передатчик USART по одному биту пихает наш байт в линию с частотой в разы меньше тактовой частота микроконтроллера.
дак вроде в ардуине используются прерывания USART_UDRE_vect и USART_RX_vect то есть ничего не топчется.
Как-то я не совсем представляю как туда вставлены прерывания. Представим такой кусок кода Код (C++): int data=300; Serial.println(data); digitalWrite(LED_PIN, HIGH); Переменная data интовая, т.е двухбайтная. Если используются прерывания, то сначала будет передан на отправку один байт. Пока он будет отправляться включится светодиод, а потом программа возвратится к отправке второго байта. Мне как-то не верится. Скорее всего программа будет висеть на Serial.println, пока не отправит всё, и только потом пойдёт дёргать ногу светодиода.
Serial.print напихивает байты в циклический буфер, из которого они отправляются по прерываниям в файле HardwareSerial0.cpp к прерываниям прикреплены соответствующие функции класса и кстати в этом примере будет отправлено 3 байта, т.к. оно преобразует 300 в "300"
Можно вклиниться - задание - "Период нажатия 1 - 4 нажатия в секунду." Считать необходимо время от первого нажатия до повторного - потом это время выплёвывать в уарт.
Используются, только я так понимаю ТС хочет, чтобы 0xF8 прилетал моментально и не входил в интервал полученного измерения. На отправку все равно уйдет время, хоть средствами Arduino Wiring хоть через регистры. В том виде в котором данная задача поставлена она не реализуема в принципе.
я так понял надо не просто что-то выплевывать в уарт, а выплевывать туда 0xF8 через одинаковые промежутки времени, равные измеренному периоду нажатия, деленному на 24
Не сильно разбирался, думал всё устроено попроще. Я, если честно, не совсем понял задачу поставленную ТС. Он, что хочет скетч, который по нажатию кнопки отправлял бы в UART байт 0xF8. Попутно стоит задача измерить промежуток времени между нажатием кнопки и выпаданием флага TXC?
Какие мегагерцы на тухлой аврке? Тут на килогерцах джиттер будет, что мать его. Здесь ПЛИС нужна, а не МК.
я так понял надо измерять время между нажатиями кнопки - типа тап-темпо. и одновременно слать F8 с частотой в 24 раза больше измеренного.