background image

Laboratorium  2 :        Watchdog Timer, Przerwania.  

  

 Watchdog timer 

 

Watchdog Timer w skrócie WDT, jest urządzeniem odpowiedzialnym za sprawdzanie 

prawidłowego działania programu. Ma on za zadanie eliminować  wszelkie  zawieszenia  
programu  i  automatycznie  dokonywać  restartu urządzenia w przypadku wykrycia 
nieprawidłowego działania programu lub jego zawieszenia.  

 
Mikrokontrolery z rodziny MSP430 posiadają wbudowany układ  WDT. Jego schemat 

jest zamieszczony na rys.1.  
  
 

 

                     
Rys1. Schemat blokowy układu Watchdog Timer w MSP430 
 
    Głównym zadaniem WDT w procesorach MSP430 jest generowanie sygnału reset w 
przypadku zawieszenia programu (watchdog mode). Restart jest dokonywany po upłynięciu 
zaprogramowanego wcześniej interwału czasowego. Jednak jeśli ta funkcja nie jest  

background image

uŜywana w kodzie programu, WDT moŜe pełnić funkcję licznika odliczającego odstępy 
czasu, po upływie których generowane jest przerwanie (interval  mode). 
 

Po włączeniu zasilania WDT jest włączany w tryb watchdog, z ustawionym czasem 32 

ms., po którym następuje reset układu. Dlatego konfiguracja lub wyłączenie WDT powinny 
być pierwszą czynnością wykonaną przez kod programu

 
Z układem WDT związany jest rejestr Watchdog Timer Control: WDTCTL dostępny pod 
adresem 0120h. 

 

Rys 2. Rejestr WDTCTL Watchdog Timer w MSP430 
 
 

Podstawowe parametry, które moŜemy ustawić w Rejestr WDTCTL opisuje tabela: 

 

WDTPW 

Bity 15-8 

Watchdog timer password. Hasło WDT. Aby móc pisać do rejestru 

naleŜy podać wartość 05ah w przeciwnym wypadku jest wygenerowany PUC. Natomiast podczas 
odczytywania rejestru zawsze jest odczytywana wartość 069h. 
  
WDTHOLD 

Bit 7 

 

Watchdog timer hold. Bit ten wyłącza układ WDT.  
0-Watchdog timer jest włączony.  
1-Watchdog timer jest zatrzymany.  

  
WDTNMIES  Bit 6 

 

Watchdog timer NMI edge select. Bit ten wybiera rodzaj zbocza przy 

którym następuje przerwanie NMI, dzieje się to wyłącznie przy ustawionym WDTNM=1.  

0 NMI przy rosnącym zboczu.  
1 NMI przy opadającym zboczu.  

  

WDTNMI 

Bit 5 

 

Watchdog timer NMI select. Bit ten określa funkcję jaką pełni pin 

RST/NMI.  

0 Funkcja resetu.  
1 Funkcja NMI (przerwanie niemaskowane).   

  
WDTTMSEL  Bit 4 

 

Watchdog timer mode select. Tryb pracy WDT.  
0 tryb watchdog.   
1 tryb odmierzania odcinków czasu.(interval)  

  
WDTCNTCL  Bit 3 

 

Watchdog timer counter clear. Ustawiając WDTCNTCL=1 zerujemy 

wartość zliczaną przez WDT. Gdy wartość WDTISx jest osiągnięta wówczas WDTCNTCL jest 
zerowany automatycznie.  

0 Brak reakcji.  
1 WDTCNT = 0000h  

  

background image

WDTSSEL 

Bit 2 

 

Watchdog timer clock source select. Wybór zegara który będzie 

powiązany z WDT. 

0 SMCLK  
1 ACLK  

  
WDTISx 

Bity1-0  

Watchdog timer interval select .Bity te ustawiają czas po którym jest 

ustawiana flaga WDTIFG i/lub jest generowany PUC.  

00 Watchdog clock source /32768  
01 Watchdog clock source /8192  
10 Watchdog clock source /512  
11 Watchdog clock source /64  

 
 
Definicje stałych związanych z WDT znajdyją się w pliku msp430x14x.h, który naleŜy 
dołączyć do kodu programu.  

#include <msp430x14x.h> 

Wyłaczenie WDT umoŜliwia następujący kod: 

WDTCTL=WDTPW+ WDTHOLD; 

 

 Przerwania 

Do pracy okładu WDT z przerwaniami konieczne jest ustawienie stanu rejestrów IE1 oraz 
IFG1. Będą nas interesowały bity rejestru opisane w poniŜszych tabelach: 

 

 Rys 3. Rejestr IE1 Interrupt Enable Register 1 
 
NMIIE  

Bit 4   

NMI interrupt enable. Bit ten włącza przerwania NMI. PoniewaŜ 

inne bity w rejestrze IE1 mogą być uŜywane do innych celów, jest zalecane aby do  
ustawiania bądź zerowania tego bitu uŜywać instrukcji BIS.B lub BIS.C (asembler) lub |=  
oraz &= w języku C.  

0  Przerwania nie włączone  
1  Przerwania włączone  

  
WDTIE 

Bit 0   

Watchdog timer interrupt enable. Bit ten włącza przerwania dla 

WDT pracującego w trybie interval. Nie jest konieczne ustawianie tego bitu dla trybu 
watchdog. Zalecane jest, aby do ustawiania bądź zerowania tego bitu uŜywać instrukcji BIS.B 
lub BIS.C (asembler) lub |=  oraz &= w języku C.  

0     Przerwania nie włączone  
1     Przerwania włączone  

 

 

Rys 4. Rejestr IFG1 Interrupt Flag Register 1 

background image

 
NMIIFG  

Bit 4   

 NMI interrupt flag. NMIIFG must be reset by software. 

Because other bits in IFG1 may be used for other modules, it is recommended to clear 
NMIIFG by using BIS.B or BIC.B instructions, rather than MOV.B or CLR.B instructions. 

0 No interrupt pending 
1 Interrupt pending 
 

WDTIFG  

Bit 0   

Watchdog timer interrupt flag. In watchdog mode, WDTIFG 

remains set until reset by software. In interval mode, WDTIFG is reset automatically by 
servicing the interrupt, or can be reset by software. Because other bits in IFG1 may be used 
for other modules, it is recommended to clear WDTIFG by using BIS.B or BIC.B 
instructions, rather than MOV.B or CLR.B instructions. 

0 No interrupt pending 
1 Interrupt pending 

 

Praca z przerwaniami 

 

W celu uruchomienia przerwań od danego urządzenia, naleŜy ustawić odpowiednie 

bity w rejestrze przerwań IE1 oraz wywołać funkcję 

_EINT()

włączającą system przerwania  

Przykładowo przerwania dla WDT uruchamia kod:  

IE1 |= WDTIE;                         // Wł

ą

czenie przerwa

ń

 od WDT  

_EINT();                              // Wł

ą

czenie przerwa

ń

 

 
Dodatkowo musimy napisać procedurę obsługi przerwania i podpiąć ją pod odpowiedni 
wektor przerwań. Przykład  procedury obsługi przerwania dla WDT: 

// procedura obsługi przerwania od WDT 
#pragma vector=WDT_VECTOR 
__interrupt void watchdog_timer(void) 

  P2OUT ^= BIT1;                        // zapal/zga

ś

 diod

ę

 

 
Przykład  procedury obsługi przerwania dla TimerA

 

// procedura obsługi przerwania od TimerA 
#pragma vector=TIMERA0_VECTOR 
__interrupt void Timer_A (void) 

++licznik; 

 
 

Zegar 

 

WDT wymaga przyporządkowania zegara. Funkcję tę pełni Basic Clock Module. 

 
Basic Clock Module  
  
Podstawą czasu w układzie MSP430 moŜe być jeden z zegarów:  
•  LFXT1CLK (Low Frequency/High Frequency Oscillator ) – pracuje on z 
niskoczęstotliwościowym kwarcem 32678Hz, bądź z rezonatorami z zakresu 450kHz- 8MHz  
(tryb pracy wysokoczęstotliwościowej)   
•  XT2CLK (High Frequency Oscillator) jest uŜywany opcjonalnie, moŜe być zasilany   

background image

standardowym  kwarcem,  bądź  rezonatorami  z  zakresu  450kHz- 8MHz    
•  DCO- wewnętrzny zegar taktujący posiadający charakterystykę RC  

 

Rys 5. Basic Clock Module 
 
Poszczególne komponenty mikrokontrolera mogą być sterowane zegarami :   
   
•  ACLK (Auxilary Clock) –zegar pomocniczy jego źródłem jest LFXT1CLK   
•  MCLK (Main Clock) – zegar uŜywany przez CPU oraz system, jego źródłem moŜe być  
LFXT1CLK, bądź XT2CLK, bądź DCO.   
•  SMCLK (Sub-main Clock)- jest przeznaczony do współpracy z urządzeniami  
peryferyjnymi,  jego źródłem jest LFXT1CLK, XT2CLK, bądź DCO.   
   
Po  restarcie  standardowo zegar procesora jest ustawiany na DCO. DCO generuje  
częstotliwość około 800 kHz, jednak jest to częstotliwość niezbyt stabilna.    
Aby ustawić taktowanie z rezonatora kwarcowego 8MHz wbudowanego w EasyWeb, naleŜy  
wybrać źródło zegara podstawowego Basic Clock na taktowanie przez LFXT1CLK,   
  

background image

Operacje, które naleŜy wykonać są następujące:  
  
1.  Włączenie oscylatora   
2.  Wyczyszczenie flagi OFIFG   
3.  Odczekanie około 50µs   
4.  Sprawdzenie stanu flagi OFIFG jeśli jest nadal ustawiona to powtórzenie   
kroków 1-4   
5.  Zmiana taktowania zegarów w rejestrze BCSCTL2  
 
 
Przykładowy kod realizujący ustawienie zegara podstawowego moŜe być następujący:  
  

// Basic Clock Module ustawiamy na ACLK(zegar 8 MHz )   
  
BCSCTL1 |= XTS;                       //ACLK = LFXT1 = HF XTAL 8MHz  
  
do   
  {  
  IFG1 &= ~OFIFG;                     // Czyszczenie flgi OSCFault  
  for (i = 0xFF; i > 0; i--);         // odczekanie  
  }  
  while ((IFG1 & OFIFG) == OFIFG);    // dopóki OSCFault jest ci

ą

gle 

ustawiona     
  
BCSCTL1 |= DIVA_0;                    // ACLK=8 MHz – bez podzielników  
BCSCTL2 |= SELM0 | SELM1;             // MCLK= LFTX1 =ACLK  
  

 
 
Inne ustawienia podstawowego zegara moŜna wpisać do rejestrów Basic Clock Module, 
bazując na dokumentacji modułu. 
 
 

Zadania 

Zadanie 1. 
     W  ćwiczeniu  pierwszym  zajmiemy  się  trybem  pracy  interval.   
NaleŜy  napisać program,  który  będzie  powodował  cykliczne zapalanie i gaszenie diody  w  
równych  odstępach  czasu (prowadzący  podaje  w  jakich).  Podczas  startu  urządzenia 
standardowo WDT pracuje w trybie watchdog. Zatem będzie trzeba zmienić tryb pracy na  
interwal, ustawiając odpowiednio stan rejestru WDTCTL. Dostęp do  tego rejestru  jest 
chroniony hasłem. Oznacza  to, Ŝe  jeśli chcemy  coś  zapisać  do  tego  rejestru  to  jako  
bardziej  znaczący  bajt  słowa  musimy podać hasło (05ah czyli WDTPW). W przypadku gdy 
wartość hasła nie jest prawidłowa następuje programowy restart urządzenia PUC. Bity z 
mniej znaczącego bajtu rejestru WDTCTL  odpowiadają  za  kontrolę  nad  pracą  WDT. 
Program powinien wykorzystywać procedurę  obsługi  przerwania.  Dlatego  trzeba  pamiętać  
o zainicjowaniu głównego wektora przerwań GIE oraz o ustawieniu przerwań od WDT (  
WDTIE w rejestrze IE1).  
  
Zadanie 2 
   Ćwiczenie drugie polega na zastosowaniu WDT w trybie watchdog. 

background image

NaleŜy napisać program,  który  w  przypadku  zawieszenia  będzie  przy  pomocy  WDT  
dokonywał restartu  i  przywracał  program  do  działania.  Zawieszenie  programu  powinno  
być powodowane przez uŜytkownika (poprzez naciśnięcie klawisza), a gdy układ zostanie  
zrestartowany  przez WDT,  powinno  to  być  oznajmione  po  przez  zapalenie  diody.  
RozróŜnienie, czy  układ  był  restartowany  przez WDT  czy  przez uŜytkownika zapewnia  
flaga WDTIFG  umiejscowiona  w  rejestrze  IFG1.  Podczas  restartu  układu  przez WDT  
flaga WDTIFG  jest  automatycznie  ustawiana . Sprawdzenie jej stanu pozwala na 
znalezienie przyczyny restartu.  
   Po włączeniu zasilania układ ma 2-krotnie zapalić i zgasić wszystkie diody. Po wymuszeniu 
restartu przez WDT, układ ma 10- krotnie zapalić i zgasić wszystkie diody. 
  
 Zadanie 3 
Wykonać zadania 1 i 2 przy uŜyciu zegara DCO.