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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Встал на лапы
Аватара пользователя
Сообщения: 96
Зарегистрирован: Сб авг 15, 2009 07:31:56
Откуда: г. Кемерово

Сообщение -==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);


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

Реклама
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Сообщение kalobyte »

потому как это не функция, а кусок кода в обертке
парсер у тебя оптимизирует код и убирает переменную, заменяя числом
кроме того в этих "функциях" максимальное значение ограничено

если это вся твоя прога, то тут никакая переменная не нужна
если хочеш делать задержки, то делай их таймером 8бит и тогда там можеш спокойно использовать переменные
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 96
Зарегистрирован: Сб авг 15, 2009 07:31:56
Откуда: г. Кемерово

Сообщение -==MAXCELERON==- »

kalobyte писал(а):потому как это не функция, а кусок кода в обертке
парсер у тебя оптимизирует код и убирает переменную, заменяя числом
кроме того в этих "функциях" максимальное значение ограничено

если это вся твоя прога, то тут никакая переменная не нужна
если хочеш делать задержки, то делай их таймером 8бит и тогда там можеш спокойно использовать переменные
Да нет, что вы, это не вся прога - это просто пример. Использовать таймер не всегда возможно, т.к. они заняты. Да и к тому же с помощью _delay проще.
Значение 1000ms это нормально, если делать так _delay_ms (1000), то все работает :idea:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

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

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

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 96
Зарегистрирован: Сб авг 15, 2009 07:31:56
Откуда: г. Кемерово

Сообщение -==MAXCELERON==- »

ARV, спасибо за совет :)) , хорошая идея, так и сделаю, просто хотелось отделаться одним только _delay :?

Надо заплатить Вам рубль :)))
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»