Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обращение к портам самодельного устройства 
:(
    Опции темы
bagira
Дата 27.10.2003, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2858
Регистрация: 25.10.2003
Где: в тайге Уральских гор

Репутация: нет
Всего: 123



Baa, спасибо за совет! Когда я сделала задержки после IN и OUT, программа начала обращаться к портам. До этого, данные, отправленные с контроллера, "зависали" и могли быть считаны при последующем запуске старой программы под DOS. Теперь старая программа их не находит, значит обращение к портам происходит правильно. Но дальше они (данные) куда-то исчезают, и не появляются в основной программе после вызова процедуры из DLL. Может быть, я неправильно передаю полученный из порта в AL байт в переменную? Например, MOV byte ptr D1,AL.


--------------------
Сегодня ты не бродил, не искал, не любил - можно сказать - и не жил...
Ф.Х. Дагларджа (Турция)
http://zveriolginovour.ru/
https://vmeste.yandex.ru/zveriolginovour 
PM MAIL WWW ICQ   Вверх
remax
Дата 29.10.2003, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: нет
Всего: 5



Может это и банально, но в пошаговом режиме через отладчик Вы проверяли работу дельфийской программы? Это должно однозначно снять вопрос с правильностью вывода в порт -
1.Остановились перед командой OUT, проверили выходы порта
2.Выполнили команду OUT, проверили выходы порта

Влияние времени исключается.


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
bagira
Дата 29.10.2003, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2858
Регистрация: 25.10.2003
Где: в тайге Уральских гор

Репутация: нет
Всего: 123



Я пыталась воспользоваться отладчиком Дельфи еще в самом начале этих проблем, но не нашла, где там смотреть номера портов? Подскажите, пожалуйста. Вопрос с выводом в порт решился, как ни странно, еще банальнее - с помощью набора из 8-ми светодиодов, который сегодня по моей просьбе сделали наши электронщики. Плату со светодиодами подцепили к выходному порту, и теперь все, что я вывожу, наглядно видно в 8-ми разрядах: 1 - светодиод горит, 0 - не горит. Так что с выводом стало более-менее ясно. Но не работает команда ввода данных во входные порты (IN), или данные теряются где-то дальше - при передаче между DLL и основной программой, т.е. в основную программу приходят одни нули. Как проверить, куда исчезают данные?


--------------------
Сегодня ты не бродил, не искал, не любил - можно сказать - и не жил...
Ф.Х. Дагларджа (Турция)
http://zveriolginovour.ru/
https://vmeste.yandex.ru/zveriolginovour 
PM MAIL WWW ICQ   Вверх
remax
Дата 29.10.2003, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: нет
Всего: 5



Цитата
Я пыталась воспользоваться отладчиком Дельфи еще в самом начале этих  проблем, но не нашла, где там смотреть номера портов?


При отладке ассемблерной части проги Вы идете по командам, а номер порта сидит в регистре DX (см окно регистров).

Цитата


Но не работает команда  ввода данных во входные порты (IN), или данные теряются где-то дальше - при передаче между DLL и основной программой, т.е. в основную программу приходят одни нули. Как проверить, куда исчезают данные?



Используй отладчик! biggrin.gif biggrin.gif biggrin.gif

А если не получается - поставь в тектсте программы вывод промежуточных сообщений. Например, на дисплей или в файл. Т.е. в контрольных точках поставить вызов вспомогательной процедуры выводящей информацию о состоянии регистра. Но лучше всего - разберись с отладчиком - там можно использовать точки останова, просмотр содержимого переменных и регистров....


P.S. А еще проще - убедись, что правильно передаешь значение мз DLL - взяв за основу свой принцип построй упрощенную DLL передающую наперед известное значение. Получилось - проблема не связана с передачей. Не получилось - исправляй.


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
Baa
Дата 30.10.2003, 04:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: нет
Всего: 12



Цитата
При отладке ассемблерной части проги Вы идете по командам, а номер порта сидит в регистре DX (см окно регистров).

Че за бред?
С какой стати он там сидит?
Код

 in al, 61h
 or al, 3
 out 61h, al

Ну и где он здесь сидит в DX?


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
December
Дата 30.10.2003, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: нет
Всего: 57



Baa Для другой формы команды IN порт должен сидеть в DX.


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
man2002ua
Дата 30.10.2003, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 943
Регистрация: 12.11.2002
Где: Киев

Репутация: нет
Всего: 2



может я недопонимаю, но если необходимо выжидать больше секунды, то функция Sleep должна подходить для этих целей... почему не попробовать?


--------------------
"Нет ничего более постоянного, чем временное"
PM MAIL   Вверх
Dmitry V.Abramov
Дата 30.10.2003, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 30.9.2003
Где: Saint-Petersburg

Репутация: нет
Всего: 4



man2002ua Там ведь еще и DLL зачем-то прикручена. Причем, возможно, сидящая в отдельном потоке и непонятно чем занимающаяся. При такой схеме sleep может приостанавливать вовсе не то, что требуется.
--------------------
/DVA
PM MAIL WWW   Вверх
man2002ua
Дата 30.10.2003, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 943
Регистрация: 12.11.2002
Где: Киев

Репутация: нет
Всего: 2



ну я не думаю, что используется оконная dll... речь наверняка идет об экспорте обычных функций (Bagira говорила - stdcall). В любом случае, увидеть весь код не помешает.


--------------------
"Нет ничего более постоянного, чем временное"
PM MAIL   Вверх
Baa
Дата 30.10.2003, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: нет
Всего: 12



Цитата
Baa Для другой формы команды IN порт должен сидеть в DX.

можно поподробней? Енто про тот случай, когда порт должен быть больше 255?


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Dmitry V.Abramov
Дата 30.10.2003, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 30.9.2003
Где: Saint-Petersburg

Репутация: нет
Всего: 4



Baa Зачем же так...

В любом случае. Особенно, когда не хочется жестко привязываться к номеру порта. Ведь никто, надеюсь, не отрицает наличие инструкции mov al, [bx] ?
Код
IN -- Input from Port

Opcode    Instruction   Clocks            Description

E4  ib    IN AL,imm8    12,pm=6*/26**     Input byte from immediate port
                                         into AL
E5  ib    IN AX,imm8    12,pm=6*/26**     Input word from immediate port
                                         into AX
E5  ib    IN EAX,imm8   12,pm=6*/26**     Input dword from immediate port
                                         into EAX
EC        IN AL,DX      13,pm=7*/27**     Input byte from port DX into AL
ED        IN AX,DX      13,pm=7*/27**     Input word from port DX into AX
ED        IN EAX,DX     13,pm=7*/27**     Input dword from port DX into
                                         EAX


INS/INSB/INSW/INSD -- Input from Port to String

Opcode  Instruction    Clocks         Description

6C      INS r/m8,DX    15,pm=9*/29**  Input byte from port DX into ES:(E)DI
6D      INS r/m16,DX   15,pm=9*/29**  Input word from port DX into ES:(E)DI
6D      INS r/m32,DX   15,pm=9*/29**  Input dword from port DX into ES:(E)DI
6C      INSB           15,pm=9*/29**  Input byte from port DX into ES:(E)DI
6D      INSW           15,pm=9*/29**  Input word from port DX into ES:(E)DI
6D      INSD           15,pm=9*/29**  Input dword from port DX into ES:(E)DI

Для out/outs - аналогично.
--------------------
/DVA
PM MAIL WWW   Вверх
bagira
Дата 31.10.2003, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2858
Регистрация: 25.10.2003
Где: в тайге Уральских гор

Репутация: нет
Всего: 123



Привет всем!
1. В DLL - в процедуре обращения к портам - почему-то выдается сообщение об ошибке при:
mov dpn,al,
где dpn - переменная объявлена как byte, а в аккумулятор считан байт из порта:
in al,dx (потом - временная задержка)
Когда изменила конструкцию:
mov byte ptr dpn,al
то ошибка выдаваться перестала, но в основную программу нужное число все равно не передается.
Убрала вообще строку с командой in, напрямую задаю:
mov byte ptr dpn,7

Но результат тот же - вместо семерки в основную программу попадает ноль.

2. Проверить в пошаговом режиме с отладчиком опрос портов сегодня не удалось - у меня временно отобрали кабель для подключения прибора к ЭВМ. Дождусь понедельника.

3. man2002ua, не знаю, стоит ли приводить весь код - он довольно громоздкий, но позднее я приведу фрагмент непосредственного чтения портов.

А сейчас - до свидания - заканчивается карточка Internet.


--------------------
Сегодня ты не бродил, не искал, не любил - можно сказать - и не жил...
Ф.Х. Дагларджа (Турция)
http://zveriolginovour.ru/
https://vmeste.yandex.ru/zveriolginovour 
PM MAIL WWW ICQ   Вверх
man2002ua
Дата 1.11.2003, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 943
Регистрация: 12.11.2002
Где: Киев

Репутация: нет
Всего: 2



да, код чтения/записи порта не помешал бы. И еще размеры задержек, к-е должны быть установлены для нормальной работы


--------------------
"Нет ничего более постоянного, чем временное"
PM MAIL   Вверх
p0s0l
Дата 1.11.2003, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Цитата
Когда изменила конструкцию:
mov byte ptr dpn,al
то ошибка выдаваться перестала, но в основную программу нужное число все равно не передается.
Убрала вообще строку с командой in, напрямую задаю:
mov byte ptr dpn,7

Но результат тот же - вместо семерки в основную программу попадает ноль.

bagira, а ты как связываешь переменные в DLL и переменные в основной программе ? Из приведенного кода я предполагаю, что ты просто объявила в DLL и в основной программе переменную dpn и думаешь, что при её изменении в DLL, она автоматом будет меняться и в основной программе ?
Это не так. Самый простой способ - это создать разделяемую память (CreateFileMapping, MapViewOfFile) и туда поместить все переменные, которые должны быть доступны как для DLL, так и для основной программы.



--------------------
С уважением, г-н Посол.
PM   Вверх
man2002ua
Дата 1.11.2003, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 943
Регистрация: 12.11.2002
Где: Киев

Репутация: нет
Всего: 2



Цитата
(CreateFileMapping, MapViewOfFile

проще объйявить импортируемую преременную...
извините, если плолхо пишу... снова ДР.


--------------------
"Нет ничего более постоянного, чем временное"
PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0633 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.