Max Amount of GOSUBs

woody79

New Member
I am currently writing a program for the AXE023. I am using gosub to control the motors. When I created a long list of commands to tell the motors using gosub it told me that only 16 gosub commands allowed. Is this just a setting in the Editor and can it be changed?
 
Last edited:

marcos.placona

Senior Member
What picaxe are you using? If it's an 18x (I believe it is), just go to options and change the number of gosubs to 256. The program size increases a but, but it's worth it, as 16 is almost nothing.

Update: It's not an 18x, but a 08 series, so unfortunately you can't increase the number of gosubs. Can't some of those gosubs be replaced with goto?

Maybe if you post your code, we can look at it and suggest some changes that will fix this little problem for you.
 
Last edited:

woody79

New Member
Yes unfortunately it is a 08. Does the return command work with goto?
Code:
main:
	gosub fmove
	pause 2000
	gosub smove
	gosub lmove
	pause 5000
	gosub smove
	gosub bmove
	pause 2000
	gosub smove
	gosub fmove
	pause 10000
	gosub smove
	gosub rmove
	pause 1000
	gosub smove
	gosub lmove
	pause 3000
	gosub smove
	gosub rmove
	pause 1000
	gosub smove
	gosub lmove
	pause 3000
	gosub smove
	
	end
	
fmove:
	high 0
	high 2
	return
	
bmove:
	high 1
	high 4
	return
	
lmove:
	high 1
	high 2
	return
	
rmove:
	high 0
	high 4
	return
	
smove:
	low 0
	low 1
	low 2
	low 4
	return
 

BCJKiwi

Senior Member
Create a symbol for each different pattern (lmove etc) which equals the pattern required so the program becomes something like this untested!!;

Code:
symbol fmove = %xxxxxxxx
symbol bmove = %xxxxxxxx
symbol lmove = %xxxxxxxx
symbol rmove = %xxxxxxxx
symbol smove = %xxxxxxxx
 
main:
let pins = fmove
pause 2000
let pins = smove
let pins = lmove
    pause 5000
let pins = smove
let pins = bmove
    pause 2000
let pins = smove
let pins = fmove
    pause 10000
let pins = smove
    gosub rmove
    pause 1000
let pins = smove
let pins = lmove
    pause 3000
let pins = smove
let pins = rmove
    pause 1000
let pins = smove
let pins = lmove
    pause 3000
let pins = smove
 
    end
Would that work for you?
 

tarzan

Senior Member
AXE023

Hi Woody79

I have used the AXE023 for robot control in the past, one thing that I quickly did was to use another Picaxe to send commands to it via serin on pin3. This will allow you to setup forward, reverse etc on the AXE023 and then have your operating program on another Picaxe which will send instructions via serial communication.

If you need extra program space on the AXE023 you can replace the 08 with a 08M.

Here’s a link:
 
Last edited:

Dave-nz2

New Member
One rough alternative...

Although you may have packaged the subroutines neatly to begin with,
you could try just avoiding gosub altogether, with routines cut-n-pasted.

There'll be a more elegant/clever method i'm sure...

Follows is a rough idea, probably needs some tweaking to work...
Code:
#picaxe 08
symbol p01 = 1000
symbol p02 = 2000
symbol p03 = 3000
symbol p05 = 5000
symbol p10 = 10000
'init:
 low 0 : low 1 : low 2 : low 4   'smove
'main: 
 high 0 : high 2 'fmove
 pause p02 
 
 low 0 : low 1 : low 2 : low 4   'smove
 high 1 : high 2 'lmove
 pause p05
 
 low 0 : low 1 : low 2 : low 4   'smove
 high 1 : high 4 'bmove
 pause p02
 
 low 0 : low 1 : low 2 : low 4   'smove
 high 0 : high 2 'fmove
 pause p10
  
 low 0 : low 1 : low 2 : low 4   'smove
 high 0 : high 4 'rmove
 pause p01 
 low 0 : low 1 : low 2 : low 4   'smove
 high 1 : high 2 'lmove
 pause p03
 low 0 : low 1 : low 2 : low 4   'smove
 high 0 : high 4 'rmove
 pause p01 
 
 low 0 : low 1 : low 2 : low 4   'smove
 high 1 : high 2 'lmove
 pause p03
 low 0 : low 1 : low 2 : low 4   'smove
end
(Using 95 bytes out of 128)
Or
Code:
#picaxe 08
symbol p01 = 1000
symbol p02 = 2000
symbol p03 = 3000
symbol p05 = 5000
symbol p10 = 10000
'init:
'             4.210
 let dirs = %10111   'pins 0,1,2,4 = outputs
 let pins = %00000   'stop
'main: 
 let pins = %00101   'fwrd
 pause p02 
 
 let pins = %00000   'stop
 let pins = %00110   'left
 pause p05
 
 let pins = %00000   'stop
 let pins = %10010   'back
 pause p02
 
 let pins = %00000   'stop
 let pins = %00101   'fwrd
 pause p10
  
 let pins = %00000   'stop
 let pins = %10001   'rght
 pause p01 
 let pins = %00000   'stop
 let pins = %00110   'left
 pause p03
 let pins = %00000   'stop
 let pins = %10001   'rght
 pause p01 
 
 let pins = %00000   'stop
 let pins = %00110   'left
 pause p03
 let pins = %00000   'stop
end
(Using 67 bytes out of 128)
 

woody79

New Member
Thank you BCJ.
@Tarzan: Would add another Picaxe, but trying to keep the cost low.
 
Last edited:

Dave-nz2

New Member
skinning cats...

Yet another way to do it... (couldn't help but try : )
This seems to pass syntax check for some reason, so may be close...
Code:
#picaxe 08
 
'--delay value consts (0-65535 milliseconds)
symbol p01 = 1000
symbol p02 = 2000
symbol p03 = 3000
symbol p05 = 5000
symbol p10 = 10000
 
'--vars
symbol index = b8   'sequence thru each move/pause value
symbol action = b4 'stop, move, pause, or done. 
symbol ms_delay = w1  'b2:b3 resultant pause value
 
'--moves
symbol smove = %00000   'stop ( 0)
symbol fmove = %00101   'fwrd ( 5)
symbol bmove = %10010   'back (18)
symbol lmove = %00110   'left ( 6)
symbol rmove = %10001   'rght (17)
symbol move_max = 23  'values <= this are moves
 
symbol ms_1000  = 110 '110 -100 *100 = 1000 ms delay
symbol ms_2000  = 120 '120 -100 *100 = 2000 ms delay
symbol ms_3000  = 130 '130 -100 *100 = 3000 ms delay
symbol ms_5000  = 150 '150 -100 *100 = 5000 ms delay
symbol ms_10000 = 200 '200 -100 *100 = 10000 ms delay
 
symbol done = 255
 
'action values of 0,4,6,17,18 = moves
'action values > 100 are millisecond pauses
'action value of 255 means stop cos we're done
 
'init:
'             4.210
 let dirs = %10111   'pins 0,1,2,4 = outputs
 let pins = smove    'stop
 
main: 
 index = 0
 read index, action
 if action = done then
  end
 else if action <= move_max then
  let pins = smove
  let pins = action
 else if action > 100 then
  ms_delay = action - 100 * 100
  pause ms_delay
 endif
goto main
'end
 
'--Actions: moves & pauses
EEPROM 0,(fmove, ms_2000)
EEPROM   (lmove, ms_5000)
EEPROM   (bmove, ms_2000)
EEPROM   (fmove, ms_10000)
EEPROM   (rmove, ms_1000)
EEPROM   (lmove, ms_3000)
EEPROM   (rmove, ms_1000)
EEPROM   (lmove, ms_3000)
'EEPROM   (add more moves & pauses here)
EEPROM   (smove, done) 'finish cleanly
(Memory used = 64 bytes out of 128)
Obviously the code style has many compromises...
 
I had a similar issue on a 08M

try doing something like this

Code:
for b1 =1 to 5

goto ring,reset, power, pause,ring2

next b1


ring:
bla bla bla

reset:
bla bla bla

power:
Bla bla bla

pause:
bla bla bla

Ring2:
bla bla bla


sorry if im way off track. im very new to this stuff, and it 3am and im on a night shift haha
 
Last edited:

woody79

New Member
Thanks for all the replies. This is what I've decided I'm going to use:
Code:
symbol fmove = %00101		'forward
symbol bmove = %10010		'backwards/reverse
symbol lmove = %00110		'left turn
symbol rmove = %10001		'right turn
symbol smove = %00000		'stop movement
					'smove is required after every pause

main:
	let dirs = %10111
	
	let pins = fmove		'Copy these two lines and change accordingly
	pause 1000			'Time is in milliseconds 1000 = 1 sec
	let pins = lmove
	pause 500
	let pins = rmove
	pause 500
	let pins = lmove
	pause 500
	let pins = rmove
	pause 500
	let pins = lmove
	pause 500
	let pins = rmove
	pause 500
	let pins = bmove
	pause 3000
	let pins = fmove
	pause 500
	let pins = bmove
	pause 500
	let pins = fmove
	pause 500
	let pins = bmove
	pause 500
	let pins = fmove
	pause 500
	let pins = bmove
	pause 500
	let pins = fmove
	pause 500
	let pins = bmove
	pause 500
	
	let pins = smove		'Stop power so that the next command will execute cleanly
	end				'Discontinue execution of program. Use goto main if you want to continue.
 

westaust55

Moderator
Woody,

another approach is to use the ON ... GOSUB command.
Have a look at Manual 2 page 103.

Others have reported that this method can be a bit slow or memory hungry where there are many destination subroutines, but worth keeping in mind.
 
Top