-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: Einfache IR-Code Übertragung funktioniert nicht

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    12.12.2013
    Alter
    43
    Beiträge
    22

    Einfache IR-Code Übertragung funktioniert nicht

    Anzeige

    Hallo zusammen,

    Ich kämpfe zur Zeit mit den Tücken einer „Infrarot-Kanone“ für Modellflugzeuge (indoor).

    Den Aufbau habe ich mir so vorgestellt:
    Ein Attiny45 (da klein und leicht), eine IR Diode (LD 274-3) und ein IR Empfänger (TSOP34836), das ganze angeschlossen zwischen RC-Empfänger und Motor-Regler. Optional ein weiterer Anschluss zwischen RC-Empänger und Attiny für den Trigger (zunächst aber ohne Trigger, nur mit „Dauerfeuer“).

    Wie soll das ganze funktionieren:
    1. Im normalen Flug wird das RC-Throttle-Signal (Gas) durch den Attiny „durchgeschleift“.
    2. Die IR-LED „feuert“ ständig. (Optional: Die IR-LED feuert erst, wenn an der Fernsteuerung ein Schalter/Taster betätigt wird).
    3. Wird der IR-Empfänger von einem passenden Infrarot-Signal „getroffen“ soll der Motor für eine bestimmte Zeit ausgehen bzw. stottern (unterbrechen des bis dahin durchgeschleiften Gas-Kanals).

    Ich habe bis jetzt noch nichts mit IR-Übertragungen gemacht (nur viel gelesen). Das RC5 Protokoll scheidet aber aus, da es viel zu lang ist. Mir schwebt im Moment ein sehr kurzes individuelles Protokoll vor. Meine Gedanken gehen in Richtung „3-Bit-Protokoll“. Ein Start-Bit und 2 Kommand-Bits. Damit sollten 4 verschiedene IR-Befehle übertragbar sein. Mit den unterschiedlichen Befehlen könnte man später mit mehreren Flugmodellen auf ein einzelnes Bodenziel schießen, mit anschließender Trefferauswertung. Auch ein „Team-Deathmatch“ z.B. zwei gegen zwei wäre denkbar, bei dem man sogar in der Software „friendly fire“ ausschließen könnte.

    Im folgenden Code habe ich versucht, die IR-Übertragung zu realisieren. Leider klappt das nur mit mäßigem Erfolg. IR-LED und TSOP stehen sich gegenüber. Die Kontroll-LED sollte eigentlich durchgehend leuchten, flackert aber die ganze Zeit. Wird die optische Verbindung zwischen IR-LED und TSOP unterbrochen, geht die Kontroll-LED wie gewünscht aus.

    Ich habe es nicht geschafft, eine halbwegs verlässliche Datenübertragung herzustellen.

    Bin langsam am verzweifeln und für alle Ideen offen


    mfg
    Robert


    Hier noch ein paar Infos, wo ich meine Inspiration her habe:
    http://www.youtube.com/watch?v=TQp0mS8dtpg
    oder einfach nach „20100117 IAC-ASO 52“ suchen.
    Ab 1:36 geht’s los mit dem IR-Stuff, ab 2:51 Minuten sieht man „Luftkämpfe“
    Meine Modelle werden allerdings etwas größer sein



    PS: Wenn ich die Sendepause im Code nicht ausklammere, leuchtet die Kontroll-LED gar nicht.

    Code:
    '===============================================================================
    'IR Kanone V 01
    '
    'IR-LED an Pin 5 (PB0, OCR0A)
    'TSOP34836 an Pin 7 (PB2, INT0)
    '
    '
    '
    '
    '
    'Pin 6 (PB1 Test-LED)
    '===============================================================================
    
    $regfile = "attiny45.dat"
    $crystal = 8000000                                          'FuseBit CKDIV8 deaktivieren
    
    $hwstack = 40
    $swstack = 40
    $framesize = 50
    
    
    '-------------------------------------------------------------------------------------------------
    'Timer konfigurieren
    '-------------------------------------------------------------------------------------------------
    
    Tccr1 = &B00000111                                          'Timer1 als Zeitbasis für Datenempfang starten (Prescale 64) (geht beim Attiny45 nicht mit "Config"!)
    'Enable Timer1 (wird erst in der ISR enabled!!!)
    On Timer1 Daten_sammeln
    
    
    
    Config Timer0 = Timer , Prescale = 1 , Compare A = Toggle , Clear Timer = 1       'Timer0 erzeugt 36kHz IR-Trägerfrequenz, Clear Timer setzt Timer bei Erreichen des Comparewertes auf 0 zurueck
    Ocr0a = 110
    
    
    '-------------------------------------------------------------------------------------------------
    'Interrupt-Service-Routinen konfigurieren und freigeben
    '-------------------------------------------------------------------------------------------------
    
    
    Config Int0 = Rising                                        'bei steigende Flanke an PB2/INT0 (Ir_data_in) Int0 auslösen und in die Subroutine springen
    Enable Int0
    On Int0 Ir_data_start
    
    Enable Interrupts
    
    
    '-------------------------------------------------------------------------------------------------------------
    'Variablen definieren
    '-------------------------------------------------------------------------------------------------------------
    Dim Ir_befehl As Byte                                       'es steht einer von 4 möglichen Sendebefehlen zur Verfügung
    Dim Level As Byte
    Dim Ir_data As Byte                                         'zusammensetzen des IR Befehl
    Dim Ir_data_fertig As Byte                                  'fertig empfangener IR Befehl
    
    
    
    '-------------------------------------------------------------------------------------------------------------
    'Ein- und Ausgang festlegen
    '-------------------------------------------------------------------------------------------------------------
    
    Ddrb = &B00010011                                           'PB0, PB1 und PB4 werden Ausgänge, restlicher PortB bleibt Eingang
    
    
    
    '======================================================
    'Hauptprogramm
    '======================================================
    
    Do
    
    
    Ir_befehl = &B00000101
    '                  |||
    '                  ||Zweites Befehlsbit
    '                  ||
    '                  |Erstes Befehlsbit
    '                  |
    '                  Startbit
    
    'Alternative Befehle:
    'Ir_befehl = &B00000100
    'Ir_befehl = &B00000110
    'Ir_befehl = &B00000111
    
    
    'Startbit senden (immer 1)
    Ddrb.0 = Ir_befehl.2                                        ' 36 kHz Carrier on
    Waitus 500
    Ddrb.0 = 0                                                  ' 36 kHz Carrier off
    Waitus 500
    
    'Erstes Befehlsbit senden
    Ddrb.0 = Ir_befehl.1
    Waitus 500
    Ddrb.0 = 0
    Waitus 500
    
    'Zweites Befehlsbit senden
    Ddrb.0 = Ir_befehl.0
    Waitus 500
    Ddrb.0 = 0
    Waitus 500
    '(
    'Sendepause einlegen
    Ddrb.0 = 0
    Waitus 2000
    ')
    
    
    If Ir_data_fertig = &B00000101 Then                         'Test LED soll leuchten, wenn der richtige Code empfangen wurde
    Portb.1 = 1
    Else
    Portb.1 = 0
    End If
    
    
    Loop
    
    End
    
    
    
    '-------------------------------------------------------------------------------------------------------------
    'ISR IR Daten empfangen
    '-------------------------------------------------------------------------------------------------------------
    
    Ir_data_start:
    Ir_data = &B00000001
    Timer1 = 155                                                ' nach rund 808 us den Timer Interrupt auslösen
    Enable Timer1
    Disable Int0                                                ' weiter Interrupts durch INT0 unterbinden
    
    Return
    
    
    
    Daten_sammeln:
    Shift Ir_data , Left
    Level = Not Pinb.2                                          'TSOP gibt invertierte Daten aus, deshalb nochmal inventieren
    Ir_data = Ir_data + Level                                   'eben gelesenes Bit zugeben
    Timer1 = 131                                                ' nach rund 1000us den Timer Interrupt auslösen                                                '
    If Ir_data < &B00000100 Then
       nop
       Else
       Disable Timer1                                           'weitere Interrupts durch Timer1 unterbinden
       Set Gifr.intf0                                           'Interruptflag vom INT0 löschen
       Enable Int0
       Ir_data_fertig = Ir_data
    End If
    
    Return

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    938
    Schau ganz genau im Datenblatt nach: Viele dieser Empfängerbausteine sind nicht für Dauer-Ein spezifiziert sondern brauchen Sendepausen. Das hat irgendwie mit ihrer AGC (automatic gain control) / Arbeitspunkt der Filterschaltung für die Fremdlichtunterdrückung zu tun.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    12.12.2013
    Alter
    43
    Beiträge
    22
    Hallo RoboHolIC,

    das Datenblatt hab ich mir unzählige male durchgeschaut und auch einige Testprogramme probiert, um die "Grenzen" des TSOP auszuloten.
    Im Datenblatt steht u.a. "Minimum burst length: 10 cycles/burst" und "After each burst of length a minimum gap time is required of: 10 to 70 cycles, ≥ 10 cycles". Bei einer Trägerfequenz von 36kHz dauert ein cycle rund 27,8 us. Bei meinen angegebenen 500 us komme ich damit auf 18 cycles/burst und liege damit absolut im grünen Bereich.

    Beim folgenden Testprogramm macht die Kontroll-LED genau das gleiche, wie die IR-LED (außer natürlich, wenn die optische Verbindung unterbrochen wird, dann bleibt sie aus).

    Code:
    '===============================================================================
    'IR Kanone V 01
    '
    'IR-LED an Pin 5 (PB0, OCR0A)
    'TSOP34836 an Pin 7 (PB2, INT0)
    '
    'Pin 6 (PB1 Test-LED)
    '===============================================================================
    
    $regfile = "attiny45.dat"
    $crystal = 8000000                                          'FuseBit CKDIV8 deaktivieren
    
    $hwstack = 40
    $swstack = 40
    $framesize = 50
    
    
    '-------------------------------------------------------------------------------------------------
    'Timer konfigurieren
    '-------------------------------------------------------------------------------------------------
    
    Config Timer0 = Timer , Prescale = 1 , Compare A = Toggle , Clear Timer = 1       'Timer0 erzeugt 36kHz IR-Trägerfrequenz, Clear Timer setzt Timer bei Erreichen des Comparewertes auf 0 zurueck
    Ocr0a = 110
    
    
    '-------------------------------------------------------------------------------------------------
    'Interrupt-Service-Routinen konfigurieren und freigeben
    '-------------------------------------------------------------------------------------------------
    
    Config Int0 = Change                                        'beim Flankenwechsel an PB2/INT0 (Ir_data_in) Int0 auslösen und in die Subroutine springen
    Enable Int0
    On Int0 Ir_data_in                                          
    
    Enable Interrupts
    
    
    '-------------------------------------------------------------------------------------------------------------
    'Ein- und Ausgang festlegen
    '-------------------------------------------------------------------------------------------------------------
    
    Ddrb = &B00010011                                           'PB0, PB1 und PB4 werden Ausgänge, restlicher PortB bleibt Eingang
    
    
    '======================================================
    'Hauptprogramm
    '======================================================
    
    Do
    
    Ddrb.0 = 1                                                  ' 36 kHz Carrier on
    Waitus 500
    Ddrb.0 = 0                                                  ' 36 kHz Carrier off
    Waitus 500
    
    
    'Sendepause einlegen
    Ddrb.0 = 0
    Wait 2
    
    
    Loop
    
    End
    
    
    '-------------------------------------------------------------------------------------------------------------
    'ISR IR Daten empfangen
    '-------------------------------------------------------------------------------------------------------------
    
    Ir_data_in:
    If Pinb.2 = 0 Then
    Portb.1 = 1
    Else
    Portb.1 = 0
    End If
    
    Return
    Die Zahlen habe ich in einem weiten Bereich getestet. Alles über 300 us wird problemlos übertragen (300 us entspricht ca. 10 cycles/burst und deckt sich somit perfekt mit dem Datenblatt). Auch die Sendepause habe ich von 0 (null) bis mehreren Sekunden getestet. Im Code sind 2 sec angegeben, d.h. die Kontroll-LED blitzt alle 2 sec kurz auf.

    Ich bin mir daher sicher, dass es nicht am TSOP oder dem gesendeten IR-Signal liegt, da diese Übertragung problemlos klappt. Es scheitert offensichtlich an der Signalauswertung im Programmcode

    mfg
    Robert

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.410
    Blog-Einträge
    101
    Hai ,

    Zitat Zitat von R2D2 Bastler Beitrag anzeigen
    Code:
    '-------------------------------------------------------------------------------------------------------------
    'ISR IR Daten empfangen
    '-------------------------------------------------------------------------------------------------------------
    
    Ir_data_start:
    Ir_data = &B00000001
    Timer1 = 155                                                ' nach rund 808 us den Timer Interrupt auslösen
    Enable Timer1
    Disable Int0                                                ' weiter Interrupts durch INT0 unterbinden
    
    Return
    Könnte ein Bug hier versteckt liegen?
    Zum Zeitpunkt des Ansprungs der "Ir_data_start:" könnte das TOV1 Interruptflag schon gesetzt sein, da der Timer1 läuft. Durch das "Enable Timer1" springt AVR deshalb SOFORT nach Beendigung von "Ir_data_start:" in die "Daten_sammeln:"
    Abhilfetest: Nach "Timer1 = 155" ein "set tifr.tov1" (vorsorglich anstehendes TOV1 Flag löschen) einfügen?

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.552
    Hi Robert,

    genau wegen der regelmässigen Pflichtpause der TSOPs habe ich die noch nicht verwendet (hab also keine Erfahrung damit), habe aber schon Fernsteuerungen mit ähnlichen, kurzen Sendeprotokollen mit den OSRAM-Empfängern betrieben (Beispiel hier).

    ... Datenblatt steht ... Bei meinen angegebenen 500 us ... 18 cycles/burst ... im grünen Bereich ...
    Deine Rechnung kapier ich nicht. Du nennst ein minimales Protokoll von drei Bit, daraus rechne ich mal : drei Pulse (=: Modulation ist on, bursts) zu je min 10 cycles => dreissig cycles, dazwischen zwei Pausen (=: Modulation ist off) zu je min 14 cycles *) => 28 cycles, insgesamt schlappe sechzig cycles von 36 kHz, macht bei mir 1,66666 ms für ein komplettes Telegramm/Kommando. Das ist nahe an 1,8 ms, also meiner Meinung nach schon etwas grenzwertig **). Daher würde ICH das geforderte Gap von 4*60cycles => 6,7 ms nach einem Telegramm einschieben. Keinesfalls aber Dein oben erwähntes:
    Zitat Zitat von R2D2 Bastler Beitrag anzeigen
    ... (zunächst aber ohne Trigger, nur mit „Dauerfeuer“).
    ... aber das "Dauerfeuer" hast Du ja offenbar schon abgelegt. Allerdings finde ich eben weder Deine 500 ms, noch Deine 18 cycles/burst *grübel*. Vielleicht könntest Du mal ne Skizze machen ?

    Zur Theorie der IR-Fernsteuerungen hat übrigens San Bergmans eine prächtige Dokumentation online.



    *)
    Zitat Zitat von Datenblatt TSOP 348..
    ... • After each burst which is between 10 cycles and 70 cycles a gap time of at least 14 cycles is necessary. ...
    **)
    Zitat Zitat von Datenblatt TSOP 348..
    ... • For each burst which is longer than 1.8 ms a corresponding gap time is necessary at some time in the data stream. This gap time should be at least 4 times longer than the burst. ...
    Ciao sagt der JoeamBerg

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    12.12.2013
    Alter
    43
    Beiträge
    22
    Hallo zusammen,

    Zitat Zitat von Searcher Beitrag anzeigen
    Abhilfetest: Nach "Timer1 = 155" ein "set tifr.tov1" (vorsorglich anstehendes TOV1 Flag löschen) einfügen?
    Du wirst lachen, genau das hatte ich auch schon im Code, allerdings blieb die Kontroll-LED dann aus



    Zitat Zitat von oberallgeier Beitrag anzeigen
    aber das "Dauerfeuer" hast Du ja offenbar schon abgelegt.
    Hier habe ich mich vermutlich etwas ungeschickt ausgedrückt. "Dauerfeuer" bezog sich lediglich auf die (noch) nicht vorhandene Möglichkeit, das Senden der IR-LED durch die RC-Fernbedienung (die das Flugmodell mittels Funk steuert) zu beinflussen (wenn ich z.B. 1-2 Minuten einfach so durch die Halle fliege und dann beschließe, durch Umlegen eines Schalters an der RC-Fernbedienung, mit meinem "Bordgeschütz" zu feuern). Es bezog sich nicht auf die vom TSOP geforderten Sendepausen.




    Vielleicht könntest Du mal ne Skizze machen ?
    Gerne. Im Bild sieht man das Signal, welches die IR-Diode sendet, wenn der Code 101 ausgegeben werden soll. Im Anschluß folgt dann noch eine längere Sendepause, aber selbst ohne diese währe nach meinem Wissen der TSOP nicht überfordert (oder habe ich etwas komplett missverstanden )

    Klicke auf die Grafik für eine größere Ansicht

Name:	Burst.jpg
Hits:	11
Größe:	14,8 KB
ID:	27323




    Zitat Zitat von Datenblatt TSOP 348..
    ... • After each burst which is between 10 cycles and 70 cycles a gap time of at least 14 cycles is necessary. ...
    Also, die Sätze habe ich in meinem Datenblatt nicht gefunden, benutze dieses hier:
    https://www.it-wns.de/data/datenblatt_0000168_1.pdf

    Aber auch dann: Ich habe doch bei meinem Code immer mindestens 18 cycles Pause vor dem nächsten Senden. Daran dürfte es nicht liegen.


    Ich bin, wie bereits anfangs erwähnt, nicht total auf "meinen" Code fixiert. Ich nehme auch gern jede andere Möglichkeit der Codegestaltung/Übertragung/Auswertung in Kauf. Es sollen lediglich 4 verschiedene Befehle übertragen werden können und keine Wait-Befehle in einer ISR beinhalten, da ich sonst beim weiteren Ausbau des Codes (RC-Signale einlesen etc) Schwierigkeiten bekomme.

    mfg
    Robert

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.552
    ... die Sätze habe ich in meinem Datenblatt nicht gefunden, benutze dieses hier ...
    Gut, beide sind vom Hersteller. Bei Vishay läuft offenbar die Zeit rückwärts. Das Datenblatt bei mir ist Rev. 5, 23-Jun-03 - immerhin sieben Seiten, das Datenblatt bei Dir ist Rev. 1.3, 29-Jan-09 - sechs Seiten.

    Achtung: Deine logische "1" ist mir nicht logisch (wohl eher falsch). Der Photodetektor geht üblicherweise bei Empfang einiger Modulationspeaks auf low - also ist eine (im Datenblatt definierte) Serie von Peaks eine logische Null - siehe "mein" Datenblatt, Seite 3, links oben. ERST der Wechsel von logisch Eins (Modulation wird erkannt) auf Null in einem bestimmten Zeitraum lässt sich als "Eins" definieren - z.B. beim Manchestercode. Du scheinst da etwas noch zu verwechseln. Schau mal bei den Infos von SB nach (Link ist oben).
    Ciao sagt der JoeamBerg

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    12.12.2013
    Alter
    43
    Beiträge
    22
    Hallo nochmal,

    mit Logisch 1 und 0 , sowie dem Diagramm im Bild meinte ich das, was die IR-LED sendet.
    Das mit dem inventierten Signal beim TSOP hab ich gesehen. Deshalb schrieb ich im Programm die erste 1 auch manuell in die Variable "Ir_data"

    Code:
    Ir_data_start:
    Ir_data = &B00000001
    'Timer1 = 155                                                ' nach rund 808 us den Timer Interrupt auslösen
    Timer1 = 180                                                ' nach rund 608 us den Timer Interrupt auslösen
    Mit unterschiedlichen Timerwerten versuchte ich dann, die zeitliche Abfrage des TSOP so zu timen, dass er sich sicher in einem definierten Zustand befindet (es geht ja auch Zeit für das Springen in die ISRs verloren). Da ein gesendetes high (logisch 1) beim TSOP dann als low ausgegeben wird, habe ich diese Abfrage mit "Not" wieder inventiert, siehe hier

    Code:
    Level = Not Pinb.2

    Hier nochmal mein gedankliche Ablauf, wann was passieren "müsste"

    Klicke auf die Grafik für eine größere Ansicht

Name:	Burst1.jpg
Hits:	8
Größe:	36,7 KB
ID:	27325


    Wenn also die IR-LED eine logische 1 sendet, sollte in der Variable "Ir_data" auch eine 1 landen.

    Beim Zeichnen des Bildes kam mir allerdings ein Gedanke: Was passiert, wenn der TSOP erst die zweite 1 bemerkt. Dann wäre meine ganze Auswertung im Eimer.
    Mann, das "bisschen" IR-Übertragen bringt mich bald ins Grab...


    mfg
    Robert

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.410
    Blog-Einträge
    101
    Hallo,
    Zitat Zitat von R2D2 Bastler Beitrag anzeigen
    Mann, das "bisschen" IR-Übertrtragen bringt mich bald ins Grab...
    Hier noch ein Sargnagel

    Du hattest doch zuletzt ein Programm zum Einlesen und Ausgeben von Servo Signalen auf Tiny45 gemacht. Das hab ich hergenommen und ASM der EmpfangsISR angepaßt und Codeschnipsel für eine IR-Empfangsprogramm draus gemacht. Ging besser als viel Text zu schreiben.

    Im Grunde werden Länge von IR Signalpause und IR Signalimpuls vom TSOP gemessen. Die Länge auf Gültigkeit geprüft und einer Auswerteroutine übergeben. Hoffe ist verständlich und es bleibt noch einige Arbeit ...

    Wie damit Sender UND Empfänger auf einem µC untergebracht werden ??? Irgendwie einen Timer doppelt verwenden. Geht erstmal nur ums Prinzip.

    Code:
    '======================================================
    'ISR
    '======================================================
    
    
    Rc_eingang_1:                                               'ISR mit NOSAVE anspringen
     $asm
       push r17                                                 'Register auf Stack sichern
       sbis pinb , 2                                            'Skip next Instr if PINB.2 = 1
       rjmp Puls_ende1                                          'Springe Puls_ende
       in r17 , tcnt1                                           'Timer1 Wert holen
       sts {Rc_signal_1_start} , r17                            'Speichere Timer1 nach Rc_signal_1_start
    
    '##### für IR Bitlängenmessung
       ldi r17 , 1
       sts {Rc_signal_1_start_flag} , r17                        'Setze Flag zur Bearbeitung von Impulslaenge in Hauptschleife
    '#####
    
       rjmp ende1                                               'Springe zum Ende
      Puls_ende1:
       in r17 , tcnt1                                           'Timer1 Wert holen
       sts {Rc_signal_1_stop} , r17                             'Speichere Timer1 nach Rc_signal_1_stop
       ldi r17 , 1
       sts {Rc_signal_1_stop_flag} , r17                        'Setze Flag zur Bearbeitung von Impulslaenge in Hauptschleife
      Ende1:
       pop r17                                                  'Register vom Stack zurückholen
     $end Asm
    Return
    
    
    
    
    do   '####   Haupschleifenausführung darf nicht länger als eine gültige Bitlänge dauern
    
      If Rc_signal_1_start_flag = 1 Then                           'Bearbeitung nur, wenn ISR Pulsanfang gefunden hat
          Pausen_laenge_1 = Rc_signal_1_stop - Rc_signal_1_start
          Rc_signal_1_start_flag = 0
          if Pausen_laenge > 400µs and pausen_laenge < 600µs then     'vorsicht pseudocode
            received_bit = 0
            received_bit_flag = 1                                   'Anzeige eines Emfangs eines gültigen Bits  
          end if
      End If
    
      If Rc_signal_1_stop_flag = 1 Then                           'Bearbeitung nur, wenn ISR Pulsende gefunden hat
          Impuls_laenge_1 = Rc_signal_1_stop - Rc_signal_1_start
          Rc_signal_1_stop_flag = 0
          if Impuls_laenge > 400µs and Impuls_laenge < 600µs then    'vorsicht pseudocode
            received_bit = 1
            received_bit_flag = 1                                    'Anzeige eines Emfangs eines gültigen Bits  
          end if
      End If
    
    
      if received_bit_flag = 1 then
    
           '### Empfangene Bits (die von "received_bit") aufreihen und auf gültiges bitmuster scannen
    
         received_bit_flag = 0
      end if
    
    loop
    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  10. #10
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.552
    ... es geht ja auch Zeit für das Springen in die ISRs verloren ...
    Das ist jetzt nicht Dein Ernst? Wie langsam tickert denn Dein Controller? Ist das ein tiny13 mit dem internen 128 kHz-Oszillator? Oder noch langsamer?

    Im Ernst: bei dem burst von 500 µs (und ohne sonstige Interrupts oder Interrupt-long-run-Kunststücke) kannst Du die Zeit vom Eintritt des Ereignisses bis zum Beginn der ISR bei Takten über 1 Mhz beruhigt erstmal vergessen.

    Ich bin nicht sicher, dass Dir klar ist, was am Eingang des Controllers - also am Anschluss des SigOut des TSOP passiert - wenn die irLED mit 36 kHz zum Blinken beginnt - - und wieder aufhört.

    a) irLED blinkt nicht (aus, kein irLicht wird abgegeben, die LED ist wirklich dauerdunkel)
    ....TSOP empfängt nix => SigOut-TSOP ist high

    b) irLED blinkt seit drei bis vier 36-kHz-Pulsen
    ....TSOP empfängt nix => SigOut-TSOP ist high

    c) irLED hat zehn oder mehr 36-kHz-Pulse abgeschickt
    ....Der TSOP hat gemerkt, dass ihm jemand etwas mit der "richtigen" Frequenz zublinkt
    ....Der TSOP-SigOut geht auf low

    d) Die irLED blinkt weiter, sagen wir mal so zehn bis 20 36-kHz-Pulse
    ....Der TSOP-SigOut bleibt auf low

    e) Die irLED ist AUS (blinkt nicht, ist wirklich dauerdunkel) seit drei bis vier 36-kHz-Pulsen
    ....TSOP empfängt nix => SigOut-TSOP ist trotzdem/noch immer (ein bisschen *gg*) low

    f) Die irLED ist weiter aus, sagen wir mal so zehn bis 20 36-kHz-Pulse
    ....Der TSOP-SigOut geht auf high, weil er längere Zeit keine 36-kHz-Pulse empfängt.

    Wenn Dein Programm (ich programmiere C, kann kein Bascom) das berücksichtigt, dann ists ok. Du brauchst nicht unbedingt das/Dein Datenprotokoll einzuhalten, das Du vermutlich bei irgendeinem Code zur Manchesterdekodierung abgeguckt hast!

    ... Hier nochmal mein gedankliche Ablauf, wann was passieren "müsste" ...
    Hier nochmal mein gedankliche Ablauf, wann was passieren "müsste"

    Na ja, schon schon, aber ich finde, dass hier Ursache und Wirkung nicht übersichtlich genug dargestellt wird. Passt dieses Diagramm zur obigen Abfolge a) bis f) ?????

    PS: bist Du die Theorie der IR-Fernsteuerung schon durchgegangen?
    Ciao sagt der JoeamBerg

Seite 1 von 3 123 LetzteLetzte

Ähnliche Themen

  1. Yeti: Übertragung funktioniert nicht! Hilfe!
    Von Mandy88 im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 3
    Letzter Beitrag: 29.03.2010, 07:08
  2. IR Übertragung funktioniert nicht
    Von -Hunter- im Forum Asuro
    Antworten: 16
    Letzter Beitrag: 18.06.2008, 21:59
  3. Übertragung funktioniert nicht mehr richtig
    Von A.S.U.R.O. im Forum Asuro
    Antworten: 5
    Letzter Beitrag: 23.03.2008, 15:09
  4. AVR UART Übertragung funktioniert nicht
    Von theneutrino im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 08.04.2007, 13:29
  5. Übertragung funktioniert nicht
    Von dominik66 im Forum Asuro
    Antworten: 1
    Letzter Beitrag: 02.10.2006, 16:34

Stichworte

Berechtigungen

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