Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: delay(uS)
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
fmdost
Доброго времени суток Уважаемые!
написал так... (IAR_AVR)
Код
#define sus_frec            8000000
#define uS                  sus_frec/1000000
#define delay_uS(data1)        __delay_cycles(##data1 * uS)


На строчку
Код

main{
delay_uS(300); < - !
...
ругается, мол перебор, преобразую в знаковый.
Подскажите, как сделать правильно? Спасибо.
zltigo
Цитата(Т.Достоевский @ Jul 28 2008, 17:54) *
написал так... (

Сначала попробуйте самому себе объяснить, что написали, почему вписали конкатенацию!!!?, с какой разрядностью по умолчанию работает препроцессор, правила вычисления и округления, зачем сэкономили на скобках, зачем отступили от общепринятого описания констант. Ну system это system а не sustem.
Или хотя-бы воспользуйтесь поиском по форуму - про макрос задержку любимая тема.
http://www.google.com/search?client=opera&...-8&oe=utf-8
MSprut
У функции __delay_cycles ограничение на аргумент 32768
XsanyaX
Цитата(Т.Достоевский @ Jul 28 2008, 18:54) *
Доброго времени суток Уважаемые!
написал так... (IAR_AVR)
Код
#define sus_frec            8000000
#define uS                  sus_frec/1000000
#define delay_uS(data1)        __delay_cycles(##data1 * uS)


На строчку
Код

main{
delay_uS(300); < - !
...
ругается, мол перебор, преобразую в знаковый.
Подскажите, как сделать правильно? Спасибо.


IAR_AVR определяет все константы меньше 65536 как 16 разрядные..... поэтому теряется точность при делении
Может это не совсем правильно, но в выражениях вычисляемых компилятором я привожу все числа к unsigned long long:

#define XTAL 8000000
#define Wait_uS(x) __delay_cycles(((unsigned long long)XTAL*(unsigned long long)x)/(unsigned long long)1000000)
VladimirYU
Цитата(MSprut @ Jul 29 2008, 11:11) *
У функции __delay_cycles ограничение на аргумент 32768


Весьма спорное утверждение. Читаем в описании на компилятор:

__delay_cycles(unsigned long int);
Makes the compiler generate code that takes the given amount of cycles to perform, that
is it inserts a time delay that lasts the specified number of cycles.
Note: The specified value must be a constant integer expression and not an expression
that is evaluated at runtime.

ИМХО весь топик придуман на ровном месте.
fmdost
Вот как! На всякий случай Повторю.
Цитата
Всё, разобрался.
Оказывается эта, извиняюсь за выражение, "тупая скотина" в лице препроцессора или компилятора не вычисляет значение CLOCK, а просто тупо подставляет строку в нужное место.
Например, вышеприведённое выражение принимает вид:

volatile unsigned long a = 480 * QUARTZ / CLOCKS

а потом уже компилятор пыжится посчитать:

volatile unsigned long a = 480 * 10000000 / 1000000

Естественно, после умножения идёт переполнение за 32 бита, и делению подлежат уже жалкие останки гигантской цифры...

Пришлось поставить скобки, теперь вроде всё нормально:

#define QUARTZ 10000000UL //Crystal quartz frequency
#define CLOCKS (QUARTZ/1000000) //tacts in microsecond
#define Wait(mksec) __delay_cycles(mksec*CLOCKS)

Wait(480);
На первый взгляд, какого чёрта делают скобки в таком простом выражении?
Ну вот откуда знаешь поначалу такие неявные мелочи?


Спасибо zltigo Искал по слову макрос, по __delay_cycles не догадался 07.gif .
zltigo
Цитата(Т.Достоевский @ Jul 29 2008, 15:15) *
Пришлось поставить скобки, теперь вроде всё нормально:

Плохо читали sad.gif ссылки.
Напишите Wait( 20+1); и посмотрите на результат. Про округление тоже забыли, а почитать не удосужились - тоже, конечно, "мелочь"...
Цитата
Ну вот откуда знаешь поначалу такие неявные мелочи?

А чего тут "знать" - все совершенно ЯВНО видно невооруженным глазом - что написали, то и получили. Пенять не на кого. Правда вот в макросах сотворенных "писателем Редькиным" и не постеснявшимся издать книгу http://electronix.ru/forum/index.php?showt...42542&st=50 - все то-же самое. Мрак.
fmdost
Цитата(zltigo @ Jul 29 2008, 18:54) *
Плохо читали sad.gif ссылки.
Напишите Wait( 20+1); и посмотрите на результат. Про округление тоже забыли, а почитать не удосужились - тоже, конечно, "мелочь"...

Пишу так: Wait( (20+1) ).
Причём здесь округление непонял, ибо чайник наверное.
aaarrr
Цитата(Т.Достоевский @ Jul 29 2008, 19:58) *
Пишу так: Wait( (20+1) ).

А нахрена, простите? Не лучше ли было скобки в макросе поставить?
fmdost
Цитата(aaarrr @ Jul 29 2008, 20:07) *
А нахрена, простите? Не лучше ли было скобки в макросе поставить?

Вообщето макросы использую впервый раз. Тупо слизал, и ещё до конца не разобрался.
zltigo
Цитата(Т.Достоевский @ Jul 29 2008, 17:58) *
Пишу так Wait( (20+1) )

Ага, зачем-то написав макрос, для использования которого надо знать о "тонкостях", хотя гораздо проще было написать макрос для использования которого о тонкостях знать совсем не надо, поскольку он должен работать всегда.
Цитата
Причём округление непонял, ибо чайник.

А округление в школе не учили правильно делать? 2,99 цикла получившиеся после деления это сколько надо циклов сделать? Два или три?
В форуме, ясно помню, уже минимум однажды писал об этом - поиском не найти не могли sad.gif. Значит просто не сочли нужным ознакомится - как-то "заработало и ладно" sad.gif. Да и о результате в 2,1 цикла тоже следует подумать, как округлять.
fmdost
Цитата(zltigo @ Jul 29 2008, 20:09) *
А округление в школе не учили правильно делать? 2,99 цикла получившиеся после деления это сколько надо циклов сделать? Два или три?
... Да и о результате в 2,1 цикла тоже следует подумать, как округлять.

Неподумал, спасибо.
Буду подбирать Ключевое Слово на поиск.
zltigo
Цитата(Т.Достоевский @ Jul 29 2008, 18:15) *
Буду подбирать Ключевое Слово на поиск.

А арифметику вспомнить не проще sad.gif?
Код
#define delay_ms(x) __delay_cycles( (x)*(((CPU_CLK_Hz)+500UL)/1000UL))

Или для жесткого обеспечения задержки что-то вроде:
Код
#define delay_ms(x) __delay_cycles( (x)*(((CPU_CLK_Hz)+999UL)/1000UL))
fmdost
Цитата(zltigo @ Jul 29 2008, 20:22) *
...Или для жесткого обеспечения задержки что-то вроде:...

Усвоил, спасибо smile.gif.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.