Im Endeffekt rufst du mit GoSub Fading ja nur das Programm auf.
Lass das GoSub weg und pack das Unterprogramm direkt dahin wo dein GoSub stand. Und in der Timer ISR setzt du nur das Flag, welches du im Mainprogramm auswertest.
Das sieht dann etwa so aus:
Das ist jetzt dein alter Code ohne das "Select Case" also nicht wundernCode:'######### '## EDT ## '######### '--------- 'TinyRGB 'V1.0 '04.03.2012 '--------- 'schaltplan_tinyrgb_v1_0.dsn '--------- 'AtTiny13 @ 9,6 Mhz internal RC-Clock 'Jp1 gesetzt: Modus 0 aktiv 'Jp2 gesetzt: Modus 1 aktiv 'Modus 0: Farbwechsel über alle drei Grundfarben (R-G-B) 'Modus 1: Effekt-Farbwechsel '--------- $regfile = "attiny13.dat" $crystal = 9600000 '9,6 Mhz $hwstack = 8 $swstack = 4 $framesize = 10 'CONFIG IN/OUT Config Portb.0 = Output 'Blau Config Portb.1 = Output 'Grün Config Portb.2 = Output 'Rot Config Pinb.3 = Input 'Jp1 Config Pinb.4 = Input 'Jp2 Portb.3 = 1 'Pullup Jp1 einschalten Portb.4 = 1 'Pullup Jp2 einschalten 'ALIAS R Alias Portb.2 G Alias Portb.1 B Alias Portb.0 Jp1 Alias Pinb.3 Jp2 Alias Pinb.4 'CONFIG TIMER Config Timer0 = Timer , Prescale = 1 On Timer0 Isr_timer0 Enable Timer0 Start Timer0 'VARIABLEN Dim Pwm_count As Byte 'PWM-Variable Dim C_r As Byte 'Channel Rot Dim C_g As Byte 'Channel Grün Dim C_b As Byte 'Channel Blau Dim Div As Word 'Teilervariable Dim State As Byte 'Status Dim Modus As Bit 'Modus Dim Timerflag As Bit 'Flag für die Timer ISR 'INTERRUPTS EIN Enable Interrupts '### HAUPTSCHLEIFE ### Do 'Vergleich Channel kleiner PWM: If C_r < Pwm_count Then R = 1 Else R = 0 If C_g < Pwm_count Then G = 1 Else G = 0 If C_b < Pwm_count Then B = 1 Else B = 0 'Jumperabfrage: If Jp1 = 0 Then Modus = 0 If Jp2 = 0 Then Modus = 1 If Timerflag = 1 Then If Pwm_count = 255 Then Pwm_count = 0 'PWM-Variable bei 255 resetten Incr Pwm_count 'PWM-Variable erhöhen If Div = 10000 Then 'Teilervariable bei 10000 resetten Div = 0 If Modus = 0 Then Select Case State Case 0 : Incr C_r Decr C_b If C_r = 255 Then State = 1 Case 1 : Decr C_r Incr C_g If C_g = 255 Then State = 2 Case 2 : Decr C_g Incr C_b If C_b = 255 Then State = 0 End Select End If If Modus = 1 Then Select Case State Case 0 : If C_r < 255 Then Incr C_r If C_r = 255 Then State = 1 Case 1 : If C_b < 255 Then Incr C_b If C_b = 255 Then State = 2 Case 2 : If C_g < 255 Then Incr C_g If C_g = 255 Then State = 3 Case 3 : If C_r > 1 Then Decr C_r If C_g > 50 Then Decr C_g If C_b > 1 Then Decr C_b If C_r = 1 Then State = 4 Case 4 : If C_g < 255 Then Incr C_g If C_b < 255 Then Incr C_b If C_b = 255 Then State = 5 Case 5 : If C_g > 1 Then Decr C_g If C_b > 1 Then Decr C_b If C_g = 1 Then State = 0 End Select End If End If Incr Div 'Teilervariable erhöhen Timerflag = 0 'Flag für die Timer ISR zurücksetzen End If Loop 'ISR TIMER0 Isr_timer0: Timerflag = 1 Return![]()
So sparst du dir auch das Unterprogramm, weil das alles im Hauptprogramm ausgeführt wird (statt Gosub schreibst du da halt den Code hin).
Edit: Hab einen aktuellen Code eingefügt. So in etwa meinte ich das. Musst du mal gucken ob er für dich in Ordnung ist![]()







Zitieren

Lesezeichen