Einzelnen Beitrag anzeigen

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