Цитата(MaxEngee @ Dec 16 2008, 12:56)

//1 while(!SSPSR_bit.RNE); IAR
while(!(SSPSR & 0x4)); KEYL
Раскритикую нафиг. "Магические цифры" вроде этой 0x4 - великое зло. Наверняка у кейла в заголовочном файле есть описание бита RNE. Или как #define RNE (1<<4) или как #define RNE 4.
В таком случае эта запись должна выглядить либо while(!(SSPSR & RNE)) либо while(!(SSPSR & (1 < RNE))). Иначе уже через пару дней вы полезете копать user manual чтобы понять, какой же бит эта четверка означает.
Цитата(MaxEngee @ Dec 16 2008, 12:56)

//1 PINSEL1_bit.P0_17 = PINSEL1_bit.P0_18 = PINSEL1_bit.P0_19 = 2;
PINSEL1 |= 2<<2;
PINSEL1 |= 2<<4;
PINSEL1 |= 2<<6;
PINSEL1 объявлен как volatile. Оба этих варианта приводят к совершенно лишним чтениям PINSEL1, а первая еще и к наложению масок (один из минусов объявления регистров как битовых структур). PINSEL1 |= (2<<1*2) | (2<<2*2) | (2<<3*2); Или сразу вынести в глобальную инициализацию и прописать сразу весь регистр через '=' (в ущерб модульности).
Цитата(MaxEngee @ Dec 16 2008, 12:56)

Может можно хедеры ИАРа в кейле использовать?
Можно, но полагаю у кейла заголовочные файлы не хуже.
Цитата(MaxEngee @ Dec 16 2008, 12:56)

#define KHZ *1000l
int freq=15KHZ; //для иара - 15 000
Кейл воспринимает только через пробел
int freq=15KHZ; //для кейла - 15
int freq=15 KHZ; //для кейла - 15 000
Очень, очень странно. 15KHZ - единый токен, подстановки быть не должно. Оба должны были выдать ошибку. gcc поступает правильно:
Цитата
invalid suffix "KHZ" on integer constant
Цитата(MaxEngee @ Dec 16 2008, 12:56)

На следующую запись Кейл ругаеться
208 for (Int32U Busy = 0, i = Twr; i && (Busy != 0xFF); --i)
Это С99, возможно Кейл поддерживает только С89. Ненаказуемо.