so, das Programm läuft soweit.
Als nur 2 Ausgänge geschaltet werden konnten lief es flüssig - jetzt mit 12 Ausgängen ist es etwas hackelig...also falls jemand noch optimierungsvorschläge hat - gerne!



Code:
'Konfiguration µC:
$regfile = "m8def.dat"                                      'AT-Mega8
$crystal = 16000000                                         'Quarz: 16 MHz
$baud = 38400                                               'Baudrate definieren

'-------------------------------------------------------------------------------
'Ein- Ausgänge:
Ddrb = &B11111111                                           '1 Ausgang, 0 Eingang => Pin PB7-0 als Ausgang
Ddrc = &B11111111                                           '1 Ausgang, 0 Eingang => Pin PB7-0 als Ausgang

Portb = 0
Portc = 0

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

'16Bit Timer:
Config Timer1 = Timer , Prescale = 256
On Timer1 Timer1_irq
Const Timervorgabe = 64911                                  '100 mal pro Sekunde
Enable Timer1
Enable Interrupts


'-------------------------------------------------------------------------------
'Variablen:
'-------------------------------------------------------------------------------
Dim Address As Byte , Command As Byte , Command_old As Bit , Flag As Bit       'RC5

'Taste lange gedrückt
Dim Taste_lang As Word
'Taste 1-6 auf der FB
Dim T1 As Word , T2 As Word , T3 As Word , T4 As Word , T5 As Word , T6 As Word
'Lampe 1-12
Dim L1s As Bit , L2s As Bit , L3s As Bit , L4s As Bit , L5s As Bit , L6s As Bit , L7s As Bit , L8s As Bit , L9s As Bit , L10s As Bit , L11s As Bit , L12s As Bit ,

Dim Empfang As Bit                                          'ist 0 wenn kein empfang  also 255 von address

Dim Sek As Byte                                             'wenn = 100 dann 1 sec um

'Lampen festlegen
L1 Alias Portc.5
L2 Alias Portc.4
L3 Alias Portc.3
L4 Alias Portc.2
L5 Alias Portc.1
L6 Alias Portc.0
L7 Alias Portb.5
L8 Alias Portb.4
L9 Alias Portb.3
L10 Alias Portb.2
L11 Alias Portb.1
L12 Alias Portb.0

'-------------------------------------------------------------------------------
'Vor Programmstart:

'alle Lampen aus:
L1 = 0
L2 = 0
L3 = 0
L4 = 0
L5 = 0
L6 = 0
L7 = 0
L8 = 0
L9 = 0
L10 = 0
L11 = 0
L12 = 0


'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Hauptprogramm Do...Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Print "Programm Start 38400 Baud..."
Do


'-------------------------------------------------------------------------------
'Rc5 Code einlesen:
Getrc5(address , Command)
    'Print "Address: " ; Address
     'Print "Command: " ; Command



'-------------------------------------------------------------------------------
'RC5 Code umsetzen:
   If Address = 255 Then                                    'also kein Signal
      Empfang = 0
   End If


   If Address = 0 Then                                      'Adresse 0=TV FB
         If Empfang = 0 Then
          Empfang = 1
          Timer1 = Timervorgabe                             'Timer1 zurücksetzen, damit erst bei Tastendruck gezählt wird
         'Print "timerzurück"
         End If

          If Command.7 = Command_old Then
          Incr Taste_lang
          Else
          Taste_lang = 0                                    'Variable zurücksetzen
          Command_old = Command.7
          End If

           'Print "Command.7: " ; Command.7
           'Print "Taste_lang: " ; Taste_lang

           'Command = Command And &B01111111                    'reset toggle bit
           Reset Command.7                                  'reset toggle bit

        Select Case Command
           Case 0 : Print "CASE = 0"
           Case 1 : Incr T1
                     Goto Lampe1
           Case 2 : Incr T2
                     Goto Lampe3
           Case 3 : Incr T3
                     Goto Lampe5
           Case 4 : Incr T4
                     Goto Lampe7
           Case 5 : Incr T5
                     Goto Lampe9
           Case 6 : Incr T6
                     Goto Lampe11
           Case Else : Print "Fehler: " ; Command
        End Select
   End If


'-------------------------------------------------------------------------------
'Relais ansteuern
'-------------------------------------------------------------------------------

Lampe1:
'=============

         If T1 > 0 And Taste_lang < 6 Then                  'wenn Taste 1 gedrückt wurde UND Taste_lang nicht überlaufen ist!

               L1s = L1                                     'Iststatus von Lampen übernehmen
               L2s = L2                                     'Iststatus von Lampen übernehmen

                 If L1s = 0 And L2s = 0 Then
                     L1s = 1
                     Goto Sprung1                           'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
                 End If
                 If L1s = 1 And L2s = 0 Then
                     L1s = 0
                     Goto Sprung1
                 End If
                 If L1s = 1 And L2s = 1 Then
                     L2s = 0
                 End If

      Sprung1:


                  If Taste_lang => 3 And Taste_lang <= 5 Then       'wenn lange gedrückt wird (<=5 damit nicht über Timer gesprungen wird)
                     Print "Taste_lang: " ; Taste_lang
                     Taste_lang = 100                       'Variable setzen damit Routine kein zweites mal erfüllt wird
                     If L1 = 1 And L2 = 0 Then
                     L1s = 1                                'immer beide setzen, falls davor anders gesetzt wurde(einzellampe)
                     L2s = 1
                     Goto Sprung2                           'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
                     End If
                     If L1 = 1 And L2 = 1 Then
                     L1s = 0
                     L2s = 0
                     Goto Sprung2                           'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
                     End If
                     If L1 = 0 And L2 = 0 Then
                     L1s = 1
                     L2s = 1
                     End If
                  End If

      Sprung2:

         End If                                             'ENDE von "wenn Taste 1 gedrückt wurde"
         Goto Lampenende


Lampe3:
'=============

         If T2 > 0 And Taste_lang < 6 Then                  'wenn Taste 1 gedrückt wurde UND Taste_lang nicht überlaufen ist!

               L3s = L3                                     'Iststatus von Lampen übernehmen
               L4s = L4                                     'Iststatus von Lampen übernehmen

                 If L3s = 0 And L4s = 0 Then
                     L3s = 1
                     Goto Sprung3                           'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
                 End If
                 If L3s = 1 And L4s = 0 Then
                     L3s = 0
                     Goto Sprung3
                 End If
                 If L3s = 1 And L4s = 1 Then
                     L4s = 0
                 End If

      Sprung3:


                  If Taste_lang => 3 And Taste_lang <= 5 Then       'wenn lange gedrückt wird (<=5 damit nicht über Timer gesprungen wird)
                     Print "Taste_lang: " ; Taste_lang
                     Taste_lang = 100                       'Variable setzen damit Routine kein zweites mal erfüllt wird
                     If L3 = 1 And L4 = 0 Then
                     L3s = 1                                'immer beide setzen, falls davor anders gesetzt wurde(einzellampe)
                     L4s = 1
                     Goto Sprung4                           'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
                     End If
                     If L3 = 1 And L4 = 1 Then
                     L3s = 0
                     L4s = 0
                     Goto Sprung4                           'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
                     End If
                     If L3 = 0 And L4 = 0 Then
                     L3s = 1
                     L4s = 1
                     End If
                  End If

      Sprung4:

         End If                                             'ENDE von "wenn Taste 1 gedrückt wurde"
         Goto Lampenende


Lampe5:
'=============

         If T3 > 0 And Taste_lang < 6 Then                  'wenn Taste 1 gedrückt wurde UND Taste_lang nicht überlaufen ist!

               L5s = L5                                     'Iststatus von Lampen übernehmen
               L6s = L6                                     'Iststatus von Lampen übernehmen

                 If L5s = 0 And L6s = 0 Then
                     L5s = 1
                     Goto Sprung5                           'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
                 End If
                 If L5s = 1 And L6s = 0 Then
                     L5s = 0
                     Goto Sprung5
                 End If
                 If L5s = 1 And L6s = 1 Then
                     L5s = 0
                 End If

      Sprung5:


                  If Taste_lang => 3 And Taste_lang <= 5 Then       'wenn lange gedrückt wird (<=5 damit nicht über Timer gesprungen wird)
                     Print "Taste_lang: " ; Taste_lang
                     Taste_lang = 100                       'Variable setzen damit Routine kein zweites mal erfüllt wird
                     If L5 = 1 And L6 = 0 Then
                     L5s = 1                                'immer beide setzen, falls davor anders gesetzt wurde(einzellampe)
                     L6s = 1
                     Goto Sprung6                           'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
                     End If
                     If L5 = 1 And L6 = 1 Then
                     L5s = 0
                     L6s = 0
                     Goto Sprung6                           'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
                     End If
                     If L5 = 0 And L6 = 0 Then
                     L5s = 1
                     L6s = 1
                     End If
                  End If

      Sprung6:

         End If                                             'ENDE von "wenn Taste 1 gedrückt wurde"
         Goto Lampenende


Lampe7:
'=============

         If T4 > 0 And Taste_lang < 6 Then                  'wenn Taste 1 gedrückt wurde UND Taste_lang nicht überlaufen ist!

               L7s = L7                                     'Iststatus von Lampen übernehmen
               L8s = L8                                     'Iststatus von Lampen übernehmen

                 If L7s = 0 And L8s = 0 Then
                     L7s = 1
                     Goto Sprung7                           'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
                 End If
                 If L7s = 1 And L8s = 0 Then
                     L7s = 0
                     Goto Sprung7
                 End If
                 If L7s = 1 And L8s = 1 Then
                     L8s = 0
                 End If

      Sprung7:


                  If Taste_lang => 3 And Taste_lang <= 5 Then       'wenn lange gedrückt wird (<=5 damit nicht über Timer gesprungen wird)
                     Print "Taste_lang: " ; Taste_lang
                     Taste_lang = 100                       'Variable setzen damit Routine kein zweites mal erfüllt wird
                     If L7 = 1 And L8 = 0 Then
                     L7s = 1                                'immer beide setzen, falls davor anders gesetzt wurde(einzellampe)
                     L8s = 1
                     Goto Sprung8                           'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
                     End If
                     If L7 = 1 And L2 = 1 Then
                     L7s = 0
                     L8s = 0
                     Goto Sprung8                           'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
                     End If
                     If L7 = 0 And L8 = 0 Then
                     L7s = 1
                     L8s = 1
                     End If
                  End If

      Sprung8:

         End If                                             'ENDE von "wenn Taste 1 gedrückt wurde"
         Goto Lampenende


Lampe9:
'=============

         If T5 > 0 And Taste_lang < 6 Then                  'wenn Taste 1 gedrückt wurde UND Taste_lang nicht überlaufen ist!

               L9s = L9                                     'Iststatus von Lampen übernehmen
               L10s = L10                                   'Iststatus von Lampen übernehmen

                 If L9s = 0 And L10s = 0 Then
                     L9s = 1
                     Goto Sprung9                           'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
                 End If
                 If L9s = 1 And L10s = 0 Then
                     L9s = 0
                     Goto Sprung9
                 End If
                 If L9s = 1 And L10s = 1 Then
                     L10s = 0
                 End If

      Sprung9:


                  If Taste_lang => 3 And Taste_lang <= 5 Then       'wenn lange gedrückt wird (<=5 damit nicht über Timer gesprungen wird)
                     Print "Taste_lang: " ; Taste_lang
                     Taste_lang = 100                       'Variable setzen damit Routine kein zweites mal erfüllt wird
                     If L9 = 1 And L10 = 0 Then
                     L9s = 1                                'immer beide setzen, falls davor anders gesetzt wurde(einzellampe)
                     L10s = 1
                     Goto Sprung10                          'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
                     End If
                     If L9 = 1 And L10 = 1 Then
                     L9s = 0
                     L10s = 0
                     Goto Sprung10                          'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
                     End If
                     If L9 = 0 And L10 = 0 Then
                     L9s = 1
                     L10s = 1
                     End If
                  End If

      Sprung10:

         End If                                             'ENDE von "wenn Taste 1 gedrückt wurde"
         Goto Lampenende


Lampe11:
'=============

         If T6 > 0 And Taste_lang < 6 Then                  'wenn Taste 1 gedrückt wurde UND Taste_lang nicht überlaufen ist!

               L11s = L11                                   'Iststatus von Lampen übernehmen
               L12s = L12                                   'Iststatus von Lampen übernehmen

                 If L11s = 0 And L12s = 0 Then
                     L11s = 1
                     Goto Sprung11                          'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
                 End If
                 If L11s = 1 And L12s = 0 Then
                     L11s = 0
                     Goto Sprung11
                 End If
                 If L11s = 1 And L12s = 1 Then
                     L12s = 0
                 End If

      Sprung11:


                  If Taste_lang => 3 And Taste_lang <= 5 Then       'wenn lange gedrückt wird (<=5 damit nicht über Timer gesprungen wird)
                     Print "Taste_lang: " ; Taste_lang
                     Taste_lang = 100                       'Variable setzen damit Routine kein zweites mal erfüllt wird
                     If L11 = 1 And L12 = 0 Then
                     L11s = 1                               'immer beide setzen, falls davor anders gesetzt wurde(einzellampe)
                     L12s = 1
                     Goto Sprung12                          'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
                     End If
                     If L11 = 1 And L12 = 1 Then
                     L11s = 0
                     L12s = 0
                     Goto Sprung12                          'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
                     End If
                     If L11 = 0 And L12 = 0 Then
                     L11s = 1
                     L12s = 1
                     End If
                  End If

      Sprung12:

         End If                                             'ENDE von "wenn Taste 1 gedrückt wurde"
         Goto Lampenende



Lampenende:


     'Print "-----------------------"
     'Print "Address: " ; Address
     'Print "Command: " ; Command
     'Print "-----------------------"





'_______________________________________________________________________________
If Sek => 100 And Address = 255 Then
Sek = 0

T1 = 0                                                      'Tastenzähler zurücksetzen
T2 = 0
T3 = 0
T4 = 0
T5 = 0
T6 = 0

L1 = L1s                                                    'Werte auf Ausgänge übertragen
L2 = L2s
L3 = L3s
L4 = L4s
L5 = L5s
L6 = L6s
L7 = L7s
L8 = L8s
L9 = L9s
L10 = L10s
L11 = L11s
L12 = L12s


Print "L1: " ; L1
Print "L2: " ; L2
Print "L3: " ; L3
Print "L4: " ; L4
Print "L5: " ; L5
Print "L6: " ; L6
Print "L7: " ; L7
Print "L8: " ; L8
Print "L9: " ; L9
Print "L10: " ; L10
Print "L11: " ; L11
Print "L12: " ; L12
Print "____________"



End If



Loop
'-------------------------------------------------------------------------------

'-------------------------------------------------------------------------------
'Sprungmarken
'-------------------------------------------------------------------------------
Timer1_irq:
Timer1 = Timervorgabe

Incr Sek



Return