Форум программистов CodeGuru
13 Ноябрь 2018, 06:57:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с внешней платой. ( ввод вывод данных с определенных адрессов.  (Прочитано 13704 раз)
0 Пользователей и 1 Гость смотрят эту тему.
TIMA101
Новичок
*
Офлайн Офлайн

Сообщений: 4


Просмотр профиля
« : 18 Апрель 2006, 07:46:51 »

У меня такая проблема. Иметься у нас плата АЦП фирмы Octagon модель 5710. Она вставляется в порт ISA. Путем установки перемычек можно установить базовый адрес платы (100H, 110H, …170H). Управление платой происходит путем записывания определенных битов (байтов) в адреса платы. Например, запуск преобразования платы происходит путем записи числа 255H на адрес BASE + 0, где я понял BASE – это базовый адрес. Считывание информации также происходит с определенных адресов. В Turbo – C используют операторы outportb и inportb(например outportb(0×21, а),  inportb(BASE_5710 +2). Подскажите какие аналогичные операторы можно использовать в VC!!!

Честно говоря с понятием базового адреса я впервые столкнулся на этой плате, если у кого есть опыт работы с такой или аналогичной платы пишите и/или дайте ссылок. Это мой диплом, а осталось 1,5 месяца. Помогите бедному студенту:)

Заранее спасибо!
Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #1 : 19 Апрель 2006, 02:42:17 »

Я так понимаю, inportb - вывод в порт, inportb - чтение из порта.
Возьму на себя смелость предпоолжить, что писать под Windows будете ?
Если да, то там один стандартный способ - CreateFile(<имя_устройства>, ...) + DeviceIoControl.
Для того, чтобы так работать с устройством, для него должен быть драйвер.
Записан

TIMA101
Новичок
*
Офлайн Офлайн

Сообщений: 4


Просмотр профиля
« Ответ #2 : 20 Апрель 2006, 09:17:30 »

Мне нужно только записывать некие значения в определенные адресса платы (BASE_5710 +2)... Прерывания я уже передумал использовать  . Считывать значения я собираюсь через бит готовности. Когда он равен 1 считываю значения, жду когда он будет равен нулю и.т.п. Мне нужно лишь напрямую работать с паматью!!! Согласен даже на ДОС  . Может нужно использовать ассемблеровские вставки? Я там уж погрузился в чтение про нулевое кольцо...

Короче пишите и спасибо за оказанное внимание!!!    
 
Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #3 : 21 Апрель 2006, 00:05:56 »

Цитировать
Мне нужно лишь напрямую работать с паматью!!!

Что то я не очень понимаю.
Плата отображает свою память на адреса физической памяти ?

Я просто думал, что проблема в работе с портами под windows.

Цитировать
Согласен даже на ДОС

Под дос ограничений в работе с памятью/портами нет.
Вопрос только в том, чего же действительно (по сути вещей) необходимо сделать Улыбка
Записан

TIMA101
Новичок
*
Офлайн Офлайн

Сообщений: 4


Просмотр профиля
« Ответ #4 : 22 Апрель 2006, 21:41:01 »

Я так понял память платы как то завязана с памятью компа, если в примере Турбо - Си обращаються к плате через даресса, основываясь на базовом адрессе. Можно через асм вставку напрямую с адрессами памяти работать и вытаскивать эти значения в програму основную. Если да то пожалуйсто примерчик, буду благодарен...
Улыбка
Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #5 : 22 Апрель 2006, 21:55:44 »

Цитировать
Можно через асм вставку напрямую с адрессами памяти работать и вытаскивать эти значения в програму основную. Если да то пожалуйсто примерчик, буду благодарен...

Если это действительно так (адреса платы оттображаются на адреса физической памяти), то никакого ассемблера вообще не надо. В память и на C хорошо пишется Улыбка
Вот есть у Вас какой то "базовый" адрес BASE_5710. Допустим, надо записать 1 байт по адресу BASE_5710 + 2 (напрмер, это число 10). Что мешает сделать:
Код:
#define BYTE unsigned char

*((BYTE *)(BASE_5710 + 2)) = 10;
Записан

TIMA101
Новичок
*
Офлайн Офлайн

Сообщений: 4


Просмотр профиля
« Ответ #6 : 23 Апрель 2006, 22:00:01 »

Вы имеете в виду С - VC?  Тогда еще пожалуйсто напишите как считывать значения в программу из произвольных ячеек... Улыбка

(Добавление)
Я уже близко или туплю...

Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #7 : 24 Апрель 2006, 00:51:51 »

Цитировать
Вы имеете в виду С - VC

Да нет. C - любой.
Просто если вы хотите читать из памяти или писать в память по произвольному адресу, достаточно просто пользоваться указателями.
Читать из памяти байт по произвольному адресу. Например, так:
Код:
#define BYTE unsigned char
BYTE b = *((BYTE *)(BASE_5710 + 2));
Записан

Lexus
Новичок
*
Офлайн Офлайн

Сообщений: 4


Просмотр профиля
« Ответ #8 : 02 Май 2006, 01:33:19 »

Цитировать
Я так понял память платы как то завязана с памятью компа...

Насчет того, что она завязана с памятью компа - Это довольно большая редкость, но если это и так, то зденсь все по этому поводу описано.
Цитировать
Путем установки перемычек можно установить базовый адрес платы (100H, 110H, …170H). Управление платой происходит путем записывания определенных битов (байтов) в адреса платы...В Turbo – C используют операторы outportb и inportb(например outportb(0&#215;21, а), inportb(BASE_5710 +2). Подскажите какие аналогичные операторы можно использовать в VC!!!

В VC такого нет, если конечно нет специальной библиотеки, чего я не встречал, но обращаться к портам можно через ассемблер, пример ниже. Но одно "но" - под виндой все низкоуровневые обращения к аппаратуре блокируются.
Код:

mov ax,5h
mov dx,100h
out dx,ax             //запись в порт
in ax,dx               //чтение из порта
Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #9 : 05 Май 2006, 21:05:59 »

Цитировать
Но одно "но" - под виндой все низкоуровневые обращения к аппаратуре блокируются.

Дык, вот я и говорю - работать с портами/девайсами в винде надо через CreateFile/DeviceIoControl. Если порты "стандартные" (типа com), то для них соответствующие девайсы уже есть (COM1, COM2,...,COM9).
Открывать дескриптор для работы с портом просто:
Код:
hComm = CreateFile( "COM1",
       GENERIC_READ | GENERIC_WRITE,
       0,
       NULL,
       OPEN_EXISTING,
       FILE_FLAG_OVERLAPPED,
       NULL
       );


А вот и примерчик мониторинга событий порта нашелся: Monitoring Communications Events
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2015, Simple Machines Valid XHTML 1.0! Valid CSS!