forked from KolibriOS/kolibrios
144 lines
3.6 KiB
Plaintext
144 lines
3.6 KiB
Plaintext
|
(*
|
||
|
|
||
|
Пример для 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.
|