background image

Laboratorium 4– Zegar  
 

1. Zegar  

5.1. Basic Clock Module 

 
Podstawą czasu w układzie MSP430 moŜe być jeden z zegarów: 
•  LFXT1CLK (Low Frequency/High Frequency Oscillator ) – moŜe on być uŜyty 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  
standardowym  kwarcem,  bądź  rezonatorami  z  zakresu  450kHz- 8MHz   
•  DCO- wewnętrzny zegar taktujący posiadający charakterystykę RC 
 

 

 
 

background image

 
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 moŜe być :LFXT1CLK, bądź 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,  
 
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: 

background image

 

5.2. Timer A 

 
TimerA  moŜe  być  inkrementowany  bądź  dekrementowany,  ma  to  miejsce  z  
kaŜdym  narastającym  zboczem  zegara.  MoŜe  być  programowo  czytany  oraz  
zapisywany. Dodatkowo w przypadku wystąpienia przepełnienia jest generowane  
przerwanie.  Źródłem  zegara  taktującego  TimerA  mogą  być  
(TACLK,ACLK,SMCLK,INCLK),  dodatkowo  istnieje  moŜliwość  podziału  
częstotliwości sygnału taktującego przez 1,2,4,8. TimerA ma moŜliwość pracowania  
w czterech trybach pracy, za ich ustawienie odpowiada znacznik MCx w rejestrze  
TACTL.  
Są to tryby pracy:  

•  Stop – MC=00 – Timer jest zatrzymany  
•  Up  –  MC=01  –  Timer  cyklicznie  liczy  od  zera  do  wartości  zapisanej  w  
rejestrze TACCR0  
•  Continuous- MC-10- Timer cyklicznie liczy od zera do wartości 0xffff  
•  Up/Down  –  MC=11-  Timer  cyklicznie  inkrementuje  od  zera  do  wartości  
zapisanej  w  rejestrze  TACCR0  ,  a  dekrementuje  od  wartości  w  rejestrze  
TACCR0 do zera 

 
Tryb Compare jest stosowany do generowania sygnałów wyjściowych PWM, oraz  
do  generowania  przerwań  w  określonym  odstępie  czasowy.  Przerwanie  jest  
generowane  w  przypadku  gdy  wartość  w  rejestrze  TAR  zostanie  doliczona  do  
wartości w rejestrze TACCRx.  
 
Aktywacja układu TimerA polega na przyporządkowaniu mu odpowiedniego zegara, 
ustawieniu podzielników i włączeniu przerwań. 
 
Ustawienia dokonujemy poprzez rejestry układu Timer A: 

background image

 

NajwaŜniejsze dane wpisujemy do rejestru TACTL 

 

background image

 
 
PoniŜej przykładowy kod realizujący ustawienie Timera A do pracy z przerwaniami :  
 

 
 
TACTL = TASSEL_1 + MC_1 +ID_2;        // Wybieram ACLK, ACLK/4=2MHz,tryb Up 
CCTL0 = CCIE;                         // wł

ą

czenie przerwa

ń

 od CCR0 

CCR0=2000;                           //  Przerwanie generowane co 1 ms 
   

 
 
Procedura obsługi przerwania od Timer A  
 

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

++licznik; 
P2OUT ^=BIT1;                           //zapal diod

ę

 


 

 
 
 
 

Zadania 

1.

 

Napisać program wyświetlający sekundy od 0 do 60, bazując na układzie Timer A. 
Ustawić źródło częstotliwości zegara podstawowego (Basic Clock Module) na ACLK, 
1 MHz. Ustawić źródło zegara Timer A na częstotliwość 250 kHz. Program ma 
działać  w oparciu o przerwania generowane co 100 ms. 

2.

 

Napisać program realizujący zegar wyświetlający bieŜący czas (godzina: minuta: 
sekunda). Zegar ma działać na układzie Timer A. 

3.

 

Uzupełnić funkcjonalności zegara o moŜliwość ustawienia czasu za pomocą 
wbudowanej klawiatury. 

4.

 

Uzupełnić funkcjonalności zegara o stoper pracujący z rozdzielczością 0.01 sekundy. 

5.

 

Uzupełnić funkcjonalności zegara o budzik z moŜliwością zdefiniowania kilku 
alarmów. Wykorzystać wbudowany Buzzer do generowania dźwięku. 

6.

 

UmoŜliwić ustawienie załączania przekaźników w wybranym czasie i na wybrany 
okres (jako rozszerzenie funkcjonalności budzika) 

7.

 

Zrealizować zegar na układzie Timer B