Страница 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
грешно глумиться над новичками