-         

Ergebnis 1 bis 8 von 8

Thema: SIRCS

  1. #1

    SIRCS

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    ich möchte meine Fernbedienung auch für andere Zwecke nutzen. Am Oszi ist deutlich zu erkennen, dass es sich um den SIRCS-Code handelt. Da der IR-Empfänger invertiert, sind deutlich kurze und lange Impulse zu erkennen. Da ich den Code im Detail nicht kenne, wollte ich mit einem kleinen Programm den Wert der erste 8 Bit(?) lesen. Seltsamerweise erhalte ich nur den Wert für kurze Impulse, was aber nicht sein kann. Ich bin ratlos.
    Ich hoffe, ihr könnt mir helfen, obwohl ich Bascom8051 nutze. Ich finde kein geeignetes Forum dafür.
    Dolivo
    Angehängte Dateien Angehängte Dateien

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Kannst du mal ein Bild von dem Code auf dem Oszi machen?

  3. #3
    da mein Oszi nicht das Neueste ist und ich nicht recht weiß, wie ich ein gut erkennbares Foto machen kann, habe ich die Impulsfolge gezeichnet. Ich habe den schnellen Vorlauf des Videorecorders genommen, da es den bei mir nicht gibt.
    Als Wert erhalte ich stets 559, was ja ca. 600 µs entspricht.
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken fernb.jpg  

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Hallo,
    die Folge, die du zeigst, ist sicherlich kein SIRCS Code. Du kannst deutlich sehen, dass nicht nur die High Phasen unterschiedlich lang sind, sondern auch die Low Phasen. Abgesehen von Anfang und Ende sind zudem die High und Low Anteile genau gleich, was ebenfalls auf eine Manchester Codierung wie bei RC5 oder RC6 deutet. Dafür werden aber zu wenig Bits übertragen.
    Ich kenne mich jetzt nicht mit dem 8051 aus, aber du kannst doch sicherlich über den Eingang INT0 einen Interrupt auslösen lassen.
    Dann würde ich dort das Signal einlesen und bei jeder Flanke über den Timer die Zeit messen. Diese kannst du dann in eine Bitfolge und damit eine Zahl umwandeln und sie für diese Taste merken.

  5. #5
    Wegen des 2,5 ms-Impulses am Anfang hatte ich auf SIRCS getippt, bin aber kein Experte.
    Mir ist nicht klar, wie ich über den INT0 zum Timer-Wert komme. Der Interrupt wird doch durch die Flanke gestartet. Wie muss dann die Interrupt-Routine aussehen?
    Nun aber zum Wesentlichen: Ich lasse jetzt die Impulsfolge 3 mal einlesen und nehme die letzte Reihe. Sie sind jetzt reproduzierbar. Warum erst dann ist mir zwar nicht klar, aber es funktioniert. Werde schon noch dahinter steigen.
    Danke für die Hilfe.
    dolivo

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Mit INT0 und Timer0 habe ich mal für einen Mega8 so ein Testprogramm gemacht:

    Code:
    $crystal = 8000000
    $regfile = "m16def.dat"
    $hwstack = 64                                               ' default use 32 for the hardware stack
    $swstack = 64                                               'default use 10 for the SW stack
    $framesize = 128                                            'default use 40 for the frame space
    $baud = 38400
    
    Dim Impuls_laenge As Word , Flanken_index As Byte , Flanken_anzahl As Byte , Bit_count As Byte
    Dim Timer0_startwert As Byte
    
    Config Timer0 = Timer , Prescale = 8                        'hier den Timer eintragen (8-bit)
    On Ovf0 Tim0_isr
    Enable Timer0
    Timer0_startwert = 156                                      'bei mir 8000000/8/(256-156) 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
    Config Serialout = Buffered , Size = 100
    Print ""
    Enable Interrupts
    Do
    Loop
    End
    
    Tim0_isr:
       Timer0 = Timer0_startwert
       Incr Impuls_laenge                                       'bei jedem Überlauf um 1 erhöhen
       If Impuls_laenge > 1000 Then                             'nach 0.1 ohne Signal Stop Timer0
          Stop Timer0
          Timer0 = Timer0_startwert
          Impuls_laenge = 0
          Print ""
       End If
    Return
    
    Get_rc_isr:                                                 'RC Impuls erkannt
       If Impuls_laenge > 0 Then
          Print Impuls_laenge ; " ";
          Impuls_laenge = 0
       Else
          Start Timer0
       End If
    Return
    Es sollte die High- und Low-Zeiten zum PC schicken.
    Probier es mal aus. Musst du aber auf deinen 8051 umändern.

  7. #7
    Hallo, for-ro,
    vielen Dank für das Testprogramm. Da ich anfange, mich auch mit den AVR zu beschäftigen, werde ich es bei Gelegenheit nutzen. Vielleicht nehme ich einen ATtiny für mein Vorhaben.
    In Bascom8051 geht es nicht so schön umzuschreiben, weil da der Interrupt nur mit fallenden Flanken ausgelöst werden kann. Deswegen auch das umständliche "bitwait". Bis zum nächsten Mal.
    dolivo

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Dann ändere doch den Interrupt Auslöser auf falling ab. Für die auswertung ist das nicht wesentlich anders. Hauptsache, du weißt dann schon einmal, welcher Code übertragen wird.
    Ich habe dir mal in deine Zeichnung die Bedeutung eingetragen, wobei die 0 und 1 auch genau andersherum sein kann. Aber das ist bei dir ja egal.
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken ir-code.jpg  

Berechtigungen

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