Перейти к содержанию
    

delay(uS)

Доброго времени суток Уважаемые!

написал так... (IAR_AVR)

#define sus_frec            8000000
#define uS                  sus_frec/1000000
#define delay_uS(data1)        __delay_cycles(##data1 * uS)

 

На строчку

 
main{
delay_uS(300); < - ! 
...

ругается, мол перебор, преобразую в знаковый.

Подскажите, как сделать правильно? Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

написал так... (

Сначала попробуйте самому себе объяснить, что написали, почему вписали конкатенацию!!!?, с какой разрядностью по умолчанию работает препроцессор, правила вычисления и округления, зачем сэкономили на скобках, зачем отступили от общепринятого описания констант. Ну system это system а не sustem.

Или хотя-бы воспользуйтесь поиском по форуму - про макрос задержку любимая тема.

http://www.google.com/search?client=opera&...-8&oe=utf-8

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Доброго времени суток Уважаемые!

написал так... (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)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У функции __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.

 

ИМХО весь топик придуман на ровном месте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот как! На всякий случай Повторю.

Всё, разобрался.

Оказывается эта, извиняюсь за выражение, "тупая скотина" в лице препроцессора или компилятора не вычисляет значение 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: .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Плохо читали :( ссылки.

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

Ну вот откуда знаешь поначалу такие неявные мелочи?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Плохо читали :( ссылки.

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

Пишу так: Wait( (20+1) ).

Причём здесь округление непонял, ибо чайник наверное.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пишу так: Wait( (20+1) ).

А нахрена, простите? Не лучше ли было скобки в макросе поставить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А нахрена, простите? Не лучше ли было скобки в макросе поставить?

Вообщето макросы использую впервый раз. Тупо слизал, и ещё до конца не разобрался.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пишу так Wait( (20+1) )

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

Причём округление непонял, ибо чайник.

А округление в школе не учили правильно делать? 2,99 цикла получившиеся после деления это сколько надо циклов сделать? Два или три?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А округление в школе не учили правильно делать? 2,99 цикла получившиеся после деления это сколько надо циклов сделать? Два или три?

... Да и о результате в 2,1 цикла тоже следует подумать, как округлять.

Неподумал, спасибо.

Буду подбирать Ключевое Слово на поиск.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Буду подбирать Ключевое Слово на поиск.

А арифметику вспомнить не проще :(?

#define delay_ms(x) __delay_cycles( (x)*(((CPU_CLK_Hz)+500UL)/1000UL))

Или для жесткого обеспечения задержки что-то вроде:

#define delay_ms(x) __delay_cycles( (x)*(((CPU_CLK_Hz)+999UL)/1000UL))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...Или для жесткого обеспечения задержки что-то вроде:...

Усвоил, спасибо :).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...