Задача такая : на вход LPT1 порта(режим EPP),а именно на ножку 10(прерывание) подаются импульсы амплитудой +5В.По идее на переднем положительном фронте импульса должно вызываться прерывание IRQ7(INT 0Fh).Так вот задача состоит в том, чтобы перехватить это прерывание и обработать эго по своему.Я написал прогу на asm под ДОС , но она почему-то не работает.Подскажите pleaz в чем причина???? ;Драйвер для LPT1 порта .model small .stack 100h .data msg db "Driverя LPT port",'$' old_int dd ? .code start proc near mov ax,@data mov ds,ax mov ah,09h mov dx,offset msg int 21h ;сохранить адрес предыдущего обработчика прерывания mov ax,350Fh ;AH=35 AL=номер прерывания int 21h ;Функция DOS : определить адрес ;обработчика прерывания(возвращает в ES:BX) mov word ptr old_int,bx ;запомнить смещение mov word ptr old_int+2,es ;запомнить сегмент ;установить наш обработчик push ds ;сохранить ds push cs ;Настроить DS на сегмент кода DS:=CS pop ds mov dx,offset int0Fh mov ax,250Fh int 21h mov dx,27Ah ;Вкл двунаправленный обмен данными mov al,32 out dx,al in al,21h ;Разрешить прерывание and al,7Fh ;от LPT порта out 21h,al pop ds ;восстановить ds ;ОСНОВНАЯ ПРОГА mov ah,1 ;Ожидание нажатия int 21h ;на любую клавишу ;конец основной проги in al,21h ;Запретить прерывание or al,80h ;от LPT порта out 21h,al push ds ;восстановить предыдущий pop es ;обработчик прерывания mov ds,word ptr es:old_int+2 mov dx,word ptr es:old_int mov ax,250Fh int 21h mov ax,4C00h int 21h start endp int0Fh proc far ;Обработчик IRQ7 push ax ;Сохранение push bx ;регистров push es push ds mov ax,0b800h ;Вывести на экран mov es,ax ;символ 'H' для mov bx,0 ;контроля,т.е если mov al,'H' ;вывелось 'Н' значит mov es:[bx],al ;перехват удался inc bx mov al,1 mov es:[bx],al mov al,20h ;Послать команду контроллеру прерываний out 20h,al ;о завершении обработки прерывания pop ds pop es pop bx pop ax sti iret int0Fh endp end start
Хм, я не люблю в этом, чертовом железе, разбираться, чего не хватает... Я сам эту хрень выдернул из двух исполняемых модулей и кое-что поправил. Во-первых, если у тебя 98-ая, то там надо сначала дать пару команд (идут вначале) только для того, чтобы виртуализатор портов очнулся и вообще дал что-то делать (в xp или dos все ok); Во-вторых, я не уверен, что у тебя выбран верный базовый адрес портов и номер прерывания. Если ты берешь COM1, то нада 3F8h и номер irq тоже надо уточнить. Для этого можешь посмотреть в Зубкове (сам пример из него нерабочий). В-третьих, у меня еще куча дополнительных команд кроме разрешения прерывания, а у тебя их нет. Я нихрена в этом не понимаю, но я заставил все это работать и теперь просто юзаю этот код. И тебе советую PS irq & base можно посмотреть в свойствах портов в винде PPS Вообще такую хрень лучше отлаживать на какой-нибудь мыши, которая точно генерит прерывания.
попробуй импульсы землей подавать (нулем) - там открытый коллектор должен быть. неподключенный и 5 вольт - должна быть единица в обоих случаях. и 5 вольт - даже многовато: ттл единица - +2.4 вольта. правда, все советую теоретически - нет щас возможности проверять.
вопрос из той же оперы(LPT) задача такая, надо заганять в комп данные посредсдвомм LPT сумарный трафик порядка 2 мегабайт в секунду, просто двунаправленный порт тут не справляется и я планировал использовать DMA ECP режима, чувствую что придется писать дрйвер, но опыта в этом деле маловато может кто направит на путь истинный? Буду весьма рад любой информации