aboutsummaryrefslogtreecommitdiff
path: root/kernel/time/mcu/atmega2560/timer.c
blob: 03f1ed5dffad481f5a8c2d7c804a892614888505 (plain) (blame)
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
#include <avr/interrupt.h>
#include "sched/sched.h"
#include "time/timer.h"

void timer_init() {
  cli();
  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 hz_counter = ((unsigned long int) F_CPU) / (1024 * ((unsigned long int) HZ)) - 1;
  OCR3A = hz_counter;
  sei();
}

void timer_start() {
  TIMSK3 |= (1 << OCIE3A);
}

void timer_stop() {
  TIMSK3 &= ~(1 << OCIE3A);
}

#include <avr/io.h>
void led13(int on) {
  if (on) {
    DDRB |= (1 << 7);
    PORTB |= (1 << 7);
  } else {
    DDRB &= ~(1 << 7);
    PORTB &= ~(1 << 7);
  }
}

ISR(TIMER3_COMPA_vect, ISR_NAKED) {
  SAVE_CONTEXT();
  static int on = 0;
  on = !on;
  led13(on);
  sched_tick();
  RESTORE_CONTEXT();
  asm volatile ("reti");
}