| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- (*
- Пример для LaunchPad MSP-EXP430G2 Rev1.5
- Зеленый светодиод мигает по сигналам от таймера A,
- красный - по сигналам от сторожевого таймера в интервальном режиме
- *)
- MODULE TwoTimers;
- IMPORT SYSTEM, MSP430;
- CONST
- REDLED = {0};
- GREENLED = {6};
- (* регистры порта P1 *)
- P1OUT = 21H;
- P1DIR = 22H;
- (* регистр разрешения прерываний 1 *)
- IE1 = 00H;
- (* биты регистра IE1 *)
- WDTIE = {0};
- NMIIE = {4};
- (* регистр флагов прерываний 1 *)
- IFG1 = 02H;
- (* биты регистра IFG1 *)
- WDTIFG = {0};
- NMIIFG = {4};
- WDTCTL = 0120H; (* регистр сторожевого таймера *)
- (* биты регистра WDTCTL *)
- WDTIS0 = {0};
- WDTIS1 = {1};
- WDTSSEL = {2};
- WDTCNTCL = {3};
- WDTTMSEL = {4};
- WDTNMI = {5};
- WDTNMIES = {6};
- WDTHOLD = {7};
- WDTPW = {9, 11, 12, 14}; (* ключ защиты *)
- (* регистры таймера A *)
- TACTL = 0160H;
- (* биты регистра TACTL *)
- TAIFG = {0};
- TAIE = {1};
- TACLR = {2};
- MC0 = {4};
- MC1 = {5};
- ID0 = {6};
- ID1 = {7};
- TASSEL0 = {8};
- TASSEL1 = {9};
- TAR = 0170H;
- TACCTL0 = 0162H;
- (* биты регистра TACCTL0 *)
- CCIE = {4};
- CAP = {8};
- TACCR0 = 0172H;
- PROCEDURE set_bits (mem: INTEGER; bits: SET);
- VAR
- b: BYTE;
- BEGIN
- SYSTEM.GET(mem, b);
- SYSTEM.PUT8(mem, BITS(b) + bits)
- END set_bits;
- PROCEDURE inv_bits (mem: INTEGER; bits: SET);
- VAR
- b: BYTE;
- BEGIN
- SYSTEM.GET(mem, b);
- SYSTEM.PUT8(mem, BITS(b) / bits)
- END inv_bits;
- (* обработчик прерываний *)
- PROCEDURE int (priority: INTEGER; interrupt: MSP430.TInterrupt);
- VAR
- x: SET;
- BEGIN
- IF priority = 26 THEN (* прерывание от сторожевого таймера *)
- inv_bits(P1OUT, REDLED) (* изменить состояние светодиода *)
- ELSIF priority = 24 THEN (* прерывание от таймера A *)
- SYSTEM.GET(TACTL, x); (* взять регистр TACTL *)
- IF TAIFG * x = TAIFG THEN (* прерывание было *)
- SYSTEM.PUT(TACTL, x - TAIFG); (* сбросить флаг прерывания и обновить регистр TACTL *)
- inv_bits(P1OUT, GREENLED); (* изменить состояние светодиода *)
- END
- END
- END int;
- PROCEDURE main;
- BEGIN
- (* инициализация регистра P1DIR *)
- set_bits(P1DIR, REDLED + GREENLED);
- (* начальное состояние светодиодов - включены *)
- set_bits(P1OUT, REDLED + GREENLED);
- MSP430.SetIntProc(int); (* назначить обработчик прерываний *)
- MSP430.EInt; (* разрешить прерывания *)
- (* инициализация регистров таймера A *)
- SYSTEM.PUT(TAR, 0);
- SYSTEM.PUT(TACCTL0, CCIE + CAP);
- SYSTEM.PUT(TACCR0, 0FFFFH);
- SYSTEM.PUT(TACTL, TAIE + MC0 + MC1 + TASSEL1 + ID0 + ID1);
- (* инициализация регистров сторожевого таймера *)
- set_bits(IE1, WDTIE);
- SYSTEM.PUT(WDTCTL, WDTPW + WDTIS1 + WDTSSEL + WDTCNTCL + WDTTMSEL)
- END main;
- BEGIN
- main
- END TwoTimers.
|