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