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
|