![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с портом с конкретным адресом. Запись и чтение [D7]
Velimir © (2006-04-24 14:18:00)Собсно сабж!
Какими в дельфи есть встроенные функции для работы с портом, если у меня есть адрес этого порта...
Хотелось бы найти аналог outport и inport из С.
Сорри если вопрос очень тупой, но я нигде не нашел этих функций... Действительно, как-то тормозом себя чуствую...
Заранее всем спасибо за помощь!
!Fobos (2006-05-10 08:45:00) [21]
> Сергей М. © (10.05.06 08:43) [41]
То есть, я так понимаю, я тратил время зря?
Сергей М. (2006-05-10 08:43:00) [22]
> !Fobos © (10.05.06 08:17) [40]
> На паскалевском варианте программы написана процедура обработки
> прерывания. Как перевести её на Делфи я пока понятия не
> имею, но мне кажется что проблема сейчас именно в этом.
Если дивайс генерирует прерывания, то без драйвера режима ядра тем более не обойтись. И Делфи здесь не помощник - среда эта не предназначена для таких задач.
!Fobos (2006-05-10 08:17:00) [23]
> Сергей М. © (06.05.06 15:53) [37]
Документации на девайс нету, разве что дипломная работа.
Массив, как мне кажется, забивается разными значениями, т.к., синусоиду, к примеру, прога рисует нормально(то есть она синусоида, а не прямая линия).
На данный момент проблема именно в считывании сигнала с порта(кэш-памяти), остальное все уже практически переписал для Делфи. Сейчас програма что-то считывает, но это явно не тот уже хотя бы потому, чьл какой бы я номер порта не ставил, картинка выглядит одинаково. На паскалевском варианте программы написана процедура обработки прерывания. Как перевести её на Делфи я пока понятия не имею, но мне кажется что проблема сейчас именно в этом.
isasa (2006-05-07 11:46:00) [24]Умные дадьки и тетки карячились, думали, как заставить это железо одновременно читать порт, слушать музыку, ограть в Blitzkriag ... а ты со своими командами :)
В, общем, выхода два:
1. Послать дядек и теток, загрузить Win98 и ниже, и наслаждаться.
2. "Вписать" работу с железом в требования дядек и теток(т.е. на уровне драйверов), и работать через CreateFile.
krid24 (2006-05-06 18:14:00) [25]
> Ну а причем здесь ISA ?
Да вобщем-то ни причем, просто !Fobosговорил про плату на ISA шине.
> Плюс еще в первоначальной проге используются 2 порта с адресами
> $20 и $21. Что за порты, ума не приложу, возможно они испоьзуются
> для обработки прерываний...
В принципе да, эти порты используются при программировании контроллера прерываний.
Сергей М. (2006-05-06 15:53:00) [26]procedure DataIn(PortAddress:word);
var
ByteValue:byte;
Addr: Word;
begin
Addr := PortAddress; //параметр PortAddress передается через eax, запомним его в лок.переменной
for i:=0 to 32767 do
begin
asm
push eax
push edx
mov dx, Addr
in al,dx
mov ByteValue,al
pop edx
pop eax
end;
Data[i]:=ByteValue;
end;
end;
procedure DataOut(ByteValue:byte;PortAddress:word);
asm
//ByteValue передается в eax
//PortAddress - в edx
out dx,al
end;
> массив забивается практически одними и теми же значениями
А где написано, что должен разными ?
Док-ция на дивайс от производителя имеется ?
!Fobos (2006-05-06 14:48:00) [27]
> Сергей М. © (06.05.06 09:06) [35]
Вот две процедурки работы с портом:
procedure DataIn(PortAddress:word);
var
ByteValue:byte;
begin
asm
push dx
mov dx, PortAddress
end;
for i:=0 to 32767 do
begin
asm
in al,dx
mov ByteValue,al
end;
Data[i]:=ByteValue;
end;
asm
pop dx
end;
end;
procedure DataOut(ByteValue:byte;PortAddress:word);
asm
push dx
mov dx,PortAddress
mov al,ByteValue
out dx,al
pop dx
end;
Запуская программу в пошаговом режиме и следя за массивом Data я заметил, что вне зависимости от того, к какому порту я обращаюсь, этот массив забивается практически одними и теми же значениями...
Плюс еще в первоначальной проге используются 2 порта с адресами $20 и $21. Что за порты, ума не приложу, возможно они испоьзуются для обработки прерываний...
Сергей М. (2006-05-06 09:06:00) [28]
> !Fobos © (06.05.06 08:22) [34]
Приводи код.
!Fobos (2006-05-06 08:22:00) [29]Мда...думаю, что здесь мне никто ничем конкретным не поможет...((
Процедурку чтения из порта (а также процедурку записи управляющего слова) я написал на ассемблере, научил винду ХР-шную не ругаться на асм-вставки (не смейтесь надо мной:))). Вроде что-то читается, но почему то кажется, что читается не то, что нужно. Может ли кто объяснить, как, вызывая чтение из кэш-памяти в массив 32000 раз можно забить весь массив значениями, а точнее откуда она (кэш-память ну или что там за это отвечает) знает, что при каждом следующем обращении к ней мне надо считать следующий байт?
Вы уж извините, если я задаю глупые вопросы....программер из меня не ахти...
Сергей М. (2006-05-05 08:22:00) [30]
> krid24 © (04.05.06 20:51) [31]
Ну а причем здесь ISA ?
Все тоже самое настолько же справедливо для любого другого дивайса на любой другой шине ..
И WinAPI здесь тоже ни причем, пока речь не идет о взаимодействии с драйвером дивайса документированным способом (CreateFile, Read/WriteFile, DeviceIOControl).
!Fobos (2006-05-05 08:04:00) [31]
> krid24 © (04.05.06 20:51) [31]
Согласен с тобой. Для "моего" устройства не было написано драйвера (еще раз повторюсь, что не я изначально разрабатывал плату и софт). Есть только программа, обслуживающая плату.
А что тебя конкретно интересует по плате? Это устройство сбора данных. Как уже писал выше, чтение производится из кэш-памяти по адресу $300.
krid24 (2006-05-04 20:51:00) [32]Да с какой моей колокольни-то?
Если есть ISA плата, которая (упрощенно) в один порт принимает параметры сигнала, в другой код старта и начинает непрерывно этот сигнал генерить до тех пор, пока не получит код останова, то на кой ей драйвер-то нужен? Писать для какого-нибудь простейшего генератора сигналов WDM?? Ну-ну.. Нужно тогда уж еще и в Microsoft драйвер оттестировать и цифровую подпись получить..
А ведь большое колличество самопальных ISA плат, сделаных для внутреннего пользования, являются чем-то подобным. И именно их я и имел ввиду (а не сплошь и рядом все девайсы подряд, о чем, кстати, говорил).
Так что, не соглашусь с уважаемыми оппонентами - никаких драйверов для такого рода плат не нужно по-определению. В них просто нет необходимости.
Впрочем, автор вопроса не сказал, что у него за плата, так что спор по сути дела безпредметный получается.
Сергей М. (2006-05-04 15:30:00) [33]
> krid24 © (04.05.06 15:14) [28]
Ты несешь несусветицу, видимую тобой лишь с твоей колокольни.
Wal (2006-05-04 15:30:00) [34]
> Ну по этой логике тот же DOS вообще бы не работал
Дос был однозадачным в доску, в отличие от виндовса.
> Так, что возможный бардак зависит не от возможности обращаться
> к портам, а от кривых рук разработчиков
Вот поэтому разработчики с прямыми руками всегда предоставляют драйвера.
> Я сам работал не с одной ISA платой
Я тоже работал не с одной платой, и не только ISA. В ДОСе без всяких драйверов. В винде тоже можно без драйверов с тем же giveio, но это "костыли", а не нормальная работа.
krid24 (2006-05-04 15:14:00) [35]
> Глупости.
> Столь же "необязателен" драйвер для любого другого периферийного
> дивайса на любой другой шине.
Ничего подобного. Не надо все мешать в одну кучу. Речь идет о конкретных платах. Я сам работал не с одной ISA платой, которые не требовали никаких драйверов и управлялись только через порты. И есть девайсы, которые в обязательном порядке требуют драйверов, садятся на прерывания, etc.
> А потом запускаешь еще косой десяток оных "прог", и все
> они наперегонки начинают выполнять свои IN и OUT к одному
> и тому же порту. Бардак-с) ..
Ну по этой логике тот же DOS вообще бы не работал :) На самом деле никакого бардака не будет. Во-первых, несколько инструкций IN одновременно не выполнишь ). Во-вторых, во многих платах предусмотрены задержки после выполнения операций, связанных с доступом к ним по портам. В-третьих, такие же задержки предусматривают и в программах (в тех же драйверах). Так, что возможный бардак зависит не от возможности обращаться к портам, а от кривых рук разработчиков )
Ну а тот же драйвер giveio может спокойно обслуживать все процессы в системе, будь их десяток или сотня.
Сергей М. (2006-05-04 13:32:00) [36]
> krid24 © (04.05.06 13:26) [26]
> Для ISA платы это не обязательно.
Глупости.
Столь же "необязателен" драйвер для любого другого периферийного дивайса на любой другой шине.
> из проги его динамически загружаешь, обращаешься к портам
> асмовыми in и out
А потом запускаешь еще косой десяток оных "прог", и все они наперегонки начинают выполнять свои IN и OUT к одному и тому же порту. Бардак-с) ..
krid24 (2006-05-04 13:26:00) [37]
> Если дивайс "собран своими руками", то первое что должно
> прийти в голову - написание драйвера этого дивайса под требуемую
> ОС
Для ISA платы это не обязательно.
> как в Делфи обращаться к портам I/O.
Это от системы зависит, а не от языка. А вообще, во втором посте уже ответили - ищешь в инете драйвер giveio.sys (например), из проги его динамически загружаешь, обращаешься к портам асмовыми in и out, потом драйвер выгружаешь. Все. Ну это для NT, а в Win9x можешь напрямую in/out юзать.
Elen (2006-05-04 13:19:00) [38]
>!Fobos ©
Поищи компоненты работы с портом. А вообще помоему CreateFile и вариант с ассемблером (см. выше) лучше не придумаеш для Делфи
Сергей М. (2006-05-04 13:18:00) [39]
> вариант с ассемблером (см. выше)
Где там, "выше", про ассемблер ?
Elen (2006-05-04 13:15:00) [40]
>!Fobos ©
Поищи компоненты работы с портом. А вообще помоему CreateFile и вариант с ассемблером (см. выше) лучше не придумаеш для Делфи