View previous topic :: View next topic |
Author |
Message |
ROBOTICAR
Joined: 28 Aug 2007 Posts: 45
|
How can I simulate "count" in pic basic pro with C |
Posted: Tue Aug 28, 2007 6:07 am |
|
|
Hi all
How can I simulate "count" in pic basic pro with CCS.
I need a source code for count the puls in the specific pin.
Do you get me a program with TMR0 (for example in 16f84a)? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Aug 28, 2007 9:57 pm |
|
|
Tell us the purpose of your program. There may be a better way to
do it than duplicating the PBP Count function. Give some details about
the project and the input signal. |
|
|
ROBOTICAR
Joined: 28 Aug 2007 Posts: 45
|
|
Posted: Wed Aug 29, 2007 11:42 am |
|
|
My input signal is pulse (around 10KHz to 100KHz) and I need a program for measuring this frequency.This program must very exact.
for example:when the original pulse frequency is 15KHz I want this frequency counter represent exactly 15KH .(Not 14.9KH or Not15.1KH)
Do you help me? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Aug 29, 2007 12:05 pm |
|
|
This thread shows how to use the CCP to make a tachometer.
http://www.ccsinfo.com/forum/viewtopic.php?t=29963
100 KHz has a 10 us period. That's too fast to use with interrupts
for most PIC oscillator frequencies. So, you would need to use a
divisor on the CCP input. Probably use CCP_CAPTURE_DIV_4,
or CCP_CAPTURE_DIV_16, which would increase the interrupt
interal to 40 us or to 160 us. It would depend upon your PIC oscillator
frequency. You may have to use a 24-bit timer (Timer1 with 8-bit
software extension). This is described in the link above. |
|
|
ROBOTICAR
Joined: 28 Aug 2007 Posts: 45
|
|
Posted: Wed Aug 29, 2007 2:24 pm |
|
|
Thanks for your help but this part, is a article of PBP HELP
Quote: | count function can be determined that the highest frequency of pulses that can be counted is 25KHz with a 4MHz oscillator and 125KHz with a 20MHz oscillator |
we must pay attention to "count fonction" that used TMR0
Now what's your idea? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Aug 29, 2007 2:32 pm |
|
|
If you want to use the Count function, then compile a small test program
in PBPro, and look at the .LST file in the PBPro project directory.
It will have commented listing of the MPASM code that's used to create
the Count function. I did this, and the code is posted below.
Next, learn how to read ASM code, and translate it to CCS C source code.
Here's an example where someone did this for the POT command:
http://www.ccsinfo.com/forum/viewtopic.php?t=27191
I don't want to do the translation. I don't have the time. I did the Button
comand and posted it in the Code Library. I don't have time to do any
more of them.
Code: |
; PicBasicPro COUNT command list file
ORG 0 ; Reset vector at 0
LIST
goto INIT ; Finish initialization
LIST
COUNTT movwf RM1 ; Save bit mask
call INPUTT ; Set pin to input
bcf FSR, 7 ; Point back to port
movlw COUNT_DELAY ; Calc count time based on OSC
movwf R3
movlw (COUNT_DELAY) >> 8
movwf R3 + 1
call MUL ; Time is R0, R2 + 1, R2 (hi to lo)
incf R0, F ; Bump up high and mid for dec
incf R2 + 1, F
clrf R1 ; Zero counter
clrf R1 + 1
movf INDF, W ; Read pin
andwf RM1, W ; Isolate it
movwf R3 ; Save starting state as last
countloop CLRWDT?NOP ; 1 (20) Keep Watchdog happy
M ifndef NO_CLRWDT
M clrwdt
M else
M nop
M endif
movf INDF, W ; 1 Read pin
andwf RM1, W ; 1 Isolate it
movwf R3 + 1 ; 1 Save state
xorwf R3, W ; 1 Compare with last time
andwf R3 + 1, W ; 1 Only count high states
xorwf RM1, W ; 1 Flip for next test
btfsc STATUS, Z ; 1 / 2
incf R1, F ; 1 / 0 Count pulse
btfsc STATUS, Z ; 1 / 2
incf R1 + 1, F ; 1 / 0
movf R3 + 1, W ; 1 Set new last state
movwf R3 ; 1
decf R2, F ; 1 Count time
btfsc STATUS, Z ; 1 / 2
decf R2 + 1, F ; 1 / 0
btfsc STATUS, Z ; 1 / 2
decfsz R0, F ; 1 / 2
goto countloop ; 2 / 0
movf R1, W ; Result to W
goto DONE
INPUTT bsf FSR, 7 ;Point to register bank 1
iorwf INDF, F ; Set bit to input
goto DONE |
|
|
|
ROBOTICAR
Joined: 28 Aug 2007 Posts: 45
|
|
Posted: Wed Aug 29, 2007 11:49 pm |
|
|
Can you tell me :How many cycle(s) last each statement ?(1cycle ,2 cycle or...)
IF,FOR(),WHILE ,BREAK,CONTINUE,I++
Thanks for reply |
|
|
anestho
Joined: 27 Dec 2006 Posts: 28
|
|
Posted: Thu Aug 30, 2007 6:46 pm |
|
|
I think that branching and goto's require 2 cycles, while everything else is 1 cycle.
Cycles can only apply to ASM not C. An "if" statement may be 3 ASM instructions or 10, depending on the conditional statement. If you want to know, compile a test code, and look at the .lst file to see how many instructions it takes in ASM. |
|
|
|