А есл так: содаем некую переменную типа а:byte, а=128, далее в двоичном коде (10000000 =>10010010) манипулируем переменной, получившее число отправлеем как данные в порт..PB_EXPERT писал(а): С LPT всё немного сложнее - через API сложно управлять отдельными выводами, поскольку такой режим предназначен для принтера, а не для "дёргания лапками".
USB -> "X" port, или помогите начинающему...
- Реклама
- Сообщения: 331
- Зарегистрирован: Вс мар 30, 2008 14:31:51
Я пишу не как пользователь, а как разработчик программ для ПК.Т.е. программа в МК действует с драйвером на ПК в единой связке, обеспечивая для пользователя иллюзию работы с физическим LPT
Для пользователя не важно каким образом происходит обмен инфой, главное чтобы всё работало.
Тут есть один нюанс, ести прога уже готова и расчитана на работу с физическим портом, т. е. использует прямой доступ к портам (непосредственно обращается к его физическим регистрам минуя винду), то никакой драйвер не сможет эмулировать физический регистр а области вода/вывода процессора, ведь не может программа добавить недостающую электронную схему в материнку.Драйвер можно научить представляться Винде виртуальным портом. Это не помешает ему принимать данные (команды) с параметром адреса, который он САМ (после обучения разработчиком)ставит в соответствие НАШЕМУ устройству...
Или я чего-то глобально недопонимаю?...
Если же предстоит самостоятельно написать прогу для ПК, то можно учесть что работа будет производится с виртуальным портом. В этом случаем может что и получится. Но ещё раз повторяю - прога должна поддерживать работу с виртуальным портом, тем более что как я понимаю он будет не совсем стандартным. В этом случае нужно взаиодействовать с драйвером виртуального порта непосредственно либо же использовать интерфейс API, про физические адреса 378h 379h 37A можно забыть. Прямой доступ к виртуальному порту невозможен, постольку это не физический порт!
Ну тогда точно про LPT забыть нужно, ведь работать будем с виртуальным COM портом! Тут рулит API, нужно только разобратся как записывать инфу так, чтобы она выводилась на нужные выводы МК.Со стороны ПК устройство видется как СОМ порт.
В этом случае точно нужно писать самостоятельно прогу для ПК...
Где-то я выкладывал DLLку, для работы с COM портами, в том числе и виртуальными.
Сложно сказать. Если устройство будет представлятся винде как виртуальным LPT порт и если работать с ним через API, то работа будет как с принтером. Теоритически это может прокатить, но проверить нужно...А есл так: содаем некую переменную типа а:byte, а=128, далее в двоичном коде (10000000 =>10010010) манипулируем переменной, получившее число отправлеем как данные в порт..
Если же устройство будет представлятся Винде как виртуальный COM порт, то это намного упрощает дело, поскольку в этом случае можно полностью управлять им (если конечно драйвер и устройство это позволяет).
А по СOMy надо смотеть pcports. На том же pcports было сказано, что для получения из поледовательного кода паралельный, надо какую особою "вещь" USART, а практически написано что есть мол в каждом МК... Кто-то что-томожет казать???PB_EXPERT
Если же устройство будет представлятся Винде как виртуальный COM порт, то это намного упрощает дело, поскольку в этом случае можно полностью управлять им (если конечно драйвер и устройство это позволяет).
По отношению к драйверу разработчик приложения является пользователемPB_EXPERT писал(а):...Я пишу не как пользователь, а как разработчик программ для ПК...
Справедливо и для разработчика. Или вы все уровни руками пишете?PB_EXPERT писал(а):Для пользователя не важно каким образом происходит обмен инфой, главное чтобы всё работало.
Вот и разобрались откуда непоняткиPB_EXPERT писал(а):Тут есть один нюанс, ести прога уже готова и расчитана на работу с физическим портом, т. е. использует прямой доступ к портам (непосредственно обращается к его физическим регистрам минуя винду), то никакой драйвер не сможет эмулировать физический регистр
Если бы вы внимательнее читали топик, то увидели бы, что речь шла не об использовании проги, осуществляющей прямой доступ к порту LPT. Автору топика нужно своеобразное USB-устройство, и виртуальный LPT (равно как и виртуальный СОМ) здесь появился лишь как одна из возможных платформ для своей разработки. Автора интересовал лишь способ управления этим портом (а его заложили разработчики USB-LPT), возможность реализовать свой интерфейс со своим протоколом. Прогу для ПК автору надо писать по любому. Но есть вероятность, что изменять прошивку МК не придется - зависит, опять же, от разработчиков устройства, взятого за основу...
Что сказать, фраза, вырванная из контекста, теряет смысл...
Остальное следствие вышеописанного заблуждения...PB_EXPERT писал(а):...
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Надо не просто USART, а преобразователь USART--> паралл. интерфейс, коим может являться МК...tytar писал(а):...На том же pcports было сказано, что для получения из поледовательного кода паралельный, надо какую особою "вещь" USART, а практически написано что есть мол в каждом МК... Кто-то что-томожет казать???
Что вас бросает из огня да в полымья...
Опишите работу вашего предполагаемого устройства подробнее, зачем оно нужно, тогда можно будет на примере пояснить что и как делать, как вариант...
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
- Реклама
Нужно собрать хитрый девайс...
Суть в следующим:
Подключаеться к USB и иметет три порта, чтото похожое на LPT...
Порт DATA(out/in)-8pin'ов
Порт Control(out only)-4pin'ов
Порт Status(in only)-5pin'ов
+ еще один пин как бы "аварийтый"-при подачи на него сигнала работа контроллера останавливаеться и в ПК передаеться "код ошибки" или сигнал... Управление по каждому пину индивидуальное...
Программа своя...
Сначала думал типа переходника усб-лпт, потом услышал, что с СОМом проще да и драйвера и примеры есть... Усб=СОМ=Псевдо ЛПТ??? З.Ы. Это не извращение???
Суть в следующим:
Подключаеться к USB и иметет три порта, чтото похожое на LPT...
Порт DATA(out/in)-8pin'ов
Порт Control(out only)-4pin'ов
Порт Status(in only)-5pin'ов
+ еще один пин как бы "аварийтый"-при подачи на него сигнала работа контроллера останавливаеться и в ПК передаеться "код ошибки" или сигнал... Управление по каждому пину индивидуальное...
Программа своя...
Сначала думал типа переходника усб-лпт, потом услышал, что с СОМом проще да и драйвера и примеры есть... Усб=СОМ=Псевдо ЛПТ??? З.Ы. Это не извращение???
- Сообщения: 331
- Зарегистрирован: Вс мар 30, 2008 14:31:51
Я всё внимательно читал, а непонятки из-за того, что вы утверждаете что виртуальный порт может создать физические регистры с адресами 378h 379h 37A.Вот и разобрались откуда непонятки
Можете посмотреть.А по СOMy надо смотеть pcports
Там еть полезная инфа.
Аппаратный модуль USART есть далеко не в каждом контроллере, но в Atmega8 он есть.USART, а практически написано что есть мол в каждом МК
Это модуль совместим с по протоколу COM портом компа.
---------------------------------------------------------
В архиве DLLка (её размер всего 8Кб) для работы с COM портом, в том числе и виртуальным.
Там же есть её исходник и описание функций.
Может пригодится.
- Вложения
-
- ComPort_Pb.rar
- (12.9 КБ) 354 скачивания
Это заметно сразу......Я всё внимательно читал...
Словосочетание "физические регистры" никто, кроме вас, не применял......а непонятки из-за того, что вы утверждаете что виртуальный порт может создать физические регистры с адресами 378h 379h 37A.
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Вы один в один переписали свой первый пост. Опишите простейшую операцию, выполняемую устройством. Например, прога на компе читает статус, конфигурирует IO порт, выставляет определенные уровни на пинах. Устройство с другой стороны МК (он же не один будет?) анализирует control и ... Мысль понятна? Только в картинках с реальным примером цикла информационного обмена...tytar писал(а): ...Суть в следующим:...
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
- Сообщения: 331
- Зарегистрирован: Вс мар 30, 2008 14:31:51
Допустим.Словосочетание "физические регистры" никто, кроме вас, не применял
Тогда объясните что имелось в виду под этим?
Как я понял это Ваш ответ на вопросЭто целиком и полностью определяется дровами между пользовательским ПО и виртуальным портом. Что мешает драйверу преобразовать адрес в номер соответствующего пина МК?
А здесь по всей видимости намёк на прямой доступ к портам!смогу ли я обращаться на прямую к портам "типа" 378h 379h 37A???
Значит так еть(т.е. нужно, а может и не нужно,если я не прав, или лезу за ненужным) 3 режима у этого девайса:Goodefine писал(а):Например, прога на компе читает статус, конфигурирует IO порт, выставляет определенные уровни на пинах. Устройство с другой стороны МК (он же не один будет?) анализирует control и ... Мысль понятна? Только в картинках с реальным примером цикла информационного обмена...
1. Индефикация. Прога посылает запрос на который МК должен ответить.
2. Инициализация. Прога читает статус девайса т.е. регистры портов(в МК которые). И устанавливает во все "0".
3.Робота. Вот к примеру, есть 3 порта пусть А,B,C; соответственно [x] номер бита, грубо говоря...
надо записать в A[3]-"1" а в B[4]-"0" Потом например в А-100100 вот...
Tytar, похоже вы еще сами плохо представляете порядок работы будущего девайса. Подобные проекты начинаются с подробного техзадания, в котором оговариваются все ньюансы. Только представляя работу устройства в целом, можно создать что-нибудь путное...
Давайте поразмышляем вместе...
Портом будем называть не отдельный пин, а их совокупность.
Для простоты примем, что в любой порт (data i/o, status, control) возможны запись и чтение. Нам нужно научить МК различать эти (и не только) операции. Вид команды - это тоже информация. Поэтому напрашивается простейшее решение - в процессе передачи/приема информации обмениваться несколькими байтами, анализируя которые можно принять соответствующее решение. Например:
1. Какие команды могут быть отосланы с ПК (не все сразу, разумеется)
- Установить пин МК в единицу, назовем set_pin, примем (совершенно произвольно), что эта команда соответствует числу (байту) 0хfa
- Сбросить пин МК в ноль - reset_pin - 0xfb
-Прочитать состояние пина - get_pin - 0xfc
-Записать в порт (в группу пинов) некоторое значение (число в двоичном формате) - set_port - 0xfd
-Прочитать состояние порта (группы пинов) - get_port - 0xfe
2. С командами разобрались. Теперь порты
-порт данных - port_data - 0xf1
-порт status - port_status - 0xf2
-порт control- port_control - 0xf3
3. Остается идентифицировать отдельные пины (не важно в каком порту)
нулевой пин - pin_0 - 0x01
первый пин - pin_1 - 0x02
...
седьмой пин - pin_7 - 0x06
4. Определимся с последовательностью отправки. Примем, что сначала отправляем команду, потом номер порта (пина), потом значение пина.
Например нужно установить первый пин порта статус в Для этого нужно отправить последовательно в МК несколько байт:
-set_pin - первый отправленный байт, указываем МК что будем устанавливать некоторый пин в 1-цу
-port_status - объясняет МК, что пин будет принадлежать порту status
-pin_1 - укажет какой пин установить в единицу.
Реально, исходя из принятых нами значений надо отправить байты
0xfa
0xf2
0x02
Удобно в проге на сделать замены типа
#define set_pin 0xfa
и дальше оперировать осмысленными определениями. Необходимо учесть, что надо сначала преобразовать стандартной функцией эти байты в ASCII символы а потом только отправлять...
Теперь надо разобраться с МК. В месте где принимаются байты, делаем их анализ, хоть простыми case-ми. По результатам анализа - конкретные действия... Протокол сообщений из МК (если нужно), разрабатываем примерно тем же способом
Понятно, чтобы система работала корректно, необходимо предусмотреть, что делать во всех конкретных случаях - если принялись не все байты, принят неизвестный байт и т.д...
Это лишь примерная концепция, один из вариантов...
Давайте поразмышляем вместе...
Портом будем называть не отдельный пин, а их совокупность.
Для простоты примем, что в любой порт (data i/o, status, control) возможны запись и чтение. Нам нужно научить МК различать эти (и не только) операции. Вид команды - это тоже информация. Поэтому напрашивается простейшее решение - в процессе передачи/приема информации обмениваться несколькими байтами, анализируя которые можно принять соответствующее решение. Например:
1. Какие команды могут быть отосланы с ПК (не все сразу, разумеется)
- Установить пин МК в единицу, назовем set_pin, примем (совершенно произвольно), что эта команда соответствует числу (байту) 0хfa
- Сбросить пин МК в ноль - reset_pin - 0xfb
-Прочитать состояние пина - get_pin - 0xfc
-Записать в порт (в группу пинов) некоторое значение (число в двоичном формате) - set_port - 0xfd
-Прочитать состояние порта (группы пинов) - get_port - 0xfe
2. С командами разобрались. Теперь порты
-порт данных - port_data - 0xf1
-порт status - port_status - 0xf2
-порт control- port_control - 0xf3
3. Остается идентифицировать отдельные пины (не важно в каком порту)
нулевой пин - pin_0 - 0x01
первый пин - pin_1 - 0x02
...
седьмой пин - pin_7 - 0x06
4. Определимся с последовательностью отправки. Примем, что сначала отправляем команду, потом номер порта (пина), потом значение пина.
Например нужно установить первый пин порта статус в Для этого нужно отправить последовательно в МК несколько байт:
-set_pin - первый отправленный байт, указываем МК что будем устанавливать некоторый пин в 1-цу
-port_status - объясняет МК, что пин будет принадлежать порту status
-pin_1 - укажет какой пин установить в единицу.
Реально, исходя из принятых нами значений надо отправить байты
0xfa
0xf2
0x02
Удобно в проге на сделать замены типа
#define set_pin 0xfa
и дальше оперировать осмысленными определениями. Необходимо учесть, что надо сначала преобразовать стандартной функцией эти байты в ASCII символы а потом только отправлять...
Теперь надо разобраться с МК. В месте где принимаются байты, делаем их анализ, хоть простыми case-ми. По результатам анализа - конкретные действия... Протокол сообщений из МК (если нужно), разрабатываем примерно тем же способом
Понятно, чтобы система работала корректно, необходимо предусмотреть, что делать во всех конкретных случаях - если принялись не все байты, принят неизвестный байт и т.д...
Это лишь примерная концепция, один из вариантов...
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
2Goodefine Большое спасибо за оч. расшириный ответ... Очень многое прояснилось!!!
Не могли бы Вы рассказать про "место принятия данных". т.е. куда будет записаны данные полученые с МК в ком-порт?. Я имел дело только с апаратным ЛПТ, и там данные записывались в регистры, данными из которых можна оперировать. знаю что есть буфер. Какая у него размерность и как с ним работать???
Не могли бы Вы рассказать про "место принятия данных". т.е. куда будет записаны данные полученые с МК в ком-порт?. Я имел дело только с апаратным ЛПТ, и там данные записывались в регистры, данными из которых можна оперировать. знаю что есть буфер. Какая у него размерность и как с ним работать???
Данные приходят в буфер COM - порта, накапливаются и лежат до тех пор, пока не будут прочитаны. Хранятся в виде строки из принятых байт. Читать можно регулярно, по таймеру. Либо по событию, что лучше. После чтения буфер обнуляется сам. Там есть аппаратный буфер, программный буфер - виндовский... Размер буфера в винде почти неограничен - МК его не переполнит....
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Но может легко его эмулировать для непривилегированных ring3 кусков кода. К примеру, именно так и поломали АПК РС3000 для DOSPB_EXPERT писал(а):Даже самый крутой драйвер не может создать аппаратный регистр в области ввода/вывода процессора.
Не селён в английском, но кое что понял, что вы скажете по поводу этого http://www-user.tu-chemnitz.de/~heha/ba ... /mf.htm.en
- Сообщения: 13796
- Зарегистрирован: Чт сен 20, 2007 14:08:00
http://www.mikrocontroller.net/articles/USB_IO_Expander
16 цифровых и 16 аналоговых входов + софт
победитель конкурса
16 цифровых и 16 аналоговых входов + софт
победитель конкурса
собрал CDC - IO с сайта http://www.recursion.jp/avrcdc/ все работает...
но он на одни и теже запросы по разному отвечает, не стабилен какойто или скорость не хватает...
но он на одни и теже запросы по разному отвечает, не стабилен какойто или скорость не хватает...


