Подскажите функцию задержки на языке си

Обсуждаем контроллеры компании Atmel.
lelik-balabolik
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Чт май 14, 2015 22:18:43

Подскажите функцию задержки на языке си

Сообщение lelik-balabolik »

Привет. задачка. нужна функция временной задержки на языке си для мк атмега 8. _delay_ms() не подходит поскольку она работает только с константой, нужна функция работающая с переменными.
Аватара пользователя
smacorp
Друг Кота
Сообщения: 3472
Зарегистрирован: Вт окт 22, 2013 04:37:23
Откуда: Казань

Re: Подскажите функцию задержки на языке си

Сообщение smacorp »

lelik-balabolik писал(а):_delay_ms() не подходит поскольку она работает только с константой, нужна функция работающая с переменными

Код: Выделить всё

void delay(int ms) {
   for (;ms;ms--)
      _delay_ms(1);
}
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
lelik-balabolik
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Чт май 14, 2015 22:18:43

Re: Подскажите функцию задержки на языке си

Сообщение lelik-balabolik »

не совскм понимаю как это работает
прокомментируйте пож-ста
Аватара пользователя
smacorp
Друг Кота
Сообщения: 3472
Зарегистрирован: Вт окт 22, 2013 04:37:23
Откуда: Казань

Re: Подскажите функцию задержки на языке си

Сообщение smacorp »

lelik-balabolik писал(а):не совскм понимаю как это работает
Да вроде примитивнее спичечного коробка - объявляется функция delay, принимающая в качестве аргумента целочисленную переменную ms, в которой находится требуемое количество миллисекунд задержки. В теле функции в цикле for переменная ms декрементируется на 1 при каждой итерации до тех пор пока не обнулится, также при этом осуществляется задержка на 1 мс. - _delay_ms(1).

То есть, передав, например, в ms значение 1000, Вы прокрутите цикл 1000 раз, каждый раз вызывая задержку в 1 мс.
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
lelik-balabolik
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Чт май 14, 2015 22:18:43

Re: Подскажите функцию задержки на языке си

Сообщение lelik-balabolik »

Ладно. зайду с другого конца. у меня есть переменная int а=0. при каких то условиях я её увеличиваю (например если pinc1= 1), далее. Хочу что бы длительность свечения светодиода на pinb1 увеличилась на 1 мс. как привязать _delay_ms () к а? понимаю что глупости спрашиваю Б я совсем пока чайник.
Аватара пользователя
smacorp
Друг Кота
Сообщения: 3472
Зарегистрирован: Вт окт 22, 2013 04:37:23
Откуда: Казань

Re: Подскажите функцию задержки на языке си

Сообщение smacorp »

lelik-balabolik писал(а):как привязать _delay_ms () к а?
Раньше Вы писали - "_delay_ms() не подходит поскольку она работает только с константой" - что должно означать, что где-то в тексте Вашей программы Вы вызываете _delay_ms(а) и получаете ошибк(у\и), так?

Если так, тогда в начале Вашей программы вставляете (с новой строки):

Код: Выделить всё

void delay(int ms) {
   for (;ms;ms--)
      _delay_ms(1);
}

А все _delay_ms(а) заменяете на delay(а)
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
E.S.
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср авг 08, 2012 00:01:36
Откуда: Украина

Re: Подскажите функцию задержки на языке си

Сообщение E.S. »

С чего бы функции "работать только в константой"?
Если нужно увеличить задержку после входа в эту функцию (по прерыванию, например), то нужно дождаться ее завершения, и только после этого сделать еще один delay.
Либо писать свою функцию, которая будет принимать указатель на счетчик, который можно будет инкрементить извне.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Подскажите функцию задержки на языке си

Сообщение ARV »

E.S. писал(а):С чего бы функции "работать только в константой"?
с того, что _delay_ms на самом деле макрос, оформленный, как функция. параметр у него подставляется в выражение, вычисляющее дробное значение. если параметр будет не константа, а переменная, это будет порождать код вычислений с float, в итоге разрастание объема кода и несоответствие задержки ожиданию. если параметр константа, то все вычисляется на этапе компиляции и в итоге получается ровно то, что необходимо.

знать предмет надо, если пытаешься отвечать на вопросы.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
E.S.
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср авг 08, 2012 00:01:36
Откуда: Украина

Re: Подскажите функцию задержки на языке си

Сообщение E.S. »

Поделитесь своими знаниями с Atmel, в документации про это не слова: http://www.atmel.com/webdoc/AVRLibcRefe ... 5e9d3.html
Аватара пользователя
smacorp
Друг Кота
Сообщения: 3472
Зарегистрирован: Вт окт 22, 2013 04:37:23
Откуда: Казань

Re: Подскажите функцию задержки на языке си

Сообщение smacorp »

E.S. писал(а):Поделитесь своими знаниями с Atmel
Не спорьте, ибо Вы неправы сейчас.
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
Аватара пользователя
shindax
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Сб сен 19, 2009 07:02:19

Re: Подскажите функцию задержки на языке си

Сообщение shindax »

lelik-balabolik писал(а):не совскм понимаю как это работает
прокомментируйте пож-ста

Может так будет понятнее:

Код: Выделить всё

void delay(int ms) 
{
   while (ms--)
       _delay_ms(1);
}


С компиляторами для AVR не работал, но если _delay_ms - макрос, то возможно, нужно так:

Код: Выделить всё

void delay(int ms) 
{
   while (ms--)
     {
       _delay_ms(1);
     }
}
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Подскажите функцию задержки на языке си

Сообщение ARV »

shindax писал(а):но если _delay_ms - макрос, то возможно, нужно так:
без разницы
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ks0
Прорезались зубы
Сообщения: 231
Зарегистрирован: Чт фев 28, 2013 14:16:10

Re: Подскажите функцию задержки на языке си

Сообщение ks0 »

lelik-balabolik писал(а):Ладно. зайду с другого конца. у меня есть переменная int а=0. при каких то условиях я её увеличиваю (например если pinc1= 1), далее.

Думаю лучше бы сразу начинать с таймерами работать. Заведите себе таймер, который, например, будет отчитывать системное время в мс или секундах, и сравнивайте текущее время с запомненным при включении светодиода.
Аватара пользователя
smacorp
Друг Кота
Сообщения: 3472
Зарегистрирован: Вт окт 22, 2013 04:37:23
Откуда: Казань

Re: Подскажите функцию задержки на языке си

Сообщение smacorp »

ks0 писал(а):Думаю лучше бы сразу начинать с таймерами работать
Действительно. Человек не в состоянии функцию в свой код вставить, ему таймеры в самую точку.
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
lelik-balabolik
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Чт май 14, 2015 22:18:43

Re: Подскажите функцию задержки на языке си

Сообщение lelik-balabolik »

Ребята вы меня окончательно запутали. Я уже дымлюсь. и про таймеры действительно в самую точку. вот совсем просто спрашиваю . есть переменная int a=0 её я увеличиваю или уменьшаю двумя кнопками. вот хочу чтобы _delay_ms(a) работало. вот на примере переменной "а" подскажите. и можно ли в _delay_ms( как то сюда подставить выражение, например (1000*а)).
Аватара пользователя
smacorp
Друг Кота
Сообщения: 3472
Зарегистрирован: Вт окт 22, 2013 04:37:23
Откуда: Казань

Re: Подскажите функцию задержки на языке си

Сообщение smacorp »

lelik-balabolik писал(а):хочу чтобы _delay_ms(a) работало. вот на примере переменной "а" подскажите
Ещё немного и начнёт казаться, что Вы нас троллите - http://radiokot.ru/forum/viewtopic.php?p=2451178#p2451178 - уже даже расписано по шагам.

Или Вы совсем не умеете объяснять, что требуется.
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
Аватара пользователя
alex_
Опытный кот
Сообщения: 781
Зарегистрирован: Сб июн 01, 2013 22:24:21
Откуда: ПФО

Re: Подскажите функцию задержки на языке си

Сообщение alex_ »

Про таймеры забудь, пока с этим не разберёшься, да кстати товарищ shindax уже ответил на твой вопрос, а именно:

Код: Выделить всё

void delay(int ms) 
{
  while (ms--) // тут твоё значение а
       _delay_ms(1000); //вот тут множитель на 1000 как и просил
}
lelik-balabolik
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Чт май 14, 2015 22:18:43

Re: Подскажите функцию задержки на языке си

Сообщение lelik-balabolik »

Спасибо. Я наконец разобрался. По ночам мозги не работают. Кому пива выслать пишите куда. Вышлю.
Аватара пользователя
smacorp
Друг Кота
Сообщения: 3472
Зарегистрирован: Вт окт 22, 2013 04:37:23
Откуда: Казань

Re: Подскажите функцию задержки на языке си

Сообщение smacorp »

lelik-balabolik писал(а):Я наконец разобрался

Алиллуйя

Изображение
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
lelik-balabolik
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Чт май 14, 2015 22:18:43

Re: Подскажите функцию задержки на языке си

Сообщение lelik-balabolik »

грешно глумиться над новичками
Ответить

Вернуться в «AVR»