Project

General

Profile

io_led_3timers_for_warmup.asm

trott, 11/09/2013 03:09 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
.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