-
26.11.2006, 11:47 #1
- Регистрация
- 21.01.2006
- Сообщений
- 28
- Поблагодарили
- 0
- Поблагодарил
- 0
функция задержки delay_us();
здравствуйте всем, в общем дело состоит вот в чем. Требуется создать задержку с изменяющейся величиной в микросекундах, вот пример:
1. a=1000;
2. delay_us(a);
3. здесь какой то цикл;
4. a--;
5. go to 2;
пробовал так же со стандартной функцией, но она требует только числа, переменные не принимает. Пишу прогу в компиляторе CodeVisionAVR. Помогите кто чем сможет, заранее благодарен за помощь.
почтовый адрес: babincev@vi-mail.ruПоследний раз редактировалось SERG; 26.11.2006 в 11:57.
-
26.11.2006, 21:20 #2
- Регистрация
- 07.06.2002
- Адрес
- Каунас
- Возраст
- 75
- Сообщений
- 1,617
- Поблагодарили
- 185
- Поблагодарил
- 170
Во первых для этого надо знать тактовую частоту.
Во вторых такую функцию лучше писать на ассемблере, т.к. на С определить длительность выполнения цикла сложнее (надо анализировать ассемблерный листинг и считать такты). Да еще и оптимизация кода может преподнести неожиданности.
В третьих, получить разрешение в 1 микросекунду пожалуй можно будет только при довольно высокой тактовой частоте.
Да и то, неизбежно будет присутствовать "мертвое время" входа и возврата из функции.
В общем случае функция задержки на С может выглядет так:
delay_us(char a)
{while (a--)
{ // здесь делаем что-то, чтобы занять время
// одного дискрета задержки.
// Или не делаем вообще ничего, тогда дискрет задержки
// будет минимально возможным.
}
}
Но точность высокой не будет из за упомянутого "мертвого времени".Последний раз редактировалось LY1CE; 26.11.2006 в 21:22.
Пиши меньше, да лучше.
73! Tadas LY1CE
-
26.11.2006, 22:13 #3
- Регистрация
- 01.11.2006
- Сообщений
- 4
- Поблагодарили
- 0
- Поблагодарил
- 0
я бы для этой цели использовал прерывание от одного из таймеров, меняя Кд таймера или предделителя можно получить все что угодно..., и перед использованием функции delay_us необходимо запрещать все прерывания
|
Социальные закладки