akl, пробовал и так на разницу не влияет. это влияет на подсёт милис только. на делей функцию ни как.
это первое.
второе почему некоторые пишут минус один а некоторые нет.
я склоняюсь что не надо минус один. зачем ?
по формуле у меня 1мс ровно 250 тиков.
если у меня в OCR было например 5 то ровно 250 это 5+250 ане 249.
или другой простой пример
veso74, формулу я знаю. а на тех сайтах помимо формулы есть человеческий фактор который отнял еще единицу. это не даташит.
еслиб это был массив то да массив длиной 250 это с 0 до 249. но мы же тики считаем а не количество элементов в массиве
выше я привел простой пример 10 тиков с нуля. в конце наш "ОСR" (переменная а) имеет 10. а регистр OCR (8 бит ) ни чем не отличается от этой переменной.
[uquote="alex68md",url="/forum/viewtopic.php?p=4222064#p4222064"]...почему некоторые пишут минус один а некоторые нет.
я склоняюсь что не надо минус один. зачем ?[/uquote]
akl, точно. теперь понятно откуда ноги растут. спасибо. но всёравно не всётак однозначно. точнее нельзя все случаи мести под одну гребенку. тобишь в большинстве случае все эти калькулятора где есть минус один тоже неправильные имхо.
сейчас объясню почему
когда у нас делитель 1 и каждый реальный тик процессора равен реальному тику в TCNT тогда да получается надо отнять единицу согласно вашей фото из даташита. НО в большинстве случаев у всех стоит предедлитель. когда счётчик тикает в 64 или даже в 1024 раз реже чем реальный тик процессора.
и выходит у нас есть погрешность в обоих случаях.
НО делая минус один мы делаем погрешность намного больше чем когда не делаем минус один. т.к.
при делителе например 64
минус один получается погрешность 1*64 - 1 = на 63 реальных тика _раньше_ нашей частоты.
без минус один у нас погрешность всего лиш на один реальный тик _позже_ нашей частоты.
ну из этих двух вариантов лучше меньшее зло т.е. без минуса.
правильно я мыслю?
наша частота - эта та ради который мы и выставляли предделитель и OCR
PS: а если предделитель 1024 так там еще больше погрешность с минусом
Добавлено after 1 minute 20 seconds: veso74, это где вы такое увидели ?
я вижу там
#define clockCyclesPerMicrosecond() ( F_CPU / 1000000L )
#define clockCyclesToMicroseconds(a) ( (a) / clockCyclesPerMicrosecond() )
#define microsecondsToClockCycles(a) ( (a) * clockCyclesPerMicrosecond() )
да delayMicroseconds() они там в коментах каждый шаг расписывают
if 3 тика. а если true 4. и тд
и то так понимаю в конце некое округление. ну мне микро секунды не нужны.
по поводу таймера в tone() они там предделитель в 1 ставят. тогда всё согласно даташиту. (фото от akl выше)
а если предделитеь 64/256/1024 то получается как я описал вроде. т.е. минус один не нужен
[uquote="alex68md",url="/forum/viewtopic.php?p=4222252#p4222252"]...а если предделитеь 64/256/1024 то получается как я описал вроде. т.е. минус один не нужен[/uquote]
Везде -1, на каждом прескалере.
Спойлер
alex68md Предделитель, разумеется, вносит свою лепту. Вот как студия отрабатывает секунду с 250
Спойлер
А вот так с 250-1
Спойлер
Заметьте на сколько, в первом случае, секунда длинше
akl, но как не понимаю :\ ? [про таймер 1]
минус один с предделителем 256 как у вас на фото = не дотикать 256 реальных МК тиков до нужной виличины. даже если прибавить один тик после сравнения. 255 не дотикает.
всё верно -1 всегда, при любом прескалере оборот тмймера считается за 256 (и частота делится на 256), хотя максимально возможное значение (оно же и применяется в нормальном режиме) это 255
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Ivanoff-iv, так вот я пытаюсь понять почему всегда.
я понял почему при 1:1. один тик догоняется при переходе на прерывание.
но когда прескалер 256
и мы в OCR пишем delay-1 то мы отнимаем реальных процессорных 256 тиков от требуемой величины .. да прерывание срабатывает только на следующий процессорный тик. т.е. получится 256-1 = 255 реальных процессорных тиков мы не дотикали. когда / в какой момент нагоняются эти недостяющие 255 тиков ?