Reinhard Sedlacek schrieb:
> Ich kann es nur mit for-Schleifen.
??? Hmmh...
Für eine Soft-PWM braucht man einen Zähler und eine Variable, in der der
PWM-Wert drinsteht.
volatile unsigned char nPwmCt, nPwmVar;
void SoftPwm (void)
{
if (!nPwmVar) Ausgang = 0;
else
{
if (nPwmVar >= nPwmCt) Ausgang = 1; else Ausgang = 0;
}
nPwmCt++;
_delay(xxx); //Optionale Einstellung der Frequenz
}
Das in der Hauptprogrammschleife ausgeführt, ergibt, je nachdem was noch
alles gemacht wird, einen mehr oder weniger großen Jitter. Zum Dimmen
einer LED ist das völlig egal. Auch die Frequenz spielt keine große
Rolle, sofern sie so hoch ist, daß die LED nicht flackert. Die Frequenz
ist aber weitestgehend stabil.
In einem Timer-Interrupt wird dieser Jitter deutlich kleiner.
Dazu packt man einfach obige Funktion in die Timer-ISR. Ohne das Delay.
Das hat da nichts zu suchen. Und je nach Konfiguration des Timers, wird
die ISR entsprechend häufig aufgerufen. Damit wird die Frequenz
eingestellt.
Alles völlig unabhängig vom verwendeten Controller.
Für eine Jitter-freie PWM braucht man allerdings die Hardware-Variante
mit einem Timer. Jedoch entzieht es sich meiner Kenntnis ob der
> 8051 AN2131...
das kann. Die alten Atmegas können das teilweise, die neueren mit allen
Timern. Das ist vom Controller und seinen Möglichkeiten sowie den
spezifischen Registereinstellungen abhängig.
mfg.