Porty i problemy

0

Witajcie! Dzisiaj mnie coś naszło na pisanie (znaczy dzisiaj naszło, jutro będę pisał #-P) programu korzystającego z portu szeregowego... no i wszystko pięknie, wpisałem w szukaj na forum co trzeba, znalazłem ciekawe linki itp itd, googiel jak zwykle był pomocny.... nie ma sprawy - wiem jak wysłać informację na port i wiem jak ją odebrać (artykuł Lofixa), dokształciłem się z elekroniki i elektrotechniki - nie jest źle.... Ale natrafiłem na kolejny problem:
na stronie http://www.delphi.qs.pl/faq1.php3#34 jest podany kod assemblera:

 
  mov DX,2fch
  mov AL,2
  out DX,AL

Czy może ktoś mi go po krótce wyjaśnić ? ok, rozumiem że do rejestru DX przypisujemy 2fch (--pytanie - co to jest ? h to symbol 16tkowego systemu w tym przypadku ?), do AL '2' (--czy to jest numer pina ? #-P)

oraz procedurka:

procedure Wylacz(Port:word;Value:Byte);assembler;
asm
  mov DX,Port
  mov AL,Value
  out DX,AL
end;

drugi przypadek jest wywoływany przez wylacz($2fc,$2); - dlaczego $ (mnie to się z PHP kojarzy...), dlaczego bez 'h' oraz (tak na chłopski rozum) nie rozumiem:
Najpierw wysyłam informację na pin 2, to się dioda włącza, gdy wyślę jeszcze raz tę samą informację na ten sam port to dioda się wyłączy ?
Aha i tak w ogóle - co ja wysyłam na ten pin ? #-P. (napięcie ??)

Naprawdę byłbym wdzięczny za pomoc, zdaję sobię sprawę z faktu, że pewnie połowa z moich pytań jest dla Was banalną, ale naprawdę w niektórych wypadkach wystarczy chociaż podanie jednego hasła (bo już dalej to google chyba pomoże)

0
 
  mov DX,2fch
  mov AL,2
  out DX,AL

ok, rozumiem że do rejestru DX przypisujemy 2fch (--pytanie - co to jest ?

Nr portu. Porty od 2f8h do 2ffh odpowiadaja portowi (zlaczu) COM2. Niefortunnie wykorzystano tutaj slowo port. W pierwszym uzyciu jest to w formie portu "bardziej wirtualnego". To jakby adresy pamieci, na ktore mozesz dane wysylac. W drugim przypadku chodzi o zlacze, do ktorego mozesz podlaczyc np... modem? (nie mam pojecia co mozna :P)

h to symbol 16tkowego systemu w tym przypadku ?

Tak jest.

do AL '2' (--czy to jest numer pina ? #-P)

To jest wartosc wysylana na port. Nie wiem jaka jest specyfikacja tego i za co odpowiada (zapewne jest to zapisany binarnie kod napiec, ale glowy nie dam).

drugi przypadek jest wywoływany przez wylacz($2fc,$2); - dlaczego $ (mnie to się z PHP kojarzy...)

A mi z basiciem ;) Prefix $ w Pascalu oznacza liczbe szesnastkowa. Wiec $2fc = 2fch = 764

Najpierw wysyłam informację na pin 2, to się dioda włącza, gdy wyślę jeszcze raz tę samą informację na ten sam port to dioda się wyłączy ?
Aha i tak w ogóle - co ja wysyłam na ten pin ? #-P. (napięcie ??)

Wysylajac cos na port raczej ustawiasz jakies konkretne napiecie. Ale czy jeszcze raz wysylasz taka sama wartosc? :>

0

Nie zebym byl wscibski [diabel] ale chcecie mi tu powiedziec ze instrukcja out (i kazda inna z portami) zadziala w 32bitowym programie napisanym w Delphi 8-0
Nie ma bata i tyle, w 16bitowym DOSie ok ale nie na win32 IOPL nie pozwoli nawet administratorowi sstemu (ktory swoja droga jest tak samo traktowany jak innym uzytkownik-programista).
W Delphi nie pisze, ale VC++ zgodnie z zasadami PMode nam na o nie pozwala.

Wiec ?!

0

[prawie nie na temat]

Wiec ?!

http://4programmers.net/Forum/viewtopic.html?id=46361
Spróbuj, przekonaj się. Pod łinzgrozą 98 działa.

[na temat]
Po pierwsze tzeba rozróżnić wyjścia portów zewnętrznych (fizycznych na obudowie kompa) od portów wewnętrznych (też fizycznie istniejących, lecz dostepnych tylko poprzez in/out). Sam 'port' - to po prostu miejsce/sposób/możliwość na urządzenie- do niego podlącza się różne rzeczy. Widzisz wiele urządzeń w kompie ma swoje własne scalaki i to one po otrzymaniu rozkazu/informacji zmieniają stan urządzenia. Takimi urządzeniami są i kontrolery portów zewnętrznych (lpt/com/usb...), kontroler klawiatury, kontroler hdd/fdd, kontroler isa/pci/agp, same karty grafika/muza/sieciówka, kontroler dma i wiele innych. Te scalaki też trzeba gdzieś podłączyć, aby były dostępne dla programów. Podłącza się je przez porty wewnętrzne... Więc o co chodzi. Chodzi o to, aby oprogramować kontroler sterujący com-em (portem zewnętrznym) i aby to zrobic trzeba wysłać na wejścia scalaka poprzez porty wewnętrzne ($02fc paszczak/02fch asm/0x02fc c++) odpowiednie syganły sterujące. Po i ch otrzymaniu (muszą być rozpoznawalne) kontroler com-a ustawi odpowiednie napięcia na pinach poru zewnętrznego...

program-> porty wewnętrzne-> kontroler portów zewnętrznych-> port zewnętrzny

To jest droga, którą musisz pokonać. Niestety nie da sie bezposrednio ustawiać napięć na pinach portów zewnętrznych. Trzeba do tego użyć kontrolera i portów wewnętrznych (instrukcji out/in w dx nr portu, a w al,ax,eax podaje się wartość).

Inną metodą (jeśli dane urządzene jest obsługiwane przez bios lub ma własny rombios) jest wykorzystanie przerwań. Gdyby zdisassemblować bios to okaże sie, że procedury te korzystają z portów wewnętrnych. Dla com-a też tak jest, ale w twoim przypadku ta droga odpada, bo w biosie jest jedynie oprogramowana gotowa komunikacja, nie ustawianie stanów na pinach (możesz wysłać znak, odebrać, ustawić prędkośc..., ale nie ustawisz konkretnego stanu na pinach).

0

Mhm, dzięki za pomoc, ale mam jeszcze jedno małe pytanie - gdzie mogę znaleźć opis możliwych wartości mov AL,2 i za co one odpowiadają ? "Porty od 2f8h do 2ffh odpowiadaja portowi (zlaczu) COM2" - również pytanie z mojej strony, gdzie mogę znaleźć specyfikację 'trochę' bardziej konkretną (opis poszczególnych) ? Z góry dziękuję za wszystko i jeszcze raz wielkie dzięki dla Dryobatesa.

0

Ok flabra na 98 wszystko chodzi :-8 ale piszac PMode i win32 mialem na mysli system w pelni zgodny z oboma slowkami - czyli NT, 2K, XP na tych takie motywy nie przejda.

0

Oj Snaj jesteś tego pewny ? bo piszę to raczej pod win xp....

0

Oj Snaj jesteś tego pewny ? bo piszę to raczej pod win xp....

Oj chyba ma racje :) Tutaj albo sterownik, albo... probowac za pomoca API (co raczej byloby trudne). Chyba najlepiej byloby poczytac DDK.
A co do znalezienia tych informacji, to sciagnij liste przerwan Ralph'a Brown'a (FAQ w dziale Asembler). Tam jest tez opis portow. Chociaz akurat dokladnych informacji o comie nie znalazlem.

0

Dziękuję Flabra za przybliżenie tematu i pozostałym za pomoc, ale z tego co tutaj słyszę to lipa pod NT... więc wracając do punktu wyjściowego - jak zapalić diodę podłączoną przez com ? (czyli jaki jest zamiennik wyzej podanego kodu assemblera) :/ albo jeszcze prościej - jak obsłużyć port szeregowy, wykorzystując jego możliwości prócz wysyłania informacji/ciągu znaków (bo akurat to mogę - mam nadzieję - zrobić pod WinXP z pomocą komponentu, który polecał Lofix)... Z góry dziękuję za pomoc.

0

Po wysłaniu jakiegoś znaku na COM na linii TxD powinny pojawić się impulsy rzędu -12V (dla logicznej 1) lub +12V (dla 0). Próbowałem to osiągnąć przy pomocy CreateFile(), jednak rezultaty były co najmniej marne (w najlepszym wypadku zawieszenie się myszy na COM1 po wysłaniu czegoś na COM2:-/)

Twój kod w asm: (wykorzystany w mojej interpretacji w BCB)

int Start = GetTickCount();
int ile = 1000;
for(;;)
   {
   if((GetTickCount() - Start)>ile)break;
   asm {
   mov DX,2f8h
   mov AL,255
   out DX,AL }
   Application->ProcessMessages();
   }

Idealnie spełnia rolę 'zapalacza' diody, na określony czas, o końcówkach przyłożonych do TxD (dla 9-pinowej jest to 3pin) i Masy (dla j/w 5pin). Jednak problem pojawia się przy wykorzystaniu Windows z NT series... W praktyce pozostaje pisanie sterownika (to chyba i tak będzie najprostsze...)

0

Eno bez picu... żeby zapalić pod WinXP głupią diodę podłączoną do portu COM muszę napisać sterownik portu ??? Szczerze mówiąc myślałem, że to będzie o wiele łatwiejsze...

0

To sa juz OS-y pelna geba wiec sie nie dziw. M$ zaczal ochraniac jadro i sprzet przed ingerencja nie zawsze obeznanych w temacie uzytkownikow. Nie co to pod 98 lub DOSem tam hulaj dusza robisz co chcesz :]

A jesli ktos juz chce dostac sie do sprzetu to jesli zna sie na sprzecie to napisze bez problemu jakiegos sys-a (obecnie obowiazujacy typ drivera) a wowczas on juz dziala nie na poziomie ring3 lecz ring0 (gdzies zetnalem sie ze jednak 2 :| ) w kazdym badz razie w nich mozna juz odwolywac sie do sprzetu bez posrednictwa OSai IN, OUT dziala.

0

Tak troszke OT. Czy ktos wie jak to jest rozwiazane po UNIXami? (nie Linuksem). Takze sterownik trzeba pisac, czy moze odrobinke wieksza jest swoboda?

0

Dryo - wg mnie jeżeli chodzi o Unixy to będzie podobnie jak z Linuksem (w końcu jakby nie patrzeć np: FreeBSD jest bardzo podobny w budowie do Gnu/Linux)... jak nie to zawsze mozna rekompilowac jadro i takowe 'możliwości' sobie zrobić...

btw, mam jeszcze jedno małe pytanie - co do pisania sterowników - może ktoś opisać mniej więcej proces ? Tzn., uświadomić mi czy warto się uczyć i czy przypadkiem się nie wyłożę na poczatku...

0

a ja przegrzebałem helpa, i znalazłem tam zestaw funkcji do komunikacji:
ClearCommBreak
ClearCommError
CommConfigDialog
DeviceIoControl
EscapeCommFunction
GetCommConfig
GetCommMask
GetCommModemStatus
GetCommProperties
GetCommState
GetCommTimeouts
SetCommBreak
SetCommConfig
SetCommMask
SetCommState
SetCommTimeouts
SetDefaultCommConfig
SetupComm
TransmitCommChar

itp. najbardziej rokująca nadzieje jest funkcja EscapeCommFunction, bo pozwala ustawiać ręcznie DTS i RTS, i o ile dobrze kombinuję, to parametr dwFunc=SETBREAK zawiesza transmisję, a stan bitów na wyjściu można wtedy ustawiać "ręcznie".

tak czy inaczej, na pewno lepiej pogrzebać w WinAPI, niż robić sterownik! 8-) nie wkręcajcie nowicjuszy...

0

Dzięki za słowa otuchy, ale mam małą prośbę... mógłby ktoś zaproponowąć wykorzystanie tych funkcji w praktyce ? Bo szczerze mówiac tekst w MSDNie i Delphi Help mi nie daje zbyt dużo... (nie potrafię wciąż tych funkcji wykorzystać)

0

Theriel, spróbuj napisać program wykorzystujący asm i uruchomić go w XP w trybie zgodności (tak się to nazywa?) z Win98...

0

[poprawka]
Eh kijowo poczatkowo zrozumialem intencje Krecika :)
Napisanie calego programu w asm-ie moze sie powiesc, wowczas dzialaja m.in. in i out ale nie wszystkie przerwania - np. 25h czyli te bezposrednio odnoszace sie do hardu i ktore system uwaza za grozne.
Wowczas zapewne nawet nie trza bedzie wlaczac trybu zgodnosci (ale kto tam wie tego XP), bo system wykryje na podstawie exe'ca ze jest to aplikacja DOSowa i odpali ntvdm a on zajmie sie reszta. To ma duze szanse powodzenia :]

Ale czekam na wyniki eksperymentu [diabel]

0

yyy to trochę potrwa, bo gdy sprawdzałem diodę na moim zasilaczu to zapaliła się, później sprawdzałem jeszcze raz i pierdutnęło, zaśmierdziało i prawdopodobnie dioda poszła się.... więc dopóki nie kupię sobie diodki jakiejś nowej to programu nie przetestuję....

//dopisane:
Grrr nie znoszę diod... ale mam chyba dobrą wiadomość: moja nowa dioda, przy podłączaniu do zasilacza zapalała się pięknie, później napisałem program, przy odpalaniu (naciskaniu przycisku w programie) wyskakiwało ze jest przywilejowana funkcja i lipa (w debbugerze zaznaczało 'out'), ale po odpaleniu exeka w trybie zgodności 98/ME wszystko pięknie działało... znaczy nie wywalał się. Moje zapalanie było troche inne niż przedstawione na przykładzie Cpp (tutaj u Ciebie był motyw, że przez 1000 milisekund pisałeś tą funkcję w asm, ja to zrobiłem tylko raz), przyłożyłem diodę do coma i ku mojemu zdziwieniu zapaliła się..., no i się tak paliła, pewnie wypadałoby wysłać to samo jeszcze raz aby zgasła, ale po tym jak 'odciągnąłem ją' i przykładałem jeszcze raz to ani na zasilaczu ani na comie się nie chciała palić (??)... więc tak naprawdę nie mam pewności czy to dzięki programowi się zapaliła, czy jakimś przypadkiem... btw, po restarcie komputra COM przybiega domyślny stan ?

//dopisane 2:
Gdy będę w okolicy elektrycznego to kupię sobie z 10 diod na wszelki wypadek... któraś na pewno będzie działała normalnie...

0

Człowieku na COMie powinno być koło 12V... dioda chodzi na jakieś 3V... Zmierz napięcie na COMie, prąd i policz jakich rezystorów użyć...

PS> Jeśli sie nie pomyliłem, to opornik będzie jakieś R=4500_O_ i P=0,02W - ale mogłem się gdzieś na zerach przejechać...

PS2> Tzn, że na XP port COM reagował?

0

rezystor mam dobry (powiedzialem gosciowi w sklepie ze chce diode na 12v, dal mi diode i rezystor wiec razem chyba moge pod 12 podpiac) tylko nie wiem jak podlaczyc.... tak: (?) PLUS - rezystor - dioda - MINUS ? Co do tego 'zareagowal' - chyba tak, w koncu sie zapalil #-P ale mogl to byc rowniez przypadek czy cóś...

0

Między liniami innymi niż RxD i TxD a masą jest (względnie) stałe napięcie...
Diodę musisz połączyć katodą(-) do masy (5pin), a anodą(+) do TxD(3pin)

PS> Podane powyżej piny dotyczą wtyczki wąskiej (9-pinowej)
PPS> Rezystor daj przed którymkolwiek z biegunów, w tym wypadku to raczej bez znaczenia...

0

Heh jak podłączyć wiem...

Btw, jeszcze diody nowej nie kupiłem #-P

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