Аналоговый сигнал в COM порт

Печатные платы, программируемая логика, разработка и изготовление аппаратуры

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 23991
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

HardWareMan wrote:ISA работает на половине частоты от 14.1318МГц. Т.е. на 7МГц. И ты никак не сможешь захватить каждый такт шины. Ну никак. У СОМ порта макс. скорость 115Кбит. У USB эмуляторов до 1Мбит. Обычный СОМ порт просто завалит твою программу прерываниями. Вспомните, когда скорость поднялась до 19200, без FIFO в СОМ контроллере уже вешается весь комп, заметьте, даже под DOSом! А если ты захочешь видео семплировать, это минимум 3 миллиона отсчетов. Если переводить в поток, и АЦП 8 бит, то это будет 3МБайта в секунду. х8 = 24Мбита в секунду. В итоге - СОМ - это утопия. USB еще справится, 2.0 который. Так что УВЫ.
Да - наверное через COM или LPT ловить видео - это утопия. Максимум что можно поймать - это строчную развертку от видеостроки да и то с погрешностями...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

бенчмарк - больше 700000+- обращений

Post by Lavr »

Я тоже такой бенчмарк делал и гонял на различных машинах,
только я подсчитывал генерируеные через порт импульсы.
Действительно, более 350000 импульсов не получается нигде.
Мне кажется, это связано с тем, что при обращении к порту
время доступа автоматически увеличивается во всех ПиСях.
То есть время записи удлинняется т.к. считается что порт -
медленный по сравнению, скажем, с памятью.
User avatar
Shaos
Admin
Posts: 23991
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: бенчмарк - больше 700000+- обращений

Post by Shaos »

Lavr wrote:Я тоже такой бенчмарк делал и гонял на различных машинах,
только я подсчитывал генерируеные через порт импульсы.
Действительно, более 350000 импульсов не получается нигде.
Мне кажется, это связано с тем, что при обращении к порту
время доступа автоматически увеличивается во всех ПиСях.
То есть время записи удлинняется т.к. считается что порт -
медленный по сравнению, скажем, с памятью.
Я помниться по работе (ещё в России примерно в 2001 году) делал исследование - считал импульсы (посылаемые генератором со счётчиком) через LPT порт в линухе и RT-линухе - могу поискать отчёт...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

2_Shaos

Post by Lavr »

Поищи - это интересно...
Но мне кажется 350000 - это железный предел,
по крайней мере для LPT - я их тестил, а
бенчмарк я под голым ДОСом запускал.
От скорости процессора частота обращения к порту
практически перестаёт зависеть.
User avatar
Shaos
Admin
Posts: 23991
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: 2_Shaos

Post by Shaos »

Lavr wrote:Поищи - это интересно...
Но мне кажется 350000 - это железный предел,
по крайней мере для LPT - я их тестил, а
бенчмарк я под голым ДОСом запускал.
От скорости процессора частота обращения к порту
практически перестаёт зависеть.
Нашёл отчёт, подготовленный мной в апреле 2002 года - я не на скорость оказывается считал, а на стабильность - максимальная частота генератора была 9600 Гц с которой посылалось 65535 импульсов - RT-Linux на Pentium-166 всегда считал на один больше (я так и не понял почему). Ещё один тест - посылка с досовского компьютера с частотой 100 Гц на комп с RT-Linux, загруженный веб-сервером, архиватором bzip2 и графической программой (fun из svgalib дем) - считало стабильно в течение 25 часов и не потеряло ни одного прерывания.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

2_Shaos

Post by Lavr »

...считало стабильно в течение 25 часов и не потеряло ни одного прерывания.
А вот это вопрос самый интересный...
А как ты думаешь (я тогда тоже на эту тему размышлял) - как
проц успевает обрабатывать прерывания таймера, если не запрещены,
и регенерировать ОЗУ по второму каналу таймера ?
На осциллографе сигнал вздрагивает периодически, а логического
анализатора у меня в то время не было...
User avatar
Shaos
Admin
Posts: 23991
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: 2_Shaos

Post by Shaos »

Lavr wrote:
...считало стабильно в течение 25 часов и не потеряло ни одного прерывания.
А вот это вопрос самый интересный...
А как ты думаешь (я тогда тоже на эту тему размышлял) - как
проц успевает обрабатывать прерывания таймера, если не запрещены,
и регенерировать ОЗУ по второму каналу таймера ?
На осциллографе сигнал вздрагивает периодически, а логического
анализатора у меня в то время не было...
ну циклов много у проца - видимо успевает :)
Я тут за главного - если что шлите мыло на me собака shaos точка net
zooleek
Fanat
Posts: 53
Joined: 31 May 2007 08:23
Location: Украина

Post by zooleek »

:) привет, товарищи !

на счет прерываний - думаю, порядок не тот.

какие прерывания от таймера ? 18.2 гц ? мало это :) (для 4 мгц 8080 даже, например)

и разом-вместе 100 гц (*2 для полупериода).. ..

регенерация ОЗУ? лень справочники поднимать, .. разве не контоллер ПДП совместно с таймером этим занимается ? (имею ввиду ibm pc xt/at)..

а, собственно, с моим вопросом - хотелось математическую основу под, своего рода, АЦП на распостраннённых портах в PC.. переполняюсь ужасом при мысле проектировки для usb..(плохое впечатление от дешевых китайских цацэк :) звуковые карты, кардридэры, переходники IDE(один, самый дешевый, попался без глюков). тут поток большой.., а то что попроще - клавы, пады, мыши - тут все ок)..usb.. [в большинстве случаев] это либо универсальный либо, специальный контроллер.. (просто не знаю где взять и чем программировать)

цель - (1.)устройство, которое будет работать со всеми компьютерами.

(правда почти у всех не занят в компьютере line-in звуковой ))
и появился осцилограф с возможностью делать снапшоты :) )

у вас есть usb флэшки, которые тормозят у товарища, а на вашем компьютере работают ощутимо быстрее ? внешний винчестер ? тв - тюнер ? (usb)
производители используют новый usb 3.0 (черновой?) ожидаются новые скорости и новые несовместимости :) (поэтому такое недоверие у меня)

отсюда - (2.) - что то свое, где бы было меньше ограничений (большая частота дскретизации), несовместимостей и пр.. но юзать существующие интерфейсы надо. внутренние пока оставим на потом. комп сжигать не хочется. попробую использовать то что есть (см. ниже по тексту )) )и попросить Вас подсказать тупой (простой в пайке и программировании, с минимумом обязательных инициализаций, обьявлений и функций), но !быстрый! и дешевый контроллер с каким-нибудь интерфесом для компа
usb - главное чтобы корректно опознавал 2.0/1.1(1.0? 0_о) )
lan - udp unicast, broadcast по ip и/или arp (любой Ваш вариант от крайности когда комп слушает интерфейс и сам обрабатывает сырые данные поступающие [почти] в реальном времени, до самостоятельного измерительного комплекса с веб интерфесом (не готовые решения, а прикинуть мощность Вами рекомендованного контроллера), серия, где купить, софт (проприэтарный/gnu/?)

а теперь - что есть :)

если с тв не сложилось, то, пока, - регистратор (крайне дикий,правда :)) )
как оооочень большой "микроконтроллер" хочу использовать xt-плату из какого то брендового samsung(разьем для питания непонятный). для отладки подключать к хосту по rs232, (на плате и com и lpt прям на стеночке рядом с din-5)

[нуль-модем, для HardWareMan сообщу, что в предыдущих постах имелось ввиду Програмную регистрацию сигнала(ждать пока ногой дернет), включать ли прерывание (событие модема) - как эксперемент.. в зависимоси, что быстрее получилось бы.. стоит попробовать и сравнить с 350 000(600 000) итерациями..(может тогда мощность процессора имеет значения ?) а Ваши цифры о 9600, 115000 и пр скоростях относятся к линиям TxD RxD, а в картинках к вопросу они только служебные (заряд кондёра), данные измерения получают не с них., считают процем... к Вам еще вопрос :) какая задержка от служебных линий состояния модема rs232, через контроллер прерываний и к процу.. как бы устройство дало прерывания и ждет пока ответят.. где бутылочное горлышко ? может что то можно сменить/довесить на isa(для старых плат)]

научить его брать ВСЮ рабочую программу с этого же порта. никакого оригинального БИОСа, пробовать инициализацию как по книжке. судя по большому количеству и размерам микросхем на плате (явных ПЛИС не обнаружено), контроллеры (com, fdd, dma..) оригинальные и без необычных обратных связей.., ну, типа, если плата как в книжке, значит и программируется как в книжке)

а в качестве АЦП - применять предложенное токовое зеркало (? так вроде ответ был? кстати я только понял что именно оно и мне нужно было))) с первого взгляда (нескольких лет смотрения) не дошло).. повешу куда нибудь.. если что - попробую ПДП задействовать.

сейчас - запустить плату надо, но не в штатном режиме. без клавы, видеоадаптера, подключить неродной бп.

распиновка на питание надо. были может какие еще разьемы до AT ?

также просьба подсказать во что залить мой загрузчик (стоит большая dip микросхема и рядом такая же пустая панелька), может есть какие мелкие eeprom'ы ? надо просто маленькую прогу до 100 байт чтобы висела там
(желательно чтобы я сам справился с прожиганием, другие пока просят 10 $)

потом будет куча эксперементов.. ожидаемый результат - программа для заливки в микросхему bios(именно для этой, стандартной платы, может и как *.com прога под досом на другом железе запустится с целью усовершенствования), получить опыт построения систем регистрации сигналов :)

итог:
по теме, по com-порту, - вопрос открытый, не в плане тв, а в плане пропукной способности служебных линий (дёрганье ногой), програмно (циклический опрос)- цифра намного меньше 1 мгц... мало.. а как с прерываниями ? сейчас проверить не могу.. может кому скучно ? :) еще нужен генератор чтобы сигнал этот подать.. может, позже попробую переделать один..

быстрый микроконтроллер (usb и/или lan)

старая плата - разьем питания, пзу (начальный запуск со своей микропрограммой вместо bios без vga, keyboard.. может, надо что то особо инициализировать ? тот же таймер.. )

советы/предложения ?

2 Shaos: Извините, что всё в кучу.. редко тут бываю.. как консультация получилось.. просто все оно об одном - научиться отлавливать быстрое и полезное дёргание ногой..

зы: может когда то и до SPDIF доберемся :lol:
zooleek
Fanat
Posts: 53
Joined: 31 May 2007 08:23
Location: Украина

Post by zooleek »

поставил експеримент..

оказалось что в прерываниях я [пока] ничего не понимаю )) и в их программировании тоже :)

пока только делал выборки (не спрашивайте чем) из порта (состояние линий или модема.., там где CTS вход мониторить можно)

на CTS повесил кт315.. и батарейку 9в (cccp "крона")
на него - генератор ЗЧ.

минус батарейки на SG, 5 pin порта
плюс - на коллектор.
эммитер - вход ЗЧ и CTS, 8 pin порта.
база - второй вывод для генератора.

может это с "общим эммитером" называется.. хотя помоему я извратнулся немного.. образования нет, если что, - поправте.

теперь сам ефект :)

с порта (3f?, где состояние CTS можно отследить):
интересны бит 0 и бит 4

если считать сколько "еденичек" пришло с порта (0 бит) за секунду - получим что то похожее на частоту колебаний(синусоида обычная), отловить все значения, как писал HardWareMan, - невозможно, поэтому число немного занижено.

(надеюсь на прерывания)

частота - это так))
а если высчитать за ту же секунду число пришедших "16-ток" :)
и покрутить ручку уровня сигнала на приборе при этом, смотреть на изменения...
это число пропорционально амплитуде :)
(площадь полупериода нашей синусоиды, кусок Ынтеграла, начиная с 3 вольт)

есть соображения почему :)

кто верит ? (частота 35-1600 гц, работает :) кто математик пусть посчитает :)
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

2_zooleek

Post by Lavr »

регенерация ОЗУ? лень справочники поднимать, .. разве не контоллер ПДП совместно с таймером этим занимается ? (имею ввиду ibm pc xt/at)..
Вот как раз по справочникам канал 1 таймера отвечает за регенерацию ОЗУ. И в них же написано - ежли не знаете, что делаете - не трогайте его.

А как его корректно трогать в неплохой брощюре написано, щас название не вспомню -
но автор интересный - 2B Groop (в Инете не нашел - дома гляну).

Так что нащщет лени - это есть поклёп. :wink:
zooleek
Fanat
Posts: 53
Joined: 31 May 2007 08:23
Location: Украина

Post by zooleek »

по 1 каналу таймера (imb/at, написано так на бумаге :) ):

два входа, делитель - 1 выход

входы - вентиль, что то вроде ENABLE (во втором канале, который на динамик этот вывод подключен ко 661pp1 (я анаграмный параноик, поэтому мне это похоже на 580вв55, поправте, если чо.. опяь лень)), но сознательная.))... тут же он подтянут к +5 в. (как и 0 канал), - всегда "готов"!

второй вход - это CLK = 1,19 мгц (2.38мгц/2)

выход (clk out, уже после деления)- к кубику))) ша нарисую)
....................................______
.......................+5v-----|B...... Q|-----запрос (к памяти? тоесть пдп ?)
clk_out, ch1 timer---|CLK.... |
.................refresh ----|CLEAR|
....................................|______|
.(все... устыжайте меня великие схемотехники, что не знаю обозначений)) )....

8254-2 четыре порта - 3 счетчики, 1 порт управление

в моем мануале кроме сего написано, правда на правах "примечания", типа такого: канал 1 (таймера, про который я тут всё пишу))) программируется как генераток для получения !!!! 15 микросекундного периодического сигнала !!! (15 мкс)

в общем в регистрах делителя 1 канала таймера при инициализации поселяются значения для дробления 1,19 Мгц до сигнала на выходе с периодом 15 мкс. потом сей буфер (так правильно?, что чуть выше "нарисован") и пдп...

зы. в моем мануале есть только таблица irq с приоритетами. программирование контроллера прерываний - вопрос онкрытый. буду рад bin (или asm 86) готовому модулю)) с инструкцией. (под реальный режим..., голенький..)
zooleek
Fanat
Posts: 53
Joined: 31 May 2007 08:23
Location: Украина

Post by zooleek »

во даю... совсем одичал разумом... )) думал это у Вас вопрос по таймеру..
а потом пречитал - у вас и книга, как правильно программить :oops:

таймер - эт нинада)))

в крайнем случае так:

прерывание - нога с com- порта, которая просто счетчик инкреминирует.
и второе прерываение, от таймера, который перепрограммирован для уменьшения периода посчета. грубее данные, но быстрее. подпрограмма на этом, прерывании от таймера просто счетчик от первого (com - порт) - тихонько сохраняет и обнуляет для следующего замера.

прикладное применение: игры (как на радио 86рк)) )
только схема управления посложнее, но на одной цифровой ноге - мультивибратор с резюком для частоты и вторым для амплитуды.. зависимость их походит на подушку.. некрасиво для точных замеров но для игр-цацек-демок - наверное оно.
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

2_zooleek

Post by Lavr »

zooleek wrote:
во даю... совсем одичал разумом... ))
У Вас там, наверное, жарко... :wink:
Но Вы критично к себе относитесь... :lol: , что радует.
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

zooleek wrote:потянет ли видесигнал(яркость+синхро) проц под чистым досом
Видео явно не потянет. А вот синхросмесь, а уж тем более звук в режиме ШИМ
СОМ-порт, похоже, вполне вытянет.
HardWareMan wrote:У СОМ порта макс. скорость 115Кбит.
На мой взгляд, этого с головой хватит.
В качестве ШИМ можно использовать даже COM-порт. Т.к. 0 передаётся как 0 0000 0000 1 (8 бит данных + старт/стоп), а 255 как 0 1111 1111 1, то диапазон выходных напряжений - 10-90% с шагом в 10%.
http://ru.wikipedia.org/wiki/Широтно-им ... _модуляция
Извращенский ШИМ из UART

Автор DI HALT
Опубликовано 07 Сен 2008
Рубрики: AVR. Учебный курс
Метки: PWM, UART, Микроконтроллер, Трюки, ШИМ


Пока писал статью про UART пришла в голову одна извращенная идея - на базе UART же можно организовать самый натуральный низкодискретный ШИМ!


Достаточно только сделать где-нибудь в памяти переменную, куда мы будем совать число с заданной скважностью нулей и единиц, а по прерыванию опустошения буфера это число снова пихать в регистр UDRE. Таким образом, генерация ШИМ будет самопроизвольной, без лишних телодвижений. Правда можно получить всего 10 разных значений ШИМ, но зато нахаляву!!!

Для тех кто не понял как, приведу числа которые надо будет непрерывно слать через UART:
два дополнительных значения мы получим за счет старт и стоп битов.

00000000 - 1/10
00000001 - 2/10
00000011 - 3/10
00000111 - 4/10
00001111 - 5/10
00011111 - 6/10
00111111 - 7/10
01111111 - 8/10
11111111 - 9/10

Да и частоты там можно получить нефиговые!
http://easyelectronics.ru/tag/shim

PS. А можно и аппаратно UART-у подыграть...
viewtopic.php?t=9465
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Аналоговый сигнал в COM порт

Post by Lavr »

zooleek wrote:Есть схемка c помощью которой измеряют некоторые извращенцы номиналы кондюков и резисторов:

Image

Диод там чтоб быстрее разряжался конденсатор.

Что если заменить диод на транзистор и на его базу подавать койнить сигнал:

Image
Я как-то по началу относился к этой идее, как к некоторому фейку...

Но недавно попались мне две простых схемы, которые я не поленился себе сохранить!
Я очень люблю простые и порой неожиданные программно-аппаратные решения...

Простейший АЦП на СОМ-порте ПК

Image
Схема простейшего АЦП на СОМ-порте ПК (рис.1) с диапазоном входных напряжений от-6 до+9 В, временем преобразования 500 мс и точностью, эквивалентной 8 разрядам.

Транзистор Т работает как компаратор, сравнивающий напряжение на конденсаторе C с пороговым напряжением на эмиттерном переходе 0,7 В. BASIC-под-программа (листинг 1) анализирует уровень на коллекторе (линия RI) и если он высокий, то на конденсатор через R3 с линии DTR подается высокий уровень и наоборот, но в последнем случае дополнительно увеличивается на единицу значение переменной U. Таким образом, путем программного заряда/разряда конденсатора С на нем поддерживается напряжение, соответствующее порогу отпирания транзистора, а в конце цикла измерения (255 шагов) значение переменной U тем больше, чем больше заряд конденсатора, полученный им от внешнего источника через резистор R4.

Code: Select all

LISTING 1
Private Sub Timerl_Timer() 
  RTS 1 
  DTR 0 
  U = 0
  REALTIME (True) 
  TIMEINIT
  While (RI() - 0) And (TIMEREAD() < 300) 
  Wend 
  TIMEINIT
  For i - 1 To 255
        If RI() = 1 Then DTR 1 Else DTR 0: U = U + 1
        While TIMEREAD() < i
        Wend 
  Next i
  REALTIME (False)
  U = (U - HScroll1.Value) / HScroll2.Value * 10 
  U = Int(U * 10) / 10 DTR 1
  Label1.Caption - Str$(U) + " V" 
End Sub

Code: Select all

LISTING 2
  y2 = 100 - U * 10
     If n = 0 Then y1 - y2: Picturel.Cls
          xl = n 
  n = n + 5 
  x2 = n
  Picturel.Line (xl, yl) - (x2, y2) 
  yl = y2 

Code: Select all

LISTING 3
Private Sub Timerl_Timer() 
  RTS 1 
  DTR 0 
  U = 0
  REALTIME (True) 
  TIMEINIT
  While (DSR() - 1) And (TIMEREAD() < 300) 
  Wend
  TIMEINIT
  For n = 1 To 1000
      If DSR() = 0 Then DTR 1 Else DTR 0: U = U + 1
      While TIMEREAD() < n
      Wend 
  Next n
  REALTIME (False)
  U = (U - HScroll1.Value) / HScroll2.Value * 10 
  U = Int(U * 100) / 100 
  DTR 1
  Labell.Caption = Str$ (U) + " V" 
End Sub
Автор экспериментально установил, что измеряемое напряжение связано со значением переменной U выражением Уизм = (U -110)/11,2 . Пятая снизу строка подпрограммы как раз и выполняет такую поправку (константы HScroll1.Value и HScroll2.Value по умолчанию полагаются равными соответственно 110 и 11,2, но могутбыть при необходимости скорректированы), а четвертая снизу - округляет полученное значение до десятых долей вольта, т.е. реальной разрешающей способности. Если предпоследнюю строчку в листинге 1 заменить на листинг 2, то вместо цифровой индикации напряжения можно получить временную диаграмму.
Image
В усовершенствованном варианте устройства (см.рис.) благодаря применению дифференциального усилителя значительно уменьшена погрешность, обусловленная температурным дрейфом порогового напряжения на эмиттерном переходе, а также расширен до ±10 В диапазон измеряемых напряжений. Разрешающая способность повышена с 0,1 до 0,02 В, поэтому в управляющей подпрограмме (листинг 3) количество шагов в основном цикле увеличено до 1000, а выводится на дисплей уже не 2, а 3 значащих цифры (рис.5). Интересно отметить, что ни в первой, ни во второй схемах емкость конденсатора на результаты измерения не влияет и ее можно безболезненно варьировать в широких пределах - от 20 до 100 мкФ.
(«Elektor Electronics» ¹3/2001, с.22 - 25)
iLavr