[Builder C++] Komponent timer i ustawianie interwału mniejszego od 1ms

0

Witam Forumowiczów:)

Mam problem z pewnym programem. Mianowicie piszę program, który odczytuje mi dane z portu LPT - używam biblioteki inpout32.

W każdym razie odczytywanie stanu wejść LPT mam opanowane. Problem polega na tym, że muszę przechwytywać sygnał o częstotliwości 1kHz-10kHz. Aby rozwiązać ten problem dodałem komponent Timer - z założenia czas portu miałby być odczytywany zgodnie z interwałem w Timerze.

Mój problem polega na tym, że w Timerze można ustawić minimalna wartość interwału na 1ms, co daje mi częstotliwość maksymalną odczytu 1kHz, natomiast żeby nie było w moim przypadku takich efektów jak aliasing potrzebowałbym częstotliwość próbkowania minimalnie 20kHz, co daje interwał minimalny 50us.

Czy wie ktoś jak ustawić interwał na 50us lub w jakiś inny sposób rozwiązać ten problem?

Byłbym bardzo wdzięczny za pomoc;)

0

Chyba można to ustawić tak:

 Timer1->Interval = 0.05;
0
Gadżet napisał(a)

Chyba można to ustawić tak:

 Timer1->Interval = 0.05;

Niestety ten sposób nie działa - w ogóle się zegar nie wykonuje...

0

Timer nie może się wykonywać szybciej, niż co 10 ms (Windows nie pozwala na wiecej - nawet, jak sobie ustawisz na 1 ms) o ile wiem... a 50 us to troche szybko :> Mozesz sprobowac utworzyc watek i dac mu priorytet RealTime... ale i tak to Ci nie daje zadnej gwarancji.

Obawiam sie, ze bedziesz musial to zrobic tak:

  • tworzysz watek
  • ustawiasz priorytet
  • odczytujesz dane tak szybko, jak tylko sie da z uwzglednieniem momentow czasu, gdy odczyt zostal dokonany
  • zadowalasz sie wynikami odczytow...
0

Nie testowałem:
http://www.decompile.com/cpp/faq/windows_timer_api.htm
http://msdn.microsoft.com/en-us/magazine/cc163996.aspx
plus pewnie innych kupę, które Google wypluje po wpisaniu "high resolution timers windows"

0

poza tym przy takiej rozdzielczości (10KHz == 0.1ms na odczyt) to już nie będzie tradycyjnym timerem, bo po prostu w pętli musisz czytać czas najszybciej jak się da (stopowania wątku poniżej 1ms nie zrobisz) i psrawdzać czy nadszedł czas na odczyt, a mało tego - nie masz nigdy pewności że dany sprzęt będzie działał na tyle szybko żeby się wyrobić w ogóle z przetwarzaniem tego.

Tu masz ciekawą dyskusję na temat stopowania poniżej 1ms:
http://stackoverflow.com/questions/85122/sleep-less-than-one-millisecond

Poza tym nie wiem czy dobrze rozumuję, ale czy w ogóle dasz radę zrobić tyle odczytów na LPT, bo z moich obliczeń wynika że się nie da, bo spójrz:
-jeśli LPT ma szybkość 12kb/s == 12 228 b/s (wikipedia)
-zakładamy, że czytasz jedynie wartość stanu będącą liczbą bajtową, 8 bitową jak kto woli
-jeśli potrzebujesz 10KHz == 10 000 odczytów na sekundę, to wymagana przepustowość wyniesie [ ilość odczytów * wielkość odczytu ] = 10 000 * 8b = 80 000 b
no więc jeśli LPT daje ci maksymalną przepustowość 12 228 b/s, a ty chcąc czytać bajt z rozdzielczością 10KHz potrzebujesz 80tys b/s, no to z techniczno-logicznego punktu widzenia chyba nie dasz rady :D
nie mówiąc już o masie innych opóźnień.

1 użytkowników online, w tym zalogowanych: 0, gości: 1