Hallo,
sorry das ich erst nun antworte.

@peterfido
Das Programm läuft leider nicht.
Dadurch dass mehrere Impulse von der FB gesendet werden reicht die Verriegelung mit der 255 nicht aus und man schafft es fast nie die FB Taste so kurz zu drücken das der Kontakt nicht mehrmals schaltet.
Die andere Sache ist, dass nur ein Leuchtmittel gesteuert werden kann (oder ich hab das Programm noch nicht durchschaut) Jede Lampe hat 2 Leuchtmittel, wodurch 2 Helligkeitsstuffen möglich sind.

ABER ich habe die Programmierweise (über die Variablen L.1 - L.12 die Lampen auswählen und so viele Programmzeilen sparen) übernommen.

Jetzt kommt der Fehler der mir unmöglich erscheint. Alle Funktionen mit Taste 1,3,5 funktionieren - Taste 2,4,6 LANGE drücken auswerten funktioniert nicht?! Dabei werden doch alle Tasten gleich abgefragt...
(zur Funktion: kurz drücken -> erstes Leuchtmittel an bzw. aus. lange drücken beide Leuchtmittel an bzw. aus)

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
Dim Empfang As Bit                                          'ist 0 wenn kein empfang  also 255 von address
Dim Sek As Byte                                             'wenn = 100 dann 1 sec um
Dim L As Integer , Ls As Integer , Lampe_x As Byte , Lampe_y As Byte

'Lampen festlegen
Lampe1 Alias Portc.5
Lampe2 Alias Portc.4
Lampe3 Alias Portc.3
Lampe4 Alias Portc.2
Lampe5 Alias Portc.1
Lampe6 Alias Portc.0
Lampe7 Alias Portb.5
Lampe8 Alias Portb.4
Lampe9 Alias Portb.3
Lampe10 Alias Portb.2
Lampe11 Alias Portb.1
Lampe12 Alias Portb.0

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

'alle Lampen aus:
Lampe1 = 0
Lampe2 = 0
Lampe3 = 0
Lampe4 = 0
Lampe5 = 0
Lampe6 = 0
Lampe7 = 0
Lampe8 = 0
Lampe9 = 0
Lampe10 = 0
Lampe11 = 0
Lampe12 = 0

Address = 255                                               'also kein Signal
Command = 255                                               'also kein Signal

Lampe_x = 255
Lampe_y = 255

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

'-------------------------------------------------------------------------------
'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

           'Print Command

        Select Case Command
           Case 0 : Goto All_off

           Case 1 : Lampe_x = 1
                     Lampe_y = 2
                     Goto Lampe
           Case 2 : Lampe_x = 3
                     Lampe_y = 4
                     Goto Lampe
           Case 3 : Lampe_x = 5
                     Lampe_y = 6
                     Goto Lampe
           Case 4 : Lampe_x = 7
                     Lampe_y = 8
                     Goto Lampe
           Case 5 : Lampe_x = 9
                     Lampe_y = 10
                     Goto Lampe
           Case 6 : Lampe_x = 11
                     Lampe_y = 12
                     Goto Lampe
           Case Else : Print "Fehler: " ; Command
        End Select
   End If


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

Lampe:
'=============

         If Lampe_x < 255 And Taste_lang < 7 Then           'wenn Taste 1 gedrückt wurde UND Taste_lang nicht überlaufen ist!

             Ls.lampe_x = L.lampe_x                         'Iststatus von Lampen übernehmen
             Ls.lampe_y = L.lampe_y                         'Iststatus von Lampen übernehmen

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

      Sprung1:

                    If Taste_lang => 3 And Taste_lang < 7 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 Ls.lampe_x = 1 And Ls.lampe_y = 0 Then
                     L.lampe_x = 1                          'immer beide setzen, falls davor anders gesetzt wurde(einzellampe)
                     L.lampe_y = 1
                     Goto Sprung2                           'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
                     End If

                     If Ls.lampe_x = 1 And Ls.lampe_y = 1 Then
                     L.lampe_x = 0
                     L.lampe_y = 0
                     Goto Sprung2                           'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen
                     End If

                     If Ls.lampe_x = 0 And Ls.lampe_y = 0 Then
                     L.lampe_x = 1
                     L.lampe_y = 1
                     End If

                  End If

       Sprung2:
         Gosub Lampen_setzen
         End If                                             'ENDE von "wenn Taste 1 gedrückt wurde"





'_______________________________________________________________________________
'If Sek = 50 Then
'Goto Ausgabe



'Ausgabe:
'End If


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

Print "L1: " ; Lampe1
Print "L2: " ; Lampe2
Print "L3: " ; Lampe3
Print "L4: " ; Lampe4
Print "L5: " ; Lampe5
Print "L6: " ; Lampe6
Print "L7: " ; Lampe7
Print "L8: " ; Lampe8
Print "L9: " ; Lampe9
Print "L10: " ; Lampe10
Print "L11: " ; Lampe11
Print "L12: " ; Lampe12
Print "____________"

End If



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

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

Incr Sek

Return

'-------------------------------------------------------------------------------
Lampen_setzen:
Lampe1 = L.1                                                'Werte auf Ausgänge übertragen
Lampe2 = L.2
Lampe3 = L.3
Lampe4 = L.4
Lampe5 = L.5
Lampe6 = L.6
Lampe7 = L.7
Lampe8 = L.8
Lampe9 = L.9
Lampe10 = L.10
Lampe11 = L.11
Lampe12 = L.12
Lampe_x = 255
Lampe_y = 255

Return

'-------------------------------------------------------------------------------
All_off:                                                    'Alle Lampen ausschalten

Lampe1 = 0                                                  'Werte auf Ausgänge übertragen
Lampe2 = 0
Lampe3 = 0
Lampe4 = 0
Lampe5 = 0
Lampe6 = 0
Lampe7 = 0
Lampe8 = 0
Lampe9 = 0
Lampe10 = 0
Lampe11 = 0
Lampe12 = 0

'rücksetzen der Variablen
L.1 = 0
L.2 = 0
L.3 = 0
L.4 = 0
L.5 = 0
L.6 = 0
L.7 = 0
L.8 = 0
L.9 = 0
L.10 = 0
L.11 = 0
L.12 = 0


Goto Anfang