@@ -11,26 +11,18 @@ extern __idata volatile uint8_t timer0_overflow_count_5th_byte;
11
11
12
12
uint32_t micros (){
13
13
/*uint32_t m;
14
- uint8_t t;
15
- uint8_t interruptOn = EA;
16
- EA = 0;
17
-
18
- m = timer0_overflow_count;
19
- t = TL0;
20
-
21
- if ((TF0) && (t < 255)){
22
- m++;
23
- }
24
-
25
- if (interruptOn) EA = 1;
26
- //1m = 250t 1t=0.5us (m*250+t-6)/2
27
-
28
- t=(t>>1)-3;
29
- m=m*125;
30
-
31
- return ( m+t );*/
32
-
33
- //assembly has better support for multiplication
14
+ uint8_t t;
15
+ uint8_t interruptOn = EA;
16
+ EA = 0;
17
+
18
+ m = timer0_overflow_count;
19
+ t = TL0;
20
+
21
+ if ((TF0) && (t < 255)){
22
+ m++;
23
+ }
24
+
25
+ if (interruptOn) EA = 1;*/
34
26
35
27
__asm__ (";uint8_t interruptOn = EA; //to c \n"
36
28
";clr and mov won't affect c \n"
@@ -64,17 +56,157 @@ uint32_t micros(){
64
56
" cjne r2,#0,incTimer0_overf_cntCopyOver$ \n"
65
57
" inc r3 \n"
66
58
"incTimer0_overf_cntCopyOver$: \n"
59
+ );
60
+
61
+ #if F_CPU == 16000000
62
+ //1m = 250t 1t=0.75us (m*250+t-6)*3/2/2
63
+ //m in r0~r3
64
+ //t in r4
65
+ //t=((3*t)>>1)-9);
66
+ //m=(m*375)=m<<8+m*119;
67
+ //return (m+t)>>1
68
+
69
+
70
+ __asm__ (
71
+ ";1m = 250t 1t=0.5us (m*250+t-6)*3/2/2 t is 6~255\n"
72
+ ";we need to return (m<<8+m*119+((3*t)>>1)-9))>>1 \n"
73
+
74
+ ";m=m*119; \n"
75
+ " mov a, r0 \n"
76
+ " mov r6, a \n"
77
+ " mov a, r1 \n"
78
+ " mov r7, a \n"
79
+ " push ar3 \n"
80
+ " push ar2 \n"
81
+
82
+ " mov b, #119 \n"
83
+ " mov a, r0 \n"
84
+ " mul ab \n"
85
+ " mov r0, a \n"
86
+ " mov r5, b \n"
87
+
88
+ " mov b, #119 \n"
89
+ " mov a, r1 \n"
90
+ " mul ab \n"
91
+ " add a, r5 \n"
92
+ " mov r1, a \n"
93
+ " clr a \n"
94
+ " addc a, b \n"
95
+ " mov r5, a \n"
96
+
97
+ " mov b, #119 \n"
98
+ " mov a, r2 \n"
99
+ " mul ab \n"
100
+ " add a, r5 \n"
101
+ " mov r2, a \n"
102
+ " clr a \n"
103
+ " addc a, b \n"
104
+ " mov r5, a \n"
105
+
106
+ " mov b, #119 \n"
107
+ " mov a, r3 \n"
108
+ " mul ab \n"
109
+ " add a, r5 \n"
110
+ " mov r3, a \n"
111
+ " clr a \n"
112
+ " addc a, b \n"
113
+ " mov r5, a \n"
114
+
115
+ ";m=m+m<<8; \n"
116
+
117
+ " mov a, r6 \n"
118
+ " add a, r1 \n"
119
+ " mov r1, a \n"
120
+ " mov a, r7 \n"
121
+ " addc a, r2 \n"
122
+ " mov r2, a \n"
123
+ " pop a \n"
124
+ " addc a, r3 \n"
125
+ " mov r3, a \n"
126
+ " pop a \n"
127
+ " addc a, r5 \n"
128
+ " mov r5, a \n"
67
129
130
+ ";t=((3*t)>>1)); \n"
131
+
132
+ " mov b, #3 \n"
133
+ " mov a, r4 \n"
134
+ " mul ab \n"
135
+ " mov r4, a \n"
136
+ " mov a, b \n"
137
+ " clr c \n"
138
+ " rrc a \n"
139
+ " mov r6, a \n"
140
+ " mov a, r4 \n"
141
+ " rrc a \n"
142
+ " mov r4, a \n"
143
+ " ;sub r4:r6 by 9 \n"
144
+ // TODO: R4 may overflow, skip-9 for now (4.5us offset may not be an issue?)
145
+
146
+ ";get m+t \n"
147
+ " mov r7, #0 \n"
148
+ " mov a, r4 \n"
149
+ " add a, r0 \n"
150
+ " mov r0, a \n"
151
+ " mov a, r6 \n"
152
+ " addc a, r1 \n"
153
+ " mov r1, a \n"
154
+ " mov a, r7 \n"
155
+ " addc a, r2 \n"
156
+ " mov r2, a \n"
157
+ " mov a, r7 \n"
158
+ " addc a, r3 \n"
159
+ " mov r3, a \n"
160
+ " mov a, r7 \n"
161
+ " addc a, r5 \n"
162
+ " mov r5, a \n"
163
+
164
+ ";return m+t \n"
165
+ " clr c \n"
166
+ " mov a, r5 \n"
167
+ " rrc a \n"
168
+ " mov r5, a \n"
169
+ " mov a, r3 \n"
170
+ " rrc a \n"
171
+ " mov r3, a \n"
172
+ " mov a, r2 \n"
173
+ " rrc a \n"
174
+ " mov b, a \n"
175
+ " mov a, r1 \n"
176
+ " rrc a \n"
177
+ " mov dph, a \n"
178
+ " mov a, r0 \n"
179
+ " rrc a \n"
180
+ " mov dpl, a \n"
181
+ " mov a, r3 \n"
182
+
183
+ );
184
+ //’dpl’ (LSB),’dph’,’b’ & ’acc’
185
+ #else
186
+ //24M CLK
187
+
188
+ /*1m = 250t 1t=0.5us (m*250+t-6)/2
189
+
190
+ t=(t>>1)-3;
191
+ m=m*125;
192
+
193
+ return ( m+t );*/
194
+
195
+ //assembly has better support for multiplication
196
+
197
+
198
+ __asm__ (
68
199
";1m = 250t 1t=0.5us (m*250+t-6)/2 t is 6~255\n"
69
200
";we need to return m*125+t-3 \n"
70
201
";t=(t>>1)-3; \n"
71
202
" mov a,r4 \n"
72
203
" clr c \n"
73
204
" rrc a \n"
74
205
" mov r4,a \n"
75
- " dec r4 \n"
76
- " dec r4 \n"
77
- " dec r4 \n"
206
+ //" dec r4 \n"
207
+ //" dec r4 \n"
208
+ //" dec r4 \n"
209
+ // TODO: R4 may overflow, disable for now (3us offset may not be an issue?)
78
210
79
211
";m=m*125; \n"
80
212
" mov b, #125 \n"
@@ -106,7 +238,7 @@ uint32_t micros(){
106
238
" mul ab \n"
107
239
" add a, r5 \n"
108
240
" mov r3, a \n"
109
-
241
+
110
242
";return m+t \n"
111
243
" mov r5, #0 \n"
112
244
" mov a, r4 \n"
@@ -120,9 +252,9 @@ uint32_t micros(){
120
252
" mov b, a \n"
121
253
" mov a, r3 \n"
122
254
" addc a, r5 \n"
123
-
255
+
124
256
);
125
-
257
+ #endif
126
258
//return values: ’dpl’ 1B, ’dpl’ LSB & ’dph’ 2B,
127
259
//’dpl’, ’dph’ and ’b’ 3B, ’dpl’,’dph’,’b’ & ’acc’ 4B
128
260
@@ -150,7 +282,55 @@ uint32_t millis()
150
282
" mov r4, (_timer0_overflow_count)+4 \n"
151
283
";if (interruptOn) EA = 1; \n"
152
284
" mov _EA,c \n"
153
- ";return timer0_overflow_count>>3 \n"
285
+ );
286
+
287
+ #if F_CPU == 16000000
288
+ __asm__ (";return (timer0_overflow_count*48)>>8 \n"
289
+
290
+ " mov b, #48 \n"
291
+ " mov a, r0 \n"
292
+ " mul ab \n"
293
+ " mov r0, b \n"
294
+ ";lowest 8 bit not used (a), r0 free to use \n"
295
+ " mov b, #48 \n"
296
+ " mov a, r1 \n"
297
+ " mul ab \n"
298
+ " add a, r0 \n"
299
+ " mov r5, psw ;keep c \n"
300
+ " mov dpl, a \n"
301
+ " mov r0, b \n"
302
+
303
+ " mov b, #48 \n"
304
+ " mov a, r2 \n"
305
+ " mul ab \n"
306
+ " mov psw, r5 ;restore c \n"
307
+ " addc a, r0 \n"
308
+ " mov r5, psw ;keep c \n"
309
+ " mov dph, a \n"
310
+ " mov r0, b \n"
311
+
312
+ " mov b, #48 \n"
313
+ " mov a, r3 \n"
314
+ " mul ab \n"
315
+ " mov psw, r5 ;restore c \n"
316
+ " addc a, r0 \n"
317
+ " mov r5, psw ;keep c \n"
318
+ " mov r1, a \n"
319
+ " mov r0, b \n"
320
+
321
+ " mov b, #48 \n"
322
+ " mov a, r4 \n"
323
+ " mul ab \n"
324
+ " mov psw, r5 ;restore c \n"
325
+ " addc a, r0 \n"
326
+
327
+ ";calculation finished, a already in place \n"
328
+ " mov b, r1 \n"
329
+ );
330
+
331
+ #else
332
+ //24M CLK
333
+ __asm__ (";return timer0_overflow_count>>3 \n"
154
334
";Or: return (timer0_overflow_count<<5)>>8 \n"
155
335
";Or: return (timer0_overflow_count*32)>>8 \n"
156
336
" mov b, #32 \n"
@@ -191,6 +371,7 @@ uint32_t millis()
191
371
";calculation finished, a already in place \n"
192
372
" mov b, r1 \n"
193
373
);
374
+ #endif
194
375
}
195
376
196
377
void delay (uint32_t ms )
0 commit comments