23 сентября 04 года


          ...а началось это с фразы "у хорошего компьютерщика в хламе всегда найдется достаточно деталей чтобы собрать ещё один компьютер". И с найденной на помойке (бывает же) матринской платы с Am386sx40 с "метром мозгов". Прикрутивши к этому старую ISAшную видюху, попытавшись (почти успешно) завести это от только от +5В (чтобы избежать ситуации "ещё один белый ящик под столом", казалось бы неизбежной если засунуть это в классический AT case), задумавшись "а для чего это вообще можно было бы применить...
          В-общем, ниже - описание некой самоделки. Не подробное - для повторения "по шагам" не пригодное (во-первых, мне лениво, во-вторых - для этого надо изначально "документировать" шаги, а в третьих - такие штуковины лепят "из того что есть", а у вас может оказаться что-то чуть другое чем у меня). Но возможно кому-то достаточное "для затравки" - чтобы самому на досуге сделать такое же, но своё :-)
          Ах, да! Самоделка эта называется "проекционные лазерные часы". Проекционные - хотелось чтобы ночью можно было одним взглядом поскотреть время (при этом "часы с подсветкой" или с обычными "семисегментными" индикаторами не хотелось), лазерные - потому, что проецировать на стену те же семисегментные цифирьки - так проще в магазине готовые купить.
          ...идея запитать все от мощного +5В источника провалилась - даже видеокарта запросила +12В (без них тоже работала, только картинку не показывала), а когда выяснилось, что на winbond'овской мультяхе не заводится IDE-контроллер без -5В (зачем ему -5В - до сих пор не пойму), оптимальное по объему решение было найдено быстро: б/у АТшный блок питания был разобран (при этом от него осталась довольно небольшая плата), и вставлен в одну коробку с материнкой (в коробку из-под minolta dimage 5 - подошла по размеру идеально). Стандартная "мультикарта" тех времен (LPT+2COM+IDE+FDC), на IDE - старая CompactFlash на 16Мб через переходник (самодельный, из 50 булавок и одного IDE разъема:-)), на CF - залит MS-DOS, turbo C 2.0... в-общем, внешний (точнее, внутренний) вид - см. рис. :-)
коробка

          "Лазерные проекционные часы" - это (1) лазер, (2) "развёртка" (отклоняющая система) и (3) возможность модуляции (всключения/выключения) лазера. Лазер (после четырёх убитых китайских указок) был куплен "фирмовый" - "лазерный модуль" за ~200р в чипе&дипе (в скобках замечу - опыт показал, что хотя китайские указки и мрут пачками, но из четырех указок одна работает не хуже фирменного модуля).
лазер

          Для сигналов отклонения и модуляции - был использован LPT-порт: 8 бит данных, плюс бит стробирования плюс три бита состояния (итого 12 бит) были раскиданы на 1 бит модуляции, 6 бит горизонтального отклонения, и 5 бит вертикального отклонения.
LPT

          Сигналом с ноги "бита модуляции" управлялся простейший транзисторный ключ, подающий +5В на лазер (на модуль - напрямую, на указку - через токозадающий резистор). На 5 и 6 ног отклонения - был напаян простейший "резисторный" ЦАП.
DAC

          О собственно "отклоняющей системе" чуть позже, усилитель же сигнала с ЦАП был собран на TDA7052 (интегральный усилитель низкой частоты) в типовом (по даташиту) BTL (мостовом) включении. Поскольку отклоняющая система неидеальна, и оси отклонения оказались неперпендикулярны - горизонтальность горизонтали "выводилась" механическим наклоном всей системы, вертикальность же вертикали - "подмешиванием" (подстроечный резистор) части сигнала вертикального отклонения в усилитель горизонтального отклонения. Полярность - подобрать опытным путём :-)
          С Отклоняющей Системой всё оказалось веселей и забавней. Отказавшись от "двух перпендикулярных кольцевых катушек, неведомым образом подвешенных в магнитном поле" я опробовал идею "зеркальца с мягким подвесом, толкаемого двумя толкателями". В качестве толкателей - выбрал внутренности от "наушников" (а что - они как раз воздух толкают, пусть потолкают зеркальце), зеркальце подвесил на "трёх резинках" (одна короткая как "центральная точка", две длинные "чтоб не болталось"), "толкателем" были проволочки, приклеенные мягким клеем (клей 88) к мембране наушника и к "точкам толкания" (см. рис - 1 и 2 картинки).
          Ну... первый блин - сами знаете как: подвеска показала свою полную нежизнеспособность, отклоняя в направлениях, далёко не перпендикулярных друг другу, наушники быстренько перегорели от натуги (точнее, один перегорел, у второго оторвалась катушка от мембраны)...
подвеска

         
подвеска

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

          Фотографию чуда природы под названием "отклоняющая система" - см. на другом рис. :-) Конструкция получилась развесистая, но неожиданно работоспособная.
ОС

          Уфф!!! Дальше - софт! Как выводить байтики в порт под ДОС, думаю, объяснять не надо, и что отрисовка цифр будет происходить "как карандашом" - включить лазер, обвести контур цифры, выключить лазер - тоже понятно. Единственное - лично у меня :-) собственно "отрисовщик" вешался на аппаратный таймер (один тик - один шаг отрисовки, скорость можно подобрать программируя таймер), формирование же буфера, отрисовываемого по таймеру, делала отдельная, самостоятельная, общающаяся с "таймерной" часть через массивы и флажки часть программы. Время бралось из "аппаратных" часов (которые живут в CMOS и доступны через те же порты что и "настройки BIOS" (BIOS SETUP)), тут же формировалось "мигающее двоеточие" (как у настоящих часов, ага) и показ даты.
          ...далее - всё очевидно. "Излучатель" вместе с ОС - в коробку, оклеенную шпоном, "компьютер" - в другую коробку, соединить кабелем, не забыть стеклянное "окно" для выхода света... и - см. рис дальше :-)
часы в сборе

         
время

          Вот так! Естественно, скорость развертки получилась невысокая (герц так десять) и цифры ощутимо мерцают, но это не мешает спокойно и без напряга их воспринимать. Если кто решится повторить эксперимент и "застрянет" на каком-то этапе - готов посильно помочь советом, но предупреждаю, что без хотя бы минимального опыта программирования под дос застрять можно надолго :-) С опытом, пусть старым и нафиг затёртым - всё проще.
          Подошел ко мне на работе студент... oops, сорри - аспирант второго года обучения - и спрашивает: "вот ты у нас оптик - скажи, если стеклянная пластинка поглощает зеленую часть спектра - она на просвет какого цвета будет?" Хотел я сказать "мажента, или как там его по русски", да призадумался...
спектры

          Как известно, цветное зрение человеческого глаза является цветным потому, что в глазу есть три вида рецепторов, чувствительных к трём разным частям спектра (про "палочки" пока забудем, поскольку к цветовому зрению они не относятся, а при нормальных яркостях ("читать спокойно можно") - практически не используются, используются реально только при "сумеречном" зрении).
          Любое "цветовое ощущение" определяется тремя числами, каждое из которых есть "свёртка" (интеграл произведения) спектра попадающего в глаз света с тремя кривыми чувствительности. Отсюда следует, что любой цвет (кроме спектрально-чистых цветов, для которых это не совсем верно) можно создать бесконечным количеством вариаций спектра - как "холмистым непрерывным спектром" (большинство естественных окрашенных объектов), так и, к примеру, комбинацией трёх узкополосных источников света разной интенсивности (собственно, на этом основаны все RGB-источники изображения - мониторы, телевизоры). Поскольку мозг не знает непосредственно спектра (не имеет к нему доступа) - никакого отличия, скажем, желто-зеленого цвета, созданного "холмом" в области между желтой и красной кривыми, и двумя монохроматическими источниками подобранной интенсивности - зеленым и красным - нет. (В скобках замечу, что поскольку при использовании классической RGB-модели синтеза цвета каждый из источников частично раздражает "соседний" рецептор - некоторые цвета невозможно воспроизвести в чистом RGB. Но речь не об этом - и даже не о RGB вообще).
          Белый цвет (или "свет?") - тоже можно создать разными способами. "Естественные" источники света - как правило имеют какой-то непрерывный и относительно равномерный спектр, нами действительно воспринимаемый как "белый". Можно (разумеется) создать "смесевой белый", смешав три монохроматических ("лазерных") источника света (собственно, красный, зеленый и синий). Можно... ну да ладно.
          Это был "ликбез", чтобы напомнить читателям о том, как устроен глаз :-) А теперь - пара вопросов, над которыми я бы советовал подумать самостоятельно, прежде чем читать дальше :-)
          Вопрос 1. Известно, что можно создать белый свет смесью трех монохроматических источников. Можно ли создать белый свет смесью двух монохроматических источников? Ключевое слово - монохроматических: разумеется, нет проблем создать белый свет смешав пару широкополосных источников - но можно ли создать белый свет, смешав два монохроматических источника? И сразу вопрос 1.1 - как будет выглядеть окружающий мир в таком свете, будут ли какие-то странности с цветопередачей, и если да - то какие?
          Вопрос 2 - повторю вопрос студента. :-) Но чуть переформулировав: можно ли создать "стекляшку" (предположим, что спектральную кривую пропускания стекляшки мы можем синтезировать произвольной - это не совсем так, но нам это не помешает) такую, что в естественном белом свете она будет, к примеру, зелёной - а в специально подобранном искуственном белом свете (а вот источник с произвольным спектром мы создать реально можем, вопрос только в сложности схемы) - скажем, цвета дополнительного к зеленому, то есть "мажентой"? Естественно, в этом случае все источники света и спектр стекляшки - в наших руках, вопрос только - можно ли? Да, хотелось бы чтобы "искуственный белый" в этой задаче "на глаз" не сильно отличался бы от естественного: не сильно нарушал бы цветопередачу естественных объектов, им освещённых.
          ...а пока вы думаете - лирическое отступление :-)
          "Яичный суп". Нет! Это не "разболтать яйца в воде и сварить", это совсем другое. Густое и вкусное, "супом" мной названное только потому, что есть "это" лучше ложкой :-)
          Берез сковородку. Шлёпаем на ней шмат сливочного масла (сойдет, впрочем, и растительное). Прогреваем. Разбиваем (не повредив желток) три яйца. Можно четыре, но уж никак не два. :-) Солим "по вкусу". Жарим этакую "недожаренную глазунью": белок примерно наполовину (или на 2/3) поджарен (остаток белка ещё жидкий, можно "помогать" белку жариться "шевеля" и "подцепляя" его вилкой), желток же - почти весь жидкий. Затем быстрым движением вилки :-) смахиваем результат в глубокую тарелку, кромсаем вилкой до состояния "шматки белка плавающие в желточно-белочной смеси", и с удовольствием хаваем вилкой, как суп :-)
          Есть другие, более сложные варианты этого же блюда (например, яйца не жарятся а варятся всмятку, а в разболтанную смесь сваренных яиц и масла всыпается нарезанный хлеб), но приведенный вариант удачно сочетает в себе:
          - уникальный вкус жидкого желтка,
          - легкую обжаренность яичницы,
          - быстроту приготовления - пожалуй, быстрее можно приготовить разве что бутерброд с колбасой :-)

          Приятного аппетита, и - назад, к спектрам!
          ...Начнем с самого простого вопроса - про "белый свет из двух монохроматических источников". Глядя на график спектральной чувствительности глаза видно, что красная и зеленая области чувствительности глаза - сильно перекрываются. А значит, красные и зеленые рецепторы можно возбудить одновременно, посветив на них монохроматическим желтым (находится как раз между красным и зеленым) цветом. Добавив синий, и подобрав соотношения интенсивности (чтобы не "синило" и не "желтило") а также длину волны (чтобы возбудить красные и зеленые рецепторы "поровну) - мы получим свет, однозначно воспринимаемый глазом как "белый". Кстати, такой источник можно создать "на коленке": натриевая лампа дает почти чистую спектральную линию в желтой области (видели желтые лампы на освещении улиц? Оно самое), а синий - можно взять из синего светодиода например, особой спектральной чистоты тут не требуется.
белый

          ...разумеется, можно сыграть и на "перехлёсте" синего и зеленого, хотя это и чуть сложней - ввиду более слабого пересечения синей и зеленой областей чувствительности глаза. Далее рассматривать буду "желто-синий" белый свет.
          Попробуем теперь понять, как же будет выглядеть мир, освещенный таким" белым" светом. Для начала - сообразим, что цвет/свет для нас "трёхмерен", то есть - представляет собой сочетание трёх независимых чисел - "интенсивность красного, синего и зеленого" (определяемых, напомню, как "свёртка" спектра с кривыми чувствительности). В случае же "двухкомпонентного белого" - во входном сигнале (в том числе и отраженном от окружающих предметов) содержатся только две независимых компоненты. При этом, хотя мозг видит белый источник освещения (и "подразумевает" трёхмерность окружающего его "цветового мира") - реально цвет вокруг "двумерен", то есть, будет ощущение: "вроде бы всё на месте, белая бумага - белая, синяя обложка книжки - синяя, но что-то не так". А что именно не так, можно ли сообразить, как будет выглядеть мир в таком "якобы белом свете"? Замечу, что ответ "да как под красным фонарём для фотопечати - всё красное" не катит: глаз-то видит белый, и (в отличие от красного фонаря, где глаз видит что освещение-то красное, и не пытается увидеть никаких цветов) - пытается интерпетировать входящую двумерную цветовую информацию - как полную, трёхмерную.
          ...ответ, впрочем, прост. Интенсивность красного "канала" оказывается равной интенсивности зеленого - а значит, и красный и зереный цвета будут выглядеть одинаково: оттенками желтого (или коричневого).
          ...ошизеть же можно: в таком белом свете нельзя будет различить красный и зеленый - а ведь субьективно это совсем-совсем разные цвета! Сидит на зеленой весенней травке румяный карапуз в белой маечке - и маечка-то у него белая (и "автоматическому балансу белого" в мозгу отработать не удается - точнее, он отрабатывает его как может по белой маечке), и погремушка в руке - голубая, но морда этого карапуза не отличается по цвету от травы! Разве что - посветлей маленько. Бррр :-))) Ужасные люди эти оптики, правда? Не хотелось бы жить при таком "белом свете".

          ...ну, а со стекляшкой, цвет меняющей - совсем просто. Берем "светло-зеленую" стекляшку (частично пропускающую красный и синий). Добавляем узкополосное сильное поглощение в зеленой области (это вполне реально, такие добавки есть). В естественном белом свете - стекляшка зеленая, ибо пропускает много зеленого и мало красного и синего. Искуственный же белый свет возмём трёхкомпонентный - красный, синий, и точно попадающий в линию поглощения зелёный. На просвет - зеленый поглотится, красный и синий частично пройдут... и стекляшка будет "темной мажентой" - или фиолетовой, кому как больше нравится называть этот цвет.
стекляшка

          Кстати, если взять "желто-синий" белый свет, а линию поглощения взять в точности на желтой линии "белого" света - стекляшка станет темно-синей. А если... ну да ладно, тут развлекаться можно очень долго :-) Ясно только одно: странная это наука, оптика - если в ней не всегда и скажешь, какого цвета стекляшка у тебя в руке :-)
         

From: alexey lopatkin
Добрый день, Дмитрий.

Пишу по поводу последнего выпуска...

"Вот только... с 8086 оно как бы несовместимо, и потому - на писюках не будет. "

Думаю, что будет. Более того уже работает, причем практически во всех современных процессорах. Взять хотя бы те же интеловские процессоры, так внутри они уже давно не CISC, а что-то RISC подобное только сложнее. И выполняться одновременно могут несколько инструкций как это ни странно. Т.е. х86 инструкции внутри процессора транслируются во внутренние инструкции, которые уже распараллеливаются. Уже довольно давно основной задачей создателей компиляторов для таких процессоров является реализация такой оптимизации, при которой как можно реже бы происходили ошибки в блоке предсказания ветвлений (из-за таких ошибок происходят основные потери производительности). Такой блок есть в процессорах Intel, AMD, Power, SPARK, Alpha (земля ей пухом) ...

Вот только слишком много место на кристалле занимает блок декодирования инструкций. Этот блок в том числе занимается оптимизацией кода во время исполненния. Но от его физического размера сильно зависит цена и тепловыделение.

Есть такая конторка, Transmeta называется (site: transmeta.com). Они делают честный VLIW (very long instruction word) процессор. У их первого процессора (crusoe) длинна слова инструкций составляла 128 бит, у нынешнего (efficeon) - 256. В каждое такое слово запаковывается несколько инструкций + информация о возможном распараллеливании инструкций друг с другом и с предыдущими/следующими словами. Вся работа по оптимизации отдана на откуп компилятору. За счет чего ОЧЕНЬ сильно уменьшено кол-во транзисторов. Вместе с этим цена и тепловыделение существенно снижены. Но выходить на рынок с новым набором инструкций могут себе позволить только гиганты типа IBM и Intel (а может быть уже даже они не могут), поэтому ребята сделали по простому: решили эмулировать интеловскую архитектуру. При старте системы загружается специальное ПО (называется Code Morphing), которое занимается транслированием x86 инструкций в native инструкции. Конечно, по производительности такой процессор не может тягаться чем-то типа Pentium-III, но отставание на той же частоте где-то раза в два - это довольно хороший показатель для итнерпретации (особенно если сравнить цены и тепловыделение). На этих процессорах делают всяческие планшеты, субноутбуки и даже обычные ноутбуки нижнего ценового диапазона. Прекрасно запускаются и винда и линукс.

Ну а если подумать, то не так уж этот процессор от интела отличается. У пентиумов внутри примерно то же самое + реализация в железе всего того, что у трансметы Code Morphing делает. В деталях, конечно отличается, но идея та же. Думаю мы еще увидим похожие реализации от лидеров идустрии, хотя это скорее всего случиться не в ближайшее будующее. Для этого гонка за производительностью должна сбросить темпы.

Всего хорошего,
Алексей Лопаткин.



          А на самом деле - ведь таки да, действительно. Зачем заставлять железку (процессор) в реальном времени делать то, что может сделать компилятор "в нереальном времени", заранее. И если в случае честного VLIW - компилятор честно оптимизирует (в частности, распараллеливает) результат компиляции Сишного (к примеру) кода - то что принципиально мешает компилятору оптимизировать "компиляцию" из "псевдокода" в реальный машинный код? Да ничего не мешает. А что псевдокод немного странный - набор инструкций i80x86, как и любого CISC, не слишком хорошо подходит на роль "псевдокода" - так это вопрос сложности компилятора и эффективности оптимизации...
          ...а может, и правда судьба такая у интеловского ассемблера - сохраниться в виде промежуточного "псевдокода" для подобных задач? Впрочем, лучше уж честный "псевдокод общего назначения" - быстрее будет, и менее криво :-)
          И - подвернувшийся под руку "крик души" и ответ на него. Про текущую ситуацию и перспективы в мире линукс... 1 [issue230904/linux1.html] 2 [issue230904/linux2.html]



Оригинал страницы находится на http://dibr.nnov.ru/issue230904.html.(с) DiBR
При перепечатке ссылка обязательна. <<  *  >>
endmai endma endm end en e