1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 | #include <math.h>
|
4 | #include <avr/pgmspace.h>
|
5 |
|
6 | uint16_t pwmtable[32] PROGMEM = {0, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 10, 11,
|
7 | 13, 16, 19, 23, 27, 32, 38, 45, 54, 64, 76,
|
8 | 91, 108, 128, 152, 181, 215, 255};
|
9 |
|
10 |
|
11 | int main(void)
|
12 | {
|
13 | DDRD = 0xFF; //Alles auf Ausgang
|
14 | DDRB = 0xFF; //Alles auf Ausgang
|
15 | PORTD = 0x00;
|
16 | PORTD = 0x00;
|
17 | DDRA = 0x00;
|
18 | PORTA = 0x00;
|
19 |
|
20 | uint8_t valuered = 0;
|
21 | uint8_t valueblue = 0;
|
22 | uint8_t valuegreen = 0;
|
23 | uint8_t adcvalue = 0;
|
24 | uint8_t step = 1;
|
25 | uint8_t stepsize = 1;
|
26 |
|
27 | // PWM 0
|
28 | // 8-bit PWM, Phase correct
|
29 | // 8 bits give us 256 levels of brightness
|
30 | TCCR0A |= (1<<WGM00);
|
31 |
|
32 | // Clear OC0A/OC0B on Compare Match
|
33 | // Set OC0A/OC0B at BOTTOM (non-inverting mode)
|
34 | TCCR0A |= (1<<COM0A1);
|
35 |
|
36 | // Set prescaler to 8
|
37 | // 1 MHz / 8*256 = ~490 Hz PWM frequency
|
38 | TCCR0B |= (1<<CS01);
|
39 |
|
40 |
|
41 | // PWM 1
|
42 |
|
43 | // 8-bit PWM, Phase correct
|
44 | // 8 bits give us 256 levels of brightness
|
45 | TCCR1A |= (1<<WGM10);
|
46 |
|
47 | // Clear OC0A/OC0B on Compare Match
|
48 | // Set OC0A/OC0B at BOTTOM (non-inverting mode)
|
49 | TCCR1A |= (1<<COM1A1);
|
50 |
|
51 | // Set prescaler to 8
|
52 | // 1 MHz / 8*256 = ~490 Hz PWM frequency
|
53 | TCCR1B |= (1<<CS11);
|
54 |
|
55 | while(1)
|
56 | {
|
57 |
|
58 | if(adcvalue = 191)adcvalue=0;
|
59 | adcvalue++;
|
60 |
|
61 | if(adcvalue<32){
|
62 | valuered = 32;
|
63 | valueblue = 0;
|
64 | valuegreen = adcvalue;
|
65 | }
|
66 | if(31<adcvalue<64){
|
67 | valuered = 32 - adcvalue;
|
68 | valueblue = 0;
|
69 | valuegreen = 32;
|
70 | }
|
71 | if(63<adcvalue<96){
|
72 | valuered = 0;
|
73 | valueblue = adcvalue;
|
74 | valuegreen = 32;
|
75 | }
|
76 | if(95<adcvalue<128){
|
77 | valuered = 0;
|
78 | valueblue = 32;
|
79 | valuegreen = 32 - adcvalue;
|
80 | }
|
81 | if(127<adcvalue<160){
|
82 | valuered = adcvalue;
|
83 | valueblue = 32;
|
84 | valuegreen = 0;
|
85 | }
|
86 | if(159<adcvalue<192){
|
87 | valuered = 32;
|
88 | valueblue = 32 - adcvalue;
|
89 | valuegreen = 0;
|
90 | }
|
91 |
|
92 | OCR1A = pwmtable[valuered];
|
93 | OCR1B = pwmtable[valuegreen];
|
94 | OCR0A = pwmtable[valueblue];
|
95 | _delay_ms(40);
|
96 | }
|
97 |
|
98 | return 0;
|
99 | }
|