1
|
; Define name of registers:
|
2
|
.alias flag_warmup 2
|
3
|
.alias flag1 3
|
4
|
.alias flag2 4
|
5
|
.alias flag3 5
|
6
|
.include "HDL50001_pcf.inc"
|
7
|
|
8
|
; TIM0 служит для организации фазового сдвига между TIM1-TIM3
|
9
|
; TIM0 не нужен после установки таймеров TIM1-TIM3, но здесь он не выключен.
|
10
|
.text
|
11
|
|
12
|
start:
|
13
|
jmp systimer
|
14
|
complete
|
15
|
|
16
|
;;;;; Processing systimer ;;;;;
|
17
|
systimer:
|
18
|
jmp initSysTimer
|
19
|
setl #IHOOKADDR,P1
|
20
|
setl #flag_warmup, 3 ; flag_warmup=3 - зажигаем TIM3
|
21
|
; flag_warmup=2 - зажигаем TIM2
|
22
|
; flag_warmup=1 - зажигаем TIM1
|
23
|
; flag_warmup=0 - обрабатываем прерывания от TIM1-TIM3
|
24
|
setl #flag1, 0 ; первый полумост в нижнем положении
|
25
|
setl #flag2, 0 ; второй ...
|
26
|
setl #flag3, 0 ; третий ...
|
27
|
complete
|
28
|
|
29
|
;Interrupt handler
|
30
|
P1:
|
31
|
getl #STCR
|
32
|
and @1, 0xFFFFFFFB
|
33
|
setl #STCR, @1
|
34
|
getl 0x00000010 ; если есть прерывание TIM0, то 4й бит будет равен 1
|
35
|
rdl TIM0_CR ;
|
36
|
and @1, @2 ; read only bit 4
|
37
|
je @1, CheckTIM1 ; проверяем остальные прерывания
|
38
|
jne @2, CheckWarmUp
|
39
|
complete
|
40
|
|
41
|
CheckWarmUp:
|
42
|
rdl TIM0_CR ; сбросим TIM0 прерывание, небольшой трюк:
|
43
|
wrl @1, TIM0_CR ; при записи "1" в 4й бит, этот бит сбросится
|
44
|
getl #flag_warmup
|
45
|
je @1, CheckTIM1 ; обрабатываем прерывания TIM1-TIM3
|
46
|
jne @2, BeginSetupTimers; #flag_warmup не нулевой, установим периоды T1-T3, обработка прерывания TIM0
|
47
|
complete
|
48
|
|
49
|
BeginSetupTimers:
|
50
|
jmp Port3Out
|
51
|
getl #flag_warmup
|
52
|
subl @1, 1
|
53
|
setl #flag_warmup, @1
|
54
|
complete
|
55
|
|
56
|
CheckTIM1: ; TIM0 прерывание уже очищено
|
57
|
getl 0x00000010
|
58
|
rdl TIM1_CR ;
|
59
|
and @1, @2 ; read only bit 4
|
60
|
je @1, CheckTIM2
|
61
|
jne @2, Port11Out ;есть прерывание TIM1
|
62
|
complete
|
63
|
|
64
|
CheckTIM2: ; TIM0 прерывание уже очищено
|
65
|
getl 0x00000010
|
66
|
rdl TIM2_CR ;
|
67
|
and @1, @2 ; read only bit 4
|
68
|
je @1, CheckTIM3
|
69
|
jne @2, Port21Out ;есть прерывание TIM2
|
70
|
complete
|
71
|
|
72
|
CheckTIM3: ; TIM0 прерывание уже очищено
|
73
|
getl 0x00000010
|
74
|
rdl TIM3_CR ;
|
75
|
and @1, @2 ; read only bit 4
|
76
|
je @1, FinalCleanIRQ
|
77
|
jne @2, Port31Out ;есть прерывание TIM3
|
78
|
complete
|
79
|
|
80
|
FinalCleanIRQ:
|
81
|
jmp MainLoop
|
82
|
setl #PSW, 1
|
83
|
complete
|
84
|
|
85
|
;; Set counter period and allow interrupt from systimer
|
86
|
initSysTimer:
|
87
|
jmp StartTimer0
|
88
|
getl 0x0000FFFF
|
89
|
setl #STVALR, @1
|
90
|
getl 0x00000002
|
91
|
setl #MSKR, @1
|
92
|
getl 0x00000003
|
93
|
setl #STCR, @1
|
94
|
|
95
|
getl 0x0000FFFF
|
96
|
wrl @1, TIM0_CNT ;warmup
|
97
|
; getl 0x0000027C
|
98
|
getl 0x000001A8 ; =2/3*0x0000027C
|
99
|
wrl @1, TIM0_PSC ;(10Hz) FFFF*7A*Tsys=0.1 sec. => 65535*122*Tsys = 0.1 => Tsys= 1.5*10^{-7} sec.
|
100
|
; 3 timers for motor
|
101
|
getl 0x0000FFFF
|
102
|
wrl @1, TIM1_CNT
|
103
|
getl 0x00000FFF
|
104
|
; wrl @1, TIM1_PSC ; здесь не стал устанавливать предделитель для TIM1.
|
105
|
getl 0x0000FFFF
|
106
|
wrl @1, TIM2_CNT
|
107
|
getl 0x00000FFF
|
108
|
; wrl @1, TIM2_PSC
|
109
|
getl 0x0000FFFF
|
110
|
wrl @1, TIM3_CNT
|
111
|
getl 0x00000FFF
|
112
|
; wrl @1, TIM3_PSC
|
113
|
complete
|
114
|
|
115
|
StartTimer0:
|
116
|
jmp MainLoop
|
117
|
setl #PSW, 1
|
118
|
getl 0x0000001F ;clear bit 4 by write "1"
|
119
|
wrl @1, TIM0_CR
|
120
|
getl 0x0000001F ;clear bit 4 by write "1"
|
121
|
wrl @1, TIM1_CR
|
122
|
getl 0x0000001F ;clear bit 4 by write "1"
|
123
|
wrl @1, TIM2_CR
|
124
|
getl 0x0000001F ;clear bit 4 by write "1"
|
125
|
wrl @1, TIM3_CR
|
126
|
complete
|
127
|
|
128
|
;;Start counter, use periodic mode
|
129
|
MainLoop:
|
130
|
jmp MainLoop
|
131
|
complete
|
132
|
|
133
|
Port3Out: ; установим длительность импульса TIM3, обработка прерывания TIM0
|
134
|
getl #flag_warmup
|
135
|
subl @1, 2
|
136
|
je @1, Switch3On ; #flag_warmup был равен 3
|
137
|
jne @2, Port2Out
|
138
|
complete
|
139
|
|
140
|
Switch3On: ; установим длительность импульса TIM3, обработка прерывания TIM0
|
141
|
setl #PSW, 1
|
142
|
jmp MainLoop; #IRETADDR ;? Других прерываний нет?
|
143
|
getl 0x0000027C
|
144
|
wrl @1, TIM3_PSC ;(10Hz) FFFF*7A*Tsys=0.1 sec. => 65535*122*Tsys = 0.1 => Tsys= 1.5*10^{-7} sec.
|
145
|
complete
|
146
|
|
147
|
Port2Out: ; установим длительность импульса TIM2, обработка прерывания TIM0
|
148
|
getl #flag_warmup ;2
|
149
|
subl @1, 1
|
150
|
je @1, Switch2On ; #flag_warmup был равен 2
|
151
|
jne @2, Port1Out
|
152
|
complete
|
153
|
|
154
|
Switch2On: ; установим длительность импульса TIM2, обработка прерывания TIM0
|
155
|
setl #PSW, 1
|
156
|
jmp MainLoop; #IRETADDR ;? Других прерываний нет?
|
157
|
getl 0x0000027C
|
158
|
wrl @1, TIM2_PSC ;(10Hz) FFFF*7A*Tsys=0.1 sec. => 65535*122*Tsys = 0.1 => Tsys= 1.5*10^{-7} sec.
|
159
|
complete
|
160
|
|
161
|
Port1Out: ; установим длительность импульса TIM1, обработка прерывания TIM0
|
162
|
getl #flag_warmup ;1
|
163
|
; subl @1, 1
|
164
|
je @1, Switch1On ; #flag_warmup был равен 1
|
165
|
jne @2, CheckTIM1; уходим на проверку TIM1-TIM3 прерываний
|
166
|
complete
|
167
|
|
168
|
Switch1On: ; установим длительность импульса TIM1, обработка прерывания TIM0
|
169
|
setl #PSW, 1
|
170
|
jmp MainLoop; #IRETADDR ;? Других прерываний нет?
|
171
|
getl 0x0000027C
|
172
|
wrl @1, TIM1_PSC ;(10Hz) FFFF*7A*Tsys=0.1 sec. => 65535*122*Tsys = 0.1 => Tsys= 1.5*10^{-7} sec.
|
173
|
complete
|
174
|
|
175
|
; ===================
|
176
|
Port11Out:
|
177
|
rdl TIM1_CR
|
178
|
wrl @1, TIM1_CR ; сбрасываем прерывание TIM1
|
179
|
getl #flag1
|
180
|
je @1, disable1
|
181
|
jne @2, enable1
|
182
|
complete
|
183
|
|
184
|
Port21Out:
|
185
|
rdl TIM2_CR
|
186
|
wrl @1, TIM2_CR ; сбрасываем прерывание TIM2
|
187
|
getl #flag2
|
188
|
je @1, disable2
|
189
|
jne @2, enable2
|
190
|
complete
|
191
|
|
192
|
Port31Out:
|
193
|
rdl TIM3_CR
|
194
|
wrl @1, TIM3_CR ; сбрасываем прерывание TIM3
|
195
|
getl #flag3
|
196
|
je @1, disable3
|
197
|
jne @2, enable3
|
198
|
complete
|
199
|
|
200
|
; disable led 1
|
201
|
disable1:
|
202
|
jmp CheckTIM2
|
203
|
getl 0x60000000
|
204
|
wrl @1, GPIOB_DIR
|
205
|
rdl GPIOB_OUT
|
206
|
getl 0xB0000000
|
207
|
and @1, @2
|
208
|
wrl @1, GPIOB_OUT ;set PortB 29,30 pin
|
209
|
setl #flag1, 1
|
210
|
complete
|
211
|
|
212
|
; enable led 1
|
213
|
enable1:
|
214
|
jmp CheckTIM2
|
215
|
getl 0x60000000
|
216
|
wrl @1, GPIOB_DIR
|
217
|
rdl GPIOB_OUT
|
218
|
getl 0x40000000
|
219
|
or @1, @2
|
220
|
wrl @1, GPIOB_OUT
|
221
|
setl #flag1, 0
|
222
|
complete
|
223
|
|
224
|
; disable led 2
|
225
|
disable2:
|
226
|
jmp CheckTIM3
|
227
|
getl 0x60000000
|
228
|
wrl @1, GPIOB_DIR
|
229
|
rdl GPIOB_OUT
|
230
|
getl 0xD0000000
|
231
|
and @1, @2
|
232
|
wrl @1, GPIOB_OUT ;set PortB 29,30 pin
|
233
|
setl #flag2, 1
|
234
|
complete
|
235
|
|
236
|
; enable led 2
|
237
|
enable2:
|
238
|
jmp CheckTIM3
|
239
|
getl 0x60000000
|
240
|
wrl @1, GPIOB_DIR
|
241
|
rdl GPIOB_OUT
|
242
|
getl 0x20000000
|
243
|
or @1, @2
|
244
|
wrl @1, GPIOB_OUT
|
245
|
setl #flag2, 0
|
246
|
complete
|
247
|
|
248
|
; disable led 3
|
249
|
disable3:
|
250
|
setl #PSW, 1
|
251
|
jmp #IRETADDR
|
252
|
; getl 0x60000000
|
253
|
; wrl @1, GPIOB_DIR
|
254
|
; rdl GPIOB_OUT
|
255
|
; getl 0xD0000000
|
256
|
; and @1, @2
|
257
|
; wrl @1, GPIOB_OUT ;set PortB 29,30 pin
|
258
|
; setl #flag3, 1
|
259
|
complete
|
260
|
|
261
|
; enable led 3
|
262
|
enable3:
|
263
|
setl #PSW, 1
|
264
|
jmp #IRETADDR
|
265
|
; getl 0x60000000
|
266
|
; wrl @1, GPIOB_DIR
|
267
|
; rdl GPIOB_OUT
|
268
|
; getl 0x20000000
|
269
|
; or @1, @2
|
270
|
; wrl @1, GPIOB_OUT
|
271
|
; setl #flag3, 0
|
272
|
complete
|
273
|
|