-
Notifications
You must be signed in to change notification settings - Fork 0
/
TIMER0_program.c
208 lines (160 loc) · 5.68 KB
/
TIMER0_program.c
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
/*
* TIMER0_program.c
*
* Created on: Nov 11, 2022
* Author: MSAEED99
*/
// Libraries
#include "STD_TYPES.h"
#include "BIT_MATH.h"
// MCAL
#include "TIMER0_interface.h"
#include "TIMER0_register.h"
#include "TIMER0_config.h"
#include "TIMER0_private.h"
// Global pointer to function to be used in callback
void (*TIMER0_pvGlobCallBackFunc)(void) = NULL;
// Initialize Timer 0
void TIMER0_voidTimer0Init(void)
{
/********** Waveform Generation Mode **********/
#if WAVE_FORM_GENERATION_MODE == NORMAL
CLR_BIT(TCCR0, TCCR0_WGM00);
CLR_BIT(TCCR0, TCCR0_WGM01);
#elif WAVE_FORM_GENERATION_MODE == PWM_PHASE_CORRECT
SET_BIT(TCCR0, TCCR0_WGM00);
CLR_BIT(TCCR0, TCCR0_WGM01);
#elif WAVE_FORM_GENERATION_MODE == CTC
// Wave Form Generation
CLR_BIT(TCCR0, TCCR0_WGM00);
SET_BIT(TCCR0, TCCR0_WGM01);
#elif WAVE_FORM_GENERATION_MODE == FAST_PWM
SET_BIT(TCCR0, TCCR0_WGM00);
SET_BIT(TCCR0, TCCR0_WGM01);
#else
#error "Wrong Wave Form Generation Mode"
#endif
/********** Compare Match Output Pin Mode *********/
//===================================================
// Compare Match Output Mode: Non-PWM (Normal or CTC)
//===================================================
#if (WAVE_FORM_GENERATION_MODE == NORMAL) || (WAVE_FORM_GENERATION_MODE == CTC)
#if COMPARE_OUTPUT_MODE_NON_PWM_MODE == NORMAL_PORT_OPERATION_OC0_PINB3_DISCONNECTED
CLR_BIT(TCCR0, TCCR0_COM00);
CLR_BIT(TCCR0, TCCR0_COM01);
#elif COMPARE_OUTPUT_MODE_NON_PWM_MODE == TOGGLE_OC0_PINB3_ON_COMPARE_MATCH
SET_BIT(TCCR0, TCCR0_COM00);
CLR_BIT(TCCR0, TCCR0_COM01);
#elif COMPARE_OUTPUT_MODE_NON_PWM_MODE == CLEAR_OC0_PINB3_ON_COMPARE_MATCH
CLR_BIT(TCCR0, TCCR0_COM00);
SET_BIT(TCCR0, TCCR0_COM01);
#elif COMPARE_OUTPUT_MODE_NON_PWM_MODE == SET_OC0_PINB3_ON_COMPARE_MATCH
SET_BIT(TCCR0, TCCR0_COM00);
SET_BIT(TCCR0, TCCR0_COM01);
#else
#error "Wrong Wave Compare Output Mode"
#endif
#endif
//===================================================
// Compare Match Output Mode: Fast PWM
//===================================================
#if WAVE_FORM_GENERATION_MODE == FAST_PWM
#if COMPARE_OUTPUT_MODE_FAST_PWM_MODE == NORMAL_PORT_OPERATION_OC0_PINB3_DISCONNECTED
CLR_BIT(TCCR0, TCCR0_COM00);
CLR_BIT(TCCR0, TCCR0_COM01);
#elif COMPARE_OUTPUT_MODE_FAST_PWM_MODE == RESERVED
SET_BIT(TCCR0, TCCR0_COM00);
CLR_BIT(TCCR0, TCCR0_COM01);
#elif COMPARE_OUTPUT_MODE_FAST_PWM_MODE == CLEAR_OC0_PINB3_ON_COMPARE_MATCH_SET_OC0_PINB3_AT_TOP
CLR_BIT(TCCR0, TCCR0_COM00);
SET_BIT(TCCR0, TCCR0_COM01);
#elif COMPARE_OUTPUT_MODE_FAST_PWM_MODE == SET_OC0_PINB3_ON_COMPARE_MATCH_CLEAR_OC0_PINB3_AT_TOP
SET_BIT(TCCR0, TCCR0_COM00);
SET_BIT(TCCR0, TCCR0_COM01);
#else
#error "Wrong Wave Compare Output Mode"
#endif
#endif
//===================================================
// Compare Match Output Mode: PWM Phase Correct
//===================================================
#if WAVE_FORM_GENERATION_MODE == PWM_PHASE_CORRECT
#if COMPARE_OUTPUT_MODE_PHASE_CORRECT_PWM_MODE == NORMAL_PORT_OPERATION_OC0_PINB3_DISCONNECTED
CLR_BIT(TCCR0, TCCR0_COM00);
CLR_BIT(TCCR0, TCCR0_COM01);
#elif COMPARE_OUTPUT_MODE_PHASE_CORRECT_PWM_MODE == RESERVED
SET_BIT(TCCR0, TCCR0_COM00);
CLR_BIT(TCCR0, TCCR0_COM01);
#elif COMPARE_OUTPUT_MODE_PHASE_CORRECT_PWM_MODE == Clear_OC0_PINB3_on_compare_match_when_up_counting_Set_OC0_PINB3_on_compare_match_when_downcounting
CLR_BIT(TCCR0, TCCR0_COM00);
SET_BIT(TCCR0, TCCR0_COM01);
#elif COMPARE_OUTPUT_MODE_PHASE_CORRECT_PWM_MODE == Set_OC0_PINB3_on_compare_match_when_up_counting_Clear_OC0_PINB3_on_compare_match_when_downcounting
SET_BIT(TCCR0, TCCR0_COM00);
SET_BIT(TCCR0, TCCR0_COM01);
#else
#error "Wrong Wave Compare Output Mode"
#endif
#endif
/************ Pre-scaler Clock Select ************/
#if PRE_SCALER_SELECT == NO_CLOCK_SOURCE
CLR_BIT(TCCR0, TCCR0_CS00);
CLR_BIT(TCCR0, TCCR0_CS01);
CLR_BIT(TCCR0, TCCR0_CS02);
#elif PRE_SCALER_SELECT == NO_PRE_SCALING
SET_BIT(TCCR0, TCCR0_CS00);
CLR_BIT(TCCR0, TCCR0_CS01);
CLR_BIT(TCCR0, TCCR0_CS02);
#elif PRE_SCALER_SELECT == PRE_SCALER_8
CLR_BIT(TCCR0, TCCR0_CS00);
SET_BIT(TCCR0, TCCR0_CS01);
CLR_BIT(TCCR0, TCCR0_CS02);
#elif PRE_SCALER_SELECT == PRE_SCALER_64
SET_BIT(TCCR0, TCCR0_CS00);
SET_BIT(TCCR0, TCCR0_CS01);
CLR_BIT(TCCR0, TCCR0_CS02);
#elif PRE_SCALER_SELECT == PRE_SCALER_256
CLR_BIT(TCCR0, TCCR0_CS00);
CLR_BIT(TCCR0, TCCR0_CS01);
SET_BIT(TCCR0, TCCR0_CS02);
#elif PRE_SCALER_SELECT == PRE_SCALER_1024
SET_BIT(TCCR0, TCCR0_CS00);
CLR_BIT(TCCR0, TCCR0_CS01);
SET_BIT(TCCR0, TCCR0_CS02);
#elif PRE_SCALER_SELECT == EXTERNAL_CLOCK_SOURCE_ON_T0_PIN_ON_FALLING_EDGE
CLR_BIT(TCCR0, TCCR0_CS00);
SET_BIT(TCCR0, TCCR0_CS01);
SET_BIT(TCCR0, TCCR0_CS02);
#elif PRE_SCALER_SELECT == EXTERNAL_CLOCK_SOURCE_ON_T0_PIN_ON_RISING_EDGE
SET_BIT(TCCR0, TCCR0_CS00);
SET_BIT(TCCR0, TCCR0_CS01);
SET_BIT(TCCR0, TCCR0_CS02);
#else
#error "Wrong Pre-scaler Select"
#endif
// Output Compare Value: Set to COMP_MATCH_VAL_CTC_MODE
OCR0 = COMP_MATCH_VAL_CTC_MODE;
// Enable Compare-Match Interrupt
SET_BIT(TIMSK, TIMSK_OCIE0);
}
// Set compare match value via function when using Fast PWM Mode (Change value -> Change Feeding signal power)
void Timer0_voidSetCompareMatchVal(u8 copy_uoCompMatch)
{
OCR0 = copy_uoCompMatch;
}
// Callback function to Timer0 ISR
void TIMER0_voidSetCallBack(void (*copy_pvUserFunc)(void))
{
if(copy_pvUserFunc != NULL)
{
TIMER0_pvGlobCallBackFunc = copy_pvUserFunc;
}
}
// ISR for Timer0
void __vector_10 (void) __attribute__((signal));
void __vector_10 (void)
{
if(TIMER0_pvGlobCallBackFunc != NULL)
{
TIMER0_pvGlobCallBackFunc();
}
}