Miernik panelowy w swojej pierwotnej postaci nie pozwalał na zmianę polaryzacji sygnału wejściowego, a jedynie odbierał dane z przetwornika analogowo-cyfrowego i przedstawiał je na wyświetlaczu. Prezentowane modyfikacje pozwalają prawidłowo współpracować z przystawkami pomiarowymi prezentowanymi w tym i poprzednim wydaniu NO.
Procedury obsługi poszczególnych przystawek pomiarowych składają się z dwóch funkcji: funkcji inicjalizującej, która przygotowuje stan miernika, oraz funkcji która jest cyklicznie wywoływana i która odpowiada za odebranie wyników pomiaru i przedstawieniu ich na wyświetlaczu. W trakcie budowy panelu pomiarowego zakładano, że przystawki pomiarowe będą bardzo proste. W przypadku amperomierza – będzie to opornik bocznikowy a w przypadku woltomierza – prosty dzielnik napięcia. Niestety w praktyce okazało się, że pomiar prądu wprowadza zbyt duże zaburzenia do mierzonego układu a przy dużych prądach moc jak wydziela się na oporniku bocznikowym jest sięga kilkunastu watów. Stąd pomysł by użyć gotowego układu pomiarowego który dodatkowo potrafi mierzyć prąd płynący w obu kierunkach. Jedynym problemem w tym wypadku było przesunięcie napięcia, które dla zerowego prądu wynosi w zastosowanym układzie 2.5V. Wymagało to napisania programu obsługi takiej przystawki.
Procedura inicjalizująca ustawia sposób wyświetlania w formacie #0.0 oraz zapamiętuje adres procedury pomiarowej. Ponadto ustawia jako wyjścia dwa jednobitowe cyfrowe porty wyprowadzone na zewnątrz panelu pomiarowego, które użyjemy do wskazania polaryzacji aktualnie mierzonego prądu.
initVoltmeterS25: ldi r16, 0b00010010 ; #0.0
mov r8, r16
ldi zl, LOW(showVoltage25)
ldi zh, HIGH(showVoltage25)
sbi DDRD, 4
sbi DDRD, 3
rcall setTimerHandler
W procedurze wyświetlającej wartość – od wielkości odebranej z przetwornika analogowo cyfrowego (wywołanie funkcji adcGetValue), odejmujemy wartość odpowiadającą zerowemu prądowi. Jeśli otrzymana wartość jest dodatnia wyświetlamy ją, jednocześnie ustawiając odpowiednie sygnały dla diody LED która pokaże polaryzację dodatnią
showVoltage25: push r18
push r19
rcall adcGetValue
subi r18, LOW(500)
sbci r19, HIGH(500)
mov r16, r19
andi r16, $80
breq sw251
; negative value
sbi PORTD, 4
cbi PORTD, 3
com r18
com r19
inc r18
brne sw253
inc r19
sw252: rjmp sw253
sw251: ; positive value
sbi PORTD, 3
cbi PORTD, 4
sw253: clc ; /2
ror r19
ror r18
rcall displayProperNumber
pop r19
pop r18
ret
Jeśli wynik jest ujemny, zmienimy jego znak i ustawiamy stan diody LED tak by wskazywała odwrotną polaryzację.
Inicjalizacja woltomierza wymaga podania jago dokładności bo używając różnych dzielników napięcia możemy zbudować woltomierz o różnych dokładnościach nie wymagający modyfikacji programu. W przypadku amperomierza, potrzebne jest przeskalowanie napięć, lecz w woltomierzu, wystarczy zmienić oporniki by zmienić zakres z +/- 100V na +/-10V zwiększając jednocześnie dokładność pomiarową. Dlatego dla woltomierza przygotowano aż trzy procedury inicjujące różniące się jedynie ustawieniami wyświetlacza.
initVoltmeterA: ldi r16, 0b00010000
rjmp _initMeter
initVoltmeterB: ldi r16, 0b00010010
rjmp _initMeter
initVoltmeterC: ldi r16, 0b00010100
_initMeter: mov r8, r16
ldi zl, LOW(showVoltage)
ldi zh, HIGH(showVoltage)
sbi DDRD, 3
sbi DDRD, 4
sbi PORTD, 3
cbi PORTD, 4
rcall setTimerHandler
Tym razem jednak oprócz ustawienie stanów wyjść sygnalizujących polaryzację, ustawiamy także ich stan. To ważne, bo sygnały na tych wyjściach nie tylko sterują diodami LED, ale także włączają odpowiednie przełączniki pozwalające na zmianę polaryzacji wejściowego sygnału – i musimy ta polaryzację ustawić tak by pomiar był możliwy.
Sama procedura pomiarowa jest prosta. Czytamy wartość z przetwornika, a następnie sprawdzamy czy nie jest zerowa. Jeśli nie – to znaczy że mierzymy napięcie które ma odpowiednią polaryzację.
showVoltage: push r18
push r19
rcall adcGetValue
mov r16, r18
or r16, r19
brne sv02
in r16, PORTD
andi r16, $10
brne sv01
cbi PORTD, 3
sbi PORTD, 4
rjmp sv02
sv01: sbi PORTD, 3
cbi PORTD, 4
sv02: rcall displayProperNumber
pop r19
pop r18
ret
Jeśli jednak wykryliśmy wartość 0 – to możemy przypuszczać, że napięcie podłączono odwrotnie. W takim wypadku sprawdzamy jaki jest aktualny stan bitów sterujących polaryzacją i ustawiamy je przeciwnie.