Mikroprocesorowa Ośla łączka Ml
Reset Watchdog
I to sq wszystkie kluczowe informacje, umożliwiające praktyczne wykorzystanie watchdoga. Więcej szczegółów na ten temat znajdziesz w części Technikalia.
Reset oznacza rozpoczęcie pracy programu od początku, a przy tym wyzerowanie wszystkich kluczowych rejestrów procesora. W procesorach AVR mamy trzy możliwości (źródła) resetu:
- reset po włączeniu zasilania (POR - po-wer-on-reset),
- reset spowodowany przez (nieobsługiwa-ny) watchdog.
- reset sprzętowy z wykorzystaniem końcówki RESET (nóżka 1).
Procesory AVR mają rozbudowany wewnętrzny obwód zerowania, zapewniający niezawodne wyzerowanie procesora po każdym włączeniu zasilania, i co ważne, bez potrzeby dołączania do nóżki 1 (wejście zerujące) jakichkolwiek obwodów zewnętrznych. Jak już wiesz, przepełnienie licznika (nieobsługiwanego) watchdoga też spowoduje reset. Podczas pracy programu można w każdej chwili „brutalnie” wyzerować procesor, zwierając RESET (nóżkę nr 1) do masy, czyli podając na nią stan niski. Przez cały czas trwania stanu niskiego na tej nóżce procesor jest wyzerowany, a wszystkie końcówki portów B, D są wtedy w stanie wysokiej impedancji (w tzw. stanie trzecim), czyli jak mówimy potocznie: wiszą w powietrzu.
Warto pamiętać, że w każdym z tych trzech przypadków realizacja programu
Td
15...21ms
+ 5V-
stan na końcówce RESET (nóżka 1)
czas impulsu czas opóźnienia i resetującego r
-ego j~
tu procesor wykonywał
program
tu nastąpiło ..brutalne" wyzerowanie
przez ten czas procesor jest „martwy", a końcówki portów B i D „wiszą w powietrzu"
procesora i pamięci RAM (rejestrów l/O)
wysoki na PD. 1) ma bezwarunkowo i natychmiast wprowadzić centralkę w stan spoczynku. Przełącznik sterujący S2 ma być umieszczony w miejscu znanym tylko wtajemniczonym, co bardzo istotne - wewnątrz obszaru chronionego czujnikami linii opóźnionej L1. Takie umieszczenie wyłącznika S2 praktycznie uniemożliwi włamywaczowi jego odnalezienie, bo po naruszeniu strefy chronionej linią opóźnioną L2 będzie miał tylko kilkanaście do kilkudziesięciu sekund na jego odnalezienie i wyłączenie centralki. Naruszenie linii LI wywoła alarm dopiero po tym kilkunastosekundowym czasie opóźnienia.
Po zwarciu przycisku S2 (stan niski na PD.l) centralka wejdzie w stan czuwania. W tym stanie czuwania linia natychmiastowa L2 jest gotowa do pracy, ale linia LI pozostaje nieczynna przez kilkanaście... kilkadziesiąt sekund (czas na wyjście), co umożliwi domownikowi spokojne opuszczenie strefy chronionej linią zwłoczną.
Pożądane działanie centralki można przeanalizować na podstawie rysunku 109 (dla przejrzystości zaznaczony czas alarmu jest tu bardzo krótki - w rzeczywistości czas alarmu jest dużo dłuższy od czasów na wejście i wyjście).
Aby zrealizować takie działanie, potrzebne będą zmienne służące do odliczania: czasów opóźnienia przy wejściu, opóźnienia przy wyjściu oraz czasu alarmu. Potrzebne będą też bity informujące o aktualnym stanie centralki. Dobrze byłoby też jakoś zobrazować aktualny stan centralki na wyświetlaczu, ewentualnie dodać pamięć alarmu (informacja dla użytkownika, że podczas jego nieobecności wystąpił alarm).
Sposobów realizacji jest mnóstwo. Ja oczywiście zdecydowanie zachęcam, żebyś na podstawie rysunków 107... 109 sam napisał program. Niewątpliwie natkniesz się na przeszkody, a usuwając je, wiele się nauczysz. Nie czytaj więc na razie dalszej części artykułu i spróbuj znaleźć własną koncepcję realizacji takiej centralki. Nie będzie to łatwe, ale masz oto znako-
milą okazję rozwiązać interesujący problem praktyczny. Przypuszczam, że samo napisanie kodu będzie łatwiejsze niż znalezienie dobrej koncepcji. Bardzo Cię proszę, nie analizuj na razie mojego pomysłu opisanego dalej. Nie żałuj czasu i spróbuj znaleźć kilka różnych koncepcji działania centralki. Nie pisz całego programu, tylko spróbuj zrobić „szkielet”. Wypisz, jakie zmienne chcesz wykorzystać i jak z grubsza ma wyglądać działanie programów. Gdy w taki ogólny sposób „przymierzysz się” do rozmaitych koncepcji, zwróć uwagę, że niektóre sposoby są jakby prostsze i bardziej „przejrzyste” od innych. Wybierz koncepcję Twoim zdaniem najprostszą i dopiero wtedy spróbuj ją zrealizować do końca. Napisz program i wypróbuj, czy działa zgodnie z rysunkiem 108.
Jeszcze raz serdecznie zachęcam: najpierw zrealizuj taką centralkę samodzielnie, a dopiero potem przeanalizuj podany dalej sposób realizacji.
Oto on:
Ja po dość długiej analizie problemu wykorzystałem trzy zmienne bajtowe, które służą do odmierzania czasów: na wejście, wyjście oraz czasu alarmu. Wszystkie informacje o stanie centralki „wrzuciłem” do jednego bajtu - do zmiennej Stan. Ponieważ naruszenie któregokolwiek czujnika powoduje rozwarcie linii na czas dłuższy, procesor nie musi się spieszyć. Może trochę przesadziłem z tym brakiem pośpiechu - w mojej edukacyjnej centralce procesor dokładnie co pół sekundy sprawdza stan wejść i podejmuje działania (testując centralkę musisz więc przerywać obwody linii na czas powyżej 0,5
Rys. 110.
J2
dopiero tutaj procesor normalnie realizuje program
e e § £ e s a ?
tutaj następuje konfiguracja procesora w czasie rzędu 1jxs
128 |
64 |
32 |
16 |
8 |
4 |
2 |
1 |
0 | |||||||
B.7 |
B.6 |
B.5 |
B.4 |
B.3 |
B.2 |
B.1 |
BO |
MSB LSB
zmienna Stan
ono zamienione przez kompilator na odpowiednie elementarne rozkazy. Polecenie Stop WATCH-^ DOG bywa wykorzystywane bardzo rzadko. Zazwyczaj na początku programu watchdog zostaje ^ na stałe włączony i nie jest wyłączany podczas ® działania programu. Jeśliby miał być włączany i wyłączany w trakcie działania programu (albo miałby być zmieniany czas cyklu watchdoga), ^ a jest to jak najbardziej możliwe, choć rzadko po-^ trzebne, należy także pamiętać o konsekwencjach ^ budowy, pokazanej na wcześniejszym rysunku: mianowicie licznik watchdoga jest zerowany przez zawarty w programie rozkaz RESET WATCHDOG
przy czym to zerowanie licznika nie jest związane z żadnym bitem któregokolwiek rejestru I/O, w tym bitu WDE. Oznacza to, że zmiana stanu jakichkolwiek bitów rejestru WDTCR nie wpływa na stan licznika.
W konsekwencji może się na przykład zdarzyć, że jeśli w trakcie działania programu nastąpi włączenie lub zmiana długości cyklu watchdoga, reset procesora nieoczekiwanie nastąpi po zaskakująco krótkim czasie, bo w chwili włączenia
licznik akurat będzie bliski przepełnienia. Aby tego uniknąć, wystarczy przed jakąkolwiek progra-
Tabela 1
WDP2 WDP1 |
WDP0 |
pojemność licznika |
spodziewany czas cyklu VCC = 5.0V |
spodziewany czas cyklu VCC = 3.0V | |
0 |
0 |
0 |
16K (16384) |
1 5 IMS |
47 ms |
0 |
0 |
1 |
32K (32768) |
30 ms |
94 ms |
0 |
1 |
0 |
64K (65536) |
60 ms |
0.19 s |
0 |
1 |
1 |
128K (131072) |
0.12 s |
0.38 s |
1 |
0 |
0 |
256K (262144) |
0,24 s |
0.75 s |
1 |
0 |
1 |
512K (524288) |
0.49 s |
1.5 s |
1 |
1 |
0 |
1024K (1048576) |
0.97 s |
3.0 s |
1 |
1 |
1 |
2048K. (2097152) |
1.9 s |
6.0 s |
34 Grudzień 2003 Elektronika dla Wszystkich