ich habe es versuchsweise mit goto gemacht - aber STOP ist natürlich viel besser

Programm ist noch nicht ganz fertig aber dieser Teil funktioniert in sich.
STOP habe ich eingeramt

'=======================================
'=======================================
STOP
'=======================================
'=======================================

Code:
'RGB - LED - Leiste über AT-Mega8
'Tobias Blome - 12.01.2008
'
'-------------------------------------------------------------------------------
'INFO´s


'PWM_Wert = Sollwert für Software PWM

'RC5 Eingang über Pin5 / PD3

'Led Rot  = Portb.1 = 1
'Led Grün = Portb.2 = 1
'Led Blau = Portb.3 = 1

'Auswahl = 1 -> Rot+Grün
'Auswahl = 2 -> Grün+Blau
'Auswahl = 3 -> Blau+Rot

'-------------------------------------------------------------------------------
'Version 0.04
'  -RS232 ok
'  -RC5 ok
'  -Farbe wechseln durch
'  -jede Farbe doppelt!!!!!!!!!!!!!!!!

'Version 0.06
'  - >251 und <4 wird die Auswahl umgeschaltet

'Version 0.07
'  -Auswahl von 3 auf 6 erhöht
'  -Farben sortiert
'
'Version 0.09
'  -GoSub Anweisung für verschiedene Programme
'
'Version 1.10
'  -Lauflicht
'
'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "m8def.dat"                                      'AT-Mega32
$crystal = 8000000                                          'Quarz: 8 MHz intern
$baud = 9600                                                'Baudrate definieren

'-------------------------------------------------------------------------------
'Ein- Ausgänge:
Ddrb = &B1111111                                            '1 Ausgang, 0 Eingang = Pin PB7-0

'-------------------------------------------------------------------------------
'Timer0 = 8 Bit
'wird für RC5 Auswertung benötigt!!!
Config Rc5 = Pind.3                                         'Timer0 in Benutzung!!!
Portd.3 = 1

'Timer1 = 16 Bit
Config Timer1 = Timer , Prescale = 1024
On Timer1 Timer1_irq
Const Timervorgabe1 = 57722                                 'also ca 1 mal pro Sekunde!!!
Enable Timer1
Enable Interrupts

'Timer2 = 8 Bit SOFTWARE - PWM
Config Timer2 = Timer , Prescale = 8                        'Teiler
Enable Timer2
On Timer2 Pwm_prog                                          'timer einschalten
Const Timervorgabe2 = 200                                   'also ca 18200 mal pro Sekunde!!!

Enable Interrupts
'-------------------------------------------------------------------------------
'Variablen:
'-------------------------------------------------------------------------------
Dim Address As Byte , Command As Byte
Dim Flag As Bit

'PWM
Dim Z As Word
Dim Pwm_wert As Byte                                        'Sollwert
Dim Ri As Byte                                              ' Hilfsregister

Dim Programm As Byte                                        'Lichtprogramm wählen

Dim Auswahl As Byte                                         'Wert 1-3 um die PWM auf die LED´s aufzuteilen

Dim Updown As Bit                                           'Merker für automatisch hoch und runter dimmen
Dim Updownm As Bit

Dim T2 As Bit                                               'Timer2 deaktiviren

'Tasten festlegen
Up Alias 32                                                 'Prog.Bezeichnung ALIAS Real Taste
Down Alias 33
Progplus Alias 16                                           'Lichtprogramm wählen
Progminus Alias 17
'-------------------------------------------------------------------------------
'Vor Programmstart:
Flag = 1                                                    'Merker für PWM
Pwm_wert = 128                                              'PWM-Wert 0-255 => Hälfte 127,5
Auswahl = 1                                                 'LED Auswahl
Updown = 1                                                  'Merker um vor zurück zu änden
Updownm = 0
Programm = 1                                                'Lichtprogramm wählen
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Hauptprogramm Do...Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------


Do

'Rc5 Code einlesen:
Getrc5(address , Command)
   If Flag = 1 Then

  'Print "wait for command"
     Flag = 0
   End If
   If Address <> 255 Then
     Reset Command.7                                        ' reset toggle bit

     ''Print "Address: " ; Address
     'Print "Command: " ; Command
     Flag = 1
   End If

'-------------------------------------------------------------------------------
'RC5 Code umsetzen:

'Lichtprogramm Wählen
If Command = Progplus Then
   If Programm = 6 Then
   Programm = 1
   Else
   Incr Programm
   End If
Waitms 200
End If

If Command = Progminus Then
   If Programm = 1 Then
   Programm = 6
   Else
   Decr Programm
   End If
Waitms 200
End If




'LED-PAAR auswählen (Handbetrieb)
'Auswahl 1 über FB LED Rot und Grün
If Command = 1 Then
Auswahl = 1
End If

'Auswahl 2 über FB LED Grün und Blau
If Command = 2 Then
Auswahl = 2
End If

'Auswahl 3 über FB LED Blau und Rot
If Command = 3 Then
Auswahl = 3
End If

'nicht benötigte 3. LED-Farbe bei Auswahl ausschalten
If Auswahl = 1 Then                                         'Rot und Grün -> Blau aus
Portb.3 = 0
End If

If Auswahl = 2 Then                                         'Grün und Blau -> Rot aus
Portb.1 = 0
End If

If Auswahl = 3 Then                                         'Blau und Rot -> Grün aus
Portb.2 = 0
End If





'Lichtprogrammauswahl
If Programm = 1 Then
Gosub Regenbogen
End If
'=======================================
'=======================================
'=======================================
If Programm = 2 Then
'Stop Timer2
T2 = 0
Gosub Lauflicht
Else
T2 = 1
End If
'=======================================
'=======================================
'=======================================

If Programm = 3 Then
Gosub Doppelblitz:
End If


Loop

End



'-------------------------------------------------------------------------------
'Sprungmarken
'-------------------------------------------------------------------------------

'_______________________________________________________________________________
Doppelblitz:
'_______________________________________________________________________________
'ROT
Portb.3 = 0                                                 'BLAU AUS!!!
Auswahl = 1                                                 'Auswahl = 1 -> Rot+Grün
Pwm_wert = 0                                                'PWM-Wert 0-255 => Hälfte 127,5
Waitms 50

'Geld
Portb.3 = 0                                                 'BLAU AUS!!!
Auswahl = 1                                                 'Auswahl = 1 -> Rot+Grün
Pwm_wert = 128                                              'PWM-Wert 0-255 => Hälfte 127,5
Waitms 50

'GRÜN
Auswahl = 1                                                 'Auswahl = 1 -> Rot+Grün
Pwm_wert = 255                                              'PWM-Wert 0-255 => Hälfte 127,5
Waitms 50

'BLAU
Auswahl = 2                                                 'Auswahl = 1 -> Rot+Grün
Pwm_wert = 0                                                'PWM-Wert 0-255 => Hälfte 127,5
Waitms 50
Return

'_______________________________________________________________________________
Lauflicht:
'_______________________________________________________________________________
'ROT
Portb.3 = 0                                                 'BLAU AUS!!!
Auswahl = 1                                                 'Auswahl = 1 -> Rot+Grün
Pwm_wert = 0                                                'PWM-Wert 0-255 => Hälfte 127,5
Waitms 50

'GRÜN
Auswahl = 1                                                 'Auswahl = 1 -> Rot+Grün
Pwm_wert = 255                                              'PWM-Wert 0-255 => Hälfte 127,5
Waitms 50

'BLAU
Auswahl = 2                                                 'Auswahl = 1 -> Rot+Grün
Pwm_wert = 0                                                'PWM-Wert 0-255 => Hälfte 127,5
Waitms 50


Return


'_______________________________________________________________________________
Regenbogen:
'=======================================
'=======================================
'=======================================
If T2 = 0 Then
Goto Sprung
End If
'=======================================
'=======================================
'=======================================

'_______________________________________________________________________________
'PWM-Wert über Taste UP & DOWN hoch runter
'PWM-Wert wird auf 0-255 begrenzt
'Wenn das Ende einer Richtung erreicht ist, wird automatisch in die andere Richtung gezählt (Merker: UpDown)
If Command = Up And Pwm_wert < 251 And Updown = 1 Then
Pwm_wert = Pwm_wert + 5
End If

If Command = Down And Pwm_wert > 4 And Updown = 1 Then
Pwm_wert = Pwm_wert - 5
End If

'---
If Command = Down And Pwm_wert < 251 And Updown = 0 Then
Pwm_wert = Pwm_wert + 5
End If

If Command = Up And Pwm_wert > 4 And Updown = 0 Then
Pwm_wert = Pwm_wert - 5
End If

'--------Umschaltung Updown 0/1  (Hilfsmerker: UpDownM)
If Pwm_wert < 4 And Updownm = 1 Then
Toggle Updown
Updownm = 0
End If

If Pwm_wert > 251 And Updownm = 1 Then
Toggle Updown
Updownm = 0
End If


If Pwm_wert < 15 Or Pwm_wert > 240 And Updownm = 0 Then     'Hilfsmerker bei 200 zurücksetzen
Updownm = 1
End If

'-----------
'-------------------------------------------------------------------------------
'Farbübergänge: zwischen den LED Paaren wechseln
'wenn Taste für LED´s hochdimmen gedrückt -> muss bei 251 und bei 4 umgeschaltet werden
If Command = Up And Pwm_wert > 251 Then
Pwm_wert = 255                                              'falls er sich verzählt!!!
   If Auswahl = 6 Then
   Auswahl = 1
   Else
   Auswahl = Auswahl + 1
   End If
End If

If Command = Up And Pwm_wert < 4 Then
Pwm_wert = 0                                                'falls er sich verzählt!!!
   If Auswahl = 6 Then
   Auswahl = 1
   Else
   Auswahl = Auswahl + 1
   End If
End If

'---
'wenn Taste für LED´s runterdimmen gedrückt -> muss bei 251 und bei 4 umgeschaltet werden
If Command = Down And Pwm_wert < 4 Then
Pwm_wert = 0                                                'falls er sich verzählt!!!
   If Auswahl = 1 Then
   Auswahl = 6
   Else
   Auswahl = Auswahl - 1
   End If
End If

If Command = Down And Pwm_wert > 251 Then
Pwm_wert = 255                                              'falls er sich verzählt!!!
   If Auswahl = 1 Then
   Auswahl = 6
   Else
   Auswahl = Auswahl - 1
   End If
End If

Sprung:

Return


'-------------------------------------------------------------------------------
'TIMER SPRUNGMARKEN:
Timer1_irq:
Timer1 = Timervorgabe1

'Print "Command: " ; Command ; " RC5 von FB"
'Print "PWM_Wert: " ; Pwm_wert ; " Sollwert"
'Print "Auswahl: " ; Auswahl ; " Wert 1-3 um die PWM auf die LED´s aufzuteilen"
'Print "UpDown: " ; Updown ; " Merker für automatisch hoch und runter dimmen"
'Print "UpDownM: " ; Updownm
'Print "Programm: " ; Programm
'Print " "



Return


Pwm_prog:
Timer2 = Timervorgabe2
'Funktion:
'Wenn der Zähler (z) =0 ist, dann  beginnt ein neuer PWM Zyklus:
'Der Zähler (z) wird auf 255 gesetzt weil ein PWM Zyklus 255 Takte hat!
'In das Hilfsregister (Ri) wird der Sollwert (PWM_Wert) geladen
'der Zähler wird -1 gezählt
'wenn Ri z.B. = 50 dann ist Ri größer 0 und der Ausgang wird eingeschaltet Ri wird -1 gerechnet
'beim nächsten Durchlauf wird der Zähler wieder um 1 runtergezählt. Ri ist 50-1 also 49. 49ist größer als 0 und der Ausgang wird eingeschaltet
'wenn irgendwann Ri = 0 ist wird der Ausgang ausgeschaltet. Und das passiert solange (soviele Takte)bis der Zähler (Z) auf 0 heruntegezählt wurde
'wenn der Zähler (Z) = 0 ist ist ein PWM Zyklus zuende, der Zähler wird wieder auf 255 gesetzt und alles beginnt von vorne
'bei einem Sollwert von 50 (Ri=50) wird der Ausgang also 50 Takte EIN geschaltet und 205 Takte AUS geschaltet;
'das entspricht bei 5V im Mittel ca. 1V


    If Z = 0 Then                                           'Z = Zähler für Verhältnisstakte
    Z = 255                                                 'Zähler (Z) auf 255 setzen
    Ri = Pwm_wert                                           'Sollwert (PWM_Wert) in Hilfregister (Ri) schreiben
    End If
                                                             'Zähler runterzählen
    Z = Z - 1



'PWM UMSETZUNG ANFANG
    If Ri > 0 Then                                          'wenn Hilfsregister (Ri) größer 0, dann

'PWM auf die LED-Paare übertragen
      If Auswahl = 1 Then                                   'Auswahl der LED Farben
    Portb.2 = 1                                             'GRÜN PWM-Ausgang einschalten
    Portb.1 = 0                                             'ROT PWM-Ausgang ausschalten
      End If

      If Auswahl = 2 Then                                   'Auswahl der LED Farben
    Portb.2 = 1                                             'GRÜN PWM-Ausgang einschalten
    Portb.3 = 0                                             'BLAU
      End If

      If Auswahl = 3 Then                                   'Auswahl der LED Farben
    Portb.1 = 1                                             'ROT PWM-Ausgang einschalten
    Portb.3 = 0                                             'BLAU
      End If

      If Auswahl = 4 Then                                   'Auswahl der LED Farben
    Portb.1 = 1                                             'ROT PWM-Ausgang einschalten
    Portb.2 = 0                                             'GRÜN PWM-Ausgang ausschalten
      End If

      If Auswahl = 5 Then                                   'Auswahl der LED Farben
    Portb.3 = 1                                             'BLAU PWM-Ausgang einschalten
    Portb.2 = 0                                             'GRÜN
      End If

      If Auswahl = 6 Then                                   'Auswahl der LED Farben
    Portb.3 = 1                                             'BLAU PWM-Ausgang einschalten
    Portb.1 = 0                                             'ROT
      End If
    Else                                                    'sonst
'---
      If Auswahl = 1 Then
    Portb.2 = 0                                             'GRÜN  PWM-Ausgang ausschalten
    Portb.1 = 1                                             'ROT PWM-Ausgang einschalten
      End If

      If Auswahl = 2 Then
    Portb.2 = 0                                             'GRÜN
    Portb.3 = 1                                             'BLAU
      End If

      If Auswahl = 3 Then
    Portb.1 = 0                                             'ROT
    Portb.3 = 1                                             'BLAU
      End If

      If Auswahl = 4 Then
    Portb.1 = 0                                             'ROT  PWM-Ausgang ausschalten
    Portb.2 = 1                                             'GRÜN PWM-Ausgang einschalten
      End If

      If Auswahl = 5 Then
    Portb.3 = 0                                             'BLAU
    Portb.2 = 1                                             'GRÜN
      End If

      If Auswahl = 6 Then
    Portb.3 = 0                                             'BLAU
    Portb.1 = 1                                             'ROT
      End If

    End If
'PWM UMSETZUNG ENDE

    Ri = Ri - 1
    If Ri = 255 Then Ri = 0

Return



'===============================================================================
'Pinbelegung µC     RGB LED Leiste
'===============================================================================
'    AT MEGA 8
'    +---U---+
'PC6 +1    28+ PC5
'PD0 +2    27+ PC4
'PD1 +3    26+ PC3
'PD2 +4    25+ PC2
'PD3 +5    24+ PC1
'PD4 +6    23+ PC0
'Vcc +7    22+ GND
'GND +8    21+ AREF
'PB6 +9    20+ AVCC
'PB7 +10   19+ PB5  /PROG
'PD5 +11   18+ PB4  /PROG
'PD6 +12   17+ PB3  /PROG
'PD7 +13   16+ PB2
'PB0 + 14 15 + Pb1
'    +-------+


'PB0 =
'PB1 = Software PWM LED ROT
'PB2 = Software PWM LED GRÜN
'PB3 = Software PWM LED BLAU
'PB4 =
'PB5 =
'PB6 =
'PB7 =
'PC0 =
'PC1 =
'PC2 =
'PC3 =
'PC4 =
'PC5 =
'PC6 = RESET
'PC7 =
'PD0 =
'PD1 =
'PD2 =
'PD3 = IR - RC5 Eingang
'PD4 =
'PD5 =
'PD6 =
'PD7 =