summaryrefslogtreecommitdiff
path: root/src/c/hardware/avr/pwm/u8AVRPWMSetups.c
blob: 5110d81248bfc67518c1d20e7891ef0836d1122d (plain)
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
// Function to initialise PWM of AVR
//
// Calling Sequence
//     u8AVRPWMSetups(uint8 timer, uint8 prescalar, uint8 waveform_mode, uint8 output_mode)
//
// Parameters
//     timer: timer to be used for PWM generation (0,1,2)
//     prescalar: prescalar to be used for generating PWM waveform (0-7)
//     waveform_mode: decides type of waveform generation
//              0 -> Normal mode
//              1 -> Phase correct mode
//              2 -> CTC mode
//              3 -> Fase PWM mode
//	   output_mode: decides the compare output mode. (0-3)
//					behaviour of the output is different for different inputs 
//					depending upon 'waveform_mode' chosen. 
//     ***Refer datasheet for more description about above modes
//              
// Description
//     This function initialises PWM of AVR with given parameters. 'timer' 
//     decides which of the three (0,1,2) timers available to be used. The 
//     'prescalar' is needed for deciding PWM clock. Select appropriate prescalar
// 	   depending on MCU clock. Choose required pwmmode using 'waveform_generation'
//     and 'output_mode'. Please refer datasheet for more description of 'wafefom_mode'
//     and 'output mode'.
// Examples
//     AVRPWMSetup(0,1,2,2)
//
// Authors
//     Siddhesh Wani
//

#include "AVRPeripheralPWM.h"


uint8 u8AVRPWMSetups(uint8 timer, uint8 prescalar, uint8 waveform_mode, uint8 output_mode)
{
	switch(timer)
	{
		case 0:
				TCCR0|= (prescalar & 0x07);  //Select clock source
				//Select waveform generation mode
				TCCR0|= ((waveform_mode & 0x04) << 4);  
				//Select compare output mode
				TCCR0 |= ((output_mode & 0x01) << 3);  //WGM0
				TCCR0 |= ((output_mode & 0x02) << 6);  //WGM1
				break;
		case 1:
				break;
		case 2:
				TCCR2|= (prescalar & 0x07);  //Select clock source
				//Select waveform generation mode
				TCCR2|= ((waveform_mode & 0x04) << 4);  
				//Select compare output mode
				TCCR2 |= ((output_mode & 0x01) << 3);  //WGM0
				TCCR2 |= ((output_mode & 0x02) << 6);  //WGM1
				break;
	}	    

	return 0;
}