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

Sterowanie diodami LED przez LPT – diody świecą słabo, brak reakcji na sygnał Pascal

yan_kees 02 Lut 2005 17:30 2562 4
REKLAMA
  • #1 1191609
    yan_kees
    Poziom 2  
    Posty: 3
    Moja sytuacja wygląda tak:

    Mam podpięte diody pod pin 2 D0 i pin 25 masa. Przy włożeniu męskiej wtyczki do portu diody odrazu świecą słabym światłem, a później gdy chce je kontrolować w Pascalu nic się nie dzieje. Diody świecą nadal. Co może być? Czyżby uszkodzone LPT?
  • REKLAMA
  • REKLAMA
  • REKLAMA
  • #4 1193074
    shg
    Poziom 35  
    Posty: 2289
    Pomógł: 339
    Ocena: 134
    Diody świecą, bo port jest ustawiony jako wejście, a w takim stanie wejścia portu są "podciągane" do + zasilania.
    W programie musisz najpierw ustawić kierunek transmisji dla portu, o ile dobrze pamiętam, to był adres o 2 większy od adresu portu, 1=wyjście, 0 - wejście (albo odwrotnie), każdy bit odpowiada jednej linii portu: bit 0 - D0...bit 7- D7.

    Pod windą XP może nie działać, bo tam tylko starowniki mogą korzystać bezpośrednio z rejestrów sprzętowych.

    W BIOSie musisz ustawić adres portu na taki, jakiego używasz w programie, albo w programie zapisywać pod taki adres, jaki jest ustawiony w BIOSie, standardowo jest chyba 0x378 i tak też chyba się ustawi jak dasz auto, chyba, że masz podpięte jakieś dodatkowe karty I/O, ale nie wiem, bo PC to nie moja platforma :D
  • #5 1193216
    Akane
    Poziom 27  
    Posty: 638
    Pomógł: 144
    Ocena: 33
    bawiłem się trochę driverem UserPort, a nawet napisałem sobie funkcje do sterowania nim, tak że już go poznałem
    A co do LPT to w biosie dobrym rozwiązaniem będzie ustawienie portu w tryb Bi-Dir, i teraz jak chcesz wysyłać na port to zerujesz jeden lub wszystkie(jeśli nie używasz extra pinów lpt) bity portu 890:
    _outp(890,255-32)  <-- tutaj zmieniasz kierunek portu jako wyjście
    'albo _outp(890,0) 
    
    for a = 1 to 15
    
    	_outp(888,255) /* dioda sobie miga kilka sekund*/
    	sleep(200)
    	_outp(888,0)
    	sleep(200)
    
    next a


    funkcja _outp (i _imp) jest importowana z biblioteki msvcrt.dll i sprawuje się doskonale :) Wcześniej używałem wstawek
    _asm
    mov dx,888
    out dx,byte [$zmienna]
    _endasm

    Jeśli kolega pracuje na XP lub podobnym, to dobrze skożystać z funkcji SetUnhandledExceptionFilter podając adres extra funkcji jako parametr tej funkcji. W razie jakiegokolwiek 'przestępstwa' windows najpierw uruchomi tą funkcję w której można zmienić licznik rozkazów procesora pomijając jednocześnie "zakazany" rozkaz powodujący błąd
    W IBasic pro wygląda to tak:
    SetUnhandledExceptionFilter(&LPTExceptionFilter) /*adres poniższej funkcji*/
    
    INT BylError
    BylError = FALSE
    
    _inp(888) :' test czy wystąpił exception
    if BylError=TRUE then ..... jakiś komunikat
    '---------
    
    Sub LPTExceptionFilter(ep:EXCEPTION_POINTERS),uint
    	UINT pER, pCR
    	pER = ep.ExceptionRecord
    	pCR = ep.ContextRecord
    
    	IF *<EXCEPTION_RECORD>pER.ExceptionCode = EXCEPTION_PRIV_INSTRUCTION
    
    'zwiększ EIP o 1 - pomiń rozkaz in dx,al
    		*<CONTEXT>pCR.Eip ++
    
    ' zasygnalizuj error
    		BylError = TRUE
    		Return EXCEPTION_CONTINUE_EXECUTION
    	Endif
    
    	Return EXCEPTION_CONTINUE_SEARCH
    EndSub

    Uwaga dla nowicjuszy: EXCEPTION_POINTERS, EXCEPTION_RECORD i CONTEXT to struktury!
    a jak to wygląda w c++ - odsyłam do przykładów dołączonych do UserPort
    Jeszcze jedno ważne - userport trzeba zawsze zainicjować gdzieś na początku programu, byle przed kożystaniem z I/O. Nie ważne, że driver jest uruchomiony. Poprostu trzeba. Wystarczy otworzyć plik \\.\UserPort i zaraz go zamknąć. Ja o tym zapomniałem i ciągle miałem kochane okienko z napisem "program wykonał..." (XP pro/home)

    Oczywiście na win98 nie trzeba żadnych driverów, poprostu in/out wystarczy :)

    A może ktoś coś wie o driverze, który umożliwi kożystanie z przerwań pod XP ? Chodzi o generowanie opóźnień programowych które nie znęcają się na CPU :) Sleep() odpada bo im mniejsza wartość, tym gorsza dokładność
REKLAMA