Skip to content

Commit b6c76f7

Browse files
committed
fix millis and micros for 16M clk
1 parent efdbe55 commit b6c76f7

File tree

2 files changed

+212
-31
lines changed

2 files changed

+212
-31
lines changed

ch55xduino/ch55x/boards.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ ch552.upload.protocol=ch55x2_3_1
1111
#CH552 has 16K flash, but 2K is for bootloader, 14K usable
1212
ch552.upload.maximum_size=14336
1313
ch552.build.mcu=mcs51
14-
ch552.menu.clock.24internal=24 MHz (internal)
14+
ch552.menu.clock.24internal=24 MHz (internal), 5V
1515
ch552.menu.clock.24internal.build.f_cpu=24000000L
16-
ch552.menu.clock.16external=16 MHz (internal)
16+
ch552.menu.clock.16external=16 MHz (internal), 3.3V or 5V
1717
ch552.menu.clock.16external.build.f_cpu=16000000L
1818
ch552.build.board=ch55x
1919
ch552.build.core=ch55xduino
@@ -58,9 +58,9 @@ ch551.upload.protocol=ch55x2_3_1
5858
#CH551 has 10K flash
5959
ch551.upload.maximum_size=10240
6060
ch551.build.mcu=mcs51
61-
ch551.menu.clock.24internal=24 MHz (internal)
61+
ch551.menu.clock.24internal=24 MHz (internal), 5V
6262
ch551.menu.clock.24internal.build.f_cpu=24000000L
63-
ch551.menu.clock.16external=16 MHz (internal)
63+
ch551.menu.clock.16external=16 MHz (internal), 3.3V or 5V
6464
ch551.menu.clock.16external.build.f_cpu=16000000L
6565
ch551.build.board=ch55x
6666
ch551.build.core=ch55xduino

ch55xduino/ch55x/cores/ch55xduino/wiring.c

Lines changed: 208 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,26 +11,18 @@ extern __idata volatile uint8_t timer0_overflow_count_5th_byte;
1111

1212
uint32_t micros(){
1313
/*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;*/
3426

3527
__asm__ (";uint8_t interruptOn = EA; //to c \n"
3628
";clr and mov won't affect c \n"
@@ -64,17 +56,157 @@ uint32_t micros(){
6456
" cjne r2,#0,incTimer0_overf_cntCopyOver$ \n"
6557
" inc r3 \n"
6658
"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"
67129

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__ (
68199
";1m = 250t 1t=0.5us (m*250+t-6)/2 t is 6~255\n"
69200
";we need to return m*125+t-3 \n"
70201
";t=(t>>1)-3; \n"
71202
" mov a,r4 \n"
72203
" clr c \n"
73204
" rrc a \n"
74205
" 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?)
78210

79211
";m=m*125; \n"
80212
" mov b, #125 \n"
@@ -106,7 +238,7 @@ uint32_t micros(){
106238
" mul ab \n"
107239
" add a, r5 \n"
108240
" mov r3, a \n"
109-
241+
110242
";return m+t \n"
111243
" mov r5, #0 \n"
112244
" mov a, r4 \n"
@@ -120,9 +252,9 @@ uint32_t micros(){
120252
" mov b, a \n"
121253
" mov a, r3 \n"
122254
" addc a, r5 \n"
123-
255+
124256
);
125-
257+
#endif
126258
//return values: ’dpl’ 1B, ’dpl’ LSB & ’dph’ 2B,
127259
//’dpl’, ’dph’ and ’b’ 3B, ’dpl’,’dph’,’b’ & ’acc’ 4B
128260

@@ -150,7 +282,55 @@ uint32_t millis()
150282
" mov r4, (_timer0_overflow_count)+4 \n"
151283
";if (interruptOn) EA = 1; \n"
152284
" 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"
154334
";Or: return (timer0_overflow_count<<5)>>8 \n"
155335
";Or: return (timer0_overflow_count*32)>>8 \n"
156336
" mov b, #32 \n"
@@ -191,6 +371,7 @@ uint32_t millis()
191371
";calculation finished, a already in place \n"
192372
" mov b, r1 \n"
193373
);
374+
#endif
194375
}
195376

196377
void delay(uint32_t ms)

0 commit comments

Comments
 (0)