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.
|