Как оформить в библиотеку периодический процесс?
- Войдите на сайт для отправки комментариев
Не вникая в таймеры. Во-первых больше времени потрачу, во-вторых я вроде как понимаю что настраивается таймер на переполнение некого числа, ну то есть я таймер займу - и всё, это мой таймер, а другим хз как, или как-то считаться с моим периодом этого числа, например делать дела каждое переполнение, каждое четвёртое, каждое 10е и т. д., то есть предделитель от меня, а мои настройки всех главнее и важнее.
Dimax - поправьте, если я блондинка и туплю, и пространство возможностей по таймерам (на одном [same] таймере, например T1) больше, всмысле если после меня его могут настраивать и навешивать свои процессы другие пользователи, и мои процессы не претерпят изменений.
Что надо: bitbang ШИМить один вывод (из 0-A5), который можно высунуть наружу библиотеки, короче сделать некий аналог функции analogWrite() на любой вывод. Я лично хочу обойтись без таймера просто micros() т. к. всё равно частота модуляции там будет 50-100 Гц. Но хз, может быть можно как-то цивильно оформить.
Из того что нашлось соответственно моим желаниям:
1. А чё AF? А можно другое число? А можно не трогать? По-идее всё равно периодом будет полный пробег таймера (задаю любое число, от 0 до 255 где-нибудь да придётся на него, с периодом 1/256)
2. Как этот код влияет на millis()? Начнёт ли цикл фризить системные функции, замедляя время?
3. Если вектор TIMER0_COMPA_vect уже существует, то как корректно дописать в него свой код?
Если у тя в таймере0 будет стоять режим сброс по совпадению, то переполнение никада не наступит. Миллис прекратит свою работу.
Я в таком случае делал прям в прерывании вручную TCNT0=255, тогда прерывание по переполнению срабатывает, только миллис врёть. Но ведь можно не 255 поставить, а число на 1 больше чем то, с чем сравниваешь для совпадения.
То есть если навешивать, то на таймеры T1, T2. Как это сделать чтобы допустим не мешалось другим либам на этих таймерах? Типа Manchester или IRRemote. Или либо то либо то?
А насколько миллис врёт? Как скомпенсировать можно, изменяя его глобальную переменную в прерывании? А то все спрашивают про обнуление миллис, я хоть чот-полезное буду таким макаром делать.
То есть если навешивать, то на таймеры T1, T2. Как это сделать чтобы допустим не мешалось другим либам на этих таймерах? Типа Manchester или IRRemote. Или либо то либо то?
А насколько миллис врёт? Как скомпенсировать можно, изменяя его глобальную переменную в прерывании? А то все спрашивают про обнуление миллис, я хоть чот-полезное буду таким макаром делать.
на Т1 и Т2 навешивать - бессмысленно, все равно некоторые биб-ки эти таймеры под себя меняют .
если Т0 настроен на сброс по совпадению, то чем ближе сравниваемое значение к TOP (0xFF), тем меньше вреть миллис. Это при условии, что делители оставлены как есть. Тут надо выбирать, что хочется, либо интервал, который надо мерить, был как можно более точен, либо миллис.
мне вот надо было срабатывание каждую 1 миллисекунду, у меня значение на совпадение таймера0 OCR1A= 247.
До 255 совсем немного, миллис вреть на (8/255)*100 ( 3% примерно)
Ну и надо в прерывании по совпадению присвоить TCNT0 = 255, чтобы на следующем тике прерывание по переполнению выполнилось.
Хз, тяжело для меня это всё. Пример есть какой-то, 2 кГц на T0 допустим. Но всё равно неясно, как это повлияет на системные функции.
В общем и пики точёные, и х█и др█чёные, а мне бы и сгухой и мёдом обмазаться. Одновременно, без хлеба.
Хотелось бы приспособить как-то под COMPB, там где выполняется tone(). Ибо если tone() отвалится - то меня устраивает, я всё равно подобные вещи делаю снаружи, на 555.
tone живёт на Timer2