1. Заголовок или название темы должно быть информативным ! 2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК ! 4.НЕ используйте форум для личного общения! 5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
Здравсвуйте! Мне нужно выставить в последовательный порт стробический сигнал. Т.е. выставляем "1 " ждем n-кол-во микро-секунд., затем выставляем в порт "0" и опять ждёём. Вопросы такие: 1. как выставить данные в последовательный порт? 2. как на паскале организовать задержку в 10 микро-секунд? (микро-секунда=10 в -6):;; мили= 10 в -3) Заранее спасибо всем знатокам !
2) Никак. Стандартная PC поддерживает удовлетворительно задержки лишь больше 10 милисекунд. Если меньше, то нужна специализированная железяка, контроллер...
PS. Можно извратиться и получить задержку в 1..10 милисекунд, но ничего хорошего не получится, погрешности будут очень большие и интервал будет заметно плавать. О более мелких интервалах говорить бесполезно, они меньше интервала системного таймера. Можно использовать тики процессора, но они тоже будут тоже давать погрешности порядка 1000-10000%
В дополнение ко вчерашнему (нужно было посмотреть): Послать через регистр данных строб с такой частотой никак: даже при максимальной скорости это будет 6/115200 ~ 52 мкс. Но можно воспользоваться линиями RTS (7/4 ножки DP-9/25 ) или DTR (4/20 ножки) - они находятся в регистре контроля модема. Это будет выглядеть, примерно, так:
CONST COM=1; {Например, COM1} VAR BaseAddr:array[1..4]of word absolute $0040:$0000; {массив базовых адресов COM в BIOS}
{Меандр на RTS} ... repeat port[BaseAddr+4]:=$09; DelMKS(10); port[BaseAddr+4]:=$0B; DelMKS(10); until KeyPressed;
Уважаемый Алексей, по поводу Ваших вопросов: 1.WORD PTR обозначает только уточнение размерности: Del имеет длину 4 байта, а мы пересылаем его по кускам в 2 байта. Ассемблер, гад, недоверчивый и ему этот момент надо подтвердить.
2. в какое место в программе на паскале можно вставлять эту процедуру? В любое до первого обращения к ней. Желательно не вкладывать в другую процедуру.
3. и так же прошу более подробного разьяснеия (для полу-чайника) по поводу второй проги. Извиняюсь, там небольшая плюха:
CONST COM=1; {Например, COM1} VAR BaseAddr:array[1..4]of word absolute $0040:$0000; {массив базовых адресов COM в BIOS}
{Меандр на RTS} ... repeat port[BaseAddr[COM]+4]:=$09; DelayMKS(10); port[BaseAddr[COM]+4]:=$0B; DelayMKS(10); until KeyPressed;
Этот фрагмент будет гнать 50 КГц меандр по линии RTS (4 контакт на 25-штырьковом разъеме или 7 на 9-штырьковом) порта COM1, пока не будет нажата какая-либо кнопка. Массив BaseAddr перекрывает системную область памяти (кстати, доступ к ней разрешен и под "Форточками" - селектор 40h открыт для общего доступа), в которой находятся базовые адреса последовательных портов. По смещению 4 находится регистр управления модема, который как раз использует служебные линии COM. Меняя задержки между обращениями к порту, можно получить сигнал любой формы.