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.