Originally Posted by Bonaparte
LOOP: For I=10 TO 1 STEP -1:NEXT I:GOTO LOOP
That's not so hard now is it? It's just like in the PBP manual, with a couple of very small changes.
Originally Posted by Bonaparte
LOOP: For I=10 TO 1 STEP -1:NEXT I:GOTO LOOP
That's not so hard now is it? It's just like in the PBP manual, with a couple of very small changes.
There are ten cars in front of you.
And someone is asking which one is the fastest.
Then you look at each one and say "that one".
But the fastest car you found is the fastest car among the ones in front of you.
There are other fastest cars around.
Now, "fastest" changes from one perspective to another.
The fastest for you may be the slowest for me.
Take Skimask's example:
LOOP: For I=10 TO 1 STEP -1:NEXT I:GOTO LOOP
if you run this with 4mhz, you get the "fastest" loop.
If you run the same loop at 20Mhz, you get the "fastest", too, but faster then
4mhz.
If you run it at 40Mhz, you still get "fastest" but faster then 20Mhz.
Now, you do the math.
-------------------------------------
"If the Earth were a single state, Istanbul would be its capital." Napoleon Bonaparte
Code:I VAR BYTE SYSTEM LOOP1: ; 150 cycles. Not very fast For I=10 TO 1 STEP -1 NEXT I LOOP2: ; 90 cycles. A lot better I = 10 REPEAT I=I-1 UNTIL I=0 ASM ; 31 cycles. Pretty fast LOOP3 MOVLW 0xA MOVWF I ; I=10 INNER DECFSZ I,F ; I=I-1. IF I=0 skip next instruction GOTO INNER ; Loop until I=0 ENDASM FINISH: GOTO FINISH
Last edited by Bruce; - 16th December 2006 at 15:20.
Originally Posted by Bruce
...and, there is also the expert approach!
You know, we kiss the hand of the experts here.
------------------------------------
"If the Earth were a single state, Istanbul would be its capital." Napoleon Bonaparte
Originally Posted by sayzer
Or the keyboard of the experts...
However, I saw the original poster's first line
------------------
Hi guys,
I'm new to PICBasic!!
-----------------------
which says to me 'not fluent in any sort of asm', so he's probably not going to get much better than 90 cycles
JDG
Originally Posted by Bruce
I will probably go for Loop 2 implementation..
(Assembly isn't an appealing choice!!)
However, is there any way to estimate the time required to implement this Loop (2). I need to calculate the time needed to decrement the counter, compare its current value to the end value & the repetition (go back to start of loop) of the body time...
I'm using a 20 MHz crystal as clock....
if it can't be estimated from BASIC code... can the .asm file generated by compiler in assembly help me estimate delay time in executing loop knowing the time for each assembly line code???
This is what i'm trying to do; generation of 40kHz pulses (25us)
Loop:
counter = 16
(set one o/p pin high
pause (delay) by 11 us
set o/p pin to low (zero)
puse (delay) by 10 us
decrement counter & compare it
repeat loop again
i need the total time of loop to be 25 microseconds....
HELP PLEASE!!!
Why not using the internal PWM module instead? it will run in background and you don't need to care about latency etc etc.
use something like this...
and look what happen on PORTC.2 pin.Code:DEFINE OSC 20 TRISC=0 duty var word duty = 250 ' duty value for 50% duty cycle PR2 = 124 ' period for 40KHZ T2CON = %00000100 ' timer2 on, prescale 1:1 CCPR1L = duty>>2 ' eight MSB of duty cycle value CCP1CON = (duty.lowbyte&3)<<5 | %00001100 ' store 2 LSB of duty ' & set PWM mode START: PAUSE 1 GOTO START
Need to start it and stop it ? here's something using PORTB.0 as trigger source
How to calculate those value easy? PicMultiCalc software available bellow for FREECode:DEFINE OSC 20 TRISC=0 duty var word PWMMode var byte StartStop var bit duty = 250 ' duty value for 50% duty cycle PR2 = 124 ' period for 40KHZ T2CON = %00000100 ' timer2 on, prescale 1:1 CCPR1L = duty>>2 ' eight MSB of duty cycle value PWMMode = (duty.lowbyte&3)<<5 | %00001100 ' store 2 LSB of duty ' & set PWM mode START: IF PORTB.0=0 then ' startstop=startstop ^ 1 ' toggle between start/stop if startstop=1 then ' CCP1CON=PWMMODE ' Start PWM ELSE ' CCP1CON=0 ' Stop PWM PORTC.2=0 ' make sure the pin is low ENDIF ' WHILE PORTB.0=0 : WEND ' wait until trigger release PAUSE 100 ' debounce delay ENDIF GOTO START
http://mister-e.org/pages/utilitiespag.html
ScreenShot
<img src="http://www.picbasic.co.uk/forum/attachment.php?attachmentid=1280&stc=1&d=116639098 4">HTH
Last edited by mister_e; - 17th December 2006 at 21:33.
Steve
It's not a bug, it's a random feature.
There's no problem, only learning opportunities.
I agree with Steve (and everyone else) that the hardware PWM sounds best for what you described. But, if it will not work for you consider "unrolling" your loops like that shown below. You lose no time in looping but it does cost you more code space (16 repeats is not huge considering the amount of memory in the 877A).
Code:DEFINE OSC 20 TRISB.0 = 0 PORTB = 0 PORTB.0 = 1 ' I = 1 (on for 12.6 uS) @ nop Pauseus 12 PORTB.0 = 0 ' (off for 12.4 uS) PAUSEUS 12 PORTB.0 = 1 ' I = 2 @ nop Pauseus 12 PORTB.0 = 0 PAUSEUS 12 ;(more of the same here) PORTB.0 = 1 ' I = 16 @ nop Pauseus 12 PORTB.0 = 0 PAUSEUS 12 Endhere: goto Endhere END
Paul Borgmeier
Salt Lake City, UT
USA
__________________
could be...
now play with the a < x value, and look what happen to your code size.. interesting eh?Code:DEFINE OSC 20 TRISB.0 = 0 PORTB = 0 pauseus 0 ' do nothing good but include PAUSEUS?C macro TRISB.0 = 0 PORTB = 0 start: asm CHK?RP PORTB local a=0 while a<16 BSF PORTB,0 nop PAUSEUS?C 12 BCF PORTB,0 nop PAUSEUS?C 12 a+=1 endw endasm pause 100 goto start
Now compare the code size of
copy and pasted 16 times, with the one generated with my solution... mmm interestingCode:PORTB.0 = 1 @ nop Pauseus 12 PORTB.0 = 0 @ nop PAUSEUS 12
Sometime MPASM directive are really handy!
EDIT: you could also use
If you don't like the PAUSE?C, BSF, BCF option... both generate the same code.Code:@ local a=0 @ while a<16 PORTB.0=1 @ nop PAUSEUS 12 PORTB.0=0 @ nop PAUSEUS 12 @a+=1 @ endw
Last edited by mister_e; - 18th December 2006 at 05:03.
Steve
It's not a bug, it's a random feature.
There's no problem, only learning opportunities.
Bookmarks