Dokumentacja automatyki sterującej Planetarium
Transkrypt
Dokumentacja automatyki sterującej Planetarium
Dokumentacja automatyki sterującej Planetarium Część II Opis szczegółowy Warstwa aplikacji Lista rozkazów Oto kompletna lista rozkazów rozpoznawana przez program sterujący i wykonywana przez sterownik. W drugiej kolumnie znajdują się mnemoniki rozkazów, w kolumnie Adres Sterownika jest bezwzględny adres podawany przez interfejs na linie adresowe sterownika właściwego, podobnie kolumna danych. Ponieważ sterownik jest niczym innym, jak tylko symulatorem naciskania i zwalniania przycisków pulpitu i sprzęgnięty z komputerem interfejsem, to program sterujący (w bibliotece DLL) sam zadba, by po sekwencji adresu i danej odpowiadającej np. rozkazowi ściemnienia białego światła kopuły posyłając rozkaz „biala c”, co odpowiada naciśnięciu przycisku na pulpicie powodującego uruchomienie ściemniacza białego podświetlenia kopuły, należy go potem zwolnić, wysyłając odpowiednie wartości zerujące pod adres wciśniętego przycisku (Adresy od 0 do 7 liczbę 0 i dla adresów od 8 do 23 liczbę FF. To jest funkcja implicite wynikająca z konstrukcji sterownika. Lista rozkazów jest niestety silnie nieortogonalna i niekonsystentna, co jest zaszłością z wczesnych lat 90., gdy opracowywany był pierwotny system pracujący pod DOS-em i zaprogramowany w BASIC-u, zaś rolę interfejsu pełniła stosunkowo łatwa do wykonania karta ISA; manifestuje się to między innymi tym, że dana grupa rozkazów jest adresowana wspólnie, zmieniają się tylko poszczególne bity w bajcie danych – ale bywa na odwrót – bajt danych jest wspólny, a program musi rozpoznać i poustawiać odpowiednie bity adresów, przy czym grupy nie są skonstruowane logicznie, w związku z czym parser dla treści projekcji wykonuje zawiłe niekiedy manipulacje bitowe choć biorąc pod uwagę prędkość przetwarzania współczesnych komputerów można rozbudować aplikację sterującą bez mierzalnych strat czasowych, za to o wiele przejrzystszą dla wprowadzających poprawki i nowe funkcje. LP. ROZKAZ ADRES BAJT STEROWNIKA DANYCH KOMENTARZ 1 biala c 21 247 Kopuła biała ciemno 2 biala j 22 254 Kopuła biała jasno 3 biala sr 22 247 Prędkość zmian jasności kopuły białej średnia 4 biala stop 16 239 Stop zmian jasności kopuły białej 5 biala szyb 16 191 Prędkość zmian jasności kopuły białej szybka 6 biala wol 19 259 Prędkość zmian jasności białej kopuły wolna bieg gal 9 254 Włączenie/wyłączenie bieguna galaktyki bieg i kat godzinny 13 251 Włączenie/wyłączenie wskaźnika położenia bieguna północnego wraz z kątem godzinnym 9 chmury c 12 223 Projektor chmur ciemno 10 chmury j 15 191 Projektor chmur jasno 11 czer c 23 223 Kopuła czerwona ciemno 12 czer j 18 253 Kopuła czerwona jasno 13 czer sr 13 247 Prędkość zmian jasności kopuły czerwonej - średnia 14 czer stop 18 254 Stop zmian jasności kopuły czerwonej 15 czer szyb 12 239 Prędkość zmian jasności kopuły czerwonej - szybka 16 czer wol 12 127 Prędkość zmian jasności kopuły czerwonej – wolna 17 eklip 8 223 Włączenie/wyłączenie ekliptyki 18 gal 21 253 Rozjaśnianienie/ściem nienie Drogi Mlecznej 19 gasz planet 15 239 Gaszenie planet 20 gw c 21 254 Projektor gwiazd ciemno 21 gw j 20 254 Projektor gwiazd jasno 22 gw sr 21 251 Prędkość zmian jasności gwiazd średnia 23 gw stop 20 251 Stop zmian jasności gwiazd 7 8 24 gw szyb 20 191 Prędkość zmian jasności gwiazd szybka 25 gw wol 18 127 Prędkość zmian jasności gwiazd wolna 26 gwiaz c 30 191 Gwiazdozbiory ciemno 27 gwiaz j 23 247 Gwiazdozbiory jasno 28 gwiaz zod c 17 223 Gwiazdozbiory zodiakalne ciemno 29 gwiaz zod j 20 239 Gwiazdozbiory zodiakalne jasno 30 hor 12 st 8 251 Linia horyzontalna na wysokości 12 stopni włącz/wyłącz 31 hor 6 st 10 253 Linia horyzontalna na wysokości 6 stopni włącz/wyłącz 32 hor pld c 12 254 Horyzont południowy ciemno 33 hor pld j 17 191 Horyzont południowy jasno 34 horyz pln c 23 191 Horyzont północny ciemno 35 horyz pln j 19 223 Horyzont północny jasno 36 horyz wsch c 22 223 Horyzont wschodni ciemno 37 horyz wsch j 19 239 Horyzont wschodni jasno 38 horyz zach c 21 223 Horyzont zachodni ciemno 39 horyz zach j 23 239 Horyzont zachodni jasno 40 jow c 22 253 Projektor Jowisza ciemno 41 jow j 16 127 Projektor Jowisza jasno 42 jow 10 223 Planeta Jowisz włącz/wyłącz 43 kol pion 16 223 Koło pionowe włącz/wyłącz 44 kom c 9 191 Kometa ciemno 45 kom j 11 247 Kometa jasno 46 ks c 20 247 Kometa ciemno 47 ks j 19 191 Księżyc jasno 48 ks stop 23 127 Zmiana jasności Księżyca stop 49 licznik lat 13 239 Wyświetl/zgaś licznik lat 50 tarcza 15 254 REZERWA 51 linia ziem merc 15 223 Włącz/wyłącz linię łączącą Ziemię z Merkurym w modelu heliocentrycznym Kopernika 52 linia ziem sl 15 251 Włącz linię ZiemiaSłońce w modelu heliocentrycznym Kopernika 53 mapa c 9 223 Projektor mapy ciemno 54 mapa j 8 247 Projektor mapy jasno 55 mars 8 254 Planeta Mars jasno/ciemno 56 merc 14 191 Planeta Merkury jasno/ciemno 57 meteor wl 20 223 Projektor meteorów włącz 58 meteor wyl 20 223 Projektor meteorów wyłącz 59 nieb c 16 247 Kopuła niebieska ciemno 60 nieb j 17 127 Kopuła niebieska jasno 61 nieb sr 23 251 Prędkość zmian jasności kopuły niebieskiej - średnia 62 nieb stop 16 254 Stop zmian jasności kopuły niebieskiej 63 nieb szyb 19 251 Prędkość zmian jasności kopuły niebieskiej - szybka 64 nieb wol 18 239 Prędkość zmian kopuły niebieskiej wolna 65 panor c 17 254 Projektor panoramy ciemno 66 panor j 12 253 Projektor panoramy jasno 67 panor stop 8 191 Zmiana jasności panoramy stop 68 plan c 18 247 Planety ciemno 69 plan dol 16 253 Planety „dolne” włącz/wyłącz 70 plan gor 21 239 Planety „górne” włącz/wyłącz 71 plan j 10 247 Planety jasno 72 plan stop 22 191 Zmiana jasności planet stop 73 plan wsz 21 191 Wszystkie planety włącz 74 polud 11 191 Włącz/wyłącz lokalny południk 75 proj fil 20 253 REZERWA 76 rownik 8 253 Włącz/wyłącz równik niebiesk 77 roza wiatrow 12 191 Włącz wyłącz projektory róży wiatrów 78 ruch bieguna prosty 2 128 Procedura obsługi ruchów bieguna, dziennego, rocznego i precesyjnego jest opisana osobno z uwagi na jej złożoność 79 ruch bieguna wstecz 2 16 ---”--- 80 ruch bieguna wol 0 32 ---”--- 81 ruch bieguna sr 2 1 ---”--- 82 ruch dzienny prosty 7 16 ---”--- 83 ruch dzienny wstecz 2 4 ---”--- 84 ruch dzienny wol 0 8 ---”--- 85 ruch dzienny sr 0 16 ---”--- 86 ruch dzienny szyb 3 128 ---”--- 87 ruch jow stop 8 239 Zatrzymaj ruch projektora Jowisza 88 ruch jow szyb 9 251 Ruch projektora Jowisza szybki 89 ruch jow wol 11 239 Ruch projektora Jowisza wolny ruch komety start 7 64 Ruch komety start 91 ruch komety stop 6 32 Ruch komety stop 92 ruch precesja prosty 6 128 Procedura obsługi ruchów bieguna, dziennego, rocznego i precesyjnego opisana jest osobno z uwagi na jej złożoność 93 ruch precesja wstecz 4 16 ---”--- 94 ruch precesja wol 7 128 ---”--- 95 ruch roczny prosty 1 16 ---”--- 96 ruch roczny wstecz 1 64 ---”--- 97 ruch roczny sr 3 16 ---”--- 98 ruch roczny wol 2 2 ---”--- 99 ruch roczny szyb 3 2 ---”--- 100 ruch satel stop 6 1 Ruch satelity stop 101 ruch satel 1 2 Ruch satelity włącz 90 ruch uk sl stop 10 254 Ruch heliocentrycznego modelu Układu Słonecznego Kopernika stop 103 ruch uk sl szyb 10 191 Ruch heliocentrycznego modelu Układu Słonecznego Kopernika - szybki 104 ruch uk sl wol 11 253 Ruch modelu układu heliocentrycznego Kopernika - wolny 105 ruch prosty 5 64 REZERWA 106 ruch wstecz 1 4 REZERWA 107 ruch wol 0 1 REZERWA 108 rz j 13 254 Rzutnik slajdów jasno 109 rz c 22 239 Rzutnik slajdów ciemno 110 rz l wl 9 239 Rzutnik lewy włącz 111 rz l wyl 9 127 Rzutnik lewy wyłącz 112 rz p wl 8 127 Rzutnik prawy włącz 113 rz p wyl 14 239 Rzutnik prawy wyłącz 114 rz l+1 18 251 Slajd w rzutniku lewym o jeden do przodu 115 rz p+1 11 251 Slajd w rzutniku prawym o jeden do przodu 116 rzut obw 20 253 REZERWA 117 satel c 10 127 Satelita ciemno 118 satel j 18 223 Satelita jasno 119 sat 10 251 Planeta Saturn włącz/wyłącz 120 scyn 23 254 REZERWA 121 sl c 10 239 Słońce ciemno 122 sl j 11 223 Słońce jasno 102 123 sl sr 19 247 Słońce średnie 124 sl stop 9 253 Zmiana jasności Słońca stop 125 strzalka 12 251 Projektor strzałki włącz/wyłącz 126 uk sl c 9 247 Model heliocentryczny Układu Słonecznego ciemno 127 uk sl j 11 254 Model heliocentryczny Układu Słonecznego jasno 128 wen 14 254 Planeta Wenus włącz/wyłącz 129 wsp hor 20 127 130 zacm ks 17 247 Uruchom zaćmienie Księżyca zacm sl 11 127 Uruchom zaćmienie Słońca 132 ziel c 17 253 Kopuła zielona ciemno 133 ziel j 22 127 Kopuła zielona jasno 134 ziel stop 21 127 Zmiana jasności kopuły stop 135 ziel sr 16 251 Prędkość zmiany jasności kopuły zielonej - średnia 136 ziel szyb 17 239 Prędkość zmiany jasności kopuły zielonej - szybka 137 ziel wol 17 251 Prędkość zmiany jasności kopuły zielonej - wolna 138 ziemia geoc 12 247 Ziemia geocentryczna 139 ziem 14 127 Planeta Ziemia włącz/wyłącz 140 zmiana panoram 14 253 Zmień obrazy we wszystkich sektorach projektora panoramy 131 141 zod 23 253 Koło znaków zodiaku w modelu heliocentrycznym Układu Słonecznego 142 kopula11 38 1 REZERWA 143 zorza wl 3 32 REZERWA 144 zorza wyl 7 1 REZERWA 145 sk 146 wideo wl 7 4 REZERWA 147 wideo wyl 2 64 REZERWA 148 wideo j 2 32 REZERWA 149 wideo c 7 8 REZERWA 150 rz ob wl 3 64 Rzutniki obwodowe włącz 151 rz ob wyl 6 4 Rzutniki obwodowe wyłącz 152 rz ob+1 6 64 Rzutniki obwodowe wszystkie o jeden slajd do przodu 153 rz ob c 6 16 Rzutniki obwodowe ciemno 154 rz ob j 5 128 Rzutniki obwodowe jasno 155 rz ob stop 5 16 Zmiana jasności rzutników obwodowych stop 156 rz ob wstecz 4 32 Rzutniki obwodowe wszystkie o jeden slajd wstecz 157 sky1 Sterowanie rzutnikami karuzelowymi Ektapro omówione jest osobno ze względu na inny sposób sterowania 158 sky2 ---”--- 159 sky3 ---”--- 160 sky4 ---”--- 161 sky5 ---”--- 162 sky6 ---”--- REZERWA 163 sky ---”--- 164 skywl ---”--- 165 sky1wl ---”--- 166 sky2wl ---”--- 167 sky3wl ---”--- 168 sky4wl ---”--- 169 sky5wl ---”--- 170 sky6wl ---”--- 171 skywyl ---”--- 172 sky1wyl ---”--- 173 sky2wyl ---”--- 174 sky3wyl ---”--- 175 sky4wyl ---”--- 176 sky5wyl ---”--- 177 sky6wyl ---”--- 178 skyj ---”--- 179 skyc ---”--- 180 tarhd 4 4 Zasłoń/odsłoń projektor video HD 181 koniec - - Sygnaturka końca projekcji – koniec przetwarzania danych Lista rozkazów wyekstrahowana z programu przetsky.bas, stan na 1.03.2011 ( PB) Aplikacja sterująca automatyką napisana jest w języku C i używa bezpośrednich wywołań WinAPI. To rozwiązanie pozwoliło uzyskać większą kontrolę nad programem, jakkolwiek fakt ten może utrudnić integrację systemów, gdyż nie zaleca się mieszania jakichkolwiek enkapsulatorów z „czystymi” wywołaniami WinAPI, gdyż może to prowadzić do nieprzewidzianych zachowań aplikacji, jako że cały łańcuch wywołań WinAPI jest zamknięty w obiekcie (klasie), którego sekcja inicjująca wykonuje wszelkie niezbędne operacje i jakiekolwiek wywołanie funkcji, która jest przez obiekt wykorzystywana, „za jej plecami” przez fragment kodu sterowania projekcją może prowadzić i zazwyczaj doprowadza do licznych programistycznych powikłań. Do dyspozycji pozostaje zawsze import biblioteki DLL zawierającej wszystkie niezbędne funkcje, którą można użyć na dowolnej innej platformie programistycznej pamiętając o tym, że biblioteki nie wolno wyładować z pamięci i nie można pozwolić na wywłaszczenie bądź zawieszenie wątku, jako że przepływ rozkazów projekcji jest krytyczny czasowo, a ich przetwarzanie musi odbywać się w czasie rzeczywistym. Przykładowy tekst źródłowy fragmentu projekcji: Licznik synchronizacji 25 Komendy do wykonania Komentarz biala wol - biala c 48 ziel wol - ziel c 73 czer wol - czer c - nieb sr 95 rz l wl - rz p wl - rz j 189 nieb c - czer c 212 nieb stop 220 rz c 301 ruch roczny prosty - ruch roczny wol #900 308 sl j - rz l+1 - rz p+1 322 eklip - rz l wyl - rz p wyl 524 eklip - nieb j - czer j 538 panor j 600 ruch dzienny prosty - ruch dzienny wol #2100 737 sl c - czer c 794 gw sr - gw j - gal 885 nieb c 1122 panor c 1786 rz l wl - rz j 1883 rz c 2057 rz l+1 Plansze tytułowe Koniec plansz tytułowych Rysunek UMa 2064 rz l wyl Widać, że w określonym czasie następuje wysłanie rozkazu bądź sekwencji, jak w przypadku np. sterowania ruchami aparatury. Rozdzielczość impulsów synchronizacji wynosi 1/4 sekundy, ale z powodu ograniczeń czasowych, o których za chwilę, praktycznie stosuje się odstęp przynajmniej 4 impulsów pomiędzy kolejnymi rozkazami. Realizowane jest to poprzez narzucenie rygorów czasowych dla osób programujących projekcję i fizyczne ograniczenia aparatury planetarium. Ponieważ elementami wykonawczymi są - w ostatnim ogniwie łańcucha przebiegu sygnału sterującego - przekaźniki, należy uwzględnić ich charakterystyki czasowe. Jeśli impuls będzie za krótki, przekaźnik nie zadziała. Dotyczy to w szczególności przekaźników rtęciowych. Stąd właśnie metodą empiryczną ustalono, że czas wciśnięcia i zwolnienia przycisku przez człowieka w najlepszym razie wynosi 0,5 sek. Ponieważ przycisk można przytrzymać dowolnie długo, ustalono arbitralnie, że zwolnienie przycisku następuje po 0,5 sek. od jego naciśnięcia. Dotychczasowa ścieżka synchronizacji była zapisywana jako jeden z kanałów audio odtwarzacza DVD i doprowadzona jako sygnał analogowy do układu formowania impulsów w sterowniku właściwym, gdzie grupa liczników po preskalerze zlicza je w 16-bitowym liczniku, który można odczytać za pomocą interfejsu. Ponieważ przewiduje się, że to komputer sterujący będzie wytwarzał sygnał synchronizujący, jako że obrazy do wyświetlenia – czyli praktycznie cały materiał AV będzie odtwarzany z lokalnych zasobów sterowania projektorami FullDome, trzeba zapewnić właściwą obsługę kolejki komunikatów. Ponieważ system Windows nie gwarantuje niezawodności obsługi komunikatu WM_TIMER, pozostaje opcja użycia timera wysokiej precyzji, tak więc prezentacja kodu źródłowego aplikacji na tym etapie integracji mija się z celem, gdyż w zależności od wybranego schematu połączenia systemów aplikacja może przybrać zupełnie inny kształt, niż pierwotnie założono i zapewne w trakcie licznych konsultacji zostanie doprecyzowany ostateczny jej kształt. Niezmienniki wyznaczone są przez przepływ obsługi programu projekcji: 0. Przy ładowaniu biblioteki DLL wykonywane są niezbędne procedury inicjujące. 1. Wczytaj do pamięci listę rozkazów danej projekcji i ustaw wskaźnik na pierwszy element listy – parser automatycznie stworzy struktury grup rozkazów do wykonania w momencie zrównania licznika synchronizacji z wartością w strukturze, na którą wskazuje bieżący – w tym wypadku pierwszy element listy rozkazów projekcji. 2. Wyzeruj liczniki – funkcją biblioteczną komunikacji z interfejsem 3. Odczytuj licznik synchronizacji z prędkością nie mniejszą niż 8 razy na sekundę. 4. Porównaj stan licznika ze składnikiem struktury na którą wskazuje wskaźnik programu. 5. Jeśli liczby są równe, wywołaj funkcję biblioteczną komunikacji z interfejsem i przekaż jej wskaźnik programu. W oparciu o dane przez niego wskazywane funkcja obsługi interfejsu prześle je do wykonania. Przesuń wskaźnik programu projekcji na następną pozycję – jeśli jej wartość wynosi NULL, oznacza to koniec przetwarzania danych programu projekcji. 6. Powtarzaj (4) aż do momentu wystąpienia warunku opuszczenia pętli wykonywania programu projekcji Pozostaje kwestia uzgodnienia sposobu integracji z systemem FullDome. Na tym etapie możliwe jest zarówno wyniesienie z aplikacji sterującej całego aparatu wykonawczego instrukcji programu do zewnętrznej biblioteki DLL, bądź połączenia obu systemów w jednej aplikacji. Jak zaznaczono wcześniej, komputer sterujący musi posiadać dwa złącza komunikacyjne RS232C: jedno do połączenia z interfejsem, drugie zaś do sterowania systemem sześciu rzutników przeźroczy rozmieszczonych tak, by pokryć obrazem całą powierzchnię sfery kopuły. Sterowanie odbywa się za pomocą protokołu P-Bus z prędkością 9600bit/s. Wykorzystywane są tylko niektóre rozkazy z szerokiego wachlarza funkcji, ale tym także zajmuje się moduł biblioteczny do sterowania planetarium: rozpoznaje rozkaz do rzutników i zapewnia odpowiednią komunikację. Pełny opis implementacji protokołu P-Bus dla wykorzystywanych przez nas rzutników Kodak EktaPro 7020 można znaleźć tu: http://www.micro-tools.com/pdf/kodak/RefPubs/P-COM.pdf Warstwa sprzętowa Interfejs Jakkolwiek opis interfejsu został umieszczony w sekcji poświęconej warstwie sprzętowej, to właściwiej byłoby go osadzić jako element rozmyty między sprzętem a oprogramowaniem. Interfejs stanowi pomost pomiędzy komputerem sterującym a sterownikiem właściwym aparatury projekcyjnej – planetarium. Jego konstrukcja elektroniczna jest bardzo prosta dzięki zastosowaniu mikrosterownika PIC16F876A firmy Microchip. W całym obwodzie znajdują się tylko układy zasilania, bufory magistral adresowych i danych w postaci dwóch układów dwukierunkowych driverów magistral 74HCT245, przy czym driver linii adresowych i sterujących jest na stałe ustawiony jako przeźroczysty jednokierunkowy bufor trójstanowy; transceiver RS232C <---> TTL zrealizowany na popularnym układzie MAX232 zgodnie z kartą katalogową firmy Maxim i układ kontrolek LED sygnalizujących stan interfejsu. Interfejs wyposażony jest w dwa złącza: – DB9/F: komunikacja z komputerem sterującym na warstwie RS232C – DB25/F: komunikacja interfejsu ze sterownikiem właściwym. Oprogramowanie jest również proste, choć dla przejrzystości – napisane jest bowiem całkowicie w asemblerze – niektóre sekcje zostały pominięte, natomiast wyeksponowano całą ideę komunikacji interfejsu z komputerem. PIC16F876A posiada trzy 8-bitowe porty I/O, z czego jeden port jest poświęcony w całości dwukierunkowej komunikacji z 8-bitową magistralą danych, drugi tylko jako wyjście do 6-bitowego adresowania sterownika oraz wytwarzania sygnałów TX i odbierania RX wbudowanego modułu AUSART za pośrednictwem – jak już wspomniano - układu MAX232. Transmisja odbywa się przy niedużej prędkości 9600bit/s z uwagi na wysoki miejscami poziom skażenia elektromagnetycznego (głównie na trasie linii zasilających elementy dużej mocy planetarium). Trzeci port obsługuje linie sterowania buforami (zapis/odczyt/kierunek/stan wysokiej impedancji) oraz dodatkowo ma zaimplementowaną programową obsługę szyny I2C, co rozszerza jego możliwości komunikacyjne ze środowiskiem, w którym pracuje. Konstrukcja jest praktyczna i elastyczna, ponieważ w każdej chwili można bez problemu obciążyć wytwarzaniem sygnałów czasowych, czy wręcz zaawansowanej obsługi rozkazów, układ mikrosterownika i wyniesienie tych funkcji poza aplikację główną – możliwe są różne scenariusze, co będzie miało duże znaczenie przy integracji systemów. Oto podstawowa wersja oprogramowania wewnętrznego interfejsu (tzw. firmware) z programowym handshake i obejmującą najważniejsze struktury mikrokodu, w całości zaprezentowane są funkcje USART i najczęściej wywoływanej funkcji żądania odczytu licznika, dla przejrzystości opisu usunięto dłuższe sekcje kodu obejmujące procedury postępowania w przypadkach nagłego zerwania transmisji itp. Poza tym dokumentacja w założeniu nie wymaga od Czytelnika znajomości asemblera mikrosterowników firmy Microchip. ;(PB) 2010 Kontroler Aparatury Projekcyjnej ;(PB) 14.02.2011 wersja 0.99b ;Definicje pojęć: ; - sterownik: urządzenie konstrukcji Jacha bezpośrednio sprzężone z aparaturą ;projekcyjną (SAP) ; - kontroler: TO urządzenie, z TYM oprogramowaniem :) ; - UART, USART, AUSART, SCI, RS232: zamiennie stosowane (czasem niesłusznie) nazwy modułu ;asynchronicznej transmisji szeregowej z- i do komputera PC ;Kilka ogólnych informacji: ;Zegar 9.8304MHz (cykl rozkazowy ~400ns) zoptymalizowany do transmisji AUSART ;Wykorzystanie portów: ;PORTA: RA0-RA3 wyjścia jako sygnały sterujące ;PORTA: RA4-RA5 zarezerwowane dla szyny I2C ;PORTB: zarezerwowany do ośmiobitowej równoległej dwukierunkowej transmisji danych SAP ;PORTC: RC7-RC6 - RS232 RX/TX, reszta wyjścia adresowe RC0-RC5 na A0-A5 ERRORLEVEL 0,-305,-302 PROCESSOR PIC16F876A #include P16F876A.INC __CONFIG _CP_OFF & _DEBUG_OFF & _WRT_OFF & _LVP_OFF & _CPD_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _HS_OSC ;makrodefinicje stałych opóźnień timera TMR2 #defineW1msLW 0x26 ;przy wywołaniu TMR2waitLW ;makrodefinicje #define #define #define #define linii kontrolnych DAT PORTB TRDATA TRISB ADDR PORTC _RD PORTA, 0 #define _WR PORTA, 1 #define_DD PORTA, 2 #define_OE PORTA, 3 ;niski impuls powoduje odczyt ;bajtu z SAP ;niski impuls powoduje zapis bajtu do SAP ;stan wysoki - wysyłanie danych, stan niski - odbiór ;stan wysoki odcina wyjścia/wejścia kontrolera od magistral ;zmienne widoczne w każdym banku cblock 0x70 S_W ;showek akumulatora W_Temp S_AUX_W ;podręczny schowek akumulatora S_STATUS ;schowek rejestru stanu S_PCLATH ;schowek starszej części licznika rozkazów FLAGS ;rejestr znaczników różnistych, ustawione: bit 0: są dane z SCI ;bit 1: tryb synchronizacji, nie zapisuj rejestru RSBYTE RSBYTE ;bajt z RS232 lub do RS232 DATAH ;starszy bajt danych z/do sterownika DATAL ;młodszy bajt danych z/do sterownika endc org 00h nop ;dla kompatybilności z ICD (In-Circuit Debugger) goto MAIN nop nop ;ISR - Interrupt Service Routine - Obsługa Przerwań movwf S_W swapf STATUS, W clrf STATUS movwf S_STATUS movf PCLATH, W movwf S_PCLATH clrf PCLATH ; ;ISR ; movf S_PCLATH, W movwf PCLATH swapf S_STATUS, W movwf STATUS swapf S_W, F swapf S_W, W bsf INTCON, GIE retfie ;moduł komunikacyjny magistrali I2C (nie używam wbudowanego SPI do tego celu) ;linie SCL i SDA definiowane samodzielnie. ;stan początkowy linii: niski ;używa własnych zmiennych TMP i COM umieszczonych w obszarze ;7E-7F, który widoczny jest z każdego banku. ;lista użytecznych funkcji: ;i2cstart ;i2cstop ;i2csend - bajt do wysłania w W, zwraca 0 po potwierdzeniu ;i2creceive - odebrany bajt zwrócony w W ;i2csendack ;i2cnoack #define I2CPORT PORTA #define I2CTRIS TRISA #define SDA 4 #define SCL 5 cblock 0x7E TMP COM endc #include "I2C-CORE.ASM" ;interfejs UART OpenSerial banksel TRISC movlw 0xc0 iorwf TRISC, F ;ustaw bity TX,RX jako wejścia, moduł SCI sam będzie je kontrolował movlw 0x3f ;ładuj prędkość transmisji 9600 movwf SPBRG movlw 0x24 ;włącz nadajnik movwf TXSTA banksel RCSTA movlw 0x90 ;włącz SCI movwf RCSTA return CloseSerial banksel TXSTA btfss TXSTA, TRMT goto $-1 bcf TXSTA, TXEN banksel RCSTA bcf RCSTA, SPEN return DisableTransmitter banksel TXSTA btfss TXSTA, TRMT goto $-1 bcf TXSTA, TXEN banksel PORTC return EnableTransmitter banksel TXSTA bsf TXSTA, TXEN banksel PORTC return ReceiveSerial banksel PIR1 bcf FLAGS, 0 ;zeruj flagę obecności danych btfss PIR1,RCIF ;są dane? return ;nie, spadam btfsc RCSTA,OERR ;overrun? leć do handlera goto ErrSerialOverr btfsc RCSTA,FERR ;błąd ramki? goto ErrSerialFrame ;leć do handlera movf RCREG,W ;odebrane dane zwróć w W bsf FLAGS, 0 ;ustaw flagę obecności danych btfss FLAGS, 1 ;umieść dane w rejestrze tylko, gdy FLAGS:1 jest wyzerowana movwf RSBYTE btfss FLAGS, 1 call SendHandshakeACK return TransmitSerial banksel PIR1 btfss PIR1,TXIF goto $-1 movwf TXREG return ErrSerialOverr bcf RCSTA,CREN bsf RCSTA,CREN movlw '!' call TransmitSerial return ErrSerialFrame movf RCREG,W bcf RCSTA, CREN bsf RCSTA, CREN movlw '!' call TransmitSerial return WaitForHandshake RS: bsf FLAGS, 1 call ReceiveSerial btfss FLAGS, 0 goto RS sublw 'S' btfss STATUS, goto RS clrf PORTB call ReceiveSerial btfss FLAGS, 0 goto $-2 sublw 'T' btfss STATUS, goto RS call ReceiveSerial btfss FLAGS, 0 goto $-2 sublw 'A' btfss STATUS, goto RS call ReceiveSerial btfss FLAGS, 0 goto $-2 sublw 'R' btfss STATUS, goto RS bsf PORTB, 7 bcf FLAGS, 1 SendHandshakeACK movlw '*' call TransmitSerial return MAIN call MrProper call TMR2wait25ms banksel ADCON0 clrf ADCON0 movlw b'00111011' movwf PORTA clrf PORTB clrf PORTC banksel TRISA movlw b'00000111' movwf ADCON1 ;poczekaj, aż nadajnik będzie wolny ;wrzuć dane do wysłania ;mały resecik SCI ;wywal dane z błędem ;reset SCI Z Z Z Z clrf TRISA movlw 0xff movwf TRISB movlw b'11000000' movwf TRISC banksel PORTA call OpenSerial UART_LOOP call WaitForHandshake U_LOOP call ReadSynchro movfw DATAL call TransmitSerial movfw DATAH call TransmitSerial call ReceiveSerial btfss FLAGS, 0 goto $-2 movf RSBYTE, W ;w akumulatorze jest już odebrany młodszy bajt – adres, w następnym odczycie będą dane ;gotowe do wysłania do sterownika aparatury goto U_LOOP ;czytaj licznik synchronizacji ReadSynchro banksel TRISB movlw 0xff movwf TRISB banksel PORTA bsf _OE bcf _DD movlw b'11000000' andwf PORTC bcf _OE nop bcf _RD movlw W1msLW call movfw movwf bsf bsf bsf clrw call bcf nop bcf movlw call movfw movwf bsf bsf return TMR2waitLW PORTB DATAL _RD _OE PORTC, 0 ;odetnij bufory ;odczyt z portu ;wymaskuj bity TRISC 7:6 kontrolowane przez UART ;ustaw adres 000000 w sterowniku ;włącz bufory ;poczekaj 400 ns dla pewności, że bufor jest gotowy ;opuść nisko bit odczytu sterownika ;potrzymaj linie _RD i OE ok. 1 ms (ma to znaczenie przy długości kabla, ;przy czasach ok. 0,4us pojemność metrowego odcinka jest za duża). ;czytaj młodszy bajt licznika odczytu ;podnieś bit odczytu ;odetnij magistrale ;ustaw adres 000001 TMR2waitVLW ;poczekaj ok. 180us przed odczytem kolejnego bajtu _OE ;włącz bufory _RD W1msLW TMR2waitLW PORTB DATAH _RD _OE ;opuść nisko bit odczytu sterownika ;potrzymaj nisko bit odczytu sterownika ok. 1ms ;czytaj starszy bajt licznika synchro ;podnieś bit odczytu ;odetnij magistrale ;funkcja czyta stan przełączników SAP banksel TRISB movlw 0xff movwf TRISB banksel PORTA bsf _OE bcf _DD clrw movwf PORTC movlw b'11000000' andwf PORTC bsf PORTC, 0 bsf PORTC, 1 bsf PORTC, 2 ;111 - adres stanu przełączników SAP bcf _OE nop bcf _RD movlw W1msLW call TMR2waitVLW movfw PORTB bsf _RD bsf _OE movwf DATAL btfsc DATAL, 0 goto pstrykRED btfsc DATAL, 1 goto pstrykGREEN return pstrykRED movlw 'R' call TransmitSerial ;wyślij 'R', jeśli czerwony pstryczek jest wyłączony (oberwyłącznik) return pstrykGREEN movlw 'G' call TransmitSerial ;wyślij 'G', jeśli zielony pstryczek jest wyłączony (sterowanie ruchami) return ;zerowanie liczników banksel PORTA bsf _OE bcf _DD banksel TRISB clrf TRISB movlw b'11000000' andwf TRISC banksel PORTA movlw 0xF0 movwf PORTC bcf _OE movlw W1msLW call TMR2waitVLW clrf PORTB call TMR2waitVLW ;poczekaj ok. 180us przed odcięciem transmisji bsf _DD bsf _OE ;czyszczenie RAM MrProper clrf STATUS movlw 0x20 movwf FSR clrf INDF incf FSR, F btfss FSR, 7 goto $-3 movlw 0xa0 movwf FSR clrf INDF incf FSR, F btfss STATUS, Z goto $-3 bsf STATUS, IRP movlw 0x10 movwf FSR clrf INDF ;BANK0 ;BANK1 ;BANK2 incf btfss goto movlw movwf clrf incf btfss goto clrf return FSR, F FSR, 7 $-3 0x90 FSR INDF FSR, F STATUS, Z $-3 STATUS ;BANK3 ;BANK0 TMR2wait25ms banksel PR2 movlw 0xef movwf PR2 banksel T2CON clrf TMR2 bcf PIR1, TMR2IF movlw b'01111111' movwf T2CON btfss PIR1, TMR2IF goto $-1 bcf T2CON,TMR2ON bcf PIR1, TMR2IF return ;opóźnienie z dzielnikiem sumarycznym maksymalnym 1:65536 TMR2waitVLW banksel PR2 movwf PR2 banksel T2CON clrf TMR2 bcf PIR1, TMR2IF movlw b'01111111' movwf T2CON ;preskaler 1:16, postskaler 1:16, timer on btfss PIR1, TMR2IF goto $-1 bcf T2CON,TMR2ON bcf PIR1, TMR2IF return ;opóźnienie z dzielnikiem sumarycznym 1:64 TMR2waitLW banksel PR2 movwf PR2 banksel T2CON clrf TMR2 bcf PIR1, TMR2IF movlw b'00011111' movwf T2CON ;preskaler 1:16, postskaler 1:4, timer on btfss PIR1, TMR2IF goto $-1 bcf T2CON,TMR2ON bcf PIR1, TMR2IF return ;opóźnienie z dzielnikiem sumarycznym 1:1 TMR2waitHW banksel PR2 movwf PR2 banksel T2CON bcf PIR1, TMR2IF movlw b'00000100' movwf T2CON ;preskaler 1:1, postskaler 1:1, timer on btfss PIR1, TMR2IF goto $-1 bcf T2CON, TMR2ON bcf PIR1, TMR2IF return END Jak widać, oprogramowanie ma wbudowaną sekwencję startu (po włączeniu lub resecie czeka na sekwencję „STAR”, po czym przechodzi do własnej pętli obsługi komunikacji – odbiera i wysyła dane z- i do komputera sterującego oraz oczywiście komunikuje się ze sterownikiem właściwym. Wysyłane do komputera komunikaty to: 1. Dwubajtowa wartość licznika synchronizacji 2. Dwubajtowa wartość jednego z dwóch liczników ruchu 3. Komunikat potwierdzenia odebrania poprawnych danych znakiem „*” 4. Komunikat stwierdzenia błędu transmisji – znak „!” 5. Komunikat „R” oznaczający, że nieaktywny jest sterownik aparatury – konieczny komunikat dla operatora – proces przetwarzania programu projekcji nie może się w tym stanie rozpocząć, po włączeniu sterownika komunikat znika, a system gotowy jest do przetwarzania danych 6. Komunikat „G” - wyłączona sekcja sterowania ruchami – konieczny komunikat dla operatora – czasem zdarza się, że trzeba na chwilę deaktywować sterownik ruchów aparatury, by dokonać jakiejś korekty, po czym uruchomić go ponownie – przełącznikiem. Po odebraniu komunikatu „!” funkcja biblioteczna komunikacji ze sterownikiem powtarza transmisję. Podobnie brak skwitowania znakiem „*” przy jednoczesnym braku znaku błędu „!” interpretowane jest przez funkcje biblioteczne jako utratę łączności ze sterownikiem. Wykonywany jest wtedy gorący restart interfejsu i jeśli dalej się sytuacja utrzymuje, wyświetlane jest okno typu system modal, czyli niemożliwe do zignorowania – z sugestią sprawdzenia kabli połączeniowych. Po naciśnięciu „OK” wykonywana jest ponownie diagnostyka i jeśli się nie powiedzie – generowany jest wyjątek. Sterownik właściwy Ponieważ sterownik właściwy jest absolutnie niewidoczny dla aplikacji sterującej i obsługiwany jest jedynie poprzez interfejs, to zamieszczanie jego schematu uznano za zbędne przeciążenie dokumentacji zwłaszcza, że zamieszczona została jego wewnętrzna lista rozkazów jak i funkcjonalny opis, głównie dlatego, by można było się zorientować na tyle dobrze z interakcjami bloków sterowania, by uznać, że szczegółowa wiedza na temat niemożliwej do osiągnięcia bezpośrednio komunikacji ze sterownikiem właściwym jest w zasadzie zbędna z punktu widzenia zagadnienia integracji systemów.