Using hardware capture


Closed Thread
Results 1 to 15 of 15

Hybrid View

  1. #1
    Join Date
    Jul 2003
    Posts
    2,405


    Did you find this post helpful? Yes | No

    Default

    That'll work too ... if you have a PIC with the TMR1 gate option.
    Code:
    ' PIC12F609 using Timer1 gate input to record pulse widths
    
    @ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _IOSCFS_4MHZ & _CP_OFF
    
    CMCON0 = 0         ' comparator disabled
    CMCON1 = %00000010 ' TMR1 gate source is T1G pin
    GPIO = 0           ' outputs all low at POR
    TRISIO = %00010000 ' GPIO.4 = TMR1 gate input
    
    PVAL VAR WORD      ' holds pulse time
    
    TMR1H = 0
    TMR1L = 0
    T1CON = %11000001 ' TMR1 gate active-high, Fosc/4 clock, TMR1 on
    
    Main: ' apply a pulse < 65536uS to TMR1 gate input GPIO.4 to use
      WHILE !GPIO.4 ' wait for high signal to trigger TMR1 gate pin
      WEND
      WHILE GPIO.4  ' wait for signal to return low (stops TMR1)
      WEND
      PVAL.LowByte = TMR1L  ' get TMR1 counts into PVAL
      PVAL.HighByte = TMR1H ' from TMR1
      TMR1H = 0             ' reset TMR1
      TMR1L = 0
      GOTO Main
    
      END
    Regards,

    -Bruce
    tech at rentron.com
    http://www.rentron.com

  2. #2
    Join Date
    May 2007
    Posts
    604


    Did you find this post helpful? Yes | No

    Default

    Would it be possible for you to do a non-blocking version of Measuring signal pulse widths with capture module.

  3. #3
    Join Date
    Jul 2003
    Posts
    2,405


    Did you find this post helpful? Yes | No

    Default

    Definitely. Just let CCP1 generate an interrupt, and handle flipping CCP1CON.0 + grabbing
    results in T1/PW in the interrupt handler.
    Regards,

    -Bruce
    tech at rentron.com
    http://www.rentron.com

  4. #4
    Join Date
    May 2007
    Posts
    604


    Did you find this post helpful? Yes | No

    Default

    OK, thanks.

  5. #5
    Join Date
    Jul 2003
    Posts
    2,405


    Did you find this post helpful? Yes | No

    Default

    This should work;
    Code:
    ' Measuring signal pulse widths with capture module & interrupt
    
    ' Procedure for high-going pulse:
    ' 1. Configure CCP to capture on rising edge
    ' 2. Setup Timer1 so it will not overflow during max pulse width time
    ' 3. Enable ccp capture
    ' 4. Once capture flag bit is set, save captured value as T1
    ' 5. Reconfigure CCP to capture on falling edge
    ' 6. On 2nd capture, save 2nd value as PW
    ' 7. Subtract T1 from PW for the pulse width value
    
      DEFINE OSC 4              ' 4MHz for 1uS resolution TMR1 counts
      DEFINE INTHAND CCP_INT    ' declare high-pri interrupt handler
        
      Symbol Capture = PIR1.2   ' CCP1 capture flag
      SYMBOL CapIE = PIE1.2     ' CCP1 interrupt enable bit
      SYMBOL CapPriEn = IPR1.2  ' priority enable bit for CCP1 interrupt
      SYMBOL PriEnable = RCON.7 ' set to enable priority levels on interrupts
        
      T1 VAR WORD BANKA SYSTEM ' 1st capture value
      PW VAR WORD BANKA SYSTEM ' 2nd capture value & ultimately final pulse width
      CF VAR BYTE BANKA SYSTEM ' indicates when last capture is ready
    
      CLEAR                ' clear RAM on POR
      TRISC.2 = 1          ' CCP1 input pin (Capture input on 18F242)
      INTCON = 0           ' Interrupts off for now
    
      GOTO Init            ' jump over interrupt handler
      
    ASM
    CCP_INT
      BTFSS CCP1CON,0      ; capture from rising edge?
      BRA Fall             ; no .. goto falling edge
      MOVFF CCPR1L, T1     ; get low capture byte into T1
      MOVFF CCPR1H, T1+1   ; get high capture byte into T1
      BRA IntExit          ; outta here
    Fall
      MOVFF CCPR1L, PW     ; get low capture byte into PW
      MOVFF CCPR1H, PW+1   ; get high capture byte into PW
      BSF CF,0             ; indicate last capture
    IntExit
      BTG CCP1CON,0        ; toggle between rising/falling edge captures
      BCF PIR1,2           ; clear capture interrupt flag bit
      RETFIE FAST          ; return/restore W, STATUS and BSR
    ENDASM
        
    Init: ' initialize a few things first
      CCP1CON = %00000101  ' Capture mode, capture on rising edge
      T1CON = 0            ' TMR1 prescale=1, clock=Fosc/4, TMR1=off
      TMR1H = 0            ' Clear high byte of TMR1 counter
      TMR1L = 0            ' Clear low byte
      PriEnable = 1        ' enable priority levels on interrupts
      Capture = 0          ' clear capture flag bit
      CapPriEn = 1         ' set CCP1 int to high priority
      CapIE = 1            ' enable the CCP1 capture interrupt
      INTCON = %11000000   ' global + peripheral ints enabled
      T1CON.0 = 1          ' Turn TMR1 on here
    
    Main:
      ' do other stuff here as required
      IF CF.0 THEN         ' figure out & print result only after last capture
        PW = PW-T1         ' High pulse width = PW-T1
        CF.0 = 0           ' clear flag bit
        HSEROUT [DEC PW,"uS High",13,10]
      ENDIF
      
      GOTO Main
        
      END
    Regards,

    -Bruce
    tech at rentron.com
    http://www.rentron.com

  6. #6
    Join Date
    May 2007
    Posts
    604


    Did you find this post helpful? Yes | No

    Default

    Thanks. I converted it to SF.
    Code:
    Device = 18F4620       
    Clock = 4
    
    Dim Capture As PIR1.2   ' CCP1 capture flag
    Dim CapIE As PIE1.2     ' CCP1 interrupt enable bit
    Dim CapPriEn As IPR1.2  ' priority enable bit for CCP1 interrupt
    Dim PriEnable As RCON.7 ' set to enable priority levels on interrupts
    
    Dim T1 As Word          ' 1st capture value
    Dim PW As Word          ' 2nd capture value & ultimately final pulse width
    Dim CF As Boolean       ' indicates when last capture is ready
    Dim CCP1 As Word Absolute $fbe   ' Location of CCPR1H:CCPR1L
    
    Interrupt IntHigh()
       if CCP1CON.0=1 then  ' Capture from rising edge?
          t1 = ccp1         ' Move word to T1     
       else
          pw = ccp1         ' Move word to PW
          cf = true         ' Indicate last capture
       end if
       CCP1CON.0 = not CCP1CON.0  ' toggle between rising/falling edge captures
       capture = 0          ' Clear capture interrupt flag bit
    End Interrupt
    
    Sub Init()
       CCP1CON = %00000101  ' Capture mode, capture on rising edge
       T1CON = 0            ' TMR1 prescale=1, clock=Fosc/4, TMR1=off
       TMR1H = 0            ' Clear high byte of TMR1 counter
       TMR1L = 0            ' Clear low byte
       PriEnable = 1        ' enable priority levels on interrupts
       Capture = 0          ' clear capture flag bit
       CapPriEn = 1         ' set CCP1 int to high priority
       CapIE = 1            ' enable the CCP1 capture interrupt
       INTCON = %11000000   ' global + peripheral ints enabled
       T1CON.0 = 1          ' Turn TMR1 on here
    End Sub
    
    ' Main Program Entry
    Init                    ' Initialization
    TRISC.2 = 1             ' CCP1 input pin (Capture input on 18F4620)
    Enable(IntHigh)         ' Enable Interrupts
    
    While true
       ' do other stuff here as required
       If CF Then           ' figure out & print result only after last capture
          PW = PW-T1        ' High pulse width = PW-T1
          CF = false        ' Clear flag bit
          ' Send Out Data
       EndIf
    Wend
    Last edited by rmteo; - 30th January 2010 at 19:21.

  7. #7
    Join Date
    Aug 2011
    Posts
    8


    Did you find this post helpful? Yes | No

    Default Re: Using hardware capture

    Quote Originally Posted by Bruce View Post
    That'll work too ... if you have a PIC with the TMR1 gate option.
    Code:
    ' PIC12F609 using Timer1 gate input to record pulse widths
    
    @ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _IOSCFS_4MHZ & _CP_OFF
    
    CMCON0 = 0         ' comparator disabled
    CMCON1 = %00000010 ' TMR1 gate source is T1G pin
    GPIO = 0           ' outputs all low at POR
    TRISIO = %00010000 ' GPIO.4 = TMR1 gate input
    
    PVAL VAR WORD      ' holds pulse time
    
    TMR1H = 0
    TMR1L = 0
    T1CON = %11000001 ' TMR1 gate active-high, Fosc/4 clock, TMR1 on
    
    Main: ' apply a pulse < 65536uS to TMR1 gate input GPIO.4 to use
      WHILE !GPIO.4 ' wait for high signal to trigger TMR1 gate pin
      WEND
      WHILE GPIO.4  ' wait for signal to return low (stops TMR1)
      WEND
      PVAL.LowByte = TMR1L  ' get TMR1 counts into PVAL
      PVAL.HighByte = TMR1H ' from TMR1
      TMR1H = 0             ' reset TMR1
      TMR1L = 0
      GOTO Main
    
      END
    For all the NOOBS (like me) don't forget the
    Code:
    ANSEL=0
    to make your T1G pin a digital input. I spent a couple hours scratching my head trying to figure out why I couldn't get this code to run on my 12f683......that was all I needed.

    Thank you Bruce for the code snippets...can't wait for the book. I actually got started with micros about 10 years ago with the help of your website. I'm only coming back to working with them in the last few months, and your code is helping me again!

  8. #8
    Join Date
    Jul 2003
    Posts
    2,405


    Did you find this post helpful? Yes | No

    Default Re: Using hardware capture

    Hi Picone,

    Glad I could help, and welcome back.

    FYI: Darrel has a nifty include file you can use to disable all analog features by just including it in your code. See this thread http://www.picbasic.co.uk/forum/showthread.php?t=11100

    It's pretty handy when you forget to disable A/D it takes care of it for you.
    Regards,

    -Bruce
    tech at rentron.com
    http://www.rentron.com

Similar Threads

  1. mS Timer
    By whmeade10 in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 8th September 2020, 12:12
  2. Using CCP1 and CCP2 to measure instant fuel consumption
    By srspinho in forum mel PIC BASIC Pro
    Replies: 12
    Last Post: - 20th September 2008, 15:50
  3. Measuring change of frequency with PIC
    By Aussie in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 19th July 2007, 01:47
  4. Hardware capture on 16F876
    By MaxiBoost in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 4th April 2007, 19:19
  5. continious counting process (capture)
    By asynch in forum General
    Replies: 1
    Last Post: - 17th February 2006, 07:42

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts