]> git.tdb.fi Git - model-railway-devices.git/blobdiff - common/delay.h
Reorganize the directory structure
[model-railway-devices.git] / common / delay.h
diff --git a/common/delay.h b/common/delay.h
new file mode 100644 (file)
index 0000000..725d22b
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef DELAY_H_
+#define DELAY_H_
+
+static inline void __attribute__((always_inline)) delay_loop8(uint8_t count)
+{
+       __asm__ volatile (
+               "1: dec %0" "\n\t"
+               "brne 1b"
+               : "=r" (count)
+               : "0" (count)
+       );
+}
+
+static inline void __attribute__((always_inline)) delay_loop16(uint16_t count)
+{
+       __asm__ volatile (
+               "1: sbiw %0, 1" "\n\t"
+               "brne 1b"
+               : "=r" (count)
+               : "0" (count)
+       );
+}
+
+static inline void __attribute__((always_inline)) delay_us(uint16_t us)
+{
+       uint16_t clocks = F_CPU/1000000*us;
+       if(clocks<768)
+               delay_loop8(clocks/3);
+       else
+               delay_loop16(clocks/4);
+}
+
+static inline void __attribute__((always_inline)) delay_ms(uint16_t ms)
+{
+       if(ms<0x40000/(F_CPU/1000))
+               delay_loop16(F_CPU/1000*ms/4);
+       else
+       {
+               uint16_t i = ms*10;
+               while(--i)
+                       delay_loop16(F_CPU/40000);
+       }
+}
+
+#endif