Там в диалоге прошивки есть отдельная строка фьюзы. И там непосредственно выбираются нужное значение частоты и время запуска МК, а фьюзы выставляются автоматом под заданные значения.
Я пробовал разные интервалы, пытался задать шим с помощью генератора случайных чисел но с дилеем 100 он делал это раз секунд 10, там у меня есть макрос для рандома, я не верю что он может дать подряд раз 10 одно и тоже значение
Я посмотрел Ваш код повнимательнее - это что-то феерическое.
Вы либо задавайте задержку таймером, либо функцией delay. Но никак не одновременно. Когда Вы задаете одновременную работу и того, и другого, то у Вас прерывание от таймера время от времени вклинивается в основной цикл и немного увеличивает программную задержку (правда не очень сильно, но все-таки). К тому же, таймером Вы задаете задержку примерно 2,6 мкс (1/8000000*(20+1)), а программная задержка рассчитывает 20 мс. И все это работает зачем-то в параллель.. А в обработчике прерывания от таймера переменные от этих двух задержек сравниваются. А в силу их различных временных интервалов результирующая задержка может скакать туда-сюда +/- километр.
Для Ваших переменных, значение которых не бывает больше 255 вполне подойдет размер unsigned char. (как раз 255 -максимальное значение) Т.к. контроллер 8-битный, то это значительно сэкономит его ресурсы. К тому же Вы сможете избавится от обнуления по достижению значения 255, т.к. следущее добавление 1-цы вызовет переполнение - и переменная сама обнулится.
К тому же, Вы должны понимать, что нет позможности создать сколь-нибудь правдоподобный генератор случайных чисел программным путем. Есть ПСЕВДОгенераторы (обычно делаются определенным количеством сдвигов и суммой с определенным числом), которые имеют период повторяемости. В первом приближении генератором случайных чисел может быть шум на входе АЦП, но он обычно не превышает 2-3 младших значащих разрядов. Этого редко бывает достаточно. Но можно схитрить и сделать 3-4 измерения со сдвигом. Но опять-таки такой генератор будет далек от идеального, потому что распределение вероятностей выпадания разных значений будет различна (должна быть равномерна). И можно сказать, что у такого генератора почти никогда не будет значения 0 или 0xFF.
Хм, ну я не отрицаю что руки у меня с очень высоким коэффициентом кривизны) Я учусь и надебсь когда то на своих ошибках научусь))) Ну генератор то по сути фигня, я его подсмотрел в чем то проекте электронной свечи или чем то подобном, мне он по сути и не был нужен. Если я правильно понял то либо я делаю шим аппаратно и юзаю дилеи либо програмный шим но без задержек? Ну про чар тупанул, как то постоянно забываю о этом типе переменных, всегда интами пользовался на чем бы не писал)
нет, Вы не поняли. Либо ШИМ аппартано без делеев, либо программно с делеями. Либо, если хотите аппаратно с делеями, то останавливаете таймер на время делея.
Считайте таймер как отдельное устройство, которое работает в параллель с АЛУ (ЦП, ядро) МК. Т.е. Если Вам нужна задержка, то Вы можете сформировать ее либо таймером, либо АЛУ (намолачивая нужное количество тактов). Если Вам нужны две разные задержки, которые работают по очереди, Вы можете также использовать либо отдельно каждое из этих устройств (при этом таймер нужно будет перенастроить), либо оба, настроенных на разное время (тогда таймер должен быть выключен, пока отрабатывает задержка от АЛУ). У Вас же эти две задержки работают параллельно и точки их пересечения посчитать можно, но.. нужен ли Вам этот геморрой?
Или Вы там какие-то спецэффекты делаете?
Можете сформулировать, что должно получиться на выходе?
Думаю нет А как такты считать?
ну по идее случайный цвет для ргб ленты, но пока вариантов реализации не нашел) рлюс надо еще прикрутить работу с нековскими пультами и возможно уарт
В смысле как считать? Вас в школе считать не научили?
Берете точку отсчета. Условный 0. прикидываете, что для реализации программной задержки в 20 мсек (1/0,020=50 Гц) Вам потребуется 8000000/50=160 000 тактов ядра. Далее таймер, который работает параллельно. у Вас сброс по числу 20. коэффициент предделителя 1. Т.к. в счете таймера число 0 тоже участвует, то каждые 21 такт (8000000/21=2,6 мксек) таймер будет выдавать прерывание. итого, пока АЛУ 1 раз посчитает 20 мсек, таймер сработает 160000/21=7619,048 раз (без учета прерываний). А теперь давайте посчитаем с прерываниями. Компилятор СИ пишет пролог и эпилог в обработке прерывания. Это ряд команд по сохранению используемых регистров (и некоторых других на всякий случай), а потом, по окончании, восстановления их значений. + сам обработчик. По моим прикидкам пролог+эпилог примерно равны 50 тактам. + обработчик ~10-20 тактов. Т.е. Время обработки прерывания по таймеру превосходит время срабатывания самого прерывания. Таким образом, основная программа (подсчет Вашей задержки программным путем) практически не выполняется (всего по 1 команде после выхода из каждого прерывания, а потом опять в обработчик). Т.е. 99,999% системного времени уходит на обработчик таймера.
Не ну так я могу считать, я думал есть особые регистры какие то
Я так понимаю таймеры это плохо?
А как тогда все будет выглядеть при наличии второго таймера?
Последний раз редактировалось WishMasterMax Пн июл 21, 2014 21:08:38, всего редактировалось 1 раз.
Никаких регистров нет. Есть возможность в некоторых симуляторах при симуляции отображать количество тактов, прошедших с момента старта контроллера (точно не помню в каких, по моему, в студии есть).
Таймеры - хорошо, когда умеете ими пользоваться.
Если хотите генератор случайных чисел (ПСЕВДО), то поищите примеры алгоритмов в просторах инета. Сильно сложные алгоритмы вводить смысла нет, потому как градации долей цвета не будут сильно заметны на глаз, тем более, при динамическом изменении его (цвета). Достаточно будет вообще задавать цвет 1 байтом, где средние три бита - зеленый (к этому цвету наиболее чувствителен глаз человека), а каждые два крайних - красный и синий. генерируете случайный байт - и переводите его в цвет.
Так же будут работать параллельно. Только существует приоритет прерываний на случай их одновременного возникновения. Прерывание с бОльшим приоритетом выполнится первым. Затем по выходу из него выполнится обработчик второго прерывания. Если во время обработки первого (более приоритетного) прерывания, оно произойдет снова, то обработчик второго прерывания не запустится, а будет повторно запущен обработчик первого и т.д.