Здравствуйте, добрые люди.
Создаю внешнее устройство, которое будет подключаться к COM порту.
Соответственно мне нужна тактовая частота.
Могу ли я получить её из самого порта?
Если да, то подскажите как.
Если нет, то может кто-нибудь знает марку генератора (микросхемы), имеющего частоту кратную 115200. Зараенее благодарен.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
30-04-2006 14:31
>>> питание - можете
Только с питанием не переусердствуйте, там небольшой ток, как раз только для мыши, 600 ваттный двигатель от COM порта не запустить (почему говорю - прецедент был :()
Из компорта тактовую не получить, он принципиально асинхронный. Но! Что нельзя сделать аппаратно, можно эмулировать программно. Только не ждите от этого способа высокой и стабильной тактовой частоты.
Могу предложить два способа генерации импульсов при помощи компорта.
Чисто программный — в отдельном потоке с высоким приоритетом в цикле управляем выходным сигналом порта при помощи EscapeCommFunction, разделяя вызовы функцией Sleep. Частота зависит от параметра задержки в Sleep и от работы Windows. Что реально получится, покажет эксперимент, но думаю, килогерц получить можно (в наихудшем случае 50 Гц, но более-менее стабильно). Выходной сигнал формируется на TxD, DTR или RTS.
Программно-аппаратный — используем передатчик как генератор, задающий параметры импульса. Компорт программируется на скорость в 10 раз больше нужной частоты (при 8 битах без четности, 1 стоповый). В порт пишем столько байтов со значением $FF, сколько импульсов нужно выдать в одной пачке. Все остальное сделают драйвер и компорт. Максимальная частота здесь зависит от возможностей компорта (от максимальной скорости, на которую удастся его настроить, в настоящее время это существенно больше 115200 и зависит от аппаратуры). Выходной сигнал формируется на TxD.
Прием сигнала в обоих случаях надо осуществлять на один из статических входов компорта, которые можно прочитать через GetCommModemStatus. После выдачи импульса и задержки читаем состояние DSR, CTS, или RI.
Во втором способе можно исхитриться и заставить работать приемник. При этом внешнее устройство должно подавать сигнал на RxD, принятый от TxD с подмешанной своей информацией. Пусть оно, получив фронт синхроимпульса, формирует короткий импульс в случае передачи 0 и длинный в случае 1, или наоборот. Программа будет распознавать бит по количеству 0 и 1 в принятом байте.
С микроконтроллерами я дело пока не имел, но теперь видимо придётся исследовать эту область. Своё устройство я спроектировал чисто на логических элементах. Его функция - "засовывать" последовательно информацию с 8-ми параллельных входов в асинхронные посылки RS-232. Грубо говоря, простой мультиплексор, управляемый счётчиком, который в свою очередь и тактируется частотой от задающего генератора. Посылку RS-232 таким образом я формирую "вручную" (пропуская конечно её через преобразователь уровней ТТЛ - RS232). Вы правы, все эти дела выходят за рамки рассматриваемых здесь вопросов, но всё равно - спасибо за Ваши советы, будем трудится. Если кто-нибудь что-нибудь ещё сможет подсказать, то буду очень признателен. Спасибо!
Вообще сайт посвящен не этому, ну да ладно. Вы определились, на каком контроллере будете делать устройство? Многие уже имеют генератор внутри себя, нужно только подключить частотозадающую цепочку. А в принципе, в чем проблема сделать генератор самому? Берете кварцевый резонатор и вперед. А из самого COM порта вы ее не получите, а вот питание - можете, мыши так работают.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.