| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- (*
- Пример для 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 (* прерывание было *)
- SYSTEM.PUT(TACTL, x - TAIFG); (* сбросить флаг прерывания и обновить регистр TACTL *)
- inv_bits(P1OUT, REDLED); (* изменить состояние светодиода *)
- inv_bits(P1OUT, GREENLED); (* изменить состояние светодиода *)
- 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, 0FFFFH);
- SYSTEM.PUT(TACTL, TAIE + MC0 + MC1 + TASSEL1 + ID0 + ID1)
- END main;
- BEGIN
- main
- END TimerA.
|