LPT + DOS i AVR

Witam

Mam zamiar sterować pewnym urządzeniem przez port lpt. W win98 i xp program bez problemu wysyła dane, lecz niestety w dosie jest z tym problem. Cholera jedna po uruchomieniu systemu nie chce za nic zmienić stanu portu. Dodam że po włączeniu komputera, podczas przejścia przez bios, stan portu zmienia się, to samo podczas odpalania programu testowego w biosie. Musze niestety korzystać z dos'a ponieważ lpt wysyła dane do avr który z kolei steruje silnikiem krokowym - sterowanie tym spod win98 powoduje to że silnik 'szarpie' i nierówno pracuje. Komputer na którym testuje całe to ustrojstwo to stary IBM ThinkPad 380XD.

Pamiętam że jakiś czas temu na starym PC (stacjonarnym) podobnym programem mogłem zapalać diody led używając tylko dos'a.

Jak zainicjować Transmisje w dosie do LPT ? Czy ktoś miał już podobny problem ?

pozdrawiam bartek

Reply to
invalid unparseable
Loading thread data ...

BartoszK schrieb:

nie wiem jak to robisz na win-xp, ale pod dosem to jest bardzo proste. Ustawiasz port jako standartowy lpt w biosie a potem piszesz bezpośrednio na port (funkcja outb).

Waldek

Reply to
Waldemar

Waldemar napisał(a):

Przy dosowej komendzie "dir >> prn" albo "dir >> lpt1" wyrzuca mi:

"Błąd zapisu podczas zapisu w urządzeniu LPT1 przerwij, ponów, zignoruj, zrezygnuj Błąd przerwania 24"

coś chyba nie jest tak...

pozdrawiam bartek

Reply to
invalid unparseable

BartoszK napisał(a):

Lepiej byłoby gdybyś zrobił transmisję na RS232. Działa niezależnie do systemu.

Być może aby pisać do rejestrów portu LPT trzeba wyłączyć port LPT w Biosie żeby system nie próbował inicjować drukarki.

Reply to
Mariusz Dybiec

BartoszK schrieb:

jest nie tak, bo przy ww komendach dos oczekuje drukarki, której nie masz. Tylko zrozumiałem, że chcesz to robić programowo, a nie przez kopiowanie pliku. To jak to jest?

Waldek

Reply to
Waldemar

A czy twoje urzadzenie poprawnie udaje drukarke - tzn generuje sygnal Busy i/lub Ack ?

Bo bios/dos/windows pieknie wysylaja dane do drukarki, ale wlasnie "do drukarki".

Mozesz sie jeszcze zastanowic nad udawaniem drukarki w trybach rozszerzonych [EPP].

J.

Reply to
J.F.

Mariusz Dybiec napisał(a):

Z ciekawości przed momentem wygrzebałem starą drukarkę igłową star-LC10 , po komendzie 'dir >> prn" bez problemu wydrukowała to co miała wydrukować. Czy przyczyną może być 'wiszący w powietrzu' jakiś pin np. Busy albo Select ?

pozdrawiam bartek

Reply to
invalid unparseable

Waldemar napisał(a):

Chce to robić programowo, tym poleceniem 'dir >> prn' chciałem tylko sprawdzić czy cokolwiek się zmieni na porcie.

Reply to
invalid unparseable

BartoszK schrieb:

przeca ci napisałem. Chcesz programowo czy naprawdę udawać drukarkę? Jak ma się twoje ustrojstwo zachowywać drukarkowo, to musisz zachować protokół drukarki, czyli odpowiednio wysterować piny busy, ack, pe. Jak programowo, to wystarczy pisać na adres IO portu, czyli 0x378, 0x278,

0x3BC czy jaki adres tam masz.

Waldek

Reply to
Waldemar

J.F. napisał(a):

I tu właśnie jest chyba cały problem, stąd następne pytanie:

Na jakie piny podać odpowiednie stany tak aby system myślał że ma podłączoną drukarkę ?

pozdrawiam bartek

Reply to
invalid unparseable

Waldemar napisał(a):

Ok :) teraz już wiem że to urządzenie ma udawać prawdziwą drukarkę. Stąd pytanie Waldemarze: Na jakie piny podać odpowiednie stany tak aby system myślał że ma podłączoną drukarkę ?

bartek

Reply to
invalid unparseable

BartoszK schrieb:

no to nie grzeb tym dalej, bo tylko szlag cię trafi. W jakim języku piszesz? W c po prostu outp(0x378,val) wysyła byte val na D0-D7 LPT1. Musisz tylko sprawdzić adres portu w biosie. Coponiektóre laptopy mają prn na adresie 0x3BC.

Waldek

Reply to
Waldemar

BartoszK napisał(a):

/ACK (10) stan niski oznacza dotowość odebrania nowego bajtu BUSY(11) wysoki oznacza stan off-laine - czyli musi być niski PAP(12) oznacza brak papieru - czyli ma być niski ONOF(13) syganlizuje obecność drukarki - ma byc wysoki /ERR(15) niski stan oznacza błąd drukarki - ma być wysoki

Reply to
Mariusz Dybiec

Waldemar napisał(a):

Do testów używam tego programu:

formatting link
O ile mi wiadomo jest pisany w C, drugim programem na którym sprawdzałem to ustrojstwo to
formatting link
i za cholerę ani na jednym ani na drugim w dosie nie ma żadnej zmiany na porcie. Co śmieszniejsze jak uruchomię te programy spod win98 wszystko śmiga wyśmienicie.

pozdrawiam bartek

Reply to
invalid unparseable

Waldemar napisał(a):

Do testów używam tego programu:

formatting link
O ile mi wiadomo jest pisany w C, drugim programem na którym sprawdzałem to ustrojstwo to
formatting link
i za cholerę ani na jednym ani na drugim w dosie nie ma żadnej zmiany na porcie. Co śmieszniejsze jak uruchomię te programy spod win98 wszystko śmiga wyśmienicie.

pozdrawiam bartek

Reply to
invalid unparseable

Mariusz Dybiec napisał(a):

Pięknie dziękuje i już grzeje lutownicę :)

pozdrawiam Bartek

Reply to
invalid unparseable

BartoszK schrieb:

nie pamiętam logiki, musisz zajrzeć to jakieś antycznej książki jaki jest protokół drukarki. PE jest chyba negatywna logika, czyli 1 na fest dać, by laptop wiedział, że jest papier ;-) Busy i ACK nie pamiętam, wcięło mi książki. Ale na grzyba ci to wszystko.

Waldek

Reply to
Waldemar

BartoszK schrieb:

nie jest śmieszne, bo idą przez driver, który nie robi nic innego, jak mapowanie portów procesora do przestrzeni użytkownika. z punktu widzenia programisty masz tam bezpośrednie wejście na port. W dosie tego mapowania nie ma (bo niepotrzebne, tu wsio chodzi w user mode). Jak program będziesz pisał sam, to nie ma sprawy, robisz jak napisałem.

Nawiasem mówiąc, tu jest jedna funkcja mojego programu ;-) (dasbyte jest zdefiniowane globalnie, bo jest to sterownik do 2 silników krokowych). Funkcja jest maszyną stanów do kroku w lewo pierwszego silnika

void m1tickleft (void){ byte c,e;

c= dasbyte & 0x0F; if ( halfmode ) { e = 2; if(c == 2 ) e = 3; if(c == 3 ) e = 1; if(c == 1 ) e = 5; if(c == 5 ) e = 4; if(c == 4 ) e = 12; if(c == 12 ) e = 8; if(c == 8 ) e = 10; if(c == 10 ) e = 2; } else { e = 3; if(c == 3 ) e = 5; if(c == 5 ) e = 12; if(c == 12 ) e = 10; if(c == 10 ) e = 3; }

dasbyte &= 0xF0; dasbyte |= e; outp(0x378,dasbyte); }

Tu silnik krokowy wisi bezpośrednio przez driver na porcie drukarki, bez żadnego procesora. WW program chodzi pod LabWindows, bo dosa już nie używamy, ale ww funkcja została skopiowana 1:1 ze starego programu dosowego. LabWindows ma wbudowany driver do wirtualnych portów.

Waldek

Reply to
Waldemar

Waldemar napisał(a):

Chyba po to aby system wysyłał bajty, myśląc że jest podpięta drukarka. Pytanie po kiego grzyba na LPT a nie RS.

Reply to
Mariusz Dybiec

Mariusz Dybiec napisał(a):

Polutowałem i ożyło :), 5V podałem na piny 10/13/15 (ACK/SELECT/ERROR) i

0V czyli GND na 11 i 12 (BUSY i PAPER END). Używam LPT dlatego że już mam gotowy soft do tego urządzenia w dodatku z graficznym interfejsem :), a RS232 dla mnie jak na razie to zbyt dużo zabawy.

pozdrawiam Bartek

Reply to
invalid unparseable

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.