Wydział Informatyki Katedra Systemów Czasu Rzeczywistego Laboratorium Architektury Komputerów |
Data: piątek, 16:00 17.10.2008 |
Sprawozdanie z projektu nr. 2 Skład grupy: Łukasz Jacewicz Michał Jurczuk |
Prowadzący: dr inż. Mirosław Omieljanowicz Ocena: |
Cel projektu:
Prezentacja dla układu MSP430F149, zamontowanego na płytce rozwojowej EasyWeb2, działania Watchdog Timera (w skrócie WDT) w trybie `watchdog mode'.
Wiadomości teoretyczne:
Watchdog timer w skrócie WDT w wolnym tłumaczeniu oznacza czuwający pies. Jego zadaniem jest czuwanie nad prawidłowym działaniem programu. Eliminuje on wszelkie zawieszenia programu przez restart urządzenia. WDT jest szczególnie przydatny gdy urządzenie narażone jest na działanie czynników atmosferycznych. W takim przypadku z powodu temperatury lub jakichś uszkodzeń mechanicznych, gdy program zostanie zawieszony WDT automatycznie dokona restartu.
W mikrokontrolerach z rodziny MSP430 standardowo wbudowany jest układ WDT. Posiada on dwa tryby pracy watchdog mode, który w przypadku zawieszenia programu dokona resetu, oraz interval mode służący do odliczania odstępów czasu (po upływie określonego czasu generuje przerwanie).
Za kontrolę WDT odpowiada 16 bitowy rejestr WDTCTL. Dostęp do rejestru chroniony jest hasłem, więc gdy będziemy chcieli zmienić zawartość rejestrów, najpierw będziemy zmuszeni wpisać hasło pod adres 15-8 bitu rejestru WDTCTL, w przedziwnym wypadku nastąpi restart urządzenia PUC.
Szczegółowy opis WDTCTL:
WDTPW znajduje się w przestrzeni od 15 do 8 bitu. By móc modyfikować zawartość rejestrów, to właśnie tutaj musimy wpisać hasło.
WDTHOLD (Bit 7) Wpisanie wartości 0 włącza układ (domyślnie ustawione na 0), zaś 1 wyłącza. Jeżeli chcemy zaoszczędzić na poborze prądu powinniśmy go wyłączyć.
WDTNMIES (Bit 6) Określa on rodzaj zbocza przy którym następuje przerwanie NMI (tylko przy ustawionym WDTNM na wartość 1). Bit 0 oznacza NMI przy rosnącym zboczu, zaś 1 przy opadającym.
WDTNMI (Bit 5) Określa funkcję jaką pełni pin RST/NMI i w przypadku 0 oznacza funkcje resetu, zaś 1 funkcje NMI.
WDTTMSEL (Bit 4) Określa tryb pracy WDT i 0 oznacza tryb watchdog, czyli będzie czuwać nad prawidłowym działaniem programu, a 1 tryb służący do mierzenia odcinków czasu.
WDTCNTCL (Bit 3) Gdy ustawimy ten bit na 1 zostanie z zerowana wartość zliczana przez watchdog timer'a, Przy wartości bitu ustawionej na 0 nic się nie dzieje.
WDTSSEL (Bit 2) Wybiera rodzaj zegara, 0 wybiera SMCLK, zaś 1 zegar ACLK.
WDTISx znajduje się na dwóch bitach 0 oraz 1. Bity te oznaczają czas po którym nastąpi ustawienie flagi WDTIFG i/lub zostanie wygenerowany PUC.
W rejestrze IFG1 na bicie 0 znajduje się WDTIFG i oznacza watchdog timer interrupt flag. W trybie watchdog bit ten zostaje ustawiony po restarcie systemu spowodowanym przez WDT. Wartość ta pozostaje ustawiona, aż do momentu wyzerowania przez programistę. W przypadku interval mode bit ten jest automatycznie resetowany po zakończeniu procedury obsługi przerwania, lecz może być również zerowany przez programistę.
W celu przedstawienia programowego restartowania układu przez WDT używamy diody statusu (zgaszona mówi o restarcie układu przez WDT). Normalna praca programu jest sygnalizowana miganiem diody połączonej równolegle z przekaźnikiem 1.
Kod programu:
#include "io430.h"
int main( void )
{
int i;
P1DIR |= BIT5; // konfigurowanie linii P1.5 (REL1) jako wyjście
P2DIR |= BIT1; // konfigurowanie linii P2.1 (dioda statusu) jako wyjście
P4DIR &= ~BIT1; // konfigurowanie linii P4.4 (przycisk B1) jako wejście
WDTCTL = WDTPW + WDTCNTCL; // zerowanie wewnętrznego licznika WDT (WDTCNT)
if (WDTIFG & IFG1) // sprawdzanie czy została ustawiona flaga WDTIFG w rejestrze IFG1
// podczas restartu układu przez WDT flaga WDTIFG jest automatycznie ustawiana
{ // flaga WDTIFG była ustawiona
IFG1 &= ~WDTIFG; // wyzerowanie flagi WDTIFG
P2OUT |= BIT1; // zgaszenie diody statusu (P2.1)
}
else // flaga WDTIFG nie była ustawiana
P2OUT &= ~BIT1; // zapalenie diody statusu (P2.1)
while(1)
{
if ((P4IN & BIT4) == 0) // sprawdzanie czy został naciśnięty klawisz B1 (P4.4)
{ // przycisk został naciśnięty
for(;;) ; // nieskończona pętla, powodująca zawieszenie programu i w konsekwencji restart układu
}
else // przycisk nie został przyciśnięty
{
if ((P1IN & BIT5) == 0) // sprawdzanie czy dioda przyłączona równolegle z przekaźnikiem 1 jest wyłączona
P1OUT |= BIT5; // zapalenie diody przyłączonej równolegle z przekaźnikiem 1
else
P1OUT &= ~BIT5; // zgaszenie diody przyłączonej równolegle z przekaźnikiem 1
WDTCTL = WDTPW + WDTCNTCL; // zerowanie wewnętrznego licznika WDT, aby nie nastąpił restart układu
for (i=0; i<4000; ++i); // pętla pozwalająca obserwować efekt migania diody przyłączonej równolegle z przekaźnikiem 1
}
}
}