Hallo,
zunächst nochmal ich bin Neueinsteiger und dies ist mein zweiter Beitrag
hier im Forum. Ich habe ein Hardware RGB PWM programmiert in der sich
die Farben zyklisch tauschen. Problem ist das dem Quelltext nach, OCR2
komplett auf 0 sinken sollte. Allerdings kann ich eine Spannung von 80
mV an PB2 messen, sodass ein ungewolltes glimmen der LED zu verzeichnen
ist.
Die beiden anderen Farben sinken vollständig auf 0!
Verwendet wird ein Atmega8.
1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 |
|
4 | int main()
|
5 | {
|
6 | // OC1A auf Ausgang
|
7 | DDRB = (1 << PB1 )|(1 << PB2)|(1 << PB3);
|
8 |
|
9 | //
|
10 | // Timer 1 einstellen
|
11 | //
|
12 | // Modus 1:
|
13 | // Set 8 bit Phase correct PWM Mode for channel 1 + 2(A/B)
|
14 | //
|
15 | // WGM13 WGM12 WGM11 WGM10
|
16 | // 0 0 0 1
|
17 | //
|
18 | // Timer Vorteiler: 1
|
19 | // CS12 CS11 CS10
|
20 | // 0 0 1
|
21 | //
|
22 | // Aktivierung der Ausgangsports: Set at BOTTOM, Clear at match
|
23 | // COM1A1 COM1A0 COM1B1 COM1B0
|
24 | // 1 0 1 0
|
25 |
|
26 | TCCR1A = (1<<COM1A1) | (1 << COM1B1)| (1<<WGM10);
|
27 | TCCR1B = (1 << CS10);
|
28 |
|
29 |
|
30 | //
|
31 | // Timer 2 einstellen
|
32 | //
|
33 | // Set 8 bit phase correct PWM Mode
|
34 | // WGM20 WGM21
|
35 | // 1 0
|
36 | //
|
37 | // Clock select channel 3
|
38 | // CS20 CS21
|
39 | // 1 0
|
40 | //
|
41 | // Connect output Pin channel 3
|
42 | // COM20 COM21
|
43 | // 0 1
|
44 |
|
45 | TCCR2 |= (1 << WGM20) | (1 << CS20) | (1 << COM21);
|
46 | TCCR2 |= (1 << CS20);
|
47 |
|
48 | // Durch Verändern der Werte OCR1A, OCR1B und OCR2 werden die Werte der
|
49 | // drei Kanäle eingestellt
|
50 |
|
51 |
|
52 | unsigned char counter1 = 255; //maximale Leuchtkraft
|
53 | unsigned char counter2 = 0; // LED aus
|
54 | unsigned char counter3 = 0; //LED aus
|
55 | OCR1A = counter1;
|
56 | OCR1B = counter2;
|
57 | OCR2 = counter3;
|
58 | unsigned char a = 1; //1-->Auschalten
|
59 | unsigned char b = 0; //0-->Anschalten bzw const 0 bleiben
|
60 | unsigned char c = 0;
|
61 |
|
62 |
|
63 | while( 1 )
|
64 | {
|
65 | if(a==1 & b==0 & c==0)
|
66 | { counter1--;
|
67 | counter2++;
|
68 | }
|
69 | if(a==0 & b==1 & c==0)
|
70 | { counter2--;
|
71 | counter3++;
|
72 | }
|
73 | if(a==0 & b==0 & c==1)
|
74 | { counter1++;
|
75 | counter3--;
|
76 | }
|
77 |
|
78 |
|
79 | if (counter1==255 )
|
80 | {a=1;
|
81 | }
|
82 | if (counter2==255 )
|
83 | {b=1;
|
84 | }
|
85 | if (counter3==255 )
|
86 | {c=1;
|
87 | }
|
88 | if (counter1==0 )
|
89 | {a=0;
|
90 | }
|
91 | if (counter2==0 )
|
92 | {b=0;
|
93 | }
|
94 | if (counter3==0 )
|
95 | {c=0;
|
96 | }
|
97 | OCR1A = counter1; //Setze Counter ein
|
98 | OCR1B = counter2;
|
99 | OCR2 = counter3;
|
100 |
|
101 | _delay_ms(140);
|
102 |
|
103 | }
|
104 | }
|
Ich denke manches mag für euch noch umständlich aussehen, aber bisher
krieg es besser nicht hin. Wer also Verbesserungsvorschläge im Code
findet darf mich gern verbessern!
Grüße
Eric