Mikroprocesorowa Ośla łączka
Mikroprocesorowa Ośla łączka
If Flaga * 1 Then 'gdy llaga ustawiona, co 500ms RyS. 111.
Decr Licznikczasu 'zmniejsz zawartość licznika 1
If Czasalarmu * 2S5 Then 'gdy dojdzie do zera i chce liczyć dalej
Flaga ■ 0 'zakończ zliczanie zerując flagę 'tu ewentualnie zrób coś jeszcze End If
Elso 'gdy flaga wyzerowana, w każdym cyklu co SOOms
licznikczasu * Uartoscpoczątkową 'przygotuj do następnego cyklu
End If
' C021a Prosta centralka alarmowa - szkielet programu Rys. 112.
'tu na początku deklaracje i konfiguracje, w tym Timeral Do Loop End główny program, jak zwykle
CoSOOms 'procedura obsługi przerwania od Timeral co 0 5 sekundy
'najpierw uzyskujemy aktualny stan linii LI, L2 oraz wejść SI. S2:
Stan 4 ■ Pind 1 'przepisz sten klucza S2
Stan 3 ■ Pind 6 'przepisz stan L2
Stan 0 * Pind 5 'przepisz stan LI
' do tego dochodzi aktualny stan flag w zmiennej Stan
'jeśli którakolwiek z trzech flag czasu jest ustawiona, w procedurach If-Then-Else zliczamy czas.
' gdy czas zostanie odliczony odpowiednia flaga jest zerowana
'potem sprawdzamy stan centralki :
If Stan 4=1 Then 'za każdym razem, gdy centralka wyłączona, czyli klucz S2 - rozwarty Stan « 4J300110000 'oprócz bitu Stan 4 ustawionego przez przełącznik S2
' dodatkowo ustawiamy bit pomocniczy Stan.5. a resztę brutalnie zerujemy Elsę 'gdy klucz S2 jest zwarty, wtedy centralka pracuje;
If Stan 5*1 Then 'jednorazowo po włączeniu czuwania, gdy bit pomocniczy ustawiony
Stan 2*1 'zablokujemy linię zwłoczną i odmierzymy czas na wyjście Stan 5 * 0 'ma być jednorazowo, więc zerujemy bit pomocniczy End If
If Stan > 7 Then gdy pobudzona lima natychmiastowa L2 - zawsze włącz alarm Stan 6*1 ' i zacznij odmierzać czas alarmu
Elsę 'gdy L2 nie pobudzona, wtedy Stan*0 7 i można
If Stan * 1 Then Stan 1*1 'gdy tylko bit Stan 1 ustawiony odmierz -czas na wejście
End If End If
Portd 2 * Hot Stan 6 ewentualnie włącz syrenę dołączoną do Q2
Return 'koniec procedury obsługi przerwania
sekundy). Całą użyteczną pracę procesor wykonuje w ramach obsługi przerwania od Timeral. Na początku każdego takiego 500-milisekundowego cyklu procesor aktualizuje zawartość zmiennej Stan, a następnie zależnie od wyniku podejmuje jakieś działanie lub nie.
Rysunek 110 pokazuje rolę poszczególnych bitów zmiennej Stan. Kolejność bitów nie jest przypadkowa - na taki porządek zdecydowałem się po namyśle, żeby potem łatwo analizować stan centralki, analizując zawartość zmiennej Stan nie tylko jako zbiór bitów, tylko jako... liczbę.
Działanie centralki jest w sumie proste. Do odmierzania czasu służą trzy flagi i trzy niezależne zmienne-liczniki z ustawioną wstępnie zawartością początkową. Jeśli którakolwiek z tlag czasu w zmiennej Stan zostanie ustawiona, wtedy po każdym przerwaniu, co pół sekundy nastąpi zmniejszenie zawartości odpowiedniego licznika. Zliczenie do zera (właściwie poniżej zera - do liczby 255) powoduje wyzerowanie tej flagi, co z kolei spowoduje stosowną zmianę stanu centralki. Ogólny schemat takiego licznika czasu pokazany jest na rysunku 111. Natomiast na rysunku 112 (C02Ia.bas) pokazany jest szkielet całości. Zwróć uwagę, że flaga powodująca odmierzanie czasu na wejście (Stan.l) jest ustawiana w linii:
If Stan = 1 Then Stan.l = 1
Flaga zostanie ustawiona tylko wtedy, gdy liczba zawarta w ośmiobitowej zmiennej Stan jest równa jedności, czyli tylko wtedy, gdy linia zwłoczną LI jest naruszona i jednocześnie wszystkie pozostałe bity zmiennej Stan mają wartość zero. Oznacza to, że wpisanie jakiejkolwiek dodatkowej jedynki zmieni wartość zawartość zmiennej Stan i nie pozwoli na ustawienie flagi Stan.l. Ten nietypowy sposób wykorzystujemy między innymi po to, żeby zablokować linię LI po włączeniu czuwania (zwarciu S2), gdy ma ona być nieczynna przez czas na wyjście, gdy ustawiona jest flaga Stan.2.
Pełny program centralki przedstawiony jest na rysunku 113 (C021b.bas).
UWAGA! Jeśli dołączysz do zacisków PD.5, PD.6 linie dozorowe według rysunku 107, to
zaczyna się z opóźnieniem kilkunastu milisekund (11...21ms przy napięciu zasilania 5V, zależnie od egzemplarza i temperatury) po wystąpieniu przyczyny resetu. Ilustruje to rysunek na poprzedniej stronie, pokazujący przebieg resetujący na końcówce zerującej, czyli nóżce nr 1 i stany procesora. Pamiętaj, że w spoczynku na końcówce RE-SET występuje stan wysoki, co wynika z obecności wewnętrznego rezystora podciągającego (10()k£2...50()k£2).
Procesor jest „martwy” nie tylko przez czas trwania impulsu zerującego Tr, ale dodatkowo jeszcze przez czas opóźnienia Td. Przy napięciu zasilania innym niż 5V, czas Td będzie znacząco inny. Tak samo jest po włączeniu zasilania - procesor zaczyna normalną pracę dopiero po czasie opóźnienia.
Wprawdzie kilkanaście milisekund czasu Td to dla procesora dość dużo, jednak takie opóźnienie w ogromnej większości przypadków nie ma żadnego znaczenia. Podobnie tylko w bardzo rzadkich przypadkach należy uwzględnić fakt, iż w czasie zerowania wszystkie końcówki wejścia/wyj-ścia portów B i D są w stanie trzecim, czyli „wiszą w powietrzu” do czasu, gdy zostaną skonfigurowane, co następuje na początku działania programu, czyli po kilkunastu milisekundach od chwili włączenia zasilania czy zakończenia impulsu resetującego na nóżce 1. Więcej szczegółów znajdziesz w Technikaliach.
NA CZAS PROGRAMOWANIA PROCESORA ZDEJMIJ JUMPERY Jl, J2.
Trzy potrzebne czasy ustalamy za pomocą trzech stałych deklarowanych dyrektywą Const. W programie czasy te wynoszą 5, 4 i 3 sekundy, ale w praktyce powinny być znacznie dłuższe - obok masz zaremowane sensowne ich wartości (2 minuty, 25s, 15s).
Zauważ, że jeśli jumpery J 1, J2 zwierają punkty A, B, wtedy dodatkowo na wyświetlaczach sygnalizowany jest stan centralki. Gdy linie są nienaruszone, świecą dwie kropki (punkty dziesiętne) lewego wyświetlacza. Naruszenie (przerwanie) linii powoduje wygaszenie jednego z wyświetlaczy. Włączenie czuwania sygnalizowane jest zaświeceniem
PJ
*
i
i
autonomiczne obwody procesora. Zwróć uwagę, że wewnętrzny oscylator RC jest wykorzystywany zarówno przez obwód watchdoga, jak i przez obwody resetu. Sygnały resetu z trzech źródeł są sumowane za pomocą bramki OR. Sygnał z wyjścia tej bramki (punkt X) ustawia przerzutnik RS, a tym samym powoduje
H
W
n
x
z
X
>
r
NN
>
mową zmianą stanu rejestru WDTCR wykonać zerowanie licznika (RESET WATCHDOG).
Jeszcze raz zaznaczam, że te rozważania nie dotyczą typowej sytuacji, gdy watchdog jest włączany na początku działania programu, zaraz po resecie, tylko sytuacji gdy zmiana stanu rejestru WDTCR miałaby być dokonywana później, w czasie pracy programu.
Rysunek I) pokazuje w uproszczeniu obwody zerowania omówione wstępnie w części ELEMENTarz. Obwody resetu nie mają żadnego związku z rejestrami I/O. Można powiedzieć, że są to najbardziej
Elektronika dla Wszystkich Grudzień 2003 35