Pisal moze ktos w asm 86 procedurke, która odmierzala krotkie odcinki czasu < 1 ms ? Oczywiście chodzi o PCty. Konkretnie chodzi o wystawianie na złaczu RS odpowiednich stanów w określonym czasie.
- posted
19 years ago
Pisal moze ktos w asm 86 procedurke, która odmierzala krotkie odcinki czasu < 1 ms ? Oczywiście chodzi o PCty. Konkretnie chodzi o wystawianie na złaczu RS odpowiednich stanów w określonym czasie.
Kris napisał(a):
Pod DOS-a nie powinno być problemu, trzeba tylko dobrać opóźnienie dla konkretnej częstotliwości procesora.
Użytkownik Maksymilian Dutka napisał:
Witam W swoich programach "zatrudniałem" do tego celu timer systemowy 8254 zaszyty w chipsecie płyty głownej. jest to o tyle lepsze rozwiązanie, że czas nie zależy od prędkosci procesora. Metoda ta też nieźle sprawdza się w windowsach z serii 9x
Grzegorz Kurczyk napisał(a):
Ale poniżej 1ms to tak nie zajdziesz.
Pod win2k można robić pętelkę zależną od wyniku funkcji QueryPerformanceCounter. I liczyć na to że Twoje zadanie nie zostanie w brutalny sposób przerwane. Poniżej 1ms się da spokojnie.
TP.
Niestety - nawet w czasie dzialania procesu z priorytetem Real Time, niewywlaszczanego - kursor sie rusza a system na pingi odpowiada :-(
J.
NO ja się z tym zgadzam, pod windą nigdy nie da się odmierzyć dokładnie jakiegoś odcinka czasu. Niemniej jednak używam tej funkcji do mierzenia czasu jakiś czynności - transferu DMA czy coś. Rozdzielczości są tu rzędu dziesiątek mikrosekund OIDP.
TP.
Nie zakładaj, że się nie da, jeżeli się da.
Kwestia tylko wiedzy i czasu, który trzeba na to poświęcić. Polecam rozpoczęcie zabawy z Windows 2000/XP DDK. Z nim da się zrobić prawie wszystko, włącznie ze sterownikami blokującymi proca w 100% dla siebie na prawie dowolny czas.
Użytkownik Maksymilian Dutka napisał:
A niby czemu nie ? Na upartego to i 1us się odmierzy, ale nie będzie to już zbyt dokładne (tzn trzeba troszkę pokombinować)
Trzeba sobie kupic peceta z dwoma procesorami :-)
Ale to sie da napisac o bardzo duzej ilosci systemow i komputerow. W zasadzie to znam tylko jeden ktory to w miare potrafil - transputery. Nawiasem mowiac - przy zegarze 2GHz przelaczenie procesow powinno sie udac w czasie ok 1us :-)
O przepraszam - czemu ? Moze miec klopoty z odbieraniem danych z RS, ale poza tym powinien dzialac w miare dobrze ..
J.
Dziekuje za wszystkie odpowiedzi.
Na pocztaku tez myslalem o wykorzystaniu 8254. Aplikacja ma dzialac pod Windows. Chyba pozostaje jakis maly atmelek podlaczany na COM i wymiana informacji z nim.
Pytanie do Adama: Jak to rozwiazałes w swoim programie ISP Programmer? Prawdę mówiąc piszę coś bardzo podobnego. Edytor do asemblera i chciałem z nim zintegrować programator ISP. Obecnie mam to zrobione tak że z poziomu edytora wywołuję program dosowy z odpowiednimi parametrami i wszystko gra ale chciałbym to zrobić jako jedną aplikację.
Nijak bo problemu nie ma. Ze względu na działające inne procesy programowanie może być (i jest w rzeczywistości) wstrzymywane - i nie wynika z tego żaden problem. Co najwyżej taktowanie na ISP będzie znacznie wolniejsze, ale dla programowanych uC nie ma to najmniejszego znaczenia, czy SCK ma 100 kHz, czy 10 Hz. Z drugiej strony, dostępy do portu równoległego i tak są bardzo wolne (minimum kilkaset us, mierzyłem to jakiś czas temu w WinXP).
BTW: Porównywałem ostatnio szybkość programowania ATmega128 przez ISP i przez JTAG - protokół niby podobny, kabelek (LPT) i soft (własny) również, ale JTAG jest znacznie szybszy. Wynika to pewnie ze sposobu przepychania danych do programowanego uC, bo czas programowania (fizycznego) jednej strony pamięci Flash jest stały niezależnie od metody.
Mam rozumiec, ze jesli bede pisał program w asmie i linijka pod linijka umieszcze rozkazy przykładowo utaw SCK i wyzeruj SCK przez odwolanie sie do portów (gdzie sck to jeden z bitów LPT) to ta zmiana nastapi po czasie minimum kilkaset us?
To po co w takim razie opcja wyboru kwarcu w twoim programie?
A z tym JTAGiem to ciekawa sprawa.
Tak to wyglada w Windows XP. Nie wiem, z jaka predkoscia wynik dzialania instrukcji 'out' propaguje sie na port w DOSie.
Bo nie moge polegac na aktualnym "widzimisie" Windozy (a moze i calego peceta - sprawdzal ktos ile trwa 'out' na LPT w czystym DOSie?). Opoznienia czasowe opieram na funkcji QueryPerformanceCounter. Wprowadze w przyszlosci mozliwosc wylaczenia dodatkowych opoznien, jezeli to mialoby przyspieszyc programowanie.
Poza tym mozesz zachciec popedzac AVRa np. z zewnetrznego generatora 100 kHz albo kwarcu 32,768 kHz - wtedy miedzy kolejnymi zboczami transmisji ISP trzeba nieco wiecej poczekac.
Nie wiem jak by to wyszlo na wspolczesnych maszynach :) jak robilem myki w czasach AT to lpt zawsze rzadzilo sie tymi samymi prawami co ISA - czyli takt 8MHz z mozliwoscia podkrecenia w chipsecie.
W miare stabilny transfer ok 1kHz mozna uzyskac synchronizujac sie w watku instrukcja sleep
repeat sleep(1); // zawiesza dzialanie watku na 1ms cos_do_portu index_i_warunek_konca until 1=0;
Oczywiscie w odrebnym watku i oczywiscie jesli nie ogladasz jednoczesnie filmu z divxa
Dla wiekszych predkosci kombinowalem kiedys z funkcja testujaca inkrementacje licznika w petli w czasie 1 sec wyznaczonej przez zegar systemowy aby wyznaczyc sredni czas trwania watku bez opoznienia - ale nie skonczylem tego wiec nie wiem jak to zadziala.
Jeszcze jedna uwaga odnosnie programu dosowego w sesji windowsa - koniecznie trzeba dla niego stworzyc pifa i wylaczyc w nim wykrywanie bezczynnosci - jesli windows stwierdza ze dosowy program nie korzysta z myszy ani z klawiatury to system traktuje go jako nic nie robiacego i odebiera mu przydzielony czas !
wojtek
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.