СОВРЕМЕННАЯ ЭЛЕКТРОНИКА №4/2012
Программаmtimer.exe запускалась и в DOS, и в Windows 98/XP (в режиме эмуляцииDOS), и везде давала практи чески одинаковый результат. Это поз воляет использовать команду процес сора для ввода байта из COM порта как временную базу для организации ко ротких, аппаратно независимых вре менных задержек длительностью от нескольких микросекунд до десятков микросекунд. Получение бо ’ льших за держек не вызывает затруднения, по скольку для них вMSDN Library сущест вует функция sleep(), аргументом ко торой является число миллисекунд (эта функция использована в тестовой программе testRS232.clw – см. ниже). П ОДПРОГРАММЫ ВВОДА / ВЫВОДА БАЙТА ДЛЯ КОМПЬЮТЕРА В соответствии с временной диа граммой, показанной на рисунке 1, на рисунке 5 приведена блок схема про токола передачи байта из компьютера с побайтной аппаратной синхрониза цией линиями данных. В соответствии с этой блок схемой в [1] использована подпрограмма вывода байта на языке Clarion v.6.0, которая приведена ниже: ! ! Подпрограмма вывода байта (байт в переменной OUTB) ! OUTBYTE routine loop until band(INP(3fdh),20h). !Ожидание готовности передатчика (transmitter empty). loop until band(INP(3feh),20h). !Ожидание разрешения передачи – установки DSR. B=INP(3feh) !Очистка 3feh для сброса бита DeltaDSR(02h). OUTP(3f8h,OUTB) !Вывод байта. loop until band(INP(3feh),02h). !Ожидание запрета передачи – из менения состояния DSR. loop until band(INP(3fdh),40h). !Ожидание выхода байта из РС – (OK to send). ! В этой подпрограмме, в свою оче редь, используются две подпрограммы прямого ввода и вывода в порты INP() и OUTP(), написанные на встроенном в Clarion языке C++ (In.cpp и Out.cpp). Эти две подпрограммы также приве дены ниже. Подпрограмма In.cpp. #pragma save #pragma call(inline => on, reg_param => (dx), reg_return => (ax)) // static unsigned char inportb(un signed int Port_number)= { 0xEC, // in al,dx }; #pragma restore extern "C" unsigned char INP(un signed int Port_number) { unsigned char byte; byte=inportb(Port_number); return byte; } Вызов этой подпрограммы, в част ности, осуществляется из вышеприве дённой подпрограммы (routine) выво да байта OUTBYTE (Clarion v.6.0) ко мандой INP(). Подпрограмма Out.cpp. #pragma save #pragma call(inline => on, reg_param => (dx,ax)) // static void outportb(unsigned int port, unsigned char byt)= { 0xEE, // out dx,al }; #pragma restore extern "C" void OUTP(unsigned int Port_Number, unsigned char byte) { outportb(Port_Number,byte); } Вызов этой подпрограммы также осуществляется из вышеприведённой подпрограммы (routine) вывода байта OUTBYTE командой OUTP(). Если ещё раз взглянуть на подпро грамму вывода байта OUTBYTE, напи саннуюна Clarion v.6.0, то можно заме тить, что вызов подпрограммы INP() производится 1 м, 2 м, 3 м, 5 м и 6 м операторами, причём 1 й, 2 й, 5 й и 6 й – это операторы цикла, где обра щение к подпрограмме INP() проис ходит многократно. Вызов подпро ПРОГРАММИРОВАНИЕ 68 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 4 2012 Рис. 5. Блок схема подпрограммы синхронного вывода байта из компьютера Чтение регистра состояния линии ( 3fdh ) Нет Нет Нет Нет Регистр передатчика пустой? [( 3fdh ) = 20 h ?] Передача разрешена? (линия DSR активна?) [( 3feh ) = 20 h ?] Передача запрещена? (линия DSR сброшена?) [( 3feh ) = 20 h ?] Байт вывелся полностью? [( 3fdh ) = 40 h ?] Выход из п/п Вывод байта ( al ) в порт данных ( 3f8h ) Чтение регистра состояния модема ( 3feh ) Чтение регистра состояния модема ( 3feh ) Чтение регистра состояния линии ( 3fdh ) Да Да Да Да Рис. 4. Окно RUN турбо бейсика при запуске программы mtimer.exe © СТА-ПРЕСС
RkJQdWJsaXNoZXIy MTQ4NjUy