Вопрос про LPT порт pleazz

Тема в разделе "WASM.ELECTRONICS", создана пользователем 123, 13 мар 2005.

  1. 123

    123 New Member

    Публикаций:
    0
    Регистрация:
    26 янв 2005
    Сообщения:
    3
    Задача такая : на вход 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
     
  2. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Посмотри мой исходник - у тебя явно не вся работа с портом сделана.

    [​IMG] 513246940__Com.pas
     
  3. 123

    123 New Member

    Публикаций:
    0
    Регистрация:
    26 янв 2005
    Сообщения:
    3
    _Chingachguk_

    А что именно у меня не хватает ?
     
  4. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Хм, я не люблю в этом, чертовом железе, разбираться, чего не хватает... Я сам эту хрень выдернул из двух исполняемых модулей и кое-что поправил.



    Во-первых, если у тебя 98-ая, то там надо сначала дать пару команд (идут вначале) только для того, чтобы виртуализатор портов очнулся и вообще дал что-то делать (в xp или dos все ok);



    Во-вторых, я не уверен, что у тебя выбран верный базовый адрес портов и номер прерывания. Если ты берешь COM1, то нада 3F8h и номер irq тоже надо уточнить. Для этого можешь посмотреть в Зубкове (сам пример из него нерабочий).



    В-третьих, у меня еще куча дополнительных команд кроме разрешения прерывания, а у тебя их нет.



    Я нихрена в этом не понимаю, но я заставил все это работать и теперь просто юзаю этот код. И тебе советую :)



    PS irq & base можно посмотреть в свойствах портов в винде

    PPS Вообще такую хрень лучше отлаживать на какой-нибудь мыши, которая точно генерит прерывания.
     
  5. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    попробуй импульсы землей подавать (нулем) - там открытый коллектор должен быть. неподключенный и 5 вольт - должна быть единица в обоих случаях. и 5 вольт - даже многовато: ттл единица - +2.4 вольта. правда, все советую теоретически - нет щас возможности проверять.
     
  6. CRom_04

    CRom_04 New Member

    Публикаций:
    0
    Регистрация:
    15 мар 2005
    Сообщения:
    1
    Адрес:
    Киев
    вопрос из той же оперы(LPT)

    задача такая, надо заганять в комп данные посредсдвомм LPT

    сумарный трафик порядка 2 мегабайт в секунду,

    просто двунаправленный порт тут не справляется

    и я планировал использовать DMA ECP режима,

    чувствую что придется писать дрйвер, но опыта в этом деле маловато может кто направит на путь истинный?

    Буду весьма рад любой информации