diff --git a/emb/time.cpp b/emb/time.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..72da5a16dd2ccdafa7dad9974fa566347a71fc7b
--- /dev/null
+++ b/emb/time.cpp
@@ -0,0 +1,29 @@
+#include "time.hpp"
+
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <stdint.h>
+
+static uint32_t millis;
+
+void initTime()
+{
+    cli();
+    
+    TCCR0A = (1 << WGM01);              // CTC mode, TOP = OCRA
+    TCCR0B = (1 << CS01) | (1 << CS00); // 64th prescaler
+    OCR0A = 249;                        // set TOP for 1 kHz interrupts
+    TIMSK0 = (1 << OCIE0A);             // enable compare A interrupt
+    
+    sei();
+}
+
+uint32_t getCurrentMillis()
+{
+    return millis;
+}
+
+ISR(TIMER0_COMPA_vect)
+{
+    millis++;
+}
diff --git a/emb/time.hpp b/emb/time.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..27a93e5c03d1b8a69b55d93ffb84a53e33180aab
--- /dev/null
+++ b/emb/time.hpp
@@ -0,0 +1,16 @@
+#ifndef TIME_H
+#define TIME_H
+
+#include <stdint.h>
+
+/**
+ * Initialises time.
+ */
+void initTime();
+
+/**
+ * Gets the number of milliseconds since program start.
+ */
+uint32_t getCurrentMillis();
+
+#endif /* TIME_H */