|
|
  |
delay(uS), как сделать макрос? |
|
|
|
Jul 28 2008, 15:54
|

Местный
  
Группа: Свой
Сообщений: 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); < - ! ... ругается, мол перебор, преобразую в знаковый. Подскажите, как сделать правильно? Спасибо.
|
|
|
|
|
Jul 28 2008, 16:11
|

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

|
Цитата(Т.Достоевский @ Jul 28 2008, 17:54)  написал так... ( Сначала попробуйте самому себе объяснить, что написали, почему вписали конкатенацию!!!?, с какой разрядностью по умолчанию работает препроцессор, правила вычисления и округления, зачем сэкономили на скобках, зачем отступили от общепринятого описания констант. Ну system это system а не s ustem. Или хотя-бы воспользуйтесь поиском по форуму - про макрос задержку любимая тема. http://www.google.com/search?client=opera&...-8&oe=utf-8
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 29 2008, 08:51
|
Частый гость
 
Группа: Свой
Сообщений: 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)
--------------------
Метрология - наука о достаточной точности.
|
|
|
|
|
Jul 29 2008, 11:08
|
Местный
  
Группа: Свой
Сообщений: 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. ИМХО весь топик придуман на ровном месте.
|
|
|
|
|
Jul 29 2008, 13:15
|

Местный
  
Группа: Свой
Сообщений: 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 не догадался  .
|
|
|
|
|
Jul 29 2008, 14:54
|

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

|
Цитата(Т.Достоевский @ Jul 29 2008, 15:15)  Пришлось поставить скобки, теперь вроде всё нормально: Плохо читали  ссылки. Напишите Wait( 20+1); и посмотрите на результат. Про округление тоже забыли, а почитать не удосужились - тоже, конечно, "мелочь"... Цитата Ну вот откуда знаешь поначалу такие неявные мелочи? А чего тут "знать" - все совершенно ЯВНО видно невооруженным глазом - что написали, то и получили. Пенять не на кого. Правда вот в макросах сотворенных "писателем Редькиным" и не постеснявшимся издать книгу http://electronix.ru/forum/index.php?showt...42542&st=50 - все то-же самое. Мрак.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 29 2008, 15:58
|

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

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

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

|
Цитата(Т.Достоевский @ Jul 29 2008, 17:58)  Пишу так Wait( (20+1) ) Ага, зачем-то написав макрос, для использования которого надо знать о "тонкостях", хотя гораздо проще было написать макрос для использования которого о тонкостях знать совсем не надо, поскольку он должен работать всегда. Цитата Причём округление непонял, ибо чайник. А округление в школе не учили правильно делать? 2,99 цикла получившиеся после деления это сколько надо циклов сделать? Два или три? В форуме, ясно помню, уже минимум однажды писал об этом - поиском не найти не могли  . Значит просто не сочли нужным ознакомится - как-то "заработало и ладно"  . Да и о результате в 2,1 цикла тоже следует подумать, как округлять.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 29 2008, 16:15
|

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

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

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

|
Цитата(Т.Достоевский @ Jul 29 2008, 18:15)  Буду подбирать Ключевое Слово на поиск. А арифметику вспомнить не проще  ? Код #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
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|