Вопрос про delay и millis в Ардуино

Захотелось тут со звуком в ардуинке побаловаться. Кое-что делал раньше, моргал диодами через delay.
А тут хочется несколько звучков с разных выходов снять, tone этого не позволяет.
Delay тоже, millis вроде как позволяет. Но тут лингвистическая затыка возникла : везде пишут что команда millis возвращает значение милисекунд, но куда, кому и зачем- в справочниках не разъясняется. А потому я не могу правильно представить схемку работы алгоритма.
Я понял так что delay считает время от нуля до необходимого значения, а millis- наоборот, от максимального до нуля, поэтому нет необходимости останавливать работу ардуинки на это время. Может кто подскажет, заранее большое спасибо.

Вы смотрите срез комментариев. Показать все
7
Автор поста оценил этот комментарий

Частоты проще генерить взведя какой-нибудь таймер и не юзая перечисленные функции. Берёшь свободный таймер, ставишь его в CTC-mode, грузишь ему в OCR величину периода. Потом либо пищалку вешаешь на его выходной пин, либо настраиваешь прерывание и уже оттуда пин переключаешь. А вот уже по delay можно подсовывать ему в OCR нужные значения.

раскрыть ветку (9)
3
Автор поста оценил этот комментарий

Ох, как вы по-адруински шпарите!

1
Автор поста оценил этот комментарий

Мне бы на уровне муму хочет нямням  объяснение :-) .  Но за ответ спасибо.

раскрыть ветку (4)
4
Автор поста оценил этот комментарий

Дело в том, что задержки по delay и millis (про tone не знаю) не дают выполняться никакому другому коду, кроме того, что в цикле ожидания. У таймеров в микроконтроллере есть режим CTC - таймер с настроенной входной частотой считает до значения в своём регистре OCR, обнуляет свой счётчик и выполняет какое-то действие (дрыгает ногой или дёргает прерывание). Можно сделать структуру с двумя свойствами: частота и длительность. Если частота 0 - пауза. Если частота не 0 - пересчитываем в период и загружаем в OCR,  а значение длительности можно пихнуть и в delay_ms или настроить второй таймер тикать каждую миллисекунду. В таком раскладе у нас мелодия будет воспроизводиться в "фоновом" режиме, не мешая выполняться остальному коду. Беда стандартной библиотеки ардуины в том, что стыковать разные задачи в коде, юзая только delay/millis/etc. - нетривиальный секс.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Функция tone-  вообще лишняя,  все останавливает. Только если пищалку какую сделать.

Спасибо за ответ,  он мне реально полезен.

2
Автор поста оценил этот комментарий

Посмотри, какой контроллер стоит в твоей ардуино и скачай даташит по нему - там всё расписано про таймеры. Да, на английском. Да, сложно понять. Но когда раскуришь что там и как - вообще проблем не будешь знать и сможешь даже псевдо-многозадачность организовать, да и вообще кунг-фу по ардуине прокачаешь в разы.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Спасибо :))

Автор поста оценил этот комментарий

Вообще-то все началось с того что сдох у меня синтезатор Маэстро на советском процессоре с памятью,  зашитой  методом пережигания перемычек.  Как раз через таймеры звук выводится. Процессор рабочий оказался.  Содержимое прошивки микросхем я прочитал,  сваял схемку для  этого.  Дампы памяти в интернете есть, но чего-то совсем другое. Морока получается не для моего уровня знаний  и технического оснащения- программатор надо делать или искать кого,   в любом случае гарантированного результата не видно.. Вот и захотелось c ардуинкой  поиграться.

раскрыть ветку (2)
2
Автор поста оценил этот комментарий

Вообще, я сейчас задумался: если процессор рабочий, а память - однократно программируемая ПЗУ, то оно должно работать. Тут надо бы посмотреть исправность тактирования процессора и прочие цепи.

2
Автор поста оценил этот комментарий

Вероятно, найдётся совместимая УФ-стираемая ППЗУ. Её программатор можно будет и на ардуинке наваять, только, возможно, потребуется отрицательное напряжение питания на подложку. Но его можно на charge pump организовать. Тогда можно будет восстановить максимально близко к оригиналу.

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку