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