Huhu, ich habe da ein kleines Programm zusammengeschrieben um 3 Kanäle per Pseudo PWM zu steuern. Funktioniert soweit auch ganz gut, bis auf den Kanal 3, da tut sich garnichts. Der Tastendruck wird erkannt, allerdings ändert sich nichts an der Helligkeit. Hat da jemand eine Idee ? Hier der Code:
1 | |
2 | #define F_CPU 4800000UL
|
3 | |
4 | #include <avr/io.h> |
5 | #include <util/delay.h> |
6 | #include <avr/interrupt.h> |
7 | #include <stdint.h> |
8 | #include <avr/eeprom.h> |
9 | |
10 | void pwmblau(); |
11 | void pwmweiss(); |
12 | void pwmluefter(); |
13 | void delay_us(); |
14 | void load(); |
15 | |
16 | uint16_t pwm_period = 500; // *3 Kanäle = 999 |
17 | uint16_t EEMEM pwm_tB; |
18 | uint16_t EEMEM pwm_tW; |
19 | uint16_t EEMEM pwm_tL; |
20 | |
21 | |
22 | int main (void) |
23 | {
|
24 | |
25 | GIMSK |= (1<< PCIE); |
26 | PCMSK |= ((1<<PCINT2) | (1<<PCINT3) | (1<<PCINT5)); |
27 | DDRB |= ((1<<PB1) | (1<<PB0) | (1<<PB4)); |
28 | PORTB |=((1<<PB2) | (1<<PB3) | (1<<PB5)); |
29 | |
30 | cli(); |
31 | load(); |
32 | _delay_ms(500); |
33 | |
34 | while( 1 ) // PWM Main - Routine |
35 | {
|
36 | |
37 | sei(); |
38 | pwmblau(); |
39 | pwmweiss(); |
40 | pwmluefter(); |
41 | }
|
42 | |
43 | return 0; |
44 | }
|
45 | |
46 | |
47 | ISR(PCINT0_vect) |
48 | {
|
49 | cli(); |
50 | PORTB |= (1<<PB1); |
51 | PORTB |= (1<<PB0); |
52 | PORTB |= (1<<PB4); |
53 | _delay_ms(50); |
54 | |
55 | if (!(PINB & ( 1 << PINB2 )) ) //Check welcher Pin low |
56 | {
|
57 | _delay_ms(250); |
58 | pwm_tB += 25; // PulsDauer - Puls ON + 5% |
59 | if (pwm_tB > 500) // Wenn Puls ON > Periodendauer -> Puls On = 0; |
60 | {
|
61 | pwm_tB = 0; |
62 | }
|
63 | eeprom_write_word(&pwm_tB, pwm_tB); //Speichert Wert von pwm_t[] an Adresse [n] im EEPROM |
64 | }
|
65 | |
66 | if (!(PINB & ( 1 << PINB3 )) ) //Check welcher Pin low |
67 | {
|
68 | _delay_ms(250); |
69 | pwm_tW += 25; // PulsDauer - Puls ON + 5% |
70 | |
71 | if (pwm_tW > 500) // Wenn Puls ON > Periodendauer -> Puls On = 0; |
72 | {
|
73 | pwm_tW = 0; |
74 | }
|
75 | eeprom_write_word(&pwm_tW, pwm_tW); //Speichert Wert von pwm_t[] an Adresse [n] im EEPROM |
76 | }
|
77 | |
78 | if (!(PINB & ( 1 << PINB5 )) ) //Check welcher Pin low |
79 | {
|
80 | _delay_ms(250); |
81 | pwm_tL += 25; // PulsDauer - Puls ON + 5% |
82 | |
83 | if (pwm_tL > 500) // Wenn Puls ON > Periodendauer -> Puls On = 0; |
84 | {
|
85 | pwm_tL = 0; |
86 | }
|
87 | eeprom_write_word(&pwm_tL, pwm_tL); ///Speichert Wert von pwm_t[] an Adresse [n] im EEPROM |
88 | }
|
89 | _delay_ms(50); |
90 | sei(); |
91 | }
|
92 | |
93 | |
94 | void pwmblau() |
95 | {
|
96 | PORTB &= ~(1<<PB1); |
97 | delay_us(pwm_tB); // Puls ON |
98 | PORTB |= (1<<PB1); |
99 | delay_us(pwm_period - pwm_tB); // PulsDauer - Puls ON |
100 | }
|
101 | |
102 | |
103 | void pwmweiss() |
104 | {
|
105 | PORTB &= ~(1<<PB0); |
106 | delay_us(pwm_tW); // Puls ON |
107 | PORTB |= (1<<PB0); |
108 | delay_us(pwm_period - pwm_tW); // PulsDauer - Puls ON |
109 | }
|
110 | |
111 | |
112 | void pwmluefter() |
113 | {
|
114 | PORTB &= ~(1<<PB4); |
115 | delay_us(pwm_tL); // Puls ON |
116 | PORTB |= (1<<PB4); |
117 | delay_us(pwm_period - pwm_tL); // PulsDauer - Puls ON |
118 | }
|
119 | |
120 | |
121 | |
122 | void delay_us(int us ) |
123 | {
|
124 | for (int i = 0; i < us; i++) |
125 | {
|
126 | _delay_us(1); |
127 | }
|
128 | }
|
129 | |
130 | |
131 | void load() |
132 | {
|
133 | |
134 | pwm_tB = eeprom_read_word(&pwm_tB); // Lesevorgang |
135 | |
136 | pwm_tW = eeprom_read_word(&pwm_tW); // Lesevorgang |
137 | |
138 | pwm_tL = eeprom_read_word(&pwm_tL); // Lesevorgang |
139 | }
|
LG, Marcel