Hallo!
Ich hab mal sowas gemacht.
Der wirklich relevante Teil ist die Hauptschleife. In den Unterroutinen wird lediglich der Wert für die PWMs nach bestimmten Mustern geändert, um einen Effekt zu erzeugen.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
Grüße
Thomas







Zitieren

Lesezeichen