TwoTimers.ob07 3.6 KB

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