-Ich kann mir die Software PWM-variante noch nicht so richtig vorstellen. Könntest du mir dies mal an einem Beispiel zeigen?
Hm...liesse sich am einfachsten in Assembler zeigen. Ich versuchs mal.
Edit: ich hab was...diesen Fetzen Code hab ich mal geschrieben, um eine RGB-LED über PWM zu dimmen bzw. die Farben zu mischen. Dies sind also drei PWM-Kanäle...
Code:
;Timer konfigurieren, Interrupt aktivieren
PWM: ;Hier springt das Programm hin, wenn der Timer einen Interrupt auslöst
push R16 ;R16 und R17 werden auf den Stapelspeicher gesichert
push R17
in R17, SREG ;Das Statusergister wird eingelesen...
push R17 ;und ebenfalls auf den Stapel gesichert
inc R20 ;Pulslänge hochzählen. Dieses Register stellt den "Zählfortschritt" eines PWM-Zyklus dar
in R16, PortD Portregister einlesen
andi R16, 0b00011111 ;Alle LEDs aus > Grundzustand (UND-Verknüpfung maskiert einzelne Pins aus, da nicht alle Pins verwendet werden)
;PWM_Rot: ;In R21 ist die gewünschte Pulsbreite für den Kanal "Rot" gespeichert. R21 wird jetzt mit R20 (Pulsbreite) verglichen (alle anderen Kanäle
;ebenso)
cp R20, R21 ;Helligkeitswert für Rot erreicht?
brsh PWM_Grun ;Wenn ja, Rot bleibt aus
ldi R17, 0b00100000
eor R16, R17 ;Wenn nicht, Rot ein
PWM_Grun:
cp R20, R22 ;Helligkeitswert für Grün erreicht?
brsh PWM_Blau ;Wenn ja, Grün bleibt aus
ldi R17, 0b01000000
eor R16, R17 ;Wenn nicht, Grün ein
PWM_Blau:
cp R20, R23 ;Helligkeitswert für Blau erreicht?
brsh PWM_Ausgabe ;Wenn ja, Blau bleibt aus
ldi R17, 0b10000000
eor R16, R17 ;Wenn nicht, Blau ein
PWM_Ausgabe:
out PortD, R16 ;Jetzt wird das neue Pinmuster am port ausgegeben, der eigentliche Umschaltvorgang findet jetzt erst statt
pop R17 ;alle gesicherten Register vom Stapel holen und wieder zurückschreiben....
out SREG, R17
pop R17
pop R16
reti ;...und zum Hauptprogramm zurückkehren
Lesezeichen