AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Wie Signale einer IR Fernbedienung für ComPort empfangen?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie Signale einer IR Fernbedienung für ComPort empfangen?

Ein Thema von Cyberaxx · begonnen am 9. Okt 2007 · letzter Beitrag vom 15. Okt 2007
Antwort Antwort
Seite 2 von 3     12 3      
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#11

Re: Wie Signale einer IR Fernbedienung für ComPort empfangen

  Alt 11. Okt 2007, 01:20
Zitat von Cyberaxx:
http://www.sprut.de/electronic/ir/rc5.htm

Da es hier zum Posten zu viel Text ist poste ich auch mal einen Link.

Jetzt schaue ich mir Deinen auch mal an. :)
Laut Link: der 36 kHz Carrier wird vom Receiver detektiert, die einzelnen Impulse muss man also nicht berücksichtigen. Es bleibt aber dabei: es müssen bis zu 28 Flanken erfasst werden im Abstand von 0.89 oder 1.78 msec - wobei das gerade der Unterschied zwischen 0 und 1 ist. Um das zuverlässig abzutasten, müsste man einen Timer mit einer Periode 0.222 msec haben, den es unter Windows nicht gibt. Man könnte höchstens mit WaitCommEvent die Flanken erfassen, aber dann müsste man testen, ob das System tatsächlich alle einzeln erwischt, und ob man den Zeitabstand genau genug bestimmen kann, etwa mit QueryPerformanceCounter.

Natürlich ist sowas für einen PIC-Prozessor u.ä. kein Problem, der muss ja auch nicht Windows ausführen.

Gruss Reinhard
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#12

Re: Wie Signale einer IR Fernbedienung für ComPort empfangen

  Alt 11. Okt 2007, 07:17
Nach einigem rumsuchen bin ich auf einen Source gestoßen der das ausgeben des RC5 Codes unter Delphi ermöglicht. Basiert auf der Port.dll, noch einer weiteren DLL und der verarbeitung im Programm. Leider funktioniert er nicht, er läßt sich nicht Compilieren. Nachdem ich mir aber den Source angesehen habe, ist mir da aufgefallen das dort das Delay über den QueryPerformanceCounter geregelt wird. Dieser rechnet in Microsekunden.

Konnte mir aus Zeigründen nicht den ganzen Source gestern ansehen aber ich würde das dann so umsetzen.
Im Hintergrund läuft ein Thread. Er bekommt einen eigenen Constructor in dem der Port festgelegt wird.
Der Port wird geöffnet, das Execute im Thread bleibt so lange in der Schliefe bis man ihn beendet.
Dort setzt man ein Delay mit hilfe des QueryPerformanceCounter.

Muß das am Wochenende mal testen, wäre auf jedenfall gut wenn es funktionieren würde.
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#13

Re: Wie Signale einer IR Fernbedienung für ComPort empfangen

  Alt 14. Okt 2007, 01:44
So ich habe da mal etwas gebastelt was aber nun mal wieder nicht funktioniert.

Mal abgesehen davon das er das System ein wenig lahm legt.

Delphi-Quellcode:
const
  fDtrControlEnable = 16; // DTR flow control type $0010
  fRtsControlEnable = 4096; // RTS flow control $1000

  Rc5Time = 24889; //us
  Rc5BitTime = Rc5Time div 14;
  Rc5HalfBitTime = Rc5Time div 28;
  Rc5QbitTime = Rc5Time div 56;

var
  Freq: Int64;

procedure TRc5Thread.Execute;
  var
    TmpValue: Integer;
    Value: Integer;
    I: Integer;
    T: Integer;
begin
  while not Terminated do begin

    T := 0;

    Windows.QueryPerformanceFrequency(Freq);

    if PegelValue = 0 then begin
      IrDelay(Rc5HalfBitTime);

      if PegelValue = 1 then begin
        IrDelay(Rc5HalfBitTime);

        if PegelValue = 0 then begin
          IrDelay(Rc5HalfBitTime);

          if PegelValue = 1 then begin
            IrDelay(Rc5HalfBitTime);

            TmpValue := PegelValue;
            IrDelay(Rc5HalfBitTime);
            Value := PegelValue;
            if TmpValue <> Value then begin // Zustände müssen unterschiedlich sein
              FCode[1] := 0;
              FCode[2] := 1;
              FCode[3] := 0;
              FCode[4] := 1;
              FCode[5] := TmpValue;
              FCode[6] := Value;

              IrDelay(Rc5HalfBitTime);
              T := 6;

              for I := 7 to 16 do begin
                TmpValue := PegelValue;
                IrDelay(Rc5HalfBitTime);
                Value := PegelValue;

                if TmpValue <> Value then begin
                  FCode[I] := TmpValue;
                  Inc(T);
                  end;
                end;

              for I := 17 to 28 do begin
                TmpValue := PegelValue;
                IrDelay(Rc5HalfBitTime);
                Value := PegelValue;

                if TmpValue <> Value then begin
                  FCode[I] := TmpValue;
                  Inc(T);
                  end;
                end;

              end;
            end;
          end;
        end;
      end;

    if T = 28 then
      Synchronize(SetRC5);

    IrDelay(Rc5QbitTime);
    end;
end;

procedure TRc5Thread.IrDelay(uS: Integer);
  var
    AktCount: Int64;
    NewCount: Int64;
    OldCount: Int64;
begin
  Windows.QueryPerformanceCounter(OldCount);
  NewCount := OldCount + Round((uS * Freq) / 1000000);

    repeat
      Windows.QueryPerformanceCounter(AktCount);
    until AktCount >= NewCount;

  OldCount := NewCount;
end;
Da ich immer die Halbe Bitzeitdurchlaufe und alle Zustände mit schreibe habe im am Ende eines RC5 Codes 28 Zustände

Der Thread läuft in einer Schleife, diese wiederholt sich alle in 1/4 der Bitzeit
Wird ein High Signal gefunden sucht er nach einer Halben Bitzeit nach einem Low Pegel, dann wieder ein High und darauf wieder ein Low, alles im Abstand eines Haben Bits. Das Bit wird ja wie auf dem Link von mir die Halbe Zeit als High und den Rest als Low Pegel ausgegeben.

Danach wird das Toglebit eingelesen, dieses muss einmal als High und auch als Low vorhanden sein. Die Adressbits und die Commandobits ebenfalls. Wenn das der Fall ist sollte T bei 28 liegen und der Rc5 Frame ausgegeben werden. Jedoch habe ich das Problem das er nichtmal soweit kommt. Da Teilweise das Signal beide Hälften den selben Zustand hat.
Liegt da ein Problem meiner Seite vor oder könnte sein das Windows da nicht mit spielt?
Habe doch jetzt alles berücksichtigt....
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#14

Re: Wie Signale einer IR Fernbedienung für ComPort empfangen

  Alt 14. Okt 2007, 08:46
Zitat von Cyberaxx:
So ich habe da mal etwas gebastelt was aber nun mal wieder nicht funktioniert.

Mal abgesehen davon das er das System ein wenig lahm legt.

....
Hallo,

wenn ein Signal anliegt, wird im ersten if eine Verzögerung gestartet und (vielleicht) das 2 Halbbit abgefragt. Ohne Signal passiert das gleiche, nur ohne Verzögerung, und alles weitere läuft so ab, wie mit Signal, aber zu falschen Zeitpunkten. Kannst du erklären, was das bewirken soll?

Normal wäre: wenn kein Signal anliegt, passiert NICHTS.

Nur das erste von vielen Problemen, aber bevor das nicht geklärt ist, sind weitere Details nicht von Interesse.

Gruss Reinhard
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#15

Re: Wie Signale einer IR Fernbedienung für ComPort empfangen

  Alt 14. Okt 2007, 10:55
Warum nimmst Du nicht WINLIRC?

http://winlirc.sourceforge.net/

http://winlirc.sourceforge.net/delphi.html

http://www.ocinside.de/html/ir_recei...winlirc_d.html
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#16

Re: Wie Signale einer IR Fernbedienung für ComPort empfangen

  Alt 14. Okt 2007, 11:47
Der Grund ist ich würde es halt gerne selber schreiben und auch verstehen, warum ein weiteres externes Programm nutzen?

Nach der RC5 Beschreibung zu urteilen, sollte das umzusetzen auch nicht so schwer sein, warum ich damit allerdings so große Probleme habe weiß ich auch nicht.
Ich kann aber auch zu wenig C++ um mir den Source von WinLirc näher zu bringen.
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#17

Re: Wie Signale einer IR Fernbedienung für ComPort empfangen

  Alt 14. Okt 2007, 20:51
http://winlirc.sourceforge.net/delphi.html

http://winlirc.sourceforge.net/winli...od-by-wave.zip
http://winlirc.sourceforge.net/winlirc-delphi.zip
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#18

Re: Wie Signale einer IR Fernbedienung für ComPort empfangen

  Alt 14. Okt 2007, 20:54
Meinen Post gelesen?

Ich würde es gerne selber machen und verstehen, was bringt mir dann der Delphi Teil der sich auf WinLirc bezieht?

Zitat:
I wrote an example application in Delphi, which demonstrates how to use
Delphi with WinLIRC.
Dadurch lerne ich es auch nicht wirklich.
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#19

Re: Wie Signale einer IR Fernbedienung für ComPort empfangen

  Alt 14. Okt 2007, 21:08
Zitat von Cyberaxx:
Dadurch lerne ich es auch nicht wirklich.
Lernen und verstehen sind zweierlei:

Man kann ein ANALOGES Signal mit der doppelten Frequenz abtasten (Abtasttheorem), aber für ein asynchrones, DIGITALES Signal gilt das nicht, wenn man kein Bit verlieren will.
Wahrscheinlich hast Du kein Oszilloskop, um zu sehen, was an der seriellen Schnittstelle anliegt.
Wenn ein WINDOWS-Programm zeitkritische Aufgaben erfüllen muss, muss es auf höchster Priorität laufen.
In Assembler würde man kurzzeitig Interrupts sperren - aber Du hast von vielem noch keine Ahnung, deshalb solltest Du von anderen "lernen", dann lernst Du es vielleicht auch zu "verstehen".

Hier ist noch etwas zum LERNEN:

www.b-kainka.de/rc5del.zip

Allerdings sind im Sourcecode ein paar Fehler...

Für den Parallelport:
http://home.tiscali.nl/m.majoor/rc5irda.zip
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#20

Re: Wie Signale einer IR Fernbedienung für ComPort empfangen

  Alt 15. Okt 2007, 00:32
[quote="hathor"]Warum nimmst Du nicht WINLIRC?

Hallo,

ich habe einen kurzen Blick in die Source geworfen - damit das funktioniert, wird mit allen Tricks die Priorität auf die technisch höchstmögliche hochgeschraubt, noch mehr als normale Realtime-Priorität. Das ist höchstens ein Beispiel dafür, wie man absolut nicht programmieren sollte - rücksichtsloses Ansichreissen aller Resourcen für einen völlig nebensächlichen Zweck.

Sicher ein supercooles geiles proggy, aber wenn mehr Leute zu solchen Ideen überredet werden, kann man keinen PC mehr benutzen. Da wird Verantwortungslosigkeit zum vorbildlichen Programmierstil erklärt.

Gruss Reinhard
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz