| AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
"delay" не позволяет варировать микросекундами
15.01.2016, 18:51
|
|
|
Гражданин KAZUS.RUN
Регистрация: 18.07.2006
Сообщений: 894
Сказал спасибо: 244
Сказали Спасибо 31 раз(а) в 28 сообщении(ях)
|
"delay" не позволяет варировать микросекундами
здравствуйте друзья
работаю с мк. AVR в cvavr
использую футкцию delay_ms(x) c переменным параметром x , значение которого меняется в ходе программы.
когда значение х целое все нормально но нужно нецелое значение 1,5msе.
прешел на микросекурды и записал 1500 но появилась cvavr зафиксировал ошибку и выдал запись
-must be constant expression.
прошу помочь разобратся в чем тут дело и как сделать в delay нецелечисленную задержку?
заранее благодарен за любой совет.
|
|
|
|
15.01.2016, 19:05
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 08.05.2008
Адрес: регион 63
Сообщений: 1,827
Сказал спасибо: 750
Сказали Спасибо 679 раз(а) в 382 сообщении(ях)
|
Re: "delay" не позволяет варировать микросекундами
не делать delay, делать через таймеры, все равно к этому придете ))
ну или делать через два delay, подряд, сначала большую часть миллисекунды, потом остаток микросекунды.
__________________
Да здравствует Разум,да сгинет Маразм!
|
|
|
|
15.01.2016, 19:06
|
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
|
Re: "delay" не позволяет варировать микросекундами
Вот содержимое заголовочного файла delay.h
|
PHP код:
|
// CodeVisionAVR C Compiler
// (C) 1998-2000 Pavel Haiduc, HP InfoTech S.R.L.
#ifndef _DELAY_INCLUDED_
#define _DELAY_INCLUDED_
#pragma used+
void delay_us(unsigned int n);
void delay_ms(unsigned int n);
#pragma used-
#endif
|
Как Вы хотите присвоить дробное значение инту?
А вот почему ошибка при значении 1500 - Вам видней.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
Последний раз редактировалось akegor; 15.01.2016 в 19:18.
|
|
|
|
15.01.2016, 20:32
|
|
|
Гражданин KAZUS.RUN
Регистрация: 18.07.2006
Сообщений: 894
Сказал спасибо: 244
Сказали Спасибо 31 раз(а) в 28 сообщении(ях)
|
Re: "delay" не позволяет варировать микросекундами
cпасибо за отзыв
дело в том что delay_us (1500) работает нормально но
delay_us(x);
x=3000;
уже не работает в то время как
delay_ms(x);
x=3;
работает нормально.
|
|
|
|
15.01.2016, 20:46
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 08.05.2008
Адрес: регион 63
Сообщений: 1,827
Сказал спасибо: 750
Сказали Спасибо 679 раз(а) в 382 сообщении(ях)
|
Re: "delay" не позволяет варировать микросекундами
|
Код:
|
x=30;
for(i=0;i‹=x;i++)
{ delay_us(100)}
будет 3000мс =3сек |
можно и так, но это в корне неверный подход
запускайте таймер на счет микросекунд, в прерывании таймера инкрементируйте переменную- счетик, в основной программе анализируйте состояние счетчика и будет Вам счастье.
__________________
Да здравствует Разум,да сгинет Маразм!
|
|
|
|
15.01.2016, 21:11
|
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: "delay" не позволяет варировать микросекундами
Мега и мегаписатели это просто мегаудовольствие!
Сообщение от E_C_C
|
|
не делать delay, делать через таймеры, все равно к этому придете ))
|
А что, в Меге куча таймеров, как в последних ПИКах или СТМ32? Их просто девать некуда? Или они только для задержек и годятся?
Сообщение от E_C_C
|
|
можно и так, но это в корне неверный подход
|
Чем же интересно? Потому что кто-то когда-то сказал?
Сообщение от E_C_C
|
|
запускайте таймер на счет микросекунд, в прерывании таймера инкрементируйте переменную- счетик, в основной программе анализируйте состояние счетчика и будет Вам счастье.
|
Нифига себе счастье! Это просто мегасчастье! 
Это типа мегаSysTick ? Ух ты! А что, Мега настолько развита, что может прервать по человечески другое прерывание? Или прерывания тоже только для задержек и годятся?
|
|
|
|
15.01.2016, 23:05
|
|
|
Гражданин KAZUS.RUN
Регистрация: 16.02.2012
Сообщений: 440
Сказал спасибо: 89
Сказали Спасибо 735 раз(а) в 149 сообщении(ях)
|
Re: "delay" не позволяет варировать микросекундами
попробуйте как-то так:
|
Код:
|
#define _delay_ms(ms) \
for (uint8_t i=0; i‹(uint8_t)(ms); i++) delay_us(1000); \
delay_us( (uint16_t)(((ms) * 1000.0) % 1000.0) ); |
|
|
|
|
16.01.2016, 00:13
|
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
|
Re: "delay" не позволяет варировать микросекундами
Сообщение от begun
|
delay_us(x);
x=3000;
уже не работает
|
Все работает у меня. Работает в диапазоне беззнакового целого, а это 65 миллисекунд.
Или ищите блуд у себя, или счаз насоветуют костылей (уже есть желающие).
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
16.01.2016, 01:35
|
|
|
Гражданин KAZUS.RUN
Регистрация: 18.07.2006
Сообщений: 894
Сказал спасибо: 244
Сказали Спасибо 31 раз(а) в 28 сообщении(ях)
|
Re: "delay" не позволяет варировать микросекундами
akegor
у меня стоит XP
cvavr 25 версия
но ничего не получается. прямо как закалдованный круг.
раз у вас работает, я попробую запустить cvavr на ноутбуке и там попробовать.
|
|
|
|
16.01.2016, 01:42
|
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 11,122
Сказал спасибо: 202
Сказали Спасибо 3,283 раз(а) в 2,149 сообщении(ях)
|
Re: "delay" не позволяет варировать микросекундами
вот они, программисты на си.
знали бы как сам проц устроен все эти полускрипты/макросы нахрен не нужны были бы.
за 5 минут сам бы уж напиал свой делей а не сопли размазывал бы по форуму
void delayms (int ms)
{
c5=10;
TIM3-›ARR = ms;
TIM3-›CR1 = TIM_CR1_ARPE|TIM_CR1_CEN;
while (c5)
{ }
}
__________________
кагмаподэ магмаподэ
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:55.
|
|