Wenn ich halbwegs richtig verstehe, was dein Code machen soll, dann willst du abhängig von der Umgebungshelligkeit deine LED in 50-ms-Schritten runter oder hochdimmen?
Dein Code ist irgendwie unsinnig. Der Ausgangswert von Pwmval ist 50 - Dein Programm müsste jeweils dreimal incrementieren und dann einmal decrementieren. Nach ca. 10 Sekunden müsste 100 erreicht sein, dann müsste das Programm jeweils zweimal incrementieren und einmal decrementieren bis nach 12 Sekunden der Wert 180 erreicht ist. Dann wird je einmal incrementiert und einmal decrementiert - so dass nichts mehr passiert.
Ich nehme an, dass du an irgendeiner anderen Stelle den Phototransistor ausliest und damit feststellst, ob es dunkel, normal oder taghell ist. Abhängig davon soll dann die LED auf 25%, 50% oder 100% hoch oder runter dimmen... also sie soll nicht schlagartig die Helligkeit ändern, sondern in 50-ms-Schritten rauf oder runter dimmen...?
Ich würd das mal in dieser Art probieren:
Code:
Pwmsoll = 128 //testweise mal 50%
Compare1a = 0
Do
If Compare1a < Pwmsoll : Incr Compare1a //falls Incr nicht auf das Regsiter anwendbar ist, müsste es mit Compare1a = Compare1a + 1 gehen
Else If Compare1a > Pwmsoll : Decr Compare1a // dito Compare1a = Compare1a - 1
End IF
Waitms 50
// hier ggf. Phototransistor auslesen und das neue Pwmsoll bestimmen, ungefähr so:
If Photo < 300 : Pwmsoll = 50
Else If Photo < 750 : Pwmsoll = 128
Else : Pwmsoll = 256
Loop
So müsste die LED von dunkel auf halbe Helligkeit hochdimmen - innerhalb von ca. 6,4 Sekunden.
Ich kenn mich mit Bascom nicht aus, insofern ist das nur pseudocode.
Noch einfacher wäre es, wenn du den Wert für Comparea1 aus dem Inputwert des Phototransistors direkt berechnest. Dann kannst du dir das Ganze hier sparen
(Pwmcompare = 1/3 Wurzel aus Photo + 0,17 Photo + 25 oder sowas.... vielleicht ist es auch viel einfacher - linear oder so. Da müsstest du halt mal den Phototransistor ausmessen, was der für Werte liefert.)
Lesezeichen