Wenns mehrere LED sind, und du die auch hardwaremässig nicht so
verschaltet kannst, dass du sie alle miteinander von einem einzigen
PWM-Output Pin dimmen kannst (und du auch nicht genug PWM-Kanäle für
alle LED einzeln hast), dann wird es wohl auf eine Software-PWM
rauslaufen.
Also vergiss die Hardware-PWM und bau selber eine in Software auf. Den
Timer kannst du dann auch gleich für die Eindimm und Aufdimm
Zeitsteuerung benutzen.
Skizze
1 | volatile uint8_t helligkeit;
|
2 |
|
3 | ISR( Timer Overflow ISR )
|
4 | {
|
5 | static uint8_t pwmCount;
|
6 | static uint8_t helligkeitJetzt;
|
7 |
|
8 | pwmCount++;
|
9 | if( pwmCount == Anzahl Helligkeitsstufen )
|
10 | pwmCount = 0;
|
11 |
|
12 | if( pwmCount < helligkeitJetzt)
|
13 | schalte alle LED ein
|
14 | else
|
15 | schalte alle LED aus
|
16 |
|
17 | if( helligkeitJetzt < helligkeit )
|
18 | helligkeitJetzt++;
|
19 | else if( helligkeitJetzt > helligkeit )
|
20 | helligkeitJetzt--;
|
21 | }
|
22 |
|
23 | int main()
|
24 | {
|
25 | ... timer konfigurieren
|
26 | ... Overflow Interrupt freigeben
|
27 |
|
28 | helligkeit = 0;
|
29 |
|
30 | sei();
|
31 |
|
32 | while( 1 )
|
33 | {
|
34 |
|
35 | if( irgendwas )
|
36 | helligkeit = 28;
|
37 |
|
38 | if( irgendwas anderes )
|
39 | helligkeit = 12;
|
40 |
|
41 | ....
|
42 | }
|
43 | }
|
Um die LED auf einen bestimmten Wert zu dimmen, schreibst du den Wert
einfach in die Variable 'helligkeit'. Der letzte Teil in der
Overflow-ISR führt dann die tatsächlich gerade zu realisierende
Helligkeit diesem Wert langsam nach, so dass sich ein aufdimmen,
abdimmen bzw. umdimmen zwischen verschiedenen Helligkeitsstufen ergibt.
Wie schnell das geht, hängt davon ab, wie du den Timer einstellst und
wie oft daher die Overflow-ISR pro Sekunde aufgerufen wird. Sollte das
zu schnell sein, dann kann man diesen Nachführteil auch nur bei jedem
2.ten ISR aufruf oder noch seltener machen.