реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> delay(uS), как сделать макрос?
fmdost
сообщение Jul 28 2008, 15:54
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Доброго времени суток Уважаемые!
написал так... (IAR_AVR)
Код
#define sus_frec            8000000
#define uS                  sus_frec/1000000
#define delay_uS(data1)        __delay_cycles(##data1 * uS)


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

main{
delay_uS(300); < - !
...
ругается, мол перебор, преобразую в знаковый.
Подскажите, как сделать правильно? Спасибо.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 28 2008, 16:11
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Т.Достоевский @ Jul 28 2008, 17:54) *
написал так... (

Сначала попробуйте самому себе объяснить, что написали, почему вписали конкатенацию!!!?, с какой разрядностью по умолчанию работает препроцессор, правила вычисления и округления, зачем сэкономили на скобках, зачем отступили от общепринятого описания констант. Ну system это system а не sustem.
Или хотя-бы воспользуйтесь поиском по форуму - про макрос задержку любимая тема.
http://www.google.com/search?client=opera&...-8&oe=utf-8


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
MSprut
сообщение Jul 29 2008, 07:11
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 225
Регистрация: 25-04-06
Из: Украина, Луганск
Пользователь №: 16 476



У функции __delay_cycles ограничение на аргумент 32768
Go to the top of the page
 
+Quote Post
XsanyaX
сообщение Jul 29 2008, 08:51
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 75
Регистрация: 7-04-05
Из: Украина
Пользователь №: 3 948



Цитата(Т.Достоевский @ 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)


--------------------
Метрология - наука о достаточной точности.
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Jul 29 2008, 11:08
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(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.

ИМХО весь топик придуман на ровном месте.
Go to the top of the page
 
+Quote Post
fmdost
сообщение Jul 29 2008, 13:15
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Вот как! На всякий случай Повторю.
Цитата
Всё, разобрался.
Оказывается эта, извиняюсь за выражение, "тупая скотина" в лице препроцессора или компилятора не вычисляет значение 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 .
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 29 2008, 14:54
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Т.Достоевский @ Jul 29 2008, 15:15) *
Пришлось поставить скобки, теперь вроде всё нормально:

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

А чего тут "знать" - все совершенно ЯВНО видно невооруженным глазом - что написали, то и получили. Пенять не на кого. Правда вот в макросах сотворенных "писателем Редькиным" и не постеснявшимся издать книгу http://electronix.ru/forum/index.php?showt...42542&st=50 - все то-же самое. Мрак.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
fmdost
сообщение Jul 29 2008, 15:58
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Цитата(zltigo @ Jul 29 2008, 18:54) *
Плохо читали sad.gif ссылки.
Напишите Wait( 20+1); и посмотрите на результат. Про округление тоже забыли, а почитать не удосужились - тоже, конечно, "мелочь"...

Пишу так: Wait( (20+1) ).
Причём здесь округление непонял, ибо чайник наверное.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 29 2008, 16:07
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Т.Достоевский @ Jul 29 2008, 19:58) *
Пишу так: Wait( (20+1) ).

А нахрена, простите? Не лучше ли было скобки в макросе поставить?
Go to the top of the page
 
+Quote Post
fmdost
сообщение Jul 29 2008, 16:09
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



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

Вообщето макросы использую впервый раз. Тупо слизал, и ещё до конца не разобрался.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 29 2008, 16:09
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Т.Достоевский @ Jul 29 2008, 17:58) *
Пишу так Wait( (20+1) )

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

А округление в школе не учили правильно делать? 2,99 цикла получившиеся после деления это сколько надо циклов сделать? Два или три?
В форуме, ясно помню, уже минимум однажды писал об этом - поиском не найти не могли sad.gif. Значит просто не сочли нужным ознакомится - как-то "заработало и ладно" sad.gif. Да и о результате в 2,1 цикла тоже следует подумать, как округлять.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
fmdost
сообщение Jul 29 2008, 16:15
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Цитата(zltigo @ Jul 29 2008, 20:09) *
А округление в школе не учили правильно делать? 2,99 цикла получившиеся после деления это сколько надо циклов сделать? Два или три?
... Да и о результате в 2,1 цикла тоже следует подумать, как округлять.

Неподумал, спасибо.
Буду подбирать Ключевое Слово на поиск.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 29 2008, 16:22
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Т.Достоевский @ 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))


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
fmdost
сообщение Jul 29 2008, 20:12
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Цитата(zltigo @ Jul 29 2008, 20:22) *
...Или для жесткого обеспечения задержки что-то вроде:...

Усвоил, спасибо smile.gif.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th July 2025 - 09:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01492 секунд с 7
ELECTRONIX ©2004-2016