Łącze szeregowe RS-232


      Trochę teori nie zaszkodzi... Co to takiego jest to łącze i do czego służy?

      Stoją na stole dwa komputery, jeden liczy, a drugi... też liczy. Co zrobić aby dogadały się ze sobą i nie liczyły tego samego? To proste. Należy je połączyć kablem (no może nie takim grubym) wystarczy cieńki. Ale jak to zrobić, i skąd komputery "wiedzieć" będą że są połączone?

      A czy wiesz jak komputery myślą? Teraz uruchom szare komórki. Jak czegoś nie zrozumiesz to czytaj raz jeszcze. Wszystko co dzieje się w komputerze jest sterowane programem. A program to kolejne instrukcje wykonywane jedna za drugą. Nagle przychodzi polecenie:

"połącz się z drukarką i wyślij do niej kilka znaków do wydrukowania".

Pamiętaj, drukarka ma w sobie komputer no nazwijmy to sterownik. Ale nic to, jest tylko nieco mniejszy i nie służy do gier. Dziwnym trafem, zapomniałeś jej podłączyć do komputera. Zamiast radosnego wystukiwania kolejnych liter na ekran wyskakuje jeszcze radośniejszy komunikat w rodzju "brak drukarki" lub coś podobnego. Pytanie:

Jak komputer dowiedział się że drukarka nie jest podłączona?

To proste? Drukarka na polecenie komputera "podłączam się do ciebie" nie wysłała odpowiedzi "jestem podłączona" komputer odebrał ten sygnał, a właściwie nie odebrał go w ustalonym czasie i w ten sposób "dowiedział" się że popełniłeś błąd, powiadomił cię o tym radosnym komunikatem. Wszystko dobrze, tylko że ani komputer ani drukarka nie potrafią mówić. Szukać należy innego sposobu porozumienia się ze sobą. Czy wiesz już jak to zrobić?

A od czego prąd? A od czego system kodów? Wszystko co niżej napisano to sprawa umowna. A że ludzie przed nami stanęli przed tym problemem to rozwiązali go, i wymyślili RS-232.

Trochę "kabelkowania" i nie tylko...

      Komputer połączony jest z drukarką dwoma przewodami. W stanie początkowym na obydwu z nich jest stan logiczny zero, więc w stosunku do masy nie ma tam żadnego napięcia.

Komputer przez jeden przewód wysyła sygnał, czyli powoduje że pojawia się na nim powiedzmy napięcie +5V.

Układy elektroniczne drukarki wykrywają ten fakt, i na drugi przewód też wysyłają sygnał +5V.

Z kolei układy elektroniczne komputera odbierają ten sygnał i w ten oto sposob komputer "wie" że drukarka jest podłączona. To czy jest sprawna, to już inny temat.

Należy teraz wysłać informację co drukarka ma wydrukować. Powiedzmy że ma to być duże A. Zatem należy przesłać po "drutach" kod litery A. W zapisie dziesiętnym jest to 65, a w zapisie dwójkowym wygląda to tak: 01000001. No i mamy kolejny problem, jak to zrobić! (czytaj: przesłać).

Wystarczy połączyć komputer z drukarką ośmioma przewodami i po każdym przewodzie przesyłać sygnał (wartość), jednego bitu. Bit ma wartość zero, na przewodzie brak napięcia, a gdy ma wartość jeden, to na przewodzie pojawia się +5V. Jest to przesyłanie równoległe, bo wszystko na raz, cały bajt w danej chwili. Na pierwszy rzut oka coś za dużo tych przewodów. Należałoby coś skrócić i wyrzucić. Tak też zrobimy.

Przypatrz się zapisowi binarnemu liczby 65, wygląda to tak: 01000001. Prześlijmy to jednym przewodem! Rozpoczynamy od prawej strony. Najpierw na linię (przewód) wysyłamy jedynkę, potem zero, raz jeszcze zero, itd... Gdy przesłany zostanie cały bajt, drukarka wydrukuje A, a komputer tym sposobem przesłać może kolejny kod do druku. Proste?

No tak, ale skąd drukarka ma wiedzieć jak rozróżnić kilka jedynek, lub zer które zostaną przesłane jeden za drugim? Przydałaby się dodatkowa linia dla sygnału synchronizującego. Ale zatraca się idea by przewodów było jak najmniej. Co zrobić? Rusz mózgiem. Należy w komputerze zbudować generator który taktować będzie wysyłanie kolejnych bitów. Drukarkę też można wyposażyć w taki sam generator który taktować będzie odbiór. Jeden warunek. Te dwa generatory muszą pracować na tej samej częstotliwości. W przeciwnym wypadku nic z tego nie wyjdzie. I tak oto, takt generatorów wyznacza jednoznacznie moment nadawania i odbioru poszczególnych bitów z bajtu. Widać że wszystko dzieje się bardzo precyzyjnie, generatory "rządzą" całością. Wszystko to dobre, ale po chwili te dwa generatory i tak się rozstroją, nawet gdyby sterowane były kwarcem! Na dłuższą metę wszystko do kitu.

Co tu jeszcze wymyśleć?

Należy całość dodatkowo synchronizować, a to oznacza dodatkowy przewód, czego chcemy uniknąć! A gdyby tak linią danych przed właściwym sygnałem wysłać impuls synchronizujący? To jest to! Zróbmy tak. Generatory zostają, zostaje przewód masy i przewód sygnałowy, ale gdy nie jest wysyłany żaden sygnał to komputer ustawia na nim +5V. I teraz. Komputer chce wysłać znak, czyli jeden pełny bajt, (osiem bitów) Przed tym jednak, wysłany zostaje impuls synchronizacji. Na czas trwania jednego taktu generatora, linia danych ustawiana jest na zero. Ten skok z +5V na 0V jest przez drukarkę wykrywany i następuje jednocześnie synchronizacja jej generatora. Po jednym takcie wysyłany jest właściwy sygnał, a po jego przesłniu, niezależnie czy ostatnim bitem była jedynka czy zero, komputer ustawia na lini danych +5V, jest to tzw. bit stopu. Ponowne nadawanie nastąpi po impulsie synchronizacji. GENIALNE!

Jest oczywiste, że przesłanie ośmiu bitów to "mgnienie", w tym czasie dwa pracujące generatory nie zdążą się "rozjechać" by namieszać w transmisji. Po chwili przecież nadejdzie kolejny impuls synchronizujący i tak czy owak wszystko wróci do normy! To co przeczytałeś i mam nadzieję zrozumiałeś, jest właśnie łączem RS-232C. Prawda, że proste?

Ale... aby jednak nie było całkiem proste, (bo wtedy byłby to drut!), konstruktorzy RS-232 wymyślili pewne dziwactwo, które po dzień dzisiejszy straszy szanującego się elektronika. Na czym to dziwactwo polega. Otóż, jak napisano wyżej, gdy bit przyjmuje wartość 0, to na przewód nie podaje się żadnego napięcia, a gdy przyjmuje wartość jeden, to na przewód (linię) podaje się +5V. Ale nie w standardzie RS-232! Zapamiętaj to! Tam jest inaczej. Jak?

Gdy bit ma wartość zero, to na linię podaje się +12V, a gdy bit ma wartość jeden, to -12V. Tak, to nie pomyłka, stosuje się symetryczne zasilanie +-12V (plus, minus 12V). Gdzie to dziwactwo, zapytasz? Te napięcia można jeszcze przyjąć, wręcz tak powinno być, bo wtedy różne zakłócenia nie mają tak dużego wpływu na przebieg transmisji. Ale zauważ, gdy bit ma wartość zero, to reprezentuje go wartość napięcia +12V. Czy nie wydaje Ci się, że powinno być -12V I na odwrót, to samo z jedynką. W związku z tym elektronicy mają ciężki orzech do zgryzienia, bo nie tylko trzeba budować dodatkowy zasilacz, ale też odpowiednio "obrócić" napięcia. W erze układów scalonych to nie problem, ale dawniej, powstawała dosyć strzelista konstrukcja która to realizowała.

Co z tego wynika dla programistów?

      Ci to mają żywot! Powiem zatem że nic! Po prostu piszą odpowiedni program komunikacyjny i już! Jedyne na co muszą zwrócić uwagę to to, by bity z bajtu w odpowiedniej kolejności wysłać (od najmniej znaczącego poczynając), no i by zachować jedną ze standardowych szybkości transmisji, tak by kolega "za oceanem" mógł to co jest nadawane odebrać na swoim sprzęcie. A te szybkości nadawania to: 30, 75, 150, 300, 600, 1200, 2400, 4800, 9600, 19200, 28800 bodów itd... Niektóre są jakoś "dziwnie" znajome, czy poznajesz które?

Jak wynika z opisu, aby przesłać osiem bitów (jeden bajt) należy w rzeczywistości wysłać dziesięć bitów:

  • bit startu, który jest jednocześnie bitem synchronizującym
  • osiem bitów danych
  • bit stopu
Jeżeli dodamy do tego jeszcze jeden bit, tzw. bit parzystości, to wychodzi nam jedenaście bitów. Ale sprawa bitu parzystości jest osobnym zagadnieniem i tu zostanie pominięta. Napiszę tylko że jeżeli jest stosowany, to przyjmuje wartość jeden gdy w bajcie jest nieparzysta liczba jedynek, a zero gdy parzysta. Wysyła się go po ostatnim bicie z bajtu, a przed bitem stopu.

Czy potrafisz już zbudować najprostszy RS-232?

Wystarczą do tego trzy przewody:

  • przewód masy
  • przewód "nadawaj"
  • przewód "odbieraj"
resztę zrobi program i... dobry programista. Pomijam tu sprawę interfejsu gdyż poprzez gniazda joysticka można ze sobą połączyć dwie Atarynki, bez dorabiania czegokolwiek! A że będzie to "chodzić" na 5V? A co to szkodzi?

Uwaga! To tylko propozycja!

      Oto schemat właśnie takiego najprostszego interfejsu, ale tylko do połączenia dwóch komputerów Atari! Może ktoś napisze krótki programik do obsługi tego (może być do 256 bajtów). Połączenie np Atari z Amigą, czy PC'tem wymaga już "prawdziwego" RS'a-232.

      Cóż tu jeszcze napisać? Acha, straszą jakoś dziwnie te generatory które trzeba mieć. Nie martw, się, wcale nie są potrzebne, ich rolę może przejąć zmyślnie napisana procedura transmisji, nie jest to wcale takie trudne. W języku assemblera może wyglądać jakoś tak:

     lda #65   kod do wysłania
     ldy #0    to będzie bit startu
     sec       to będzie bit stopu

     sty PORT
     jsr takt  wysyłamy bit startu

     sta PORT  wysyłamy najmłodszy bit
     jsr takt  wyznacza takt

     ror @     przesuwamy bajt w prawo
     sta PORT  wysyłamy następny bit
     jsr takt

     ror @     itd... itp...
     sta PORT  aż wysłanych zostanie osiem bitów
     jsr takt
     ...
     ...

     ror @     jeszcze bit stopu, czyli to co było w C
     sta PORT
     jsr takt

     rts       no i bajt "poszedł"

 * tu podprogram

 takt ldx #100   to tylko przykład pętli opóźniającej
 dal  dex        która taktuje transmisję
      bne dal
      rts

      end

Teraz niespodzianka...

Z pewnością chciałbyś już widzieć w akcji RS-232. Zatem, połącz jeden komputer Atari z drugim w następujący sposób:

      1. PIN 1 PORTU 1 ATARI 1 połącz z PIN 3 PORTU 1 ATARI 2
      2. PIN 1 PORTU 1 ATARI 2 połącz z PIN 3 PORTU 1 ATARI 1
      3. PIN 8 PORTU 1 ATARI 1 połącz z PIN 8 PORTU 1 ATARI 2

Plik: ASI.COM jest nakładką, należy go wczytać z poziomu DOS'a do obydwu komputerów.

Plik: TERMINAL.BAS jest przykładem programu który pozwala realizować następującą funkcję: Stukasz coś na klawiaturze jednego komputera, a na ekranie obydwu, pisze się to samo! Plik ten, też należy wczytać do obydwu komputerów, tym razem z poziomu BASIC'a Obydwa programy pochodzą z Tajemnic Atari, ich autorem jest J.B.W.

Sprawdzone, działa!

Oprogramowanie znajduje się na dysku!

Jeżeli ktoś jest w posiadaniu TA 10/92 to może spróbować "pobawić" się na jeszcze inne sposoby.

Zenon/Dial