Cog problem
LaserSteve
Posts: 21
in Propeller 1
I can't get the LEFT and the RIGHT routines to both run at the same time.
The RIGHT routine works fine, but I can only get the LEFT routine to run by disabling the RIGHT routine.
To me they appear to be completely independent, but something is getting in the way.
The RIGHT routine works fine, but I can only get the LEFT routine to run by disabling the RIGHT routine.
To me they appear to be completely independent, but something is getting in the way.
CON _CLKMODE = XTAL1 + PLL16X _XINFREQ = 5_000_000 var long PWMstack,LeftStack,RightStack,a,b PUB Main cognew(Left,@Leftstack[3000] ) 'Command the left wheels cognew(Right,@RightStack[3000] ) 'Command the right wheels cognew(PWMCLocK,@PWMstack[90] ) 'Internal PWM clock dira[3]~ 'set the I/O ports 3,5,7,9, and 11 to inputs dira[5]~ dira[7]~ dira[9]~ dira[11]~ dira[8]~~ 'set the I/O ports 8,10,12, and 14 to outputs dira[12]~~ dira[10]~~ dira[14]~~ repeat ' CheckingInputs if ina[5]==0 'Left forward on outa[10]:=1 outa[14]:=0 if ina[7]==0 'Left reverse on outa[10]:=0 outa[14]:=1 if ina[5]==1 and ina[7]==1 'Left forward off and left reverse off outa[10]:=1 outa[14]:=1 if ina[9]==0 'Right forward on outa[8]:=1 outa[12]:=0 if ina[11]==0 'Right reverse on outa[8]:=0 outa[12]:=1 if ina[9]==1 and ina[11]==1 'Right forward off and right reverse off outa[8]:=1 outa[12]:=1 Repeat PUB Right 'Control the right wheels dira[4]~~ outa[4]~ dira[17]~~ outa[17]~ repeat b:=600 repeat while ina[9]==0 or ina[11]==0 outa[17]~~ '******* Ramp up to speed repeat while b<9000 ' steps per iteration. 9999 maximum pulse width b+=50 waitpeq(%0010, %0010,0) 'Waiting for the PWM clock to go high on I/O port 1 (0010) outa[4]~~ waitcnt(cnt+b) outa[4]~ '*********** Travel ************ waitpeq(%0010, %0010,0) 'Waiting for the PWM clock to go high outa[4]~~ waitcnt(cnt+b) outa[4]~ '****** Ramp down ***** repeat while b > 700 b:=b-100 waitpeq(%0010, %0010,0) 'Waiting for the PWM clock to go high outa[4]~~ waitcnt(cnt+b) outa[4]~ outa[17]~ PUB Left 'Control the left wheels dira[6]~~ outa[6]~ dira[16]~~ repeat a:=600 repeat while ina[5]==0 or ina[7]==0 outa[16]~~ '******* Ramp up to speed repeat while a<9000 ' steps per iteration. 9999 maximum pulse width a+=50 waitpeq(%0010, %0010,0) 'Waiting for the PWM clock to go high on I/O port 1 (0010) outa[6]~~ waitcnt(cnt+a) outa[6]~ '*********** Travel ************ waitpeq(%0010, %0010,0) 'Waiting for the PWM clock to go high outa[6]~~ waitcnt(cnt+a) outa[6]~ '****** Ramp down ***** repeat while a > 700 a:=a-100 waitpeq(%0010, %0010,0) 'Waiting for the PWM clock to go high outa[6]~~ waitcnt(cnt+a) outa[6]~ outa[16]~ '******* CLOCK ******* PUB PWMCLocK dira[1]~~ repeat outa[1]~~ waitcnt(500 + cnt) outa[1]~ waitcnt(20000+cnt) '***********************
Comments
long PWMstack[10], LeftStack[20], RightStack[20], a, b
Leave out the [3000] and [90] in the cognew statements.
The stack sizes can be bigger. I'd probably use 50 and look carefully at the program after it's working to see if a lesser amount is really needed.
My programming is rather rusty.
Best regards.
I must confess, my knowledge about P1 is very limited, so I need to resort to logical comparisons, in order to find something weird in a piece of code.
Apart from the problem Mike Green did well spoted at the above post, the right and left routines seem to be very simmetric twins, which called my attention to the lack of an initial setup at pin [16] as I've done in the following code snippet:
Hope it helps
Henrique