MSP430: обновление примеров

This commit is contained in:
AntKrotov committed 2019-08-01 21:54:10 +03:00
1 parent 74b9292d1f
commit a09bf37b68
4 files changed
+118 -120

No files matched your search

+6 -6
View File
@@ -12,7 +12,7 @@ IMPORT SYSTEM;
CONST
REDLED = 0;
REDLED = {0};
P1OUT = 21H;
P1DIR = 22H;
@@ -22,24 +22,24 @@ VAR
n: INTEGER;
PROCEDURE inv_bit (mem, bit: INTEGER);
PROCEDURE inv_bits (mem: INTEGER; bits: SET);
VAR
b: BYTE;
BEGIN
SYSTEM.GET(mem, b);
SYSTEM.PUT8(mem, BITS(b) / {bit})
END inv_bit;
SYSTEM.PUT8(mem, BITS(b) / bits)
END inv_bits;
BEGIN
(* инициализация регистра P1DIR *)
SYSTEM.PUT8(P1DIR, {REDLED});
SYSTEM.PUT8(P1DIR, REDLED);
(* бесконечный цикл *)
WHILE TRUE DO
(* изменить состояние светодиода *)
inv_bit(P1OUT, REDLED);
inv_bits(P1OUT, REDLED);
(* задержка *)
n := 30000;
WHILE n > 0 DO DEC(n) END
@@ -7,16 +7,16 @@
*)
MODULE Example1;
MODULE Button;
IMPORT SYSTEM, RTL;
CONST
REDLED = 0;
GREENLED = 6;
BUTTON = 3;
REDLED = {0};
GREENLED = {6};
BUTTON = {3};
P1OUT = 21H;
P1DIR = 22H;
@@ -31,44 +31,44 @@ BEGIN
END delay;
PROCEDURE get_bit (mem, bit: INTEGER): BOOLEAN;
PROCEDURE get_bit (mem: INTEGER; bit: SET): BOOLEAN;
VAR
b: BYTE;
BEGIN
SYSTEM.GET(mem, b)
RETURN bit IN BITS(b)
RETURN bit * BITS(b) # {}
END get_bit;
PROCEDURE set_bit (mem, bit: INTEGER);
PROCEDURE set_bits (mem: INTEGER; bits: SET);
VAR
b: BYTE;
BEGIN
SYSTEM.GET(mem, b);
SYSTEM.PUT8(mem, BITS(b) + {bit})
END set_bit;
SYSTEM.PUT8(mem, BITS(b) + bits)
END set_bits;
PROCEDURE clr_bit (mem, bit: INTEGER);
PROCEDURE clr_bits (mem: INTEGER; bits: SET);
VAR
b: BYTE;
BEGIN
SYSTEM.GET(mem, b);
SYSTEM.PUT8(mem, BITS(b) - {bit})
END clr_bit;
SYSTEM.PUT8(mem, BITS(b) - bits)
END clr_bits;
PROCEDURE inv_bit (mem, bit: INTEGER);
PROCEDURE inv_bits (mem: INTEGER; bits: SET);
VAR
b: BYTE;
BEGIN
SYSTEM.GET(mem, b);
SYSTEM.PUT8(mem, BITS(b) / {bit})
END inv_bit;
SYSTEM.PUT8(mem, BITS(b) / bits)
END inv_bits;
(*
@@ -93,11 +93,11 @@ END inv_bit;
*)
PROCEDURE int (priority, ptr: INTEGER);
BEGIN
IF priority = 18 THEN (* прерывание от порта P1 *)
IF get_bit(P1IFG, BUTTON) THEN (* нажата кнопка *)
inv_bit(P1OUT, REDLED);
delay(30000);
clr_bit(P1IFG, BUTTON)
IF priority = 18 THEN (* прерывание от порта P1 *)
IF get_bit(P1IFG, BUTTON) THEN (* нажата кнопка *)
inv_bits(P1OUT, REDLED); (* изменить состояние светодиода *)
delay(30000); (* задержка для отпускания кнопки *)
clr_bits(P1IFG, BUTTON) (* сбросить флаг прерывания *)
END
END
END int;
@@ -106,21 +106,22 @@ END int;
PROCEDURE main;
BEGIN
(* инициализация спец. регистров *)
SYSTEM.PUT8(P1DIR, {REDLED, GREENLED});
set_bit(P1REN, BUTTON);
set_bit(P1OUT, BUTTON);
set_bit(P1IE, BUTTON);
SYSTEM.PUT8(P1DIR, REDLED + GREENLED);
set_bits(P1REN, BUTTON);
set_bits(P1OUT, BUTTON);
set_bits(P1IE, BUTTON);
RTL.SetInt(int); (* назначить обработчик прерываний *)
RTL.SetInt(int); (* назначить обработчик прерываний *)
SYSTEM.CODE(0D232H); (* BIS #8, SR; EINT; разрешить прерывания *)
(* бесконечный цикл *)
WHILE TRUE DO
inv_bit(P1OUT, GREENLED);
delay(30000)
inv_bits(P1OUT, GREENLED); (* изменить состояние светодиода *)
delay(30000) (* задержка *)
END
END main;
BEGIN
main
END Example1.
END Button.
@@ -6,15 +6,15 @@
*)
MODULE Example2;
MODULE TimerA;
IMPORT SYSTEM, RTL;
CONST
REDLED = 0;
GREENLED = 6;
REDLED = {0};
GREENLED = {6};
P1OUT = 21H;
P1DIR = 22H;
@@ -26,50 +26,49 @@ CONST
TACCR0 = 0172H;
(* биты регистра TACTL *)
TAIFG = 0;
TAIE = 1;
TACLR = 2;
MC0 = 4;
MC1 = 5;
ID0 = 6;
ID1 = 7;
TASSEL0 = 8;
TASSEL1 = 9;
TAIFG = {0};
TAIE = {1};
TACLR = {2};
MC0 = {4};
MC1 = {5};
ID0 = {6};
ID1 = {7};
TASSEL0 = {8};
TASSEL1 = {9};
(* биты регистра TACCTL0 *)
CCIE = 4;
CAP = 8;
CCIE = {4};
CAP = {8};
PROCEDURE set_bit (mem, bit: INTEGER);
PROCEDURE set_bits (mem: INTEGER; bits: SET);
VAR
b: BYTE;
BEGIN
SYSTEM.GET(mem, b);
SYSTEM.PUT8(mem, BITS(b) + {bit})
END set_bit;
SYSTEM.PUT8(mem, BITS(b) + bits)
END set_bits;
PROCEDURE clr_bit (mem, bit: INTEGER);
PROCEDURE clr_bits (mem: INTEGER; bits: SET);
VAR
b: BYTE;
BEGIN
SYSTEM.GET(mem, b);
SYSTEM.PUT8(mem, BITS(b) - {bit})
END clr_bit;
SYSTEM.PUT8(mem, BITS(b) - bits)
END clr_bits;
PROCEDURE inv_bit (mem, bit: INTEGER);
PROCEDURE inv_bits (mem: INTEGER; bits: SET);
VAR
b: BYTE;
BEGIN
SYSTEM.GET(mem, b);
SYSTEM.PUT8(mem, BITS(b) / {bit})
END inv_bit;
SYSTEM.PUT8(mem, BITS(b) / bits)
END inv_bits;
(*
обработчик прерываний
@@ -96,13 +95,12 @@ VAR
x: SET;
BEGIN
IF priority = 24 THEN (* прерывание от таймера A *)
SYSTEM.GET(TACTL, x);
IF TAIFG IN x THEN (* прерывание было *)
inv_bit(P1OUT, REDLED);
inv_bit(P1OUT, GREENLED);
(* сбросить флаг прерывания и обновить регистр TACTL *)
SYSTEM.PUT(TACTL, x - {TAIFG})
IF priority = 24 THEN (* прерывание от таймера A *)
SYSTEM.GET(TACTL, x); (* взять регистр TACTL *)
IF TAIFG * x # {} THEN (* прерывание было *)
inv_bits(P1OUT, REDLED); (* изменить состояние светодиода *)
inv_bits(P1OUT, GREENLED); (* изменить состояние светодиода *)
SYSTEM.PUT(TACTL, x - TAIFG) (* сбросить флаг прерывания и обновить регистр TACTL *)
END
END
END int;
@@ -111,23 +109,23 @@ END int;
PROCEDURE main;
BEGIN
(* инициализация регистра P1DIR *)
SYSTEM.PUT8(P1DIR, {REDLED, GREENLED});
SYSTEM.PUT8(P1DIR, REDLED + GREENLED);
(* начальное состояние светодиодов *)
set_bit(P1OUT, GREENLED);
clr_bit(P1OUT, REDLED);
set_bits(P1OUT, GREENLED); (* включен *)
clr_bits(P1OUT, REDLED); (* выключен *)
RTL.SetInt(int); (* назначить обработчик прерываний *)
SYSTEM.CODE(0D232H); (* BIS #8, SR; EINT; разрешить прерывания *)
(* инициализация регистров таймера A *)
SYSTEM.PUT(TAR, 0);
SYSTEM.PUT(TACCTL0, {CCIE, CAP});
SYSTEM.PUT(TACCTL0, CCIE + CAP);
SYSTEM.PUT(TACCR0, 1000);
SYSTEM.PUT(TACTL, {TAIE, MC0, TASSEL0})
SYSTEM.PUT(TACTL, TAIE + MC0 + TASSEL0)
END main;
BEGIN
main
END Example2.
END TimerA.
@@ -7,15 +7,15 @@
*)
MODULE Example3;
MODULE TwoTimers;
IMPORT SYSTEM, RTL;
CONST
REDLED = 0;
GREENLED = 6;
REDLED = {0};
GREENLED = {6};
P1OUT = 21H;
P1DIR = 22H;
@@ -26,25 +26,25 @@ CONST
IFG1 = 0002H;
(* биты регистра WDTCTL *)
WDTIS0 = 0;
WDTIS1 = 1;
WDTSSEL = 2;
WDTCNTCL = 3;
WDTTMSEL = 4;
WDTNMI = 5;
WDTNMIES = 6;
WDTHOLD = 7;
WDTIS0 = {0};
WDTIS1 = {1};
WDTSSEL = {2};
WDTCNTCL = {3};
WDTTMSEL = {4};
WDTNMI = {5};
WDTNMIES = {6};
WDTHOLD = {7};
(* биты регистра IE1 *)
WDTIE = 0;
NMIIE = 4;
WDTIE = {0};
NMIIE = {4};
(* биты регистра IFG1 *)
WDTIFG = 0;
NMIIFG = 4;
WDTIFG = {0};
NMIIFG = {4};
(* ключ защиты сторожевого таймера *)
WDTPW = 5A00H;
WDTPW = BITS(5A00H);
(* регистры таймера A *)
TACTL = 0160H;
@@ -53,39 +53,39 @@ CONST
TACCR0 = 0172H;
(* биты регистра TACTL *)
TAIFG = 0;
TAIE = 1;
TACLR = 2;
MC0 = 4;
MC1 = 5;
ID0 = 6;
ID1 = 7;
TASSEL0 = 8;
TASSEL1 = 9;
TAIFG = {0};
TAIE = {1};
TACLR = {2};
MC0 = {4};
MC1 = {5};
ID0 = {6};
ID1 = {7};
TASSEL0 = {8};
TASSEL1 = {9};
(* биты регистра TACCTL0 *)
CCIE = 4;
CAP = 8;
CCIE = {4};
CAP = {8};
PROCEDURE set_bit (mem, bit: INTEGER);
PROCEDURE set_bits (mem: INTEGER; bits: SET);
VAR
b: BYTE;
BEGIN
SYSTEM.GET(mem, b);
SYSTEM.PUT8(mem, BITS(b) + {bit})
END set_bit;
SYSTEM.PUT8(mem, BITS(b) + bits)
END set_bits;
PROCEDURE inv_bit (mem, bit: INTEGER);
PROCEDURE inv_bits (mem: INTEGER; bits: SET);
VAR
b: BYTE;
BEGIN
SYSTEM.GET(mem, b);
SYSTEM.PUT8(mem, BITS(b) / {bit})
END inv_bit;
SYSTEM.PUT8(mem, BITS(b) / bits)
END inv_bits;
(*
@@ -113,14 +113,13 @@ VAR
x: SET;
BEGIN
IF priority = 26 THEN (* прерывание от сторожевого таймера *)
inv_bit(P1OUT, REDLED)
ELSIF priority = 24 THEN (* прерывание от таймера A *)
SYSTEM.GET(TACTL, x);
IF TAIFG IN x THEN (* прерывание было *)
inv_bit(P1OUT, GREENLED);
(* сбросить флаг прерывания и обновить регистр TACTL *)
SYSTEM.PUT(TACTL, x - {TAIFG})
IF priority = 26 THEN (* прерывание от сторожевого таймера *)
inv_bits(P1OUT, REDLED) (* изменить состояние светодиода *)
ELSIF priority = 24 THEN (* прерывание от таймера A *)
SYSTEM.GET(TACTL, x); (* взять регистр TACTL *)
IF TAIFG * x # {} THEN (* прерывание было *)
inv_bits(P1OUT, GREENLED); (* изменить состояние светодиода *)
SYSTEM.PUT(TACTL, x - TAIFG) (* сбросить флаг прерывания и обновить регистр TACTL *)
END
END
END int;
@@ -129,27 +128,27 @@ END int;
PROCEDURE main;
BEGIN
(* инициализация регистра P1DIR *)
SYSTEM.PUT8(P1DIR, {REDLED, GREENLED});
SYSTEM.PUT8(P1DIR, REDLED + GREENLED);
(* начальное состояние светодиодов - включены *)
set_bit(P1OUT, GREENLED);
set_bit(P1OUT, REDLED);
set_bits(P1OUT, GREENLED);
set_bits(P1OUT, REDLED);
RTL.SetInt(int); (* назначить обработчик прерываний *)
SYSTEM.CODE(0D232H); (* BIS #8, SR; EINT; разрешить прерывания *)
(* инициализация регистров таймера A *)
SYSTEM.PUT(TAR, 0);
SYSTEM.PUT(TACCTL0, {CCIE, CAP});
SYSTEM.PUT(TACCTL0, CCIE + CAP);
SYSTEM.PUT(TACCR0, 1500);
SYSTEM.PUT(TACTL, {TAIE, MC0, TASSEL0});
SYSTEM.PUT(TACTL, TAIE + MC0 + TASSEL0);
(* инициализация регистров сторожевого таймера *)
set_bit(IE1, WDTIE);
SYSTEM.PUT(WDTCTL, WDTPW + ORD({WDTIS1, WDTSSEL, WDTCNTCL, WDTTMSEL}))
set_bits(IE1, WDTIE);
SYSTEM.PUT(WDTCTL, WDTPW + WDTIS1 + WDTSSEL + WDTCNTCL + WDTTMSEL)
END main;
BEGIN
main
END Example3.
END TwoTimers.