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. MODULE TimerA;
  10.  
  11. IMPORT SYSTEM, MSP430;
  12.  
  13.  
  14. CONST
  15.  
  16.     REDLED   = {0};
  17.     GREENLED = {6};
  18.  
  19.     (* регистры порта P1 *)
  20.     P1OUT = 21H;
  21.     P1DIR = 22H;
  22.  
  23.  
  24.     (* регистры таймера A *)
  25.     TACTL = 0160H;
  26.  
  27.         (* биты регистра TACTL *)
  28.         TAIFG   = {0};
  29.         TAIE    = {1};
  30.         TACLR   = {2};
  31.         MC0     = {4};
  32.         MC1     = {5};
  33.         ID0     = {6};
  34.         ID1     = {7};
  35.         TASSEL0 = {8};
  36.         TASSEL1 = {9};
  37.  
  38.     TAR = 0170H;
  39.  
  40.     TACCTL0 = 0162H;
  41.  
  42.         (* биты регистра TACCTL0 *)
  43.         CCIE = {4};
  44.         CAP  = {8};
  45.  
  46.     TACCR0 = 0172H;
  47.  
  48.  
  49. PROCEDURE set_bits (mem: INTEGER; bits: SET);
  50. VAR
  51.     b: BYTE;
  52.  
  53. BEGIN
  54.     SYSTEM.GET(mem, b);
  55.     SYSTEM.PUT8(mem, BITS(b) + bits)
  56. END set_bits;
  57.  
  58.  
  59. PROCEDURE clr_bits (mem: INTEGER; bits: SET);
  60. VAR
  61.     b: BYTE;
  62.  
  63. BEGIN
  64.     SYSTEM.GET(mem, b);
  65.     SYSTEM.PUT8(mem, BITS(b) - bits)
  66. END clr_bits;
  67.  
  68.  
  69. PROCEDURE inv_bits (mem: INTEGER; bits: SET);
  70. VAR
  71.     b: BYTE;
  72.  
  73. BEGIN
  74.     SYSTEM.GET(mem, b);
  75.     SYSTEM.PUT8(mem, BITS(b) / bits)
  76. END inv_bits;
  77.  
  78.  
  79. (* обработчик прерываний *)
  80. PROCEDURE int (priority: INTEGER; interrupt: MSP430.TInterrupt);
  81. VAR
  82.     x: SET;
  83.  
  84. BEGIN
  85.     IF priority = 24 THEN                 (* прерывание от таймера A *)
  86.         SYSTEM.GET(TACTL, x);             (* взять регистр TACTL *)
  87.         IF TAIFG * x = TAIFG THEN         (* прерывание было *)
  88.             inv_bits(P1OUT, REDLED);      (* изменить состояние светодиода *)
  89.             inv_bits(P1OUT, GREENLED);    (* изменить состояние светодиода *)
  90.             SYSTEM.PUT(TACTL, x - TAIFG)  (* сбросить флаг прерывания и обновить регистр TACTL *)
  91.         END
  92.     END
  93. END int;
  94.  
  95.  
  96. PROCEDURE main;
  97. BEGIN
  98.     (* инициализация регистра P1DIR *)
  99.     SYSTEM.PUT8(P1DIR, REDLED + GREENLED);
  100.  
  101.     (* начальное состояние светодиодов *)
  102.     set_bits(P1OUT, GREENLED); (* включен *)
  103.     clr_bits(P1OUT, REDLED);   (* выключен *)
  104.  
  105.     MSP430.SetIntProc(int);  (* назначить обработчик прерываний *)
  106.     MSP430.EInt;             (* разрешить прерывания *)
  107.  
  108.     (* инициализация регистров таймера A *)
  109.     SYSTEM.PUT(TAR, 0);
  110.     SYSTEM.PUT(TACCTL0, CCIE + CAP);
  111.     SYSTEM.PUT(TACCR0, 1000);
  112.     SYSTEM.PUT(TACTL, TAIE + MC0 + TASSEL0)
  113. END main;
  114.  
  115.  
  116. BEGIN
  117.     main
  118. END TimerA.
  119.