imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 09.09.2004, 20:06     # 1
Melkor
Full Member
 
Аватар для Melkor
 
Регистрация: 25.11.2001
Адрес: Imho.ws
Сообщения: 941

Melkor Луч света в тёмном царствеMelkor Луч света в тёмном царствеMelkor Луч света в тёмном царствеMelkor Луч света в тёмном царствеMelkor Луч света в тёмном царствеMelkor Луч света в тёмном царстве
Cool биты в паралленьном порту

Всем прю )
Знач так ) дан перпендикулярный, всмысле параллельный порт (WIN98). К нему подключена система с PICmicro на борту.
Язык С, (Microsoft Visual C++ 6.0)
доступ к DATA-регистру идет через
_outp(DATA, 0xFF); //- выводит 0xFF на весь байт
input=_inp(DATA); // - записывает входящий в input

Что надо:
что бы можно было использовать 7 битов для вывода и 1 для ввода.
По умолчанию DATA стоит на вывод (вроде) и с этим все в порядке, можно его перестасить на ввод.
Но как сделать 7 вывод 1 ввод я не нашел.
По идее должен быть регистр который за это отвечает....
__________________
Когда умираешь, да еще так долго и трудно, очень хочется хоть немного насолить живым, просто невозможно удержаться от искушения!
М.Фрай
Melkor вне форума  
Старый 11.09.2004, 00:40     # 2
CEO
Full Member
 
Аватар для CEO
 
Регистрация: 31.08.2003
Адрес: где-то между Марсом и Юпитером
Сообщения: 998

CEO Имеются все основания чтобы гордиться собойCEO Имеются все основания чтобы гордиться собойCEO Имеются все основания чтобы гордиться собойCEO Имеются все основания чтобы гордиться собойCEO Имеются все основания чтобы гордиться собойCEO Имеются все основания чтобы гордиться собойCEO Имеются все основания чтобы гордиться собойCEO Имеются все основания чтобы гордиться собойCEO Имеются все основания чтобы гордиться собойCEO Имеются все основания чтобы гордиться собойCEO Имеются все основания чтобы гордиться собой
Канал данных 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 }
__________________
Старые игры раздают здесь
CEO вне форума  
Старый 11.09.2004, 05:40     # 3
V@nya
Full Member
 
Аватар для V@nya
 
Регистрация: 20.07.2002
Адрес: Находка
Сообщения: 740

V@nya Луч света в тёмном царствеV@nya Луч света в тёмном царствеV@nya Луч света в тёмном царствеV@nya Луч света в тёмном царствеV@nya Луч света в тёмном царствеV@nya Луч света в тёмном царстве
Записываем в порт число d от 0 до 64 (первые 7 выводов (бит))
_outp(0x378,d);
Читем число с порта
input=_inp(0x378);
Проверяем интересующий нас 8-ой вывод (бит)
if(input>255)
{
на 8-ой ноге 1
}
else
{
на 8 ноге 0
}
V@nya вне форума  
Старый 11.09.2004, 15:25     # 4
Melkor
Full Member
 
Аватар для Melkor
 
Регистрация: 25.11.2001
Адрес: Imho.ws
Сообщения: 941

Melkor Луч света в тёмном царствеMelkor Луч света в тёмном царствеMelkor Луч света в тёмном царствеMelkor Луч света в тёмном царствеMelkor Луч света в тёмном царствеMelkor Луч света в тёмном царстве
хммм.... проблема не совсем в том..
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)
По ходу из-за того чот остальные биты используются для вывода этот тоже конфигурируется так. То есть как вывод а не ввод.
__________________
Когда умираешь, да еще так долго и трудно, очень хочется хоть немного насолить живым, просто невозможно удержаться от искушения!
М.Фрай
Melkor вне форума  
Старый 11.09.2004, 17:10     # 5
CEO
Full Member
 
Аватар для CEO
 
Регистрация: 31.08.2003
Адрес: где-то между Марсом и Юпитером
Сообщения: 998

CEO Имеются все основания чтобы гордиться собойCEO Имеются все основания чтобы гордиться собойCEO Имеются все основания чтобы гордиться собойCEO Имеются все основания чтобы гордиться собойCEO Имеются все основания чтобы гордиться собойCEO Имеются все основания чтобы гордиться собойCEO Имеются все основания чтобы гордиться собойCEO Имеются все основания чтобы гордиться собойCEO Имеются все основания чтобы гордиться собойCEO Имеются все основания чтобы гордиться собойCEO Имеются все основания чтобы гордиться собой
Может эта справочная информация окажет тебе какую-нибуть помощь.
Протоколы обмена данными между 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.
__________________
Старые игры раздают здесь
CEO вне форума  
Старый 12.09.2004, 12:27     # 6
Melkor
Full Member
 
Аватар для Melkor
 
Регистрация: 25.11.2001
Адрес: Imho.ws
Сообщения: 941

Melkor Луч света в тёмном царствеMelkor Луч света в тёмном царствеMelkor Луч света в тёмном царствеMelkor Луч света в тёмном царствеMelkor Луч света в тёмном царствеMelkor Луч света в тёмном царстве
ок, спасибо
__________________
Когда умираешь, да еще так долго и трудно, очень хочется хоть немного насолить живым, просто невозможно удержаться от искушения!
М.Фрай
Melkor вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 22:35.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.