Страница 1 из 1

_delay_ms не читает переменную

Добавлено: Ср сен 23, 2009 13:41:10
-==MAXCELERON==-
Ребята, подскажите в чем проблема, в качестве параметра _delay_ms () ставлю переменную, но в итоге задержка не равна переменной, она лежит где то в пределах 2 ms

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


#include (avr/interrupt.h)  // квадратные скобки
#include (util/delay.h)
#define F_CPU 1000000UL     


unsigned int i = 1000 ;  // Переменная 



int main(void){     //Главная функция
 
DDRC = 0xff;

while (1) {
  
PORTC = 0xff;

_delay_ms (i);

PORTC = 0x00;

_delay_ms (i);


 
}	
}  //********************************************** Конец главной функции


Добавлено: Ср сен 23, 2009 14:03:49
kalobyte
потому как это не функция, а кусок кода в обертке
парсер у тебя оптимизирует код и убирает переменную, заменяя числом
кроме того в этих "функциях" максимальное значение ограничено

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

Добавлено: Ср сен 23, 2009 14:10:05
-==MAXCELERON==-
kalobyte писал(а):потому как это не функция, а кусок кода в обертке
парсер у тебя оптимизирует код и убирает переменную, заменяя числом
кроме того в этих "функциях" максимальное значение ограничено

если это вся твоя прога, то тут никакая переменная не нужна
если хочеш делать задержки, то делай их таймером 8бит и тогда там можеш спокойно использовать переменные
Да нет, что вы, это не вся прога - это просто пример. Использовать таймер не всегда возможно, т.к. они заняты. Да и к тому же с помощью _delay проще.
Значение 1000ms это нормально, если делать так _delay_ms (1000), то все работает :idea:

Добавлено: Ср сен 23, 2009 14:15:20
ARV
если бы мне за совет "читайте документацию" платили по рублю каждый раз, когда я это здесь на форуме повторяю, я стал бы богаче Билла Гейтся :)))

_delay_ms в качестве параметра принимает float, поэтому ваше число превращается в число с плавающей точкой. если это не константа, а переменная, то подключаются библиотеки работы с плавающей точкой со всеми вытекающими последствиями - огромный код с непредсказуемым временем исполнения.

если вам надо иметь функцию с регулируемой задержкой, следует поступать примерно так:

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

void delay(int ms){
   for(;ms;ms--)
      _delay_ms(1);
}
это наиболее экономичный и разумный подход

Добавлено: Ср сен 23, 2009 14:21:20
-==MAXCELERON==-
ARV, спасибо за совет :)) , хорошая идея, так и сделаю, просто хотелось отделаться одним только _delay :?

Надо заплатить Вам рубль :)))

Добавлено: Ср сен 23, 2009 14:24:41
ARV
kalobyte писал(а):парсер у тебя оптимизирует код и убирает переменную, заменяя числом
неверно! переменная никуда не девается, она используется в качестве параметра внутреннего цикла