(* Пример для 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 (* прерывание было *) inv_bits(P1OUT, GREENLED); (* изменить состояние светодиода *) SYSTEM.PUT(TACTL, x - TAIFG) (* сбросить флаг прерывания и обновить регистр TACTL *) 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, 1500); SYSTEM.PUT(TACTL, TAIE + MC0 + TASSEL0); (* инициализация регистров сторожевого таймера *) set_bits(IE1, WDTIE); SYSTEM.PUT(WDTCTL, WDTPW + WDTIS1 + WDTSSEL + WDTCNTCL + WDTTMSEL) END main; BEGIN main END TwoTimers.