|
|
|
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] - для короткого!!!
|
|
|
|
|
Dec 16 2015, 07:30
|
Частый гость
Группа: Участник
Сообщений: 85
Регистрация: 20-09-15
Пользователь №: 88 488
|
Цитата(uriy @ Dec 16 2015, 08:43) микросекундные задержки я делаю просто бесполезным циклом. Для миллисекундных у меня все время заведен TIM4 с прерыванием каждые 1 мс и инкрементом переменной внутри. А пустой цикл, как подгоняете под реальное время? Замерами на ноге? Или...
|
|
|
|
|
Dec 16 2015, 14:13
|
Частый гость
Группа: Участник
Сообщений: 85
Регистрация: 20-09-15
Пользователь №: 88 488
|
Цитата(_Pasha @ Dec 16 2015, 14:19) да. задержки дело мутное. пришлось на таймерах делать через compare TIM4 как и у всех - 1мс системный тик. Это уже стандарт, можно сказать. А с другой стороны, нафиг этот delay нужен, если можно в прерывании дергать ногами. Для детерминированности времени реакции - придется организовывать вызов фунции по указателю. С задержками 1 и т.д. мс согласен TIM4 наверное лучший вариант, с прерыванием или без по ситуации. А как делать правельные задержки 1nS или 7nS колхозить с циклами nop ?
|
|
|
|
|
Dec 16 2015, 14:26
|
Частый гость
Группа: Участник
Сообщений: 85
Регистрация: 20-09-15
Пользователь №: 88 488
|
Цитата(scifi @ Dec 16 2015, 17:19) 1nS - это одна наносекунда? Хотите задержать сигнал на 1 наносекунду - пропустите его через проводник длиной 20 см mS - милисекунда uS - микросекунда nS - наносекунда насчет nS загнул, имел в виду uS
Сообщение отредактировал phenixs - Dec 16 2015, 14:27
|
|
|
|
|
Dec 16 2015, 14:39
|
Частый гость
Группа: Участник
Сообщений: 85
Регистрация: 20-09-15
Пользователь №: 88 488
|
Цитата(scifi @ Dec 16 2015, 17:35) Когда требуемая задержка приближается по длительности к одному такту, её приходится набирать нопами. Причём, если требуется точность, то непременно на ассемблере. и индивидульно для каждого проекта(F_CPU b т.д.)-?
|
|
|
|
|
Dec 16 2015, 15:11
|
Частый гость
Группа: Участник
Сообщений: 85
Регистрация: 20-09-15
Пользователь №: 88 488
|
Цитата(scifi @ Dec 16 2015, 17:48) Видимо, да. Только что у Вас за проекты такие, что везде нужно микросекундные задержки пихать? У меня, к примеру, крайне редко такая необходимость появляется. Пример - стандартный SPI, после опускания CN надо ждать MISO, по факту приходит сразу, а вдруг...., и сколько ждать ???, надо ставить микросекунд 10-15, точность не нужна но пустой цикл надо гонять получается....
|
|
|
|
|
Dec 17 2015, 14:23
|
В поисках истины
Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923
|
В stm8 вообще сложно добиться нужных задержек даже с nop, в виду особенностей работы внутреннего конвейера. Много интересного описано тут. с картинками и пояснениями.
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|