Таймеры/счётчики в AVR

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Re: Таймеры/счётчики в AVR

Сообщение B@R5uk »

a5021 писал(а):Отключите канал: TCCRnA &= ~(1<<COMnA1) и дрыгайте этой ногой, как вам вздумается.
Хотелось бы чтобы этой ногой дрыгал таймер и гарантировал точную длительность импульса. Но так же важно в момент инициализации установить на этой ноге ноль, в связи с чем и возник вопрос. Если есть возможность, то подскажите пожалуйста, как решить эту тривиальную задачу инициализации.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Таймеры/счётчики в AVR

Сообщение a5021 »

А у меня вот нет ощущения, что эта задача столь уж тривиальна. Не пойму, вы хотите укорачивать продолжительность импульса прямо по ходу пьесы, т.е. пока таймер еще считает что-ли? Задачу представьте как-то более развернуто.
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Re: Таймеры/счётчики в AVR

Сообщение B@R5uk »

Задача состоит в том, что необходимо в момент инициализации таймера (до начала счёта) установить на выходе OCnx таймера ноль. Тривиальнейшая задача инициализации.

В принципе, напрашивается использование принудительного сравнения (Force Output Compare for Channel), но в желаемом режиме работы (Fast PWM) эти биты не работают (если верить документации), а гарантии того, что вывод не изменит состояния при смене режима с Normal или CTC на Fast PWM при любых других условиях в документации нет. А даже если не изменит, то кроме смены режима работы таймера придётся ещё сменить режим работы модуля Waveform generator (биты COMnx1:0), что тоже может изменить состояние вывода, и про что в даташите ни слова. Вот я и оказался в тупике.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Таймеры/счётчики в AVR

Сообщение a5021 »

B@R5uk писал(а):Задача состоит в том, что необходимо в момент инициализации таймера (до начала счёта) установить на выходе OCnx таймера ноль.

До начала счета там и так ноль, если не включен инверсный режим ШИМ.
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Re: Таймеры/счётчики в AVR

Сообщение B@R5uk »

a5021 писал(а):До начала счета там и так ноль, если не включен инверсный режим ШИМ.
Ок, на другом канале мне нужна единица. В прочем, не важно, ноль или единица, если есть возможность осуществить инициализацию, то подскажите, пожалуйста, как это сделать?

a5021 писал(а):...если не включен инверсный режим ШИМ.
Интересное замечание, есть ли подтверждение в даташите (например, для tiny2313)? Потому что у меня именно этот режим.

Неужели нет возможности полноценно и однозначно инициализировать периферию микроконтроллера? Куда смотрели разработчики?
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Таймеры/счётчики в AVR

Сообщение a5021 »

B@R5uk писал(а):Интересное замечание, есть ли подтверждение в даташите (например, для tiny2313)? Потому что у меня именно этот режим.

Даташит я читаю, если уже ничего не помогает. :) CodeWizardAVR позволяет независимо выбирать прямой и инвернсый режим на выходах генерации ШИМ у тини2313.

Код: Выделить всё

TCCR1A =  (1<<COM1A1)    // разрешаем вывод наружу канала А
              |  (0<<COM1A0)    // нет инверсии
              |  (1<<COM1B1)    // разрешаем вывод наружу канала B
              |  (1<<COM1B0)   //  есть инверсия
              |  (1<<WGM11)
              |  (1<<WGM10);

Неужели нет возможности полноценно и однозначно инициализировать периферию микроконтроллера?

У кого нету? Я вот почему-то отродясь не страдал в этом плане от какой-то неоднозначности.

Куда смотрели разработчики?

А не напрасно вы так-то на разработчиков? :)
gavrasio
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Пн июн 01, 2015 15:23:01

Re: Таймеры/счётчики в AVR

Сообщение gavrasio »

Подскажите, пожалуйста, есть ли в AVR возможность установить выход таймера (OCnx) в желаемое состояние (ноль), когда таймер выключен?

Если Вы произвели инициализазую таймера, - Вы привели всё в исходное состояние. А, когда таймер выключен, - это как. Кто его выключил? Есть команда Sleep. Но это отдельный разговор.
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Re: Таймеры/счётчики в AVR

Сообщение B@R5uk »

Под "таймер выключен" я подразумеваю, что биты Bit 2:0 – CSn2:0: Clock Select установлены в нули (No clock source, Timer/Counter stopped). Ближе к тексту было бы сказать "таймер остановлен", мой косяк, признаю.
gavrasio писал(а):Вы привели всё в исходное состояние
Не всё, состояния выходов генераторов формы волны изменяется только при наступлении определённых событий, а не при записи в регистры таймера. Я же выше писал об этом. Может я что-то пропустил в документации?

a5021 писал(а):Даташит я читаю, если уже ничего не помогает.
:facepalm: И кого я помощи прошу?
a5021 писал(а):CodeWizardAVR позволяет независимо выбирать прямой и инвернсый режим на выходах генерации ШИМ у тини2313.
:facepalm: Прямой и инверсный режимы не означают, что порт подключается к выходу таймера на прямую или через инвертор. Различие в режимах заключается в событиях, которые сбрасывают и устанавливают выход генератора формы волны. Читайте документацию.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Таймеры/счётчики в AVR

Сообщение a5021 »

B@R5uk писал(а):Прямой и инверсный режимы не означают, что порт подключается к выходу таймера на прямую или через инвертор. Различие в режимах заключается в событиях, которые сбрасывают и устанавливают выход генератора формы волны. Читайте документацию.

Да наплевать, что там и куда подключено. Если бит COMnx0 установлен, то сигнал переворачивается так, словно его пропустили через инвертор. События тут никаким боком. Вы учитались видать этим мануалом, что простых вещей сообразить не можете.

Еще раз говорю, опишите задачу подробнее, а то так и будем впотьмах искать сообразно вашему перегрузу от "чтения документации".
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Re: Таймеры/счётчики в AVR

Сообщение B@R5uk »

Нет, споров пока хватит. Спасибо за участие, дальше сам как-нибудь разберусь.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Таймеры/счётчики в AVR

Сообщение a5021 »

А споров тут еще никаких и не было. Я пытался, что было сил, вытянуть из вас постановку задачи, но вместо этого вы сначала жаловались на описание, ругали разработчиков, а потом зачем-то отправили меня читать документацию, словно это я у вас спрашивал, как то и как это, а не наоборот.

Мне вот что сейчас подумалось, судя по вашей формулировке "выход генератора формы волны", вы там часом не синус какой-нибудь собрались получать прямо с ноги МК ? Тогда действительно разработчики редкостные мерзавцы, т.к. это невозможно в принципе.
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

Re: Таймеры/счётчики в AVR

Сообщение hybroid »

a5021 писал(а):судя по вашей формулировке "выход генератора формы волны"
Это не его формулировка, а даташита. В корявом переводе, правда. Читайте документацию :dont_know:
И я, например, не вижу проблем получить синус.

По сабжу: гипотетически, инициализация выхода, да и остального, должна наступать при записи соответствующих регистров. Подробности того, что и от чего будет зависеть, надо смотреть на внутренней схеме таймера в МК, которая приводится в даташите. Практически - надо ещё наложить на это остальную писанину даташита и еррату. Если в них иного не оговорено, то записывая необходимые регистры, можно поставить таймер в любую позу до разрешения счёта.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Таймеры/счётчики в AVR

Сообщение a5021 »

hybroid писал(а):
a5021 писал(а):судя по вашей формулировке "выход генератора формы волны"
Это не его формулировка, а даташита. В корявом переводе, правда. Читайте документацию :dont_know:
Я не нахожу там никаких "выходов генераторов". Описание генератора формы сигнала (waveform generator) есть, а вот про его выход (или даже выходы, как у автора вопроса) не отыскалось ни пол слова. Не поясните, что вы имели ввиду и в каком именно месте нужно "читать документацию"?

И я, например, не вижу проблем получить синус.

Через интегрирующую цепочку? Я тоже не вижу. Только я спрашивал "прямо с ноги МК?" и это существенно меняет вопрос.
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

Re: Таймеры/счётчики в AVR

Сообщение hybroid »

a5021 писал(а):Описание генератора формы сигнала (waveform generator) есть, а вот про его выход (или даже выходы, как у автора вопроса) не отыскалось ни пол слова.
Но он ,по твоему ,куда-то должен быть подключен? Не для красоты же он. Некоторые банальные вещи не описываются словами. Зато есть целая таблица, описывающая работу, при каких режимах (биты WGM), какие выводы и по какому событию меняются.
a5021 писал(а):Только я спрашивал "прямо с ноги МК?" и это существенно меняет вопрос.
Ты не спрашивал, а утверждал. Существенного тут ничего нет, всё равно это будет прямо с ноги, хоть и в модулированном виде. Предполагать в каждом идиота, не знающего о том, что ЦАП там нет, не стоит. :dont_know:
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Таймеры/счётчики в AVR

Сообщение a5021 »

hybroid писал(а):Но он ,по твоему ,куда-то должен быть подключен? Не для красоты же он.

Вы в курсе, что никакого генератора в виде отдельного блока там нет? Waveform generator -- это скорее абстракция, введенная для упрощения понимания некоторых особенностей функционирования таймера. Да и сама waveform generation -- это не генерация формы волны, как может показаться на первый взгляд. Если оперировать на понятийном уровне, то в соответствии с принятой в русскоязычной среде терминологией, waveform generation -- это скорее "формирование временнЫх параметров сигнала", но никак не амплитудных.

Чтобы сразу пресечь возможные расползания по сторонам, могу отослать к описаниям конкурирующих продуктов других производителей. Таймер -- это фактически стандартная периферия современных МК, которая практически во всех современных МК и встречается. И если, например, копнуть доки на какие-нибудь stm8/stm32, то в них не получится найти не только waveform generator, но и waveform generation вообще. Это при том, что тамошняя периферия реализует не только весь традиционный функционал периферии AVR, но и предлагает сверх того.

a5021 писал(а):Предполагать в каждом идиота, не знающего о том, что ЦАП там нет, не стоит.

Уж не помню, в ветке про avr или stm некий товарищ задавался вопросом, как ему при помощи сишных функций printf и scanf писать значения в файл и читать из него обратно. Он собирался это делать голым микроконтроллером на макетке. Мысль о том, что МК имеет встроенный доступ к удаленным файловым системам казалась ему естественной и для использования этой фичи, по мысли вопрошавшего, всего и надо, лишь правильно использовать printf и scanf. Так что насчет знающих и не знающих чего там есть внутри МК, а чего нет, я бы не был столь категоричным.
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

Re: Таймеры/счётчики в AVR

Сообщение hybroid »

1. В курсе. И это никакая не абстракция, а весьма настоящая накристальная цифровая схема. Оно там не на волшебном дыме работает. Зато действительно удобно называть и понятно, о чём речь. Просто ШИМ тут явно не достаточно, т.к. генерирует не просто ШИМ, а различные его виды, под различные нужды.
2. У других производителей можем найти или похожее, или длинное словесное описание.
3. И по поводу перевода в курсе, я даже оговорил перевод выше, до того, как ты открыл даташит.
4. Ну попался дурак - и что? Теперь всех дураками считать?

А по теме что? Как там внутренняя структура таймера поживает? Выводы таки подключаются к чему-то?

PS: вообще, вот я Барсука понял, вполне доступно для тех, кто знает как это внутри работает. Если бы ты работал с ПЛИС, то тоже понял бы. Или если бы поинтересовался внутренним устройством периферии.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Таймеры/счётчики в AVR

Сообщение a5021 »

hybroid писал(а):И это никакая не абстракция, а весьма настоящая накристальная цифровая схема.

Давайте не будем завязываться на утверждениях, проверить которые у нас нет возможности.

Просто ШИМ тут явно не достаточно, т.к. генерирует не просто ШИМ, а различные его виды, под различные нужды.

Все многообразие "видов ШИМа", применительно к атмеге, состоит из единственного вида цифрового ШИМ-сигнала с выравниванием фронтов по тому или иному критерию. ШИМ-сигнал формирует сам таймер и подвязывать сюда еще какой-то генератор сложноформализуемых свойств -- явная избыточность. Даже на схеме сей генератор изображен в виде черного ящика, чьи свойства почти никак не описаны.

2. У других производителей можем найти или похожее, или длинное словесное описание.

Так как мне претит отправлять кого-либо читать неведомую документацию (в силу заблуждений, мне видится это невежливым), я лучше сразу предложу вам найти то, о чем вы говорите, на схеме таймера STM32:

Изображение

"Длинное словесное описание", включающее слово generator в RM0008 (в качестве примера) встречается несколько раз в разделах относящихся к схеме генерации опорных сигналов, но ни разу в разделах, имеющих отношение к таймерам (за исключением dead-time generator, но это уже совсем другая песня). Так что уж извините, но ваш пункт 2 полностью ложный.

4. Ну попался дурак - и что? Теперь всех дураками считать?

Считать всех дураками это такой же перебор, как верить в то, что все осведомлены насчет отсутствия ЦАПа в атмеге. Как раз таки неудачная абстракция с waveform generator может привести новичков к мысли, что атмега в состоянии генерировать аналоговый сигнал произвольной формы невыясненным, к моменту начала освоения, способом. Поэтому я и взял на себя труд уточнить это.

А по теме что? Как там внутренняя структура таймера поживает? Выводы таки подключаются к чему-то?

К выходу канала сравнения и подключаются. То, что в мануале атмеги там нарисован некий блок с надписью waveform generator совсем не означает, что именно в нем случается некая генерация. Устройством генерации ШИМ-сигнала является весь таймер целиком, будучи сконфигурированным надлежащим образом. Именно поэтому в МК других производителей не встречаются (я, во всяком случае, не видел) никаких обособленных генераторов внутри таймера. Я бы мог повесить здесь схему канала сравнения от STM32, которая по сравнению с атмеговской прорисована более детально, но не буду этого делать, чтобы не загромождать сообщение. Любопытствующие могут посмотреть Fig. 79-80 на с. 309-310 все того же RM0008. И ведь что интересно: и в атмеге и в стм32 есть таймер, есть каналы сравнения, есть в чем-то схожие регистры, но у атмеги наличествует нечто под названием waveform generator, а у стм32 и близко нет. В этой связи напрашивается законный вопрос -- если все таинство генерации происходит именно в этом генераторе, как остальные МК обходятся без него?

вообще, вот я Барсука понял, вполне доступно для тех, кто знает как это внутри работает.

Я барсука не понял и боюсь, что наблюдая за тем, куда заходит разговор, он вообще не решится больше оппонировать. Апломб вида "вполне доступно для тех, кто знает, как это внутри работает" оставляю на вашей совести. Кто знает, как что-либо работает, обычно умеет в двух словах об этом рассказать, а не только пространно отсылать куда-то вдаль.
Вложения
stm32_tim2.jpg
(63.03 КБ) 720 скачиваний
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

Re: Таймеры/счётчики в AVR

Сообщение hybroid »

a5021 писал(а):Давайте не будем завязываться на утверждениях, проверить которые у нас нет возможности.
А как по-твоему ещё это может быть реализовано в МК? Слушаю предложения!
a5021 писал(а):состоит из единственного вида цифрового ШИМ-сигнала с выравниванием фронтов по тому или иному критерию.
Если ты мне предложишь ещё разнообразие прямоугольного сигнала - за нобелевкой надо идти. Также выбираются другие настройки, нэ? Куда выводить, в каком виде. TOP/BOTTOM. Сколько там видов ШИМа, напомни?
Если ты обзовёшь это просто "таймер" - то ты не договоришь и половины функционала.
a5021 писал(а):подвязывать сюда еще какой-то генератор сложноформализуемых свойств -- явная избыточность
Опять же, рассказывай, как по-твоему и на какой магии работает тот же ШИМ с коррекцией фазы. Рассказывай на уровне логических схем, т.к. именно её представляет из себя МК с периферией.
a5021 писал(а):о чем вы говорите, на схеме таймера STM32:
Мсье умолчал о возможностях ШИМа названного МК. Он не делает такой зоопарк ШИМов, как та же ATmega88. В силу набортного ЦАПа нет смысла производителю усложнять свои таймеры. Но даже тут можно правые части обвести и обозвать WG. Будешь спорить?
a5021 писал(а):неудачная абстракция с waveform generator
Свои мнения высказывай в письменном виде атмелу. Не мне, мне на них насрать :dont_know: Для меня - это очень удачное название.
a5021 писал(а):К выходу канала сравнения и подключаются. То, что в мануале атмеги там нарисован некий блок с надписью waveform generator совсем не означает, что именно в нем случается некая генерация.
И потом Девидом Блейном работа меняется при смене бит WGM, ога. А их там не один и не пять режимов. Вынести это в отдельный квадрат - право производителя, т.к. это и есть отдельный функционал. Пихать всё в кучу - тоже право производителя. Думать головой надо.
a5021 писал(а):никаких обособленных генераторов внутри таймера.
Ты узко понимаешь слово "генератор".
a5021 писал(а):Кто знает, как что-либо работает, обычно умеет в двух словах об этом рассказать
В двух словах: на куче регистров, счётчиках, компараторах, триггерах и мультиплексорах. Внесло ясность? Те, кто знают, обычно в двух словах не говорят, т.к. ни хрена не объяснишь в двух словах тому, у кого нету соответствующей базы.

Итог пока таков: waveform генератор таки есть. Ты даже с этим согласен, но считаешь это всем в сборе, хотя таймер просто считает тики, а регистр сравнения их просто сравнивает.. Но почему-то в твоей голове они стоят не рядом, а внутри. Хрен бы с ним, главное что есть.
Давай разбираться с подключением выводов. Их там, кстати, не один может быть, а три канала ШИМ. Рассказывай, куда будешь подключать. К регистру сравнения не устраивает, не получится некоторых видов ШИМа.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Таймеры/счётчики в AVR

Сообщение a5021 »

Видов ШИМа -- один. Цифровой. Выравниваний -- два: по центру и по фронту. Остальные т.н. "режимы" суть производные от этих двух. Атмеговский ШИМ с коррекцией фазы это счет вверх-вниз (или наоборот) с двумя событиями соответствия. У стм он называется выравниванием по центру. Логических схем МК никто не видел и определенные блоки могут оказаться всем, чем угодно, включая такой неожиданный вариант, как специализированный процессор со своим микрокодом. Ваша фраза "Он не делает такой зоопарк ШИМов, как та же ATmega88" очень опрометчива. Если сюда придут фанаты стм32, то они будут убивать вас и я никак не смогу защитить.

С подключением выводов разобраться не получится, т.к. схемы нет, а гадать не мое ремесло. У стм32 есть более подробная блок-схема и там хотя бы видно, что инверсный и не инверсный режимы это суть пропускания выхода через инвертор или минуя его, что категорически отрицал барсук.
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

Re: Таймеры/счётчики в AVR

Сообщение hybroid »

Тебе задали конкретный вопрос выше и ты по нему начал писать конкретную хуйню. Теперь свою хуйню прикрываешь тем, что у других производителей написано иначе. А мне вот насрать на других, говори по делу. И на STM32 насрать, речь об AVR. И на фанатов насрать, пусть бегут куда хотят, нечего тут пугать.
a5021 писал(а):С подключением выводов разобраться не получится, т.к. схемы нет, а гадать не мое ремесло.
Это не мешает тебе утверждать своё категоричное мнение:
a5021 писал(а):Если бит COMnx0 установлен, то сигнал переворачивается так, словно его пропустили через инвертор. События тут никаким боком. Вы учитались видать этим мануалом, что простых вещей сообразить не можете.
Тут же ты "сообразил" простые вещи? Что поменялось, почему теперь прикрылся производителем?
Сообрази мне схему таймера, чтобы твои простые вещи не были простой пургой. Расскажи, как же он к ногам подключается. Все исходные данные есть, только надо подумать.
Вот тебе исходные данные. Изменяй так, чтобы избавиться от waveform generator. Обзывай его хоть "колдовской ебучкой", но чтобы результат был такой же.
Изображение

a5021 писал(а):то они будут убивать вас и я никак не смогу защитить.
Спасибо, но даром не надо. Тебе бы свои слова защитить :facepalm:
Ответить

Вернуться в «AVR»