logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.
REKLAMA
  • Jest to dość krótkie FAQ zawierające podstawowe informacje dotyczące obsługi portu LPT

    Architektura LPT:

    Port ten posiada 25 pinów, nas przede wszystkim interesują od 2, do 9, są odpowiedzialne za wysyłanie danych, ale także za odbieranie, o ile port jest dwukierunkowy. W nowszych komputerach nie spotyka się jednokierunkowych, na których można było tylko wysyłać.
    LPT FAQ
    Jest to widok z przodu portu LPT, tak jak patrzymy na niego patrząc na komputer. Piny, o których wcześniej mówiłem są oznaczone D0-D7, od Data – dane. Na każdym może być jednocześnie jeden stan logiczny – bit 0, lub 1, a ponieważ jest ich 8, port ten nazywamy 8 bitowym.
    Ale to nie wszystkie ważne dla nas piny, kolejne to te oznaczone kolorem zielonym 18-25, jest to masa. Do większości projektów tylko tych pinów będziesz używał więc w reszte się nie będziemy zagłębiać. Chcesz wiedzieć więcej, to sprawdź bibliografię na końcu.

    Biblioteki:

    Aby programować na początek musimy posiadać jakieś biblioteki, które wykonają potrafią ów port obsługiwać.
    Biblioteki do najbardziej popularnych systemów operacyjnych.
    a) MS DOS
    - C/C++ - DM&P Serial Port DOS Library http://www.dmp.com.tw/tech/dmp-lib/serport/
    b)Windows 95/98/NT/2K/XP
    - C / C++/ Pascal / Basic/ Java / C#- NTPort- http://www.zealsoftstudio.com/ntport/
    - C / C++ - WinIO - http://www.internals.com/
    b) Linux
    - C – Perapin- http://parapin.sourceforge.net/

    Przyznam się, że programuję pod Windows 2K, za pomocą C++ używam, NTPort i wszystko ładnie działa. Nie miałem możliwości sprawdzić pozostałych bibliotek a informacje o językach, w których działają brałem ze stron producentów.

    Prosty program:

    Przed rozpoczęciem programowania należy znać jeszcze adres LPT, czyli ‘378h’
    I tutaj kilka przykładów:
    Windows/NTPort/C++
    nAddress = GetLPTPortAddress(1);//Biblioteka ta pozwala nam znaleźć adres portu LPT, ale możemy też go wpisać ręcznie…
    <br/>Outport(nAdress, 0x01);//zapisuje na porcie LPT1 na  D0 bit 1
    <br/>


    Windows/WinIO/C++
    InitializeWinIo();//ta biblioteka wymaga włączenia
    <br/>SetPortVal(0x378, 0x01, 1) ;// zapisujemy na porcie LPT1 na  D0 bit 1
    <br/>ShutdownWinIo();// i zamykamy bibliotekę
    <br/>


    Linux/C++
    #include <fcntl.h>
    <br/>#include <unistd.h> 
    <br/>const int CTL_PORT=0x378+2; 
    <br/>const int ON=0x01; 
    <br/>int main()
    <br/>{ 
    <br/>int fd; 
    <br/>unsigned char command=ON; 
    <br/>fd=open("dev/port", O_WRONLY, 0);
    <br/>lseek(fd, CTL_PORT, SEEK_SET); 
    <br/>write(fd, &command, 1);// zapisujemy na porcie LPT1 na  D0 bit 1
    <br/> } 
    <br/>


    Dos/Pascal
    program silniki;
    <br/>uses crt,dos;
    <br/>const adres=$378;{dla LPT1 i $278 dla LPT2}
    <br/>procedure silnik(numer:byte;komenda:char);
    <br/>var d,a,b:byte;
    <br/>begin
    <br/>d:=port[adres];
    <br/>case numer of
    <br/>1:a:=$fc;
    <br/>2:a:=$f3;
    <br/>3:a:=$cf;
    <br/>4:a:=$3f;
    <br/>end;
    <br/>case komenda of
    <br/>'p':begin {prawo}
    <br/>b:=1 shl ((numer-1)*2);
    <br/>port[adres]:=(d and a)+b;
    <br/>end;
    <br/>'l':begin {lewo}
    <br/>b:=2 shl ((numer-1)*2);
    <br/>port[adres]:=(d and a)+b;
    <br/>end;
    <br/>'s':port[adres]:=(d and a)+b; {stop}
    <br/>end;
    <br/>end;
    <br/>begin
    <br/>clrscr;
    <br/>writeln('Silniki.');
    <br/>silnik(1,'p');
    <br/>end.
    <br/>


    A co zamiast 0x01?

    Jak już wspomniałem port LPT jest 8-bitowy, stan tych bitów możemy łatwo wyrazić jedną liczbą w systemie binarnym(tzw. zerojedynkowym) np., jeśli chcemy na D0 wysłać bit 1, a na pozostałych 0, tak jak to robiliśmy w przykładach, to liczba, jaką wysyłamy wygląda tak: 00000001, a jeśli, na co drugim ma być 1, a reszta 0, to wygląda to tak: 10101010, ale co z tego? Właśnie to, że kiedy zamienimy tą(00000001) liczbę na system szesnastkowy to powstanie nam 01, czyli dokładnie to, co podawaliśmy do tej pory! A teraz druga liczba:
    10101010 po zamianie na 16-stkowy równa się ‘AA’(dla niewtajemniczonych: ponieważ znamy tylko 10 cyfr, a w systemie 16-stkowym jest ich 16, cyfry powyżej dziewięciu zastąpiono kolejnymi literami alfabetu czyli: 10=>A, 11=>B ... 15=>F) Myślę że teraz jest wszystko jasne i jeśli chcemy na przykład ustawić taką wartość pinów D0-D7: 10101010, to do kodu w miejsce 0x01 wstawiamy 0xAA. Należy pamiętać, że ostatnia cyfra(w tym wypadku 0) odpowiada wartości pniu D0, a nie D7!


    Przykładowe projekty
    http://www.funducode.com/freec/Hardware/new_hi_c03/Article03.htm
    http://www.eres.alpha.pl/index.php?text=182
    http://www.epanorama.net/circuits/parallel_output.html
    http://www.edn.com/archives/1997/102397/22di_05.htm
    http://www.epanorama.net/circuits/lptpower.html
    Motor.gif na dole strony(kod który zamieściłem w pascalu jest właśnie do niego)

    Bibliografia:
    http://www.epanorama.net/links/project_pc.html#pc_parallel
    ftp://ftp.armory.com:/pub/user/rstevew/LPT/zha96lpt.faq
    http://www.doc.ic.ac.uk/~ih/doc/par/
    RS232 Praktyczne programowanie
    The Hardware Book
    The Complete Computer Hardware Electronics Reference
    Bajtek


    LPT FAQ

    Fajne? Ranking DIY
    O autorze
    tojatomek
    Poziom 14  
    Offline 
    tojatomek napisał 156 postów o ocenie 6, pomógł 7 razy. Mieszka w mieście Warszawa. Jest z nami od 2004 roku.
  • REKLAMA
REKLAMA