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.   При нажатии на кнопку P1.3, инкрементируется
  6.   переменная-счетчик перезапусков и программа
  7.   перезапускается.
  8.   В зависимости от четности счетчика перезапусков,
  9.   включается зеленый или красный светодиод.
  10.  
  11. *)
  12.  
  13. MODULE Restart;
  14.  
  15. IMPORT SYSTEM, MSP430;
  16.  
  17.  
  18. CONST
  19.  
  20.     REDLED   = {0};
  21.     GREENLED = {6};
  22.     BUTTON   = {3};
  23.  
  24.     (* регистры порта P1 *)
  25.     P1OUT = 21H;
  26.     P1DIR = 22H;
  27.     P1IFG = 23H;
  28.     P1IE  = 25H;
  29.     P1REN = 27H;
  30.  
  31.  
  32. VAR
  33.  
  34.     count: INTEGER; (* счетчик перезапусков *)
  35.  
  36.  
  37. PROCEDURE set_bits (mem: INTEGER; bits: SET);
  38. VAR
  39.     b: BYTE;
  40.  
  41. BEGIN
  42.     SYSTEM.GET(mem, b);
  43.     SYSTEM.PUT8(mem, BITS(b) + bits)
  44. END set_bits;
  45.  
  46.  
  47. PROCEDURE clr_bits (mem: INTEGER; bits: SET);
  48. VAR
  49.     b: BYTE;
  50.  
  51. BEGIN
  52.     SYSTEM.GET(mem, b);
  53.     SYSTEM.PUT8(mem, BITS(b) - bits)
  54. END clr_bits;
  55.  
  56.  
  57. PROCEDURE test_bits (mem: INTEGER; bits: SET): SET;
  58. VAR
  59.     b: BYTE;
  60.  
  61. BEGIN
  62.     SYSTEM.GET(mem, b)
  63.     RETURN bits * BITS(b)
  64. END test_bits;
  65.  
  66.  
  67. (* обработчик прерываний *)
  68. PROCEDURE int (priority: INTEGER; interrupt: MSP430.TInterrupt);
  69. BEGIN
  70.     IF priority = 18 THEN                          (* прерывание от порта P1 *)
  71.         IF test_bits(P1IFG, BUTTON) = BUTTON THEN  (* нажата кнопка *)
  72.             INC(count);                            (* увеличить счетчик *)
  73.             MSP430.Delay(500);                     (* задержка для отпускания кнопки *)
  74.             clr_bits(P1IFG, BUTTON);               (* сбросить флаг прерывания *)
  75.             MSP430.Restart                         (* перезапустить программу *)
  76.         END
  77.     END
  78. END int;
  79.  
  80.  
  81. PROCEDURE main;
  82. BEGIN
  83.     (* инициализация регистров порта P1 *)
  84.     SYSTEM.PUT8(P1DIR, REDLED + GREENLED);  (* выход *)
  85.     set_bits(P1REN, BUTTON);                (* включить подтягивающий резистор *)
  86.     set_bits(P1OUT, BUTTON);                (* подтяжка к питанию *)
  87.     set_bits(P1IE,  BUTTON);                (* разрешить прерывания от кнопки *)
  88.  
  89.     (* выключить светодиоды *)
  90.     clr_bits(P1OUT, REDLED + GREENLED);
  91.  
  92.     MSP430.SetIntProc(int);  (* назначить обработчик прерываний *)
  93.     MSP430.EInt;             (* разрешить прерывания *)
  94.  
  95.     IF ODD(count) THEN
  96.         set_bits(P1OUT, GREENLED) (* нечетное - вкл. зеленый *)
  97.     ELSE
  98.         set_bits(P1OUT, REDLED)   (* четное - вкл. красный *)
  99.     END
  100.  
  101. END main;
  102.  
  103.  
  104. BEGIN
  105.     main
  106. END Restart.
  107.