| imho.ws |
![]() |
|
|
|
# 1 |
|
Full Member
Регистрация: 25.11.2001
Адрес: Imho.ws
Сообщения: 941
![]() ![]() ![]() ![]() ![]() ![]() |
Всем прю
)Знач так ) дан перпендикулярный, всмысле параллельный порт (WIN98). К нему подключена система с PICmicro на борту.Язык С, (Microsoft Visual C++ 6.0) доступ к DATA-регистру идет через _outp(DATA, 0xFF); //- выводит 0xFF на весь байт input=_inp(DATA); // - записывает входящий в input Что надо: что бы можно было использовать 7 битов для вывода и 1 для ввода. По умолчанию DATA стоит на вывод (вроде) и с этим все в порядке, можно его перестасить на ввод. Но как сделать 7 вывод 1 ввод я не нашел. По идее должен быть регистр который за это отвечает....
__________________
Когда умираешь, да еще так долго и трудно, очень хочется хоть немного насолить живым, просто невозможно удержаться от искушения! М.Фрай |
|
|
|
|
# 2 |
|
Full Member
Регистрация: 31.08.2003
Адрес: где-то между Марсом и Юпитером
Сообщения: 998
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Канал данных LPT порта (EPP/ECP) двунаправленный и никаких дополнительных настроек для записи/чтения вроде бы не требуется. Управление состоянием линий осуществляется записью в порт нужного числа:
0 -- на всех линиях устанавливается лог."0"; 1 выход - 1 2 выход - 2 3 выход - 4 4 выход - 8 5 выход - 16 6 выход - 32 7 выход - 64 8 выход - 128 255 -- на всех выводах устанавливается лог. "1" Минимальная отсылаемыя и принимаемая в регистр данных величина - 1 байт, а отослать одновременно только 7 бит и в это же время принять 1 бит, я думаю неполучится. Можно зарезервировать 7 линий LPT порта для передачи и одну для приема и контролировать посылку байт так, чтобы данные передавались всегда только на выбранные лнии и считывались только с выбранной линии. Наверное, это можно сделать так: _asm{ MOV DX,0378H MOV AL,data cmp al,127 mov ah,al sub ah,128 jg re OUT DX,AL jmp nx re: OUT DX,AL mov al,ah OUT DX,AL nx:xor al,al in al, dx mov data,al }
__________________
Старые игры раздают здесь |
|
|
|
|
# 3 |
|
Full Member
Регистрация: 20.07.2002
Адрес: Находка
Сообщения: 740
![]() ![]() ![]() ![]() ![]() ![]() |
Записываем в порт число d от 0 до 64 (первые 7 выводов (бит))
_outp(0x378,d); Читем число с порта input=_inp(0x378); Проверяем интересующий нас 8-ой вывод (бит) if(input>255) { на 8-ой ноге 1 } else { на 8 ноге 0 } |
|
|
|
|
# 4 |
|
Full Member
Регистрация: 25.11.2001
Адрес: Imho.ws
Сообщения: 941
![]() ![]() ![]() ![]() ![]() ![]() |
хммм.... проблема не совсем в том..
CEO наверное ты прав. Что получается: считать весь байт из DATA-регистра. допустим (DATA - адрес порта прописанный в начале программы через #define #define PORTADRESS 0x3bc #define DATA PORTADRESS+0 #define STATUS PORTADRESS+1 #define CONTROL PORTADRESS+2 ) a=_inp(DATA); //весь порт или даже так: a=_inp(DATA) & 0x01); //только первый бит можно так же записать на весь порт _outp(DATA, 0xff); //весь _outp(DATA, _inp(DATA) | 0x01); //первый бит Проблема заключается в том, что когда я подаю +5в на какой-нить из контактов в DATA то это никак не отображаеся в регистрах. То есть порт выдает 0 (напряжние падает с +5 до +1) По ходу из-за того чот остальные биты используются для вывода этот тоже конфигурируется так. То есть как вывод а не ввод.
__________________
Когда умираешь, да еще так долго и трудно, очень хочется хоть немного насолить живым, просто невозможно удержаться от искушения! М.Фрай |
|
|
|
|
# 5 |
|
Full Member
Регистрация: 31.08.2003
Адрес: где-то между Марсом и Юпитером
Сообщения: 998
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Может эта справочная информация окажет тебе какую-нибуть помощь.
Протоколы обмена данными между LPT и внешними устройствами: Для EPP Фазы приема байта: 1. Хост сигнализирует о гоовности приема данных установкой низкого уровня на линии HostBusy. 2. ПУ в ответ помещает байт данных на линии Data [0:7] 3. ПУ сигнализирует о действительности байта установкой низкого уровня на линии PtrClk 4. Хост устанавливает высокий уровень на линии HostBusy, указывая на занятость приемом и обработкой байта. 5. ПУ отвечает установкой высокого уровня на линии PtrClk 6. Хост подтверждает прием байта импульсом HostClk Цикл записи состоит из следующих фаз. 1. Программа выполняет цикл вывода (IOWR#) в порт 4 (EPP Data Port) 2. Адаптер устанавливает сигнал Write#(низкий уровень), и данные помещаются на выхоную шину LPT-порта 3. При низком уровнеWait# устанавливается строб данных. 4. Порт ждет пожтверждения от ПУ (перевода Wait# в высокий уровень). 5. Снимается строб данных -- внешний EPP- цикл заканчивается. 6. Завершается процессорный цикл вывода. 7. ПУ устанавливает низкий уровень Wait#, указывая на возможность начала следующего цикла. --------------------------------- Сигналы EPP LPT-порта: ном вывода | название сигнала 1 Write# (HostClk) 14 DataStb# (HostBusy) 17 AddrStb# 16 Reset# 10 Intr# (PtrClk) 11 Wait 2-9 Data[0:7] 12 AckDataReq 13 Xfalg 15 DataAvail ---------------------------------- Для ECP Прямая передача данных на внешнем интерфейсе состоит из следующих шагов: 1. Хост помещяает данные на шину канала и устанавливает признак цикла данных (высокий уровень) или команды(низкий уровень) на линии HostAck. 2. Хост устанавливает низкий уровень на линии HostClk, указывая на действительность данных. 3. ПУ отвечает установкой высокого уровня на линии PeriphAck 4. Хост устанавливает высокий уровень на линии HostClk, и этот перепад может использоваться для фиксации данных ПУ. 5. ПУ устанавливает низкий уровеь на линии PeriphAck для указания на готовность к приему следующего байта. Обратная передача данных состоит из следующих шагов: 1. Хост запрашивает изменение направления канала, устанавливая низкий уровень на линии ReverseRequest#. 2. ПУ разрешает смену направления установкой низкого уровня на линии ACKReverse#. 3. ПУ помещает данные на шину канала и устанавливает признак цикла данных (высокий уровень) или команды (низкий уровень) на линии PeripAck. 4. ПУ устанавливает низкий уровень на линии PeriphClk, указывая на действительность данных. 5. Хост отвечает установкой высокого уровня на линии HostAck. 6. ПУ устанавливает высокий уровень линии PeriphCLK; этот перепад может использоваться для фиксации данных хостом. 7. Хост устанавливает низкий уровень на линии HostAck для указания на готовность к приему слеующего байта. --------------------------------------- Сигналы ECP LPT- порта ном вывода | название сигнала 1 HostClk 14 HostAck 17 1284Active 16 ReverseRequest# 10 PeriphClk 11 PeriphAck 12 AckReverse# 13 Xflag 15 PeriphRequest# 2-9 Data [0:7] --------------------------------------- EPP позволяет чередовать циклы прямой и обратной передачи не запрашивая подтверждения на смену направления обмена данными. В ECP смена направления должна быть согласована: хост запрашивает реверс установкой ReverseRequest#, после чего он должен дождаться подтверждения сигналом AckReverse.
__________________
Старые игры раздают здесь |
|
|