]> git.tdb.fi Git - model-railway-devices.git/blob - firmware/delay.h
Rename the project to R²C²
[model-railway-devices.git] / firmware / delay.h
1 /* $Id$
2
3 This file is part of R²C²
4 Copyright © 2010  Mikkosoft Productions, Mikko Rasa
5 Distributed under the GPL
6 */
7
8 #ifndef DELAY_H_
9 #define DELAY_H_
10
11 static inline void __attribute__((always_inline)) delay_loop8(uint8_t count)
12 {
13         __asm__ volatile (
14                 "1: dec %0" "\n\t"
15                 "brne 1b"
16                 : "=r" (count)
17                 : "0" (count)
18         );
19 }
20
21 static inline void __attribute__((always_inline)) delay_loop16(uint16_t count)
22 {
23         __asm__ volatile (
24                 "1: sbiw %0, 1" "\n\t"
25                 "brne 1b"
26                 : "=r" (count)
27                 : "0" (count)
28         );
29 }
30
31 static inline void __attribute__((always_inline)) delay_us(uint16_t us)
32 {
33         uint16_t clocks = F_CPU/1000000*us;
34         if(clocks<768)
35                 delay_loop8(clocks/3);
36         else
37                 delay_loop16(clocks/4);
38 }
39
40 static inline void __attribute__((always_inline)) delay_ms(uint16_t ms)
41 {
42         if(ms<0x40000/(F_CPU/1000))
43                 delay_loop16(F_CPU/1000*ms/4);
44         else
45         {
46                 uint16_t i = ms*10;
47                 while(--i)
48                         delay_loop16(F_CPU/40000);
49         }
50 }
51
52 #endif