Skip to content

Commit ec4ca2e

Browse files
committed
improved delay() only needs t0 running
1 parent 1b8f3f6 commit ec4ca2e

File tree

1 file changed

+14
-33
lines changed

1 file changed

+14
-33
lines changed

src/delay.S

Lines changed: 14 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6,42 +6,23 @@
66
#include <avr/io.h>
77
#include "macros.inc"
88

9-
;struct {
10-
; uint32_t t0_ovfl;
11-
; uint8_t ovfl_pad;
12-
;} t0_millis;
13-
14-
15-
; to force t0_isr to get linked in
16-
.global t0_ovfl_isr
17-
18-
; read lower 16 bits of extended TCNT0 into r19:r18
19-
r18_t0cnt:
20-
in r18, TCNT0
21-
lds r19, t0_millis
22-
in r0, TCNT0
23-
sub r0, r18 ; TCNT0 overflow?
24-
brcs r18_t0cnt
25-
ret
26-
27-
; delay for r27:r24 (ulong) ms
9+
#define remain r19
10+
#define start r20
11+
#define current r21
12+
; delay for r26:r24 (u24) ms
2813
GLABEL delay_impl
29-
rcall r18_t0cnt
30-
movw r20, r18 ; r20 = start count
31-
rjmp decms
32-
dloop:
33-
rcall r18_t0cnt
34-
sub r18, r20 ; current - start
35-
sbc r19, r21
36-
subi r18, lo8(T0CNT_PER_MS) ; > 1ms?
37-
sbci r19, hi8(T0CNT_PER_MS)
38-
brcc dloop
39-
subi r20, lo8(-(T0CNT_PER_MS)) ; add 1ms to start
40-
sbci r21, hi8(-(T0CNT_PER_MS))
14+
in start, TCNT0
15+
ldi remain, lo8(T0CNT_PER_MS)
16+
wait1ms: ; check TCNT0 until 1ms has passed
17+
in current, TCNT0
18+
sub current, start
19+
add start, current ; advance start
20+
sub remain, current
21+
brcc wait1ms
22+
subi remain, lo8(-(T0CNT_PER_MS)) ; add 1ms
4123
decms: ; decrement ms argument
4224
sbiw r24, 1
4325
sbci r26, 0
44-
sbci r27, 0
45-
brcc dloop
26+
brne wait1ms
4627
ret
4728

0 commit comments

Comments
 (0)