Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM8 как правильно сделать функцию Delay
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > STM8
Страницы: 1, 2
-AZ-
Кто плотно сталкивался с подобной задачей, как правильно написать универсальную функцию 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);
}
jcxz
А каким местом STM8 относится к ARM??
IgorKossak
Перенёс.
uriy
микросекундные задержки я делаю просто бесполезным циклом.
Для миллисекундных у меня все время заведен TIM4 с прерыванием каждые 1 мс и инкрементом переменной внутри.
-AZ-
Цитата(uriy @ Dec 16 2015, 08:43) *
микросекундные задержки я делаю просто бесполезным циклом.
Для миллисекундных у меня все время заведен TIM4 с прерыванием каждые 1 мс и инкрементом переменной внутри.


А пустой цикл, как подгоняете под реальное время? Замерами на ноге? Или...
_Pasha
да. задержки дело мутное. smile3046.gif
пришлось на таймерах делать через compare
TIM4 как и у всех - 1мс системный тик. Это уже стандарт, можно сказать.
А с другой стороны, нафиг этот delay нужен, если можно в прерывании дергать ногами. Для детерминированности времени реакции - придется организовывать вызов фунции по указателю.

-AZ-
Цитата(_Pasha @ Dec 16 2015, 14:19) *
да. задержки дело мутное. smile3046.gif
пришлось на таймерах делать через compare
TIM4 как и у всех - 1мс системный тик. Это уже стандарт, можно сказать.
А с другой стороны, нафиг этот delay нужен, если можно в прерывании дергать ногами. Для детерминированности времени реакции - придется организовывать вызов фунции по указателю.


С задержками 1 и т.д. мс согласен TIM4 наверное лучший вариант, с прерыванием или без по ситуации.
А как делать правельные задержки 1nS или 7nS колхозить с циклами nop ?
scifi
Цитата(phenixs @ Dec 16 2015, 17:13) *
А как делать правельные задержки 1nS или 7nS колхозить с циклами nop ?

1nS - это одна наносекунда? Хотите задержать сигнал на 1 наносекунду - пропустите его через проводник длиной 20 см biggrin.gif
-AZ-
Цитата(scifi @ Dec 16 2015, 17:19) *
1nS - это одна наносекунда? Хотите задержать сигнал на 1 наносекунду - пропустите его через проводник длиной 20 см biggrin.gif

mS - милисекунда
uS - микросекунда
nS - наносекунда

насчет nS загнул, имел в виду uS
scifi
Когда требуемая задержка приближается по длительности к одному такту, её приходится набирать нопами. Причём, если требуется точность, то непременно на ассемблере.
-AZ-
Цитата(scifi @ Dec 16 2015, 17:35) *
Когда требуемая задержка приближается по длительности к одному такту, её приходится набирать нопами. Причём, если требуется точность, то непременно на ассемблере.


и индивидульно для каждого проекта(F_CPU b т.д.)-?
scifi
Цитата(phenixs @ Dec 16 2015, 17:39) *
и индивидульно для каждого проекта(F_CPU b т.д.)-?

Видимо, да.
Только что у Вас за проекты такие, что везде нужно микросекундные задержки пихать? У меня, к примеру, крайне редко такая необходимость появляется.
-AZ-
Цитата(scifi @ Dec 16 2015, 17:48) *
Видимо, да.
Только что у Вас за проекты такие, что везде нужно микросекундные задержки пихать? У меня, к примеру, крайне редко такая необходимость появляется.


Пример - стандартный SPI, после опускания CN надо ждать MISO, по факту приходит сразу, а вдруг...., и сколько ждать ???, надо ставить микросекунд 10-15, точность не нужна но пустой цикл надо гонять получается....
scifi
Цитата(phenixs @ Dec 16 2015, 18:11) *
Пример - стандартный SPI, после опускания CN надо ждать MISO, по факту приходит сразу, а вдруг...., и сколько ждать ???, надо ставить микросекунд 10-15, точность не нужна но пустой цикл надо гонять получается....

CN - это SCK? Сколько ждать - написано в даташите. Читайте, и будет вам щастя.
Spider
В stm8 вообще сложно добиться нужных задержек даже с nop, в виду особенностей работы внутреннего конвейера.
Много интересного описано тут.
с картинками и пояснениями.
_Pasha
вот я с 1wire на совершенно отфонарном пине сделал на таймере с компараторами. При этом изрядно намучался. пришлось даже пользоваться реальным лог. анализатором, что сильно непривычно после кейла, мплаб, или (пардон) протеуса, где все подобные вопросы решались не вставая из-за компа. sad.gif но я вам скажу, там столько извратов для обеспечения нужной прозрачности работы, что неприятные ощущения остались. По крайней мере, пришлось даже приоритеты прерываний тасовать перед стартом процедуры чт/зп бита.
-AZ-
Цитата(Spider @ Dec 17 2015, 17:23) *
В stm8 вообще сложно добиться нужных задержек даже с nop, в виду особенностей работы внутреннего конвейера.
Много интересного описано тут.
с картинками и пояснениями.


Только у меня не открвывается ссылка, точнее весь сайт?
HHIMERA
Цитата(_Pasha @ Dec 17 2015, 18:36) *
вот я с 1wire на совершенно отфонарном пине сделал на таймере с компараторами. При этом изрядно намучался. пришлось даже пользоваться реальным лог. анализатором, что сильно непривычно после кейла, мплаб, или (пардон) протеуса, где все подобные вопросы решались не вставая из-за компа. sad.gif но я вам скажу, там столько извратов для обеспечения нужной прозрачности работы, что неприятные ощущения остались. По крайней мере, пришлось даже приоритеты прерываний тасовать перед стартом процедуры чт/зп бита.

Вот только не надо никого этим пугать... Это не СТМ32 конечно... где вообще всё хардварно на несколько 18В20 раскручивается... но всё же...
На STM8S всё более-менее прилично... хоть и на отфонарном пине... на STM8L на фонарном вообще без проблем...

Цитата(phenixs @ Dec 17 2015, 19:50) *
Только у меня не открвывается ссылка, точнее весь сайт?

Да... слегка умер...
Tarbal
Цитата(phenixs @ Dec 15 2015, 17:20) *
Кто плотно сталкивался с подобной задачей, как правильно написать универсальную функцию 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);
}


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

Идея состоит в том, чтобы сделать главный цикл синхронным. Скажем раз в 1 миллисекунду, а внутри можно сделать подцикл раз в 10, следующий раз в секунду и т.д.
Ваши задачи вы пишите как машины состояний, которые исполняются в соответствующих циклах. У меня в основном были в 10 миллисекундном цикле.

Структура задач становится несколько непривычной поначалу, но ненадолго.

Как делать задержку скажем на 40 миллисекунд.


Код
int timer1 = 0;

/* request for a deferred action */
void delay1(int time)
{
    timer1 = time;
}

...........................


/* in 10 milliseconds loop */
    if(timer1){
        if(-- timer1 == 0){

/* Execute here your delayed action */
        }
    }

............................

/* request somewhere executing action after delay 40 milliseconds */
    delay1(4);



Это если что-то простое. А если надо посложнее, то делаете машину состояний и декрементируете переменную
в состоянии ожидания, а как станет нулем -- переходите в другое состояние.


Там меня некоторые товарищи по делу критиковали за некорректные формулировки во вводной части темы, но тем не менее на мой взгляд там есть что-то интересное и я надеюсь вы найдете что-то полезное для себя. Будут вопросы -- спрашивайте.
Вот тема:
http://electronix.ru/forum/index.php?showt...132036&st=0
uriy
ТС нужны микросекундные задержки! С миллисекундными ни у кого нет проблем.
Tarbal
Тады ой. В реалтайме может не получиться если задержка в несколько циклов процессора. В таком случае я бы просто считывал значения счетчика системного таймера из регистра и смотрел на дельту в цикле. Важно считывать значения таймера в беззнаковую переменную, тогда переполнение счетчика таймера между двумя отсчетами будет пофиг -- дельта все равно получится правильной.
HHIMERA
Цитата(Tarbal @ Jan 16 2016, 22:17) *
я бы просто считывал значения счетчика системного таймера из регистра и смотрел на дельту в цикле.

Если крутиться в цикле... зачем тогда таймер??? Откуда в СТМ8 системный таймер??? Какой разрядности счётчик... 32 бита??? Ну и сколько это займёт по времени???
Нет никакого смысла в микросекундных задержках... уже сказали... Для единичных случаев всё равно как... в остальных - юзать железо... таймера...

Цитата(Spider @ Dec 17 2015, 17:23) *
В stm8 вообще сложно добиться нужных задержек даже с nop, в виду особенностей работы внутреннего конвейера.

При желании можно... но действительно геморно...
_Pasha
Цитата(HHIMERA @ Jan 16 2016, 23:10) *
Откуда в СТМ8 системный таймер???

rolleyes.gif предлагаю TIM4 называть именно так. Ибо больше он ни на что не годен.
HHIMERA
Ну и что??? Для микросекунд он всё равно не годится... там время вход/выход прерывания впечатляет...
Как и заморачиваться с подобной фигнёй...
Цитата(Tarbal @ Jan 16 2016, 22:17) *
В таком случае я бы просто считывал значения счетчика системного таймера из регистра и смотрел на дельту в цикле. Важно считывать значения таймера в беззнаковую переменную, тогда переполнение счетчика таймера между двумя отсчетами будет пофиг -- дельта все равно получится правильной.

Телодвижений много... толку никакого... Обычный цикл попроще будет...
А вот для миллисекунд и типа динамической индикации... прокатит...
Tarbal
Цитата(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) *
При желании можно... но действительно геморно...


Профессиональный подход действительно налагает дополнительную ответственность, но каждый выбитрает сам куда ему надо идти.
HHIMERA
Цитата(Tarbal @ Jan 17 2016, 17:49) *
Я не знаком с STM8 архитектурой, но ведь вроде поднимался вопрос о проблеме свяанной с неповторяемостью задержки, исполненной на програмном цикле, из-за конвейера?
Этот подход устранит проблему.

Не устранит... да это особо и не нужно...
Ради прикола... как-то замутил частотомер на 103-ем... на Си... выравнивал НОПами... Геморно... после каждого исправления/дополнения приходилось всё делать заново... но работало чётко... но только ради прикола...
Хардварно - вообще без проблем... всё такт в такт...
Цитата
Такой же какой и регистр таймера. Подход отход займет пару команд исполнить -- считать и сравнить, а задержка будет такая какую запросят с толерансом на подход отход.

8 бит??? 16мкС максимум??? Этого даже на 1-wire не хватит... Да и толку... прерывания сделают своё грязное дело... Или опять по старой привычке их запрещать???
Цитата
Всяко бывает. Убедите ТС в этом.

Зачем??? Сам убедится...
Цитата
Кому все равно, а кому надо, чтобы работало не как получится, а как надо.

Кому надо... пусть привыкает к хардварным... или полухардварным решениям...
Даже на том же 103-ем... 1-wire... как сказал уже Паша... таймер с компараторами и на прерывании...
Цитата
Профессиональный подход действительно налагает дополнительную ответственность, но каждый выбитрает сам куда ему надо идти.

Не... если кому-то нравится тратить таймер просто так... то я его найду где применить... Их там и так чуть-чуть в младшеньких... всего три...
Tarbal
Цитата(HHIMERA @ Jan 17 2016, 20:00) *
Не... если кому-то нравится тратить таймер просто так... то я его найду где применить... Их там и так чуть-чуть в младшеньких... всего три...


Разве там нет свободнобегущего таймера?
Вроде говорили о компараторах, а они как раз и живут на свободнобегущем таймере. Вот его регистр и читать. С конфигурацией таймера ничего делать не надо. Просто читать сам счетчик.
Эдди
Цитата(phenixs @ Dec 16 2015, 18:11) *
Пример - стандартный SPI

На кой черт стандартному SPI задержки? Он же АППАРАТНЫЙ! Вы еще I2C программно реализуйте, когда аппаратный отлично работает…


Цитата(_Pasha @ Dec 17 2015, 18:36) *
вот я с 1wire на совершенно отфонарном пине сделал на таймере с компараторами

Да, 1-wire на STM8 только через задницу возможно сделать, потому как на чипах S-серии нет DMA. А был бы, все было бы значительно веселей!
HHIMERA
Цитата(Tarbal @ Jan 18 2016, 06:32) *
С конфигурацией таймера ничего делать не надо. Просто читать сам счетчик.

biggrin.gif
Зашибись!!! STM8S003... три таймера... два из них 16-и... один восьмибитный... На таймерах висит... IR-датчик... 1-wire и семисегментник с автокоррекцией разнояркости разрядов... В итоге - ни один из них не является свободнобегущим... Дальше... зачем здесь нужны микросекунды... если всё или хардварно... или полухардварно??? Как таймером в цикле мерять мкС... если в любой момент прилетит прерывание... и может не одно... и даже одно может прервать другое???

Цитата(Эдди @ Jan 18 2016, 09:26) *
1-wire на STM8 только через задницу возможно сделать

Да всё там нормально... На STM8L тем более...
Tarbal
Разные бывают задачи. Вы знакомы с апликацией ТС? Там используются все перечисленные вами ресурсы?
Вы знакомы с концепцией компараторов? Они как раз на свободнобегущих таймерах работают. А если есть и такие устройства в таймерах, то реальность оказывается шире представления о ней.
Если вы исполнили задержку на прерывании и в момент срабатывания прерывания от таймера обрабатывалось другое прерывание, то задержка будет точно такая же как и в том варианте, что я предложил. А если прерывания в этот момент не случится, то и мое предложение даст верную задержку.
Тщательнее надо придумывать аргументы.

Посмотрел в интернете и нигде не нашел хорошего описания триггеров. Пришлось обратиться к первоисточнику.
Здесь все изложено подробно. Ищите output compare.
http://www.nxp.com/files/microcontrollers/...anual/GPTRM.pdf
HHIMERA
Цитата(Tarbal @ Jan 18 2016, 16:26) *
Тщательнее надо придумывать аргументы.

Вы о чём вообще сейчас??? Мне аргументы не нужны... у меня всё работает... и работает так как надо... без всех ваших свободноубегающих микросекунд...
Цитата
Посмотрел в интернете и нигде не нашел хорошего описания триггеров. Пришлось обратиться к первоисточнику.
Здесь все изложено подробно. Ищите output compare.
http://www.nxp.com/files/microcontrollers/...anual/GPTRM.pdf

Это прикол??? При чём здесь NXP к STM??? Я что... референс на STM8 не видел... и не знаю как и что там работает???
Пишите тут что хотите... мне это не интересно... и пользы от этого никакой...
Tarbal
Цитата(HHIMERA @ Jan 18 2016, 17:42) *
Вы о чём вообще сейчас??? Мне аргументы не нужны... у меня всё работает... и работает так как надо... без всех ваших свободноубегающих микросекунд...


Ну а зачем тогда спорите? Человек спросил как сделать достоверную задержку, я ответил, а вы начали нам рассказывать, что вам это не подходит.


Цитата(HHIMERA @ Jan 18 2016, 17:42) *
Это прикол??? При чём здесь NXP к STM??? Я что... референс на STM8 не видел... и не знаю как и что там работает???
Пишите тут что хотите... мне это не интересно... и пользы от этого никакой...


Это не прикол.
В этом документе красиво описана концепция input capture и output compare. Это первоисточник.

Если вас убеждают только документы по конкретному процессору, то вот вам
http://www.st.com/st-web-ui/static/active/.../DM00072019.pdf
в нем вскользь тоже упоминается о свободнобегущем 16 битном таймере: "TIM1 is a 16-bit timer which is allowed to free run." в начале 3-ей страницы. Я полагал вас интересует объяснение почему это так и дал вам хороший документ, но если вас интересуют только конкретные комбинации процессоров и решений, то я не буду настаивать.
HHIMERA
Цитата(Tarbal @ Jan 18 2016, 17:56) *
Ну а зачем тогда спорите?

Где??? Это вы что-то там пытаетесь доказать... не владея предметом спора... кстати...
Цитата
Человек спросил как сделать достоверную задержку, я ответил

На что вам и заметили... что фигня всё это... что это костыли перевязанные скотчем...
Эта тема... если заметили... поднимается уже не один раз... Итог - если нужны точные интервалы... то юзать хардварные или полухардварные решения... если точность особая не нужна... то как и что уже не особо важно...
То что предлагаете вы... подразумевает запрет прерываний... следовательно на универсальность никак претендовать не может... и по сути... ничем от обычного цикла не отличается... потому что в цикле и находится... это хоть понятно???
Цитата
Это не прикол.
В этом документе красиво описана концепция input capture и output compare. Это первоисточник.

А красиво никому не нужно... это не художественная галерея... всем нужно чтобы правильно... как есть...
Цитата
вскользь тоже упоминается о свободнобегущем 16 битном таймере

Что вы ещё за уши притянете??? Это не просто конкретные решения... это правильные решения...

===================
Чтобы было понятно о чём речь... нефиг юзать старые замшелые решения прошловековых МК на современных МК... где более развитая периферия и более широкие возможности... Сейчас многие производители тяготеют к хардварным решениям... достаточно глянуть на новые PIC16F16xx от Микрочип... чего там только нет... и это правильно...
Tarbal
Цитата(HHIMERA @ Jan 18 2016, 19:40) *
Чтобы было понятно о чём речь... нефиг юзать старые замшелые решения прошловековых МК на современных МК... где более развитая периферия и более широкие возможности... Сейчас многие производители тяготеют к хардварным решениям... достаточно глянуть на новые PIC16F16xx от Микрочип... чего там только нет... и это правильно...


Ну это вы не ко мне, а к производителям МК обращайтесь с указаниями что им юзать.

Чтобы было понятно. Я всегда "тяготел" к хардверным решениям и ваши инсинуации отвергаю. Вопрос был как сделать короткую микросекундную задержку, чтобы она была стабильной. Я как "тяготеющий" к хардверным решениям разработчик и предложил читать время из хардвера.
У меня есть сильное подозрение, что вы не использовали в своих разработках компаратор. Я прав? И что-то мне подсказывает, что это не замшелые решения виноваты.
HHIMERA
Цитата(Tarbal @ Jan 18 2016, 20:58) *
предложил читать время из хардвера.

Ваша чушь пошла по пятому кругу... Придумайте что нибудь другое... если сможете...
Tarbal
Верно. Я напрасно теряю время.
Эдди
Цитата(HHIMERA @ Jan 18 2016, 10:24) *
Да всё там нормально... На STM8L тем более...

У l-ки, да, есть DMA и аппаратный 1-wire элементарно пилится. А вот у s-ок приходится софтварно пихать параметры таймера, т.е. по сути пока передаешь-принимаешь, ничего полезного сделать не получится. А это означает, что если, скажем, нужно LCD использовать, то на КА его индикацию не выйдет сделать — нужно будет по прерыванию еще какого-нибудь таймера, что некошерно!

Цитата(Tarbal @ Jan 18 2016, 19:58) *
Вопрос был как сделать короткую микросекундную задержку, чтобы она была стабильной.

Это невозможно. Придется отключать все прерывания, кроме заданного таймера (ну или пока будешь нопы считать). Да и вообще бесполезно это: кому нахрен нужна стабильная микросекундная пауза? Это — верный признак того, что автор лезет не в те дебри!
HHIMERA
Цитата(Эдди @ Jan 18 2016, 23:08) *
У l-ки, да, есть DMA и аппаратный 1-wire элементарно пилится. А вот у s-ок приходится софтварно пихать параметры таймера, т.е. по сути пока передаешь-принимаешь, ничего полезного сделать не получится.

Эдди... Эдди... притормози... ты ли ещё картинок не насмотрелся??? Что... и здесь их ещё выкладывать??? biggrin.gif
Майн крутится сам по себе... делай чо хош... По прерыванию с прелоадом грузишь времянку следующего слота... по окончанию преобразования выставляешь флаг... Дальше в майне разруливаешь...
Там просечки в майне что-то около 7%...
Цитата
А это означает, что если, скажем, нужно LCD использовать, то на КА его индикацию не выйдет сделать — нужно будет по прерыванию еще какого-нибудь таймера, что некошерно!

LCD на другой таймер... даже если это мелкий TFT... пусть молотит...
Цитата
Это невозможно. Придется отключать все прерывания, кроме заданного таймера (ну или пока будешь нопы считать). Да и вообще бесполезно это: кому нахрен нужна стабильная микросекундная пауза? Это — верный признак того, что автор лезет не в те дебри!

Можно заюзать OPM свободного таймера... если он есть... ну уж точно не вылавливать что-то там в цикле...
Эдди
Цитата(HHIMERA @ Jan 18 2016, 22:37) *
LCD на другой таймер... даже если это мелкий TFT... пусть молотит...

И в итоге упрешься в недостачу таймеров, потому что все будешь вешать на них.
Уж опрос кнопок и всякие экранчики — штука настолько медленная, что лучше ее через КА в while(1) main'а забульбенить.
HHIMERA
Цитата(Эдди @ Jan 18 2016, 23:54) *
И в итоге упрешься в недостачу таймеров, потому что все будешь вешать на них.

А ну и что??? Их что... солить??? Не хватит... буду выкручиваться... или тихо переползу на STM32F030... там таймеров поболее... а по цене они примерно как старшие STM8...
Да и вообще... смысл STM8 в совсем мелких и копеечных проектах на уровне STM8S003... дальше только STM32...
Цитата
Уж опрос кнопок и всякие экранчики — штука настолько медленная, что лучше ее через КА в while(1) main'а забульбенить.

Кнопки можно и к LED дисплею привязать... если он есть... Короче... "Это не есть проблем!"(С)...
Эдди
Цитата(HHIMERA @ Jan 18 2016, 23:07) *
Да и вообще... смысл STM8 в совсем мелких и копеечных проектах на уровне STM8S003... дальше только STM32...

Ты это селеву (который еще и "ветерок") объясни ☺
jcxz
Цитата(Эдди @ Jan 19 2016, 01:54) *
И в итоге упрешься в недостачу таймеров, потому что все будешь вешать на них.
Уж опрос кнопок и всякие экранчики — штука настолько медленная, что лучше ее через КА в while(1) main'а забульбенить.

при опросе кнопок, желательно избавляться от дребезга (ну если только он аппаратно не подавлен), а значит опрашивать их надо с частотой порядка 50Гц. Да и обновление экранчиков, если там есть динамическая картинка - движение этой картинки будет зависеть от равномерности работы этого вашего while - тоже не должно быть больших задержек в нём.
В общем такое вешать в общий цикл - не очень хорошо, ну или нужно гарантировать отсутствие задержек в нём более пары мсек.
Tarbal
Цитата(jcxz @ Jan 19 2016, 12:06) *
при опросе кнопок, желательно избавляться от дребезга (ну если только он аппаратно не подавлен), а значит опрашивать их надо с частотой порядка 50Гц. Да и обновление экранчиков, если там есть динамическая картинка - движение этой картинки будет зависеть от равномерности работы этого вашего while - тоже не должно быть больших задержек в нём.
В общем такое вешать в общий цикл - не очень хорошо, ну или нужно гарантировать отсутствие задержек в нём более пары мсек.


Не знаю. Я всегда вешал в 10 миллисекундный цикл обработчик клавиатуры и выжидал 50 миллисекунд для успокоения дребезга. Никогда не было с этим проблем. Выжидал не в цикле, а пропуская 5 обращений к обработчику.
Эдди
Цитата(jcxz @ Jan 19 2016, 11:06) *
В общем такое вешать в общий цикл - не очень хорошо, ну или нужно гарантировать отсутствие задержек в нём более пары мсек.

Ничего подобного! Отлично все работает. Целых три варианта: раз — проверка в теле КА (но там антидребезг обеспечивается немалым временем отработки затвора); два — опрос не чаще 1 раза в 50мс (это — эмулятор "нормальной" клавиатуры на основе матричной); три — обработка сигнала от кнопки в прерывании (там антидребезг подавляется тем, что пока обработчик не сбросит флаг, заново не устанавливается, а на это уходит не меньше 100мс).

На STM8 я тоже всякие разные методики реализовал. Но самое простое — реализовать аппаратно, т.е. повесить на кнопку кондер и резистор на сотню Ом.
jcxz
Цитата(Tarbal @ Jan 19 2016, 18:06) *
Не знаю. Я всегда вешал в 10 миллисекундный цикл обработчик клавиатуры и выжидал 50 миллисекунд для успокоения дребезга. Никогда не было с этим проблем. Выжидал не в цикле, а пропуская 5 обращений к обработчику.

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

Цитата(Эдди @ Jan 19 2016, 19:47) *
На STM8 я тоже всякие разные методики реализовал. Но самое простое — реализовать аппаратно, т.е. повесить на кнопку кондер и резистор на сотню Ом.

RC-цепочка никак не поможет в борьбе с дребезгом сама по себе. Она поможет только если сигнал после неё поступает на вход, имеющий гистерезис (триггер Шмидта).
А самая надёжная аппаратная защита от дребезга - парафазный вход set/reset (RS-триггер).
Эдди
Цитата(jcxz @ Jan 19 2016, 17:47) *
процедур, которые могут длительно выполняться (десятки мсек) и блокировать процесс

Фигасе, это где ж такое видано — блокировать на бешеное время?
Если нужно что-то долгое делать, то выполнять порциями по значению таймера. Но лучше все на аппаратную реализацию спихнуть, тогда никаких тормозов не будет.
Tarbal
Цитата(jcxz @ Jan 19 2016, 18:51) *
Вы не поняли. Я не говорю, что это нельзя делать. Я говорю, что в этот цикл (в котором опрашивается кнопка) лучше не включать вызовы других процедур, которые могут длительно выполняться (десятки мсек) и блокировать процесс скана кнопок на десятки мсек ибо будет некомфортно работать с такими кнопками из-за задержек их реакции.


RC-цепочка никак не поможет в борьбе с дребезгом сама по себе. Она поможет только если сигнал после неё поступает на вход, имеющий гистерезис (триггер Шмидта).
А самая надёжная аппаратная защита от дребезга - парафазный вход set/reset (RS-триггер).


Понятно теперь. Но я всегда писал все процедуры на проход, чтобы как можно быстрее вылетали и все ставил в этот цикл. Проблема была только один раз, когда вычисление занимало 60 миллисекунд, но я разбил на стадии по 5 миллисекунд (AVR8535) и оформил как машину состояний. Кстати если использовать технику "резинового времени", то одноразовые переборы не будут играть роли если интегрально нет перебора.
HHIMERA
Цитата(Эдди @ Jan 19 2016, 18:51) *
Если нужно что-то долгое делать, то выполнять порциями по значению таймера. Но лучше все на аппаратную реализацию спихнуть, тогда никаких тормозов не будет.

100% !!!
Пнул... и пусть молотит... Ну потеряется каких-то там 100-150 байт флэша на сквозной реализации 1-wire... ну и фиг с ними...
Эдди
Цитата(HHIMERA @ Jan 19 2016, 18:13) *
Ну потеряется каких-то там 100-150 байт флэша на сквозной реализации 1-wire... ну и фиг с ними...

Если потеряются, значит, камушек неправильно выбран. Или слишком высокая скорость "общения". Как оно может потеряться?
Заполнили быстренько буфер с данными, пнули DMA/TIM, выполняем что-то. Как только увидели, что флаг окончания передачи данных выставлен, обработали принятые данные. И так далее.
jcxz
Цитата(Эдди @ Jan 19 2016, 20:51) *
Фигасе, это где ж такое видано — блокировать на бешеное время?
Если нужно что-то долгое делать, то выполнять порциями по значению таймера. Но лучше все на аппаратную реализацию спихнуть, тогда никаких тормозов не будет.

Это хорошо Вам если Вы целиком всё ПО пишете сами. А если у Вас команда из нескольких человек, которые пишут помодульно? И потом нужно в этом общем цикле (а-ля корпоративная многозадачность) собрать вызовы разных чужих функций, каждая написанная в своём стиле и когда не каждый член команды в состоянии адекватно построить алгоритм с ограничением времени работы функции.
Элементарная ситуация:
Есть ресурс с блокирующим доступом к нему (например - драйвер обмена по какому-то интерфейсу, например - SPI, на котором висит несколько разных устройств).
К этому ресурсу обращается одна из функций из этого общего цикла для того, чтобы считать скажем пару байт по SPI с одного из устройств на шине. Транзакция вроде короткая и обычно занимает мало времени. Но!...
Если ресурс оказывается занят (из другой задачи ОС другая функция в этот момент осуществляет длительную транзакцию с другим устройством на этой-же самой SPI), то вышеуказанная функция из общего цикла будет
теперь ждать длительное время освобождения ресурса. Вот тут и будут происходить редко случающиеся длительные задержки в этом общем цикле приводящие к редким сбоям в опросе клавиш.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.