Das Problem, dass man nicht 0% oder 100% Tastgrad erreicht, gibt es bei den meisten PWM-Modulen, zumindest in einigen Konfigurationen. Besonders sind davon aber einfache PWM-Module betroffen, die einen Zähler und ein Vergleichsregister mit der gleichen Breite besitzen. Das Problem ist, dass ein PWM-Zyklus bei einem Zähler mit n Bit Breite 2^n Takte dauert, dabei 2^n + 1 Tastgrade möglich sind, aber mit dem Vergleichsregister wieder nur 2^n Vergleichswerte dargestellt werden können.
Um das mal noch besser zu verdeutlichen, nehmen wir mal ein hypothetisches 2-Bit-PWM-Modul. Ein vollständiger Zyklus des Zählers dauert 4 Takte, 0, 1, 2 und 3. Deshalb gibt es 5 mögliche Tastgrade für den Ausgang - 0, 1, 2, 3 oder 4 von 4 Takten auf high entsprechend 0%, 25%, 50%, 75% und 100% Tastgrad. Wenn das Vergleichsregister auch nur 2 Bit breit ist, können aber nur 4 Vergleichswerte und damit 4 Tastgrade ausgewählt werden - meist ist dann entweder 0% oder 100% nicht möglich und man kann eventuell zwischen beiden Optionen per Konfiguration wählen (das was tauruz als "compare up/down" bezeichnet). Hier kann man sich dann behelfen indem man, wie bereits erwähnt, das PWM-Modul bei dem Grenzfall abschaltet und den Pin manuell ganz normal auf low oder high zieht.
Wenn es das PWM-Modul zulässt - der ATmega168 kann das prinzipiell - kann man auch den Zähler früher auf 0 zurücksetzen, indem man den Zähler so konfiguriert, dass er nicht überläuft sondern bereits beim Erreichen eines bestimmten Wertes zurückgesetzt wird. Das hypothetisches 2-Bit-PWM-Modul hat dann nur noch einen Zyklus von (maximal) 3 Takten und zählt 0, 1, 2 und dann wieder von vorn 0, 1, 2. Nun gibt es nur noch die 4 Tastgrade 0%, 33%, 66% und 100%, also auch eine geringer Auflösung, aber diese können jetzt alle über das 2 Bit Vergleichsregister ausgewählt werden. Ein 8 Bit PWM-Modul zählt nur noch bis (maximal) 254 statt 255 und es kostet natürlich auch ein bisschen Auflösung - 255 statt 256 Stufen.
Ob das jetzt beim ATmega168 funktioniert, kann ich nicht mit Sicherheit sagen - es ist zumindest nicht offensichtlich. Ich habe mir mal das Datenblatt angeschaut und die Timer sind schon relativ komplex. In den beiden PWM-Modi - Fast PWM und Phase Correct PWM - wird das Problem ganz anders gelöst. Es gibt extra Logik, die die beiden Extremfälle gesondert behandelt, und für 0% beziehungsweise 100% Tastgrad sorgt (Im Fast PWM Modus tritt wohl ein Glitch pro Zyklus auf, wenn ich das Datenblatt richtig verstehe). Wenn ich das alles richtig zusammengesetzt habe, führt dies dazu, dass der Wert 0 einem Tastgrad von 0/256 entspricht, 1 entspricht 2/256 (ein Schritt von 2/256), 2 entspricht 3/256 (ein Schritt von 1/256) und in Schritten von 1/256 geht es weiter bis zu 255 mit einem Tastgrad von 256/256. Die Ausgabe ist also nicht ganz linear aber man erreicht 0% und 100%.
Ganz schön weit ausgeholt ... für das Problem von Currymuetze heißt das aber, zumindest in den Modi Fast PWM und Phase Correct PWM des ATmega168 sollte es kein Problem sein, 0% zu erreichen. Wie setzt du den Wert am Ausgang? analogWrite()? Die Bibliotheksfunktionen scheinen auch nochmal Sonderfälle zu behandeln (http://arduino.cc/en/Tutorial/SecretsOfArduinoPWM) - ich habe aber selbst kein Arduino und auch keine Erfahrung mit dem Controller. Der erwähnte Artikel ist zwar von der Arduino-Homepage und ich gehe erstmal davon aus, dass die Leute wirklich wissen, wovon sie schreiben, aber der Artikel passt nicht ganz mit dem, was ich aus dem Datenblatt (http://www.atmel.com/dyn/resou…rod_documents/doc2545.pdf) gelesen habe, zusammen. Im Zweifel also alle Aussagen (von mir, dem Artikel und dem Datenblatt) nochmal kritisch hinterfragen.
Verflixt, du hast ja ATmega1280 gesagt, aber Glück gehabt, die Timer sind zumindest sehr ähnlich wenn nicht sogar identisch (http://www.atmel.com/dyn/resou…rod_documents/doc2549.pdf).