Project

General

Profile

3timers_with_phase_shift.asm

trott, 11/07/2013 12:58 PM

 
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