PulsIn question.


Closed Thread
Results 1 to 5 of 5
  1. #1
    Peter Oors's Avatar
    Peter Oors Guest

    Talking PulsIn question.

    Can somebody give me an answer?
    How many µs does the PulsIn command take?
    I would like to measure a pulsetrain with 2 kind of pulses,
    91µs high and 13µs low (long), 13µs high and 91µs low (short).
    I use the 16F819 and the 16F628 with 20MHz X-tal.

  2. #2
    Join Date
    Nov 2005
    Posts
    10


    Did you find this post helpful? Yes | No

    Default

    I would also like to know how long the pulsin command overhead itself takes with a given frequency.

    For example assume that the pulsin returned 1000 with a 20Mhz crystal would be 2000 microseconds. If It started measuring just after a change in state it would have taken say 1999 + 2000 or 3999 microseconds. Now add the overhead of the command itself and that would be the total time that the command takes.

  3. #3
    Peter Oors's Avatar
    Peter Oors Guest


    Did you find this post helpful? Yes | No

    Unhappy

    Today I measured a time from the end of a pulse to the end of the PulsIn command of about 12us.
    For me the PulsIn command is useless.
    In assembler it's the best way, but I don't know how to do this in assembler.

  4. #4
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default

    Even in PBP you'll be able to do it with a decent result. Just use the internal timer. The following example is more than enough to start.
    Code:
        '    Pulse High and Low Timer
        '    ========================
        '
        '    File name  : PulseHighLowTimer.bas
        '    Company    : Mister E 
        '    Programmer : Steve Monfette
        '    Date       : 13/01/2006
        '    Device     : PIC16F88
        '
        
        '
        '        This program measure and send to PC, the value of incomming pulses. 
        '    The program will send measure of High pulse and Low Pulse length in uSec.
        
        '
        '    Hardware configuration
        '    ======================
             DEFINE OSC 20
             DEFINE LOADER_USED 1
             TRISB = %00000100      ' RB2 as input => Serial RX
             TRISA = 255            ' PORTA As input
             CMCON = 7              ' Disable analog comparator
             ANSEL = 0              ' Disable all A/d
             T1CON = 0              ' TIMER1:
                                    '        Clock Internal
                                    '        Pre-scaller 1:1
        '                      
        '    Hardware connection
        '    ===================
             SignalInput       var PORTA.2
             
        '
        '    Serial Communication definition
        '    ===============================
             DEFINE HSER_RCSTA 90h
             DEFINE HSER_TXSTA 24h
             DEFINE HSER_SPBRG 129 ' 9600 Bauds
             DEFINE HSER_CLROERR 1
        '
        '    Alias Definition definition
        '    ===========================
             T1ON              var T1CON.0
    
        '   
        '    Variables definition 
        '    ===================
             PulseHigh          var word
             PulseLow           var word
    
        '
        '    Software/Hardware initialisation
        '    ================================
             CLEAR
             GOSUB ClearTimer
        '
        '    ////////////////////////////////|\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\        
        '
        '                             Program Start Here                               
        '
        '    ////////////////////////////////|\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\        
        '    
    Start:
        '
        '    Waiting for falling edge
        '    ========================
             '  
             WHILE SIGNALINPUT=0 : WEND
             WHILE SIGNALINPUT=1 : WEND
        '
        '    Measure low pulse
        '    =================
             '    
             T1ON=1                     ' start Timer
             WHILE SIGNALINPUT=0 : WEND ' wait for next rising edge
             T1ON=0                     ' stop timer
             PULSElow.HIGHBYTE=TMR1H    ' store results 
             PULSElow.LOWBYTE=TMR1L     ' 
             pulselow=pulselow / 5      ' 1 tick = 0.2 Usec @ 20MHZ
                                        ' Divide by 5 to have 1 uSec
                                        ' Resolution
             gosub Cleartimer           ' reset Timer1 register (TMR1L, TMR1H)
        '
        '    Waiting for rising edge
        '    =======================
             '
             while Signalinput=1 : Wend
             while signalinput=0 : wend
        '
        '    Measure high pulse
        '    ==================
             '    
             T1ON=1                     ' Start timer
             WHILE SIGNALINPUT=1 : WEND ' wait for next falling edge
             T1ON=0                     ' Stop Timer
             PULSEhigh.HIGHBYTE=TMR1H   ' Store result
             PULSEhigh.LOWBYTE=TMR1L    '
             pulsehigh=pulsehigh / 5    ' match results to 1 uSec resolution
             gosub Cleartimer           ' reset Timer1 register (TMR1L, TMR1H)
             
        '
        '    Send results to PC via RS-232
        '    =============================
             '     
             hserout ["PulseLow =",dec pulselow, " uSec",13,10,_
                      "PulseHigh=",dec pulsehigh," uSec",13,10,_
                      rep "*"\50,13,10]
             pause 1000
             goto start              
    
    ClearTimer:
        TMR1L=0
        TMR1H=0
        RETURN
    I agree, you can have a bit more accuracy in pure assembler... but test with the above first.

    It's only one way to do it... that's the results of a 10 minutes coding... on friday 13
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  5. #5
    Peter Oors's Avatar
    Peter Oors Guest


    Did you find this post helpful? Yes | No

    Red face

    Thanks very much mister_e, you are a great help.
    The text was very helpfull. The accuracy is perfect for me.

    When I measured more pulses, there was a problem.
    Something goes wrong.
    Dividing by 5 gives problems.

    =====================================
    T1ON=1 ' start Timer
    While SIGNALINPUT=0 : Wend ' wait for next rising edge
    T1ON=0 ' stop timer
    PULSElow.HIGHBYTE=TMR1H ' store results
    PULSElow.LOWBYTE=TMR1L '
    pulselow=pulselow / 5
    =====================================

    The above part I changed in (not the most beautiful way):

    Start:
    GoSub meten
    PULSEhigh1.HIGHBYTE=TMR1H ' Store result
    PULSEhigh1.LOWBYTE=TMR1L
    GoSub meten
    PULSEhigh2.HIGHBYTE=TMR1H ' Store result
    PULSEhigh2.LOWBYTE=TMR1L
    GoSub meten
    PULSEhigh3.HIGHBYTE=TMR1H ' Store result
    PULSEhigh3.LOWBYTE=TMR1L
    GoSub meten
    PULSEhigh4.HIGHBYTE=TMR1H ' Store result
    PULSEhigh4.LOWBYTE=TMR1L
    GoSub Cleartimer
    GoSub meten
    PULSEhigh5.HIGHBYTE=TMR1H ' Store result
    PULSEhigh5.LOWBYTE=TMR1L
    GoSub meten
    PULSEhigh6.HIGHBYTE=TMR1H ' Store result
    PULSEhigh6.LOWBYTE=TMR1L
    GoSub meten
    PULSEhigh7.HIGHBYTE=TMR1H ' Store result
    PULSEhigh7.LOWBYTE=TMR1L
    GoSub meten
    PULSEhigh8.HIGHBYTE=TMR1H ' Store result
    PULSEhigh8.LOWBYTE=TMR1L
    GoSub meten
    PULSEhigh9.HIGHBYTE=TMR1H ' Store result
    PULSEhigh9.LOWBYTE=TMR1L
    GoSub meten
    PULSEhigh10.HIGHBYTE=TMR1H ' Store result
    PULSEhigh10.LOWBYTE=TMR1L
    GoSub Cleartimer

    Pulsehigh1=pulsehigh1 / 5
    Pulsehigh2=pulsehigh2 / 5
    Pulsehigh3=pulsehigh3 / 5
    Pulsehigh4=pulsehigh4 / 5
    Pulsehigh5=pulsehigh5 / 5
    Pulsehigh6=pulsehigh6 / 5
    Pulsehigh7=pulsehigh7 / 5
    Pulsehigh8=pulsehigh8 / 5
    Pulsehigh9=pulsehigh9 / 5
    Pulsehigh10=pulsehigh10 / 5

    Write 1, pulsehigh1
    Write 2 ,Pulsehigh2
    Write 3 ,Pulsehigh3
    Write 4 ,Pulsehigh4
    Write 5 ,Pulsehigh5
    Write 6 ,Pulsehigh6
    Write 7 ,Pulsehigh7
    Write 8 ,Pulsehigh8
    Write 9 ,Pulsehigh9
    Write 10 ,Pulsehigh10
    Stop
    ==================================
    meten:
    GoSub Cleartimer
    While signalinput=0 : Wend ' Waiting for rising edge
    T1ON=1 ' Start timer, measure High pulse
    While SIGNALINPUT=1 : Wend ' Wait for next falling edge
    T1ON=0 ' Stop Timer
    Return
    Cleartimer:
    TMR1L=0
    TMR1H=0
    Return

    It works fine, not beautiful, I know.
    Thanks for the help.
    Last edited by Peter Oors; - 15th January 2006 at 22:07.

Similar Threads

  1. Replies: 17
    Last Post: - 12th April 2014, 02:17
  2. Better understanding PULSIN
    By Wirecut in forum mel PIC BASIC
    Replies: 12
    Last Post: - 29th June 2008, 10:17
  3. Funny PULSIN values: what is going on???
    By xnihilo in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 30th April 2008, 08:02
  4. Pulsin Math question
    By ruijc in forum mel PIC BASIC Pro
    Replies: 9
    Last Post: - 2nd April 2008, 16:15
  5. pulsin question
    By schu4647 in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 29th May 2006, 20:46

Members who have read this thread : 1

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