Übung 7, Mehrkanal-Software-PWM

Wie wir bereits wissen können wir mit dem 16-Bit Timer direkt ein PWM-Signal erzeugen. Allerdings eben nur Eines.
Wir wollen nun versuchen, unter Zuhilfenahme des 8-Bit-Timers eine Softwaregesteuerte PWM mit mehreren Kanälen zu realisieren. Wir lassen es mal bei 4 Kanälen bewenden obwohl natürlich auch mehr möglich wären.
Als Anzeige dienen uns Leuchtdioden, welche wir wie gewohnt an Pin 0 bis Pin 3 von Port B anschliessen wollen, für jeden PWM-Kanal eine separate LED. Je nach Pulsweite des Signals wird nun die entsprechende LED mehr oder weniger hell leuchten.

Die Steuerung der Kanäle erfolgt über die serielle Schnittstelle direkt vom PC aus.
Dazu muss auf dem PC jeweils eine Befehlszeile eingegeben und mit der Enter-Taste abgeschlossen werden. Die Befehlszeile ist wie folgt aufgebaut:

<Kanalnummer (1..4)>:<PWM-Wert (0...255)<Enter>

Beispiel:
1:50
2:120
3:40
4:200

Tipp:
Die vom PC empfangenen Zeichen müssen im AVR RAM gepuffert werden bis ein CR (Hex 0x0d) empfangen wird. Das Terminalprogramm auf dem PC muss so eingestellt sein, dass das CR alleine übertragen wird und kein LF angefügt wird.
Nach dem Empfang des CR wird der Puffer ausgewertet und der gewünschte Kanal angesteuert.
Denk bitte daran, die Kanalnummer im Puffer zu prüfen, oder anders gesagt, es darf nichts passieren, wenn der Benutzer versucht, den Kanal 65 anzusprechen.
Es wäre durchaus auch denkbar, bei fehlerhaften Befehlszeilen eine LED anzusteuern um den Benutzer darauf aufmerksam zu machen, dass er einen Quatsch eingegeben hat.
Die auszugebenden PWM-Werte werden nun für jeden Kanal gespeichert.
In der Hauptschleife des Programms wird jetzt einfach für jeden Kanal geprüft, ob der aktuelle Zählerwert grösser ist als der PWM-Wert für den entsprechenden Kanal. Falls ja wird das zugeordnete Bit des Port B gesetzt.

Versuch doch einfach einmal, das Programm selbst zu entwickeln.
Wenn es überhaupt nicht gelingen sollte dann geht's hier zur Musterlösung mit zugehörigem Makefile.