dccharacter писал(а):Или еще проще. Не обнуляй счетчик, а присваивай ему значение 0x100000. Соответственно твое знаковое будет (Encoder - 0x100000). Т.е. ноль у тебя - и не ноль вовсе
Так прикол счетчика CiSi в том, что он не может ему ничего присвоить. Он его только читает - затем и введена переменная Bufer.
Короче, так как я написал должно работать, я вначале неправильно написал, потому что исходил из гипотезы, что энкодер считает всегда в плюс (не квадратурный, а одноканальный), а знак ему надо добавить вручную, исходя из неких флагов направления вращения. А раз энкодер честный - нужно именно сделать знаковое расширение разности (enc-buf) с 24 до 32 бит. 32 бита со знаком в обычном паскале для 32-разрядного x86 представлен типом integer. Это можно делать ручками через байты, как написал Michael_K, и паскаль даже позволяет такие манипуляции при помощи наложения памяти (absolute), но ИМХО сдвигами проще. Результат 100% идентичен - младшие 24 бита сохраняются полностью, а старшие (24-31) делаются все равны 23-му биту. В формате знакового целого это соответствует -0x00800000...0x007fffff, что и требовалось.
Добавлено спустя 3 минуты 20 секунд:А, стоп, вроде правда пишет что может обнулять. Но все равно вписывать 0x100000 не поможет - а если направление вращения не сменится? Через 0x100001 тиков вращения назад все равно перескочит с нуля на 0xffffff. Надо именно получить 24-битную разность со знаком - и тогда все будет ОК само, без никаких проверок.