|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
30.11.2010, 09:08 | #41 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
Tronix
"Далее, я уже писал про Turbo Debugger и ту тестовую программу, что на Си написана. Можно ловить по вызывам int 63h и смотреть что и как." Я просмотрел тестовую программу через IDA и hiew32, но не нашел там int 63h (0CD63h). Может быть не там искал? |
30.11.2010, 10:59 | #42 |
Регистрация: 08.11.2010
Сообщений: 6
|
Начну с конца.
1. TD я пытался пользоваться еще до первого поста Tronix’а. Проблема в том, что резидент, будучи запущенным из-под TD, хоть и становится резидентным (простите за каламбур), но начинает некорректно работать. Тестовая прога, в частности, не получает от такого резидента значений. Поэтому от использования TD, по крайней мере, применительно к acp3_drv, мне пришлось отказаться. 2. Mikl___: «вот такая арифметика: mov dx,(offset begin + 0Fh)/16» Если в листинге IDA написать .code org 0 seg_org equ $ org 100h start: jmp begin … mov dx, (offset begin+0Fh)/16 mov ax, 3100h int 21h end_of_prog: end start то TASM при компиляции ругается (Relative quantity illegal) на строку mov dx, (offset begin+0Fh)/16. Не нравится почему-то TASM’у этот offset begin… 3. Mikl___: «…опиши, что возвращается в AX, BX, CX, DX при вызове AH=0 int 63h; AH=1 int 63h; AH=2 int 63h» Вызовы int 63h при подключенной железке и неизменном состоянии во всех каналах измерения: 1) на входе AX=0000h. На выходе: AX=BX=CX=DX=0;. 2) на входе AX=0100h. На выходе: AX=0100h, BX=CX=DX=0; 3) на входе AX=0200h. На выходе: AX=00FF, BX=CX=DX=0. Результаты стабильны и не зависят от количества вызовов int 63h при одном и том же значении AH. Однако вызовы 63h при AH ={0, 1, 2} влияют на состояние регистров в последующих вызовах при AH =3. Например: AH=0 --> AH=3: AX: 03FF BX: 0000 CX: 0000 DX: 0000 (стабильно) AH=1 --> AH=3: AX: 0001 BX: C809 CX: 0000 DX: 001A AX: 0002 BX: C781 CX: 0000 DX: 001B AX: 0003 BX: C784 CX: 0000 DX: 001C AX: 0004 BX: 0001 CX: 0000 DX: 001D AX: 0005 BX: 0001 CX: 0000 DX: 001E AX: 0006 BX: 0001 CX: 0000 DX: 001F AX: 0007 BX: 0001 CX: 0000 DX: 0020 AX: 0000 BX: C805 CX: 0000 DX: 0021 AX: 0001 BX: C798 CX: 0000 DX: 0022 AX: 0002 BX: C777 CX: 0000 DX: 0023 AX: 0003 BX: C776 CX: 0000 DX: 0024 AX: 0004 BX: 0001 CX: 0000 DX: 0025 AX: 0005 BX: 0001 CX: 0000 DX: 0026 AX: 0006 BX: 0001 CX: 0000 DX: 0027 AH=2 --> AH=3: AX: 0000 BX: EF09 CX: 0000 DX: 01A4 AX: 0007 BX: 0001 CX: 0000 DX: 01A4 AX: 0000 BX: EF2C CX: 0000 DX: 01A6 AX: 0002 BX: C773 CX: 0000 DX: 01A7 AX: 0003 BX: C780 CX: 0000 DX: 01A8 AX: 0000 BX: EF09 CX: 0000 DX: 01AA AX: 0001 BX: EF08 CX: 0000 DX: 01AB AX: 0000 BX: EF09 CX: 0000 DX: 01AC AX: 0000 BX: EF08 CX: 0000 DX: 01AD AX: 0000 BX: C807 CX: 0000 DX: 01AD AX: 0000 BX: EF08 CX: 0000 DX: 01AE AX: 0002 BX: C780 CX: 0000 DX: 01AF AX: 0003 BX: C778 CX: 0000 DX: 01B0 AX: 0000 BX: EF09 CX: 0000 DX: 01B2 AX: 0001 BX: EF08 CX: 0000 DX: 01B3 AX: 0006 BX: 0001 CX: 0000 DX: 01B3 AX: 0000 BX: EF09 CX: 0000 DX: 01B4 AX: 0007 BX: 0001 CX: 0000 DX: 01B4 В последнем случае прибор вообще врет «как свидетель». 4. Mikl___: «…попробуй отключить обработчик 1Ch прерывания и отпишись, что из этого получится Если «заглушить» int 1Ch командами ; mov dx,offset int_1Ch_entry ; mov ax,251Ch ; int 21h фирменная тестовая прога вообще ничего не пишет, хотя запускается. Моя Бейсик-программа ловит нули в AX – DX после вызова int 63h. Последний раз редактировалось I-Gor; 30.11.2010 в 18:31. |
30.11.2010, 11:04 | #43 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
I-Gor
тогда вот так попробуй ;=========================== org 0 seg_org = $ org 100h start: jmp begin … mov dx, (begin - seg_org +0Fh)/16 mov ah, 31h int 21h end start ;================================== = Последний раз редактировалось Mikl___; 30.11.2010 в 13:15. |
30.11.2010, 17:57 | #44 |
Регистрация: 08.11.2010
Сообщений: 6
|
Mikl___:
«;=========================== org 0 seg_org = $ org 100h start: jmp begin … mov dx, (begin - seg_org +0Fh)/16 mov ah, 31h int 21h end start ;================================== =» Вот это – другое дело! Родился вполне жизнеспособный .com. Проверил. Работает. Так что, в вопросе о выделении памяти под резидент, думаю, поставлена окончательная точка. Последний раз редактировалось I-Gor; 30.11.2010 в 18:20. |
02.12.2010, 05:37 | #45 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
I-Gor
Видимо мы зашли в тупик в исследовании программы твоего резидента, поэтому самое время перейти к теоретической части работы платы твоего многоканального АЦП. То есть, как бы эту схему и программу к ней разрабатывал бы я сам. Итак, что мы имеем? 8-канальный АЦП, выдающий 8-ми или 10-ти или 12-ти разрядные данные (параметры АЦП можно узнать на кафедре -- это важно!). Общение с АЦП идет через порты ввода/вывода. Раз каналов 8 -- значит возможно несколько вариантов работы с АЦП. 1) Выделить на каждый канал по одному фиксированному порту ввода/вывода и последовательно опрашивать каждый канал изменяя только адрес порта ;------------------------------------------------ a1: mov dx,(номер_канала+базовый_адрес) in AL,DX mov [адрес_в_памяти],AL inc номер_канала and номер_канала,7 jmp a1 ;---------------------------------------------- 2) АЦП сам последовательно и циклично опрашивает каналы, мы работаем с одним единственным портом и по команде in AX,DX получаем в 3-х старших разрядах АХ номер канала, а в оставшихся младших разрядах результат измерения ;---------------------------------------------------------- a1: in AX,DX mov [адрес_в_памяти],AX jmp a1 ;----------------------------------------------------------------------- 3) АЦП имеет один единственный порт ввода/вывода и мы командой out DX,AL посылаем туда номер канала, а по команде in AX,DX читаем результат измерения. ;----------------------------------------------------- a1: mov dx,(базовый_адрес) mov AL,номер_канала out DX,AL in AL,DX mov [адрес_в_памяти],AL inc номер_канала and номер_канала,7 jmp a1 ;------------------------------------------------------------------------ Первый вариант предполагает циклический опрос всех 8-ми каналов. Варианты 2 и 3 более универсальны и позволяют нам опрашивать любой канал и в любом порядке. Так как два первых варианта самые очевидные и простые в реализации (а мы не ищем легких путей), то попробуем разработать 3-ий вариант. Последний раз редактировалось Mikl___; 02.12.2010 в 06:58. |
02.12.2010, 06:07 | #46 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
вероятно, многоканальный АЦП должен иметь (минимум) следующие входы/выходы:
1) 3 входа для адреса канала (2^3=8) 2) 8 или 10 или 12 выходов для цифрового кода 3) сигнал "Старт преобразования" 4) сигнал "Готов/занят" возможно на него заходят сигналы 5) считывание 6) запись 7) сброс предположим что на плате АЦП есть порт А (порт данных) откуда мы будем читать данные с АЦП, порт В (порт состояния) куда на один из разрядов приходит сигнал "Занят/готов" (пусть это будет 7-ой разряд) и с одного из разрядов снимается на АЦП сигнал "Старт" (пусть это будет 6-ой разряд) и порт С (порт номера канала) куда компьютер выставляет номер опрашиваемого канала. ;================================== ================== mov dx,(порт С) mov al,номер_канала out dx,al; выставляем номер канала для АЦП ;------------------------------------------------- mov dx,(порт B) mov al,01000000b out dx,al; сигнал на запуск АЦП ;------------------------------------------------- a1: in al,dx test al,10000000; сигнал "Занят/готов" jz a1; ждем пока не появится сигнал о завершении преобразования ;--------------------------------------------------------------------- mov dx,(порт A) in al,dx; получаем результат преобразования (продолжение следует) ж================================== ============================= I-Gor в proc_5 замени ;================================== ============== in al, dx ; читаем содержимое 320h порта в AL mov ah, al ; AH = AL inc dx ; DX = 321h in al, dx ; читаем содержимое 321h порта в AL xchg al, ah dec dx ;================================== ============================== на ;================================== ============== in ax, dx ; читаем содержимое 320h порта в AX ;================================== ============================== и посмотри что получится (возможно придется использовать вариант с in ax,dx / xchg al,ah) Последний раз редактировалось Mikl___; 02.12.2010 в 06:59. |
02.12.2010, 08:18 | #47 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
При достаточно сложной логике, находящейся на плате АЦП (там тоже может быть микропроцессор) можно организовать обмен с многоканальным АЦП следующим образом:
;------------------------------------------------------- mov dx,базовый_номер a1: in al,dx test al,10000000b jz a1; ждем пока АЦП не перейдет в состояние готовности mov al,установить_номер_канала out dx,al; передали команду АЦП mov al,номер_канала out dx,al; передали команду АЦП mov al,начало_преобразования out dx,al; передали команду АЦП a2: in al,dx test al,10000000; сигнал "Занят/готов" jz a2; ждем пока не появится сигнал о завершении преобразования ;--------------------------------------------------------------------- in al,dx; получаем результат преобразования от АЦП mov [адрес_в_памяти],al jmp a1 Последний раз редактировалось Mikl___; 02.12.2010 в 11:50. |
02.12.2010, 18:09 | #48 |
Регистрация: 08.11.2010
Сообщений: 6
|
Mikl___: «Видимо мы зашли в тупик в исследовании программы твоего резидента…»
Честно говоря, меня удивило твое сообщение. Я считал работу по существу выполненной, хотел задать еще пару-тройку вопросов по 63-му прерыванию и закрыть тему. 1. Насчет разрядности и порядка опроса. Разрядность прибора на каждый аналоговый канал – 16 бит и не битом меньше. Преп даже удивился вопросу о разрядности, т. к. тестовая прога (ее скриншот я выкладывал в посте #34) ясно показывает 4 шестнадцатеричные цифры в результатах опроса каналов. В #34, равно как и в #42, я уже приводил состояние регистров после вызова int 63h с AX=3. Прерывание возвращает номер канала в младших (а не в старших) разрядах АХ, в остальных разрядах АХ получаются нули. Не о каких результатах измерения в AX (на выходе из int 63h) и речи быть не может. Этот результат возвращается в ВХ – те самые четыре шестнадцатеричные цифры, или 16 бит. В DX и CX, как ты уже отмечал, судя по всему, выходит порядковый номер измерения (младшая часть в DX, старшая, возможно, в CX). В этом смысле результаты, получаемые моей программой на Бейсике, сходятся с данными тестовой проги. Однако в приборе кроме четырех аналоговых имеются еще и два релейных входа. Их внешние цепи могут находиться либо в замкнутом, либо в разомкнутом виде, нормальное состояние – разомкнутое. У нас к ним подключили две не фиксируемые кнопки, подобные кнопке Reset на системнике. Если состояние этих входов не меняется, то опрос аналоговых каналов (причем без явного указания их номера на входе в int 63h!) идет последовательно от 0 до 7 (см. вложение к #34 или пост #42 в части AX=1 --> AX=3). Когда я готовил эти данные, то, для стройности картины, все датчики от прибора были отключены. Разница в результатах аналого-цифрового преобразования по каналам 0 - 3, связана, скорее всего, с внешними наводками. То есть в указанных условиях при первом (условно) вызове int 63h и при входном AX=3 на выходе в AX получается канал 0, при втором вызове с AX=3 в AX – канал 1, при третьем вызове (тоже с AX=3) – канал 2, и т. д. до семи. Далее все повторяется сначала, т. е. int 63h при AX=3 на входе проводит последовательный циклический опрос. Другое дело – откуда числа от 0 до 7 в AX на выходе берутся. Они могут либо формироваться самой железкой, либо получаться программно. При первой гипотезе без принципиалки не разберешься (а принципиалка при выполнении курсовика не положена), при второй – достаточно внимательно рассмотреть листинг функции 3 прерывания 63h. Самое интересное начинается, когда изменяется состояние релейных входов. Тогда последовательный отсчет каналов прерывается. В моменты нажатия и отпускания кнопок в АХ появляется канал 8, в BX – одно из значений {0, 1, 2, 3}, где 1 – нажата первая кнопка, 2 – нажата вторая кнопка, 3 – нажаты обе кнопки одновременно (при удержании какой-либо одной нажата вторая), 0 – кнопки отпущены. Причем фиксируется не само состояние дискретных входов, а именно изменение этого состояния. Далее прерванный опрос аналоговых каналов продолжается со следующего номера. Поясню это иллюстрацией: AX: 0000 BX: C804 CX: 0000 DX: 015D AX: 0001 BX: C804 CX: 0000 DX: 015E AX: 0002 BX: C777 CX: 0000 DX: 015F AX: 0003 BX: C780 CX: 0000 DX: 0160 AX: 0004 BX: 0001 CX: 0000 DX: 0161 AX: 0005 BX: 0001 CX: 0000 DX: 0162 AX: 0006 BX: 0001 CX: 0000 DX: 0163 AX: 0008 BX: 0002 CX: 0000 DX: 0164 нажата вторая кнопка AX: 0007 BX: 0001 CX: 0000 DX: 0164 AX: 0000 BX: C807 CX: 0000 DX: 0165 AX: 0001 BX: C802 CX: 0000 DX: 0166 AX: 0002 BX: C780 CX: 0000 DX: 0167 AX: 0008 BX: 0000 CX: 0000 DX: 0167 отпущена вторая кнопка AX: 0003 BX: C780 CX: 0000 DX: 0168 AX: 0004 BX: 0001 CX: 0000 DX: 0169 AX: 0008 BX: 0001 CX: 0000 DX: 0169 нажата первая кнопка AX: 0005 BX: 0001 CX: 0000 DX: 016A AX: 0008 BX: 0003 CX: 0000 DX: 016A в добавление к первой нажата вторая AX: 0006 BX: 0001 CX: 0000 DX: 016B AX: 0007 BX: 0001 CX: 0000 DX: 016C AX: 0008 BX: 0000 CX: 0000 DX: 016D обе кнопки отпущены AX: 0000 BX: C799 CX: 0000 DX: 016D AX: 0001 BX: C803 CX: 0000 DX: 016E AX: 0002 BX: C779 CX: 0000 DX: 016F … Последний раз редактировалось I-Gor; 02.12.2010 в 18:56. |
02.12.2010, 18:45 | #49 |
Регистрация: 08.11.2010
Сообщений: 6
|
2. Насчет сигнала «Готов/занят».
Если опрашивать девайс (вызывать 63h при AX=3 на входе) слишком быстро, то получается примерно следующая картина: AX: 0000 BX: C804 CX: 0000 DX: 015D результат по каналу 0 AX: 03FF BX: 0000 CX: 0000 DX: 0000 AX: 03FF BX: 0000 CX: 0000 DX: 0000 … AX: 03FF BX: 0000 CX: 0000 DX: 0000 AX: 03FF BX: 0000 CX: 0000 DX: 0000 AX: 0001 BX: C804 CX: 0000 DX: 015E результат по каналу 1 AX: 03FF BX: 0000 CX: 0000 DX: 0000 AX: 03FF BX: 0000 CX: 0000 DX: 0000 … AX: 03FF BX: 0000 CX: 0000 DX: 0000 AX: 03FF BX: 0000 CX: 0000 DX: 0000 AX: 0002 BX: C777 CX: 0000 DX: 015F результат по каналу 3 AX: 03FF BX: 0000 CX: 0000 DX: 0000 … Следовательно, значение AX=03FFh в этом случае можно считать признаком занятости устройства. 3. О портах ввода-вывода. Насчет портов вывода пока воздержусь, но вот рискну предположить, что портов ввода у прибора, по меньшей мере, два. Двенадцатью постами выше мы уже проводили эксперимент с заменой mov dx,[bx] … out dx,al (sub_2) на mov dx,320h. Не пашет прибор в итоге. Так что инструкцию mov dx,[bx] перед командой out пришлось реабилитировать. 4. Mikl___: «При достаточно сложной логике, находящейся на плате АЦП (там тоже может быть микропроцессор) можно организовать обмен…» Ну, это уж ты, батенька, маху дал... Я еще в сентябре cпециально просил железку посмотреть. Системник, правда, открыть не разрешили, но вот железку дали (у них, по ходу, их несколько). Фото железки во вложении. Элементная база следующая: 5 операционников К174УД17А (из них 4 на входе); 3 триггера (один К555ТЛ2В и два К1533ТМ9); 10 счетчиков (5 x К555ИЕ19, 3 x К555ИЕ2, и по одному К555ИЕ5, К555ИЕ7); 5 мультиплексоров К155КП7; 6 буферных микросхем (2 x КМ555ЛИ1, 4 x КР1533ЛН2); преобразователь «напряжение – частота» (ПНЧ) КР1108ПП1 –1 шт.; аналоговый коммутатор КР590КН6 –1 шт; «сороконожка» (порт ввода-вывода) КР580ВВ55А. Ну, и резисторы, конденсаторы… К удивлению своему, я не обнаружил там микросхему серии ПВ (АЦП в интегральном исполнении), это сильно упростило бы конструкцию. Причем минимум треть перечисленного хозяйства собственно к АЦП не имеет никакого отношения. Дело в том, что к прибору может подключаться еще и LCD-модуль (экранчик на фото вверху). В данной работе он не рассматривается, но в следующем семестре мне как пить дать припашут его программирование. Об этом известно точно. Несмотря на то, что железка довольно древней конструкции, экранчик этот вполне современный – DATA IMAGE CM1621 (CM160200). Он нужен для применения прибора во встраиваемых системах, чтобы не использовать компьютерный монитор. Упомянутые выше две кнопки позволяют избавиться и от клавиатуры. На экранчик этот выводит свои сообщения тестовая программа. Немного покопавшись в ней Turbo Debugger’ом, можно найти функции управления LCD. Ну, так вот. Часть схемы на плате как раз и нужна для подключения этого дисплея. Не исключено так же, что под него задействована и какая-то из функций 63h прерывания. 5. При разборе 63h мы предполагали, что единственный входной параметр там – значение AH (от 0 до 4). А, может быть, при некоторых значениях AH нужны еще какие-нибудь параметры в других регистрах? Может быть, ими и задают номер нужного канала (чтобы опрашивать только этот выбранный канал, а не восемь последовательно)? И может ли вообще этот номер задаваться извне (или это «личное дело» самой железки)? Честно говоря, кроме функции 3 int 63h я так и не уяснил смысл остальных (например, каким образом происходит сброс прибора). По-моему, нужно все-таки добить до конца 63h. Последний раз редактировалось I-Gor; 03.12.2010 в 16:11. |
03.12.2010, 04:08 | #50 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
I-Gor
1) Может быть твоего преподавателя вопрос и удивил, но я, согласись, твой АЦП не видел, в данном случае все только через тебя. Вывод результата в виде 4 шестнадцатеричных цифр ни о чем не говорит: реально АЦП может быть и 8, и 10, и 12, и 16 разрядов. 2) Цитате «При достаточно сложной логике, находящейся на плате АЦП (там тоже может быть микропроцессор) можно организовать обмен…» предшествует «...как бы эту схему и программу к ней разрабатывал бы я сам…» и далее идут мои размышления. 3) Релейные входы пока рассматривать не будем. 4) При разборе 63h мы предполагали, что единственный входной параметр там – значение AH (от 0 до 4). А, может быть, при некоторых значениях AH нужны еще какие-нибудь параметры в других регистрах? Может быть, ими и задают номер нужного канала (чтобы опрашивать только этот выбранный канал, а не восемь последовательно)? И может ли вообще этот номер задаваться извне (или это «личное дело» самой железки)? Честно говоря, кроме функции 3 int 63h я так и не уяснил смысл остальных (например, каким образом происходит сброс прибора). По-моему, нужно все-таки добить до конца 63h. А ты пишешь "Я считал работу по существу выполненной" а еще несколькими постами выше, где разбор программы практически и не начинался, ты уже писал: «Следовательно, вторую часть задания групповыми усилиями mss и Tronx’а я считаю в принципе выполненной. Осталось только навести марафет. Ну, это уж мои проблемы. Если возникнут какие-то вопросы, напишу... Собственно программа взаимодействия с пользователем там до неприличия проста. Это будет бесконечный цикл, выводящий на экран некую последовательность целых чисел (значение функции опроса). Потребуется также обработка нажатия какой-либо клавиши для выхода из этого бесконечного цикла, когда надоест. Возможно, нужна будет пара-тройка операторов для организации паузы внутри цикла, чтобы выводимая инфа не мельтешила на экране слишком часто. Для такой фигни, по-моему, достаточно и QBasic’а. Например: DECLARE FUNCTION ACPquery () DO PRINT ACPquery IF INKEY$ = CHR$(27) THEN EXIT DO LOOP FUNCTION ACPquery … END FUNCTION Можно, конечно, разукрасить экран, сделать более удобочитаемым вывод, однако особого смысла нет. «Соль» задачи не в этом: необходимо прописать функцию опроса (ACPquery в данном примере)... » Там работы еще очень много 5) Мне до сих пор не понятна роль обработчика 1Ch прерывания, которое вызывается 19 раз в секунду. Не понятен вопрос с использованием портов, и даже не известно их количество, хотя номер базового порта, я думаю 320h... 6) Ты не написал о замене в proc_5 фрагмента ;================================== ============== in al, dx ; читаем содержимое 320h порта в AL mov ah, al ; AH = AL inc dx ; DX = 321h in al, dx ; читаем содержимое 321h порта в AL xchg al, ah dec dx ;================================== ============================== на ;================================== ============== in ax, dx ; читаем содержимое 320h порта в AX ;================================== ============================== и посмотри что получится (возможно придется использовать вариант с in ax,dx / xchg al,ah) Последний раз редактировалось Mikl___; 03.12.2010 в 04:29. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Драйвер 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 |