Uruchomienie litery z tablicy dworcowej, część III

Nie miałem jeszcze zrzuconego programu ze sterownika, więc postanowiłem spróbować metody brute force – do programu generującego przebieg prostokątny dodałem możliwość sterowania czterema pozostałymi pinami – ustawiając ich stan na niski, wysoki, lub co najważniejsze – losowy, zmieniający się z każdą zmianą stanu pinu zegarowego. Dodałem też możliwość generowania różnych ciągów losowych na różne piny, lub użycia jednego na kilku. Na koniec zaimplementowałem bardzo ważną funkcję – zapamiętywanie tego, co zostało wysłane i przerywanie transmisji za dotknięciem jednego klawisza. Ponownie podłączyłem moduł do płytki rozwojowej za pomocą zapałek i uruchomiłem zasilanie.

Po poprawnym resecie wydałem pierwsze polecenie – losowy przebieg na A1. Chwila oczekiwania i… nic. Losowy przebieg na A6 – to samo, głuche nic. Te same losowe wartości na A1 i A6 – nic. Losowe, różne od siebie, wartości na A1 i A6? Czekam… czekam… i wtem silnik kręci! Podekscytowany czekałem na zatrzymanie i obejrzałem pełny obrót modułu. Po prostu wrócił do pozycji początkowej – prawdopodobnie mikrokontroler zresetował się samoczynnie po otrzymaniu danych z mojej płytki. Mimo wszystko był to jednak sukces – zmusiłem go do tego resetu sam, więc najprawdopodobniej do sterowania wystarczą tylko piny A1 i A6.

Wykonałem kolejną próbę, która zakończyła się jeszcze ciekawiej – moduł zaczął kręcić się bez końca. Jeszcze ciekawszy problem – pomyślałem i zresetowałem go prądowo. Kolejna próba przyniosła reset taki jak za pierwszym razem. Spodziewałem się, że jeszcze co najmniej kilkanaście prób czeka mnie przed zbliżeniem się do rozwiązania, ale wiedziałem że jest ono całkiem blisko. Następna próba potwierdziła moje oczekiwania – po chwili bezruchu silnik zaczął się obracać aby zatrzymać się niemal natychmiast, na literze “D”. Szybkie zatrzymanie wysyłania danych i okrzyk radości oznaczający kolejny sukces.

Przypadek, czy nie? Zgrałem zapisaną transmisję ze swojej płytki i umieściłem ją w programie po czym ponowiłem próbę. Moduł bez chwili zawahania obrócił się znów do litery D. Działa! Gdzieś pośród prawie dwóch tysięcy bajtów które wysyłałem do modułu było kilka takich, które wprawiały je w ruch. Tylko które dokładnie to są? Nie miałem oczywiście pojęcia, więc wprowadziłem kolejne poprawki do programu, dodając opcje wycinania zadanego przedziału bajtów. Pomysł okazał się strzałem w dziesiątkę i po rozszerzeniu tej opcji do działania na bitach i kilkudziesięciu minutach prób otrzymałem ciąg mający około 10 bajtów i ustawiający moduł na D.

Wciąż oczywiście wycinałem kolejne bity i za którymś razem zauważyłem coś bardzo ciekawego – po wycięciu niektórych bitów zamiast D ustawiała się litera A. Potem udało mi się jeszcze uzyskać I oraz E. Czasami udawało się przełączanie między tymi literami, ale nie było to regułą. Spory i spektakularny sukces, ale kryje się za nim jedna ważna informacja – skoro wycinając jeden bit jestem w stanie ustawić A zamiast D, to znaczy że protokół sterowania nie ma sum kontrolnych. Gdyby wiadomości były nimi sprawdzane, taka podmiana uczyniłaby komunikat nieprawidłowym, tutaj jednak po prostu zadziałał. Brak sum kontrolnych to szczególnie niepokojąca informacja w kontekście sterowania grupą znaków, obawiałem się że bez dobrej znajomości protokołu będę mieć problemy z tym zadaniem.

Następnego dnia, będą w pracy, przystąpiłem do zgrywania zawartości kości pamięci EPROM z dwóch płytek sterownika. Po ustawieniu kilkunastu przełączników i zworek w Willemie na właściwe pozycje a następnie zmuszeniu systemu operacyjnego do pracy z tym zabytkiem (co było zdecydowanie trudniejszym zadaniem) udało się. Dwa programy były już na moim dysku. Nie zabrałem się jednak za ich deasemblację – byłem na tyle blisko rozpracowania protokołu, że byłaby ona stratą cennego czasu.

Popołudnie, wieczór i noc spędziłem na wycinaniu kolejnych bitów z transmisji. Zostało ich już tylko 8, ale litery wciąż były te same i nie udawało mi się znaleźć sposobu na wyświetlanie innych i na pewne przełączanie się między tymi już ustawionymi (wciąż szwankowało). Późnym wieczorem, rozrysowałem transmisje bitowo, na kartce w kratkę, planując następny dzień poświęcić na ich analizę.

Świeży umysł widząc notatki z dnia poprzedniego zadziałał zdecydowanie lepiej – po kilkudziesięciu minutach wpatrywania się w czarne i białe prostokąty odnalazłem miejsca w których moim zdaniem były zapisane znaki i miejsce w którym zapisany był adres modułu. Nie tracąc czasu, przetestowałem swoje pomysły – pomijając kilka początkowych problemów, udało się właściwie od razu! Wciąż nie byłem do końca pewien co robią wszystkie bity które wysyłam, wiedziałem jednak gdzie muszę ustawić adres i gdzie muszę ustawić znak. Po wysłaniu tych dwóch wartości należało jeszcze wysłać nierozpoznaną do końca przeze mnie grupę bitów i dopiero wtedy moduł obracał się na wybraną pozycję. Czyżby była to wiadomość włączająca obrót?

Przetestowałem kilka różnych, działających kombinacji bitów w to miejsce i szybko znalazłem taką, która “nie psuła” modułu, czyli pozwalała na zmianę raz ustawionego znaku. Po kilkudziesięciu próbach upewniłem się, że program faktycznie działa! Adres modułu również mogłem zmieniać i wciąż móc ustawiać dowolny znak. Udało się! Wiedziałem, że na pewno w moim programie są jeszcze błędy które odkryję mając więcej liter, ale na chwilę obecną działał niezawodnie!

Rozpracowanie protokołu do stanu, w którym mogłem sterować pojedynczą literą zajęło mi tydzień – całkiem nieźle, jak na coś rzekomo niemożliwego do zrealizowania. Jedyne co mi pozostało, to czekać na załatwienie formalności przez PKP, transport samych tablic do Wrocławia i dostarczenie podzespołów elektronicznych które zamierzałem wykorzystać do zbudowania własnego sterownika.