fmdost 0 28 июля, 2008 Опубликовано 28 июля, 2008 · Жалоба Доброго времени суток Уважаемые! написал так... (IAR_AVR) #define sus_frec 8000000 #define uS sus_frec/1000000 #define delay_uS(data1) __delay_cycles(##data1 * uS) На строчку main{ delay_uS(300); < - ! ... ругается, мол перебор, преобразую в знаковый. Подскажите, как сделать правильно? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 28 июля, 2008 Опубликовано 28 июля, 2008 · Жалоба написал так... ( Сначала попробуйте самому себе объяснить, что написали, почему вписали конкатенацию!!!?, с какой разрядностью по умолчанию работает препроцессор, правила вычисления и округления, зачем сэкономили на скобках, зачем отступили от общепринятого описания констант. Ну system это system а не sustem. Или хотя-бы воспользуйтесь поиском по форуму - про макрос задержку любимая тема. http://www.google.com/search?client=opera&...-8&oe=utf-8 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MSprut 0 29 июля, 2008 Опубликовано 29 июля, 2008 · Жалоба У функции __delay_cycles ограничение на аргумент 32768 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
XsanyaX 0 29 июля, 2008 Опубликовано 29 июля, 2008 · Жалоба Доброго времени суток Уважаемые! написал так... (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 0 29 июля, 2008 Опубликовано 29 июля, 2008 · Жалоба У функции __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 0 29 июля, 2008 Опубликовано 29 июля, 2008 · Жалоба Вот как! На всякий случай Повторю. Всё, разобрался. Оказывается эта, извиняюсь за выражение, "тупая скотина" в лице препроцессора или компилятора не вычисляет значение 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: . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 29 июля, 2008 Опубликовано 29 июля, 2008 · Жалоба Пришлось поставить скобки, теперь вроде всё нормально: Плохо читали :( ссылки. Напишите Wait( 20+1); и посмотрите на результат. Про округление тоже забыли, а почитать не удосужились - тоже, конечно, "мелочь"... Ну вот откуда знаешь поначалу такие неявные мелочи? А чего тут "знать" - все совершенно ЯВНО видно невооруженным глазом - что написали, то и получили. Пенять не на кого. Правда вот в макросах сотворенных "писателем Редькиным" и не постеснявшимся издать книгу http://electronix.ru/forum/index.php?showt...42542&st=50 - все то-же самое. Мрак. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fmdost 0 29 июля, 2008 Опубликовано 29 июля, 2008 · Жалоба Плохо читали :( ссылки. Напишите Wait( 20+1); и посмотрите на результат. Про округление тоже забыли, а почитать не удосужились - тоже, конечно, "мелочь"... Пишу так: Wait( (20+1) ). Причём здесь округление непонял, ибо чайник наверное. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 29 июля, 2008 Опубликовано 29 июля, 2008 · Жалоба Пишу так: Wait( (20+1) ). А нахрена, простите? Не лучше ли было скобки в макросе поставить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fmdost 0 29 июля, 2008 Опубликовано 29 июля, 2008 · Жалоба А нахрена, простите? Не лучше ли было скобки в макросе поставить? Вообщето макросы использую впервый раз. Тупо слизал, и ещё до конца не разобрался. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 29 июля, 2008 Опубликовано 29 июля, 2008 · Жалоба Пишу так Wait( (20+1) ) Ага, зачем-то написав макрос, для использования которого надо знать о "тонкостях", хотя гораздо проще было написать макрос для использования которого о тонкостях знать совсем не надо, поскольку он должен работать всегда. Причём округление непонял, ибо чайник. А округление в школе не учили правильно делать? 2,99 цикла получившиеся после деления это сколько надо циклов сделать? Два или три? В форуме, ясно помню, уже минимум однажды писал об этом - поиском не найти не могли :(. Значит просто не сочли нужным ознакомится - как-то "заработало и ладно" :(. Да и о результате в 2,1 цикла тоже следует подумать, как округлять. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fmdost 0 29 июля, 2008 Опубликовано 29 июля, 2008 · Жалоба А округление в школе не учили правильно делать? 2,99 цикла получившиеся после деления это сколько надо циклов сделать? Два или три? ... Да и о результате в 2,1 цикла тоже следует подумать, как округлять. Неподумал, спасибо. Буду подбирать Ключевое Слово на поиск. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 29 июля, 2008 Опубликовано 29 июля, 2008 · Жалоба Буду подбирать Ключевое Слово на поиск. А арифметику вспомнить не проще :(? #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 0 29 июля, 2008 Опубликовано 29 июля, 2008 · Жалоба ...Или для жесткого обеспечения задержки что-то вроде:... Усвоил, спасибо :). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться