Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2017, 17:04   #21
седьмой
Форумчанин
 
Регистрация: 17.07.2012
Сообщений: 140
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
к чему такие навороты? нельзя что-ли проще?
Так ничего и не вышло пришлось остановиться пока на вашем предложении
Код:
;masm-code
;---------------
org  100h
     mov dx,00       ; lpt-порт(0) 
@3
in al,dx    
 mov   ah,02       ; функция int 17h
int 17h    ;прерывание программное 
bt ax,0Eh   ; проверяем 14 бит, если 0 то пришло прерывание
jnc @1   ;переход если 0
mov al,'1' ;если не было прерывание 1 на экран
int 29h
jmp @3
mov al,'0'
int 29h
jmp 03
int 20h
END START
седьмой вне форума Ответить с цитированием
Старый 31.05.2017, 19:04   #22
седьмой
Форумчанин
 
Регистрация: 17.07.2012
Сообщений: 140
По умолчанию

Цитата:
Сообщение от kutani Посмотреть сообщение
чукча пейсатель, чукча не читатель?
Да вы угадали Чукча писатель кода на ассемблере по биос прерыванию INT 17h получил красивую картинку чередующихся пропорционально 0 и 1 на частоте генератора 100кг или при длительности периода 10 мкс, причем последовательность 0 и 1 состоит из 4х, это значит что частоту на генераторе можно увеличить еще в 4 раза и довести период соответственно до 2,5 мкс, но там уже "плечи" 0 и 1 становятся не пропорцеональными и сильно падает стабильность. А попробуйте вы что нибудь выложить на винде, хоть вы и не Чукча, но при всех ваших потугах винда более 20 мс в периоде вам не даст, и стабильность там близко не будет. Хотя конечно я могу ошибаться, и вы сможете что то конкретное показать? То что вы выложили я совсем не понял, что там был за набор цифр?
седьмой вне форума Ответить с цитированием
Старый 31.05.2017, 23:27   #23
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от седьмой Посмотреть сообщение
А вы мне что в цикле из 10 выводите 9ку на экран? Мне это зачем? Я могу пояснить что хочу,
Так сразу надо было и объяснять, а не плести про бабушек каких-то..
Что за кривой код ты выложил без метки(@1), и чё там у тебя за устройство висит на LPT, что возвращает сброшенный бит(14)? Какие пины LPT-порта задействованы, кроме #ACK ?
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 01.06.2017, 07:07   #24
седьмой
Форумчанин
 
Регистрация: 17.07.2012
Сообщений: 140
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
Так сразу надо было и объяснять, а не плести про бабушек каких-то
Простите, просто кто то написал, что винда лучше доса, я пытался его защитить... Дос ведь так то не Майкрософт придумал, они же его купили, потом изменили и довели до сегодня, а организация изначально операционной системы была мне кажется очень даже хорошая и до сих пор актуальна, по крайней мере во многом превосходит МК.
Цитата:
Сообщение от R71MT Посмотреть сообщение
Что за кривой код ты выложил без метки(@1)
код у меня к сожалению всегда кривой, так как нет возможности его взять и скопировать с одной машины на другую, иногда проще и быстре бывает просто перенабрать, видимо где то описался, сейчас исправлю
Код:

;masm-code
;---------------
.MODEL tiny
.386
.DATA
.CODE
org  100h
mov cx,10000
     mov dx,00       ; lpt-порт(0) 
@3
in al,dx    
 mov   ah,02       ; функция int 17h
int 17h    ;прерывание программное 
bt ax,0Eh   ; проверяем 14 бит, если 0 то пришло прерывание
jnc @1   ;переход если 0
jmp @2
@1
mov al,'1' ;если не было прерывание 1 на экран
int 29h
jmp @3
@2
mov al,'0'
int 29h
jmp 03

int 20h
END START
(14й бит возвращает как раз эту 10ю ногу, единственную задействованную.) Задействован только 10й, на него приходит с генератора частота 200 гц (отладочная частота), мне по каждому прерыванию (фронт с высокого на низкий) надо запускать короткий код на с++, который отправит команду со своей интерфейсной платы ПК (ms-dos, точнее FreeDos, но можно просто дос) на другую аналогичную плату другого устройства и получит от туда ответ и программа снова перейдет в режим ожидания прерывания. Период сигнала генератора составляет 5мс, сишный код выполняется примерно 1 мс, для ожидания следующего прерывания остается порядка 80% времени или около 4х мс. Вроде бы укладываюсь пока в поставленную задачу, но пока не понимаю как мне из программы на ассемблере запустить код на с++?

Последний раз редактировалось седьмой; 01.06.2017 в 07:48.
седьмой вне форума Ответить с цитированием
Старый 01.06.2017, 10:52   #25
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

Цитата:
Хотя конечно я могу ошибаться, и вы сможете что то конкретное показать? То что вы выложили я совсем не понял, что там был за набор цифр?
ошибаетесь, выше мной выложен код прямого доступа к портам под виндами с вшитым драйвером )))
kutani вне форума Ответить с цитированием
Старый 01.06.2017, 14:25   #26
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

седьмой, капец ты в тумане
Если на LPT висит не принтер, а левая схема TTL, то в ней нужно предусмотреть линии BUSY и #ACK, чтобы съэмулировать работу с принтером. Обычно BUSY прижимают на землю, что означает 'Принтер готов!'. Теперь можно перебором найти номер порта, для использовании его в качестве базы.

Весь код спецом не даю, чтоб ты шевелил мозгами:
Код:
org  100h
jmp  start

base   dw    0               ; номер активного порта LPT
old0F  dw    0,0             ; вектор 0Fh

start:
       mov   cx,4            ; всего портов
       xor   dx,dx           ; начинаем с первого(0)
@00:   mov   ah,2            ; дать статус!
       int   17h             ;
       cmp   ah,90h          ;
       jne   okey            ; ОК, если не 90h
       inc   dx              ; сл.порт..
       loop  @00             ;

       call  err             ; нет устройств со-сброшенным BUSY!!!
       db    'ERROR! No LPT-device!',13,10
       db    'Press any key....$'
err:   pop   dx              ;
       mov   ah,9            ;
       int   21h             ;
       jmp   @exit           ; на выход

;//--- Нашли устройство (LPT в DX)
okey:  shl   dx,1            ; делаем из DX смещение (DX*2)
       mov   di,base         ; ES:DI = переменная BASE
       push  ds 0            ;
       pop   ds              ; DS = 0 (сегмент BIOS)
       mov   si,408h         ; DS:SI = таблица портов LPT
       add   si,dx           ; смещаемся в таблице к активному порту
       lodsw                 ; берём в AX номер порта
       stosw                 ; делаем из него BASE+0

;//--- Сразу перехватываем INT-0Fh
       push  ds                    ;
       lds   si,[0Fh*4]            ; DS:SI = вектор 0Fh
       mov   word[cs:old0F],si     ; запомним оригинал
       mov   word[cs:old0F+2],ds   ;
       pop   ds                    ;
       mov   word[0Fh*4],new0F     ; установка нового
       mov   word[(0Fh*4)+2],cs    ;
       pop   ds                    ; возвращаемся в свой сегмент!

;//--- Настраиваем APIC и порт LPT
       in    al,21h          ; *** снимаем маску с IRQ-7
       and   al,7Fh          ; сбрасываем бит(7) PIC-контроллёра
       out   21h,al          ;

       mov   dx,[base+2]     ; *** вкл INT для LPT
       in    al,dx           ;
       or    al,10000b       ; взводим бит(4)
       out   dx,al           ;

;//--- Новый обработчик INT-0Fh (основной модуль)
new0F: nop
       iret

@exit: xor   ax,ax
       int   16h
       mov   ax,4c00h
       int   21h
       retn                  ; bye User
криво-косо, но по-призительно такой линии.
Думай, что нужно делаь в обработчике..
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 01.06.2017, 15:06   #27
седьмой
Форумчанин
 
Регистрация: 17.07.2012
Сообщений: 140
По умолчанию

Спасибо за код, попробую найти в нем что то дополнительное.
Цитата:
Сообщение от R71MT Посмотреть сообщение
Если на LPT висит не принтер, а левая схема TTL
там ничего не висит совсем, там генератор висит и осциллограф, на одном 10м контакте.
Цитата:
Сообщение от R71MT Посмотреть сообщение
найти номер порта, для использовании его в качестве базы.
а зачем перебором, если известно в какой ячейке памяти он находится, там же кажется нулевой сегмент и смешение 400, можно же его сразу взять без перебора или нет?
Весь код спецом не даю, чтоб ты шевелил мозгами: думаю весь код и не надо, он собственно у меня уже есть, просто не работал... я так понимаю, что нужно нолик послать на 7ю ногу база+1 , а вернее вы пишите припаять ее к земле. И тогда прерывание должно сработать.
Ничего принципиального в вашем коде не нашел, все тоже самое что у меня, кроме готовности принтера, попробую его занулисть, спасибо. Потом отпишусь.

Последний раз редактировалось седьмой; 01.06.2017 в 15:31.
седьмой вне форума Ответить с цитированием
Старый 01.06.2017, 15:43   #28
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от седьмой Посмотреть сообщение
а зачем пербором, если известно в какой ячейке памяти он находится,
ничего не известно!
Там просто перечисляются номера портов, а который из них активный - нужно искать. Активный тот, где BUSY сброшенный. Тогда тебе и INT-17h вернёт не 90h в AH. Читай маны...

Нет резона работать с портом, пока он тебе не вернёт BUSY(0), т.е. трасса\шина свободна. Контроллёр LPT ничё там не выставляет, а выставляет сам принтер. Именно поэтому ты его должен эмулировать. (если взять в корень)
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 02.06.2017, 07:22   #29
седьмой
Форумчанин
 
Регистрация: 17.07.2012
Сообщений: 140
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
(если взять в корень)
Да, лучше в корень, спасибо большое за помощь, пошел в маны.
седьмой вне форума Ответить с цитированием
Старый 05.06.2017, 14:42   #30
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от седьмой Посмотреть сообщение
получил красивую картинку чередующихся пропорционально 0 и 1 на частоте генератора 100кг или при длительности периода 10 мкс, причем последовательность 0 и 1 состоит из 4х, это значит что частоту на генераторе можно увеличить еще в 4 раза и довести период соответственно до 2,5 мкс, но там уже "плечи" 0 и 1 становятся не пропорцеональными и сильно падает стабильность.
Во-первых:
----------------
Чтобы получить макс.быстродействие, тебе нужно избавиться в новом обработчике от всех тормозов. Сейчас - это прерывание(29h), которым ты контролируешь низкий уровень(#ACK). Пока INT-29h отработает 1 раз, ACK может несколько раз отжаться от пола. Ты думаешь что всё идёт по-плану, хотя наверняка это не так.

Выводи 0-и-1 сразу в видео\буфер, чтоб прерывание обрабатывалось быстрее. Можешь посмотреть, как DOS обрабатывает INT-29h. Это не самостоятельное прерывание, а тупой вызов fn.0Eh видео\сервиса BIOS. Ну и зачем тебе гонять в стековую память (и обратно) столько значений регистров?

Код:
;//------ Адрес обработчика int29h в таблице векторов:
;//------ 29h * 4 = A4h 
-d 0:A4
0000:00A0              54 02 70 00 - F2 04 7E D0 B8 10 A7 00
0000:00B0  B8 10 A7 00 B8 10 A7 00 - 40 01 12 04 50 09 B5 D8


;//------ Дизассемблируем адрес: 0070:0254h
;//----------------------------------------
-u 0070:0254

0070:0254 50            PUSH    AX
0070:0255 56            PUSH    SI
0070:0256 57            PUSH    DI
0070:0257 55            PUSH    BP
0070:0258 53            PUSH    BX
0070:0259 B40E          MOV     AH,0E
0070:025B BB0700        MOV     BX,0007
0070:025E CD10          INT     10
0070:0260 5B            POP     BX
0070:0261 5D            POP     BP
0070:0262 5F            POP     DI
0070:0263 5E            POP     SI
0070:0264 58            POP     AX
0070:0265 E923FF        JMP     018B  -----+
;..........                                |
-u 70:018b        <----------<-------------+
0070:018B 1E            PUSH    DS
0070:018C 50            PUSH    AX
0070:018D B84000        MOV     AX,0040
0070:0190 8ED8          MOV     DS,AX
0070:0192 F70614030024  TEST    WORD PTR [0314],2400
0070:0198 754F          JNZ     01E9  -----+
;..........                                |
-u                <----------<-------------+
0070:01E9 58            POP     AX
0070:01EA 1F            POP     DS
0070:01EB CF            IRET
Во-вторых:
----------------------
Не надо ничего перехватывать, а достаточно просто опрашивать статус LPT-порта на установленый бит #ACK. Даже не нужно чтобы генерилось при этом прерывание(0Fh), поскольку мы не собираемся его обрабатывать - самого статуса будет предостаточно.

Вот пример такой реализации.. Как-только получишь на экране чёткую последовательность 01, значит частота генератора является оптимальной. При малой длительности импульсов - на экране будут преобладать единицы типа 1110; в противном случае - нули:
Код:
;//Fasm-code
;----------------
org  100h
jmp  start

start: mov   ax,3            ; текст-мода
       int   10h             ;

;// Ищем активный порт по BUSY = 0
       mov   cx,3            ; всего портов
       push  ds 0            ;
       pop   ds              ;
       mov   bx,408h         ; DS:BX = таблица портов
@00:   mov   dx,[bx]         ; берём очередную базу LPT
       inc   dx              ; база+1 (регистр статуса)
       in    al,dx           ;
       and   al,80h          ; BUSY сброшенный?
       jz    @okey           ; да!
       add   bx,2            ; иначе: сл.порт..
       loop  @00             ;

;//  Нет устройств со-сброшенным BUSY
       pop   ds
       call  err             ;
       db    'ERROR! No LPT-device!',13,10
       db    'Press any key....$'
err:   pop   dx              ;
       mov   ah,9            ;
       int   21h             ;
       jmp   @exit           ; на выход

;// Нашли активный порт LPT (номер в DX). Настраиваемся на видео\буфер
@okey: push  0B800h          ;
       pop   es ds           ;
       xor   di,di           ; ES:DI = видеобуфер
       mov   ah,0Eh          ; цвет символов для вывода - жёлтый

;// ======== Основной модуль ===================================//
@01:   in    al,60h          ; порт клавы. ESC - на выход!
       dec   al              ;    ^^^ scan ESC = 1
       jz    @exit           ;

       in    al,dx           ; читаем статус активного LPT
       shr   al,6            ; выделяем в нём бит(6) #ACK
       or    al,30h          ; переводим в символ
       stosw                 ; выводим на экран!
       jmp   @01             ; вешаемся на клаву..
;// ============================================================//

@exit: xor   ax,ax           ; выход в DOS!
       int   16h             ;
       retn                  ;
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необходимо написать программу на C#, управляющая LPT и 3 COM портами. На COM висят АЦП и ЦАП CopperRU Фриланс 2 15.04.2012 10:19
Параллельный АЦП на С Анастасий Общие вопросы C/C++ 4 05.01.2012 15:54
avr usb ацп wanes101 Микроконтроллеры, робототехника, схемотехника, 3D принтеры 5 20.09.2010 10:04
Программа для АЦП TLC549 WandererX Помощь студентам 0 08.04.2010 10:25
АЦП на ATmega48 hobin Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 04.02.2009 04:21