Цитата(VladimirYU @ Apr 15 2008, 17:56)

Добавьте UL
Спасибо, добавил, ошибки исчезли, но величина задержки всё равно вычисляется неправильно.
Вот как это выглядит:
Код
#define QUARTZ 10000000UL //Crystal quartz frequency
#define CLOCKS QUARTZ/1000000UL //tacts in microsecond
void SomeFunc(void)
{
volatile unsigned long a = 480 * CLOCKS;
}
Так вот, при просмотре отладчиком полученного кода, значение а получается равным 0x0001f9, то есть 505, когда должно быть 4800...
Чёрт, что за глупости
Причём значения до 420 * CLOCKS обсчитываются правильно, а чуть побольше и пошла бредятина...
Всё, разобрался.
Оказывается эта, извиняюсь за выражение, "тупая скотина" в лице препроцессора или компилятора не вычисляет значение 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);
На первый взгляд, какого чёрта делают скобки в таком простом выражении?
Ну вот откуда знаешь поначалу такие неявные мелочи?