Работаю с абсолютным датчиком угла, т.е. выдающим не приращение, а угловые координаты, при запросе. Информация выдается в виде 30 битного кода, 16 бит-угол, 14 бит - количество оборотов. Процедура получения информации и приведение ее к угловой корости - это процедура обработки прерывания от таймера (получение информации с частотой 1кГц). Собственно вот она:

Код
void TimerInterrupt(){

long RAZ;// otsch;//, _w_enk;
unsigned short otsch, ob;
++step;
//fl = 1;
ob      = DATIn14();
otsch   = DATIn16();
_oborot = ob;
  

RAZ = otsch - otschet;
otschet = otsch;

if (RAZ < -32768) {RAZ =+ 65536;}  // обработка перехода через 0 в положительном направлении

if (RAZ > 32768) {RAZ =- 65536;}    // обработка перехода через 0 в отрицательном направлении


w_enk = (RAZ*0.0054931640625)/0.001;...........}


условие (RAZ < -32768) получается исходя из максимальной скорости вращения (ну пол оборота за 0.001 сек она не может быть никак).

Проблема: в определенные моменты времени при наличии угловой скорости RAZ становится равным -65535. Если угловая скорость постоянна то такая ошибка выдается примерно через равные отрезки времени.
Помогите, где ошибка? help.gif help.gif
и независимо от результатов a14.gif a14.gif

Работаю на LPC2114. Компилятор IAR.