Цитата(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