diff options
author | Jakob Odersky <jodersky@gmail.com> | 2014-03-17 16:28:23 +0100 |
---|---|---|
committer | Jakob Odersky <jodersky@gmail.com> | 2014-03-17 16:28:23 +0100 |
commit | 01c10b2eadbcd09b6ac34ab80cac1b65c302152e (patch) | |
tree | b4fc0da76fe0257203382eac69bd8b2142298421 /kernel/time/mcu/atmega2560/clock.c | |
parent | 5466218a5f9fb3d46f608806f222fcc99a306a4b (diff) | |
download | mux-01c10b2eadbcd09b6ac34ab80cac1b65c302152e.tar.gz mux-01c10b2eadbcd09b6ac34ab80cac1b65c302152e.tar.bz2 mux-01c10b2eadbcd09b6ac34ab80cac1b65c302152e.zip |
implement clock
Diffstat (limited to 'kernel/time/mcu/atmega2560/clock.c')
-rw-r--r-- | kernel/time/mcu/atmega2560/clock.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/kernel/time/mcu/atmega2560/clock.c b/kernel/time/mcu/atmega2560/clock.c new file mode 100644 index 0000000..6821456 --- /dev/null +++ b/kernel/time/mcu/atmega2560/clock.c @@ -0,0 +1,37 @@ +#include <avr/interrupt.h> +#include "time/clock.h" +#include "task/sched.h" +#include "mcu/task/context.h" + +static void (*on_tick)(); + +void clock_init(int ms, void (*tick)()) { + TCCR3A = 0; + TCCR3B = 0; + TCCR3C = 0; + + TCCR3B = (1 << WGM32); // turn on CTC mode: + TCCR3B |= (1 << CS32) | (0 << CS31) | (1 << CS30); // set to 1024 prescaler + + unsigned long int fcpu = (unsigned long int) F_CPU; + unsigned long int hz = 1000l / ((unsigned long int) ms); + + unsigned long int hz_counter = fcpu / (1024 * (hz)) - 1; + OCR3A = hz_counter; + on_tick = tick; +} + +void clock_start() { + TIMSK3 |= (1 << OCIE3A); +} + +void clock_stop() { + TIMSK3 &= ~(1 << OCIE3A); +} + +ISR(TIMER3_COMPA_vect, ISR_NAKED) { + context_save(); + on_tick(); + context_restore(); + reti(); +} |