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

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

Вернуться   Форум программистов > Работа для программиста > Фриланс
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2010, 07:38   #51
I-Gor
 
Регистрация: 08.11.2010
Сообщений: 6
По умолчанию

Сделал, о чем ты говорил. Скриншоты во вложении. Первый соответствует изменениям:
proc_5 proc near
and al, 27h
out dx, al
in ax, dx; in al, dx
; mov ah, al
; inc dx
; in al, dx
; xchg al, ah
; dec dx
push ax
mov al, 10h
out dx, al
pop ax
retn
proc_5 endp
Второй – тому же самому, только с «незаглушенной» командой xchg al, ah.

Датчики от прибора (кроме кнопок) были отключены. В первом случае прибор КОРРЕКТНО ОПРАШИВАЕТ ВСЕ КАНАЛЫ, во втором - по всем аналоговым входам лукавит. Маловероятны наводки от 0,05 до 0,2 миллиампер по токовым входам 5 - 8, да и низкоомные резисторы к R-каналам 1 - 4 никто не подключал. Состояние релейных входов (нажатие кнопок) в обоих случаях отображается правильно.
Вложения
Тип файла: zip scr0102.zip (11.1 Кб, 7 просмотров)

Последний раз редактировалось I-Gor; 03.12.2010 в 08:36.
I-Gor вне форума Ответить с цитированием
Старый 03.12.2010, 08:20   #52
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

I-Gor
будь внимательнее, должно быть либо in aХ,dx либо in aХ,dx / xchg al,ah

Последний раз редактировалось Mikl___; 03.12.2010 в 08:26.
Mikl___ вне форума Ответить с цитированием
Старый 03.12.2010, 08:35   #53
I-Gor
 
Регистрация: 08.11.2010
Сообщений: 6
По умолчанию

Сам сообразил, что что-то не то, и исправил пост. Короче, в первом случае все ОК, во втором - прибор врет.
I-Gor вне форума Ответить с цитированием
Старый 03.12.2010, 08:37   #54
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

I-Gor
ставь in AX,DX -- буду думать над состоянием АЦП занято/готов AX=03FFh AH=3 режим а AL=0FF признак занятости
в int_63h_entry исправь
;------------------------
cmp al, 0FFh
jnz short a06
xor di,di;
mov al, [bx+di+0Ah]
a06: xor ah, ah
;------------------
на
;------------------------
cmp al, 0FFh
jnz short a06
xor di,di;
mov al, [bx+0Ah]<--здесь
a06: xor ah, ah
;------------------
и
;-------------------------
push cx
mov cl, 8
mov di, offset n4
mov dx, [bx]
add dx, 2
a11: mov al,cl
dec al
out dx, al
in al, dx
xor al, 3
mov [di],al
inc di
dec cl
jnz a11
pop cx
;----------------------
на
;-------------------------
push cx
mov cx, 8 <--- здесь
mov di, offset n4
mov dx,322h <--- здесь
a11: mov al,cl
dec al
out dx, al; в DX передается последовательно число от 7 до 0 (номера каналов)
in al, dx
xor al, 3
stosb <--- здесь
loop a11 <--- здесь
pop cx
;----------------------------------------

Последний раз редактировалось Mikl___; 03.12.2010 в 09:38.
Mikl___ вне форума Ответить с цитированием
Старый 03.12.2010, 12:05   #55
I-Gor
 
Регистрация: 08.11.2010
Сообщений: 6
По умолчанию

После этих замен с аналоговыми входами все в порядке, но тестовая программа перестала видеть оба дискретных.
I-Gor вне форума Ответить с цитированием
Старый 03.12.2010, 13:42   #56
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

I-Gor
1) замени mov al, [bx+di+0Ah] на mov al, [bx+0Ah] проверь
2) mov dx, [bx]/add dx, 2 на mov dx,322h проверь
3) mov [di],al/inc di на stosb проверь
4) mov cl, 8/ ... / dec cl / jnz a11 на mov cx, 8/ ... / loop a11 проверь
они не связаны между собой
Mikl___ вне форума Ответить с цитированием
Старый 03.12.2010, 18:08   #57
I-Gor
 
Регистрация: 08.11.2010
Сообщений: 6
По умолчанию

Выяснил, что тестовая программа (точнее, резидент) не видит релейные входы только после замены mov dx, [bx] вместе с add dx, 2 на mov dx, 322h. Все остальное не влияет. Если оставить mov dx, [bx], но убрать add dx, 2, то резидент начинает передавать нули по всем каналам, т. е. только симулирует опрос.

Последний раз редактировалось I-Gor; 04.12.2010 в 07:59.
I-Gor вне форума Ответить с цитированием
Старый 07.12.2010, 04:01   #58
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

I-Gor
Таким образом получаем минимум 4 номера порта:
1) порт данных для аналоговых входов
2) порт номера канала для аналоговых входов (=322h)
3) порт данных для релейных входов
4) порт номера канала для релейных входов
в в int_1Сh_entry есть фрагмент
;-----------------------------------------------
. . . .
a03: dec cx
jz short a07
mov ax, [bx+4] ;получит в АХ некоторое число
cmp ax, 8; и сравнить его с 8 (у нас 8 каналов от 0 до 7)
jb short a04; если число меньше т.е. от 0 до 7 перейти на a04
dec bp
mov dx, [bx]
xor ax, ax; если АХ больше или равно 8, тогда сделать АХ=0
call proc_5
jmp short a05
a04: mov dx, ax;в DХ число от 0 до 7
add dx, [bx+2] ; складываем значение в DX с номером какого-то порта
push dx; сохраняем значение DХ для дальнейшего использования
mov dx, [bx]; помещаем в DХ значение еще какого-то порта
call proc_5
;-----------------------------------------------
содержимое proc_5
;-------------------------------------------
proc_5 proc near ; процедура вызывается всего из двух мест int_1Сh_entry
and al, 27h ; в AL число от 0 до 7
out dx, al ; DX = 320h AL=0
in ax,dx; ; читаем содержимое порта в AX
push ax
mov al, 10h
out dx, al ; передаем в порт AL=10h
pop ax
retn
proc_5 endp
;-----------------------------------
в AL число от 0 до 7 после and al,27h в AL так и останется число от 0 до 7, поэтому из proc_5 строку and al,27h можно безболезненно убрать
;================================== =============================
proc_5 proc near
out dx,al; AL от 0 до 7 номер канала
in ax,dx; читаем содержимое порта в AX
push ax;запомнили результат аналого-цифрового преобразования для данного канала
mov al,10h
out dx,al;AL=10h послали подтверждение АЦП либо разблокировали УВХ
pop ax;восстановили в АХ результат аналого-цифрового преобразования для данного канала
retn
proc_5 endp
;================================== =================================
просмотрел общее количество команд чтения/записи в порты и вот, что обнаружил в int_1Сh_entry
получаем AL из памяти
and al, 27h; обнуляем все разряды кроме 5-ого, 2-ого, 1-ого и 0-ого (2,1,0 содержат номер канала)
out dx, al ; передаем в какой-то порт
or al, 8; устанавливаем =1 3-ий разряд AL
out dx, al ; передаем в какой-то порт
;--------------------------------------------------------
a11: mov al,cl;в CL число от 8 до 1
dec al ;в АL число от 7 до 0 (номер канала)
out dx, al;передаем номер канала в порт
in al, dx;получаем из порта значение в AL
xor al, 3;меняем на обратные (т.е. 0 на 1, а 1 на 0) значения в 1-ом и 0-ом разрядах AL
;возможно в 1-ом и 0-ом разрядах состояние релейных входов?
stosb; отправляем значение из AL в память и увеличиваем на 1 номер ячейки памяти
loop a11;повторяем для всех каналов
;----------------------------------------------
IN и OUT используются еще в proc_5

Последний раз редактировалось Mikl___; 07.12.2010 в 12:37.
Mikl___ вне форума Ответить с цитированием
Старый 08.12.2010, 02:17   #59
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Господа, не пора ли отправить эту тему в более подобающий раздел?
Black Fregat вне форума Ответить с цитированием
Старый 10.12.2010, 13:44   #60
I-Gor
 
Регистрация: 08.11.2010
Сообщений: 6
Сообщение

Black Fregat «…не пора ли отправить эту тему в более подобающий раздел?»

Собственно, она там и была изначально. Когда я создавал тему, был убежден, что она относится именно к программированию на Ассемблере. Однако, по настоятельному требованию одного господина (см. http://www.programmersforum.ru/showthread.php?t=120790) обсуждение перенес именно сюда.

Хотя тут уже не переносить, тут уже помаленьку закругляться надо… Отвечаю Mikl___’y (хоть и с опозданием), почему в посте #49 я считал работу по существу выполненной.

Вызовом int 63h c AX=3 на входе удалось добиться устойчивого опроса прибора из написанной мною программы. И результаты получаются правдивыми. Другое дело, что информация о состоянии всех входов устройства не нужна, если к некоторым входам заведомо ничего не подключено. Можно модифицировать мою программу так, чтобы она (естественно, опрашивая все входы, т. к. ничего более изящного пока не придумали) выводила на экран результат именно по требуемым каналам (каналу), «отбрасывая» все остальные. Не, спорю, это довольно топорный (хотя и самый легкий) способ, но он может пригодиться, если не будет найден метод произвольного выбора канала измерения, воздействуя на резидент. Вот, собственно, это я и хотел сказать, считая работу выполненной, т. к. один из вариантов уже готов.

Mikl___ однажды верно заметил, что мы не ищем легких путей. Поэтому продолжим исследование. Я попытался составить, если не принципиальную, то хотя бы структурную электрическую схему девайса. Выяснил 1) АЦП у прибора все-таки один, но с мультиплексируемым входом; 2) управление мультиплексором (точнее, аналоговым коммутатором) явно внешнее (со стороны компьютера); 3) для связи с шиной ISA в приборе применен адаптер параллельного интерфейса КР580ВВ55А (Intel 8255A), который имеет, по данным даташита, 3 восьмибитных порта ввода-вывода и один 8-битный регистр для управления микросхемой.

Mikl___ в свое время предложил представить себя разработчиком прибора. Так вот, будь я разработчиком, я бы не стал вешать релейные входы на разные порты. Во-первых, тогда портов в микросхеме не хватит: два из них уже гипотетически задействованы (порт номера канала и порт данных для аналоговых входов), а нужно еще два (то же самое, но для дискретных входов). Во-вторых, релейных входов всего два и состояние каждого выражается всего одним битом. Поэтому разумнее было бы под оба релейных входа задействовать один порт данных, а переключение между аналоговыми и дискретными входами выполнить чрез общий порт номера канала. Но, так как в int_1Сh_entry a03 номер канала не может быть больше 7 (иначе он обнуляется), то можно сделать по-другому. Для дискретных входов выделить отдельный порт под номер канала (один канал для обоих входов), а данные брать из общего с аналоговыми входами порта данных. Таковы мои предположения.

В примерах применения КР580ВВ55А я нашел, что при подключении к ISA микросхема обычно использует 4 последовательных адреса портов (3 для доступа к портам ввода-вывода микросхемы и один - для регистра управляющего слова). Может быть, эта инфа для чего-нибудь пригодится.

Последний раз редактировалось I-Gor; 10.12.2010 в 15:41.
I-Gor вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Драйвер ISA устройства для DOS I-Gor Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 12.11.2010 06:49
Драйвер для hp laserjet 1010 для windows 7 Юзер7 Общие вопросы C/C++ 6 04.08.2010 09:17
драйвер мыши для C++3.0 for dos masta777 Общие вопросы C/C++ 3 20.06.2009 17:31
Разработка драйвер USB-HID устройства _dx Win Api 5 10.06.2009 18:34
Для кадого ли устройства есть свой контроллер? Elm0 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 21.06.2007 20:42