-
        

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 35

Thema: Der universelle IR Fernbedienungs-Empfänger

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112

    Der universelle IR Fernbedienungs-Empfänger

    Anzeige

    Hallo zusammen,
    nachdem hier immer wieder wegen der Infrarot-Fernbedienung gefragt wird, stelle ich mal meinen universellen Empfänger vor.
    Das Programm habe ich als Attachment beigefügt und hoffentlich ausreichend kommentiert.
    Den Auswertungs-Code für Sony SIRCS habe ich hier auch eingefügt.

    Erkannt werden folgende Codes:

    Denon
    Japan
    JVC
    NEC
    NCR17
    RC5
    RC6
    RCA
    RECS80
    Sharp
    Sharp1
    SIRCS
    Unbekannt01
    Unbekannt02

    Ich hoffe, dass das Prinzip klar wird, sodass man sich auch eigene Routinen dazu schreiben kann.


    Code:
          If Flanken_index = 26 And Imp_array(2) < 26 And Imp_array(2) > 22 And Imp_array(3) > 4 And Imp_array(3) < 8 Then       '----------------------------------------------------------------Sony
             If Print_pc = 1 Then Print #1 , "SIRCS: Start "
             I = 4
             While I < Flanken_index
                Shift Daten , Right
                If Imp_array(i) > 4 And Imp_array(i) < 8 Then
                   nop
                Elseif Imp_array(i) > 9 And Imp_array(i) < 14 Then
                   Daten.31 = 1
                Else
                   Exit While
                End If
                Incr I
                If Imp_array(i) < 5 Or Imp_array(i) > 7 Then
                   Exit While
                End If
                Incr I
                Incr Bit_count
             Wend
             If I >= Flanken_index Then
                If Imp_array(i) > 9 And Imp_array(i) < 14 Then
                   Shift Daten , Right
                   Daten.31 = 1
                   Incr Bit_count
                End If
                Shift Daten , Right , 20
                Temp_daten = Daten
                Befehl = Temp_daten And &B01111111
                Shift Temp_daten , Right , 7
                Geraet = Temp_daten And &B00011111
                If Print_pc = 1 Then Print #1 , ": Gerät=" ; Geraet ; ", Befehl=" ; Befehl ; ", I=" ; I ; ", Flanken_index=" ; Flanken_index ; ", Daten=" ; Bin(daten)
                Gosub Clear_scr
                Locate 1 , 1 : Lcd "SIRCS "
                Locate 2 , 1 : Lcd "Geraet=" ; Geraet ; ", Befehl=" ; Befehl
             End If
          End If
    Hoffentlich können einige von euch etwas damit anfangen.

    Gruß

    Rolf
    Angehängte Dateien Angehängte Dateien

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    28.10.2004
    Ort
    Baoding
    Alter
    37
    Beiträge
    687
    Sieht nicht schlecht aus auch wenns etwas groß geraden ist.

    Für solche Beispielcodes/Sammlungen gibts auch einen eigenen Bereich auch wenn der nicht sonderlich gut gefüllt ist (Download im oberstem Menü)

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.03.2004
    Beiträge
    185
    zum gleichen Thema siehe auch den RC5-Softcode
    http://www.roboternetz.de/phpBB2/zei...ag.php?t=20209
    läuft wie bei Dir als ISR im Hintergrund, Auswertung der Flanken erfolgen jedoch gleich in der ISR (anderes Konzept, Main Loop weniger zeitkritisch)...

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.03.2004
    Beiträge
    185
    wir sollten für unseren IR Fernbedienungs-Empfänger Code auf RN-Wissen http://www.roboternetz.de/wissen/ind...ellcode_Bascom eine Seite anlegen - das Thema wird hier öfter angerissen

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2007
    Beiträge
    386
    wir sollten für unseren IR Fernbedienungs-Empfänger Code auf RN-Wissen http://www.roboternetz.de/wissen/in....ellcode_Bascom eine Seite anlegen - das Thema wird hier öfter angerissen
    finde ich auch, gerade weil es um selbsterstellten code geht der das signal zu fuss auswertet ohne die routine von bascom.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Zitat Zitat von Rofo88
    Für solche Beispielcodes/Sammlungen gibts auch einen eigenen Bereich auch wenn der nicht sonderlich gut gefüllt ist (Download im oberstem Menü)
    Ich habe das gleich am Feiertag hier hochgeladen:
    http://www.roboternetz.de/phpBB2/dlo...gory&cat_id=30
    aber es erscheint immer noch nicht.
    Keine Ahnung wie man das mal überprüfen kann.

    Gruß

    Rolf

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2007
    Beiträge
    386
    hallo, habe den bascom-code für mich umgesetzt, einen atmega32 mit 8mhz.

    wenn ich die fb-taste 1x drücke erscheint auch der code von der fb.

    dann geht es nicht weiter. ich kann die fb-drücken, es tut sich nichts.
    bin ich irgendwie aus der schleife rausgeworfen worden.

    wer erkennt hier den fehler?

    Code:
    $crystal = 8000000
    $regfile = "m32def.dat"
    $hwstack = 32
    $swstack = 32
    $framesize = 64
    
    
    Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
    Config Lcd = 16 * 2
    
    Dim Impuls_laenge As Word , Flanken_index As Byte , Flanken_anzahl As Byte , Bit_count As Byte
    Dim Befehl As Word , Geraet As Word , Neg_befehl As Word , Neg_geraet As Word , Nrc17_start As Byte
    Dim Daten_pruefung As Byte , Parity As Byte , Hersteller As Word , System As Byte , Produkt As Byte , Modus As Byte
    Dim Imp_array(200) As Byte , Daten As Long , Daten1 As Long , Temp_daten As Long , Code_found As Byte
    Dim Timer0_startwert As Word , I As Byte
    Dim Print_pc As Byte
    Dim Zeit As Byte
    
    Zeit = 3
    Const Std_pulse = 5
    Const Std_pulse_min = Std_pulse - 2
    Const Std_pulse_max = Std_pulse + 2
    
    Config Timer0 = Timer , Prescale = 8                        'hier den Timer eintragen (8-bit)
    On Ovf0 Tim0_isr
    Enable Timer0
    Timer0_startwert = 161                                      'bei mir 16000000/8/(256-56) entspricht 10Khz
    Timer0 = Timer0_startwert                                   'Auflösung reicht und gefundene Werte entsprechen immer 100µs
    
    Config Int0 = Change                                        'externer interrupt, bei mir Int0 auf portd.2
    On Int0 Get_rc_isr
    Enable Int0
    Ddrd.2 = 0                                                  'ausgang des RC-empfängers
    Portd.2 = 1
    
    $baud = 19200                                               'Vorsicht: Wenn's langsam geht, kann dies die erkannten Flankenzeiten beeinflussen
    
    Print_pc = 1                                                'auf 1 setzen, um über Print auszugeben
    
    Enable Interrupts
    
    Do
       If Code_found = 1 Then                                   'Jetzt geht es an die Erkennung des Codes
          Flanken_index = Flanken_anzahl
          Daten = 0
          Daten1 = 0
          Bit_count = 0
          Code_found = 0
    
    'RC5 hat immer gerade Anzahl Flanken, bei mir immer zwischen 16 und 26
    'Imp_array(1) enthält die Pause seit dem letzten Befehl, ist also uninteressant
    'Imp_array(2) ist das Ende der ersten Start-1
    'Imp_array(3) ist der Anfang der zweiten Start-1
    
          If Flanken_index > 15 And Flanken_index < 27 And Flanken_index.0 = 0 And Imp_array(2) > 6 And Imp_array(2) < 11 And Imp_array(3) > 6 And Imp_array(3) < 11 Then
             If Print_pc = 1 Then Print "RC5: "
             I = 4                                              '           Imp_array(4) ist das Toggle-bit
             Daten.0 = 1
             While I < Flanken_index                            '           Loop bis zur letzten Flanke, immer beim wichtigen Flankenwechsel in der Mitte des Impulses
                Shift Daten , Left                              '          Daten (Ergebnis) nach links schieben, 0 einfügen
                Daten.0 = Daten.1                               '            Das letzte Bit wie das vorletzte setzen
                If Imp_array(i) > 6 And Imp_array(i) < 11 Then  '           kurzer Impuls (also kein Wechsel 0->0 oder 1->1)
                   Incr I                                       '           nächste Flanke
                   If Imp_array(i) < 7 Or Imp_array(i) > 10 Then       '    kein kurzer Impuls => Fehler (wenn in der Mitte ein kurzer war, dann muss noch ein kurzer kommen)
                      Exit While                                '           Abbruch
                   End If
                Elseif Imp_array(i) < 19 And Imp_array(i) > 15 Then       'langer Impuls (also Wechsel 1->0 oder 0->1)
                   Toggle Daten.0                               '           also letztes bit umschalten
                Else
                   Exit While                                   '           sonst Abbruch
                End If
                Incr I                                          '           nächste Flanke
                Incr Bit_count                                  '           zählt die Anzahl der korrekt gelesenen Bits
             Wend
             If I >= Flanken_index Then                         'Wenn kein Abbruch
                If Imp_array(i) < 19 And Imp_array(i) > 15 Then 'Falls am Ende noch ein bit-Wechsel 1->0 kommt
                   Shift Daten , Left                           'Daten (Ergebnis) nach links schieben, 0 einfügen
                   Incr Bit_count
                End If
                Temp_daten = Daten                              'Daten zwischenspeichern
                Befehl = Temp_daten And &B00111111              'Befehl sind die letzten 6 bits
                Shift Temp_daten , Right , 6                    'Befehls-bits rausshiften
                Geraet = Temp_daten And &B00011111              'Gerät sind die ersten 5 bits
                If Print_pc = 1 Then Print ": Ger=" ; Geraet ; ", Bef=" ; Befehl
                Cls
                Locate 1 , 1 : Lcd "RC5"
                Locate 2 , 1 : Lcd "Ger=" ; Geraet ; ", Bef=" ; Befehl
             End If
          End If
    
       End If
    Loop
    
    End
    
    Tim0_isr:
       Timer0 = Timer0_startwert
       Incr Impuls_laenge                                       'bei jedem Überlauf um 1 erhöhen
       If Impuls_laenge = 200 Then                              'Kein Impuls für 20ms und in Get_rc_isr schon mindestens 14 Flanken gespeichert
          If Flanken_anzahl > 13 Then
             Code_found = 1                                     'Auswertung im Hauptprogramm starten
          End If
       End If
    Return
    
    Get_rc_isr:
       If Impuls_laenge > 0 Then
          Incr Flanken_anzahl
          If Flanken_anzahl > 200 Then Flanken_anzahl = 200
          If Impuls_laenge > 255 Then Impuls_laenge = 255
          Imp_array(flanken_anzahl) = Impuls_laenge
          Impuls_laenge = 0
       End If
    Return

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    So auf den ersten Blick sehe ich nur, dass du die Variable Flanken_anzahl nicht zurücksetzt.
    Also am Ende von

    If Code = 1 Then
    ...
    Flanken_anzahl=0
    End If

    Sonst hängt er immer hinten dran.

    Gruß

    Rolf

  9. #9

    RC5 FB

    Hallo For_ro,
    Habe versucht den code für ein AtMega 8 mit 8MHz anzupassen leider ohne Erfolg.
    Ich habe eine RC5 FB und eine Sony
    ist es Möglich hierzu Hilfe zu bekommen ?

    Danke & Gruß
    Michael

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112

    Re: RC5 FB

    Zitat Zitat von misch
    Hallo For_ro,
    Habe versucht den code für ein AtMega 8 mit 8MHz anzupassen leider ohne Erfolg.
    Ich habe eine RC5 FB und eine Sony
    ist es Möglich hierzu Hilfe zu bekommen ?

    Danke & Gruß
    Michael
    Hallo,
    es ist immer möglich, Hilfe zu bekommen, aber ein paar Angaben wären hilfreich.
    Wie sieht dein Code aus und was funktioniert nicht?

    Gruß

    Rolf

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •