Im wesentlichen ist das von 3 Faktoren abhängig.12 Software-PWMs (8 Bit) haben. Ausserdem soll der Mega8 noch als TWI-Slave arbeiten, um die PWM-Werte entgegenzunehmen
1. Von der Taktfrequenz des Controllers, die ich hier schon mal auf 16MHz anheben würde.
2. Von der PWM Frequenz.
3. Von möglichst wenig Code in den Interruptroutinen.
Bei 16MHz und einem Taktteiler von 8 komm ich auf eine PWM Frequenz von 30 Hz. Der Controller kann dabei 2048 Takte (~Kommandos) zwischen 2 Interrupts ausführen.
Bei 16MHz und einem Taktteiler von 1 komm ich auf eine PWM Frequenz von 244 Hz. Der Controller kann dabei 256 Takte (~Kommandos) zwischen 2 Interrupts ausführen. Das dürfte vermutlich zu wenig für eine stabile Funktion sein.
Die Teilerfaktoren /2 und /4 lassen sich im Prescaler nicht einstellen.
Mein Vorschlag wäre die 16MHz Taktfrequenz extern zu teilen (/2, /4) und die geteilte Frequenz auf den T0 Eingang zu geben. Dieser Takteingang taktet dann den Timer0 mit Prescaler 1, der dann als PWM Quelle dient.
Ich würd diesen Timer mit Overflow Interrupt laufen lassen.
In diesem Overflow Interrupt wird ein weiterer Zähler hochgezählt der mit den gewünschten PWM Registern verglichen wird und je nach Zählerstand die 12 Ausgänge aus-, bzw einschaltet.
Bei einem Teilerfaktor von 4 krieg ich dann 1024 Prozessortakte bevor ein Overflow Interrupt ausgeführt wird, als PWM Frequenz krieg ich dabei 60Hz raus und das sollte passen.
Eventuell kann man auch den Timer 1 als Taktteiler (OC1A mit CTC ?)vergewaltigen, dann könntest Du ohne externe Bauteile auskommen.
Wieviel Prozessorleistung dein TWI noch schluckt kann ich nicht sagen.
Kannst ja deinen fertigen Code mal über den Simulator austesten.
Ein möglicher Lösungsansatz wäre auch noch die PWM Werte nach ihrem Wert zu sortieren und sie in aufsteigender Reihenfolge mit dem Comparematch Register des Timers 1 zu vergleichen.
Liegen die Werte allerdings sehr nahe beieinander oder sind sie gleich, wird es auch hier zu Problemen kommen.
Lesezeichen