Hallo, kann mir vielleicht einer helfen? Ich weiß einfach nicht, warum die grüne LED nicht angehen möchte.. Selbst wenn ich Sie in den ersten Case reinsetze. Rot und blau funktionieren.. Hab ich was mit den Timern falsch gemacht?
1 | #define F_CPU 16000000UL
|
2 | |
3 | #include <avr/io.h> |
4 | #include <avr/pgmspace.h> |
5 | #include <avr/interrupt.h> |
6 | #include "lookup.dat" |
7 | |
8 | #define LED_RED_init() DDRB |= (1<<DDB1)
|
9 | #define RED() OCR1A = w; OCR1B = 0; OCR2A = 0;
|
10 | |
11 | |
12 | #define LED_BLUE_init() DDRB |= (1<<DDB3)
|
13 | #define BLUE() OCR1A = 0; OCR1B = 0; OCR2A = w;
|
14 | |
15 | |
16 | #define LED_GREEN_init() DDRB |= (1<<DDB2)
|
17 | #define GREEN() OCR1A = 0; OCR1B = w; OCR2A = 0;
|
18 | |
19 | #define WHITE_init() DDRB |= ( (1<<DDB1) | (1<<DDB2) | (1<<DDB3) )
|
20 | #define WHITE() OCR1A = x; OCR1B = x; OCR2A = x;
|
21 | |
22 | #define BREAK() OCR1A = 0; OCR1B = 0; OCR2A = 0;
|
23 | |
24 | |
25 | // Globale Variablen
|
26 | volatile int intensitaet = 0; |
27 | volatile char farbe = 0; |
28 | volatile char w; |
29 | volatile char x; |
30 | |
31 | enum
|
32 | {
|
33 | RED, BREAK1, GREEN, BREAK2, WHITE, BREAK3 |
34 | } ; |
35 | // 0 1 2 3 4 5
|
36 | |
37 | void init_rgb(void) |
38 | {
|
39 | LED_BLUE_init(); |
40 | LED_RED_init(); |
41 | LED_GREEN_init(); |
42 | WHITE_init(); |
43 | |
44 | }
|
45 | |
46 | void init_timer(void) |
47 | {
|
48 | //Timer 0
|
49 | TCCR0B |= (1<<CS02) | (1<<CS00); // Prescaler 1024 |
50 | TCCR0A |= (1<<WGM00); // Phase Correct Mode 1 |
51 | TCCR0A |= (1<<COM0A1); // Non-inverting Mode, CM0A1 --> 1 |
52 | OCR0A = 121; |
53 | |
54 | //Timer 1
|
55 | TCCR1B |= (1<<CS12); // Prescaler 256 |
56 | TCCR1A |= (1<<WGM10); // Mode 1 |
57 | TCCR1A |= (1<<COM1A1) | (COM1B1); |
58 | |
59 | //Timer 2
|
60 | TCCR2B |= (1<<CS22) | (1<<CS21); // Prescaler 256 |
61 | TCCR2A |= (1<<WGM20); // Mode 1 |
62 | TCCR2A |= (1<<COM2A1); |
63 | }
|
64 | |
65 | ISR(TIMER0_COMPA_vect) |
66 | {
|
67 | intensitaet++; |
68 | }
|
69 | |
70 | void programm(void) |
71 | {
|
72 | |
73 | |
74 | |
75 | switch(farbe) |
76 | {
|
77 | case RED: |
78 | RED (); |
79 | if(intensitaet==255) |
80 | {
|
81 | intensitaet = 0; |
82 | farbe = BREAK1; |
83 | }
|
84 | break; |
85 | |
86 | case BREAK1: |
87 | BREAK(); |
88 | if(intensitaet==255) |
89 | {
|
90 | intensitaet = 0; |
91 | farbe = GREEN; |
92 | }
|
93 | break; |
94 | |
95 | case GREEN: |
96 | GREEN(); |
97 | if(intensitaet==255) |
98 | {
|
99 | intensitaet = 0; |
100 | farbe = BREAK2; |
101 | }
|
102 | break; |
103 | |
104 | case BREAK2: |
105 | BREAK(); |
106 | if(intensitaet==255) |
107 | {
|
108 | farbe = WHITE; |
109 | }
|
110 | break; |
111 | |
112 | case WHITE: |
113 | WHITE(); |
114 | if(intensitaet==0) |
115 | {
|
116 | farbe = BREAK3; |
117 | }
|
118 | break; |
119 | |
120 | case BREAK3: |
121 | BREAK(); |
122 | if(intensitaet==255) |
123 | {
|
124 | intensitaet = 0; |
125 | farbe = RED; |
126 | }
|
127 | break; |
128 | }
|
129 | }
|
130 | |
131 | int main(void) |
132 | {
|
133 | init_rgb(); |
134 | init_timer(); |
135 | sei(); |
136 | TIMSK0 |= (1<<OCIE0A); |
137 | intensitaet = 0; |
138 | |
139 | while (1) |
140 | {
|
141 | programm(); |
142 | |
143 | w = pgm_read_byte_near(lookup + intensitaet); |
144 | x = pgm_read_byte_near(lookup +255 -intensitaet); |
145 | }
|
146 | }
|