whale писал(а):
Тут не важна скорость обмена а именно генерация импульсов, прога генерить импульсы напрямую через асм вставки
У вас примитивное представление о работе операционной системы, основанное на том, что ваша программа выполняется непрерывно.
Windows - операционная система с вытесняющей многозадачностью, а это значит, что ваша программа может быть прервана в любой момент, и процессорное время отдано другому процессу.
Почитайте здесь:
http://www.deep-shadows.com/hax/wordpress/?page_id=597Вы должны подключить цифровой осциллограф и поставить триггер на ширину импульса выше генерируемого. В определённый момент вы увидите импульс шириной >10 миллисекунд, потому что система отдала процессорное время другому процессу.
По-хорошему, генерация точных импульсов под Windows невозможна. В Mach3 эту проблему обходят использованием нестандартного драйвера, который настраивает таймер в южном мосту на генерацию аппаратного прерывания с частотой 25КГц. Прерывания выполняются на уровне ядра и имеют наивысший приоритет перед другими процессами. В этом прерывании специальная процедура делает расчёты и выставляет состояние выходов LPT порта по списку, предоставленному программой Mach3, выполняющейся в user space. Отсюда и выходит, что фронты всех формируемых импульсов находятся на границах импульсов 25КГц. Скажем, импульсы 12.5Кгц выглядят красиво, а 12кГц - чередуют периоды, отличающиеся по длине более чем на 50%.
В Arduino же имеется полный контроль над потоком выполнения и возможностью генерировать прерывания в нужный момент, поэтому, несмотря на меньшую процессорную мощность, есть возможность формировать правильные импульсы без дрожания фронтов, что очень важно для достижения высоких скоростей.