Moduł podrzędny – Asembler
Poniżej opiszę tylko niewielką część programu, a właściwie jedynie przykładowy algorytm.
Podprogram DOBIERZ_NAPIECIE_ZASILACZA
Podprogram ten dobiera napięcie zasilacza zarówno dla źródła U (zadawanie U) jak i I. Jego działanie polega na wykonaniu programowej iteracji na rejestrze R2 i dopiero późniejszym wykorzystaniu wyniku do załączenia napięcia zasilacza. Zmienna NAPIECIE_ZASILACZA wskazuje na aktualne napięcie zasilacza (nawet, gdy jest wyłączone – wskazuje domyślny numer napięcia). Maksymalna liczba napięć zasilacza jest przez blok sterujący ograniczona do 8. Jednak moduł wykonawczy dysponuje tylko 2-ma napięciami zasilacza.
Rejestr R7 reprezentuje wartość proporcjonalną do napięcia wyjściowego wzmacniacza mocy. To napięcia determinuje ustawienie zasilacza. Zawartość rejestru R7 jest tworzona (patrz miejsce M67 i sąsiedni blok po lewej) w następujący sposób:
- pierwsze 3 bity MSB są utworzone z zakresu odnoszącego się do napięcia wyjściowego wzmacniacza mocy,
- pozostałe bity odzwierciedlają bity MSB z wartości odnoszącej się do napięcia wyjściowego wzmacniacza mocy.
W istocie rejestr R7 przetrzymuje bity MSB odnoszące się do napięcia wyjściowego wzmacniacza mocy, gdyż można przyjąć, że zakres jest przedłużeniem wartości w stronę bitów bardziej znaczących.
Zawartość rejestru R7 jest porównywana z określoną granicą U wzmacniacza mocy dla danego napięcia zasilacza. Granic tych jest maksymalnie 8. Są to zmienne przetrzymujące dane w identycznym formacie jak R7 o adresach o początku GRANICE_U_DLA_NAPIEC_ZAS i określone przez wysłanie rozkazu z PC determinującego parametry sprzętowe charakterografu. R1 jest wskaźnikiem do tych granic.
Po wykonaniu porównania R7 (napięcia wyjściowego wzmacniacza mocy) ze zdefiniowana granicą, program przystępuje do modyfikacji (lub nie) rejestru R2, który jest wejściowym do ustawiania napięcia zasilacza.
H_ZAS jest histerezą decyzji o zmianie napięcia zasilacza. Eliminuje ona wpływ zakłóceń na poprawność wykonywania przełączania. Magiczna jej wartość 1 ustala w rzeczywistości poziom histerezy na 255 w jednostkach wartości liczbowej przetworników A/C, gdyż ta jedynka jest w istocie na 7 bicie (licząc od zera) wartości zadanych lub zmierzonych.
Ponadto podprogram ustawia flagę F0 (PSW.5), jeżeli napięcie zasilacza w wyniku wywołania podprogramu się zmieniło. Przy czym nie chodzi tu o fakt samego włączenia napięcia, lecz zmianę już istniejącego, czyli zmianę zawartości zmiennej NAPIECIE_ZASILACZA. W praktyce F0 jest wykorzystywana tylko dla źródła I.
Poniżej zamieszczam kod źródłowy tego podprogramu.
;Ponizszy podprogram dobiera napiecie zasilacza w zaleznosci od napiecia
;zrodla U lub I, na podstawie grupy rejestrow (max 8) o poczatku GRANICE_U_-
;DLA_NAPIEC_ZAS. W przypadku dokonanej zmiany w rejestrze NAPIECIE_ZASILACZA,
;podprogram ustawia F0 (PSW.5).
DOBIERZ_NAPIECIE_ZASILACZA:
CLR PSW.5 ;zerowanie znacznika zmiany napiecia zasilacza
MOV BLAD,#0
;Czy stan bloku wykonawczego jest > 2 ?:
MOV B,STAN_BLOKU_WYK
ANL B,#00001111B
MOV A,#2
CLR C
SUBB A,B ;dzialanie: 2 - (stan bloku wykonawczego)
JNC M66 ;jezeli stan bloku wyk nie > 2, skocz do M66
;Czy zrodlo U?:
MOV A,STAN_BLOKU_WYK
JB ACC.5,M67 ;jezeli nie to skocz do M67
MOV R4,ZAKRES_WE
MOV R5,WART_ZADANA_HB
MOV R6,WART_ZADANA_LB
LJMP M68
M67: MOV R4,ZAKRES_WY
MOV R5,WART_2_ZMIERZ_HB
MOV R6,WART_2_ZMIERZ_LB
M68: MOV A,R4
SWAP A
RL A
ANL A,#11100000B
MOV B,A ;mamy juz zakres w B
MOV A,R5
RL A
ANL A,#00011110B
ORL B,A ;teraz mamy takze 4MSB wartosci w B
MOV A,R6
MOV C,ACC.7
MOV B.0,C ;dochodzi jeszcze piaty bit liczac od MSB,
;czyli mamy juz kompletne "napiecie" w B
MOV R7,B ;a teraz w R7
MOV R2,NAPIECIE_ZASILACZA
M69: ;Poczatek petli wyszukiwania napiecia zasilacza:
MOV A,#GRANICE_U_DLA_NAPIEC_ZAS
ADD A,R2
MOV R1,A
;Czy R7 > @R1 (gornej granicy napiecia zrodla dla aktualnego
;napiecia zasilacza) ?:
MOV A,@R1
CLR C
SUBB A,R7
JNC M71 ;jezeli nie to skocz do M71
;Czy max napiecie zasilacza?:
MOV A,R2
CLR C
SUBB A,LICZBA_NAPIEC_ZAS
JNZ M70 ;jezeli nie, skocz do M70
MOV BLAD,#2
LJMP M74
M70: INC R2
LJMP M72
M71: ;Czy min napiecie zasilacza?:
MOV A,R2
JZ M73 ;jezeli tak, skocz do M73
;Czy R7 < @(R1-#1)-#H_ZAS ?:
MOV A,R1
MOV R0,A
DEC R0
MOV A,@R0
CLR C
SUBB A,#H_ZAS ;H_ZAS jest stala
MOV B,A ;w B mamy juz prawa strone nierownosci
MOV A,R7
CLR C
SUBB A,B ;dzialanie: R7 - [@(R1-#1)-#H_ZAS]
JNC M73 ;jezeli nierownosc nie spelniona, skocz do M73
DEC R2
M72: SETB PSW.5
LJMP M69 ;skocz do poczatku petli modyfikacji
M73: LCALL ZALACZ_NAPIECIE_ZASILACZA
LJMP M74
M66: ;Czy zasilacz zalaczony?:
JNB ZNACZNIK.7,M74 ;jezeli nie to skocz do M74
LCALL WYLACZ_NAPIECIE_ZASILACZA
M74: RET