Hello Every : I use AT89C52 and 11.059MHz oscillator. 1 instuction takes about 1 micro-second.(10^-6 sec.) I write a delay function in *.asm. It works well , but I want it adjustable. I want to delay according to the parameter I pass.My goal is to modify delay time for some protocol time slot testing. I found it some how difficult to achieve. Because the basic instruction , for example : _nop_ , take 1 micro-second. I can't add more decision. It will takes more time. How could I implement such kind of delay? Please give me a hand , thanks a lot~~
Sounds like you need to use a faster processor, and/or one that uses less clock cycles per instruction. Maybe you could use a timer, but you'll still have difficulties if the delays are on the same order as the execution time of a single instruction! Maybe some external hardware to do the critical timing? Take a look at this thread: http://www.keil.com/forum/docs/thread2938.asp
You might try a series of _nops_, and jump far enough down into them so that the remainder represents the time that you need. There is still some overhead in this method, of course. You have to calculate the jump, and get into and out of the function. You won't be able to create a 1 us delay, but you might be able to create fairly precise delays from, say, 10 us up to as long of a table as you can stand. Longer intervals means you can use a loop, at the cost of more granularity and more overhead. Small intervals and precise measurements are best done by timer hardware rather than software. "Small" is relative to your processor clock and architecture. If software has to act at very precise times (send this response exactly 3.4 microseconds after receiving this message), then you need a faster processor, as Andrew suggests. There is an overall system design issue to be considered here, so it's hard to suggest solutions without really knowing the requirements.
I want to delay according to the parameter I pass.My goal is to modify delay time for some protocol time slot testing. For delays this short the only option is inline nop. two possibilities 1) Since you refer to "testing" could you use a conditional assembly. 2) Selecting the routine instead of selecting the delay: do_it_with_1 mov... ... .... ... nop ... ... ... ... ret do_it_with_2 mov... ... .... ... nop nop ... ... ... ... ret Erik
oh, even easier do_it_with_1 MACRO_1 nop MACRO_2 do_it_with_2 MACRO_1 nop nop MACRO2 Erik