24 битный таймер
- Войдите на сайт для отправки комментариев
Ср, 28/09/2016 - 20:54
Как обьединить 16 и 8 битный таймер в один 24 битный таймер на аппаратном и программном уровне не используя программный счет количества переполнений?
Имеем 2 таймера: Таймер 2 (8бит) и Таймер 1(16 бит). Частоту кварца мы подаем на Таймер 2. Выход Таймера 2 перемычкой соединяем со входом Таймера 1.
Вопросы:
1.Как настроить Таймеры для работы в данной связке?
2.Как правильно запустить и остановить общий таймер?
3.Как посчитать количество тактов?
4.Как настроить и запустить данный таймер для формирования задержки в количестве тактов до формирования прерывания на выходе Таймера 1?
А смысл сего чудо-действия каков? Может с этого надо начать? И тогда возможно Вам подскажут вариант попроще.
Выход Таймера 2 перемычкой соединяем со входом Таймера 1.
Входы и таймера 1, и таймера 2 находятся внутри кристалла, перемычкой не замкнуть, атмега - не плис, pll не подвигать. PS В очередной раз пересматриваю "Особенности...", ну, за микроэлектронику! (c)
PS2 Ан нет, я ошибался, есть такая возможность внешнего тактирования с ноги. Биты cs[12:10] http://www.engblaze.com/microcontroller-tutorial-avr-and-arduino-timer-interrupts/
negavoid, не, ну ТС имел в виду, сделать на первом таймере ногодрыг в СТС режиме и эту ногу замкнуть на ногу тактирования второго таймера. Это вполне возможно, почему нет?
Buldkoav, это реально серьёзная работа на несколько часов. Идею как соединить я написал (но Вы, наверное, и сами её понимали, иначе не придумали бы этого).
Что до всего остального, но неясно для чего это нужно, а потому неясно как делать. ну,например, Ваш общий таймер в каком режиме должен работать? От этого много чего зависит.
Buldakov, начнём с того, что есть два способа ввести таймеры в симбиоз. (1) Последовательный (2) паралельный. Про последовательный способ вы начали писать - 8-битный таймер строчит на частоте МК, на 256 такт подаёт лог.1 на свою аппаратную ногу. На любой другой такт подаёт лог.0. Т.е. таймер работает в режиме PWM. Его аппаратная нога соединена с входом Т1 первого таймера, который настроен на внешнее тактирование (TCCR1B=B111) В результате в счётном регистре 8-битного таймера имеем младший байт суммарного счёта, а в счётном TCTN1 -два старших байта. Либо паралельный вариант, он без внешних проводков - оба таймера работают в режиме CTC, но 16-битный делит тактовую на 256. Результат тот-же. Оба варианта требуют предварительную синхронизацию таймеров. (об этом подробнее писал тут )
Ссылку посмотрю. Вообще в таком случае меня интересует последовательный таймер.
Допустим мне надо сделать делитель на 1000000. Второй таймер настраиваю на переключение по достижению значения.А первый таймер на вызов прерывания. Допустим во 2 таймер записали число 49, а в 1 таймер число 9999. Тогда 2 таймер делит частоту в 100 раз, а первый при приходе 10000 импульсов срабатывает по прерыванию по таймеру 1.
Теперь самый непонятный момент. Если мы остановили оба таймера. Считали значение с 1 и 2 таймера, но как считать логическое состояние выхода 2 таймера мне не понятно. Возможно ли это сделать? Или лучше как вы советуете перевести 2 в режим PWR?
Buldakov, я не понимаю что вам нужно, какая практическая цель. Симбиоз имеет смысл если вам нужно досчитать до 2^24 не дёргая прерывания. Если вы дёргаете прерывания, или меняете логику изложенную в #4, то смысл объединять если не теряется совсем, то сильно уменьшается. Тогда можно всё сделать на одном таймере, например что б досчитать до 1 000 000 - нужно сосчитать 15 timer_ovf прерываний по переполнению счёта (2^16) и на последнем прерывании запрограммировать OCR1 или ICR1 на выход в прерывание через 16975 тактов.
Nucleo k303. На STM32f303k8. По ногам точная копия NANO. Легко програмируется на mbed.com в стиле ардуины. У неё есть 32 битные таймеры. Частота 72 МГц. 12 бит цап и ацп. Ну и остальной периферии куча. Таймеры можно аппаратно каскадировать.
Стоит дороже, писать сложнее. Для простых применений не очень и нужна.
Как то что написано относится к 24 разрядному таймеру?
Стоит дороже, писать сложнее. Для простых применений не очень и нужна.
Чел походу мутит типа "крутой" частотомер. Так СТМ32Ф0хх, СТМ32Ф100, СТМ32Ф103, СТМ8Лххх, СТМ8С903 ему в помощь. Дёшево и сердито. Если раскинуть извилинами то и СТМ8С003 прокатит, вообще шара.
Примерно так же, как совет использовать F303 в ответ на вопрос "как объединить 16-и и 8-битные таймеры".
С этим еще можно частично согласиться.
Стоит дороже
По приколу глянул как дела в ларе напротив.
ATmega2560-16AU в одну цену с STM32F373VCT6. STM32F091VCT6 - в половину дешевле.
Примерно так же, как совет использовать F303 в ответ на вопрос "как объединить 16-и и 8-битные таймеры".
Два года назад передо мной стояла похожая задача. В рамках AVR я её решить не смог. Пришлость искать каким контроллером эту задачу можно решить. STM оказался самым подходящим. Задача решена. Устройство работает. Заодно научился програмировать STM. O чём ни минуты не жалею. Это решение я предложил топикстартеру.
Так а какой совет предложили вы?
Я предложил не следовать этому совету.
Два года назад передо мной стояла похожая задача. В рамках AVR я её решить не смог. Пришлость искать каким контроллером эту задачу можно решить. STM оказался самым подходящим. Задача решена. Устройство работает. Заодно научился програмировать STM. O чём ни минуты не жалею. Это решение я предложил топикстартеру.
Ну так поделились бы готовым рабочим кодом. В последнее время всё чаще и чаще звучат слова, о том как на STM всё лучше и удобнее, но готовых программ при этом никто не публикует. А так бы интересно было посмотреть на код того-же частотометра на ARM, с комментариями, описанием принципа работы, с примерными характеристиками.. :)
Я предложил не следовать этому совету.
Т. е. вы ничего не предложили. Или предложили оставаться дураком на ардуине?
Это был не частотомер, а програмируемый таймер, который должен выдавать по восьми каналам импульсы с точностью до 10 мкс в течении секунды. Если интересно, могу скинуть листинг с коментариями. Он конечно существенно длиннее программ на ардуине, но в основном за счет того, что всё то что спрятано в стетчах в библиотеки находится в листинге. Описание скорее на статью тянет.
Ну так поделились бы готовым рабочим кодом.
Я вас умоляю! Какой там код!? Чтобы соединить два таймера там пару строчек инита таймеров. Всё! К тому же это всё есть в апнотах.
В последнее время всё чаще и чаще звучат слова, о том как на STM всё лучше и удобнее, но готовых программ при этом никто не публикует.
1. Никто не публикует потому что там действительно всё просто.
2. Публикуют. Гугел знает всё.
А так бы интересно было посмотреть на код того-же частотометра на ARM, с комментариями, описанием принципа работы, с примерными характеристиками.. :)
Дык, тема была на котах, пару частотомеров были на изыйдиэлектроникс, основные моменты частотомеростроения по ссылкам ЛИ можно найти, у GFX вроде в его ослике на СТМ32 частотомер присутствует.
Примерные характеристики можно прикинуть на калькуляторе, там теория с практикой совпадает, так как всё практически хардварно.
На СТМ8С003 до 80МГц, при прямом и реципрокал измерениях, без внешних навесов, на СТМ32Ф0хх до 106МГц, при полной точности, и до 160Мгц с небольшим снижением точности, без внешних навесов, при прямом и реципрокал измерениях.
Это был не частотомер, а програмируемый таймер, который должен выдавать по восьми каналам импульсы с точностью до 10 мкс в течении секунды. Если интересно, могу скинуть листинг с коментариями. Он конечно существенно длиннее программ на ардуине, но в основном за счет того, что всё то что спрятано в стетчах в библиотеки находится в листинге. Описание скорее на статью тянет.
Печально. Завязывайте с програмированем. Если это не смогли в 328-ю засунуть, то займитесь чем другим. Хоть я вижу уже понемногу в рекламу втягиваетесь.
Код.
Как настроить таймер и прерывание не расписываю - скучно. Добавлю только что счетчики можна и 16 битный делать, т.к. они измеряют не полный интервал а куски его, если его даже не хватает (более 655мсек), то решается несколькими одинаковы ми значениями OutPort[]. Это сложней для понимания, потому в примере лонги. Да еще если есть умение - лучше оптимизировать сохранение регистров в обработчике, т.к. в большинстве проходов будет выполнятся только декремент, то сохранять при входе желательно только то что портит десремент, а при входе в if уже сохранять остальное.
Вобще, на таком подходе можна легко формировать очень сложноизменяющиеся сигналы. Переодичность их повтора, изменение от прохода к проходу - все легко делается и засовывается в массивы. Если кто попробует - сразу поймет почему програмеры так любят сортировки и как они легко вылазят там, где их вроде и недолжно :)
ПС. Уточнения задачи, хотелки и вопросы размещайте сразу в "Ищу исполнителя"
Да собственно именно так и написано. Только интервалы не приходится щелкать. 32 бит таймера достаточно без ухищерий. Да и кучу других задач параллельно решать.
А зачем в "Ищу исполнителя", если всё работает и нет никаких хотелок?
Вобще, на таком подходе можна легко формировать очень сложноизменяющиеся сигналы. Переодичность их повтора, изменение от прохода к проходу - все легко делается и засовывается в массивы.
Да куда вы ещё лезете со своим диким примитивизмом. Вам бы только в дворце пионеров басни рассказывать. На СТМ32 настраивается ДМА и таймер и все ваши хотелки отлетают как пирожки хардварно, без прерываний и извратов с таймером.
Уточнения задачи, хотелки и вопросы размещайте сразу в "Ищу исполнителя"
Угу! С предложением "Прощу загадить мою работающую отлично прогу за бабло". )))))))))))))))))))
Да собственно именно так и написано. Только интервалы не приходится щелкать. 32 бит таймера достаточно без ухищерий. Да и кучу других задач параллельно решать.
От слов "кучу других задач параллельно решать" у некоторых тут мозг просто рвёт на части. )))))))))))))
Особенно, когда их нет.
Я вас умоляю! Какой там код!? Чтобы соединить два таймера там пару строчек инита таймеров. Всё! К тому же это всё есть в апнотах.
Вот о чём я и говорю. Все говорят что просто, а код не показывают. Вам, как миссионеру от STM, уж тем более примеры всем страждающим писать :) Тем более на этом форуме 90% чайников, котором не то что апноуты сроду не разобрать, а и элементарные вещи нужно разжёвывать как детям. Лично я не вечный адепт меги328, и может быть и не против что-то ещё поизучать, но нет мотивации, и нет искры что-б зажгла интерес. Лежит вот дома DUE, сунулся было читать её даташиты -а там, батюшки родные, ничего общего с AVRом, ни одного похожего регистра. Ну ладно, дай думаю почитаю про то, как работать с DAC, а там прямо в апноуте вместо того, что б расписать подробно про DAC и регистры -ссылаются на какие-то функции, внутренность которых не пишут, и где брать те функции -тоже ни слова! Потом уж нашёл, что для этого нужно ставить дополнительные фреймворки и где-то там в дебрях выискивать из чего же эти функции состоят. Ну ладно, кручу даташит вниз, в предвкушении чтива "Instruction Set", где описываются поддерживаемые ассемблерные команды -а где они? Нету! Тут уже захотелось обматерить всех и вся. Как можно не написать ассемблерные команды. Может меня тошнит от СИ и фреймворков, может хочется олдскульно набивать прогу в блокноте и в консоле компилить. Вобщем запулил DUE обратно в ящик, взял родную мегу328 погладил как котёнка и успокоился :))
Прямо рассказ получился)) Так к чему я - просто так писать что "на stm это проще" -это не реклама. Нужно дать попробовать, рассказать интересно, итп. И глядишь народ потянется :)
Особенно, когда их нет.
Может у вас своё видение мира через розовые шоры, может для вас параллельные задачи как для других инопланетяне или йети, но они (параллельные задачи) всё же существуют. У вас Ченовская ФАТ как работает, сначала в буфер, потом из буфера? У меня Ченовская ФАТ, например, с ТФТ работает напрямую, хоть по СПИ, хоть по шине. Нет последовательности "прочитать в буфер" и "вывести из буфера", панимаешь ли.
Это ж ARM. Инструкции все на сайте ARM-а.
Существуют. Но ситуации, когда процессору просто нечего делать, существуют, куда чаще.
Я вас умоляю! Какой там код!? Чтобы соединить два таймера там пару строчек инита таймеров. Всё! К тому же это всё есть в апнотах.
Вот о чём я и говорю. Все говорят что просто, а код не показывают.
Увы, бюджет рекламной кампании не предполагает разработку кода. Достаточно убедительно писать "вот я делал..", "Да собственно именно так и написано.." и ".. настраивается ДМА". Боже, разясните ж там ему что ДМА, он же ПДП уже полсотни лет как существует, а в МК невостребован особо т.к. и 5% задач для него не находится.
Наибольший шанс их код видеть - если они чего нагуглят ))) Предупреждаю, я сразу проверю ;)
Вот о чём я и говорю. Все говорят что просто, а код не показывают.
"Код ничто, главное идея."(с)
Вам, как миссионеру от STM
Хоть вы не начинайте. Никакого отношения к СТМ я не имею.
Лично я не вечный адепт меги328, и может быть и не против что-то ещё поизучать, но нет мотивации, и нет искры что-б зажгла интерес.
Это не ко мне, я ж не Прометей. Просто начните, может интерес и появится. Но только не на ДУЕ или другой около ардуиновской фигне. Иначе утащит обратно.
взял родную мегу328 погладил как котёнка и успокоился :))
Понимаю. То что привычно то и успокаивает.
"на stm это проще" -это не реклама. Нужно дать попробовать, рассказать интересно, итп. И глядишь народ потянется :)
А где вы видели рекламу?
А где вы видели рекламу?
8o
Ничего в Штирлице не выдавало руского шпиона...
Существуют. Но ситуации, когда процессору просто нечего делать, существуют, куда чаще.
И что? Меня это должно волновать, если нет режима сохранения энергии? Какая мне разница, что всё будет разруливать, периферия или ядро МК?
Боже, разясните ж там ему что ДМА, он же ПДП уже полсотни лет как существует, а в МК невостребован особо т.к. и 5% задач для него не находится.
Блин, кто ж тебе справку в школе коррекции то выдал!? )))))))))))))))))))
Весь цимус в СТМ32, в отличие от других МК, это развитые таймера и ДМА. Что позволяет делать многие вещи хардварными, а не ногодрыжными до усеру. Выше только ПСоК и ЦПЛД.
Ну ладно, кручу даташит вниз, в предвкушении чтива "Instruction Set", где описываются поддерживаемые ассемблерные команды -а где они? Нету!
Вот несколько документов по ассемблеру на Cortex-M3, может пригодятся: 1, 2, 3, 4, 5, 6
PSoC-и, кстати, крайне интересные штуки. С любопытством время от времени разглядываю кипарисовский 5LP и мучительно чешу репу, куда бы это применить. Как придумаю, то наверное точно куплю. Десять долларов за девборду с программатором, считай халява.
Jeka_M, ага, как раз те самые ассемблерные команды, спасибо.
PSoC-и, кстати, крайне интересные штуки. С любопытством время от времени разглядываю кипарисовский 5LP
Ну так и купите для поиграться. Что мешает? Может тогда понятие "куда применить" и придёт.
Увы, бюджет рекламной кампании не предполагает разработку кода. Достаточно убедительно писать "вот я делал..", "Да собственно именно так и написано.." и ".. настраивается ДМА". Боже, разясните ж там ему что ДМА, он же ПДП уже полсотни лет как существует, а в МК невостребован особо т.к. и 5% задач для него не находится.
Наибольший шанс их код видеть - если они чего нагуглят ))) Предупреждаю, я сразу проверю ;)
Обидны ваши слова про рекламу. Вот кусок из рабочего проекта - как раз то же самое прерывание
pulsearr - массив расчитанных длительностей и состояний порта. Длительности загружаются в регистр сравнения таймера, состояния выходов в нижнюю половину порта С. При достижении максимальной длительности цикл выдачи останавливается и ждёт следующего импульса синхронизации. Почти один в один с вашим.
К тому же таймер не живёт в вакууме. Вспомните, что надо ещё массивы на вывод на дисплей, обработку меню и кнопок, хранение исходной информации об импульсах,сортировку, регистры MODBUS. Сколько памяти останется на рабочие массивы скажем у NANO? Сколько импульсов можно будет выдать? К тому же предделитель придётся ставить не оптимальный - 10 мкс можно получить только с предделителем 8 или 32 (последний не у всех есть, а с 64 не получится кратность 10мкс). Т.е максимальный не обслуживаемый период будет 32мс.
как раз те самые ассемблерные команды
Я, лично, не стал бы с этого начинать. Начинать лучше с какой нибудь дискавери и примеров к ней. Это уже потом, когда придёт понимание происходящего и уверенность, можно заняться оптимизацией и АСМом, если это действительно нужно.
Обидны ваши слова про рекламу.
Да забейте вы на этого убогого и неграмотного клоуна. Реальный вопрос с другого форума, для примера, может когда уже и приводил.
Кто может подскажет, возможно ли на камне STM32F051Rxx реализовать аппаратно на одном таймере 4 выхода, одинаковые прямоугольники, сдвинутые по фазе на 90 градусов относительно друг друга (т.е. фазы 0, 90, 180 и 270)? Т.е. настроил таймер и дальше он сам.
Вот пусть этот грамотей, без ДМА, на своей 328-й изобразит всю красоту своих познаний и совершенства.
Там это можно сделать на TIM1 и даже без DMA и с регулируемым dead time между фронтами.
Попробуйте, для общего развития.
Зачем пробовать? Есть уже готовый.
Таймер загоняется максимальное значение tt[8]. Период регулируется предделителем или значениями tt. Dead time - tt.
Кстати и на AVR то же самое с легкостью делается. Работает почти точно так же, вот только из-за не атомарного доступа остальные 4 бита порта использовать нельзя без запрещения прерываний, иначе портятся значения. В STM можно.
Таймер загоняется максимальное значение tt[8]. Период регулируется предделителем или значениями tt. Dead time - tt.
Кстати и на AVR то же самое с легкостью делается. Работает почти точно так же, вот только из-за не атомарного доступа остальные 4 бита порта использовать нельзя без запрещения прерываний, иначе портятся значения. В STM можно.
Хорошая попытка. Попытка намбэр ту.
Кто может подскажет, возможно ли на камне STM32F051Rxx реализовать аппаратно на одном таймере 4 выхода, одинаковые прямоугольники, сдвинутые по фазе на 90 градусов относительно друг друга (т.е. фазы 0, 90, 180 и 270)? Т.е. настроил таймер и дальше он сам.
Аппаратно! Т.е. без софта, даже если он и в прерывании.
Можете сразу начинать есть свой галстук и шляпу. Перец и соль дать? ))))))))))))))))))
Кстати и на AVR то же самое с легкостью делается. Работает почти точно так же, вот только из-за не атомарного доступа остальные 4 бита порта использовать нельзя без запрещения прерываний, иначе портятся значения. В STM можно.
Все так, но можно и 4 бита на AVR использовать Просто биты порта переключать xor. И атомарно будет, и младшие не тронет.
Аппаратно! Т.е. без софта, даже если он и в прерывании.
Это несварение у тебя от шляпы или от галстука? ))))))))))))))
Или ты их пересолил? )))))))))))
а ты уже свой код и диас выложил что тужишся?
когда програмеры общаются, шантрапе рекламной только слушать разрешается..
Ну так слушайся и не дёргай поводок, шантрапа. Вопрос уже решён давно. )))))))))
Так?
Ну что вы право дело пристали с намбер ту? Открываем примеры STM
....\arm\examples\ST\STM32F10x\stm32f10x_stdperiph_lib\Project\STM32F10x_StdPeriph_Examples\TIM\DMA\main.c
получите пример без единой софтверной команды кручения таймера через DMA. Настраивается под свои нужды на раз.