Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
8097 maxcodehac 1
(*
2
 
3
Пример для LaunchPad MSP-EXP430G2 Rev1.5
4
 
5
  При нажатии на кнопку P1.3, инкрементируется
6
  переменная-счетчик перезапусков и программа
7
  перезапускается.
8
  В зависимости от четности счетчика перезапусков,
9
  включается зеленый или красный светодиод.
10
 
11
*)
12
 
13
MODULE Restart;
14
 
15
IMPORT SYSTEM, MSP430;
16
 
17
 
18
CONST
19
 
20
    REDLED   = {0};
21
    GREENLED = {6};
22
    BUTTON   = {3};
23
 
24
    (* регистры порта P1 *)
25
    P1OUT = 21H;
26
    P1DIR = 22H;
27
    P1IFG = 23H;
28
    P1IE  = 25H;
29
    P1REN = 27H;
30
 
31
 
32
VAR
33
 
34
    count: INTEGER; (* счетчик перезапусков *)
35
 
36
 
37
PROCEDURE set_bits (mem: INTEGER; bits: SET);
38
VAR
39
    b: BYTE;
40
 
41
BEGIN
42
    SYSTEM.GET(mem, b);
43
    SYSTEM.PUT8(mem, BITS(b) + bits)
44
END set_bits;
45
 
46
 
47
PROCEDURE clr_bits (mem: INTEGER; bits: SET);
48
VAR
49
    b: BYTE;
50
 
51
BEGIN
52
    SYSTEM.GET(mem, b);
53
    SYSTEM.PUT8(mem, BITS(b) - bits)
54
END clr_bits;
55
 
56
 
57
PROCEDURE test_bits (mem: INTEGER; bits: SET): SET;
58
VAR
59
    b: BYTE;
60
 
61
BEGIN
62
    SYSTEM.GET(mem, b)
63
    RETURN bits * BITS(b)
64
END test_bits;
65
 
66
 
67
(* обработчик прерываний *)
68
PROCEDURE int (priority: INTEGER; interrupt: MSP430.TInterrupt);
69
BEGIN
70
    IF priority = 18 THEN                          (* прерывание от порта P1 *)
71
        IF test_bits(P1IFG, BUTTON) = BUTTON THEN  (* нажата кнопка *)
72
            INC(count);                            (* увеличить счетчик *)
73
            MSP430.Delay(500);                     (* задержка для отпускания кнопки *)
74
            clr_bits(P1IFG, BUTTON);               (* сбросить флаг прерывания *)
75
            MSP430.Restart                         (* перезапустить программу *)
76
        END
77
    END
78
END int;
79
 
80
 
81
PROCEDURE main;
82
BEGIN
83
    (* инициализация регистров порта P1 *)
84
    SYSTEM.PUT8(P1DIR, REDLED + GREENLED);  (* выход *)
85
    set_bits(P1REN, BUTTON);                (* включить подтягивающий резистор *)
86
    set_bits(P1OUT, BUTTON);                (* подтяжка к питанию *)
87
    set_bits(P1IE,  BUTTON);                (* разрешить прерывания от кнопки *)
88
 
89
    (* выключить светодиоды *)
90
    clr_bits(P1OUT, REDLED + GREENLED);
91
 
92
    MSP430.SetIntProc(int);  (* назначить обработчик прерываний *)
93
    MSP430.EInt;             (* разрешить прерывания *)
94
 
95
    IF ODD(count) THEN
96
        set_bits(P1OUT, GREENLED) (* нечетное - вкл. зеленый *)
97
    ELSE
98
        set_bits(P1OUT, REDLED)   (* четное - вкл. красный *)
99
    END
100
 
101
END main;
102
 
103
 
104
BEGIN
105
    main
106
END Restart.