Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations strongm on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

timer, delay, sleep function, in need fo accuracy

Status
Not open for further replies.

marvg007

Programmer
Jan 1, 2001
6
US
Hi, I'm a C++ programmer and don't know much about assembly(though I'd like to learn in the near future). I'm writing on this forum since I need of a time delay optimized function..accurate to nearly the millisecond(Zen Timer is accurate to the microsecond I think).first off, to know why I need precise accuracy in this function, down to the exact millisecond is because I am trying to produce a frequency through my parallel port. I timed the call and return of the _outp()(function to write to the port in VSC++6.0) to be around 1/200,000th of a second. I only need my program to be exact to the 1/1000th of a second so that isn't much of a time consumer. On the other hand, the Sleep(ms) function is a MAJOR time consumer. I can only achieve at most 100Hz doing this:

while(1){

_outp(0x00378, 0x01); //Switch pin 0 to High
Sleep(1);
_outp(0x00378, 0x00); //Switch pin 0 to Low
Sleep(1);
}
The Supposed result should be that it pauses for 1 ms between switching from on to off, meaning that it does a cycle(on off) in 2 ms. This theoretically mean that it would give a frequency of 1000/2 per second or 500Hz.But it gives me 100Hz, 100 cycles a second at most!

and no, I don't think the while loop has anything to do with it since I batch process it, doing it 10 times before repeating a while.(I even experimented with no while, doing it 100 times)

I tried making my own delay function using clock() but the calls to clock() take Significantly longer than the calls to Sleep(). I'm thinking Sleep might be coded in assembly.

I need help finding an assembly written function to be used with C++ or such that might be able to help me make near precise frequencies. I know Micheal Abrash's Zen Timer does some pretty accurate calculations. Can someone show me a way to do this? Thanks!
 
Precise accuracy like you need it can't really be achieved by software, because if an interrupt is called at irregular moments (a key pressed f.e.), your program waits until the interrupt function is completed.

I think the best option is to connect in some way the Square Wave Generator (used for making sounds with the PC speaker) to the parallel port. Regards,
Bert Vingerhoets
vingerhoetsbert@hotmail.com
Don't worry what people think about you. They're too busy wondering what you think about them.
 
Bert, hrmm are you talking about the Speaker Timer? and making that work? But isn't the speaker timer only connected to the speaker and such..

One Idea on how to stop interrupts was brought up by Michael Abrash when I read about his Zen Timer for timing optimized code fragments. He stops all interrupts during execution but since I know no assembly, I haven't figured out that or how he got the timer to calculate to the micro seconds when the Internal PC timer counts down in +-40ms gaps..

how would I go about connecting the square wave generator? btw does anyone here know a good tutorial resource for one trying to learn assembly? Thanks!
 
NASM is a good choice for learning assembly.

If you disable all interrupt,then you can get an microsecond timer determined by your machine's frequency.
You can look up the clock period of intel instruction to get an appropriate instruction(i have no manual at hand :( )
The following instructions should apprear in your sleep function
...
cli
out port#,al
out port#,al
sti
...
If i get exact one ,i will post it again!
I want to emigrate Canada or Australia. Any relative information you supplied will be appreciated!

zallen@cmmail.com
ICQ:101229409
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top