94
wykorzystanie watchdoga w innej roli. Przy stanu Powerdown może wyrwać procesor przez watchdoga. Wykorzystajmy to teraz
okazji ćwiczeń 17 i 18 dowiedziałeś się, że ze przerwanie czy też raczej reset wywołany w naszej centralce.
'C022a Oszczędna centralka alarmowa - watchdog "budzi" ją co 0.5s Snoramclear 'podczas resetu nie zeruj zawartości zmiennych
'tu będg deklaracje oraz konfiguracja watchdoga (512ms) i portów 1/0 ' dobrze byłoby tez dodać procedurę ręcznej inicjałizacji, np If Pind 0 • 0 Then tu procedura ręcznej inicjalizacji przyciskiem SI
'1. jak poprzednio najpierw uzyskujemy aktualny stan linii II. 12 oraz wejść SI. S2: '2. jeśli którakolwiek z trzech flag czasu jest ustawiona, w procedurach If-Then-Else zliczamy czasfco O.Ss). gdy czas zostanie odliczony odpowiednia flaga - zerowana '3. potem standardowo sprawdzamy stan centralki Powerdown End
Rys. 115.
$nora»clear
Din Stan As Byte Config Portb * Output Config Batchdog - 512 Start Batchdog
'( tu wykorzystaliśmy komentarz globalny Portb * Stan 'i może coś jeszcze
')
Incr Stan Portb ■ Stan
Snoramclear Din Stan As Byte |
Config Portb * Output |
Config Watchdog • |
512 Start Watchdog |
'( tu wykorzystaliśmy komentarz globalny | |
Portb * Stan |
'i może coś jeszcze ') |
Incr Stan Portb * |
Stan |
Powerdovn End |
Rys. 117. |
Niech teraz przez większość czasu nasza centralka pozostaje w trybie Power Down i niech co około 0,5 sekundy watchdog budzi ją do życia na króciutką chwilę. Taki zabieg radykalnie obniży pobór prądu przez procesor. My w naszej płytce testowej tego faktu nie wykorzystamy, bo nawet jeśli wyjmiesz z podstawki układ PCF8591, znaczny prąd nadal pobierać będą kontrolka LED, układ TL431, a także wyświetlacze, które tak jak poprzednio mają na bieżąco pokazywać stan centralki. Niemniej taki sposób jest jak najbardziej użyteczny i godny polecenia, więc zmodyfikujmy wcześniejszy program. Koncepcja jest bardzo prosta - teraz program nie będzie już zawierał pętli Do...Loop i nie będziemy wykorzystywać timera ani przerwań od niego. Zamiast przerwania od Timera l wykorzystamy reset zarządzany co pół sekundy przez watchdog. Program będzie bardzo podobny do wcześniejszego, ale musimy uwzględnić kilka ważnych szczegółów. Mianowicie w standardowym programie po rese-cie następuje programowe zerowanie pamięci RAM, czyli zerowanie wszystkich zmiennych. U nas zmienna Stan nadal ma zawierać informacje o aktualnym stanie centralki, więc nie można jej zerować co pół sekundy. Zapobiegnie temu umieszczona na początku programu dyrektywa $noramclear
Znak dolara na początku wskazuje, iż jest to dyrektywa dla kompilatora, żeby w programie nie umieścił standardowej procedury zerowania RAM-u. Ponieważ podczas resetu rejestry 1/0, a tym samym końcówki I/O, zawsze są zerowane, nie możemy już wykorzystywać bitu Podtb.6 jako pamięci alarmu -trzeba dodać „wewnętrzną” zmienną bitową w pamięci RAM. Wcześniej procedura ini-cjalizacji centralki, czyli ustalenie trybu początkowego, następowała po włączeniu zasilania i resecie. Teraz reset następuje co pół sekundy i trzeba jakoś inaczej zapewnić ini-cjalizację - można na przykład wykorzystać przycisk S1. Szkielet nowego programu pokazuje rysunek 115 (C022a.bas) Podkreślam, że nie ma tu pętli Do...Loop, więc po każdym resecie od watchdoga program ma zostać wykonany jeden raz, a po dojściu do rozkazu Powerdown procesor ma się wyłączyć i czekać w uśpieniu na następne „szczeknięcie” watchdoga.
UWAGA! Jeśli zgodnie z rysunkiem 107 dołączysz do zacisków PD.5, PD.6 linie dozorowe z czujnikami normalnie zwartymi, włączysz na stałe tranzystory T5, T6 i wyświetlacz W2. Przewodzące tranzystory T5, T6 mogą uniemożliwić zaprogramowanie procesora. Dlatego wyjątkowo w tym i następnym ćwiczeniu:
Ja szybciutko zmodyfikowałem program według takiej koncepcji, skompilowałem, załadowałem i... nic! Program nie działał.
Straciłem kilka godzin, szukając przyczyn. W końcu okroiłem program do ostatnich granic i dopiero wtedy odkryłem zaskakującą zależność. Sprawdź to koniecznie na swoim komputerze. Na rysunkach 116 i 117 oraz w plikach (C022b.bas, C022c.bas) znajdziesz dwie niemal identyczne wersje tego samego prościutkiego programiku. Wykorzystuje on watchdog i polecenie Powerdown -co pół sekundy następuje reset i zwiększenie dwójkowego licznika Stan, co jest następnie obrazowane na wyświetlaczu. U mnie pierwsza wersja (C022b.bas) po kompilacji daje działający program. Druga (C022c.bas) też bez problemu daje się skompilować i załadować do procesora, ale program nie funkcjonuje. Jak widzisz, wersje różnią się wyłącznie umieszczeniem znacznika końca globalnego komentarza: •).
Wygląda to na niedoróbkę programu BA-SCOM AVR, przynajmniej w naszej wersji Demo 1.11.6.8. Zdecydowałem się wspomnieć o tym szczególe, bo w przyszłości na pewno w różnych programach spotkasz się z podobnymi niespodziankami. Wynikają one z niedopracowania kompilatora lub braku stosownej informacji w pliku pomocy czy instrukcji obsługi.
Jak zwykle mam dla Ciebie propozycję -sprawdź, jak u Ciebie zachowuje się nie tylko ten programik, ale podobne ze znacznikami globalnego komentarza. Czy ma tu znaczenie fakt wykorzystywania watchdoga? Dlaczego taki sam komentarz nie ma wpły-
realizacja programu - w tym czasie zdąży się ustabilizować zarówno napięcie zasilania (które wzrośnie do wartości nominalnej), jak też amplituda i częstotliwość generatora kwarcowego. Przy napięciu zasilania 5V częstotliwość wewnętrznego oscylatora RC wynosi około IM Hz, więc czas zliczenia 16384 impulsów wynosi mniej więcej 16ms i dopiero po tym czasie zanika sygnał wewnętrznego resetu i program przejmuje pełną kontrolę nad procesorem. Fakt opóźnienia działania programu o kilkanaście milisekund zwykle nie ma praktycznego znaczenia. Tylko w niektórych wyjątkowych zastosowaniach trzeba uwzględnić okoliczność, że przez ten czas, przed rozpoczęciem pracy programu, wszystkie końcówki portów są w tzw. stanie trzecim (wiszą w powietrzu). W razie potrzeby trzeba więc tak zaplanować obwody peryferyjne, zwłaszcza obwody wykonawcze, żeby w tym czasie resetowania ich stan był taki, jak potrzeba. Można to osiągnąć na przykład stosując dodatkowe rezystory ściągające bądź podciągające.
Za względu na słabą stabilność oscylatora RC zliczanie 16384 impulsów może przy napięciu zasilania 5V trwać 11...21ms, co trzeba wziąć pod uwagę w zastosowaniach, gdzie wymagane jest dokładne odmierzanie czasu. Opisany czas opóźnienia można znacznie zmniejszyć, zapewniając szybkie narastanie napięcia zasilana po włączeniu oraz programując specjalny dodatkowy bit w pamięci FLASH oznaczony FSTRT. Bit * ten skraca czas zliczania impulsów wewnętrzne- ” go oscylatora z 16ms±5ms do 0,28ms±0,3ms ^ przez skrócenie cyklu zliczania licznika z 16384 ® na 256 taktów oscylatora - patrz rysunek D. Z Skracanie opóźnienia ma jednak uzasadnienie tylko wówczas, gdy napięcie zasilania narasta * szybko, a zamiast rezonatora kwarcowego za- ^ stosowany jest albo rezonator ceramiczny, gwa- ^ rantujący szybkie powstanie i stabilizację prze-biegu taktującego procesor albo generator zewnętrzny.
Elektronika dla Wszystkich Grudzień 2003 37