logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak sterować urządzeniami przez port LPT w Visual Basic 6?

sivex 15 Lip 2005 03:09 68013 98
  • #1 1655002
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Bardzo wiele osob pyta (zastanawia) sie jak sterowac urzadzeniami zewnetrznymi np silniczki, przekazniki itp za pomoca PC'eta.
    Pozwole sobie opisac ten temat mam nadzieje w prosty sposob (sam kiedys nie przespalem pare nocek).

    Wykorzystam do tego port LPT, jest idealny na poczatek :)
    Polecam darmowa biblioteke inpout32.dll do sciagniecia chociazby z:
    http://www.lvr.com/parport.htm
    i wprowadzic ja do systemu lub do katalogu gdzie znajduje sie program.

    Port LPT sugeruje ustawic jako ECP.

    W module trzeba zadeklarowac biblioteke:

    Public Declare Function Inp Lib "inpout32.dll" _
    Alias "Inp32" (ByVal PortAddress As Integer) As Integer
    Public Declare Sub Out Lib "inpout32.dll" _
    Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer)


    I juz nasz VB widzi port idealnie, bezposrednio, nie wnikajac czy jest zajety przez system czy nie. (mozna nawet podpatrywac co sie dzieje na portach nie tylko LPT). Za pomoca tej biblioteki mozna skanowac i ustawiac Com1, Com2... PS, Joystick itp.

    Nastepnie trzeba znalezc adres portu, ktory chcemy obslugiwac.
    Standartowo LPT1 ma adres 0378-037F
    Mozna to sprawdzisc w biosie lub "MoJ Komputer->wlasciwosci->Menadzer urzadzen->Porty(COM&LPT)...

    Teraz na szybko budowa portu LPT. (opisze jak dziala dla potrzeb tego postu. inne funkcje niech zostana dla dalszych rozbudowan)

    OFFSET = 00h (0378)
    bit 7 6 5 4 3 2 1 0
    pin 9 8 7 6 5 4 3 2

    Niech sobie zostana jako wyjscia.
    w VB bedziemy nimi sterowac w ten sposob:

    Dim Wyjscie as Byte
    Out &H378, Wyjsie


    Gdzie wyjscie rowna sie sumie:
    bit0 = 1
    bit1 = 2
    bit2 = 4
    bit3 = 8
    bit4 = 16
    bit5 = 32
    bit6 = 64
    bit7 = 128

    Czyli zeby wystawic na pinie 8 (bit6) i 2 (bit0) +5V trzeba wyslac na port wartosc 64+1 = 65 itp

    Teraz troszke najprostszego Hardware.

    Zeby obsluzyc jakies urzadzenia z portu lpt potrzebny jest tzw Driver.
    Mozna sobie testowac wyjscia diodami swiecacymi podpietymi do masy i do kolejnych pinow najlepiej przez rezystor ok 1kohm.
    Ale zeby otrzymac "cos wiecej" to znaczy wysterowac przekaznik 12V lub urzadzenie do 500mA 12V (mozna wiecej) proponuje zastosowac ULN2803A, na ktory prosto mowiac wystarczy podac +5v z portu a on wysteruje minusem (masa) napiecie takie jak w pdf'ie tego ukladu (warto pobrac szukajac chociazby w googlach). dla 12V bedzie to ok 0.5 A.
    Oczywiscie mozna laczyc piny by podwoic "moc". (dwa wysterowane piny =2x0.5A = 1A).



    Teraz wypadalo by odczytac dane przychodzace na port LPT.
    Wiec tak, wykorzystamy do tego OFFSET = 01h (0378+1=0379)

    bit 7 6 5 4 3 2 1 0
    pin 11 10 12 13 15 - - -


    w Vb bedzie to wygladalo w ten sposob:

    Dim MojLPT as byte
    MojLPT = Inp &H379
    If (MojLPT AND 128) = 128 then 'bit7 czyli pin11
    ....
    end if


    bit3 = 8
    bit4 = 16
    bit5 = 32
    bit6 = 64
    bit7 = 128

    Nie bez potrzeby podalem taki przyklad pniewaz ten bit jest negowany. Oznacza to ze 1 to jest podany na niego stan niski (masa) reszta pinow to stan wysoki (+5v).

    Wazne jest zeby przy starcie ustawic port 0378 na 0:
    Out &H378, 0

    A nastepnie odswiezac czytanie portu w petli nie zapominajac o "DoEvents".



    To tyle. Tak sobie napisalem bo mi sie nudzilo :)
    Prosze nie polemizowac za mocno nad trescia tego postu , chcialem opisac temat dosc prosto. Oczywiscie wszelkie bledy poprawie.

    Pozdrawiam
  • #3 1655211
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    A dodam jeszcze do tego naskrobany na szybko mega uproszczony schemacik.

    Pozdrawiam
    Załączniki:
    • Jak sterować urządzeniami przez port LPT w Visual Basic 6? uln2803a.jpg (23.26 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #4 1655785
    Piotrek.pxf
    Poziom 27  
    Posty: 806
    Pomógł: 118
    Ocena: 65
    Gratuluję, świetny artykuł. Sam też poświęciłem parę nocy na opanowanie starowania portem LPT.

    Jedyny taki mały błędzik to wartośc rezystora przed LED'em - powinna ona wynosić 100Ω, a nie 1kΩ. :D
    Jak będę miał dostęp do swojego komputera, to wrzucę tu przykłady programów. :)
  • #5 1656091
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Jakis przykladowy program? A prosze bardzo.
    Powinno dzialac .

    (ups maly blad w opisie, poprawka)
    Załączniki:
    • LPTTest.zip (2.82 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #6 1660120
    wowo72
    Poziom 14  
    Posty: 162
    Ocena: 3
    Sciagnalem ten input32.dll ktory dziala pod xp(tak pisze), i znowu nic.
    Zadnych bledow- a wyjscia ani rusz.
  • #8 1660373
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Jezeli to jest ta biblioteka, ktora wyslalem na PW to osobiscie testowalem tylko na 2000.
  • #9 1660556
    wowo72
    Poziom 14  
    Posty: 162
    Ocena: 3
    Moglibyscie mi podeslac jakiegos gotowca, to sprawdzil bym czy u mnie smiga.
    Bo juz sam nie wiem gdzie lezy problem.
    sprawdzalem juz chyba z 10 roznych programow i zaden mi nie zalacza wyjsc, a co najlepsze zaden nie pokazuje zadnych bledow.
    wo.wo(_at_)poczta.fm

    Dodano po 6 [minuty]:

    A moze by mi ktos pomogl przez GG jezeli ma troche czasu??
    6183512
  • #10 1661476
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Gotowca masz, dzialajacy program jest kilka postow wyzej.

    Cytat:
    Jakis przykladowy program? A prosze bardzo.


    Czy port masz ustawiony na ECP?
  • #11 1662409
    wowo72
    Poziom 14  
    Posty: 162
    Ocena: 3
    Dzieki za pomoc ,teraz mi wszystko hula tak jak chcialem. :D
  • #12 1662598
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Wiec powodzenia. W sumie wystarczylo dokladnie przeczytac pierwszy post.
    Cytat:
    Port LPT sugeruje ustawic jako ECP.
  • Pomocny post
    #13 2034251
    ostry_18
    Poziom 24  
    Posty: 824
    Pomógł: 64
    Ocena: 35
    wtrące swoje 3 grosze. W większosci zródeł psize, że dlla wstawniamy do katalogu z programem. Nalezy go wstawic do folderu /windows/ lub do /windows/system32/ .
  • #14 2036310
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Aplikacja najpierw szuka dll'a w katalogu programu potem w katalogu wingrozy.

    pozdr.
  • #15 2498151
    marek222
    Poziom 12  
    Posty: 18
    Pomógł: 1
    Ocena: 1
    mam pytanko po co przed diodami wstawiac rezystor 100 (omów)
    podłaczylem diody bez opornikow i dziala ale zastanawiam sie czy nie mozna przez takie podlaczenie spalic cos w pc prosze o odpowiedz czy mozna podlaczyc diody bez rezystorow (dodam ze tak dzialaja )


    drugie pytanie czy zabawa diodami moze yszkodzic potr lpt ?? np gdy zrobie zwarcie na jednej diodzie

    lub podlacze np silniczek ??
  • #16 2519153
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    "Spalic" port jest bardzo latwo. Uwierz mi :)
    Tak samo latwo przez zwarcie jak i przeciazenie LPTeka.

    Sygnaly z portu sa to stany 0 lub 1 i nie slorza do zasilania ukladów.
    Ze wzgledu na to ze diody pobieraja niewielki prad dlatego tez dopuszcza sie "wtykanie" ich prosto po portu.


    pozdr.
  • #18 2647243
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Dla ciekawostki pokaze jak wykorzystac inpout32.dll np do bezposredniego programowania predkosci transmisji szeregowej ukladu UART.

    Osoby, ktore kozystaja z kontrolek typu mscomm32.ocx w VBasicu moga nawet nie wiedziec co dzieje sie tak naprawde na porcie szeregowym.
    Moim zdaniem wiekszosc kontrolek rozleniwia programistow poniewaz jedna funkcja zalatwia caly szereg operacji, wiec lepiej powiedziec "Po co wywazac otwarte drzwi" :)

    A jednak warto sie zaglebic i zejsc do podstaw.

    Krotkia teoria:
    UART to uklad scalony zarzadzajacy transmisja szeregowa. To wlasnie on komunikuje sie z urzadzeniami podlaczanymi do naszego portu rs232.
    Do niego wysylamy informacje z programow napelniajac jego bufor i to wlasnie on przechowuje dane, ktore zostaly przyslane przez urzadzenia zewnetrzne. Ale zeby komunikacja powiodla sie musi byc ustawiona taka sama predkosc transmisji i oczywiscie jeszcze kilka parametrow jak parzystosc, bity stopu itp.
    Urzywajac kontrolki zrobimy to w jednej linijce kodu. Proste!
    Jednak co tak naprawde sie wydarzylo?
    Zostal zaprogramowany rejestr podzielnika w naszym ukladzie scalonym UART.
    I teraz wyzszosc polega na tym ze kontrolki dzialaja przewaznie tylko w jednym srodowisku programistycznym a bezposrednie programowanie rejestrow jest identyczne w VB , C , asemblerze itp. Malo tego nie wazne czy to jest Winda czy linux czy inny system, zawsze sprowadza sie to do wykonania wlasnie tych czynnosci.

    No to teraz jak to zrobic.
    Predkosc transmisji to jest nic innego jak podzielenie predkosci rezonatora kwarcowego (ceramicznego lub generatora) podpietego do UART, ktory ma czestotliwosc 1,8432 MHz.
    Zeby wyslac dane potrzeba jest 16 cykli wiec po podziale na 16 otrzymujemy czestotliwosc 115200Hz czyli nic innego ja Baudrate 115 200.
    Dlatego tez nie jest mozliwa wieksza predkosc na RS'ie.

    Tabela predkosci i podzielnikow:
    115200 = 1
    57600 = 2
    38400 = 3
    19200 = 6
    9600 = 12
    4800 = 24
    2400 = 48
    1200 = 96

    Sprobujemy ustawic BaudRate na 9600. Czyli podzielnik bedzie mial wartosc 12.

    Mamy zadeklarowanego inpout32.dll tak jak do obslugi LPT
    WAZNE:
    Zeby dobrac sie do programowania dzielnika trzeba ustawic 7 bit rejestru LCR na stan wysoki!
    (7 bit rejestru LCR potrzebny jest do wprowadzania ukladu w stan "programowania" reszta bitow to ustawienia parzystosci itp i znajduje sie po przemiesczeniu 03h)

    'Jako adres portu wybieramy &H2F8
    Dim PortAdr as long
    PortAdr = &H2F8


    'Najpierw zczytujemy stan rejestru LCR
    Dim Temp as byte
    Temp = Inp(PortAdr + 3)

    'Stawiamy bit 7 w stan wysoki czyli dodajemy 128 i wysylamy do rejestru
    Temp = Temp + 128
    Out PortAdr + 3, Temp


    ' Teraz Najwazniejsze ustawiamy dzielnik w tym przypadku 12 i wysylamy do rejestru LSB
    Out PortAdr, 12

    'Bit 7 LCR ustawiamy na stan niski i wysylamy
    Temp = Temp - 128
    Out PortAdr + 3, Temp


    'Oddadnie sterowania do systemu
    DoEvents

    JUZ! :)
    Proste prawda?

    Staralem sie opisac temat prosto i zrozumiale dla poczatkujacych.
    Wyrafinowanych programistow prosze o porawienie ewentualnych bledow.

    Pozdr.
  • #19 2677843
    pimpuk
    Poziom 23  
    Posty: 438
    Pomógł: 49
    Ocena: 26
    Kilka pytań odnośnie LPT do znawców tematu:
    Z jaką maksymalną czestotliwością można przełączać stan bitu (np. bit0) na lpt?
    Czy piny 11,12,13 są tak samo "traktowane" przez inpout32.dll i jaką maksymalną częstotliwość próbkowania obsługują?
  • #20 2688367
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Moze znawca nie jestem ale odpowiem.

    Ustaw zmiany stanow na porcie lpt na przyklad w petli z oddaniem sterowania do systemu a a wyniki powinny byc zadowalajace.

    "Traktowne" to znaczy?

    Jezeli urzywasz petli próbkowanie jest zalezne od predkosci twojego komputera i od zadan które obsługuje oprocz twojej aplikacji.

    pozdr.
  • #21 2698603
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Temat zaczyna sie zmieniac z programowania LPT na programowanie bezposrednie... i to za pomoca jednej biblioteki inpout32.dll.

    Zeby sprawdzic czy jest taka wszechstronna proponuje dostac sie dzieki niej prosto do diodek na klawiaturze (caps lock, num lock,scroll lock).


    Szybka Teoria:
    &HED (0EDh) wyslanie tej komendy na adres &H60 powoduje ustawienie klawiatury w stan oczekiwania na bajt ustawiajacy diody led.

    Struktura bajtu:
    bit 0 - dioda Scroll lock
    bit 1 - dioa Num Lock
    bit 2 - dioda Caps lock
    bit 3- 7 ustawione na 0

    Jednym slowem zeby zapalic "wsystkie tsy" musimu ustawic bajt na wartosc 7 (1+2+4).

    EasyCode:

    Deklaracje pomijamy....

    Dim Led as byte
    Led = 7
    Out &H60, &HED
    'ustawienie klawiatury w stan oczekiwania na bajt
    'ustawiajacy diody led.

    DoEvents 'oddanie sterowania do systemu
    Out &H60, Led ' wyslanie do klawiatury bajtu ze stanem diodek
    DoEvents 'oddanie sterowania do systemu

    Dziala bo musi.

    pozdrawiam
  • #22 2793937
    darcon1
    Poziom 12  
    Posty: 25
    Pomógł: 1
    Ocena: 1
    a w jaki sposób wysterowywać port LPT w systemie LINUX. Mam Auroxa i nie bardzo wiem jak to zrobić?
  • #23 2801408
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Skoncentruj sie na tym w jakim jezyku chcesz programowac LPT zeby pozniej uzyć twojego programu w srodowisku LINUX.

    pozdr.
  • Pomocny post
    #24 3047830
    DariuszEE
    Poziom 17  
    Posty: 347
    Pomógł: 5
    Ocena: 33
    Jakiś czas temu zaprojektowałem i wprowadziłem do produkcji

    Jak sterować urządzeniami przez port LPT w Visual Basic 6?

    Jak sterować urządzeniami przez port LPT w Visual Basic 6?

    Jak sterować urządzeniami przez port LPT w Visual Basic 6?

    Tak wyglądał PROTOTYP w ver. 1.0

    Jak sterować urządzeniami przez port LPT w Visual Basic 6?

    Tego jeszcze nie wprowadziłem do produkcji , ew. produkcja rozbija się o koszty elementów
    Ponieważ cena dobrej klasy przekaźnika to powyżej 8 zł netto
    A jak to pomnożymy x8 + złącza to cena wychodzi "WIELKA" zbyt wielka

    Jak sterować urządzeniami przez port LPT w Visual Basic 6?

    Co do programów to mam zgromadzone ze 300Mb programów , projektów na w/w temat
    Chętnie je udostępnie ale nie bardzo dysponuję czasem i miejscem na FTP

    Pozdrawiam Wszystkich :)
  • #25 3129487
    adasiek99
    Poziom 11  
    Posty: 8
    witam!!
    Nie wiem co mam tu napisac czyli zaczne od poczatku rowniez sie bawie w takie sterowanie, a raczej zabieram sie doo tego, ale...
    I tu zaczynaja sie problemy nie mam pojecia od czego zaczac a nie znam zadnego jezyka programowania:(
    Te 300MB programow przydalo by mi sie ale jak to teraz sciagnac??
    Moze macie jakies pomysly bo przez poczte to raczej nie da rady:( na wszelki wypadek podam maila zeby sie jakos skontaktowac: glizda99(malpa)o2.pl

    Chce poprostu przez LPT sterowac 4 silniczkami w zaleznosci od 6 wejsc i klawiatury (WSAD-przod,tyl,prawo,lewo) domyslam sie ze gotowego programu nie znajde zastanawiam sie czy ktos by mi to napisal.. i jeszcze jeden problem to musi chodzic pod win3.11 lub ewe\ntualnie win95. posiadam laptopa ktory ma nastepujace dane tecvhniczne: Procek:25MHz, Ram:4MB, HDD:120MB; czy taki program bedzie dzialac na takim sprzecie?

    POZDRAWIAM i mam nadzieje ze ktos mi pomoze...Bede wdzieczny...

    Dodano po 1 [minuty]:

    pomylka to sa 2 silniczki:)
  • Pomocny post
    #26 3183897
    marek222
    Poziom 12  
    Posty: 18
    Pomógł: 1
    Ocena: 1
    hej mam pytanie
    uklady jie zaprezetowal wyzej dariuszee

    mam elemety kupione do zbudowania czegos takiego podobne przekazniki
    ale jak bydowalem na jeden kanal osobno juz 2 razy to mi nie dzialalo

    jestem poczatkujacy mam schemat czesci a jak zlutuje to nie dziala moglbym prosic kogos o szczegulowe wyjasnienie jak to zbudowac i podlaczyc schemat mam nie weim co robie zle ale minie dziala albo nie ma sugnalu na yjsciu albo troche podziala i przestanie
    ??
  • #27 3184215
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Marek222 - wrzuć schemat może w nim tkwi problem.
    Może z portu nie wychodza sygnały, sprawdzales np zwykla diodą świecącą?
    Znalazleś problem czy poprostu nie działa?
  • #28 3285000
    [Ignas]
    Poziom 15  
    Posty: 395
    Pomógł: 4
    Ocena: 59
    DariuszEE napisał:
    Jakiś czas temu zaprojektowałem i wprowadziłem do produkcji....
    A jak to pomnożymy x8 + złącza to cena wychodzi "WIELKA" zbyt wielka


    To moze wprowadzisz do sprzedaży samą płytkę, z chęcią bym takową zakupił :)
  • #29 3361332
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Dostęp do pinów 1,14,16,17 portu Lpt

    Te piny dostepne są po offsecie 02h. Czyli jeżeli twój adres LPT to 378 po offsecie bedzie 37A.

    I tak:
    bit 0 = pin1 (N)
    bit 1 = pin14 (N)
    bit 2 = pin16
    bit 3 = pin17 (N)



    pozdr.
  • #30 3755927
    Konto nie istnieje
    Konto nie istnieje  

Podsumowanie tematu

✨ Dyskusja dotyczy sterowania urządzeniami zewnętrznymi, takimi jak silniki czy przekaźniki, za pomocą portu LPT w Visual Basic 6. Zalecane jest użycie biblioteki inpout32.dll, umożliwiającej bezpośredni dostęp do portu LPT, z ustawieniem portu w tryb ECP. Przedstawiono deklaracje funkcji Inp32 i Out32 do odczytu i zapisu na port. Poruszono kwestie doboru rezystorów do diod LED (zalecane wartości około 100–470 Ω) w celu ochrony portu przed uszkodzeniem. Omówiono sposoby programowego sterowania poszczególnymi pinami portu, w tym przykładowe funkcje w VB do ustawiania stanów wysokich i niskich na wybranych bitach. Wskazano na konieczność stosowania układów pośredniczących (np. tranzystorów, multiplekserów, mikrokontrolerów) do wzmocnienia sygnału i rozbudowy liczby wyjść (np. do 32 lub 255 kanałów). Poruszono problem kompatybilności bibliotek inpout32.dll z różnymi systemami operacyjnymi, zwłaszcza 64-bitowymi Windows 7, oraz sposoby uzyskania dostępu do portów w systemach Windows XP i nowszych. Wskazano na ograniczenia dokładności timerów w VB i proponowano alternatywne metody pomiaru czasu (np. pętle z funkcją Timer, QueryPerformanceCounter). Podano przykłady prostych programów w VB, C++, C# oraz AutoIt do sterowania portem LPT. Omówiono również kwestie bezpieczeństwa portu, takie jak unikanie bezpośredniego zasilania przekaźników, stosowanie układów optoizolatorów oraz zabezpieczeń przed zwarciami i przeciążeniami. Wskazano na dostępność licznych materiałów i przykładów na forach i stronach internetowych, w tym schematów i artykułów dotyczących portu LPT oraz sterowania urządzeniami zewnętrznymi.
Wygenerowane przez model językowy.
REKLAMA