UNO: таймер 2
- Войдите на сайт для отправки комментариев
Пт, 25/09/2020 - 21:40
Arduino UNO 16 МГц (проверил на кварце осцилографом и убедился программатором, что фьюзы CKSEL=0111)
Как известно из даташита - таймер 2 8-битный.
Следовательно, при выключенном предделителе - прерывание TIMER2_COMPB_vect должно вызываться 16000000/256 = 62500 раз в секунду.
Но на осциллографе я вижу прямоугольный сигнал с частотой ~244 Гц (!)
Как будто бы прерывание срабатывает не 62500 раз в секунду, а 62500/256 = 244 раз в секунду...
Я бы понял, если бы это был таймер 1 (он 16-битный). Но у меня ведь таймер 2!
#include <Arduino.h> ISR (TIMER2_OVF_vect) { PORTB |= (1 << PB5); // При переполнении - высокий уровень } ISR (TIMER2_COMPB_vect) { PORTB &= ~(1 << 5); // При совпадении - низкий уровень } void setup() { DDRB |= 1 << PB5; // Пин D13 - выход на светодиод OCR2B = 0x25; // "Процент" заполнения //TCCR2B = (1 << CS21) | (1 << CS20); // На счётчик подаётся CLK=16 МГц TCCR2B |= 1 << CS20; // На счётчик подаётся CLK=16 МГц TIMSK2 |= 1<<OCIE2B; // Вызов прерывания при совпадении TIMSK2 |= 1<<TOIE2; // Вызов прерывания при переполнении } void loop() { }
А считай и выведи в сериал или на диспплей значение TCCR2B в конце сетапа. Он же не с нуля у тебя иницируется. А OR-м. Так что предделитель там, скорее всего не 1
PWM на этом таймере уже настроен, 490 герц где-то
У Вас делитель 128! Среда ардуино пишет туда CS22 и Вы в дополнение CS20 пихаете.
Так что, всё правильно.
Иницилиазируйте таймер полностью, с нуля.
Недавно была тема http://arduino.ru/forum/apparatnye-voprosy/taimer-2-golovolomka
Иницилиазируйте таймер полностью, с нуля.
А можно подробнее, для особо одарённых.) Лучше с примером. Понятие нуля хотелось бы понять.)
А можно подробнее, для особо одарённых.)
Для особо одарённых не могу, т.к. никогда не работал в школе для особо одарённых и не знаю тамошних методик преподавания.
Лучше с примером.
Закажите в "Ищу исполнителя".
Понятие нуля хотелось бы понять.)
А чего тут понимать? Прописывать нужно ВСЕ биты так, как Вам надо, а не только 1-цы. Нельзя надеяться, на то, что до Вашей настройки там было что-то определённое и разумное.
А чего тут понимать? Прописывать нужно ВСЕ биты так, как Вам надо, а не только 1-цы. Нельзя надеяться, на то, что до Вашей настройки там было что-то определённое и разумное.
ЕвгенийП, ну вот как раз я вас и хочу убедить в том, что не ВСЕ приписывания ВСЕХ требуемых регистров помогают. Оказывается, всё ещё зависит и от режима в котором Таймер находился до этого. Это что ж получается? Я должен знать/помнить ВСЕ(!) режимы этого таймера, что бы настроить на свой?
Для примера, 1602 в 4-битном режиме. В ДШ чётко расписана последовательность действий по инициализации его (1602) в этом режиме. Не зависимо от того в каком режиме он находился до этого.
Вы понимаете?
Что такое 1602? Мне казалось разговор о таймерах. Дисплей такой знаю, а таймер нет
Я привёл пример для дисплея 1602, как показана его инициализация в ДШ. Чего не наблюдается в ДШ по инициализации таймера.)
Я привёл пример для дисплея 1602, как показана его инициализация в ДШ. Чего не наблюдается в ДШ по инициализации таймера.)
Красиво. Жаль только, что не все регистры указаны.)) Ладно, не будем засорять топик.
ЕвгенийП, ну вот как раз я вас и хочу убедить в том, что не ВСЕ приписывания ВСЕХ требуемых регистров помогают. Оказывается, всё ещё зависит и от режима в котором Таймер находился до этого.
Что-то Вы не то говорите. Что такое "режим в котором таймер был до этого"? Это просто комбинация битов прописаннае в регистрах. Если Вы все биты перепропишете как Вам надо в соответствие с даташитом, то каким боком прошлый режим может Вам помешать?
ЕвгенийП, ну вот как раз я вас и хочу убедить в том, что не ВСЕ приписывания ВСЕХ требуемых регистров помогают. Оказывается, всё ещё зависит и от режима в котором Таймер находился до этого.
Что-то Вы не то говорите. Что такое "режим в котором таймер был до этого"? Это просто комбинация битов прописаннае в регистрах. Если Вы все биты перепропишете как Вам надо в соответствие с даташитом, то каким боком прошлый режим может Вам помешать?
Евгений Петрович, а не озвучить ли здесь типичную ошибку связанную при применением функции attachInterrupt() вследствии её кривой реализации и иных багов среды, а именно эта не сбрасывает флаг прерываний перед её включением, в результате имеем криво работающий код!
А может в новых версиях это уже поправили?
Лечим просто:
Что-то Вы не то говорите. Что такое "режим в котором таймер был до этого"? Это просто комбинация битов прописаннае в регистрах. Если Вы все биты перепропишете как Вам надо в соответствие с даташитом, то каким боком прошлый режим может Вам помешать?
Я ж приводил пример):
Как видите, никаких единичек, всё строго. Всё согласно ДШ. Неиспользуемые OCR2B, ASSR, GTCCR = 0, можно дописать при желании. Однако на выходе 8, вместо 4-х мгц.
Что-то Вы не то говорите. Что такое "режим в котором таймер был до этого"? Это просто комбинация битов прописаннае в регистрах. Если Вы все биты перепропишете как Вам надо в соответствие с даташитом, то каким боком прошлый режим может Вам помешать?
Я ж приводил пример):
Как видите, никаких единичек, всё строго. Всё согласно ДШ. Неиспользуемые OCR2B, ASSR, GTCCR = 0, можно дописать при желании. Однако на выходе 8, вместо 4-х мгц.
Привет, коллеги! Я тут на отдыхе, и читаю уже не первый раз про таймер ;))). Тебе же ДимаХ ответил, что нужно завести полезную привычку выставлять OCR последним. Мне даже кажется, что что-то про это я видел в документации, но не уверен.
А чего тут понимать? Прописывать нужно ВСЕ биты так, как Вам надо, а не только 1-цы. Нельзя надеяться, на то, что до Вашей настройки там было что-то определённое и разумное.
ЕвгенийП, ну вот как раз я вас и хочу убедить в том, что не ВСЕ приписывания ВСЕХ требуемых регистров помогают. Оказывается, всё ещё зависит и от режима в котором Таймер находился до этого. Это что ж получается? Я должен знать/помнить ВСЕ(!) режимы этого таймера, что бы настроить на свой?
Для примера, 1602 в 4-битном режиме. В ДШ чётко расписана последовательность действий по инициализации его (1602) в этом режиме. Не зависимо от того в каком режиме он находился до этого.
Вы понимаете?
Так вам о том и талдычат, что регистр для начала бы обнулить, а потом что то туда вписывать, чтоб результат был предсказуемым.
Как видите, никаких единичек, всё строго. Всё согласно ДШ. Неиспользуемые OCR2B, ASSR, GTCCR = 0, можно дописать при желании. Однако на выходе 8, вместо 4-х мгц.
Так это по даташиту на камень.
У Ардуино свои приколы.
Она же выставляет эти таймеры уже.
Где то на ШИМ, где то на миллис.
Смените среду, удалите загрузчик и тогда все будет работать как в даташите на камень
Привет, коллеги! Я тут на отдыхе, и читаю уже не первый раз про таймер ;))). Тебе же ДимаХ ответил, что нужно завести полезную привычку выставлять OCR последним. Мне даже кажется, что что-то про это я видел в документации, но не уверен.
Теперь то я в курсе). Но полтора часа пришлось потратить.( Сначала заработало методом тыка, а затем начал читать ДШ. Но в документации нужно глубоко копать - до ШИМ режимов аж, которые здесь причём, казалось бы!
GREEN
согласно даташиту надо так видимо?
Так вам о том и талдычат, что регистр для начала бы обнулить, а потом что то туда вписывать, чтоб результат был предсказуемым.
Задним числом мы все умные.) Порты вы тоже сначала обнуляете прежде чем в них что то записать?
GREEN
согласно даташиту надо так видимо?
Это одно и тоже, нули можно не сдвигать.) Немного нагляднее только.
Так вам о том и талдычат, что регистр для начала бы обнулить, а потом что то туда вписывать, чтоб результат был предсказуемым.
Задним числом мы все умные.) Порты вы тоже сначала обнуляете прежде чем в них что то записать?
это всё из-за битовых операций )))
интересно, а как прочитать содержимое этих регистров?
Так так и читать:
X=OCR2A
И тд
Понятно!
а вот тут второй строкой бит в 0 устанавливают?
Как видите, никаких единичек, всё строго. Всё согласно ДШ.
Точно всё? Вы таки упустили главное из моего поста - самое главное
Если Вы все биты перепропишете как Вам надо в соответствие с даташитом
Вам показать в даташите что Вы не так сделали? Или (судя по ответу графу) Вы и так знаете где там про это?
А тогда я не понимаю, с чем Вы спорите. С тем, что это в даташите "глубоко закопано"? Так его весь знать надо. Спор-то ни о чём.
Конечно, покажите мне самое главное.) И я с вами не спорю, с вами сложно спорить. Я тему создал после того как уже всё выяснил. Но не вижу что бы для многих это было очевидно.
Тут уж надо выбирать, если человек не хочет изучать даташит, то надо пользоваться средствами IDE или, уж если приспичило, ставить хорошую библиотеку. А если человек хочет сам ручками что-то настраивать и при этом не хочет изучать даташит - сам себе злобный буратино, что тут скажешь?
Ну вы ж понимаете, хочется раз-два и готово. А даташит - это когда уже не идёт... Да и не упомнишь нюансы всё.
Понятно!
а вот тут второй строкой бит в 0 устанавливают?
Да