Wie ein paar von euch schon wissen bin ich so gut wie fertig mit meinem Projekt, aber die letzten beiden Probleme bekomm ich einfach nicht gelöst.

1. Die Programme sollen solange ausgeführt werden bis der Befehl für ein anderes erfolg. (Siehe Wait_and_get Subroutine) Leider funktioniert das mit dem last_ir_command so nicht, warum weiß ich leider nicht.

2. "Programmr" soll nur die rote Led dauerhaft anschalten. (Portd.6)
Problem ist das der Port nicht einfach geschaltet werden kann, da der Timer0 für die RGB PWM ja im Hintergrund läuft.

Hier der Code:
Code:
$regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 40
$crystal = 16000000
$baud = 9600

Waitms 50                                                   'Einschwingzeit

'//////////Ports Konfigurieren\\\\\\\\\\
Config Porta = Output                                       'M1
Config Portc = Output                                       'M2
Config Portd.6 = Output                                     'RGB-Rot
Config Portd.3 = Input                                      'TSOP

Porta.4 = 1                                                 'Enable1 active = low
Portc.4 = 1
Enable1 Alias Porta.4
Enable2 Alias Portc.4

Portd.6 = 1                                                 'RGB Led ausschalten
Portc.7 = 1
Portc.6 = 1

'//////////Timer konfigurieren, Vorteiler auf 1\\\\\\\\\\
Config Timer0 = Timer , Prescale = 1

'//////////RC5 konfigurieren mit Timer 2\\\\\\\\\\
Config Rc5 = Pind.3 , Timer = 2

'/////////Sub Deklarieren\\\\\\\\\\\\\
Declare Sub Wait_and_get(byval Ms As Byte)


'//////////Definiere den Interrupthandler\\\\\\\\\\
On Ovf0 Tim0_isr
Enable Interrupts

Enable Timer0                                               'Timer einschalten


Dim R1 As Byte                                              ' In diese Variablen muss man
Dim G1 As Byte                                              ' im Hauptprogram die gewünschten
Dim B1 As Byte                                              ' Ausgabewerte laden

Dim Z As Word                                               'Zähler

Dim Ri1 As Byte                                             'Hilfsregister
Dim Gi1 As Byte
Dim Bi1 As Byte

'//////////Variablen für Hauptprogramm\\\\\\\\\\
Dim A As Byte                                               'Schleifenvariable RGBs

Z = 0

G1 = 0
R1 = 0
B1 = 0

Dim I As Byte                                               'Schleifenvariable Lauflicht
Dim I2 As Byte                                              'Schleifenvariable Lauflicht
Dim I3 As Byte                                              'Schleifenvariable Lauflicht
Dim Freilauf As Byte
Dim Ir_address As Byte
Dim Ir_command As Byte
Dim Last_ir_command As Byte
Last_ir_command = 0

Dim Programm As Byte                                        'Programmauswahl
Programm = 0                                                'Erst nix machen


'EEPROM Variablen
'Dim R_save As Eram Byte
'Dim G_save As Eram Byte
'Dim B_save As Eram Byte

Wait 1

'//////////Einstellungen\\\\\\\\\\
Freilauf = 20                                               'Lauflicht Freilaufzeit
'Normaldurchlauf = 2                                         'Anzahl der Standarddurchläufe
'//////////Hauptprogramm <Start>\\\\\\\\\\
Waitms 200
Print "Starte Hauptprogramm"

Do
Call Wait_and_get(1)                                        'bisschen Däumchen drehen und warten bis was gedrückt wird ;)
Loop

'//////////Hauptprogramm <Ende>\\\\\\\\\\

'Programm1: RGB LEDs
Programm1:

'Rot
For A = 0 To 254
R1 = R1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
R1 = R1 - 1
Waitms 1
Next

'Grün
For A = 0 To 254
G1 = G1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
G1 = G1 - 1
Waitms 1
Next

'Blau
For A = 0 To 254
B1 = B1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
B1 = B1 - 1
Waitms 1
Next

'Blau/Grün
For A = 0 To 254
B1 = B1 + 1
G1 = G1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
B1 = B1 - 1
G1 = G1 - 1
Waitms 1
Next

'Blau/Rot
For A = 0 To 254
B1 = B1 + 1
R1 = R1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
B1 = B1 - 1
R1 = R1 - 1
Waitms 1
Next

'Grün/Rot
For A = 0 To 254
G1 = G1 + 1
R1 = R1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
G1 = G1 - 1
R1 = R1 - 1
Waitms 1
Next

'Grün/Rot/Blau
For A = 0 To 254
G1 = G1 + 1
R1 = R1 + 1
B1 = B1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
G1 = G1 - 1
R1 = R1 - 1
B1 = B1 - 1
Waitms 1
Next

Return

'Programm2: Lauflicht
Programm2:


 For I = 0 To 15
  Porta = I
  Enable1 = 0
  Waitms Freilauf
  Enable1 = 1
 Next I

 For I = 0 To 11
  Portc = I
  Enable2 = 0
  Waitms Freilauf
  Enable2 = 1
 Next I
Call Wait_and_get(0)

Return

'Programm3: Lauflicht2
Programm3:


 For I = 0 To 15
  Porta = I
  Enable1 = 0
  Waitms 10
  Enable1 = 1
 Next I

 For I = 0 To 11
  Portc = I
  Enable2 = 0
  Waitms 10
  Enable2 = 1
 Next I
Call Wait_and_get(0)

Return

Programmr:

'R1 = 255
Disable Timer1
Portd.6 = 0
Waitms 100
Portd.6 = 1
Call Wait_and_get(0)
'R1 = 0

Return

'/////////////////Funktion zum RC5 empfangen und warten\\\\\\\\\\\\\\\
Sub Wait_and_get(byval Ms As Byte)
Getrc5(ir_address , Ir_command)                             'Empfangen

'Wenn was empfangen dann reagieren
If Ir_address <> 255 Then
 Ir_command = Ir_command And &B01111111                     'Togglebit entfernen

 'Hier die Codes an die Fernbedienung anpassen
 Print "IR Befehl: " + Str(ir_command)

 If Ir_command = 255 Then                                   'wenn nichts emfangen wird,
  Ir_command = Last_ir_command                              'dann akt. Programm weiter
 Else                                                       'ausführen
  If Ir_command = 17 Then Gosub Programm1
  If Ir_command = 18 Then Gosub Programm2
  If Ir_command = 19 Then Gosub Programm3
  If Ir_command = 20 Then Gosub Programmr
 End If



End If

Waitms Ms                                                   'warten
End Sub


'//////////Interupthandler Timer0 <Start>\\\\\\\\\\
Tim0_isr:

    If Z = 0 Then                                           'Gewünschte Ausgabewerte an
    Ri1 = R1                                                'Hilfsregister übergeben
    Gi1 = G1
    Bi1 = B1
    Z = 255
    End If

    Z = Z - 1

    'PWM Kanäle

    'RGB LEDs
    If Ri1 > 0 Then
    Portd.6 = 0
    Else
    Portd.6 = 1
    End If
    Ri1 = Ri1 - 1
    If Ri1 = 255 Then Ri1 = 0

    If Gi1 > 0 Then
    Portc.7 = 0
    Else
    Portc.7 = 1
    End If
    Gi1 = Gi1 - 1
    If Gi1 = 255 Then Gi1 = 0

    If Bi1 > 0 Then
    Portc.6 = 0
    Else
    Portc.6 = 1
    End If
    Bi1 = Bi1 - 1
    If Bi1 = 255 Then Bi1 = 0

    Return
'//////////Interupthandler Timer0 <Ende>\\\\\\\\\\
Ich wäre euch sehr dankbar für eure Hilfe da ich mittlerweile echt dran verzweifel