Hallo Gemeinde,
bin noch nicht so fit im Programmieren.
Controller AT89C2051
Sprache C
Mit Timer 0 und Timer 1 wird eine PWM erzeugt.
Eine externe Schaltung löst Interrupt an Port (P3.2) aus und in der ISR
wird eine LED hoch bzw. runter gedimmt.
In der ISR wird Timer 0 gestartet (somit die PWM gestartet) und auch
wieder gestoppt, sobald die ISR durchlaufen ist.
Auszug ISR:
1 | void Extern0_ISR (void) interrupt 0
|
2 | {
|
3 | TR0 = 1; // Timer 0 wird gestartet
|
4 | PWM_ON^=1; //schaltet bei Eintritt zwischen den IF - Anweisungen hin und her
|
5 |
|
6 | if(PWM_ON) // erhöht die Leuchtkraft bix max
|
7 | {
|
8 | for(pwm_value=255; pwm_value>=1; pwm_value--)
|
9 | {
|
10 | TH1 = pwm_value;
|
11 | delay(500);
|
12 | }
|
13 |
|
14 | TR0 = 0; // Timer 0 wird gestoppt
|
15 | delay(20); // auf was muss ich hier warten????
|
16 | PWM_output=0; // soll dann maximale Leuchtkraft erhalten
|
17 | }
|
18 |
|
19 | if(!(PWM_ON)) // reduziert die Leuchtkraft bis leichtes Dimmen
|
20 | {
|
21 | for(pwm_value=1;pwm_value<=230;pwm_value++)
|
22 | {
|
23 | TH1 = pwm_value;
|
24 | delay(500);
|
25 | }
|
26 | }
|
27 |
|
28 | }
|
Es wird mit jedem externen Signal zwischen den beiden if-Anweisungen
getoggelt.
TH1 ist das TimerRegister, in welches die Pulsweitenwerte geladen
werden.
Die 1.Anweisung erhöht die Leuchtkraft.
Die 2. reduziert wieder die Leuchtkraft.
Das reduzieren der Leuchtkraft in if-Anweisung 2 läuft sauber.
Die 1. if-Anweiung macht nicht immer was sie soll.
Sie erhöht die Leuchtkraft.
Ist die maximal Leuchtkraft erreicht, sollte der PWM_output - Port, nach
abschalten des Timers, aktiv bleiben. doch mal bleibt er es manchmal
nicht.
Der Timer kann abgeschaltet werden, da bei maximaler Leuchtkraft, keine
PWM
gebraucht wird.
Ich habe ein Delay eingebaut, das reduziert die Aussetzer, aber
beseitigt sie nicht vollständig.
Woran liegt das?
Muss ich was berücksichtigen, damit
(Low-Aktiv) immer ausgeführt wird?
Mfg KernoKopp