Das hier:
Kannst du z.B. so umändern:Code:If Modus = 0 Then If State = 0 Then Incr C_r Decr C_b If C_r = 255 Then State = 1 End If If State = 1 Then Decr C_r Incr C_g If C_g = 255 Then State = 2 End If If State = 2 Then Decr C_g Incr C_b If C_b = 255 Then State = 0 End If End If If Modus = 1 Then If State = 0 Then If C_r < 255 Then Incr C_r If C_r = 255 Then State = 1 End If If State = 1 Then If C_b < 255 Then Incr C_b If C_b = 255 Then State = 2 End If If State = 2 Then If C_g < 255 Then Incr C_g If C_g = 255 Then State = 3 End If If State = 3 Then 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 End If If State = 4 Then If C_g < 255 Then Incr C_g If C_b < 255 Then Incr C_b If C_b = 255 Then State = 5 End If If State = 5 Then If C_g > 1 Then Decr C_g If C_b > 1 Then Decr C_b If C_g = 1 Then State = 0 End If End If
Und für Modus = 1 ersetzt du die ganzen If-Abfragen ebenfalls durch Select-Case. Ob es das Programm nun wirklich kleiner macht weiß ich nicht aber auf jedenfall wird es übersichtlicher.Code: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
Den Rest wüsste ich nun nicht wie man den noch optimieren kann. Das Hauptprogramm beinhaltet nicht soviel Code, wobei ich die ISR vom Timer noch schlanker machen würde. In etwa so:
Und dann im Hauptprogramm:Code:ISR_Timer0: Interruptflag_Timer0 = 1 Return
Dies machst du aus dem Grund, weil man eine ISR möglichst kurz halten sollte (gut in deinem Programm macht das nun nichts aus, weil du nur eine ISR hast).Code:Do If Interruptflag_Timer0 = 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 Gosub Fading 'Springe bei 10000 zu Fading End If Incr Div 'Teilervariable erhöhen End if Loop End
Weil wenn du mehrere Interruptquellen in einem Programm hast können eventuell Interrupts verschluckt werden, weil deine ISRs zu lang sind.
Deswegen mach ich das immer so das ich in den ISRs (wenn möglich) nur ein Bit setze, weil das schön schnell geht.
Wenn du in ISRs sowas wie "Print" Befehle o.ä. reinknallst kann es gut sein, dass der Controller beim ausführen der ISR einen anderen Interrupt ignoriert, weil so ein "Print" Befehl richtig viel Zeit braucht.
So würde ich das optimieren....ich weiß allerdings nicht in wie weit das eine Optimierung ist, weil ich selber nicht so der eingefleischte Programmierer bin
Aber das Select-Case macht das Programm auf jedenfall überschaubarer.
Edit: Hab gerade gesehen, dass du von der ISR in ein Unterprogramm springst.....versuch sowas zu vermeiden
Wie gesagt nutze die Methode wo du in den ISR einfach nur Bits setzt und die Auswertung macht dann das Hauptprogramm.







Zitieren
Lesezeichen