Страница 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), то все работает

Добавлено: Ср сен 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 писал(а):парсер у тебя оптимизирует код и убирает переменную, заменяя числом
неверно! переменная никуда не девается, она используется в качестве параметра внутреннего цикла