sterowanie portem LPT w WIN XP

0

Witam

Bardzo chciałbym sie dowiedzieć w jaki sposób moge sterować portem LPT w WIN XP. W windowsach 98/ME sprawa była prosta bo można było użyć asemblera. W WIN XP jako że jest z rodziny NT cos takiego jest niedopuszczalne. Wiem, że istnieje wiele gotowych bibliotek, które posiadają funkcje takie jak zapis/odczyt pojedynczych bitów portu LPT. Ja chciałbym jednak w końcu dowiedzieć się jak to się robi, żeby bez korzystania z gotowych bibliotek pisac programy obslugujace ten port.

Pozdrawiam

0

otworz plik np LPT1

0

a moge dostać wiecej szczegolow na ten temat? :-|

0

a co tu wiecej pisac? obslugujesz port jak zwykly plik

0

LPT1 to port bazowy i ma adres 0x378. z nim sobie poradzilem ale jak wysterowac rejestry o adresach LPT1+1 (0x378 + 1) i LPT1+2 (0x378 + 2) ???????? :-|

0

Może jednak lepiej użyć np. WinIO ze strony internals.com?

0

ale mi chodzi o wyjasnienie jak sie to robi. Użycie gotowej biblioteki to pójście na łątwizne.
Czy na forum naprawde nikt nie jest w stanie powiedzieć od początku do końca jak zrobić żebym mógł programowo ustawiać poszczegolne bity rejestrów 0x378, 0x378 +1 i 0x378+2 ??????
Bardzo mi zalezy na tym....

0

W Windows nie robi się tego po prostu ustawiając bity pod odpowiednimi adresami.
Przeczytaj powyższe posty. LPT obsługuje się jak pliki.

Poczytaj sobie o systemowych funkcjach CreateFile, ReadFile, WriteFile, CloseHandle (tyle powinno Ci na początek wystarczyć). Nazwa pliku jaki będziesz otwierał to chyba np.: "LPT1" i tyle.

0
Szczawik napisał(a)

W Windows nie robi się tego po prostu ustawiając bity pod odpowiednimi adresami.
Przeczytaj powyższe posty. LPT obsługuje się jak pliki.

Poczytaj sobie o systemowych funkcjach CreateFile, ReadFile, WriteFile, CloseHandle (tyle powinno Ci na początek wystarczyć). Nazwa pliku jaki będziesz otwierał to chyba np.: "LPT1" i tyle.
Nie zrozumiałeś go - on wie jak sterowac LPT za pomoca pliku - problem w tym, że to działą wg. niego jedynie na adres bazowy, czyli tylko na piny d0-d7 w LPT, problem polega na tym jak wysterować $378+1/+2 czyli pozostałe rejestry LPT odpowiedzialne za inne pint w LPT.

0

Widze, ze kolega Qyon zrozumial moj problem :) .
Powiem moze teraz o co mi w ogole chodzi i moze ktos po przeczytaniu mi pomoze.
Otoz buduje programator rownolegly procesorow AVR. Zeby nie komplikowac ukladu elektronicznego zrezygnowalem z interfejsu USB oraz RS-232 i postanowilem wykorzystac LPT. Zeby zaprogramowac procesorek AVR (np. ATMEGA8) rownolegle potrzebuje 8 bitow WE/WY, 9 bitow WY oraz 1 bit WE od strony PC-ta. Port LPT posiada 8 bitow WE/WY, 4 bity WY oraz 5 bitow WE. Dodatkowo uzyje rejestru przesuwnego 4094 zeby z 3 bitow WY zrobic 8 bitow WY, ale to akurat nie jest istotne.
I co mi potrzeba? Otóż potrzeba mi kodu, dzięki któremu bede mogl potraktować port LPT jako maszyne 17-bitową, gdzie 8 bitów jest WE/WY, 4 bity sa WY i 5 bitów jest WE.
Te wszystkie bity są w przestrzeni adresowej PC-ta umieszczone w 3 rejestrach o adresach 378h, 379h i 37Ah (standardowo). Dzięki funkcjom API takich jak ReadFile() WriteFile() mam teoretycznie dostep tylko do rejestru 378h.
W programiku testowym uzylem nastepujacego kodu:

//

*******************************************************************
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HANDLE  LPTport=CreateFile("LPT1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
     if(LPTport==INVALID_HANDLE_VALUE)
     {
     MessageBox(NULL,"Impossible open this LPT port","Error",MB_OK);
     ExitProcess(1);
     }
BYTE *ByteOut=0xFF;
DWORD CountByte;

WriteFile(LPTport,ByteOut,sizeof(ByteOut),&CountByte,NULL);
CloseHandle(LPTport);
}
//*******************************************************************

jednak on nie działa. Na wyjsciach LPT D0..D7 nie zmienia sie stan i caly czas panuje tam stan niski na wszystkich 8 wyjsciach. (Dodam ze swobodnie moge zmieniac za pomoca funkcji z biblioteki IO.dll pobranej z jakiejs stronki w necie)
Mam wobec tego kilka pytań dla osob ktore naprawde wiedza o co chodzi:

1. Czy w WIN XP do sterowania LPT potrzeba dodatkowego drivera (*.sys) ?
2. Jak mam sie dobrać do rejestrów 379h i 37Ah ? Czy mam użyć struktury DCB tak jak w przypadku korzystania z COM ?

0

Mały off-topic: nie lepiej programowac tą kostke przez SPI?

0

oczywiscie ze lepiej :)
ale jesli wyjscie RST jest ustawione jako port WE/WY jest to niemożliwe i zeby moc programowac przez SPI trzeba ustawic to wyjscie jako RESET a tego mozna dokonac tylko w sposob równoległy... :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1