24 битный таймер

Buldakov
Offline
Зарегистрирован: 17.01.2016

Как обьединить 16 и 8 битный таймер в один 24 битный таймер на аппаратном и программном уровне не используя программный счет количества переполнений?

Имеем 2 таймера: Таймер 2 (8бит) и Таймер 1(16 бит). Частоту кварца мы подаем на Таймер 2. Выход Таймера 2 перемычкой соединяем со входом Таймера 1.

Вопросы:

1.Как настроить Таймеры для работы в данной связке?

2.Как правильно запустить и остановить общий таймер?

3.Как посчитать количество тактов?

4.Как настроить и запустить данный таймер для формирования задержки в количестве тактов до формирования прерывания на выходе Таймера 1?

 

 

MacSim
Offline
Зарегистрирован: 28.11.2012

А смысл сего чудо-действия каков? Может с этого надо начать? И тогда возможно Вам подскажут вариант попроще.

 

negavoid
Offline
Зарегистрирован: 09.07.2016

Buldakov пишет:

Выход Таймера 2 перемычкой соединяем со входом Таймера 1.

Входы и таймера 1, и таймера 2 находятся внутри кристалла, перемычкой не замкнуть, атмега - не плис, pll не подвигать. PS В очередной раз пересматриваю "Особенности...", ну, за микроэлектронику! (c)

PS2 Ан нет, я ошибался, есть такая возможность внешнего тактирования с ноги. Биты cs[12:10] http://www.engblaze.com/microcontroller-tutorial-avr-and-arduino-timer-interrupts/

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

negavoid, не, ну ТС имел в виду, сделать на первом таймере ногодрыг в СТС режиме и эту ногу замкнуть на ногу тактирования второго таймера. Это вполне возможно, почему нет?

Buldkoav, это реально серьёзная работа на несколько часов. Идею как соединить я написал (но Вы, наверное, и сами её понимали, иначе не придумали бы этого).

Что до всего остального, но неясно для чего это нужно, а потому неясно как делать. ну,например, Ваш общий таймер в каком режиме должен работать? От этого много чего зависит.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Buldakov, начнём с того, что есть два способа ввести таймеры в симбиоз. (1) Последовательный (2) паралельный. Про последовательный способ вы начали писать - 8-битный таймер строчит на частоте МК, на 256 такт подаёт лог.1 на свою аппаратную ногу. На любой другой такт подаёт лог.0. Т.е. таймер работает в режиме PWM.  Его аппаратная нога соединена с входом Т1 первого таймера, который настроен на внешнее тактирование (TCCR1B=B111) В результате в счётном регистре 8-битного таймера имеем младший  байт суммарного счёта, а в счётном TCTN1 -два старших байта.  Либо паралельный вариант, он без внешних проводков - оба таймера работают в режиме CTC, но 16-битный делит тактовую на 256. Результат тот-же. Оба варианта требуют предварительную синхронизацию таймеров. (об этом подробнее писал тут )

Buldakov
Offline
Зарегистрирован: 17.01.2016

Ссылку посмотрю. Вообще в таком случае меня интересует последовательный таймер.

Допустим мне надо сделать делитель на 1000000. Второй таймер настраиваю на переключение по достижению значения.А первый таймер на вызов прерывания. Допустим во 2 таймер записали число 49, а в 1 таймер число 9999. Тогда 2 таймер делит частоту в 100 раз, а первый при приходе 10000 импульсов срабатывает по прерыванию по таймеру 1.

Теперь самый непонятный момент. Если мы остановили оба таймера. Считали значение с 1 и 2 таймера,  но как считать логическое состояние выхода 2 таймера мне не понятно. Возможно ли это сделать? Или лучше как вы советуете перевести 2 в режим PWR?

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Buldakov, я не понимаю что вам нужно, какая практическая цель.  Симбиоз имеет смысл если вам нужно досчитать до 2^24  не дёргая прерывания.  Если вы дёргаете прерывания, или меняете логику изложенную в #4,  то смысл объединять если не  теряется совсем, то сильно уменьшается.  Тогда можно всё  сделать на одном таймере, например  что б досчитать до 1 000 000  - нужно  сосчитать 15 timer_ovf прерываний по переполнению счёта (2^16)  и на последнем прерывании запрограммировать OCR1 или ICR1 на выход в прерывание через 16975 тактов.

nik182
Offline
Зарегистрирован: 04.05.2015

Nucleo k303. На STM32f303k8. По ногам точная копия NANO. Легко програмируется на mbed.com в стиле ардуины. У неё есть 32 битные таймеры. Частота 72 МГц. 12 бит цап и ацп. Ну и остальной периферии куча. Таймеры можно аппаратно каскадировать.

a5021
Offline
Зарегистрирован: 07.07.2013

Стоит дороже, писать сложнее. Для простых применений не очень и нужна.

nik182
Offline
Зарегистрирован: 04.05.2015

Как то что написано относится к 24 разрядному таймеру?

ssss
Offline
Зарегистрирован: 01.07.2016

a5021 пишет:

Стоит дороже, писать сложнее. Для простых применений не очень и нужна.

Чел походу мутит типа "крутой" частотомер. Так СТМ32Ф0хх, СТМ32Ф100, СТМ32Ф103, СТМ8Лххх, СТМ8С903 ему в помощь. Дёшево и сердито. Если раскинуть извилинами то и СТМ8С003 прокатит, вообще шара.

a5021
Offline
Зарегистрирован: 07.07.2013

nik182 пишет:
Как то что написано относится к 24 разрядному таймеру?

Примерно так же, как совет использовать F303 в ответ на вопрос "как объединить 16-и и 8-битные таймеры".

ssss пишет:
Дёшево и сердито. Если раскинуть извилинами то и СТМ8С003 прокатит, вообще шара.

С этим еще можно частично согласиться.

ssss
Offline
Зарегистрирован: 01.07.2016

a5021 пишет:

Стоит дороже

По приколу глянул как дела в ларе напротив.

ATmega2560-16AU в одну цену с STM32F373VCT6. STM32F091VCT6 - в половину дешевле.

 

nik182
Offline
Зарегистрирован: 04.05.2015

a5021 пишет:

Примерно так же, как совет использовать F303 в ответ на вопрос "как объединить 16-и и 8-битные таймеры".

Два года назад передо мной стояла похожая задача. В рамках AVR я её решить не смог. Пришлость искать каким контроллером эту задачу можно решить. STM оказался самым подходящим. Задача решена. Устройство работает. Заодно научился програмировать STM. O чём ни минуты не жалею. Это решение я предложил топикстартеру.

Так а какой совет предложили вы? 

a5021
Offline
Зарегистрирован: 07.07.2013

Я предложил не следовать этому совету.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

nik182 пишет:

Два года назад передо мной стояла похожая задача. В рамках AVR я её решить не смог. Пришлость искать каким контроллером эту задачу можно решить. STM оказался самым подходящим. Задача решена. Устройство работает. Заодно научился програмировать STM. O чём ни минуты не жалею. Это решение я предложил топикстартеру.

Ну так поделились бы готовым рабочим кодом. В последнее время всё чаще и чаще звучат слова, о том как на STM всё лучше и удобнее, но готовых программ при этом никто не публикует. А так бы интересно было посмотреть на код того-же частотометра на ARM, с комментариями, описанием принципа работы, с примерными характеристиками.. :)

 

ssss
Offline
Зарегистрирован: 01.07.2016

a5021 пишет:

Я предложил не следовать этому совету.

Т. е. вы ничего не предложили. Или предложили оставаться дураком на ардуине?

nik182
Offline
Зарегистрирован: 04.05.2015

Это был не частотомер, а програмируемый таймер, который должен выдавать по восьми каналам импульсы с точностью до 10 мкс в течении секунды. Если интересно, могу скинуть листинг с коментариями. Он конечно существенно длиннее программ на ардуине, но в основном за счет того, что всё то что спрятано в стетчах в библиотеки находится в листинге. Описание скорее на статью тянет.  

ssss
Offline
Зарегистрирован: 01.07.2016

dimax пишет:

Ну так поделились бы готовым рабочим кодом.

Я вас умоляю! Какой там код!? Чтобы соединить два таймера там пару строчек инита таймеров. Всё! К тому же это всё есть в апнотах.

Цитата:

В последнее время всё чаще и чаще звучат слова, о том как на STM всё лучше и удобнее, но готовых программ при этом никто не публикует.

1. Никто не публикует потому что там действительно всё просто.

2. Публикуют. Гугел знает всё.

Цитата:

А так бы интересно было посмотреть на код того-же частотометра на ARM, с комментариями, описанием принципа работы, с примерными характеристиками.. :)

Дык, тема была на котах, пару частотомеров были на изыйдиэлектроникс, основные моменты частотомеростроения по  ссылкам ЛИ можно найти, у GFX вроде в его ослике на СТМ32 частотомер присутствует.

Примерные характеристики можно прикинуть на калькуляторе, там теория с практикой совпадает, так как всё практически хардварно.

На СТМ8С003 до 80МГц, при прямом и реципрокал измерениях, без внешних навесов, на СТМ32Ф0хх до 106МГц, при полной точности, и до 160Мгц с небольшим снижением точности, без внешних навесов, при прямом и реципрокал измерениях. 

Logik
Offline
Зарегистрирован: 05.08.2014

nik182 пишет:

Это был не частотомер, а програмируемый таймер, который должен выдавать по восьми каналам импульсы с точностью до 10 мкс в течении секунды. Если интересно, могу скинуть листинг с коментариями. Он конечно существенно длиннее программ на ардуине, но в основном за счет того, что всё то что спрятано в стетчах в библиотеки находится в листинге. Описание скорее на статью тянет.  

Печально. Завязывайте с програмированем. Если это не смогли в 328-ю засунуть, то займитесь чем другим. Хоть я вижу уже понемногу в рекламу втягиваетесь. 

Код.

static volatile long int Cnt;
static volatile byte St;
#define MAX_CHNG       20 // максимальное число смен состояний, т.е. 8*2 минус число случаев где совпадают изменения нескольких каналов, 20 - с запасом
static volatile long int Intervals[MAX_CHNG]; //интервалы между сменой состояний каналов 
static volatile byte OutPort[MAX_CHNG];       //счередное состояние каналов
//заполняем Intervals и OutPort  согласно требуемым временным интервалам
.......
//прерывания по таймеру вызывать каждые 10мкс
ISR( TIMER1_OVF_vect )
{
  Cnt--;
  if(!Cnt) 
  {
    PORTC=OutPort[St]; // выводим очередное состояние каналов
    Cnt=Intervals[St]; // теперь формируем следующий интервал
    St++;
  }
}

Как настроить таймер и прерывание не расписываю - скучно. Добавлю только что счетчики можна и 16 битный делать, т.к. они измеряют не полный интервал а куски его, если его даже не хватает (более 655мсек), то решается несколькими одинаковы ми значениями OutPort[]. Это сложней для понимания, потому в примере лонги. Да еще если есть умение - лучше оптимизировать сохранение регистров в обработчике, т.к. в большинстве проходов будет выполнятся только декремент, то сохранять при входе желательно только то что портит десремент, а при входе в if уже сохранять остальное.

Вобще, на таком подходе можна легко формировать очень сложноизменяющиеся сигналы. Переодичность их повтора, изменение от прохода к проходу - все легко делается и засовывается в массивы. Если кто попробует - сразу поймет почему програмеры так любят сортировки и как они легко вылазят там, где их вроде и недолжно :) 

ПС. Уточнения задачи, хотелки и вопросы размещайте сразу  в "Ищу исполнителя" 

nik182
Offline
Зарегистрирован: 04.05.2015

Да собственно именно так и написано. Только интервалы не приходится щелкать. 32 бит таймера достаточно без ухищерий. Да и кучу других задач параллельно решать.

А зачем в  "Ищу исполнителя", если всё работает и нет никаких хотелок?  

ssss
Offline
Зарегистрирован: 01.07.2016

Logik пишет:

Вобще, на таком подходе можна легко формировать очень сложноизменяющиеся сигналы. Переодичность их повтора, изменение от прохода к проходу - все легко делается и засовывается в массивы. 

Да куда вы ещё лезете со своим диким примитивизмом. Вам бы только в дворце пионеров басни рассказывать. На СТМ32 настраивается ДМА и таймер и все ваши хотелки отлетают как пирожки хардварно, без прерываний и извратов с таймером.

Цитата:

Уточнения задачи, хотелки и вопросы размещайте сразу  в "Ищу исполнителя" 

Угу! С предложением "Прощу загадить мою работающую отлично прогу за бабло". )))))))))))))))))))

ssss
Offline
Зарегистрирован: 01.07.2016

nik182 пишет:

Да собственно именно так и написано. Только интервалы не приходится щелкать. 32 бит таймера достаточно без ухищерий. Да и кучу других задач параллельно решать.

От слов "кучу других задач параллельно решать" у некоторых тут мозг просто рвёт на части. )))))))))))))

a5021
Offline
Зарегистрирован: 07.07.2013

ssss пишет:
От слов "кучу других задач параллельно решать"

Особенно, когда их нет.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

ssss пишет:

Я вас умоляю! Какой там код!? Чтобы соединить два таймера там пару строчек инита таймеров. Всё! К тому же это всё есть в апнотах.

Вот о чём я и говорю. Все говорят что просто, а код не показывают. Вам, как миссионеру от STM, уж тем более примеры всем страждающим писать :)  Тем более на этом форуме 90% чайников, котором не то что апноуты сроду не разобрать, а и элементарные вещи нужно разжёвывать как детям. Лично я не вечный адепт меги328, и может быть и не против что-то ещё поизучать, но нет мотивации, и нет искры что-б зажгла интерес. Лежит вот дома DUE, сунулся было читать её даташиты -а там, батюшки родные, ничего общего с AVRом, ни одного похожего регистра. Ну ладно, дай думаю почитаю про то, как работать с DAC, а там прямо в апноуте вместо того, что б расписать подробно про DAC и регистры -ссылаются на какие-то функции, внутренность которых не пишут, и где брать те функции -тоже ни слова! Потом уж нашёл, что для этого нужно ставить дополнительные фреймворки и где-то там в дебрях выискивать из чего же эти функции состоят. Ну ладно, кручу даташит вниз, в предвкушении чтива "Instruction Set", где описываются поддерживаемые ассемблерные команды -а где они? Нету! Тут уже захотелось обматерить всех и вся. Как можно не написать ассемблерные команды. Может меня тошнит от СИ и фреймворков, может хочется олдскульно набивать прогу в блокноте и в консоле компилить. Вобщем запулил DUE обратно в ящик, взял родную мегу328 погладил как котёнка и успокоился :))

Прямо рассказ получился)) Так к чему я - просто так писать что "на stm это проще" -это не реклама. Нужно дать попробовать, рассказать интересно, итп. И глядишь народ потянется :)

 

ssss
Offline
Зарегистрирован: 01.07.2016

a5021 пишет:

ssss пишет:
От слов "кучу других задач параллельно решать"

Особенно, когда их нет.

Может у вас своё видение мира через розовые шоры, может для вас параллельные задачи как для других инопланетяне или йети, но они (параллельные задачи) всё же существуют. У вас Ченовская ФАТ как работает, сначала в буфер, потом из буфера? У меня Ченовская ФАТ, например, с ТФТ работает напрямую, хоть по СПИ, хоть по шине. Нет последовательности "прочитать в буфер" и "вывести из буфера", панимаешь ли.

a5021
Offline
Зарегистрирован: 07.07.2013

dimax пишет:
Ну ладно, кручу даташит вниз, в предвкушении чтива "Instruction Set", где описываются поддерживаемые ассемблерные команды -а где они? Нету! Тут уже захотелось обматерить всех и вся. Как можно не написать ассемблерные команды.

Это ж ARM. Инструкции все на сайте ARM-а.

ssss пишет:
они (параллельные задачи) всё же существуют.

Существуют. Но ситуации, когда процессору просто нечего делать, существуют, куда чаще.

Logik
Offline
Зарегистрирован: 05.08.2014

dimax пишет:

ssss пишет:

Я вас умоляю! Какой там код!? Чтобы соединить два таймера там пару строчек инита таймеров. Всё! К тому же это всё есть в апнотах.

Вот о чём я и говорю. Все говорят что просто, а код не показывают. 

Увы, бюджет рекламной кампании не предполагает разработку кода. Достаточно убедительно писать "вот я делал..", "Да собственно именно так и написано.." и ".. настраивается ДМА". Боже, разясните ж там ему что ДМА, он же ПДП уже полсотни лет как существует, а в МК невостребован особо т.к. и 5% задач для него не находится. 

Наибольший шанс их код видеть - если они чего нагуглят ))) Предупреждаю, я сразу проверю ;)

ssss
Offline
Зарегистрирован: 01.07.2016

dimax пишет:

Вот о чём я и говорю. Все говорят что просто, а код не показывают.

"Код ничто, главное идея."(с)

Цитата:

Вам, как миссионеру от STM

Хоть вы не начинайте. Никакого отношения к СТМ я не имею.

Цитата:

Лично я не вечный адепт меги328, и может быть и не против что-то ещё поизучать, но нет мотивации, и нет искры что-б зажгла интерес.

Это не ко мне, я ж не Прометей. Просто начните, может интерес и появится. Но только не на ДУЕ или другой около ардуиновской фигне. Иначе утащит обратно.

Цитата:

взял родную мегу328 погладил как котёнка и успокоился :))

Понимаю. То что привычно то и успокаивает.

Цитата:

"на stm это проще" -это не реклама. Нужно дать попробовать, рассказать интересно, итп. И глядишь народ потянется :)

А где вы видели рекламу?

Logik
Offline
Зарегистрирован: 05.08.2014

ssss пишет:

А где вы видели рекламу?

8o

Ничего в Штирлице не выдавало руского шпиона...

ssss
Offline
Зарегистрирован: 01.07.2016

a5021 пишет:

ssss пишет:
они (параллельные задачи) всё же существуют.

Существуют. Но ситуации, когда процессору просто нечего делать, существуют, куда чаще.

И что? Меня это должно волновать, если нет режима сохранения энергии? Какая мне разница, что всё будет разруливать, периферия или ядро МК?

ssss
Offline
Зарегистрирован: 01.07.2016

Logik пишет:

Боже, разясните ж там ему что ДМА, он же ПДП уже полсотни лет как существует, а в МК невостребован особо т.к. и 5% задач для него не находится. 

Блин, кто ж тебе справку в школе коррекции то выдал!? )))))))))))))))))))

Весь цимус в СТМ32, в отличие от других МК, это развитые таймера и ДМА. Что позволяет делать многие вещи хардварными, а не ногодрыжными до усеру. Выше только ПСоК и ЦПЛД.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

dimax пишет:

Ну ладно, кручу даташит вниз, в предвкушении чтива "Instruction Set", где описываются поддерживаемые ассемблерные команды -а где они? Нету!

Вот несколько документов по ассемблеру на Cortex-M3, может пригодятся: 1, 2, 3, 4, 5, 6

a5021
Offline
Зарегистрирован: 07.07.2013

PSoC-и, кстати, крайне интересные штуки. С любопытством время от времени разглядываю кипарисовский 5LP и мучительно чешу репу, куда бы это применить. Как придумаю, то наверное точно куплю. Десять долларов за девборду с программатором, считай халява.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Jeka_M, ага, как раз те самые ассемблерные команды, спасибо.

ssss
Offline
Зарегистрирован: 01.07.2016

a5021 пишет:

PSoC-и, кстати, крайне интересные штуки. С любопытством время от времени разглядываю кипарисовский 5LP

Ну так и купите для поиграться. Что мешает? Может тогда понятие "куда применить" и придёт.

nik182
Offline
Зарегистрирован: 04.05.2015

Logik пишет:

Увы, бюджет рекламной кампании не предполагает разработку кода. Достаточно убедительно писать "вот я делал..", "Да собственно именно так и написано.." и ".. настраивается ДМА". Боже, разясните ж там ему что ДМА, он же ПДП уже полсотни лет как существует, а в МК невостребован особо т.к. и 5% задач для него не находится. 

Наибольший шанс их код видеть - если они чего нагуглят ))) Предупреждаю, я сразу проверю ;)

Обидны ваши слова про рекламу. Вот кусок из рабочего проекта - как раз то же самое прерывание

void TIM2_IRQHandler(void)
{
  if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
     { TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
       GPIOC_Low  = (uint8_t) pulsearr[cpulse][2]; 
       cpulse++; if (cpulse < npulse) 
       TIM_SetCompare1(TIM2,pulsearr[cpulse][0]);     
     }                                 
   else
     {
       TIM_ClearITPendingBit(TIM2, TIM_IT_Update); 
       flPulse=1; LEDP_OFF;
     };
}

pulsearr - массив расчитанных длительностей и состояний порта. Длительности загружаются в регистр сравнения таймера, состояния выходов в нижнюю половину порта С. При достижении максимальной длительности  цикл выдачи останавливается и ждёт следующего импульса синхронизации. Почти один в один с вашим.

К тому же таймер не живёт в вакууме. Вспомните, что надо ещё массивы на вывод на дисплей, обработку меню и кнопок, хранение исходной информации об импульсах,сортировку, регистры MODBUS.  Сколько памяти останется на рабочие массивы скажем у NANO? Сколько импульсов можно будет выдать? К тому же предделитель придётся ставить не оптимальный - 10 мкс можно получить только с предделителем 8 или 32 (последний не у всех есть, а с 64 не получится кратность 10мкс). Т.е максимальный не обслуживаемый период будет 32мс.       

ssss
Offline
Зарегистрирован: 01.07.2016

dimax пишет:

как раз те самые ассемблерные команды

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

ssss
Offline
Зарегистрирован: 01.07.2016

nik182 пишет:

Обидны ваши слова про рекламу.  

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

Цитата:

Кто может подскажет, возможно ли на камне STM32F051Rxx реализовать аппаратно на одном таймере 4 выхода, одинаковые прямоугольники, сдвинутые по фазе на 90 градусов относительно друг друга (т.е. фазы 0, 90, 180 и 270)? Т.е. настроил таймер и дальше он сам.

Вот пусть этот грамотей, без ДМА, на своей 328-й изобразит всю красоту своих познаний и совершенства.

 

nik182
Offline
Зарегистрирован: 04.05.2015

Там это можно сделать на TIM1  и даже без DMA  и с регулируемым dead time между фронтами.   

ssss
Offline
Зарегистрирован: 01.07.2016

Попробуйте, для общего развития.

nik182
Offline
Зарегистрирован: 04.05.2015

Зачем пробовать? Есть уже готовый.

void TIM3_IRQHandler(void)
{
   const uint16_t tt[8] = {1,101,102,202,203,303,304,404};
   static uint8_t itt =0;
        if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
	{   TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
        switch (itt) {
          case  0 : GPIOB->BSRR = GPIO_BSRR_BS8;  itt=1; break;
          case  1 : GPIOB->BSRR = GPIO_BSRR_BR8;  itt=2; break;
          case  2 : GPIOB->BSRR = GPIO_BSRR_BS9;  itt=3; break;
          case  3 : GPIOB->BSRR = GPIO_BSRR_BR9;  itt=4; break;
          case  4 : GPIOB->BSRR = GPIO_BSRR_BS10; itt=5; break;
          case  5 : GPIOB->BSRR = GPIO_BSRR_BR10; itt=6; break;
          case  6 : GPIOB->BSRR = GPIO_BSRR_BS11; itt=7; break;
          case  7 : GPIOB->BSRR = GPIO_BSRR_BR11; itt=0; break;
          default : itt=0; break;            
                    };  
        TIM_SetCompare1(TIM3,tt[itt]);
	}
}

Таймер загоняется максимальное значение tt[8]. Период  регулируется предделителем или значениями tt. Dead time - tt.

Кстати и на AVR то же самое с легкостью делается. Работает почти точно так же, вот только из-за не атомарного доступа остальные 4 бита порта использовать нельзя без запрещения прерываний, иначе портятся значения. В STM можно.

Logik
Offline
Зарегистрирован: 05.08.2014
nik182 пишет:
 
Вот кусок из рабочего проекта - как раз то же самое прерывание
 
 
от эту уже интересней. Длительность таймера устанавливаете прям из прерывания. Это верно зачем лишний раз дергать. На 328 разумеется  это также реализуемо. Ну и? Такой подход на обоих МК дают требуемое. Это по теме топика. 
 
nik182 пишет:
 
 Вспомните, что надо ещё массивы на вывод на дисплей, обработку меню и кнопок, хранение исходной информации об импульсах,сортировку, регистры MODBUS.  Сколько памяти останется на рабочие массивы скажем у NANO? 
 
Я в примере выделил около 100 байт, т.е. 95% остается под кнопки и т.д. Процессорного времени, ну пусть 20% ушло.
На меню, кнопки и модбас ресурсов и т.д. с головой. Про массивы на вывод на дисплей - ну смотря какой массив. 
nik182 пишет:
Сколько импульсов можно будет выдать?
 
Логика подсказывает раз 8 каналов, нужно 8 импульсов, хотя подход очевидно позволяет большее, достаточно сказать 10 байт на импульс. Опять таки мелочи.
 
nik182 пишет:
К тому же предделитель придётся ставить не оптимальный - 10 мкс можно получить только с предделителем 8 или 32 (последний не у всех есть, а с 64 не получится кратность 10мкс). Т.е максимальный не обслуживаемый период будет 32мс.       
 
Ну у второго таймера есть 32 чего и достаточно.
 
Ну и что в итоге? Оба контроллера позволяют решить основную задачу формирования импульсов и вспомогательные задачи (кнопки, меню и т.д.). Единственная оговоркак - если ОЗУ 328 не хватит, для массивов вывода на экран, тогда у него проблема. В общем МК целиком эквивалентны с оговоркой о ОЗУ.
 
Еще любопытно сравнить обе реализации на предмет числа ассемблерных команд (ну вобще такты интересны на самом деле, но их пока подрузомеваем). Там, где у 328 элементарные операции, у STM вызовы функций (может конечно макросы? тогда в что развернутся?). И выиграш частоты 72/16 на этом моменте в значительной степени нивелируется. Что уже не раз замечено. nik182, а дизасм сделаете? Тогда я признаю свою неправоту в плане вашего соучастия в рекламе. А покуда я не вижу технической необходимости в смене платформы. Ну кроме естественного любопытства и желания расширить горизонты, это святое и не обсуждается :) 
ssss
Offline
Зарегистрирован: 01.07.2016

nik182 пишет:

Таймер загоняется максимальное значение tt[8]. Период  регулируется предделителем или значениями tt. Dead time - tt.

Кстати и на AVR то же самое с легкостью делается. Работает почти точно так же, вот только из-за не атомарного доступа остальные 4 бита порта использовать нельзя без запрещения прерываний, иначе портятся значения. В STM можно.

Хорошая попытка. Попытка намбэр ту.

Цитата:

Кто может подскажет, возможно ли на камне STM32F051Rxx реализовать аппаратно на одном таймере 4 выхода, одинаковые прямоугольники, сдвинутые по фазе на 90 градусов относительно друг друга (т.е. фазы 0, 90, 180 и 270)? Т.е. настроил таймер и дальше он сам.

Аппаратно! Т.е. без софта, даже если он и в прерывании.

 

ssss
Offline
Зарегистрирован: 01.07.2016

Logik пишет:

Тогда я признаю свою неправоту в плане вашего соучастия в рекламе.

Можете сразу начинать есть свой галстук и шляпу. Перец и соль дать? ))))))))))))))))))

Logik
Offline
Зарегистрирован: 05.08.2014

nik182 пишет:

Кстати и на AVR то же самое с легкостью делается. Работает почти точно так же, вот только из-за не атомарного доступа остальные 4 бита порта использовать нельзя без запрещения прерываний, иначе портятся значения. В STM можно.

Все так, но можно и 4 бита на AVR использовать Просто биты порта переключать xor. И атомарно будет, и младшие не тронет.

Logik
Offline
Зарегистрирован: 05.08.2014

ssss пишет:

Аппаратно! Т.е. без софта, даже если он и в прерывании.

Научись код писать, не прийдется ежа через жопу рожать.

ssss
Offline
Зарегистрирован: 01.07.2016

Это несварение у тебя от шляпы или от галстука? ))))))))))))))

Или ты их пересолил? )))))))))))

Logik
Offline
Зарегистрирован: 05.08.2014

а ты уже свой код и диас выложил что тужишся?

когда програмеры общаются, шантрапе рекламной только слушать разрешается..

ssss
Offline
Зарегистрирован: 01.07.2016

Ну так слушайся и не дёргай поводок, шантрапа. Вопрос уже решён давно. )))))))))

nik182
Offline
Зарегистрирован: 04.05.2015
    328          void TIM4_IRQHandler(void)
    329          {
   \                     TIM4_IRQHandler: (+1)
   \   00000000   0xB580             PUSH     {R7,LR}
    330            if (TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET)
   \   00000002   0x2102             MOVS     R1,#+2
   \   00000004   0x.... 0x....      LDR.W    R0,??DataTable16_1  ;; 0x40000800
   \   00000008   0x.... 0x....      BL       TIM_GetITStatus
   \   0000000C   0x2800             CMP      R0,#+0
   \   0000000E   0xD02C             BEQ.N    ??TIM4_IRQHandler_0
    331               { TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);
   \   00000010   0x2102             MOVS     R1,#+2
   \   00000012   0x.... 0x....      LDR.W    R0,??DataTable16_1  ;; 0x40000800
   \   00000016   0x.... 0x....      BL       TIM_ClearITPendingBit
    332                 GPIOB->ODR = pulsearr[cpulse][2]; 
   \   0000001A   0x.... 0x....      LDR.W    R0,??DataTable16_3
   \   0000001E   0x.... 0x....      LDR.W    R1,??DataTable16_4
   \   00000022   0x6809             LDR      R1,[R1, #+0]
   \   00000024   0x2206             MOVS     R2,#+6
   \   00000026   0x4351             MULS     R1,R2,R1
   \   00000028   0x4408             ADD      R0,R0,R1
   \   0000002A   0x8880             LDRH     R0,[R0, #+4]
   \   0000002C   0x.... 0x....      LDR.W    R1,??DataTable16_5  ;; 0x40010c0c
   \   00000030   0x6008             STR      R0,[R1, #+0]
    333                 cpulse++; if (cpulse < npulse) 
   \   00000032   0x.... 0x....      LDR.W    R0,??DataTable16_4
   \   00000036   0x6800             LDR      R0,[R0, #+0]
   \   00000038   0x1C40             ADDS     R0,R0,#+1
   \   0000003A   0x.... 0x....      LDR.W    R1,??DataTable16_4
   \   0000003E   0x6008             STR      R0,[R1, #+0]
   \   00000040   0x.... 0x....      LDR.W    R0,??DataTable16_4
   \   00000044   0x6800             LDR      R0,[R0, #+0]
   \   00000046   0x.... 0x....      LDR.W    R1,??DataTable16_6
   \   0000004A   0x6809             LDR      R1,[R1, #+0]
   \   0000004C   0x4288             CMP      R0,R1
   \   0000004E   0xD21A             BCS.N    ??TIM4_IRQHandler_1
    334                 TIM_SetCompare1(TIM4,pulsearr[cpulse][0]);     
   \   00000050   0x.... 0x....      LDR.W    R0,??DataTable16_3
   \   00000054   0x.... 0x....      LDR.W    R1,??DataTable16_4
   \   00000058   0x6809             LDR      R1,[R1, #+0]
   \   0000005A   0x2206             MOVS     R2,#+6
   \   0000005C   0x4351             MULS     R1,R2,R1
   \   0000005E   0x5A41             LDRH     R1,[R0, R1]
   \   00000060   0x.... 0x....      LDR.W    R0,??DataTable16_1  ;; 0x40000800
   \   00000064   0x.... 0x....      BL       TIM_SetCompare1
   \   00000068   0xE00D             B.N      ??TIM4_IRQHandler_1
    335               }                                 
    336             else
    337               {
    338                 TIM_ClearITPendingBit(TIM4, TIM_IT_Update); 
   \                     ??TIM4_IRQHandler_0: (+1)
   \   0000006A   0x2101             MOVS     R1,#+1
   \   0000006C   0x.... 0x....      LDR.W    R0,??DataTable16_1  ;; 0x40000800
   \   00000070   0x.... 0x....      BL       TIM_ClearITPendingBit
    339                 flPulse=1; LEDP_OFF;
   \   00000074   0x2001             MOVS     R0,#+1
   \   00000076   0x.... 0x....      LDR.W    R1,??DataTable16_7
   \   0000007A   0x6008             STR      R0,[R1, #+0]
   \   0000007C   0xF44F 0x4000      MOV      R0,#+32768
   \   00000080   0x.... 0x....      LDR.W    R1,??DataTable17_1  ;; 0x40010814
   \   00000084   0x6008             STR      R0,[R1, #+0]
    340               };
    341          }
   \                     ??TIM4_IRQHandler_1: (+1)
   \   00000086   0xBD01             POP      {R0,PC}          ;; return
    342          

Так?

Ну что вы право дело пристали с намбер ту? Открываем примеры STM 

....\arm\examples\ST\STM32F10x\stm32f10x_stdperiph_lib\Project\STM32F10x_StdPeriph_Examples\TIM\DMA\main.c

получите пример без единой софтверной команды кручения таймера через DMA. Настраивается под свои нужды на раз.