Hi,

da du die Pulsbreite ändern willst, geht es in die Richtung, ein Software PWM auf Basis eines Interuptes zu erzeugen. Die Timer haben ja Vorteiler, die aber nur eine recht grobe Aufteilung bieten.

der Plan lautet also, einen Compare Interrupt herzunehmen. Da gibt es verschiedene Modi, wie sich die Timer verhalten (siehe Datenblatt) . Es bietet sich der CTC (clear Timer on Comparematch) an. Dabei wird der Timer genullt, wenn ein Comparematch eintritt. Der Wert, der dabei den Punkt festlegt kann auch eines der OCRA oder B Register sein. Damit kannst du also die Periodendauer beeinflussen.

In der Interrupt Service Routine zählst du eine Variable hoch, die du gegen einen Wert vergleichst den, du über deine Taster beeinflussen kannst. Dieser Wert stellt deinen Duty Cycle dar, also wann ein Pin seinen logischen Zustand ändert. Welcher Pin das ist liegt bei dir, da es ja ein Software PWM ist.

Betrachte meine Hilfestellung in erster Linie als eine Sammlung von Schlüsselwörtern, über die du dich schlau machen kannst.

"Duty Cycle"
"Software PWM / Hardware PWM"
"Clear Timer on Comparematch"
"Interrupt on Comparematch"

Um das Datenblatt wirst du nicht herum kommen auf Dauer. Aber keine Sorge wenn du siehts, dass es mehr als 300 Seiten hat. Die musst du nicht alles lesen. Immer nur den Teil den du brauchst, aber das siehst du in der Inhaltsangabe.

UND:
dein Code ist kein Assembler! Das sieht mir nach C aus?

Gruß,
The Man