Hilfe bei Schaltung mit RC5

  • Hallo Forengemeinde,
    ich brauche mal Dringend eure Hilfe und zwar geht es um diesen Code:


    **** Code ***************************************************+


    $regfile = "m8535.dat"
    $lib "mcsbyte.lbx"
    $crystal = 16000000


    Declare Sub Check_input
    ' optional LCD einbinden - hier Goldentek 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portd.3 , Rs = Portd.4
    Config Lcd = 16 * 2
    ' RC5 (TSOP1136) auf PIN D2 (INT0) festlegen - Timer0 und INT0 haben damit gut zu tun :)
    Config Rc5 = Pind.2
    Enable Interrupts
    ' Timer1 und Timer2 für PWM Betrieb initialisieren
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
    Config Timer2 = Pwm , Compare Pwm = Clear Up , Prescale = 1


    'Ein paar Variablen definieren
    Dim Address As Byte , Command As Byte
    Dim A As Byte 'Zählvariable
    Dim B As Byte 'Zählvariable
    Dim Programm As Byte 'Aktives Program
    Dim Step_delay As Byte 'Schrittpause in ms
    Dim Strobo_pause As Byte 'Strobopause in ms
    Dim Color_delay As Byte
    Dim Color_stop As Byte
    Dim Rgb As Byte



    Config Pinb.3 = Output 'PWM Output rot Timer2
    Config Pinb.2 = Output 'PWM Output grün Timer1
    Config Pinb.1 = Output 'PWM Output blau Timer1


    Led1 Alias Ocr1al 'PIN 17 PB3
    Led2 Alias Ocr1bl 'PIN 16 PB2
    Led3 Alias Ocr2 'PIN 15 PB1


    Led1 = 0 '1.Led dunkel
    Led2 = 0 '2.Led dunkel
    Led3 = 0 '3.Led dunkel


    'Den Tastern zur Board-Beschriftung passende Namen verpassen
    'Taster_1 Alias Pind.0 'Taster 1
    'Taster_2 Alias Pind.1 'Taster 2
    'Taster_3 Alias Pind.3 'Taster 3 (hier deaktiviert, weil schon auf INT1 gelegt!)



    'Mit welchem Programm fangen wir an?
    Programm = 0


    'Step_Delay in ms einstellen
    Step_delay = 15


    'Strobo_Pause in ms festlegen
    Strobo_pause = 40


    'Startwert für die Schleife
    Rgb = 0


    'Farbwechsel Geschwindigkeit pro Schritt (empfohlen 1-15)
    Color_delay = 40


    'Dauer der Pause bei der Grundfarbe (empfohlen 1-10)
    Color_stop = 1


    'Subroutinen für die verschiedenen Programme definieren
    Declare Sub Programm_0
    Declare Sub Programm_1
    Declare Sub Programm_2
    Declare Sub Programm_3
    Declare Sub Programm_4


    Cursor Off Noblink
    Cls


    Do


    Select Case Command 'Je nachdem, welchen Wert "PROGRAMM" enthält...
    Case 0 '...wird die entsprechende Routine angesprungen
    Gosub Programm_0
    Case 1
    Gosub Programm_1
    Case 2
    Gosub Programm_2
    Case 3
    Gosub Programm_3
    Case 4
    Gosub Programm_4
    End Select


    Getrc5(address , Command)


    If Address = 0 Then
    Command = Command And &B01111111
    Locate 1 , 2
    Lcd "A:" ; Address ; " C:" ; Command ; " "
    Check_input
    Locate 1 , 11
    Lcd "R:" ; Led1 ; " "
    Locate 2 , 2
    Lcd "G:" ; Led2 ; " "
    Locate 2 , 9
    Lcd "B:" ; Led3 ; " "


    End If
    Waitms 15
    Loop
    End


    Sub Check_input
    End Sub Check_input


    'Farbe Gelb
    Sub Programm_0:


    Led1 = 128 ' Gelb
    Led2 = 0
    Led3 = 192
    Rgb = 0
    If Programm > 0 Then
    Exit Sub
    End If
    End Sub


    'Farbe Violet
    Sub Programm_1:


    Led1 = 0 ' Violet
    Led2 = 128
    Led3 = 192
    Rgb = 0
    If Programm <> 1 Then
    Exit Sub
    End If
    End Sub



    'Zufallsfarben
    Sub Programm_2:
    A = Rnd(255) 'Zufallswert zwischen 0 und 255 generieren
    Led1 = A
    A = Rnd(255) 'Zufallswert zwischen 0 und 255 generieren
    Led2 = A
    A = Rnd(255) 'Zufallswert zwischen 0 und 255 generieren
    Led3 = A
    If Programm <> 2 Then
    Exit Sub
    End If
    Waitms 500 'Halbe Sekunde Step_delay.
    End Sub



    'Regenbogen-Fader
    Sub Programm_3:
    'Erstmal alle ausmachen...
    'Led1 = 0
    'Led2 = 0
    'Led3 = 0


    Do


    If Rgb = 0 Then
    Incr Led1
    Decr Led3
    Waitms Color_delay
    End If


    If Led1 = 255 Then
    Rgb = 1
    Led3 = 0
    Wait Color_stop
    End If


    If Rgb = 1 Then
    Decr Led1
    Incr Led2
    Waitms Color_delay
    End If


    If Led2 = 255 Then
    Rgb = 2
    Led1 = 0
    Wait Color_stop
    End If


    If Rgb = 2 Then
    Decr Led2
    Incr Led3
    Waitms Color_delay
    End If


    If Led3 = 255 Then
    Rgb = 0
    Led2 = 0
    Wait Color_stop
    End If


    If Programm <> 3 Then
    Exit Sub
    End If
    Loop
    End Sub



    'Stroboskop-Programm


    Sub Programm_4:
    'Erstmal alle ausmachen...
    'Led1 = 0
    'Led2 = 0
    'Led3 = 0
    Do


    If Command = 55 Then 'Wenn Taster_1 gedrückt, dann...
    If Strobo_pause > 5 Then 'Wir wollen nicht unter 5 ms kommen
    Strobo_pause = Strobo_pause - 5
    End If
    End If


    If Command = 52 Then 'Wenn Taster_2 gedrückt, dann...
    If Strobo_pause < 250 Then 'Wir wollen nicht über 200 ms kommen
    Strobo_pause = Strobo_pause + 5
    End If
    End If


    Led1 = 255
    Waitms 50
    Led1 = 0
    Waitms Strobo_pause
    Led2 = 255
    Waitms 50
    Led2 = 0
    Waitms Strobo_pause
    Led3 = 255
    Waitms 50
    Led3 = 0
    Waitms Strobo_pause


    If Programm <> 4 Then
    Exit Sub
    End If
    Loop
    End Sub



    'Hier die Routine zu INT1
    'Interrupt_schleife:
    'Waitms 100 'Entprellen des Tasters
    'If Programm < 4 Then 'Solange Programm kleiner als 2 ist, um +1 erhöhen
    ' Programm = Programm + 1
    'Else 'Wenn größer als 2, dann zurück zu Programm 0
    ' Programm = 0
    'End If
    'Return 'Dahin zurück, wo wir hergekommen sind...



    'End


    *************************************************************************************+
    diese Schaltung läuft Prima wenn man einen Taster zur Abfrage der einzelnden Programme nimmt da das wunderbar funktioniert wollte ich alles über RC5 laufen lassen aber da laufen die Programme nicht wie beim Taster durch und fangen am anfang wieder an sondern hören direkt am ende des Codes auf und erst nach nochmaligen Tatendrtuck auf die Fernbedienung fangen Sie wieder von vorne!!
    Ich hoffe ich habe mich verständlich gemacht und es kann mir einer hierbei helfen??

  • Das Problem dürfte sein, dass du direkt "Command" verwendest.
    Ich nehme an, wenn du Command nach der If-Abfrage in einer anderen Variable speicherst und mit dieser arbeitest, läuft das Programm auch weiter.
    Momentan wird bei jedem Schleifendurchlauf Command auf 0...oder was auch immer gesetzt.

  • Danke für Deine Antwort ,
    ich habe auch schon bei der z.B.
    " If Programm <> 3 Then
    Exit Sub "
    statt Programm ein Command Befehl gesetzt mit dem Ergebniss das jetzt das Programm richtig durchläuft ich aber nicht mehr aus dieser schleife komme irgendwie verstehe ich das ganze nicht so richtig den mit der Fernbedienung gebe ich doch auch blos einen Tastbefehl genauso wie mit einem Taster nur mit dem Unterschied das es mit dem Taster funktioniert.
    Niemand der sich mit RC5 und Programmabläufe auskennt hier im Forum???

  • An alle die den obigen Code mal mit einer Ferbedienug mittels RC5 steuern wollen empfehle ich diese Seite ""http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=20209&highlight=getrc5 "" die ich nach langem suchen gefunden habe die Fernbedienung spricht sofort an und bleibt nicht in irgendeiner Schleife hängen also wärmstens zu empfehlen
    Vielleicht hätte ich diesen Post auch im Anfängerforum stellen sollen den ich beschäftige mich erst seit 5 Monaten mit Schaltungsaufbau und LEDsteuerung.

  • mit der Fernbedienung gebe ich doch auch blos einen Tastbefehl genauso wie mit einem Taster nur mit dem Unterschied das es mit dem Taster funktioniert.

    Da ist schon ein Unterschied.
    Du fragst in jedem Schleifendurchlauf den RC5 Zustand ab. Da dieser nur bei Tastendruck den erwarteten Wert hat, musst du diesen dann auch abspeichern wenn du ihn empfangen hast. Erst wenn du einen anderen gültigen Code empfängst darf sich die Variable ändern. Du verwendest aber einfach den Command Wert aus der RC5 Routine für den Programmablauf.
    Also läuft dein gewähltes Programm nur so lange, wie du die Taste der FB drückst.