sonycman 0 8 июня, 2011 Опубликовано 8 июня, 2011 · Жалоба Последнее время привык использовать в приложениях аппаратный 32 битный счётчик с разрешением в 1 микросекунду. На его базе очень удобно реализовать таймеры с выдержкой от единиц микросекунд до нескольких минут. На STM32F1xx приходилось использовать в цепочке два 16 битных таймера, благо есть возможность выстраивания друг за другом. На LPC17хх вообще без проблем - нативный 32 битный таймер в наличии. Вот теперь прицениваюсь к Сэмам. И что же наблюдаю? Имеем очередное чудо инженерной (плисоводской?) мысли в виде отсутствия каких либо прескалеров и навороченного блока таймеров. В мануале написано, что у нас аж 9 каналов 16 битных таймеров, тогда как регистров в наличии только на 3 :smile3046: Первая непонятка. Потом смотрю, вроде есть возможность заводить выход одного счётчика на вход другого, ага! Идея такая: первый таймер играет роль делителя частоты ядра в 96 МГц до 1 МГц (прескалер) -> второй выполняет роль младших 16 бит -> и третий старших - в итоге получаем 32 бита. Но для этого надо, чтобы после срабатывания функции сравнения и сброса счётчика в 0 выдавался импульс на следующее звено в цепочке, для его инкремента. Однако в мануале указана только возможность установить в 1, сбросить в 0 или переключить состояние выхода таймера. Про короткий импульс нет ни слова :( Неужели всё это нагромождение таймеров не способно работать как один 32 битный свободный счётчик? :crying: ЗЫ: ага, вроде придумал - ведь на каждый таймер мы имеем три compare регистра - А, В и С. Тогда, к примеру, в регистр А заносим значение 0xFFFF, а в регистр C - 0x0, и устанавливаем функции для А - установить выход в 1, а для С - сбросить в 0. И получаем короткий импульс при переполнении счётчика! Что скажете, уважаемые? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 8 июня, 2011 Опубликовано 8 июня, 2011 · Жалоба В мануале написано, что у нас аж 9 каналов 16 битных таймеров, тогда как регистров в наличии только на 3 :smile3046: Первая непонятка. В мануале их 3, откуда взялось 9? Потом смотрю, вроде есть возможность заводить выход одного счётчика на вход другого, ага! Идея такая: первый таймер играет роль делителя частоты ядра в 96 МГц до 1 МГц (прескалер) -> второй выполняет роль младших 16 бит -> и третий старших - в итоге получаем 32 бита. Эх, и не жалко таймеров? Но для этого надо, чтобы после срабатывания функции сравнения и сброса счётчика в 0 выдавался импульс на следующее звено в цепочке, для его инкремента. Однако в мануале указана только возможность установить в 1, сбросить в 0 или переключить состояние выхода таймера. Про короткий импульс нет ни слова :( Еще в мануале упоминаются три регистра сравнения, по каждому из которых можно что-нибудь с TIOx сделать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 8 июня, 2011 Опубликовано 8 июня, 2011 · Жалоба В мануале их 3, откуда взялось 9? Отсюда Там по тексту ещё в одном месте про 9 каналов сказано. Три - это уже совсем мало. Эх, и не жалко таймеров? Можете предложить другой способ получения 32 бит? Это Атмелу надо было думать, прежде чем выпускать современный контроллер с жалкими тремя 16 битными огрызками :) Прескалер-то выбросили, явно намекают на использование вместо него одного из таймеров. Еще в мануале упоминаются три регистра сравнения, по каждому из которых можно что-нибудь с TIOx сделать. Это я уже допёр :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 8 июня, 2011 Опубликовано 8 июня, 2011 · Жалоба Отсюда Там по тексту ещё в одном месте про 9 каналов сказано. Три - это уже совсем мало. Выдали желаемое за действительное. На самом деле их три, разумеется. И не сказать, что этого мало. Можете предложить другой способ получения 32 бит? Я, если честно, слабо представляю, зачем вообще может понадобиться на уровне софта таймер с разрешением 1 мкс. Разве что в качестве performance timer'а. Можно использовать входную частоту MCK/128, если забить на привязку 1 тик = 1 мкс. Это Атмелу надо было думать, прежде чем выпускать современный контроллер с жалкими тремя 16 битными огрызками :) Прескалер-то выбросили, явно намекают на использование вместо него одного из таймеров. Да, могли бы расширить до 32-х. Прескалера никогда и не было. Вообще, TC практически идентичен тому, что был 10 лет назад на M40800 (ну, квадратурный декодер недавно добавили). Тогда он мне представлялся довольно навороченным :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 8 июня, 2011 Опубликовано 8 июня, 2011 · Жалоба Я, если честно, слабо представляю, зачем вообще может понадобиться на уровне софта таймер с разрешением 1 мкс. Разве что в качестве performance timer'а. Для меня весьма удобно иметь класс таймеров с широкими возможностями, с обработкой практически любых желаемых временных промежутков. Всего то надо один 32 битный аппаратный таймер для этого. Вообще, TC практически идентичен тому, что был 10 лет назад на M40800 (ну, квадратурный декодер недавно добавили). Тогда он мне представлялся довольно навороченным :) Да мне тоже он показался навороченным, пока разобрался, что к чему, аж голова затрещала Просто до этого не имел дела с Атмеловскими таймерами. Что интересно - на борту ведь имеются два 32 битных счётчика - RTT и RTC, и не всегда они задействованы, а точнее - вообще почти никогда. Если бы была возможность тактировать их не только от Slow Clock... :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 8 июня, 2011 Опубликовано 8 июня, 2011 · Жалоба Что интересно - на борту ведь имеются два 32 битных счётчика - RTT и RTC, и не всегда они задействованы, а точнее - вообще почти никогда. Если бы была возможность тактировать их не только от Slow Clock... :( Традиции-с. RTT - вообще весьма невнятная вещь, использовать можно только как источник alarm'а. Но упорно перетаскивают его из кристалла в кристалл. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DmitryM 0 9 июня, 2011 Опубликовано 9 июня, 2011 · Жалоба Для меня весьма удобно иметь класс таймеров с широкими возможностями, с обработкой практически любых желаемых временных промежутков. Всего то надо один 32 битный аппаратный таймер для этого. Чем не устраивает PIT??? Частота MCLK, предделитель есть, настройте на 1мкс. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 9 июня, 2011 Опубликовано 9 июня, 2011 · Жалоба Можете предложить другой способ получения 32 бит? Я могу. Обрабатывать переполнения 16-битного таймера программно, дополняя до 32 бит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 9 июня, 2011 Опубликовано 9 июня, 2011 · Жалоба Чем не устраивает PIT??? Тем, что его там нет, наверное. Обрабатывать переполнения 16-битного таймера программно, дополняя до 32 бит. Кстати, да. Событие редкое, раз в 65.536мс можно и отвлечься ненадолго. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 9 июня, 2011 Опубликовано 9 июня, 2011 · Жалоба Я могу. Обрабатывать переполнения 16-битного таймера программно, дополняя до 32 бит. Можно и так, да. Но тут столько же минусов, сколько и плюсов - экономим всего один таймер, зато получаем лишнее прерывание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 9 июня, 2011 Опубликовано 9 июня, 2011 · Жалоба Но тут столько же минусов, сколько и плюсов - экономим всего один таймер, зато получаем лишнее прерывание. Это, знаете ли, как посмотреть: экономим целый таймер и получаем редкое и короткое прерывание. Три - это уже совсем мало, не так ли? ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться