Программа - тахистоскоп под Kolibri

Applications development, KoOS API questions
  • DOS и ATI Radeon R100-R500.
    Ваши коллеги знают о VESA и unreal mode?
  • Serge wrote:DOS и ATI Radeon R100-R500
    или DOS + NVidia
    Совершенно верно Serge.
    zhegs wrote: а лучше 800х600 и 32-битный цвет. Под DOS уже не получится.
    получится!
    Сначала оптимальным будет определиться именно с видеокартой!
    Я бы посоветовал найти возможность протестировать ее (магазин, базар) ну или точтоно точно нагуглить инфу на предмет поддержки:
    1. Vesa 3
    2. 100гц частоты кадров Ваши или 200? (Вам виднее) Ну тут реально бы потестить через соотв. функцию Vesa3 ставится ли она
    3. Возможных видеорежимов именно при этой частоте, это важно!
    Насколько я сталкивался NVidia давно Vesa3 поддерживается и под досом именно "баловался ею" как то...
    НУ а затем, как Serge сказал берется дос - через Vesa 3 ставите частоту кадров+видеорежим, затем наверное, нереальный режим процессора, затем линейный буфер видеокарты. Где то так.
  • Или Linux (я бы остановился на этом варианте).
    Возможно Minix3 или Genode также подойдут (хотя я не знаю как у них с видео и какие могут возникнуть сложности с планировщиком задач).

    ..bw
  • Про VESA3 я знаю. С видекоартой и хорошим ЭЛТ монитором проблем нет.
    А вот про "нереальный режим процессора" не знал ((. Спасибо огромное! Буду разбираться. Подскажите еще: нереальный режим обязательно предполагает программирование на ассемблере или есть компиляторы C / C++, которые позволяют создавать соответствующий код?
  • zhegs

    В Open Watcom есть 16-ти битный копилятор для ДОС. Главное выставить опции компиляции чтобы не перегружал регистры gs и fs. Другой вариант - DOS4GW с ним же. Уже 32 бита в защищённом режиме.
  • Похоже, что все складывается. Программа, которую я писал, использует библиотеку Allegro 4.2 .
    Allegro 4.2 работает под DOS и должна нормально компилироваться Watcom ...
    Если повезет, то все сведется к перекомпиляции... Спасибо!
  • Или FreePascal, актуальная версия есть и для DOS (Go32v2), защищённый режим, 32 бита.
    Вариантов так много, что это почти проблема :-).

    ..bw
  • zhegs wrote:- необходимо регистрировать время реакции (от момента предъявления изображения до нажатия на кнопку на клавиатуре) с точностью не хуже 1 мс
    Хорошая темка т.к. постанока задачи тренирует мозги, как хорошая головоломка! :D
    Данное требование, что то не давало мне покоя, потом покумекал, повспоминал, полазил, кое что вспомнил и "освежил в памяти матчасть", а именно:
    http://ru.osdev.wikia.com/wiki/%D0%9A%D ... D0%B0_PS/2
    как видно пытливому и догадостному :mrgreen: 1мс клавиатурой не обеспечить ввиду схемно-архитектурных особенностей. Но решение есть. Хотя оно базрируется, на платформе. Вернее сказать на несколько устаревших компьютерах... т.е. таких, где прежде всего есть LPT порт или на крайняк COM порт "натурале"! Это условие раз.
    А два, это то, что кнопка делается в виде отдельного физического контакта. Один провод корпус, другой сигнальный. Далее варианты реализвции распадаются в зависимости от наличия того и или другого порта. Но в обоих случаях фича реализации в том, что используем прямое чтение с порта, а можно и прерывания задействовать, это вообще очень высокая точность будет, т.к. аппаратная событийность - круче не куда.
    В случае с COM портом юзаются пины модем-статуса (порт статуса модема), как дискретные входы. Изменение статусных линий модема (COM пин-входы) и есть нажатие. Заколбасить прерывание на это дело - как два... байта обнулить.
    В случае LPT порта все и так, и не так, т.к. по сути ГРАЗДО КРУЧЕ получается! :mrgreen: Особенно если учесть, что "психологические издевательства над подопытными кроликами" проводятся, как сейчас модно говорить, типа командно-корпоративным методом :lol: :lol: :lol: ну и с помощью энтой вот реализации :lol: :lol: :lol:
    Имеется ввиду, что "картинки" со коростью смена эээээ... 10мс говоришь мелькают, ага?
    А каждый из допустим, 7ми подопытных, на свою индивидуальную кнопку будет давить тоже индивидуально, что и фиксируется считыванием LPT порта! Во!
    Ну в плане перевода LPT порта в режим PS/2 input посмотреть можно скажем здесь http://phys.csu.ru/maelab/_frames/_lpt_3.htm
    А вообще там и больше 7ми именно входов организовать можно ну и IRQ7 аппаратно можно задействовать очень даже просто. Причем оно должно срабатывать по нажатию любой кнопки! Тут немного паять нужно правда, но кнопки на разъём же все равно распаять придется, :P поэтому к каждой кнопке припаивается диод анодным проводником, а катоды всех спаиваются вместе на пин "Strobe" кажись. Это логический "И" элемент получится. Он входной и именно он IRQшный, насколько помню по спадающему фронту, что соотв. закороту входа на общий(корпус). Это можно чудно сделать прямо к коробочке подключаемого разъёма с помощью малогабаритных, дешевых, отечественных КД522, КД102 и т.п. :wink:
    Успехов в глубинных исследованиях реактивной психомоторики шизоидов и водителей с бодуна! :mrgreen: Во загнул, как бы самому на тестер не попасть бу-га-га-га-гаааа :lol:
  • VaStaNi, схемку кинь - я думаю так понятнее человеку будет - с нумерацией пинов и пр.
  • zhegs
    Для твоей задачи метод VaStaNi под ДОСом пойдет идеально.

    Для более коротких интервалов времени или для защелкивания асинхронных сигналов ("кто вперед?") COM и LPT не годятся - они сидят на очень медленной микросхеме SuperIO.
    Лучше вместо них использовать свободные GPIO-линии Южного Моста, там скорость ограничена только задержками в системной шине.
  • Судя по всему zhegs уже пишет, пишет, пишет... и дорогу сюда забыл, наверное. Поэтому по возникновению у него вопросов или желания смогу детализировать.
    А по поводу поста выше, то были неточности. То есть деталировка и реализация требует, конечно все выверить. Пока скажу, что Strobe указан неверно. т.к. это выход а не вход и к прерыванию не имеет отношения. В данном случае согласно http://phys.csu.ru/maelab/_frames/_lpt_1.htm нужно юзать вход "Ack#" пин номер 10. Именно сюда спаиваются все катодные выводы, он "подтянут" о чем и пишут и это здорово. Именно он может генерить IRQ, но немного инить регистры (биты) надо. Если кому лень шурупить извилинами или непонятно что копать ,но все же интересно привожу характерные цитаты из статьи, то дает возможность и подтверждает мои слова и реализацию.
    Таб. 1.
    Ack# --- Acknowledge - импульс подтверждения приема байта (запрос на прием следующего). Может использоваться для формирования запроса прерывания
    Порт может использовать линию запроса аппаратного прерывания, обычно IRQ7 или IRQ5.
    Status Register (SR) - регистр состояния; представляет собой 5-битный порт ввода сигналов состояния принтера
    ...................
    SR.2 - PIRQ - флаг прерывания по сигналу Ackft (только для порта PS/2). Бит обнуляется, если сигнал Ack# вызвал аппаратное прерывание. Единичное значение устанавливается по аппаратному сбросу и после чтения регистра состояния.
    Назначение бит регистра управления:
    .................
    CR.5 - Direction - бит управления направлением передачи (только для портов PS/2). Запись единицы переводит порт данных в режим ввода. При чтении состояние бита не определено.
    CR.4 - AcklntEn (Ack Interrupt Enable) - единичное значение разрешает прерывание по спаду сигнала на линии Ack# - сигнал запроса следующего байта.
    .................
    Двунаправленный порт 1 (Type 1 parallel port} -интерфейс, введенный в PS/2. Такой порт кроме стандартного режима может работать в режиме ввода или двунаправленном режиме. Протокол обмена формируется программно, а для указания направления передачи в регистр управления порта введен специальный бит CR.5:0 - буфер данных работает на вывод, 1 - на ввод.
    В компьютерах с LPT-портом на системной плате режим - SPP, ЕРР, ЕСР или их комбинация - задается в BIOS Setup.
    Порт на системной плате конфигурируется через BIOS Setup.
    Конфигурированию подлежат следующие параметры:
    - Базовый адрес - 3BCh,
    378h или 278h
    . При инициализации BIOS проверяет наличие портов по адресам именно в этом порядке и, соответственно, присваивает обнаруженным портам логические имена LPT1, LPT2, LPT3. Адрес 3BCh имеет адаптер порта, расположенный на плате MDA или HGC. Большинство портов по умолчанию конфигурируются на адрес 378h и могут переключаться на 278h.
    - Используемая линия запроса прерывания: для LPT - IRQ7, для LPT2 - IRQ5
    ЕСР - по умолчанию включается в режим SPP или PS/2, записью в ECR может переводиться в любой режим ЕСР
    Таб.9. Режимы ECP-порта
    ......
    В режиме 001 (Bi-Di PS/2) порт работает как двунаправленный порт PS/2 типа 1. От режима 000 отличается возможностью реверса канала данных по биту CR.5.
    Когда порт находится в стандартном или двунаправленном режимах (000 или 001), первые три регистра полностью совпадают с регистрами стандартного порта.
    Переключение режимов осуществляется записью в регистр ECR
    после установки режима (записи кода в регистр ECR) обмен данными с устройством сводится к чтению или записи в соответствующие регистры.
    Итак, сначала в BIOS Setup находится и разрешается LPT порт и только в режимt ECP, а также выставляется(смотрите) его IRQ7 или IRQ5. Без этого ничего не выйдет. Это Первое аппаратное условие.
    Второе. В проге записью в регистр ECR устанавливается режим 001 (PS/2). Третье, битом CR.5 выставляем направление как вход (ввод данных по 8мибитной шине данных, регистра данных). Четвертое разрешить прерывание см. CR.4 (тут одной записью скорее всего можно и CR.5 и CR.4 нужные прописать)....
    Ну это основное в принципе, конечно нюансы могут быть, но все реально реализуемо.
    И еще. Входов ИТОГО я насчитал 12 штук. Т.е. можно сделать целый класс из 12 тестируемых... с проекцией картинки на стену, например, большой экран или существуют аналоговые VGA разветвители, то есть на несколько моников одно и тоже выводить и т.п. 12 штук это базовые 8 читаемые с регистра данных + 4 входных (они там только входы) регистра SR. Т.е. если SR.6 - Ack (Acknowledge) будет юзаться для прерывания в случае реализации высокой временной точности, то остаются недоиспользованными биты и пины (реальные входы на разъеме):
    SR. 7 - Busy - инверсные отображения состояния линии Busy (11 пин)
    SR.5 - РЕ (Paper End) - отображения состояния линии Paper End (12 пин)
    SR.4 - Select - отображения состояния линии Select (13 пин)
    SR.3 - Error - отображения состояния линии Error (15 пин)
    дело в том, что регистр SR по любому НУЖНО читать в программе, т.к.
    SR.2 - PIRQ - флаг прерывания по сигналу Ackft (только для порта PS/2). Бит обнуляется, если сигнал Ack# вызвал аппаратное прерывание. Единичное значение устанавливается по аппаратному сбросу и после чтения регистра состояния.
    посему реальные состояния этих 4 входов (КНОПОК) УЖЕ будут вычитаны и находиться на своих бит-позициях... как бы глупо не использовать уже полученное получается.
    А точности тут хватит по любому, т.к. инерционность человека и физика кнопки, как механизм контакта непозволят заниматься микросекундами + не забываем про такое пакостное явление, как дребезг механического контакта... Хотя и дребезг можно исключить используя немеханические кнопки (контакты)... Всем успехов!
  • Who is online

    Users browsing this forum: No registered users and 1 guest