Notice. New forum software under development. It's going to miss a few functions and look a bit ugly for a while, but I'm working on it full time now as the old forum was too unstable. Couple days, all good. If you notice any issues, please contact me.
andreas Senior Member Joined: 07/12/2020 Location: GermanyPosts: 179
Posted: 08:47am 23 Sep 2022
Copy link to clipboard
Print this post
2 Mio For..Next Loops
CMM2:
PicoMiteVGA:
The CMM2 (480MHz) is 8.3 times faster than the PicoMiteVGA (126MHz)
The CMM2 has an #include-statement which enables modular software.
-andreas
Martin H. Guru Joined: 04/06/2022 Location: GermanyPosts: 444
Posted: 09:37am 23 Sep 2022
Copy link to clipboard
Print this post
Messung von 2000000 For-Next - Statents ---------------------------------------- Pro Sekunde: 268592 Gesamtlaufzeit: 7.446217 > option list OPTION KEYBOARD GR OPTION CPUSPEED (KHz) 378000 OPTION SDCARD GP10, GP12, GP11, GP13 OPTION AUDIO GP6,GP7, ON PWM CHANNEL 3
with OPTION CPUSPEED 378000 ~ half as fast as cmm2
Print "Messung von 2000000 For-Next - Statents" Print "----------------------------------------" t%=Timer For f%=1 To 2000000 Next f% l= Timer-t% Print "Pro Sekunde: ";Int(2000000/(l/1000)) Print "Gesamtlaufzeit: "l /1000
a littlie faster, if I put the Next statement in the same Line as the For Statement :
Messung von 2000000 For-Next - Statents ---------------------------------------- Pro Sekunde: 275513 Gesamtlaufzeit: 7.259177
but .. if I delete the Variable behind the NEXT Statement
Messung von 2000000 For-Next - Statents ---------------------------------------- Pro Sekunde: 589522 Gesamtlaufzeit: 3.392575
Print "Messung von 2000000 For-Next - Statents" Print "----------------------------------------" t%=Timer For f%=1 To 2000000:Next l= Timer-t% Print "Pro Sekunde: ";Int(2000000/(l/1000)) Print "Gesamtlaufzeit: "l /1000
the question remains, how meaningful such test results are Cheers Mart!n Edited 2022-09-23 19:59 by Martin H.'no comment
phil99 Guru Joined: 11/02/2018 Location: AustraliaPosts: 1363
Posted: 12:47pm 23 Sep 2022
Copy link to clipboard
Print this post
As an experiment to see how fast a Pico can read a pin in a FOR - NEXT loop I wrote a program to read a DHT11 temp / humidity sensor and found you can fill an array at 15uS per sample.
CPUSPEED = 378000 kHz, a one digit pin number and all on one line. Every character slows it down. Here is the relevant part.
'Data format - 80uS high start pulse, 50uS low + 25uS high = 0, 50uS low + 70uS high = 1 Dim integer n ' deliver 20 mS pulse to wake up DHT11 SetPin 1,dout,oc Pin(1)=1 Pulse 1,20 Pause 19 SetPin 1,off SetPin 1,din 'Get the samples For n=0 To 329:a(n)=Pin(1):Next SetPin 1, off 'Got the samples 'for max. speed the above 'for-next' must be on one line with fewest characters
Edited 2022-09-24 09:01 by phil99
andreas Senior Member Joined: 07/12/2020 Location: GermanyPosts: 179
Posted: 07:41pm 25 Sep 2022
Copy link to clipboard
Print this post
Very interesting! So one can sample more than 1/15uS = 66666 samples a seconds using for-next on a pico.
-andreas
Volhout Guru Joined: 05/03/2018 Location: NetherlandsPosts: 2711
Posted: 07:57pm 25 Sep 2022
Copy link to clipboard
Print this post
And 32000000 times per seond using the PIO.If nothing goes right ... turn left
phil99 Guru Joined: 11/02/2018 Location: AustraliaPosts: 1363
Posted: 11:36pm 25 Sep 2022
Copy link to clipboard
Print this post
"And 32000000 times per second using the PIO."
Yes indeed, if you have A Need for Speed.
ADC and CSUB LOG also work well.
Update on the For - Next. The 15uS per sample was before I added Dim Integer n That reduced it to 12.4uS per sample = 80,645 samples / second. I had assumed, wrongly, that the counter in a For - Next would automatically be an integer. That enables it to catch the 25uS pulses at 252MHz most of the time.
Tinine Guru Joined: 30/03/2016 Location: United KingdomPosts: 1646
Posted: 04:06am 26 Sep 2022
Copy link to clipboard
Print this post
Because it runs from SD?
Craig
Tinine Guru Joined: 30/03/2016 Location: United KingdomPosts: 1646
Posted: 04:09am 26 Sep 2022
Copy link to clipboard
Print this post
Doesn't a decrementing For-Next run even faster?
Craig
Tinine Guru Joined: 30/03/2016 Location: United KingdomPosts: 1646
Posted: 06:56am 26 Sep 2022
Copy link to clipboard
Print this post
For decades, I have been using a high-end industrial controller (read:expensive) which consists of a real-time back-end and an extemely crude BASIC-like interpreter on the front-end.
This interpreter has one data-type which is float. A literal string can be produced using a 2-character mnemonic MG"Hello World" (MG = message).
I have been able to achieve all I need with this language and I never wondered about execution speed because it's never been a concern. I spent yesterday going through their documentation and the same for other similar high-end products and heck, PMBasic totally blows them out of the water. Turns out that the product I was using ten years ago which I regarded as stupidly fast, has a command execution time of 400uS Then I moved-on to a newer model that boasted "10 times faster"...40uS...What's that, a MMBasic PIC32MX170 @40MHz? Their flagship is 11uS and that would cost me close to £4K
Another big-name alternative ($4.4K Used on eBay) cautions about the limitations of their 32bits and single precision. Also runs @ ~25,000 lines/sec.
MMBasic just totally freaking ROCKS!!!
Craig
phil99 Guru Joined: 11/02/2018 Location: AustraliaPosts: 1363
Posted: 08:04am 26 Sep 2022
Copy link to clipboard
Print this post
"Doesn't a decrementing For-Next run even faster?"
I must try it. Now that you have jogged my decrepit memory I may have done that in the past.
Plasmamac Guru Joined: 31/01/2019 Location: GermanyPosts: 463
Posted: 09:11am 26 Sep 2022
Copy link to clipboard
Print this post
@andreas where can i find the pcb from your Picomite?Plasma
Martin H. Guru Joined: 04/06/2022 Location: GermanyPosts: 444
Posted: 12:45pm 26 Sep 2022
Copy link to clipboard
Print this post
hmm no
Print "Messung von 2000000 For-Next - Statents" Print "----------------------------------------" t%=Timer For f%=2000000 To 1 Step -1:Next l= Timer-t% Print "Pro Sekunde: ";Int(2000000/(l/1000)) Print "Gesamtlaufzeit: "l /1000 >
Messung von 2000000 For-Next - Statents ---------------------------------------- Pro Sekunde: 583799 Gesamtlaufzeit: 3.425835
Cheers Mart!n'no comment
phil99 Guru Joined: 11/02/2018 Location: AustraliaPosts: 1363
Posted: 12:56pm 26 Sep 2022
Copy link to clipboard
Print this post
"Doesn't a decrementing For-Next run even faster?"
"hmm no" Got the same result. What little gain there might have been was offset by the extra characters STEP -1
andreas Senior Member Joined: 07/12/2020 Location: GermanyPosts: 179
Posted: 02:30pm 26 Sep 2022
Copy link to clipboard
Print this post
Yes, the CMM2 has a SD-Card. But the picos can have a sd-card also. If one uses a pico as data logger, educational hardware, game machine, hobbyist thing - it makes sense to have a mass storage.
#include in MMBASIC is the same as a definition/implementation module in Modula-2 or a DLL in Windows or a word in FORTH. You need it if you want to write code only once for a certain task and create more and more complex software out of simple building blocks.
-andreas
andreas Senior Member Joined: 07/12/2020 Location: GermanyPosts: 179
Posted: 02:42pm 26 Sep 2022
Copy link to clipboard
Print this post
@andreas where can i find the pcb from your Picomite?
Hi Plasma, do you mean this one?
This is from Silicon Chip magazin July 22 VGA PicoMite ($5) or Kit ($35).
-andreas
andreas Senior Member Joined: 07/12/2020 Location: GermanyPosts: 179
Posted: 03:14pm 26 Sep 2022
Copy link to clipboard
Print this post
Don't ask me what is going on here - this version does it in a second!
Can someone verify this? I'm curious where the mistake is - but this seems to be too fast, isn't it?
The CMM2 is not "tuned" it simply runs @ 480MHz. -andreas
andreas Senior Member Joined: 07/12/2020 Location: GermanyPosts: 179
Posted: 06:15pm 26 Sep 2022
Copy link to clipboard
Print this post
Using the same code on the PicoMiteVGA (simply by using the same sd-card) I get improved values:
By comparing the old benchmark code to the current code there is one major difference: In the new faster code I did declare the control variable as integer before use within the for..next construct.
Result: Declaring control variables before use results in huge speed-up!
Example:
CONST Maxloop = 10000000 DIM i AS INTEGER = 0 ' gives huge speed-up
FOR i = 1 to Maxloop
'Do_something
NEXT ' do not write i after NEXT
It seem to be very important not to write down the control variable after the next-statement.
Writing: for i = 1 to Maxloop : next
is much faster than
writing: for i = 1 to Maxloop : next i
Doing real measurements on the cmm2 within the for..next loop:
' bench.bas - how fast can you measure
const maxmeasure = 500000 ' number of measurements cls dim mess(maxmeasure) as integer dim i as integer = 0 setpin 33,din ' digital input on pin 33
print "Start... "; t1 = timer
for i = 1 to maxmeasure: mess(i) = pin(33):next
diff=timer-t1
print diff;" ms for ";maxmeasure;" measurements" print print (maxmeasure/diff)*1000;" measurements per second" print