~vbursian/research-assistant/intervers

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
////////////////////////////////////////////////////////////////////////////////
/*! @file ClocksSimple.h   Convinience functions for AT90USB162 timers/counters.
- Part of the MSDN firmware.
- Part of the Research Assistant project.
- Copyright(C) 2014, Dmitry K. Nelson, St.Petersburg, Russia.
                     D.Nelson@mail.ioffe.ru
- Copyright(C) 2016, Viktor E. Bursian, St.Petersburg, Russia.
                     Viktor.Bursian@mail.ioffe.ru
*///////////////////////////////////////////////////////////////////////////////
#ifndef ClocksSimple_H
#define ClocksSimple_H
#include <avr/io.h>
#include <avr/iousb162.h>
#include <inttypes.h>
//------------------------------------------------------------------------------

extern int8_t Clock0_Signalled;
extern int8_t Clock1_Signalled;

//------------------------------------------------------------------------------

#if MCU == at90usb162
//------------------------------------------------------------------------------

//extern const int8_t Clock_DividerLog [];

//------------------------------------------------------------------------------

inline void Clock0_SetToZero (void)
{
  TCNT0 = 0x00;
}


inline void Clock0_ForbidInterrupts (void)
{
  TIMSK0 &= ~(1 << OCIE0A);
}


inline void Clock0_ForgetInterrupts (void)
{
  TIFR0 |= (1 << OCF0A);
}


inline void Clock0_AllowInterrupts (void)
{
  TIMSK0 |= (1 << OCIE0A);
}


uint32_t  Clock0_TickFrequency (void);
uint32_t  Clock0_TickInterval (void); /*ns*/
void      Clock0_SetTickFrequency (uint32_t  frequency/*Hz*/);
uint32_t  Clock0_Period (void); /*ns*/
int8_t    Clock0_SetPeriod (uint32_t  period /*ns*/);


inline void Clock0_Init (void)
{
  TCCR0A = (0 << COM0A1)  //  Инициализация таймера микроконтроллера TIMER0
         | (0 << COM0A0)
         | (0 << COM0B1)
         | (0 << COM0B0)
         | (1 << WGM01)   // Режим сброса при совпадении OCR0A
         | (0 << WGM00)
         ;
  TCCR0B = (0 << FOC0A)
         | (0 << FOC0B)
         | (0 << WGM02)
//         | (1 << CS12)  // Выбор тактовой частоты
//         | (0 << CS11)  // Данными битами
//         | (1 << CS10)  // установлено деление на 1024 (время на такт 64 мкс)
         ;
  Clock0_SetTickFrequency(15625);
  Clock0_SetPeriod(10000000);      //~10ms
  Clock0_SetToZero();
  Clock0_ForbidInterrupts();
}

//------------------------------------------------------------------------------

inline void Clock1_SetToZero (void)
{
  TCNT1H = 0x00;
  TCNT1L = 0x00;
}


inline void Clock1_ForbidInterrupts (void)
{
  TIMSK1 &= ~(1 << OCIE1A);
}


inline void Clock1_ForgetInterrupts (void)
{
  TIFR1 |= (1 << OCF1A);
}


inline void Clock1_AllowInterrupts (void)
{
  TIMSK1 |= (1 << OCIE1A);
}


uint32_t  Clock1_TickFrequency (void);
uint32_t  Clock1_TickInterval (void); /*ns*/
void      Clock1_SetTickFrequency (uint32_t  frequency/*Hz*/);
uint32_t  Clock1_Period (void); /*ns*/
int8_t    Clock1_SetPeriod (uint32_t  period /*ns*/);


inline void Clock1_Init (void)
{
  TCCR1A = (0 << COM1A1)  //  Инициализация таймера микроконтроллера TIMER1
         | (0 << COM1A0)
         | (0 << COM1B1)
         | (0 << COM1B0)
         | (0 << FOC1A)
         | (0 << FOC1B)
         | (0 << WGM11)
         | (0 << WGM10)
         ;
  TCCR1B = (0 << ICNC1)
         | (0 << ICES1)
         | (0 << WGM13)
         | (1 << WGM12) // Режим сброса при совпадении OCR1A
//         | (1 << CS12)  // Выбор тактовой частоты
//         | (0 << CS11)  // Данными битами
//         | (0 << CS10)  // установлено деление на 256 (время на такт 16 мкс)
         ;
  Clock1_SetTickFrequency(62500);
  Clock1_SetPeriod(100000000);      //~100ms
  Clock1_SetToZero();
  Clock1_ForbidInterrupts();
}

//------------------------------------------------------------------------------
#endif // MCU == at90usb162

//------------------------------------------------------------------------------
#endif