- LiFePO4 Speicher Test         
Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 35

Thema: Der universelle IR Fernbedienungs-Empfänger

  1. #11
    Anzeige

    Praxistest und DIY Projekte
    Hallo Rolf,
    Danke das Du mir helfen möchtest!

    Der code für RC5 lässt sich fehlerfrei compilieren läuft aber nicht !
    sobald ich den Sony code inzufüge lässt sich das Programm nicht kompilieren
    es rescheinen folgende Fehlermeldungen


    Error 211 in line 208 external routine not found
    Error 61 in line 208 label not found

    Hier mein verwendeter code.
    Gruß
    Michael
    Angehängte Dateien Angehängte Dateien

  2. #12
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Sorry, in meinem M128 hatte ich den zweiten USART benutzt, daher die
    Print #1, ...
    Die müssen bei deinem M8 raus. Habe dir mal so eine Version angehängt.
    Probier es mal aus.

    Gruß

    Rolf
    Angehängte Dateien Angehängte Dateien

  3. #13
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Du musst unten noch das
    Gosub Clear_scr durch ein einfaches
    Cls
    ersetzen, da du ein anderes LCD benutzt.

    Außerdem denke ich, dass du den Timer_startwert etwa auf 156 erhöhen solltest, damit der Timer ungefähr im 10KHz Takt überläuft.

    Gruß

    Rolf

  4. #14
    Hallo Rolf,
    Vielen vielen .......Dank !!! Funktioniert !!
    Sony OK
    Philips OK aber nicht alle Tasten warum ?
    mit dem Getrc5(adress , Command) funktionieren alle Taten auf der FB
    mit deiner routine geht der Code 107.. 110 ( rot grün gelb blau )
    und 80...87 Pfeiltasten nicht .. schade denn genau die wolte ich verwenden.

    Gruß
    Michael

  5. #15
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Das liegt wohl daran, dass deine FB den extended-RC5 Code sendet. Den habe ich damals nicht mit rein programmiert. Normaler RC5 geht für die Befehle nur von 0-63.
    Ich kann mir das am Wochenende mal ansehen, ob ich das auf die Schnelle noch hinkriege.

    Gruß

    Rolf

  6. #16
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo Michael,
    tatsächlich sind nur zwei kleine Änderungen nötig.
    Hier habe ich dir mal die neue Version für RC5 gemacht:
    Code:
          If Flanken_index > 15 And Flanken_index < 27 Then     '!!!! geändert
           Locate 1 , 1
             If Print_pc = 1 Then Print "RC5: "
             I = 2                                              '!!!! geändert           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 Temp_daten.6 = 0 Then                        '!!!! neu
                   Befehl = Befehl + 64                         '!!!! neu
                End If                                          '!!!! neu
                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
    Gruß

    Rolf

  7. #17
    Hallo Rolf,

    100% Super läuft.
    Vielen herzlichen Dank für deine Mühe !!

    Gruß
    Michael

  8. #18
    Neuer Benutzer Öfters hier
    Registriert seit
    16.05.2009
    Beiträge
    7
    Hallo...

    Ich bin neu hier und hab versucht den tester nach zu bauen.. allerdings ohne erfolg...

    Könnt ihr mir vielleicht sagen was ich falsch mache??!!

    Danke Schon mal im vorraus...
    Gruß Flo

    Code:
    '  '******************************************************************************
    '
    '                            AT Mega 8535 & LCD 16*2 Anschluß & TSOP 1736
    '
    '------ Standard-Init von Bascom ------------------------------
    
    $regfile = "m8535.dat"                                      
    $crystal = 8000000
    $hwstack = 40                                               ' default use 32 for the hardware stack
    $swstack = 40                                               ' default use 32 for the SW stack
    $framesize = 100                                            ' default use 40 for the frame space
    
    Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.6 , Rs = Porta.7
    Config Lcd = 16 * 2
    
    Cls
    
    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 = 78                                       '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 = 0                                                '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
           Locate 1 , 1
             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
          Flanken_index = 0
          Flanken_anzahl = 0
          Impuls_laenge = 0
       End If
    
       '-------------------------------------------------------------------------------------------------------------------------------------------
    'SIRCS
    '26, 255   23   6  6 5   6 6   5 6   6 6   5 6   6 6   5 6  12 5   6 6   6 5   6 6  11
    '                  (0)   (0)   (0)   (0)   (0)   (0)   (0)   (1)   (0)   (0)   (0)  (1)
    '      (Startbit)  (L               BEFEHL              M)   (L        ADRESSE       M)
    '----------------------------------------------------------------Sony
          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
             If Print_pc = 1 Then Print "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 ": Gerät=" ; Geraet ; ", Befehl=" ; Befehl ; ", I=" ; I ; ", Flanken_index=" ; Flanken_index ; ", Daten=" ; Bin(daten)
                Cls
                Locate 1 , 1 : Lcd "SIRCS"
                Locate 2 , 1 : Lcd "Geraet=" ; Geraet ; ", Befehl=" ; Befehl
             End If
           Flanken_index = 0
          Flanken_anzahl = 0
          Impuls_laenge = 0
          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

  9. #19
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Bist du denn sicher, dass deine Fernbedienung RC5 oder SIRCS sendet?
    Außerdem denke ich, dass du den Startwert des Timer0 auf etwas in Richtung 160 ändern solltest.

    Gruß

    Rolf

  10. #20
    Neuer Benutzer Öfters hier
    Registriert seit
    16.05.2009
    Beiträge
    7
    Hallo Rolf...

    Danke für deine antwort...

    Ja.. Ich bin mir ganz sicher das sie RC5 Senden da ich sie selber gebaut und programmiert habe....

    Und mit dem Befehl GetRC5 kann ich sie auch abfragen....

    Den Startwert hab ich auf 160 gestellt aber es geht immer noch nicht... das LCD zeigt mir nichts an....

    Ich würde es ausserdem gerne auf einem MEGA 8535 laufen lassen wenn das ginge...


    Ach ja... welcher Code ist jetzt eigentlich "nur" für RC5 und welcher ist universal??

    Ich bräuchte den universalen wenns geht

    Danke schon mal im vorraus....

    Gruß Flo

Seite 2 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress