Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. (*
  2.  
  3. Пример для LaunchPad MSP-EXP430G2 Rev1.5
  4.  
  5.   Зеленый светодиод мигает по сигналам от таймера A,
  6.   красный - по сигналам от сторожевого таймера в интервальном режиме
  7.  
  8. *)
  9.  
  10. MODULE TwoTimers;
  11.  
  12. IMPORT SYSTEM, MSP430;
  13.  
  14.  
  15. CONST
  16.  
  17.     REDLED   = {0};
  18.     GREENLED = {6};
  19.  
  20.     (* регистры порта P1 *)
  21.     P1OUT = 21H;
  22.     P1DIR = 22H;
  23.  
  24.  
  25.     (* регистр разрешения прерываний 1 *)
  26.     IE1 = 00H;
  27.  
  28.         (* биты регистра IE1 *)
  29.         WDTIE = {0};
  30.         NMIIE = {4};
  31.  
  32.  
  33.     (* регистр флагов прерываний 1 *)
  34.     IFG1 = 02H;
  35.  
  36.         (* биты регистра IFG1 *)
  37.         WDTIFG = {0};
  38.         NMIIFG = {4};
  39.  
  40.  
  41.     WDTCTL = 0120H; (* регистр сторожевого таймера *)
  42.  
  43.         (* биты регистра WDTCTL *)
  44.         WDTIS0   = {0};
  45.         WDTIS1   = {1};
  46.         WDTSSEL  = {2};
  47.         WDTCNTCL = {3};
  48.         WDTTMSEL = {4};
  49.         WDTNMI   = {5};
  50.         WDTNMIES = {6};
  51.         WDTHOLD  = {7};
  52.         WDTPW    = {9, 11, 12, 14};  (* ключ защиты *)
  53.  
  54.  
  55.     (* регистры таймера A *)
  56.     TACTL = 0160H;
  57.  
  58.         (* биты регистра TACTL *)
  59.         TAIFG   = {0};
  60.         TAIE    = {1};
  61.         TACLR   = {2};
  62.         MC0     = {4};
  63.         MC1     = {5};
  64.         ID0     = {6};
  65.         ID1     = {7};
  66.         TASSEL0 = {8};
  67.         TASSEL1 = {9};
  68.  
  69.     TAR = 0170H;
  70.  
  71.     TACCTL0 = 0162H;
  72.  
  73.         (* биты регистра TACCTL0 *)
  74.         CCIE = {4};
  75.         CAP  = {8};
  76.  
  77.     TACCR0 = 0172H;
  78.  
  79.  
  80. PROCEDURE set_bits (mem: INTEGER; bits: SET);
  81. VAR
  82.     b: BYTE;
  83.  
  84. BEGIN
  85.     SYSTEM.GET(mem, b);
  86.     SYSTEM.PUT8(mem, BITS(b) + bits)
  87. END set_bits;
  88.  
  89.  
  90. PROCEDURE inv_bits (mem: INTEGER; bits: SET);
  91. VAR
  92.     b: BYTE;
  93.  
  94. BEGIN
  95.     SYSTEM.GET(mem, b);
  96.     SYSTEM.PUT8(mem, BITS(b) / bits)
  97. END inv_bits;
  98.  
  99.  
  100. (* обработчик прерываний *)
  101. PROCEDURE int (priority: INTEGER; interrupt: MSP430.TInterrupt);
  102. VAR
  103.     x: SET;
  104.  
  105. BEGIN
  106.     IF priority = 26 THEN                 (* прерывание от сторожевого таймера *)
  107.         inv_bits(P1OUT, REDLED)           (* изменить состояние светодиода *)
  108.     ELSIF priority = 24 THEN              (* прерывание от таймера A *)
  109.         SYSTEM.GET(TACTL, x);             (* взять регистр TACTL *)
  110.         IF TAIFG * x = TAIFG THEN         (* прерывание было *)
  111.             inv_bits(P1OUT, GREENLED);    (* изменить состояние светодиода *)
  112.             SYSTEM.PUT(TACTL, x - TAIFG)  (* сбросить флаг прерывания и обновить регистр TACTL *)
  113.         END
  114.     END
  115. END int;
  116.  
  117.  
  118. PROCEDURE main;
  119. BEGIN
  120.     (* инициализация регистра P1DIR *)
  121.     set_bits(P1DIR, REDLED + GREENLED);
  122.  
  123.     (* начальное состояние светодиодов - включены *)
  124.     set_bits(P1OUT, REDLED + GREENLED);
  125.  
  126.     MSP430.SetIntProc(int);  (* назначить обработчик прерываний *)
  127.     MSP430.EInt;             (* разрешить прерывания *)
  128.  
  129.     (* инициализация регистров таймера A *)
  130.     SYSTEM.PUT(TAR, 0);
  131.     SYSTEM.PUT(TACCTL0, CCIE + CAP);
  132.     SYSTEM.PUT(TACCR0, 1500);
  133.     SYSTEM.PUT(TACTL, TAIE + MC0 + TASSEL0);
  134.  
  135.     (* инициализация регистров сторожевого таймера *)
  136.     set_bits(IE1, WDTIE);
  137.     SYSTEM.PUT(WDTCTL, WDTPW + WDTIS1 + WDTSSEL + WDTCNTCL + WDTTMSEL)
  138. END main;
  139.  
  140.  
  141. BEGIN
  142.     main
  143. END TwoTimers.
  144.