Restart.ob07 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. (*
  2. Пример для LaunchPad MSP-EXP430G2 Rev1.5
  3. При нажатии на кнопку P1.3, инкрементируется
  4. переменная-счетчик перезапусков и программа
  5. перезапускается.
  6. В зависимости от четности счетчика перезапусков,
  7. включается зеленый или красный светодиод.
  8. *)
  9. MODULE Restart;
  10. IMPORT SYSTEM, MSP430;
  11. CONST
  12. REDLED = {0};
  13. GREENLED = {6};
  14. BUTTON = {3};
  15. (* регистры порта P1 *)
  16. P1OUT = 21H;
  17. P1DIR = 22H;
  18. P1IFG = 23H;
  19. P1IE = 25H;
  20. P1REN = 27H;
  21. VAR
  22. count: INTEGER; (* счетчик перезапусков *)
  23. PROCEDURE set_bits (mem: INTEGER; bits: SET);
  24. VAR
  25. b: BYTE;
  26. BEGIN
  27. SYSTEM.GET(mem, b);
  28. SYSTEM.PUT8(mem, BITS(b) + bits)
  29. END set_bits;
  30. PROCEDURE clr_bits (mem: INTEGER; bits: SET);
  31. VAR
  32. b: BYTE;
  33. BEGIN
  34. SYSTEM.GET(mem, b);
  35. SYSTEM.PUT8(mem, BITS(b) - bits)
  36. END clr_bits;
  37. PROCEDURE test_bits (mem: INTEGER; bits: SET): SET;
  38. VAR
  39. b: BYTE;
  40. BEGIN
  41. SYSTEM.GET(mem, b)
  42. RETURN bits * BITS(b)
  43. END test_bits;
  44. (* обработчик прерываний *)
  45. PROCEDURE int (priority: INTEGER; interrupt: MSP430.TInterrupt);
  46. BEGIN
  47. IF priority = 18 THEN (* прерывание от порта P1 *)
  48. IF test_bits(P1IFG, BUTTON) = BUTTON THEN (* нажата кнопка *)
  49. INC(count); (* увеличить счетчик *)
  50. MSP430.Delay(500); (* задержка для отпускания кнопки *)
  51. clr_bits(P1IFG, BUTTON); (* сбросить флаг прерывания *)
  52. MSP430.Restart (* перезапустить программу *)
  53. END
  54. END
  55. END int;
  56. PROCEDURE main;
  57. BEGIN
  58. (* инициализация регистров порта P1 *)
  59. SYSTEM.PUT8(P1DIR, REDLED + GREENLED); (* выход *)
  60. set_bits(P1REN, BUTTON); (* включить подтягивающий резистор *)
  61. set_bits(P1OUT, BUTTON); (* подтяжка к питанию *)
  62. set_bits(P1IE, BUTTON); (* разрешить прерывания от кнопки *)
  63. (* выключить светодиоды *)
  64. clr_bits(P1OUT, REDLED + GREENLED);
  65. MSP430.SetIntProc(int); (* назначить обработчик прерываний *)
  66. MSP430.EInt; (* разрешить прерывания *)
  67. IF ODD(count) THEN
  68. set_bits(P1OUT, GREENLED) (* нечетное - вкл. зеленый *)
  69. ELSE
  70. set_bits(P1OUT, REDLED) (* четное - вкл. красный *)
  71. END
  72. END main;
  73. BEGIN
  74. main
  75. END Restart.