The P2 reset and boot process is not particularly critical of timing so you can easily do without a DTR reset as long as you hit the reset button just before you download.
The other solution is to make the jumper a simple pushbutton that you have to hold in for the DTR to pass through but then you may as well hit the reset. In some of my old P1 systems I didn't have DTR reset so I would simply hit the reset button and F11 in the right sequence but timing was critical.
@"Peter Jakacki"
Some questions on using the PWM Triangle mode to run servos.
I want to do this from TAQOZ which has it's PWM word set to use the triangle mode.
I've been playing with PWM in TAQOS by blinking the LED on pin 56 and that has been working well.
Where I'm getting confused is when I want to control a servo.
In TAQOS I have been using the following to blink the LED:
56 PIN
190 200 20000 PWM (I'm using 190 instead of 10 as the LED is active LOW)
A servo wants the FRAME to be sent 50 times per second (every 20ms).
How do I reliably get the frame sent to the servo every 20ms ?
PWM was corrected in EXTEND to use the SAWTOOTH waveform otherwise the triangle waveform is half the frequency.
If you want a 20ms repetition rate then essentially that means a divider of (clock rate/frame)/50. But you can just create a servo word that looks after this for you a bit like this:
Sure, you could combine that into one function if you want to.
Now all I type is:
20 200 56 SERVO
and I get a 10% duty on P56 every 20ms, nice and neat. Of course the word SERVO may require a signed value that represents degrees perhaps and so you can easily adapt this for a 360' servo too etc.
BTW, If after you type P2-ES ETC you can also backup all your code and settings with BACKUP into Flash. Just use a ^R to restore it all again next time you boot back into TAQOZ.
I'm examining this closer as I'm experimenting...
Here's my thinking. Correct me where I'm wrong.
Since the servo requires a frame of 50Hz (20ms), it only needs to be calculated once. The same would go for the PIN and the Div. So I'm going to make a word to setup all three. Since I will need the Frame and the Div values later, I will save them to variables as well.
With that set, all I will need is a duty cycle %. It's the only value that will need to change when programming the servo. I'm assuming that the Div value should be the CLKHZ - Frame so that the Div and the Frame together = one full second's worth of cpu cycles.
: SRVO ( duty% -- ) SRVOFRM @ SRVODIV @ PWM
I'm about to give these more testing (by actually connecting my servo :-) but I'm sure you could point me to better ways of using variables, etc.
I'm trying out my first code changes with PNUT on my P2 eval board.
I started off with Chips original blink program. Instead of initializing a group of cogs with a loop ( which works fine) I changed the code to initialize a single cog with the blink function, then initialize a second cog with another blink routine. These functions work fine UNLESS the first cog initialized is either cog 0 or cog 2. In this case, only the first cog seems to be functioning.
( Change cognum1 to 0 or 2 to verify in the attached code )
Is this something I don't understand about the P2, the Eval board or something odd about the compiler itself?
What is the difference between the P1 loader and P2. Can the old version be easily updated or is it totally different.
P2 Loading is quite different to P1, T Chap. It uses base 64 (makes it easy to dump with terminal programs etc) and is described in the google doc linked in first post of "FPGA Files!!!" thread.
Eric may be away for the holidays or waiting for his P2-Eval board to be delivered. I suspect he'll update spin2gui when he gets back.
Just very very busy with family obligations, I'm afraid. But I have updated spin2gui for the P2-Eval board. After you start spin2gui.exemake sure you go to Commands > Configure Commands... and select "P2 Defaults" then "OK". There are some sample programs included with spin2gui that do some basic things (serial I/O and LED blinking).
I'm trying out my first code changes with PNUT on my P2 eval board.
I started off with Chips original blink program. Instead of initializing a group of cogs with a loop ( which works fine) I changed the code to initialize a single cog with the blink function, then initialize a second cog with another blink routine. These functions work fine UNLESS the first cog initialized is either cog 0 or cog 2. In this case, only the first cog seems to be functioning.
( Change cognum1 to 0 or 2 to verify in the attached code )
Is this something I don't understand about the P2, the Eval board or something odd about the compiler itself?
Any ideas?
I see a few potential problems with the code:
(1) The original COG never stops (unless either cognum1 or cognum2 is 0). After the two coginits you should probably add a "cogstop #0".
(2) The second block of code (blink2) doesn't have its own origin; I'm not sure what's likely to happen as a result, but it probably isn't good. I would add an "org" directive just before the blink2 label.
(3) The declaration of "x" should go in the "blink" block (the declaration of "y" should stay with the "blink2" block).
Guys,
To start with the P2 now, you will pretty much need to learn/use P2 assembler, or learn/run TAQOZ.
fastspin is working on the P2 Eval board now, so BASIC and Spin are available now, and even have a (very primitive) IDE in the form of spin2gui. A blinking LED program for P2Eval:
* Download spin2gui.zip (version 1.3.0) from https://github.com/totalspectrum/spin2gui/releases
* Unzip in a folder that has no spaces in its name (sorry, there's a bug there)
* Run spin2gui.exe
* Go to the menu Commands > Configure Commands... and select "P2 Default" then "OK"
* Enter the program above
* Save it via File > Save As...
* Press the "Compile & Run" button
fastspin is working on the P2 Eval board now, so BASIC and Spin are available now, and even have a (very primitive) IDE in the form of spin2gui. A blinking LED program for P2Eval:
Curious here, that mode value seems to set 0pF Xtal (Should be 15pF as better Xtal match?), and VCO/2 for a 320MHz VCO and 160MHz SysClk, 5MHz PFD
I based it on some of Cluso's work, but perhaps it's out of date? In any event it's completely up to the programmer and (obviously) very easy to change. Note that the mode value is the raw oscillator setup, the actual enable is done automatically by adding %11 to the mode.
Why does clkset() also need _clkfreq as a param, as all PLL dividers setup seems to be in const _mode = 0x010c3f04 ?
Different boards might have different crystal frequencies. It's the same situation as the P1 clkset() function (which also takes those two parameters, although the meaning of the "mode" parameter is quite different.
Why does clkset() also need _clkfreq as a param, as all PLL dividers setup seems to be in const _mode = 0x010c3f04 ?
Different boards might have different crystal frequencies. It's the same situation as the P1 clkset() function (which also takes those two parameters, although the meaning of the "mode" parameter is quite different.
Is _clkfreq actually used to set the PLL/VCO, or is it stored for future use so other code can know the SysCLK ?
Why does clkset() also need _clkfreq as a param, as all PLL dividers setup seems to be in const _mode = 0x010c3f04 ?
Different boards might have different crystal frequencies. It's the same situation as the P1 clkset() function (which also takes those two parameters, although the meaning of the "mode" parameter is quite different.
Is _clkfreq actually used to set the PLL/VCO, or is it stored for future use so other code can know the SysCLK ?
_clkfreq is only stored for use by library functions. It has no effect on the PLL/VCO, only the _clkmode affects that.
Dumb question. I just unboxed my ES board. I can access tacoz and use the blink command. However I cannot get all_cogs_blink.spin2 to work when programming it from Pnut. Does it require a sd card? Am I missing something? PNut identifies the P2, so I must be doing something wrong.
Another dumb question. Looking through the various examples for VGA, there are no comments regarding pin assignments for video. I must admit that I am out of my depth currently looking through the source for how those pins get assigned in the VGA drivers. I was able to easily identify vSync in the source of several examples.
I found this in P2 Invaders (which has a configurable base pin) and was wondering: Is the usual pin sequence for VGA?
PIN SIGNAL
basepin Hsync
+1 Blue
+2 Green
+3 Red
+4 Vsync
Thanks in advance!
....
fastspin is working on the P2 Eval board now, so BASIC and Spin are available now, and even have a (very primitive) IDE in the form of spin2gui. A blinking LED program for P2Eval:
* Download spin2gui.zip (version 1.3.0) from https://github.com/totalspectrum/spin2gui/releases
* Unzip in a folder that has no spaces in its name (sorry, there's a bug there)
* Run spin2gui.exe
* Go to the menu Commands > Configure Commands... and select "P2 Default" then "OK"
* Enter the program above
* Save it via File > Save As...
* Press the "Compile & Run" button
Thanks, I have spin2gui (version 1.3.2) working with my P2-ES board. :cool:
* Download spin2gui.zip (version 1.3.0) from https://github.com/totalspectrum/spin2gui/releases
* Unzip in a folder that has no spaces in its name (sorry, there's a bug there)
* Run spin2gui.exe
* Go to the menu Commands > Configure Commands... and select "P2 Default" then "OK"
* Enter the program above
* Save it via File > Save As...
* Press the "Compile & Run" button
I tried it for the first time and got the following error:
I copied and pasted the code
const _mode = 0x010c3f04
const _clkfreq = 160_000_000
const pin = 56
clkset(_mode, _clkfreq)
direction(pin) = output
do
output(pin) = not output(pin)
pausems 500
loop
C:/Users/Cosmicbob/Documents/P2Projects/Blink.spin(1) error: syntax error, unexpected identifier `_mode', expecting end of line or ','
C:/Users/Cosmicbob/Documents/P2Projects/Blink.spin(5) error: syntax error, unexpected '(', expecting end of line or ','
C:/Users/Cosmicbob/Documents/P2Projects/Blink.spin(8) error: syntax error, unexpected '(', expecting end of line or ','
C:/Users/Cosmicbob/Documents/P2Projects/Blink.spin(11) error: syntax error, unexpected $end
child process exited abnormally
====================================================
I copied the code into PNut and it compiled and the 2 outside LED's are blinking and got this asm code;
dat
orgh 0
'
' seperate initialization of two cogs to blink on the Eval board
'
org
coginit cognum1,#@blink ' init a single cog to use the blink program
'wait jmp #wait
coginit cognum2,#@blink2
wait jmp #wait
' ************ The following cog combinations all work fine:
cognum1 long 4
cognum2 long 0
' cognum1 long 3
' cognum2 long 5
' cognum1 long 4
' cognum2 long 0
' cognum1 long 5
' cognum2 long 2
' cognum1 long 1
' cognum2 long 4
'************* etc. any combo that doesn't have 0 or 2 initialized as cognum1 works
' ************* These combinations only blink the cognum1 led :
' cognum1 long 0
' cognum2 long 4
' cognum1 long 2
' cognum2 long 5
' cognum1 long 2
' cognum2 long 6
' this following combination only blinks 1 led (p58) on my P2-EV board
'cognum1 long 2
'cognum2 long 5
'
' blinkS
org
blink cogid x 'which cog am I, 0..7?
add x,#56 'add 56 to get LED pin
drvnot x 'output and flip that pin
shl x,#16 'shift up to make it big
waitx x 'wait that many clocks
jmp #blink 'do it again
blink2 cogid y 'which cog am I, 0..7?
add y,#56 'add 56 to get LED pin
drvnot y 'output and flip that pin
shl y,#16 'shift up to make it big
waitx y 'wait that many clocks
jmp #blink2 'do it again
* Download spin2gui.zip (version 1.3.0) from https://github.com/totalspectrum/spin2gui/releases
* Unzip in a folder that has no spaces in its name (sorry, there's a bug there)
* Run spin2gui.exe
* Go to the menu Commands > Configure Commands... and select "P2 Default" then "OK"
* Enter the program above
* Save it via File > Save As...
* Press the "Compile & Run" button
I omitted a rather important fact in the "save it" step; if it's a BASIC program, it has to have a .bas extension in the name. It looks like you saved it as Blink.spin; try Blink.bas instead.
(fastspin uses the file extension to determine what language to parse; .bas and .bi for BASIC, .c or .h for C, and
anything else for Spin).
I omitted a rather important fact in the "save it" step; if it's a BASIC program, it has to have a .bas extension in the name. It looks like you saved it as Blink.spin; try Blink.bas instead.
Ok thanks that worked. The strange thing is that compiling it in spin2gui blinks one LED however, the same code in PNut blinkes two LED's LOL
I omitted a rather important fact in the "save it" step; if it's a BASIC program, it has to have a .bas extension in the name. It looks like you saved it as Blink.spin; try Blink.bas instead.
Ok thanks that worked. The strange thing is that compiling it in spin2gui blinks one LED however, the same code in PNut blinkes two LED's LOL
???
I think you must have confused something, because PNut does not support BASIC, or even Spin; all PNut can compile is P2 assembly.
Comments
The other solution is to make the jumper a simple pushbutton that you have to hold in for the DTR to pass through but then you may as well hit the reset. In some of my old P1 systems I didn't have DTR reset so I would simply hit the reset button and F11 in the right sequence but timing was critical.
Some questions on using the PWM Triangle mode to run servos.
I want to do this from TAQOZ which has it's PWM word set to use the triangle mode.
I've been playing with PWM in TAQOS by blinking the LED on pin 56 and that has been working well.
Where I'm getting confused is when I want to control a servo.
In TAQOS I have been using the following to blink the LED:
56 PIN
190 200 20000 PWM (I'm using 190 instead of 10 as the LED is active LOW)
A servo wants the FRAME to be sent 50 times per second (every 20ms).
How do I reliably get the frame sent to the servo every 20ms ?
j
If you want a 20ms repetition rate then essentially that means a divider of (clock rate/frame)/50. But you can just create a servo word that looks after this for you a bit like this: But if you wanted it inverted:
Sure, you could combine that into one function if you want to.
Now all I type is:
and I get a 10% duty on P56 every 20ms, nice and neat. Of course the word SERVO may require a signed value that represents degrees perhaps and so you can easily adapt this for a 360' servo too etc.
BTW, If after you type P2-ES ETC you can also backup all your code and settings with BACKUP into Flash. Just use a ^R to restore it all again next time you boot back into TAQOZ.
I had missed the change to Sawtooth, thanks !
I knew there had to be a word to show the current speed (CLKHZ). Thanks!
j
Here's my thinking. Correct me where I'm wrong.
Since the servo requires a frame of 50Hz (20ms), it only needs to be calculated once. The same would go for the PIN and the Div. So I'm going to make a word to setup all three. Since I will need the Frame and the Div values later, I will save them to variables as well.
: SRVO_INIT ( pin — ) PIN CLKHZ 50 / dup var SRVOFRM SRVOFRM ! CLKHZ swap - var SRVODIV SRVODIV !
With that set, all I will need is a duty cycle %. It's the only value that will need to change when programming the servo. I'm assuming that the Div value should be the CLKHZ - Frame so that the Div and the Frame together = one full second's worth of cpu cycles.
: SRVO ( duty% -- ) SRVOFRM @ SRVODIV @ PWM
I'm about to give these more testing (by actually connecting my servo :-) but I'm sure you could point me to better ways of using variables, etc.
J
I started off with Chips original blink program. Instead of initializing a group of cogs with a loop ( which works fine) I changed the code to initialize a single cog with the blink function, then initialize a second cog with another blink routine. These functions work fine UNLESS the first cog initialized is either cog 0 or cog 2. In this case, only the first cog seems to be functioning.
( Change cognum1 to 0 or 2 to verify in the attached code )
Is this something I don't understand about the P2, the Eval board or something odd about the compiler itself?
Any ideas?
P2 Loading is quite different to P1, T Chap. It uses base 64 (makes it easy to dump with terminal programs etc) and is described in the google doc linked in first post of "FPGA Files!!!" thread.
Just very very busy with family obligations, I'm afraid. But I have updated spin2gui for the P2-Eval board. After you start spin2gui.exemake sure you go to Commands > Configure Commands... and select "P2 Defaults" then "OK". There are some sample programs included with spin2gui that do some basic things (serial I/O and LED blinking).
I see a few potential problems with the code:
(1) The original COG never stops (unless either cognum1 or cognum2 is 0). After the two coginits you should probably add a "cogstop #0".
(2) The second block of code (blink2) doesn't have its own origin; I'm not sure what's likely to happen as a result, but it probably isn't good. I would add an "org" directive just before the blink2 label.
(3) The declaration of "x" should go in the "blink" block (the declaration of "y" should stay with the "blink2" block).
To run it in spin2gui:
* Download spin2gui.zip (version 1.3.0) from https://github.com/totalspectrum/spin2gui/releases
* Unzip in a folder that has no spaces in its name (sorry, there's a bug there)
* Run spin2gui.exe
* Go to the menu Commands > Configure Commands... and select "P2 Default" then "OK"
* Enter the program above
* Save it via File > Save As...
* Press the "Compile & Run" button
Curious here, that mode value seems to set 0pF Xtal (Should be 15pF as better Xtal match?), and VCO/2 for a 320MHz VCO and 160MHz SysClk, 5MHz PFD
Why does clkset() also need _clkfreq as a param, as all PLL dividers setup seems to be in const _mode = 0x010c3f04 ?
Different boards might have different crystal frequencies. It's the same situation as the P1 clkset() function (which also takes those two parameters, although the meaning of the "mode" parameter is quite different.
Is _clkfreq actually used to set the PLL/VCO, or is it stored for future use so other code can know the SysCLK ?
_clkfreq is only stored for use by library functions. It has no effect on the PLL/VCO, only the _clkmode affects that.
change the line
add x,#32
to
add x,#56
to move the blinking leds up to P56..63
Bingo! Thank you!
I now bring you this embarrassing video where I forgot what fourth was and can couldn't get the P2 to blink
https://www.facebook.com/terrytrapp/videos/10219100499770344/
https://www.facebook.com/terrytrapp/videos/10219101012183154/
I found this in P2 Invaders (which has a configurable base pin) and was wondering: Is the usual pin sequence for VGA?
PIN SIGNAL
basepin Hsync
+1 Blue
+2 Green
+3 Red
+4 Vsync
Thanks in advance!
--Terry
Thanks, I have spin2gui (version 1.3.2) working with my P2-ES board. :cool:
I tried it for the first time and got the following error:
I copied and pasted the code
const _mode = 0x010c3f04
const _clkfreq = 160_000_000
const pin = 56
clkset(_mode, _clkfreq)
direction(pin) = output
do
output(pin) = not output(pin)
pausems 500
loop
C:/Users/Cosmicbob/Documents/P2Projects/Blink.spin(1) error: syntax error, unexpected identifier `_mode', expecting end of line or ','
C:/Users/Cosmicbob/Documents/P2Projects/Blink.spin(5) error: syntax error, unexpected '(', expecting end of line or ','
C:/Users/Cosmicbob/Documents/P2Projects/Blink.spin(8) error: syntax error, unexpected '(', expecting end of line or ','
C:/Users/Cosmicbob/Documents/P2Projects/Blink.spin(11) error: syntax error, unexpected $end
child process exited abnormally
====================================================
dat
orgh 0
'
' seperate initialization of two cogs to blink on the Eval board
'
org
coginit cognum1,#@blink ' init a single cog to use the blink program
'wait jmp #wait
coginit cognum2,#@blink2
wait jmp #wait
' ************ The following cog combinations all work fine:
cognum1 long 4
cognum2 long 0
' cognum1 long 3
' cognum2 long 5
' cognum1 long 4
' cognum2 long 0
' cognum1 long 5
' cognum2 long 2
' cognum1 long 1
' cognum2 long 4
'************* etc. any combo that doesn't have 0 or 2 initialized as cognum1 works
' ************* These combinations only blink the cognum1 led :
' cognum1 long 0
' cognum2 long 4
' cognum1 long 2
' cognum2 long 5
' cognum1 long 2
' cognum2 long 6
' this following combination only blinks 1 led (p58) on my P2-EV board
'cognum1 long 2
'cognum2 long 5
'
' blinkS
org
blink cogid x 'which cog am I, 0..7?
add x,#56 'add 56 to get LED pin
drvnot x 'output and flip that pin
shl x,#16 'shift up to make it big
waitx x 'wait that many clocks
jmp #blink 'do it again
blink2 cogid y 'which cog am I, 0..7?
add y,#56 'add 56 to get LED pin
drvnot y 'output and flip that pin
shl y,#16 'shift up to make it big
waitx y 'wait that many clocks
jmp #blink2 'do it again
x res 1
y res 1
I omitted a rather important fact in the "save it" step; if it's a BASIC program, it has to have a .bas extension in the name. It looks like you saved it as Blink.spin; try Blink.bas instead.
(fastspin uses the file extension to determine what language to parse; .bas and .bi for BASIC, .c or .h for C, and
anything else for Spin).
Ok thanks that worked. The strange thing is that compiling it in spin2gui blinks one LED however, the same code in PNut blinkes two LED's LOL
???
I think you must have confused something, because PNut does not support BASIC, or even Spin; all PNut can compile is P2 assembly.