(* Пример для LaunchPad MSP-EXP430G2 Rev1.5 Светодиоды мигают по сигналам от таймера A *) MODULE TimerA; IMPORT SYSTEM, MSP430; CONST REDLED = {0}; GREENLED = {6}; (* регистры порта P1 *) P1OUT = 21H; P1DIR = 22H; (* регистры таймера 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 clr_bits (mem: INTEGER; bits: SET); VAR b: BYTE; BEGIN SYSTEM.GET(mem, b); SYSTEM.PUT8(mem, BITS(b) - bits) END clr_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 = 24 THEN (* прерывание от таймера A *) SYSTEM.GET(TACTL, x); (* взять регистр TACTL *) IF TAIFG * x = TAIFG THEN (* прерывание было *) inv_bits(P1OUT, REDLED); (* изменить состояние светодиода *) inv_bits(P1OUT, GREENLED); (* изменить состояние светодиода *) SYSTEM.PUT(TACTL, x - TAIFG) (* сбросить флаг прерывания и обновить регистр TACTL *) END END END int; PROCEDURE main; BEGIN (* инициализация регистра P1DIR *) SYSTEM.PUT8(P1DIR, REDLED + GREENLED); (* начальное состояние светодиодов *) set_bits(P1OUT, GREENLED); (* включен *) clr_bits(P1OUT, REDLED); (* выключен *) MSP430.SetIntProc(int); (* назначить обработчик прерываний *) MSP430.EInt; (* разрешить прерывания *) (* инициализация регистров таймера A *) SYSTEM.PUT(TAR, 0); SYSTEM.PUT(TACCTL0, CCIE + CAP); SYSTEM.PUT(TACCR0, 1000); SYSTEM.PUT(TACTL, TAIE + MC0 + TASSEL0) END main; BEGIN main END TimerA.