Страница 1 из 2
Подскажите функцию задержки на языке си
Добавлено: Пн авг 03, 2015 21:55:33
lelik-balabolik
Привет. задачка. нужна функция временной задержки на языке си для мк атмега 8. _delay_ms() не подходит поскольку она работает только с константой, нужна функция работающая с переменными.
Re: Подскажите функцию задержки на языке си
Добавлено: Пн авг 03, 2015 22:09:45
smacorp
lelik-balabolik писал(а):_delay_ms() не подходит поскольку она работает только с константой, нужна функция работающая с переменными
Код: Выделить всё
void delay(int ms) {
for (;ms;ms--)
_delay_ms(1);
}
Re: Подскажите функцию задержки на языке си
Добавлено: Пн авг 03, 2015 23:07:58
lelik-balabolik
не совскм понимаю как это работает
прокомментируйте пож-ста
Re: Подскажите функцию задержки на языке си
Добавлено: Пн авг 03, 2015 23:28:07
smacorp
lelik-balabolik писал(а):не совскм понимаю как это работает
Да вроде примитивнее спичечного коробка - объявляется функция delay, принимающая в качестве аргумента целочисленную переменную ms, в которой находится требуемое количество миллисекунд задержки. В теле функции в цикле for переменная ms декрементируется на 1 при каждой итерации до тех пор пока не обнулится, также при этом осуществляется задержка на 1 мс. - _delay_ms(1).
То есть, передав, например, в ms значение 1000, Вы прокрутите цикл 1000 раз, каждый раз вызывая задержку в 1 мс.
Re: Подскажите функцию задержки на языке си
Добавлено: Пн авг 03, 2015 23:56:58
lelik-balabolik
Ладно. зайду с другого конца. у меня есть переменная int а=0. при каких то условиях я её увеличиваю (например если pinc1= 1), далее. Хочу что бы длительность свечения светодиода на pinb1 увеличилась на 1 мс. как привязать _delay_ms () к а? понимаю что глупости спрашиваю Б я совсем пока чайник.
Re: Подскажите функцию задержки на языке си
Добавлено: Вт авг 04, 2015 00:20:24
smacorp
lelik-balabolik писал(а):как привязать _delay_ms () к а?
Раньше Вы писали - "
_delay_ms() не подходит поскольку она работает только с константой" - что должно означать, что где-то в тексте Вашей программы Вы вызываете _delay_ms(а) и получаете ошибк(у\и), так?
Если так, тогда в начале Вашей программы вставляете (с новой строки):
Код: Выделить всё
void delay(int ms) {
for (;ms;ms--)
_delay_ms(1);
}
А все
_delay_ms(а) заменяете на
delay(а)
Re: Подскажите функцию задержки на языке си
Добавлено: Вт авг 04, 2015 01:12:04
E.S.
С чего бы функции "работать только в константой"?
Если нужно увеличить задержку после входа в эту функцию (по прерыванию, например), то нужно дождаться ее завершения, и только после этого сделать еще один delay.
Либо писать свою функцию, которая будет принимать указатель на счетчик, который можно будет инкрементить извне.
Re: Подскажите функцию задержки на языке си
Добавлено: Вт авг 04, 2015 06:48:03
ARV
E.S. писал(а):С чего бы функции "работать только в константой"?
с того, что _delay_ms на самом деле макрос, оформленный, как функция. параметр у него подставляется в выражение, вычисляющее дробное значение. если параметр будет не константа, а переменная, это будет порождать код вычислений с float, в итоге разрастание объема кода и несоответствие задержки ожиданию. если параметр константа, то все вычисляется на этапе компиляции и в итоге получается ровно то, что необходимо.
знать предмет надо, если пытаешься отвечать на вопросы.
Re: Подскажите функцию задержки на языке си
Добавлено: Вт авг 04, 2015 12:02:45
E.S.
Поделитесь своими знаниями с Atmel, в документации про это не слова:
http://www.atmel.com/webdoc/AVRLibcRefe ... 5e9d3.html
Re: Подскажите функцию задержки на языке си
Добавлено: Вт авг 04, 2015 12:05:23
smacorp
E.S. писал(а):Поделитесь своими знаниями с Atmel
Не спорьте, ибо Вы неправы сейчас.
Re: Подскажите функцию задержки на языке си
Добавлено: Вт авг 04, 2015 12:14:55
shindax
lelik-balabolik писал(а):не совскм понимаю как это работает
прокомментируйте пож-ста
Может так будет понятнее:
Код: Выделить всё
void delay(int ms)
{
while (ms--)
_delay_ms(1);
}
С компиляторами для AVR не работал, но если _delay_ms - макрос, то возможно, нужно так:
Код: Выделить всё
void delay(int ms)
{
while (ms--)
{
_delay_ms(1);
}
}
Re: Подскажите функцию задержки на языке си
Добавлено: Вт авг 04, 2015 12:20:43
ARV
shindax писал(а):но если _delay_ms - макрос, то возможно, нужно так:
без разницы
Re: Подскажите функцию задержки на языке си
Добавлено: Вт авг 04, 2015 17:39:02
ks0
lelik-balabolik писал(а):Ладно. зайду с другого конца. у меня есть переменная int а=0. при каких то условиях я её увеличиваю (например если pinc1= 1), далее.
Думаю лучше бы сразу начинать с таймерами работать. Заведите себе таймер, который, например, будет отчитывать системное время в мс или секундах, и сравнивайте текущее время с запомненным при включении светодиода.
Re: Подскажите функцию задержки на языке си
Добавлено: Вт авг 04, 2015 18:51:44
smacorp
ks0 писал(а):Думаю лучше бы сразу начинать с таймерами работать
Действительно. Человек не в состоянии функцию в свой код вставить, ему таймеры в самую точку.
Re: Подскажите функцию задержки на языке си
Добавлено: Вт авг 04, 2015 20:25:31
lelik-balabolik
Ребята вы меня окончательно запутали. Я уже дымлюсь. и про таймеры действительно в самую точку. вот совсем просто спрашиваю . есть переменная int a=0 её я увеличиваю или уменьшаю двумя кнопками. вот хочу чтобы _delay_ms(a) работало. вот на примере переменной "а" подскажите. и можно ли в _delay_ms( как то сюда подставить выражение, например (1000*а)).
Re: Подскажите функцию задержки на языке си
Добавлено: Вт авг 04, 2015 20:30:19
smacorp
lelik-balabolik писал(а):хочу чтобы _delay_ms(a) работало. вот на примере переменной "а" подскажите
Ещё немного и начнёт казаться, что Вы нас троллите -
http://radiokot.ru/forum/viewtopic.php? ... 8#p2451178 - уже даже расписано по шагам.
Или Вы совсем не умеете объяснять, что требуется.
Re: Подскажите функцию задержки на языке си
Добавлено: Вт авг 04, 2015 21:09:04
alex_
Про таймеры забудь, пока с этим не разберёшься, да кстати товарищ
shindax уже ответил на твой вопрос, а именно:
Код: Выделить всё
void delay(int ms)
{
while (ms--) // тут твоё значение а
_delay_ms(1000); //вот тут множитель на 1000 как и просил
}
Re: Подскажите функцию задержки на языке си
Добавлено: Ср авг 05, 2015 15:47:52
lelik-balabolik
Спасибо. Я наконец разобрался. По ночам мозги не работают. Кому пива выслать пишите куда. Вышлю.
Re: Подскажите функцию задержки на языке си
Добавлено: Ср авг 05, 2015 16:18:38
smacorp
lelik-balabolik писал(а):Я наконец разобрался
Алиллуйя

Re: Подскажите функцию задержки на языке си
Добавлено: Ср авг 05, 2015 21:27:40
lelik-balabolik
грешно глумиться над новичками