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
  Светодиоды мигают по сигналам от таймера A
6
 
7
*)
8
 
9
MODULE TimerA;
10
 
11
IMPORT SYSTEM, MSP430;
12
 
13
 
14
CONST
15
 
16
    REDLED   = {0};
17
    GREENLED = {6};
18
 
19
    (* регистры порта P1 *)
20
    P1OUT = 21H;
21
    P1DIR = 22H;
22
 
23
 
24
    (* регистры таймера A *)
25
    TACTL = 0160H;
26
 
27
        (* биты регистра TACTL *)
28
        TAIFG   = {0};
29
        TAIE    = {1};
30
        TACLR   = {2};
31
        MC0     = {4};
32
        MC1     = {5};
33
        ID0     = {6};
34
        ID1     = {7};
35
        TASSEL0 = {8};
36
        TASSEL1 = {9};
37
 
38
    TAR = 0170H;
39
 
40
    TACCTL0 = 0162H;
41
 
42
        (* биты регистра TACCTL0 *)
43
        CCIE = {4};
44
        CAP  = {8};
45
 
46
    TACCR0 = 0172H;
47
 
48
 
49
PROCEDURE set_bits (mem: INTEGER; bits: SET);
50
VAR
51
    b: BYTE;
52
 
53
BEGIN
54
    SYSTEM.GET(mem, b);
55
    SYSTEM.PUT8(mem, BITS(b) + bits)
56
END set_bits;
57
 
58
 
59
PROCEDURE clr_bits (mem: INTEGER; bits: SET);
60
VAR
61
    b: BYTE;
62
 
63
BEGIN
64
    SYSTEM.GET(mem, b);
65
    SYSTEM.PUT8(mem, BITS(b) - bits)
66
END clr_bits;
67
 
68
 
69
PROCEDURE inv_bits (mem: INTEGER; bits: SET);
70
VAR
71
    b: BYTE;
72
 
73
BEGIN
74
    SYSTEM.GET(mem, b);
75
    SYSTEM.PUT8(mem, BITS(b) / bits)
76
END inv_bits;
77
 
78
 
79
(* обработчик прерываний *)
80
PROCEDURE int (priority: INTEGER; interrupt: MSP430.TInterrupt);
81
VAR
82
    x: SET;
83
 
84
BEGIN
85
    IF priority = 24 THEN                 (* прерывание от таймера A *)
86
        SYSTEM.GET(TACTL, x);             (* взять регистр TACTL *)
87
        IF TAIFG * x = TAIFG THEN         (* прерывание было *)
88
            inv_bits(P1OUT, REDLED);      (* изменить состояние светодиода *)
89
            inv_bits(P1OUT, GREENLED);    (* изменить состояние светодиода *)
90
            SYSTEM.PUT(TACTL, x - TAIFG)  (* сбросить флаг прерывания и обновить регистр TACTL *)
91
        END
92
    END
93
END int;
94
 
95
 
96
PROCEDURE main;
97
BEGIN
98
    (* инициализация регистра P1DIR *)
99
    SYSTEM.PUT8(P1DIR, REDLED + GREENLED);
100
 
101
    (* начальное состояние светодиодов *)
102
    set_bits(P1OUT, GREENLED); (* включен *)
103
    clr_bits(P1OUT, REDLED);   (* выключен *)
104
 
105
    MSP430.SetIntProc(int);  (* назначить обработчик прерываний *)
106
    MSP430.EInt;             (* разрешить прерывания *)
107
 
108
    (* инициализация регистров таймера A *)
109
    SYSTEM.PUT(TAR, 0);
110
    SYSTEM.PUT(TACCTL0, CCIE + CAP);
111
    SYSTEM.PUT(TACCR0, 1000);
112
    SYSTEM.PUT(TACTL, TAIE + MC0 + TASSEL0)
113
END main;
114
 
115
 
116
BEGIN
117
    main
118
END TimerA.