![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#51 |
Регистрация: 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 никто не подключал. Состояние релейных входов (нажатие кнопок) в обоих случаях отображается правильно. Последний раз редактировалось I-Gor; 03.12.2010 в 08:36. |
![]() |
![]() |
![]() |
#52 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
I-Gor
будь внимательнее, должно быть либо in aХ,dx либо in aХ,dx / xchg al,ah Последний раз редактировалось Mikl___; 03.12.2010 в 08:26. |
![]() |
![]() |
![]() |
#53 |
Регистрация: 08.11.2010
Сообщений: 6
|
![]()
Сам сообразил, что что-то не то, и исправил пост. Короче, в первом случае все ОК, во втором - прибор врет.
|
![]() |
![]() |
![]() |
#54 |
Участник клуба
Регистрация: 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. |
![]() |
![]() |
![]() |
#55 |
Регистрация: 08.11.2010
Сообщений: 6
|
![]()
После этих замен с аналоговыми входами все в порядке, но тестовая программа перестала видеть оба дискретных.
|
![]() |
![]() |
![]() |
#56 |
Участник клуба
Регистрация: 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 проверь они не связаны между собой |
![]() |
![]() |
![]() |
#57 |
Регистрация: 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. |
![]() |
![]() |
![]() |
#58 |
Участник клуба
Регистрация: 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. |
![]() |
![]() |
![]() |
#59 |
Программист
Участник клуба
Регистрация: 23.06.2009
Сообщений: 1,772
|
![]()
Господа, не пора ли отправить эту тему в более подобающий раздел?
|
![]() |
![]() |
![]() |
#60 |
Регистрация: 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. |
![]() |
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Драйвер 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 |