Meine Frage ist nun: Sind diese Timer eigentlich genau?
Beispiel:
Untenstehendes Programm gibt ein 1Hz-Rechteck auf Pin2 des LPT1 aus.-Das funktioniert auch ganz gut(Treiber "UserPort" installieren).
Es ist mal klar, dass folgender Teil eine kleine Ungenauigkeit verursacht:
- Code: Alles auswählen
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Auch die Switches in der WinProc brauchen ihre Zeit.
Ausserdem bedeutet Windows unteranderem Multitasking, und die Ausführung meines Programms wird so doch wahrscheinlich hübsch "zerstückelt"?
Was dieser UserPort-Treiber genau macht ist mir auch nicht wirklich bekannt...
Hat jemand also eine Ahnung, in welcher Grössenordnung die Abweichungen sich ca. befinden könnten?
- Code: Alles auswählen
#include <windows.h>
#include <conio.h>
#define TIMER_FLAG 1
#define LPT_PIN_1_TOGGELN _outp(0x378,((_inp(0x378))^0x01));
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)
{
HWND hWnd;
MSG msg;
WNDCLASS wc;
wc.style = CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszClassName = TEXT("Timer-Testprogramm");
wc.lpszMenuName = NULL;
RegisterClass(&wc);
hWnd=CreateWindow( TEXT("Timer-Testprogramm"),
TEXT("Timer-Testprogramm"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hWnd,iCmdShow);
UpdateWindow(hWnd);
SetTimer(hWnd,TIMER_FLAG,500,NULL);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
case WM_TIMER:
{
switch(wParam)
{
case TIMER_FLAG:
{
LPT_PIN_1_TOGGELN
break;
}
default:
{
;
}
}
return 0;
}
default:
{
;
}
}
return DefWindowProc(hWnd,message,wParam,lParam);
}
P.S.: Falls jemand das Programm testen will, aber keine Lust die Kiste hervor zu ziehen um den LPT zu messen: Es gibt da ein hübsches Programm namens parmon.exe, welches die Pegel am Druckerport grafisch anzeigt.(--> Link)
Mit dem Code könnte man vielleicht auch so ein "Hobby-Funktionsgenerator" basteln...