Вообще-то в "классической ардуино" трогать таймеры по собственному усмотрению (а тем более с прерываниями) НЕ КОРРЕКТНО. На их основе часть функционала IDE отрабатывается - delay, millis, micros - T0; tone - T2; analogwrite - в зависимости от выводов используют T0, T1 и Т2; ... Использование за рамками предустановленных функций черевато непредсказуемыми проблемами.
Как варианты решений - использование переменной со значением micros (чтение-запись и сравнение с предыдущим значением) для частот выше 65КГц. При частоте 31Гц - 65КГц удобно использовать тандем tone() и прерывания по INT0/INT1.
Ну уж если "никак без самодеятельности" - делаем программу ПОЛНОСТЬЮ ПОД СТАНДАРТНЫМ Си (или АССЕМБЛЕРОМ).
500 кГц ?! Ха-ха. Когда у вас МК будет что-то другое делать, кроме как в прерывание заходить? Он тупо больше ничего и не успеет сделать, будет всё время в прерывании таймера вашем висеть. Ну почти, но конечно на всякие остальные вещи тупо не хватает времени. МК на 16 МГц, прерывание 500 кГц = 32 тика между прерываниями всего. Компилятор в функции ISR сохраняет/восстанавливает регистры и сам вход в прерывание что-то занимает. Вы просто не оставляете МК шансов заниматься чем-то еще, кроме обработки прерывания по сути.
Ставьте частоту ниже, нафига вам там 500кГц светодиодиком мигать.
PS: Такие вещи, как дрыганье ножкой с определенной частотой решается аппаратным ШИМ. Банально analogWrite в Arduino и ресурсы CPU не расходуются после установки режима.
Последний раз редактировалось NStorm Вт фев 25, 2020 21:04:35, всего редактировалось 1 раз.
500 кГц ?! Ха-ха. Когда у вас МК будет что-то другое делать, кроме как в прерывание заходить? Он тупо больше ничего и не успеет сделать, будет всё время в прерывании таймера вашем висеть. Ну почти, но конечно на всякие остальные вещи тупо не хватает времени. Ставьте частоту ниже, нафига вам там 500кГц светодиодиком мигать?
Ну Serial.write() вполне себе же успевает работать.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
FuseStart, подумайте чем write от read отличается и кто задает "темп" работы. Как минимум. Ну и сами реализации этих функций в либах ардуино тоже вопрос. Я выше дополнил ответ про 32 тика. Это очень мало. Попробуйте поставить, скажем 1 кГц - и если всё заработает, значит я прав.
подумайте чем write от read отличается и кто задает "темп" работы
На всякий случай поясню. Не заглядывая в исходники реализаций класса Arduino в общем случае думаю как отправка работает - строка в буфер легла и начинает по байту отправляться записываясь в UDR. Ушел байт - пошел следующий и т.д. Клоки соблюдаются, т.к. передача аппаратная. Прерывания могут не использоваться, т.к. метод афаик блокирующий. А приемка по прерыванию. Но вот надо успеть достать символ в буфер пока следующий не пришел, т.к. уже не мы отправляем. А тут у нас вклинивается прерывание таймера - запросто пропускаем какое-то из прерываний входящих данных UART, не успеваем выпуливать их в буфер и т.д.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
... PS: Такие вещи, как дрыганье ножкой с определенной частотой решается аппаратным ШИМ. Банально analogWrite в Arduino и ресурсы CPU не расходуются после установки режима.
К сожалению аппаратный ШИМ (analogWrite) имеет ФИКСИРОВАННУЮ частоту примерно в 490Гц.
Так что "любителям 500КГц остается только "дрыголап".
Можно конечно и чего поинтереснее - но то нужен МК с PLL - чего-то типа attiny25/45/85(тактирование Т1 от 64МГц или 32МГц) и не под компилятором ардуино, а под чистым ассемблером или чистым Си.
BOB51, ну на таймере 1 и 2 можно и 500 кГц сделать меандр без ногодрыга. В общем-то даже ардуиновские либы вроде какие-то были для этого, хотя можно и ручками настроить, если знать, что больше эти таймеры нигде не будут другим кодом использоваться.
Можно, но не для начинающего. И выход должен быть не по прерыванию, а аппаратный.
А тут похоже еще с самой задачей у топикстартера "потемки".
Собственно уже ранее много раз говорено - адуринка хороша для обработки данных, получаемых от "периферии с мозгами". Или отправки данных в подобные "мозговитые" блоки. Как вариант - типовые протоколы или их заменяющий "программный ногодрыг" в разумных пределах. Иначе - работаем "по старинке" с "чистыми компиляторами" и даташитом.
Глубококопатели рассматривали случай, когда используется второй OCRnn. Только вот какой УЖЕ задействован, а какой СВОБОДЕН - то рыть в дебрях IDE надо.
Я ж поэтому и написал "если знать, что больше эти таймеры нигде не будут другим кодом использоваться.". Не вижу, чтобы ТС пользовался tone. Что tone также использует таймер2 вы сами уже написали ранее. Если это держать в голове (а оно как бы вообще надо держать в голове то, что пишешь ), то всё будет ок.
Кстати... Ещё одна капушка в пользу "не выходить за рамки" предоставляемые функционалом IDE. В рамках ардуиноподобных используются платформы на основе различных семейств МК. Там и esp8266 и ARMы разнообразные и интеловские МП, а не только атмега328Р используются. Исходники программы, написанной в рамках "референса" будут одинаково работать на любой из применяемых для IDE платок. А вот те, что "заточены под эксклюзив аппаратной части" - создадут весьма большие затруднения при смене/переносу на другую платформу. Это как программа для ПК - или работает на любой материке или жёстко привязана к аппаратной начинке конкретной платы.
BOB51, ну как правило когда пишут на ардуино - пишут разовую поделку для себя и точно знают на чем она будет работать. А в универсальных штуках и либах в мире ардуино это всё-равно решается пачкой #ifdef'ов для платформозависимого кода. Всё-равно он (зависимый от платформы код) где-то нужен.
Итак, задача. Надо получить 4 независимых канала , генерирующие прямоугольные импульсы. Параметры импульсов нужно менять посылкой команды на ардуино через Serial. Первые два канала: Длительность импулсов от 55 до 120 мкс. Период должен меняться от 560 до 13104 мкс с шагом в 128 мкс.
Вторые два канала, по просто ШИМ. Важно только, чтобы кол-во шагов было не 256, а 1024.
Я думал, что сделаю таймер на 500 кГц, а в теле события таймера будут считать, сколько тиков прошло, и соответственно буду включать 0 или 1 на нужном пине.
Пишем на чистом ассемблере или на чистом Си и не имеем проблем. Да и ардуина там не особо нужна. один независимый канал=одна тини2313 (таймер Т1) С ШИМами можно и одной корпусиной обойтись. Это ежли аппаратные использовать. Программные также допустимы, но там уже явно ассемблер потребуется.
FuseStart, на ардуино уже тикает таймер каждые 4 мкс. Если планируется использовать ардуино, то использовать micros() тогда. Но кратность будет 4мкс соотв + все задеркжи от промежуточного кода. Если нужно точнее - на 8-битном AVR только без ардуино если писать. Или брать ESP8266/ESP32 и из того же ардуино можно будет и ногодрыгом успевать. Ну или в сторону STM32 смотреть.
Первые 2 канала у вас в общем-то тоже ШИМ по-сути.
Книжку по архитектуре МК AVR в зубы и вперёд. Ардуино и форумы не учителя ни разу. Генератор сигналов на МК подразумевает прерывания от таймеров формирующих сигнал. И любое другое прерывание ломает сигнал. Это означает, что другие прерывания нельзя использовать. К примеру, прерывания от uart. Если генератор сигнала, значит все остальное только в основном цикле. Либо только в единственном случае. Когда нет генерации сигналов.
Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 35
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения