I don't suppose there is any way to run Python code on more than one COG at the same time?
Not yet, no. That's likely to be moderately complicated. Running PASM code (represented as a binary blob) in another COG launched from Python is much simpler and could probably be done pretty quickly with the existing tools. I just haven't had time to get to this.
For somebody wanting to try FlexGUI with MicroPython, are the most complete instructions the README.txt file found in the zip attached to the first post?
Will this work with Rev.B? I have a feeling that USB kb/mouse won't work yet with Rev.B…
But, I could be wrong, since this is a binary... Maybe it will work...
For somebody wanting to try FlexGUI with MicroPython, are the most complete instructions the README.txt file found in the zip attached to the first post?
Thanks, Ken Gracey
Well, the easiest way to use micropython from FlexGUI is to just select "Run uPython on P2" from the FlexGUI "Special" menu. But the details on things like attaching the VGA and USB are in the README.txt in the zip file (all of which is also in the FlexGUI 4.0.3 samples/upython directory, so you won't need to download the .zip if you already have FlexGUI).
Note that FlexGUI version 4.0.3 has a small bug in its loadp2 loader which causes the default terminal to not be in ANSI mode. This doesn't matter if you use a connected keyboard and VGA monitor, but it is a pain when using micropython from the console. As a work-around until the next version of FlexGUI is released, you can replace the bin\loadp2.exe file in your flexgui folder with the one in the attached .zip. Or, you can close FlexGUI's terminal window and use a real terminal emulator instead.
Will this work with Rev.B? I have a feeling that USB kb/mouse won't work yet with Rev.B…
But, I could be wrong, since this is a binary... Maybe it will work...
Yes, the VGA and USB will work with both Rev.A and Rev.B boads, the hardware type is detected at run time and both drivers are adjusted accordingly.
Just plugged my P2-EVAL (rev2) into the USB, ran flexgui (downloaded v4.0.4) and from the special menu clicked Run uPython on P2. Voila, the python prompt
Then ran a few simple tests using print, for loops, etc.
All running nicely
Congrats guys - Eric & Brian ??
@Cluso99 There is a bunch of other SD card initialisation you need to do first, it should be buried somewhere in the Micropython threads. I think Tubular posted the sequence some time back.
Ozpropdev wrote a library of some of the BS2 examples. I think they are posted but not sure where. They are MicroPython code (cut and paste into either micropython incarnation)
For those who want to check it out this is what I found I needed to do
## turn off the P123
## plug the VGA monitor into P123 vga board attached to P48~55
## plug USB keyboard to lower connector of P123 "serial host" board attached to P16~23
## rename Eric's v15 .binary to _BOOT_P2.BIX on an SD card
## edit/strip the last function (~15 lines) off pye.py and copy the remainder to pye2.py in root directory of the SD card
## (my pye2.py with lines already stripped off attached to this post, in zip file)
## turn off P123 flash switch (in case of difficulties)
## power up and wait for micropython prompt to appear on VGA screen (few seconds)
## type the following commands into the micropython repl
import pyb
sd=pyb.SDCard()
sd.power(1)
## repl will echo 'True'
import os
os.mount(sd,'/sd')
os.chdir('/sd')
execfile("pye2.py")
from pye import pye
pye('pye2.py')
## that should bring up the editor and move around the ~970 line pye2 source.
## control-k-s to save back to SD card
## control-k-q to quit back to repl
I am trying to just do a simple listdir without loading my SD card with anything but I am missing something.
Can anyone give me a simple solution (python code) for running FlexGUI with Run uPython on P2?
Is the '/sd' section trying to change to a directory called sd ???
BTW I just want to use the PC USB connection.
I copied Erics upython.binary to the SD root directory as _BOOT_P2.BIX
I repowered the P2Evalrev2 board with PST running at 230400 on my PC,
and python boots,
sends a message to PST "started USB on cog 2" ,
and then runs the default python program "main.py" on the SD.
My "main.py" program does a few simple print messages which also works.
I think my program then ended, and of course python ends.
So, how to stay in python after "main.py" ends?
And how do I perform a listdir() ?
Can anyone give me a simple solution (python code) for running FlexGUI with Run uPython on P2?
Is the '/sd' section trying to change to a directory called sd ???
BTW I just want to use the PC USB connection.
Sorry.
Hotkeys won't work because there is no key combination for the edit->paste in the icon for the Propeller Output window. I tried writing directly into the Propeller output window using pyautogui.typewrite working on a copy of the code in the system clipboard … two major issues. If you clicked on a different window while the process was going on... that window got written to... a major problem. Had my computer going nuts for
a while. and … it didn't work.
I think there are some other wrinkles to worry about. I think I have the latest of everything and though the current copy/paste routine is now flawless I am not yet blinking any LEDs. I can turn one on and off... just can't make it blink. I tried all of the code snippets that supposedly work and they don't work for me. Prior to the last revision I thought it had failed and then after quite some period it started blinking... and continued to blink through a reset:)
No kidding. Nothing since.
I have attached a copy of my attempted solution. Don't run it... it is a monster waiting to eat your computer.
Eric,
I tried to list the SD directory contents using
>>> import os
>>> os.listdir()
[]
>>>
Am I missing something as there are files in the root directory and it is formatted as FAT32 ???
You're probably not missing anything, but micropython is. It doesn't seem to detect all SD Cards automatically. If it doesn't find yours, then you'll have to mount it manually. Run micropython as usual (e.g. with FlexGUI "Special > Run uPython on P2") then at the prompt enter:
import pyb
sd=pyb.SDCard()
sd.present()
it should print `True`. If it doesn't, do:
sd.power(1)
Now you have to mount the SD card:
import os
os.mount(sd, '/sd')
os.chdir('/sd')
os.listdir()
The path '/sd' in the os.mount function is arbitrary, you can call it whatever you want -- it's just a way to associate the root directory of this particular sd card with a name. The os.chdir('/sd') says to make that sd card the default directory.
Another alternative is to try a different SD card. Of the 3 I've tried, one doesn't seem to work very well (sometimes micropython hangs trying to access it).
Hotkeys won't work because there is no key combination for the edit->paste in the icon for the Propeller Output window.
On Windows 10 you can turn on a hot key combination for any console window (including the Propeller Output window):
Right click on the title bar of the window. You'll get a popup menu one of whose options is "Properties". Selecting this gives a dialog box that says something like "Propeller Output Properties". Under Options there are a bunch of "Edit Options" checkboxes. "Use Ctrl+Shift+C/V as Copy/Paste" enables ctrl+shift copy paste keys (which work even when the program is in raw mode, as loadp2 is in the Propeller Output window).
There's also "QuickEdit Mode". which enables right-click for pasting.
You can make these options the default for future invocations by right-clicking on the window title and selecting "Default" instead of "Properties".
I think there are some other wrinkles to worry about. I think I have the latest of everything and though the current copy/paste routine is now flawless I am not yet blinking any LEDs. I can turn one on and off... just can't make it blink. I tried all of the code snippets that supposedly work and they don't work for me. Prior to the last revision I thought it had failed and then after quite some period it started blinking... and continued to blink through a reset:)
No kidding. Nothing since.
Have you tried the smartpin blinking sequence?
import pyb
p=pyb.Pin(56)
p.makeinput() # makes the pin an input, do this before setting up smartpin
p.mode(0x4c) # set to NCO frequency mode
p.xval(16000) # set bit period
p.yval(858993) # set increment
p.makeoutput() # enables smartpin
Eric,
I tried to list the SD directory contents using
>>> import os
>>> os.listdir()
[]
>>>
Am I missing something as there are files in the root directory and it is formatted as FAT32 ???
You're probably not missing anything, but micropython is. It doesn't seem to detect all SD Cards automatically. If it doesn't find yours, then you'll have to mount it manually. Run micropython as usual (e.g. with FlexGUI "Special > Run uPython on P2") then at the prompt enter:
import pyb
sd=pyb.SDCard()
sd.present()
it should print `True`. If it doesn't, do:
sd.power(1)
Now you have to mount the SD card:
import os
os.mount(sd, '/sd')
os.chdir('/sd')
os.listdir()
The path '/sd' in the os.mount function is arbitrary, you can call it whatever you want -- it's just a way to associate the root directory of this particular sd card with a name. The os.chdir('/sd') says to make that sd card the default directory.
Another alternative is to try a different SD card. Of the 3 I've tried, one doesn't seem to work very well (sometimes micropython hangs trying to access it).
@ersmith
Thanks for your help.
This is what I had to do...
* Remove the SD card from the P2-EVAL (removing the _BOOT_P2.BIX and _BOOT_P2.BIY files did not work)
* Re-power the P2-EVAL
* From FlexGUI, click special, click Run upython on P2
* Insert the SD card (with P2-EVAL powered and connected)
* then enter the python sequence as you detailed above...
Note: For non-python programmers...
In a FOR loop with a range, python includes the first and excludes the last.
eg for i in range(0,5) will do 0,1,2,3,4 but not 5.
There are a few gotchas where this is not the case - eg when using a pandas dataframe and df.loc but df.iloc excludes the last.
>>> s14=' '
>>> for i in range(0,len(lst),4):
... s=(lst[i]+s14)[:14]
... if i+1<len(lst):
... s=(s+lst[i+1]+s14)[:28]
... if i+2<len(lst):
... s=(s+lst[i+2]+s14)[:42]
... if i+3<len(lst):
... s=(s+lst[i+3]+s14)[:56]
... print(s)
...
Suppose I have upython.py on my SD as _BOOT_P2.BIX
When the P2 boots it will load and run this binary from the SD card. All good so far.
If there is a python file called main.py then upython will load and run it. Again, all good.
So presume I don't have main.py so I am in upython...
Can I run a python program from upython? and if so, how?
Presume the program is called myprog.py
How can I make this program go back to upython when it ends running?
Postedit:
I found this set of instructions. I presume this is the basis of what I need to try...
## power up and wait for micropython prompt to appear on VGA screen (few seconds)
## type the following commands into the micropython repl
import pyb
sd=pyb.SDCard()
sd.power(1)
## repl will echo 'True'
import os
os.mount(sd,'/sd')
os.chdir('/sd')
execfile("pye2.py")
from pye import pye
pye('pye2.py')
## that should bring up the editor and move around the ~970 line pye2 source.
## control-k-s to save back to SD card
## control-k-q to quit back to repl
So, I presume the
execfile('myfile.py')
is what is required to run a upython program.
And I also presume the preamble is required too. This is the real part I'd like to replace if possible - is there any way??
When upython boots from the SD card (as _BOOT_P2.BIX)...
If "main.py" exists, it will load and run
If "main.py" does not exist, then it goes to REPL...
From here I can just type execfile("hello.py") which works fine.
How to I revert back into REPL from...
1. The program "hello.py" ?
2. Is there any way to recover from the terminal program?
When upython boots from the SD card (as _BOOT_P2.BIX)...
If "main.py" exists, it will load and run
And then when main.py finishes it will go to the REPL.
If "main.py" does not exist, then it goes to REPL...
From here I can just type execfile("hello.py") which works fine.
How to I revert back into REPL from...
1. The program "hello.py" ?
2. Is there any way to recover from the terminal program?
When "hello.py" finishes the REPL will automatically resume.
At the moment there's no way to make the terminal program interrupt hello.py. Control-C is supposed to do that, but it relies on some interrupts being set up that we don't have right now. So basically your hello.py program will have to check for input itself, or else avoid endless loops.
When the hello.py program finishes, it does not appear to return to repl. I’ve tried nothing and quit().
I don’t get the repl prompt and nothing I type gets displayed.
Btw I’m using PST as the terminal program currently.
Maybe PST is confused somehow? I've always seen the REPL prompt after my scripts finish.
Here's the exact sequence I run in FlexGUI:
- Turn on P2 board. All dip switches are in "off" position, and no SD card is inserted.
- Start FlexGUI and select "Special > Run uPython on P2"
- Insert an SD card and mount it by entering:
import pyb
sd = pyb.SDCard()
import os
os.mount(sd, '/mysd')
os.chdir('/mysd')
When I invoke the os I mount the sd as '/sdc'.
My sd file "ls.py" mounts the sd as '/sd'.
This works once only. Any further tries to run "ls.py" fails.
It is to do with the os.mount name. If it is the same, then the next time it fails.
So if instead, the first time I mount with '/sd' then ls.py fails straight up.
Any ideas???
( Entering terminal mode. Press Ctrl-] to exit. )
started USB on cog 2
MicroPython eric_v19 on 2019-11-05; P2-Eval-Board with p2-cpu
Type "help()" for more information.
>>> import pyb
>>> sd=pyb.SDCard()
>>> import os
>>> os.mount(sd,'/sdc')
>>> os.chdir('/sdc')
>>> os.listdir()
['System Volume Information', '_clear.cmd', '_cmd.cmd', .....
'pye2.py', 'ls.py', '_BOOT_P2.pyX', 'upython.bin', '_BOOT_P2.BIX', 'lss.py']
>>> execfile('ls.py')
System Volume _clear .cmd _cmd .cmd _cmd_ .cmd
.....
pye2 .py ls .py _BOOT_P2.pyX upython .bin
_BOOT_P2.BIX lss .py
>>> execfile('ls.py')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "ls.py", line 4, in <module>
OSError: 1
>>>
And my file on sd card "ls.py"
import pyb
import os
sd=pyb.SDCard()
os.mount(sd,'/sd')
os.chdir('/sd')
lst=os.listdir()
def padfname(f):
lst=f.split('.')
if len(lst)>1:
s=(lst[0]+' ')[:8]+'.'+(lst[1]+' ')[:5]
else:
s=(f+' ')[:14]
return(s)
def ls(lst):
for i in range(0,len(lst),4):
s=padfname(lst[i])
if i+1<len(lst):
s=s+padfname(lst[i+1])
if i+2<len(lst):
s=s+padfname(lst[i+2])
if i+3<len(lst):
s=s+padfname(lst[i+3])
print(s)
ls(lst)
The mount should only be done once. It's a "permanent" thing (well, permanent for the duration of the micropython session). I think I suggested earlier that you could mount twice with different names. You can, but it's a bad idea, and I'm sorry I mentioned it. Don't do that. Mount the sd card once only, right after micropython starts up, and never try to do it again. If your ls.py script is running from sd card it can assume the card is already mounted (otherwise it wouldn't be able to run!) and it doesn't need to do the mount or the chdir.
Comments
Not yet, no. That's likely to be moderately complicated. Running PASM code (represented as a binary blob) in another COG launched from Python is much simpler and could probably be done pretty quickly with the existing tools. I just haven't had time to get to this.
For those who are particularly ambitious, the source code is at https://github.com/totalspectrum/micropython. .
Thanks, Ken Gracey
But, I could be wrong, since this is a binary... Maybe it will work...
Well, the easiest way to use micropython from FlexGUI is to just select "Run uPython on P2" from the FlexGUI "Special" menu. But the details on things like attaching the VGA and USB are in the README.txt in the zip file (all of which is also in the FlexGUI 4.0.3 samples/upython directory, so you won't need to download the .zip if you already have FlexGUI).
Note that FlexGUI version 4.0.3 has a small bug in its loadp2 loader which causes the default terminal to not be in ANSI mode. This doesn't matter if you use a connected keyboard and VGA monitor, but it is a pain when using micropython from the console. As a work-around until the next version of FlexGUI is released, you can replace the bin\loadp2.exe file in your flexgui folder with the one in the attached .zip. Or, you can close FlexGUI's terminal window and use a real terminal emulator instead.
Yes, the VGA and USB will work with both Rev.A and Rev.B boads, the hardware type is detected at run time and both drivers are adjusted accordingly.
The source code for this version of micropython is at https://github.com/totalspectrum/micropython.
Just plugged my P2-EVAL (rev2) into the USB, ran flexgui (downloaded v4.0.4) and from the special menu clicked Run uPython on P2. Voila, the python prompt
Then ran a few simple tests using print, for loops, etc.
All running nicely
Congrats guys - Eric & Brian ??
I tried to list the SD directory contents using Am I missing something as there are files in the root directory and it is formatted as FAT32 ???
Is there any kind of reference for these examples, or a list of them that shows their syntax?
Thanks,
Ken Gracey
https://forums.parallax.com/discussion/comment/1473775/#Comment_1473775
Ozpropdev wrote a library of some of the BS2 examples. I think they are posted but not sure where. They are MicroPython code (cut and paste into either micropython incarnation)
Here is the info less the binary
I am trying to just do a simple listdir without loading my SD card with anything but I am missing something.
Can anyone give me a simple solution (python code) for running FlexGUI with Run uPython on P2?
Is the '/sd' section trying to change to a directory called sd ???
BTW I just want to use the PC USB connection.
I repowered the P2Evalrev2 board with PST running at 230400 on my PC,
and python boots,
sends a message to PST "started USB on cog 2" ,
and then runs the default python program "main.py" on the SD.
My "main.py" program does a few simple print messages which also works.
I think my program then ended, and of course python ends.
So, how to stay in python after "main.py" ends?
And how do I perform a listdir() ?
Sorry.
Hotkeys won't work because there is no key combination for the edit->paste in the icon for the Propeller Output window. I tried writing directly into the Propeller output window using pyautogui.typewrite working on a copy of the code in the system clipboard … two major issues. If you clicked on a different window while the process was going on... that window got written to... a major problem. Had my computer going nuts for
a while. and … it didn't work.
I think there are some other wrinkles to worry about. I think I have the latest of everything and though the current copy/paste routine is now flawless I am not yet blinking any LEDs. I can turn one on and off... just can't make it blink. I tried all of the code snippets that supposedly work and they don't work for me. Prior to the last revision I thought it had failed and then after quite some period it started blinking... and continued to blink through a reset:)
No kidding. Nothing since.
I have attached a copy of my attempted solution. Don't run it... it is a monster waiting to eat your computer.
You're probably not missing anything, but micropython is. It doesn't seem to detect all SD Cards automatically. If it doesn't find yours, then you'll have to mount it manually. Run micropython as usual (e.g. with FlexGUI "Special > Run uPython on P2") then at the prompt enter: it should print `True`. If it doesn't, do: Now you have to mount the SD card: The path '/sd' in the os.mount function is arbitrary, you can call it whatever you want -- it's just a way to associate the root directory of this particular sd card with a name. The os.chdir('/sd') says to make that sd card the default directory.
Another alternative is to try a different SD card. Of the 3 I've tried, one doesn't seem to work very well (sometimes micropython hangs trying to access it).
Right click on the title bar of the window. You'll get a popup menu one of whose options is "Properties". Selecting this gives a dialog box that says something like "Propeller Output Properties". Under Options there are a bunch of "Edit Options" checkboxes. "Use Ctrl+Shift+C/V as Copy/Paste" enables ctrl+shift copy paste keys (which work even when the program is in raw mode, as loadp2 is in the Propeller Output window).
There's also "QuickEdit Mode". which enables right-click for pasting.
You can make these options the default for future invocations by right-clicking on the window title and selecting "Default" instead of "Properties".
Have you tried the smartpin blinking sequence?
Thanks for your help.
This is what I had to do...
* Remove the SD card from the P2-EVAL (removing the _BOOT_P2.BIX and _BOOT_P2.BIY files did not work)
* Re-power the P2-EVAL
* From FlexGUI, click special, click Run upython on P2
* Insert the SD card (with P2-EVAL powered and connected)
* then enter the python sequence as you detailed above...
Then the os.listdir() prints a list of the files
Here is the terminal window trace
So, it's necessary to prevent the P2-EVAL from booting the SD card by inserting it after FlexGUI is running and the P2-EVAL is running.
In a FOR loop with a range, python includes the first and excludes the last.
eg for i in range(0,5) will do 0,1,2,3,4 but not 5.
There are a few gotchas where this is not the case - eg when using a pandas dataframe and df.loc but df.iloc excludes the last.
thanks. I'll get to it later in the day.
Suppose I have upython.py on my SD as _BOOT_P2.BIX
When the P2 boots it will load and run this binary from the SD card. All good so far.
If there is a python file called main.py then upython will load and run it. Again, all good.
So presume I don't have main.py so I am in upython...
Can I run a python program from upython? and if so, how?
Presume the program is called myprog.py
How can I make this program go back to upython when it ends running?
Postedit:
I found this set of instructions. I presume this is the basis of what I need to try...
So, I presume the
execfile('myfile.py')
is what is required to run a upython program.
And I also presume the preamble is required too. This is the real part I'd like to replace if possible - is there any way??
If "main.py" exists, it will load and run
If "main.py" does not exist, then it goes to REPL...
From here I can just type execfile("hello.py") which works fine.
How to I revert back into REPL from...
1. The program "hello.py" ?
2. Is there any way to recover from the terminal program?
One of the controls (^c ^d ^x etc) may abort back to repl too
I’ll try this tomorrow
When "hello.py" finishes the REPL will automatically resume.
At the moment there's no way to make the terminal program interrupt hello.py. Control-C is supposed to do that, but it relies on some interrupts being set up that we don't have right now. So basically your hello.py program will have to check for input itself, or else avoid endless loops.
I don’t get the repl prompt and nothing I type gets displayed.
Btw I’m using PST as the terminal program currently.
Here's the exact sequence I run in FlexGUI:
- Turn on P2 board. All dip switches are in "off" position, and no SD card is inserted.
- Start FlexGUI and select "Special > Run uPython on P2"
- Insert an SD card and mount it by entering: - Now create hello.py: - Now run it: It comes back to the REPL prompt after printing its messages. Here's the complete transcript:
Here is my problem...
When I invoke the os I mount the sd as '/sdc'.
My sd file "ls.py" mounts the sd as '/sd'.
This works once only. Any further tries to run "ls.py" fails.
It is to do with the os.mount name. If it is the same, then the next time it fails.
So if instead, the first time I mount with '/sd' then ls.py fails straight up.
Any ideas???
And my file on sd card "ls.py"