|
STM8 как правильно сделать функцию Delay |
|
|
|
Dec 15 2015, 13:20
|
Частый гость
Группа: Участник
Сообщений: 85
Регистрация: 20-09-15
Пользователь №: 88 488
|
Кто плотно сталкивался с подобной задачей, как правильно написать универсальную функцию Delay для STM8 Пробывал такой вариант, так вот uS до 7-10 не чувствует, да и перевести в сон процессор нельзя...насколько понимаю если уводить в сон, то только по прерыванию делать? Кто как реализовывает? Код void delays_init (void) { CLK_PCKENR1_bit.PCKEN12 = 1; TIM4_PSCR_bit.PSC = 0x01; TIM4_EGR_bit.UG = 1; TIM4_CR1_bit.CEN = 1; }
void delay_us (unsigned char us) { TIM4_CNTR = 0; while (TIM4_CNTR < us); }
void delay_ms (unsigned int ms) { ms = ms<<2; while (ms--) delay_us(250); }
Сообщение отредактировал IgorKossak - Dec 15 2015, 19:17
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
|
Ответов
|
Jan 16 2016, 20:10
|
Местный
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126
|
Цитата(Tarbal @ Jan 16 2016, 22:17) я бы просто считывал значения счетчика системного таймера из регистра и смотрел на дельту в цикле. Если крутиться в цикле... зачем тогда таймер??? Откуда в СТМ8 системный таймер??? Какой разрядности счётчик... 32 бита??? Ну и сколько это займёт по времени??? Нет никакого смысла в микросекундных задержках... уже сказали... Для единичных случаев всё равно как... в остальных - юзать железо... таймера... Цитата(Spider @ Dec 17 2015, 17:23) В stm8 вообще сложно добиться нужных задержек даже с nop, в виду особенностей работы внутреннего конвейера. При желании можно... но действительно геморно...
|
|
|
|
|
Jan 17 2016, 14:49
|
Профессионал
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439
|
Цитата(HHIMERA @ Jan 17 2016, 00:10) Если крутиться в цикле... зачем тогда таймер??? Я не знаком с STM8 архитектурой, но ведь вроде поднимался вопрос о проблеме свяанной с неповторяемостью задержки, исполненной на програмном цикле, из-за конвейера? Этот подход устранит проблему. Цитата(HHIMERA @ Jan 17 2016, 00:10) Какой разрядности счётчик... 32 бита??? Ну и сколько это займёт по времени??? Такой же какой и регистр таймера. Подход отход займет пару команд исполнить -- считать и сравнить, а задержка будет такая какую запросят с толерансом на подход отход. Цитата(HHIMERA @ Jan 17 2016, 00:10) Нет никакого смысла в микросекундных задержках... уже сказали... Всяко бывает. Убедите ТС в этом. Цитата(HHIMERA @ Jan 17 2016, 00:10) Для единичных случаев всё равно как... в остальных - юзать железо... таймера... Кому все равно, а кому надо, чтобы работало не как получится, а как надо. Цитата(HHIMERA @ Jan 17 2016, 00:10) При желании можно... но действительно геморно... Профессиональный подход действительно налагает дополнительную ответственность, но каждый выбитрает сам куда ему надо идти.
|
|
|
|
|
Jan 17 2016, 17:00
|
Местный
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126
|
Цитата(Tarbal @ Jan 17 2016, 17:49) Я не знаком с STM8 архитектурой, но ведь вроде поднимался вопрос о проблеме свяанной с неповторяемостью задержки, исполненной на програмном цикле, из-за конвейера? Этот подход устранит проблему. Не устранит... да это особо и не нужно... Ради прикола... как-то замутил частотомер на 103-ем... на Си... выравнивал НОПами... Геморно... после каждого исправления/дополнения приходилось всё делать заново... но работало чётко... но только ради прикола... Хардварно - вообще без проблем... всё такт в такт... Цитата Такой же какой и регистр таймера. Подход отход займет пару команд исполнить -- считать и сравнить, а задержка будет такая какую запросят с толерансом на подход отход. 8 бит??? 16мкС максимум??? Этого даже на 1-wire не хватит... Да и толку... прерывания сделают своё грязное дело... Или опять по старой привычке их запрещать??? Цитата Всяко бывает. Убедите ТС в этом. Зачем??? Сам убедится... Цитата Кому все равно, а кому надо, чтобы работало не как получится, а как надо. Кому надо... пусть привыкает к хардварным... или полухардварным решениям... Даже на том же 103-ем... 1-wire... как сказал уже Паша... таймер с компараторами и на прерывании... Цитата Профессиональный подход действительно налагает дополнительную ответственность, но каждый выбитрает сам куда ему надо идти. Не... если кому-то нравится тратить таймер просто так... то я его найду где применить... Их там и так чуть-чуть в младшеньких... всего три...
|
|
|
|
|
Jan 18 2016, 07:24
|
Местный
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126
|
Цитата(Tarbal @ Jan 18 2016, 06:32) С конфигурацией таймера ничего делать не надо. Просто читать сам счетчик. Зашибись!!! STM8S003... три таймера... два из них 16-и... один восьмибитный... На таймерах висит... IR-датчик... 1-wire и семисегментник с автокоррекцией разнояркости разрядов... В итоге - ни один из них не является свободнобегущим... Дальше... зачем здесь нужны микросекунды... если всё или хардварно... или полухардварно??? Как таймером в цикле мерять мкС... если в любой момент прилетит прерывание... и может не одно... и даже одно может прервать другое??? Цитата(Эдди @ Jan 18 2016, 09:26) 1-wire на STM8 только через задницу возможно сделать Да всё там нормально... На STM8L тем более...
|
|
|
|
|
Jan 18 2016, 19:08
|
Знающий
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250
|
Цитата(HHIMERA @ Jan 18 2016, 10:24) Да всё там нормально... На STM8L тем более... У l-ки, да, есть DMA и аппаратный 1-wire элементарно пилится. А вот у s-ок приходится софтварно пихать параметры таймера, т.е. по сути пока передаешь-принимаешь, ничего полезного сделать не получится. А это означает, что если, скажем, нужно LCD использовать, то на КА его индикацию не выйдет сделать — нужно будет по прерыванию еще какого-нибудь таймера, что некошерно! Цитата(Tarbal @ Jan 18 2016, 19:58) Вопрос был как сделать короткую микросекундную задержку, чтобы она была стабильной. Это невозможно. Придется отключать все прерывания, кроме заданного таймера (ну или пока будешь нопы считать). Да и вообще бесполезно это: кому нахрен нужна стабильная микросекундная пауза? Это — верный признак того, что автор лезет не в те дебри!
|
|
|
|
|
Jan 18 2016, 19:37
|
Местный
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126
|
Цитата(Эдди @ Jan 18 2016, 23:08) У l-ки, да, есть DMA и аппаратный 1-wire элементарно пилится. А вот у s-ок приходится софтварно пихать параметры таймера, т.е. по сути пока передаешь-принимаешь, ничего полезного сделать не получится. Эдди... Эдди... притормози... ты ли ещё картинок не насмотрелся??? Что... и здесь их ещё выкладывать??? Майн крутится сам по себе... делай чо хош... По прерыванию с прелоадом грузишь времянку следующего слота... по окончанию преобразования выставляешь флаг... Дальше в майне разруливаешь... Там просечки в майне что-то около 7%... Цитата А это означает, что если, скажем, нужно LCD использовать, то на КА его индикацию не выйдет сделать — нужно будет по прерыванию еще какого-нибудь таймера, что некошерно! LCD на другой таймер... даже если это мелкий TFT... пусть молотит... Цитата Это невозможно. Придется отключать все прерывания, кроме заданного таймера (ну или пока будешь нопы считать). Да и вообще бесполезно это: кому нахрен нужна стабильная микросекундная пауза? Это — верный признак того, что автор лезет не в те дебри! Можно заюзать OPM свободного таймера... если он есть... ну уж точно не вылавливать что-то там в цикле...
Сообщение отредактировал HHIMERA - Jan 18 2016, 19:39
|
|
|
|
|
Jan 18 2016, 19:54
|
Знающий
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250
|
Цитата(HHIMERA @ Jan 18 2016, 22:37) LCD на другой таймер... даже если это мелкий TFT... пусть молотит... И в итоге упрешься в недостачу таймеров, потому что все будешь вешать на них. Уж опрос кнопок и всякие экранчики — штука настолько медленная, что лучше ее через КА в while(1) main'а забульбенить.
|
|
|
|
|
Jan 19 2016, 14:51
|
Гуру
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713
|
Цитата(Tarbal @ Jan 19 2016, 18:06) Не знаю. Я всегда вешал в 10 миллисекундный цикл обработчик клавиатуры и выжидал 50 миллисекунд для успокоения дребезга. Никогда не было с этим проблем. Выжидал не в цикле, а пропуская 5 обращений к обработчику. Вы не поняли. Я не говорю, что это нельзя делать. Я говорю, что в этот цикл (в котором опрашивается кнопка) лучше не включать вызовы других процедур, которые могут длительно выполняться (десятки мсек) и блокировать процесс скана кнопок на десятки мсек ибо будет некомфортно работать с такими кнопками из-за задержек их реакции. Цитата(Эдди @ Jan 19 2016, 19:47) На STM8 я тоже всякие разные методики реализовал. Но самое простое — реализовать аппаратно, т.е. повесить на кнопку кондер и резистор на сотню Ом. RC-цепочка никак не поможет в борьбе с дребезгом сама по себе. Она поможет только если сигнал после неё поступает на вход, имеющий гистерезис (триггер Шмидта). А самая надёжная аппаратная защита от дребезга - парафазный вход set/reset (RS-триггер).
|
|
|
|
|
Jan 19 2016, 14:51
|
Знающий
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250
|
Цитата(jcxz @ Jan 19 2016, 17:47) процедур, которые могут длительно выполняться (десятки мсек) и блокировать процесс Фигасе, это где ж такое видано — блокировать на бешеное время? Если нужно что-то долгое делать, то выполнять порциями по значению таймера. Но лучше все на аппаратную реализацию спихнуть, тогда никаких тормозов не будет.
|
|
|
|
|
Jan 21 2016, 03:35
|
Гуру
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713
|
Цитата(Эдди @ Jan 19 2016, 20:51) Фигасе, это где ж такое видано — блокировать на бешеное время? Если нужно что-то долгое делать, то выполнять порциями по значению таймера. Но лучше все на аппаратную реализацию спихнуть, тогда никаких тормозов не будет. Это хорошо Вам если Вы целиком всё ПО пишете сами. А если у Вас команда из нескольких человек, которые пишут помодульно? И потом нужно в этом общем цикле (а-ля корпоративная многозадачность) собрать вызовы разных чужих функций, каждая написанная в своём стиле и когда не каждый член команды в состоянии адекватно построить алгоритм с ограничением времени работы функции. Элементарная ситуация: Есть ресурс с блокирующим доступом к нему (например - драйвер обмена по какому-то интерфейсу, например - SPI, на котором висит несколько разных устройств). К этому ресурсу обращается одна из функций из этого общего цикла для того, чтобы считать скажем пару байт по SPI с одного из устройств на шине. Транзакция вроде короткая и обычно занимает мало времени. Но!... Если ресурс оказывается занят (из другой задачи ОС другая функция в этот момент осуществляет длительную транзакцию с другим устройством на этой-же самой SPI), то вышеуказанная функция из общего цикла будет теперь ждать длительное время освобождения ресурса. Вот тут и будут происходить редко случающиеся длительные задержки в этом общем цикле приводящие к редким сбоям в опросе клавиш.
|
|
|
|
|
Jan 21 2016, 15:05
|
Знающий
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250
|
Цитата(Tarbal @ Jan 21 2016, 16:06) Вы не сможете ничего изменить. Я бы на вашем месте поискал работу в более здоровом коллективе. ++ Жутко подобное читать!
|
|
|
|
|
Jan 22 2016, 08:40
|
Знающий
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250
|
Цитата(Tarbal @ Jan 21 2016, 21:33) Такое довольно часто встречается если начальство неумное. Если начальник — идиот, надо постараться перетащить его на свою сторону и объяснить, как надо правильно. Если он упорот совершенно и ни в какую не хочет меняться, то только один выход остается — свалить нафиг с такого гадюшника!
|
|
|
|
Сообщений в этой теме
phenixs STM8 как правильно сделать функцию Delay Dec 15 2015, 13:20 jcxz А каким местом STM8 относится к ARM?? Dec 15 2015, 18:08 IgorKossak Перенёс. Dec 15 2015, 19:18 uriy микросекундные задержки я делаю просто бесполезным... Dec 16 2015, 05:43 phenixs Цитата(uriy @ Dec 16 2015, 08:43) микросе... Dec 16 2015, 07:30 _Pasha да. задержки дело мутное.
пришлось на таймерах ... Dec 16 2015, 11:19 phenixs Цитата(_Pasha @ Dec 16 2015, 14:19) да. з... Dec 16 2015, 14:13 scifi Цитата(phenixs @ Dec 16 2015, 17:13) А ка... Dec 16 2015, 14:19 phenixs Цитата(scifi @ Dec 16 2015, 17:19) 1nS - ... Dec 16 2015, 14:26 scifi Когда требуемая задержка приближается по длительно... Dec 16 2015, 14:35 phenixs Цитата(scifi @ Dec 16 2015, 17:35) Когда ... Dec 16 2015, 14:39 scifi Цитата(phenixs @ Dec 16 2015, 17:39) и ин... Dec 16 2015, 14:48 phenixs Цитата(scifi @ Dec 16 2015, 17:48) Видимо... Dec 16 2015, 15:11 scifi Цитата(phenixs @ Dec 16 2015, 18:11) Прим... Dec 16 2015, 20:09 Эдди Цитата(phenixs @ Dec 16 2015, 18:11) Прим... Jan 18 2016, 06:26 Spider В stm8 вообще сложно добиться нужных задержек даже... Dec 17 2015, 14:23 phenixs Цитата(Spider @ Dec 17 2015, 17:23) В stm... Dec 17 2015, 16:50 _Pasha вот я с 1wire на совершенно отфонарном пине сделал... Dec 17 2015, 15:36 HHIMERA Цитата(_Pasha @ Dec 17 2015, 18:36) вот я... Dec 17 2015, 19:34 Tarbal Цитата(phenixs @ Dec 15 2015, 17:20) Кто ... Jan 16 2016, 02:04 uriy ТС нужны микросекундные задержки! С миллисекун... Jan 16 2016, 19:04 _Pasha Цитата(HHIMERA @ Jan 16 2016, 23:10) Отку... Jan 17 2016, 07:18 HHIMERA Цитата(Эдди @ Jan 18 2016, 23:54) И в ито... Jan 18 2016, 20:07 Эдди Цитата(HHIMERA @ Jan 18 2016, 23:07) Да и... Jan 18 2016, 22:03 HHIMERA Цитата(Эдди @ Jan 19 2016, 18:51) Если ну... Jan 19 2016, 15:13 Эдди Цитата(HHIMERA @ Jan 19 2016, 18:13) Ну п... Jan 19 2016, 15:58 jcxz Цитата(Tarbal @ Jan 21 2016, 19:06) Да у ... Jan 22 2016, 04:39 Tarbal Цитата(jcxz @ Jan 19 2016, 18:51) Вы не п... Jan 19 2016, 15:01 Эдди Цитата(jcxz @ Jan 19 2016, 11:06) В общем... Jan 19 2016, 13:47 HHIMERA Ну и что??? Для микросекунд он всё равно не годитс... Jan 17 2016, 10:19 Tarbal Разные бывают задачи. Вы знакомы с апликацией ТС? ... Jan 18 2016, 13:26 HHIMERA Цитата(Tarbal @ Jan 18 2016, 16:26) Тщате... Jan 18 2016, 13:42 Tarbal Цитата(HHIMERA @ Jan 18 2016, 17:42) Вы о... Jan 18 2016, 14:56 HHIMERA Цитата(Tarbal @ Jan 18 2016, 17:56) Ну а ... Jan 18 2016, 15:40 Tarbal Цитата(HHIMERA @ Jan 18 2016, 19:40) Чтоб... Jan 18 2016, 16:58 HHIMERA Цитата(Tarbal @ Jan 18 2016, 20:58) предл... Jan 18 2016, 17:05 Tarbal Верно. Я напрасно теряю время. Jan 18 2016, 17:53
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|