Помогите с модемом

Тема в разделе "WASM.ELECTRONICS", создана пользователем Kirillxskynet, 25 окт 2006.

  1. Kirillxskynet

    Kirillxskynet New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2006
    Сообщения:
    30
    Проблема в следующем:
    запрограммировал COM1 порт (скорость, стоп-биты, четность, прерывания...), затем начинаю передавать через регистр данных (3f8h) команды модему, а он молчит.
    смотрел исходники Menuet, но разобраться не смог, там все через int 40h делается.
    прочитал Фролова - "Программирование модемов", вроде все так делаю
    Может чего-то не понимаю?
    Вот текст программы:
    code segment
    org 100h

    base equ 3f8h
    assume cs:code, ds:code
    start: jmp short entry

    at db 'at dp 490497'

    label entry near

    ;инициализация порта COM1

    ;записать нулевое заначение в регист управления модемом
    ;чтобы обнулить сигналы DTR и RTS

    mov dx,base+4
    xor al,al
    out dx,al

    ;обнуляем регистры: состояния линии, данных и регистр состояния модема

    mov dx,base ;регистр данных
    xor al,al
    out dx,al
    mov dx,base+5 ;состояния линии
    out dx,al
    mov dx,base+6 ;регистр состояния модема
    out dx,al

    ;устанавливаем скорость порта

    mov dx,base+3
    mov al,80h
    out dx,al
    mov dx,base
    mov al,60h ;скорость 1200 bod
    out dx,al
    mov dx,base+1
    xor al,al
    out dx,al

    ;устанавливаем кол-во стоп бит, четность и прерывания

    mov dx,base+3
    mov al,03h
    out dx,al
    mov dx,base+1
    xor al,al
    out dx,al

    ;устанавливаем сигналы DTR и RTS

    mov dx,base+4
    in al,dx
    or al,03h
    out dx,al

    ;ожидаем когда освободится регистр передатчика

    _wait: mov dx,base+5
    in al,dx
    test al,40h
    jz _wait

    ;передаем модему команду AT

    xor si,si
    mov dx,base
    mov al,at[si]
    out dx,al

    inc si
    mov dx,base
    mov al,at[si]
    out dx,al
    mov al,13h
    out dx,al

    ;передаем команду ATD

    xor si,si
    mov dx,base
    mov al,at[si]
    out dx,al

    _at: inc si
    mov dx,base
    mov al,at[si]
    out dx,al
    cmp si,11
    jnz _at

    mov al,13h
    out dx,al

    _exit: mov ax,4c00h
    int 21h

    code ends
    end start
     
  2. DJK

    DJK Member

    Публикаций:
    0
    Регистрация:
    8 авг 2006
    Сообщения:
    39
    Сначала мадом надо сбросить командой ATZ, а то мало-ли чем он был до этого занят и для выхода если модем завис.
    Затем посылаем нужные команды.
    Команды начинаются с префикса AT и далее код команды и ее параметры и между ними никаких пробелов!!.
    Я делаю так, смотри ниже и у меня все работает.
    Инициализируем модем следующим образом
    Код (Text):
    1. mov dx,3FBh ; Регистр управления линией
    2. mov al,80h  ; Устанавливаем бит 7 в 1
    3. out dx,al
    4.  
    5. mov dx,3F9h
    6. mov al,0h   ; Старший байт делителя
    7. out dx,al
    8.  
    9. mov dx,3F8h
    10. mov al,3h   ; Младший байт делителя
    11. out dx,al
    12.  
    13. mov dx,3FBh ; Порт управления линией
    14. mov al,3h   ;  00000011b  8 бит 1 стоповый
    15. out dx,al
    16.  
    17. mov dx,3FCh ; Порт управления линией
    18. mov al,0Bh  ; 00001011b DTR, RTS, OUT1 OUT2
    19. out dx,al
    20.  
    21. mov dx,3F9h
    22. mov al,1h   ; 00000001b вкличаем управление работой FIFO
    23. out dx,al
    Программирование прерывания от COM порта возлагается на тебя, регистр 3F9h
    Пример послания команды инициализации модема ATZ, AT префикс команд.
    Каждая команда должна заканчиваться символ с ASCII кодом 13
    Код (Text):
    1. mov dx,3F8h
    2. mov al,65   ; A
    3. out dx,al
    4.  
    5. mov dx,3F8h
    6. mov al,84   ; T
    7. out dx,al
    8.  
    9. mov dx,3F8h
    10. mov al,90   ; Z
    11. out dx,al
    12.  
    13. mov dx,3F8h
    14. mov al,13   ; символ с ASCII кодом 13
    15. out dx,al
    Прилагаю полный набор команд.
     
  3. Kirillxskynet

    Kirillxskynet New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2006
    Сообщения:
    30
    mov dx,3FCh ; Порт управления линией
    mov al,0Bh ; 00001011b DTR, RTS, OUT1 OUT2
    out dx,al

    объясни пожалуйста для чего нужны линии OUT1 и OUT2
    и почему ты установил OUT2 (00001011b), а OUT1 не трогал?
     
  4. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Вообще, регистр букв модему не важен, во всех доках об этом написано. Также ему не важны и пробелы. Главное, чтобы их небыло между командой и её параметром.

    Линия OUT1 не используется, а установка OUT2 разрешает прерывания от стыка RS-232. То есть если их разрешить в регистре управления прерываниями, но не разрешить здесь, их не будет.

    А как вы узнаёте, что модем ничего не ответил, или здесь толькокусок программы? Зачем вам прерывания, если обработчика нет? И перед тем как писать в порт, нужно проверить, готов ли модем.

    Высылаю одну из крутейших док по RS-232 на русском языке. (из IO.PRT, дораб.)