-
Notifications
You must be signed in to change notification settings - Fork 1
/
millis.S
52 lines (45 loc) · 951 Bytes
/
millis.S
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
; needed for <avr/io.h> to give io constant addresses
#define __SFR_OFFSET 0
#include <avr/io.h>
;.section .bss
.global __do_clear_bss
; 4 byte global variable in RAM + overflow byte
.lcomm wdt_millis_counter, 5
.global wdt_millis_counter
.section .text.millis
; return millis counter ulong in r24:r27
.global _millis
_millis:
ldi ZL, lo8(wdt_millis_counter)
cli
ld r24, Z+
ld r25, Z+
ld r26, Z+
ld r27, Z+
reti
#define tmp1 r16
.global WDT_vect
WDT_vect:
push ZL
in ZL, SREG
push ZL ; Save SREG
push tmp1
ldi ZL, lo8(wdt_millis_counter)
ld tmp1, Z
subi tmp1, -19 ; Add 19 (not 16) because the WDT clock isn't really 128 kHz
rjmp save
add1:
ld tmp1, Z
sbci tmp1, -1
save:
st Z+, tmp1
brcc add1
pop tmp1
pop ZL
out SREG, ZL
pop ZL
reti
.section .init8
ldi r16, 1<<WDTIE
out WDTCR, r16
sei