![]() |
Re: Wie Signale einer IR Fernbedienung für ComPort empfangen
Zitat:
Natürlich ist sowas für einen PIC-Prozessor u.ä. kein Problem, der muss ja auch nicht Windows ausführen. Gruss Reinhard |
Re: Wie Signale einer IR Fernbedienung für ComPort empfangen
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. |
Re: Wie Signale einer IR Fernbedienung für ComPort empfangen
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:
Da ich immer die Halbe Bitzeitdurchlaufe und alle Zustände mit schreibe habe im am Ende eines RC5 Codes 28 Zustände
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; 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.... |
Re: Wie Signale einer IR Fernbedienung für ComPort empfangen
Zitat:
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 |
Re: Wie Signale einer IR Fernbedienung für ComPort empfangen
Warum nimmst Du nicht WINLIRC?
![]() ![]() ![]() |
Re: Wie Signale einer IR Fernbedienung für ComPort empfangen
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. |
Re: Wie Signale einer IR Fernbedienung für ComPort empfangen
|
Re: Wie Signale einer IR Fernbedienung für ComPort empfangen
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:
|
Re: Wie Signale einer IR Fernbedienung für ComPort empfangen
Zitat:
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: ![]() Allerdings sind im Sourcecode ein paar Fehler... Für den Parallelport: ![]() |
Re: Wie Signale einer IR Fernbedienung für ComPort empfangen
[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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz