Und, Toschido, schon ausprobiert....?
Zu dem hier:
in Assembler spart man sich das Vergleichen des PWM-Zählers, da macht man nur "inc", weil nach 255 kommt ja eh' automatisch wieder 0 - ausser natürlich, man will ne kleinere Auflösung... aber k.A., ob das in Bascom auch so ist...? - wenn ja, und wenn Du alle 255 Stufen haben willst, dann kannst Du Dir diesen Vergleich auch noch sparen, je kürzer so ne ISR ist, desto besser...
noch ein Update: ich habe mir die von Turi verlinkte Seite noch mal genauer durchgelesen (den Absatz über den Wertebereich), und noch mal nachgedacht: eigentlich ist das ja falsch, mit dem Zähler einfach überlaufen lassen, der sollte schon bei 254 wieder auf 0 gesetzt werden - aus folgendem Grund:
bei mir läuft das so, dass die Bits für die LEDs in einem temp-Byte erst mal gesetzt werden, dann wird verglichen, ist der Zähler kleiner als der LED-Wert, wird weitergesprungen, ansonsten das Bit gelöscht, also LED aus.
Das ist Anfangs auch richtig: hat die LED den Wert "0", dann ist bei PWM-Zähler "0" dieser nicht kleiner als 0, also wird das Bit gelöscht, die LED bleibt gleich aus - ne LED, die den Wert "1" hat, wird beim nächsten Durchgang gelöscht, also ist sie 1 Segment lang an, passt - und so weiter...
nur bei 255 gibt's ein kleines Problem: PWM-Zähler 255 ist *nicht* kleiner als LED-Wert 255, also wird die LED ausgemacht - und erst beim nächsten Durchgang (PWM-Zähler = 0) wieder an - sie ist also immer für ein Segment lang aus, obwohl sie eigentlich *dauernd* an sein sollte (100%).
Daher einfach den Zähler nur bis 254 zählen lassen, dann ist er immer kleiner als der Maximal-Wert 255, die LEDs mit 255 bleiben also an - die mit 254 werden ja bei Zähler 254 gelöscht, anschließend (beim nächsten Aufruf) kommt wieder 0, sie sind also für 1/255 lang aus, passt!
Also: sorry für die Verwirrung, jetzt ist mir auch klar, warum Du nur bis 254 zählst, diese kleine Unstimmigkeit am Ende des PWM-Zyklus (bei mir) hatte ich immer übersehen! (fällt ja auch nicht auf, ob die LED nun 255/255 oder 255/256 leuchtet...

)
EDIT: Noch mal Verwirrung - es muss natürlich bis 255 gehen, das letzte Segment geht ja von 254 bis 255 - also den Zähler dann auf 0 setzen, wenn er 255 erreicht hat - da sind wir beide jeweils einen Tick daneben gelegen, ich einen zu viel, Du einen zu wenig...
Ich finde es Sch***ade, dass es in Assembler nur den Befehl cpse (Compare, Skip if Equal) gibt, aber nicht "Compare, Skip if not Equal" - da könnte man das mit dem Zähler ganz einfach machen, statt
|
Quellcode
|
1
2
3
4
5
|
cpi PWM_Zaehler, 255
brlo weiter
clr PWM_Zaehler
weiter:
|
würde man schreiben (wenn der Befehl cpsne hiesse):
|
Quellcode
|
1
2
|
cpsne PWM_Zaehler, 255
clr PWM_Zaehler
|
und hätte schon wieder eine Zeile/einen Takt gespart - so was in der Art könnte ich öfter gut brauchen, k.A., warum die das nicht implementiert haben....
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Pesi« (14. März 2010, 14:38)