[Back to INTERRUP SWAG index] [Back to Main SWAG index] [Original]

    {
    JONATHAN WRIGHT

    > A/D (analog to digital conversion).  Somehow I need to use the PC
    > clock/timer to call my A/D sampling interrupt at various rates from
    > several hundred Hz to several thousand Hz.

    > Hook interrupt 1Ch and point it to your interrupt handler.  Use
    > a counter in this procedure to count the number of interrupts or

    This will not work correctly.  Using interrupt 1Ch as it is normally set up,
    your interrupt routine will only be called 18 times a second (18.2, actually),
    so you could get a maximum of 18.2 Hz.  If you wait until a counter in this
    interrupt (incremented by 1 each time) reaches 1820, it will take 10 seconds!
    It WON'T be 100 Hz.

    In order to hook the timer interrupt at a rate above 18.2 Hz, you'll need to
    revector int 08h (which calls int 1Ch anyway).  You'll have to set up a counter
    in int 08h which makes sure that the ORIGINAL int 08h routine is still called
    18.2 times a second.  The value for this counter will vary, depending on how
    fast you set timer channel 0.  The system clock has a maximum resolution of
    about 1.19318 Mhz and IRQ0 is normally called 1193180/65536 times per second.

    Here's some code for changing the clock rate (sorry but it's ASM):
    }
    ;*********************
    ; called by SetClockRate (which is Pascal callable)

    ClkRate PROC NEAR

      push  ax
      mov   al,36h
      out   43h,al
      pop   ax
      out   40h,al  xchg  ah,al
      out   40h,al
      ret
    ClkRate ENDP

    ;******************
    ; call this routine from TP as SetClockRate (Hz : WORD);
    SetClockRate PROC FAR

    Rate EQU word ptr [bp+06]
      push  bp
      mov   bp,sp
      cmp   rate,0
      je    SCR01

      mov   ax,65535
      xor   dx,dx
      mov   bx,rate
      div   bx
      jmp   SCR02

    SCR01:
      xor   ax,ax

    SCR02:
      call  ClkRate

      mov   sp,bp
      pop   bp
      ret   2

    SetClockRate ENDP

    I pulled these procedures from some OLD code which I may have inadvertenly
    screwed up over time, but it looks o.k.
      Actually revectoring int 08h is a bit more complex - you MUST make sure the
    old it 08 is called appropriately because it controls a number of system
    functions and your PC WILL lock up if it's not called.  I recommend finding a
    book to help with that part.

[Back to INTERRUP SWAG index] [Back to Main SWAG index] [Original]