Hallo!
Meine Methode der Software-PWM sieht so aus:
Code:
'Name:.............Soft-PWM
'Version:..........1.0a
'Datum:............19.02.2009
'Autor:............Thomas Edlinger
'---------------------------------
'Beschreibung: Software-PWM mit 3 Kanälen.
'
' Version 1.0a: Es wird ein weicher Übergang zwischen den einzelnen
' Kanälen erzeugt. Bei entreteten einer High-Low-Flanke
' an PC6 wird die Geschwindigkeit der Übergänge schneller.
'
' Pinbelegung:
' ###########################
' # LED rot: A=PB1 | K=PB0 #
' # LED gelb: A=PA0 | K=PB3 #
' # LED grün: A=PA3 | K=PA2 #
' # Taster: 1=PC7 | 2=PC6 #
' ###########################
$regfile = "m32def.dat"
$crystal = 8000000
'KONFIGURATION PORTS
Config Portb = Output
Config Porta = Output
Config Portc.7 = Output
Config Pinc.6 = Input
Portc.6 = 1
Portb.0 = 0
Portb.3 = 0
Porta.2 = 0
Portc.7 = 0
'ALIAS-ADRESSEN
Led1 Alias Portb.1
Led2 Alias Porta.0
Led3 Alias Porta.3
Taster Alias Pinc.6
'KONFIGURATION ENTPRELLROUTINE
Config Debounce = 50
'KONFIGURATION TIMER
Config Timer0 = Timer , Prescale = 8
Config Timer1 = Timer , Prescale = 1
On Timer1 Timer1_isr
Start Timer1
Enable Timer1
'VARIABLEN
Dim Led1_value As Byte
Dim Led2_value As Byte
Dim Led3_value As Byte
Dim Programm As Byte
Dim Richtung1 As Bit
Dim Richtung2 As Bit
Dim Richtung3 As Bit
Dim A1 As Bit
Dim A2 As Bit
Dim A3 As Bit
A1 = 1
'INTERRUPTS GLOBAL FREIGEBEN
Enable Interrupts
'### HAUPTSCHLEIFE ###
Do
If Led1_value <= Timer0 Then Led1 = 0 Else Led1 = 1
If Led2_value <= Timer0 Then Led2 = 0 Else Led2 = 1
If Led3_value <= Timer0 Then Led3 = 0 Else Led3 = 1
Debounce Taster , 0 , On_taster , Sub
Loop
'### UNTERROUTINEN ###
Timer1_isr:
If Programm = 0 Then
If A1 = 1 Then
If Richtung1 = 0 Then Incr Led1_value Else Decr Led1_value
If Led1_value = 200 Then Richtung1 = 1
If Led1_value = 10 Then Richtung1 = 0
End If
If A2 = 1 Then
If Richtung2 = 0 Then Incr Led2_value Else Decr Led2_value
If Led2_value = 200 Then Richtung2 = 1
If Led2_value = 10 Then Richtung2 = 0
End If
If A3 = 1 Then
If Richtung3 = 0 Then Incr Led3_value Else Decr Led3_value
If Led3_value = 200 Then Richtung3 = 1
If Led3_value = 10 Then Richtung3 = 0
End If
If Led1_value = 90 And Richtung1 = 0 Then A2 = 1
If Led2_value = 90 And Richtung2 = 0 Then A3 = 1
If Led3_value = 90 And Richtung3 = 0 Then A1 = 1
If Led1_value = 10 And Richtung1 = 1 Then A1 = 0
If Led2_value = 10 And Richtung2 = 1 Then A2 = 0
If Led3_value = 10 And Richtung3 = 1 Then A3 = 0
End If
If Programm = 1 Then
If A1 = 1 Then
If Richtung1 = 0 Then Incr Led1_value Else Decr Led1_value
If Led1_value = 200 Then Richtung1 = 1
If Led1_value = 10 Then Richtung1 = 0
End If
If A2 = 1 Then
If Richtung2 = 0 Then Incr Led2_value Else Decr Led2_value
If Led2_value = 200 Then Richtung2 = 1
If Led2_value = 10 Then Richtung2 = 0
End If
If A3 = 1 Then
If Richtung3 = 0 Then Incr Led3_value Else Decr Led3_value
If Led3_value = 200 Then Richtung3 = 1
If Led3_value = 10 Then Richtung3 = 0
End If
If Led1_value = 90 And Richtung1 = 0 Then A2 = 1
If Led2_value = 90 And Richtung2 = 0 Then A3 = 1
If Led3_value = 90 And Richtung3 = 0 Then A1 = 1
If Led1_value = 10 And Richtung1 = 1 Then A1 = 0
If Led2_value = 10 And Richtung2 = 1 Then A2 = 0
If Led3_value = 10 And Richtung3 = 1 Then A3 = 0
Timer1 = 50000
End If
Return
On_taster:
Incr Programm
If Programm = 2 Then Programm = 0
Return
End
Interessant ist nur die Do-Loop-Schleife. Der restliche Programmteil dient nur zum ändern der Helligkeitswerte.
MfG
Thomas
Lesezeichen