TimerA.ob07 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. (*
  2. Пример для LaunchPad MSP-EXP430G2 Rev1.5
  3. Светодиоды мигают по сигналам от таймера A
  4. *)
  5. MODULE TimerA;
  6. IMPORT SYSTEM, MSP430;
  7. CONST
  8. REDLED = {0};
  9. GREENLED = {6};
  10. (* регистры порта P1 *)
  11. P1OUT = 21H;
  12. P1DIR = 22H;
  13. (* регистры таймера A *)
  14. TACTL = 0160H;
  15. (* биты регистра TACTL *)
  16. TAIFG = {0};
  17. TAIE = {1};
  18. TACLR = {2};
  19. MC0 = {4};
  20. MC1 = {5};
  21. ID0 = {6};
  22. ID1 = {7};
  23. TASSEL0 = {8};
  24. TASSEL1 = {9};
  25. TAR = 0170H;
  26. TACCTL0 = 0162H;
  27. (* биты регистра TACCTL0 *)
  28. CCIE = {4};
  29. CAP = {8};
  30. TACCR0 = 0172H;
  31. PROCEDURE set_bits (mem: INTEGER; bits: SET);
  32. VAR
  33. b: BYTE;
  34. BEGIN
  35. SYSTEM.GET(mem, b);
  36. SYSTEM.PUT8(mem, BITS(b) + bits)
  37. END set_bits;
  38. PROCEDURE clr_bits (mem: INTEGER; bits: SET);
  39. VAR
  40. b: BYTE;
  41. BEGIN
  42. SYSTEM.GET(mem, b);
  43. SYSTEM.PUT8(mem, BITS(b) - bits)
  44. END clr_bits;
  45. PROCEDURE inv_bits (mem: INTEGER; bits: SET);
  46. VAR
  47. b: BYTE;
  48. BEGIN
  49. SYSTEM.GET(mem, b);
  50. SYSTEM.PUT8(mem, BITS(b) / bits)
  51. END inv_bits;
  52. (* обработчик прерываний *)
  53. PROCEDURE int (priority: INTEGER; interrupt: MSP430.TInterrupt);
  54. VAR
  55. x: SET;
  56. BEGIN
  57. IF priority = 24 THEN (* прерывание от таймера A *)
  58. SYSTEM.GET(TACTL, x); (* взять регистр TACTL *)
  59. IF TAIFG * x = TAIFG THEN (* прерывание было *)
  60. SYSTEM.PUT(TACTL, x - TAIFG); (* сбросить флаг прерывания и обновить регистр TACTL *)
  61. inv_bits(P1OUT, REDLED); (* изменить состояние светодиода *)
  62. inv_bits(P1OUT, GREENLED); (* изменить состояние светодиода *)
  63. END
  64. END
  65. END int;
  66. PROCEDURE main;
  67. BEGIN
  68. (* инициализация регистра P1DIR *)
  69. SYSTEM.PUT8(P1DIR, REDLED + GREENLED);
  70. (* начальное состояние светодиодов *)
  71. set_bits(P1OUT, GREENLED); (* включен *)
  72. clr_bits(P1OUT, REDLED); (* выключен *)
  73. MSP430.SetIntProc(int); (* назначить обработчик прерываний *)
  74. MSP430.EInt; (* разрешить прерывания *)
  75. (* инициализация регистров таймера A *)
  76. SYSTEM.PUT(TAR, 0);
  77. SYSTEM.PUT(TACCTL0, CCIE + CAP);
  78. SYSTEM.PUT(TACCR0, 0FFFFH);
  79. SYSTEM.PUT(TACTL, TAIE + MC0 + MC1 + TASSEL1 + ID0 + ID1)
  80. END main;
  81. BEGIN
  82. main
  83. END TimerA.