Continue to Site

Eng-Tips is the largest engineering community on the Internet

Intelligent Work Forums for Engineering Professionals

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

Delay microseconds in VB 6.0

Status
Not open for further replies.

jorgemoreno

Electrical
Sep 1, 2002
20
Hi, I have a chaallenge of generate a microseconds delay in Visual Basic, I know how to generate delay on the order of milliseconds (see below) but is too long for my application. Does anyone know how to generate this microsecond delay on Visual Basic 6.0.

Thanks

JM
 
Replies continue below

Recommended for you

VB stuff runs under Windows. Windows is a multi-threaded operating system. Therefore you can't be sure that your process will be running in any particular microsecond. It is (theoretically) possible to hijack some of the earlier OSs but inadvisable.

I would use hardware to generate microsecond timing. You will also need to bear in mind that most I/O stuff is interrupt driven so its timing will be subject to stack timing issues.

Good Luck
johnwm
________________________________________________________
To get the best from these forums read faq731-376 before posting

UK steam enthusiasts:
 
Quick Pak professional has a library
Crescent Softwware Inc
 
Under DOS you can control timing with a few uSec accuracy-
under WINDOWS you are out of luck...


<nbucska@pcperipherals DOT com> subj: eng-tips
read FAQ240-1032
 
The Windows operating system is a DOS program.
You need only unhook the operating system (suspend) and take control of the processor for your timing software.

This task needs to be more clearly defined (duration).
 
Could you explain in detail how that might be done in W2K or XP? My understanding is that since W2K the operating system is Windows, and the 'Command Prompt' window merely runs within the Windows envelope.

If that is not the case, then all of XP security could be simply bypassed.

Good Luck
johnwm
________________________________________________________
To get the best from these forums read faq731-376 before posting

UK steam enthusiasts:
 
Code:
;syntax - CALL Pause(uSecs%)
;where uSecs% is the number of microseconds to pause
;Note:  Maximum acceptable value is 27,500 microseconds.
;       Checking is performed on entry.
.Model Medium,BASIC
.Code
Pause Proc, uSecs:Ptr
    push    si
    mov     si,uSecs      ;get the address for uSecs%
    lodsw                 ;put the number of microseconds into AX
    cmp     ax,27500      ;exit if value out of range
    ja      exit
    mov     bx,25         ;calculate number of timer
    mul     bx            ;  cycles equivalent to the
    mov     bx,21         ;  specified number of
    div     bx            ;  microseconds
    mov     bx,ax         ;transfer result to BX
;Disable timer 2.
    in      al,61h        ;clear bit 0 of I/O port 61h
    jmp     short $+2
    and     al,0FEh
    out     61h,al
    jmp     short $+2
;Initialize timer 2 for mode 0 operation with word-size initial count.
    cli                   ;disable interrupts
    mov     al,0B0h       ;output control byte
    out     43h,al
    jmp     short $+2
    mov     al,bl         ;send low byte of count
    out     42h,al
    jmp     short $+2     ;tiny delay
    mov     al,bh         ;then the high byte
    out     42h,al
    jmp     short $+2     ;tiny delay
;Reinitialize timer 0 to make sure a time-of-day interrupt doesn't occur.
    mov     al,36h        ;mode 3 with word-size divisor
    out     43h,al
    jmp     short $+2
    xor     al,al         ;set interrupts for every
    out     40h,al        ;  65,536 cycles
    jmp     short $+2
    out     40h,al
    jmp     short $+2
    sti                   ;enable interrupts
;Start the countdown by enabling timer 2.
    in      al,61h        ;set bit 0 of I/O port 61h
    jmp     short $+2
    or      al,01h
    out     61h,al
    jmp     short $+2
;Loop until the count has reached zero.
readloop:
    mov     al,80h        ;latch timer 2
    out     43h,al
    jmp     short $+2     ;tiny delay
    in      al,42h        ;read count
    jmp     short $+2     ;tiny delay
    mov     ah,al
    in      al,42h
    jmp     short $+2     ;tiny delay
    xchg    al,ah
    or      ax,ax         ;loop if count hasn't
    jns     readloop      ;  reached zero
Exit:
    pop     si
    Ret                   ;return to VBASIC
Pause Endp
End

 
The OP asked a question about Visual Basic - I must have missed that lesson in the Visual Basic Course! That all looks like old-fashioned assembler to me. What are you doing that prevents OS interrupts? And how does that help if the Visual Basic program is still subject to OS Interrupts?

Good Luck
johnwm
________________________________________________________
To get the best from these forums read faq731-376 before posting

UK steam enthusiasts:
 
Ok, just giving you a more detail on why I need to a delay routine in usecs, I developed an RS232 interface to be connected to COM1 using DTR/CTS (Data Terminal Ready/Clear To Send), RTS/DSR (Request To Send/Data Set Ready) as control lines to drive a 24CXX Serial EEPROM (I2C bus type). So far my routines can write and read the EEPROM (in my case an ATMEL 24C01), the thing is that I must delay the Clock Pulse Witdth High of the SCL line of the device(Serial Clock Input)to allow the data that is beig read from or write to the EEPROM to be valid according data sheet. Now with my routines I only can delay down to 1 msec which is too much even for this small 1K EEPROM. If you need further details please let me know, and before you answer that are already something done somewhere, I know that but I want to do my own tool to learn and to customize it to my needs.

Thanks and I hope someone could help

JM
 
JOHNWM;
The assembler code disables interrupts and takes control of the intel compatible CPU instruction set. Other source code languages such as MASM, C+, FORTRAN etc. may be called from VB6. The ASM code above shows how to achieve usec delays if you want to write your own code. A similar project is found at


My first response of using Crescent Software's QuickPAK or PDQcomm is easier (call someone elses library they wrote),
or you can search the internet and find several other pay solutions;


or a different forum;
 
Thank you for the clarification - I will try it sometime with VB. I have used a similar construction with QBasic and other Non-VB Basic Flavours, but I wasn't aware that you could do it from Visual Basic 6 under XP

Good Luck
johnwm
________________________________________________________
To get the best from these forums read faq731-376 before posting

UK steam enthusiasts:
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor