Using hardware capture


Closed Thread
Results 1 to 15 of 15

Hybrid View

  1. #1
    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.

  2. #2
    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

  3. #3
    Join Date
    May 2007
    Posts
    604


    Did you find this post helpful? Yes | No

    Default

    OK, thanks.

  4. #4
    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

  5. #5
    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 20:21.

Similar Threads

  1. mS Timer
    By whmeade10 in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 8th September 2020, 13: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, 16:50
  3. Measuring change of frequency with PIC
    By Aussie in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 19th July 2007, 02:47
  4. Hardware capture on 16F876
    By MaxiBoost in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 4th April 2007, 20:19
  5. continious counting process (capture)
    By asynch in forum General
    Replies: 1
    Last Post: - 17th February 2006, 08: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