Log in

View Full Version : Need help with my code


jaywion
19-03-2004, 09:51
[/FONT][/SIZE][/COLOR]I need help with my code, its not working so far in Autonomous mode. We didn't have one at Reginals and want one for nationals please tell me whats wrong with my code.

void User_Autonomous_Code(void)
{

//A handy-dandy macro to convert a number of seconds into a number of 26.2ms ticks
#define SECS_TO_TICKS(a) ( ((long)(a)) * (long)10000 / (long)262 )
//And milliseconds too:
#define MSECS_TO_TICKS(a) ( ((long)(a)) * (long)10 / (long)262 )

/* Initialize all PWMs and Relays when entering Autonomous mode, or else it
will be stuck with the last values mapped from the joysticks. Remember,
even when Disabled it is reading inputs from the Operator Interface.
*/
pwm01 = pwm02 = pwm03 = pwm04 = pwm05 = pwm06 = pwm07 = pwm08 = 127;
pwm09 = pwm10 = pwm11 = pwm12 = pwm13 = pwm14 = pwm15 = pwm16 = 127;
relay1_fwd = relay1_rev = relay2_fwd = relay2_rev = 0;
relay3_fwd = relay3_rev = relay4_fwd = relay4_rev = 0;
relay5_fwd = relay5_rev = relay6_fwd = relay6_rev = 0;
relay7_fwd = relay7_rev = relay8_fwd = relay8_rev = 0;

tickCount=0;

AUTO_STATE = AUTO_FIRST_STATE;

while (autonomous_mode) /* DO NOT CHANGE! */
{
if (statusflag.NEW_SPI_DATA) /* 26.2ms loop area */
{
Getdata(&rxdata); /* DO NOT DELETE, or you will be stuck here forever! */

/* Add your own autonomous code here. */
printf("In auto mode ");

tickCount++; //tickCount contains the number of 26.2ms "ticks" since the start of the current step

switch (AUTO_STATE)
{
case AUTO_FIRST_STATE:
printf ("First, we go forward for 3 secz %d", (int)tickCount);
pwm13 = 127+100;
pwm15 = 127+100;
printf ("in auto first state pmw13= %d\n",(int)pwm13);
if(tickCount >= SECS_TO_TICKS(1))
{
AUTO_STATE = AUTO_FINISHED; //AUTO_SECOND_STATE;
tickCount = 0;
}
break;
case AUTO_SECOND_STATE:
pwm13 = 127 + 50; pwm15 = 127;

if(tickCount >= SECS_TO_TICKS(3))
{
AUTO_STATE = AUTO_THIRD_STATE;
tickCount = 0;
}
break;
case AUTO_THIRD_STATE:
relay3_fwd=1;
pwm01 = 127; pwm02 = 127;

if(tickCount >= SECS_TO_TICKS(3))
{
AUTO_STATE = AUTO_FOURTH_STATE;
tickCount = 0;
}
break;

case AUTO_FINISHED:
pwm13 = pwm15 = 127;
tickCount=0;
break;
default:
pwm01 = pwm02 = 127;
tickCount=0;
}// end switch



printf("READY to Put Data pwm13 = %d pwm 15=%d/n",(int)pwm13, (int)pwm15);
DisplayBufr( &rxdata ); // Print the 26 bytes received from the Master processor.

Putdata(&txdata); /* DO NOT DELETE, or you will get no PWM outputs! */
}// end if
}// end while
}// end User_Autonomous_Code

Alan Anderson
19-03-2004, 10:18
I need help with my code, its not working so far in Autonomous mode. We didn't have one at Reginals and want one for nationals please tell me whats wrong with my code.
What is it supposed to do? I noticed one odd thing right away:
if(tickCount >= SECS_TO_TICKS(1))
{
AUTO_STATE = AUTO_FINISHED; //AUTO_SECOND_STATE;
tickCount = 0;
}
Is it really supposed to go to the AUTO_FINISHED state after one second, or did you mean for it to go to AUTO_SECOND_STATE instead?

(If you surround your code with and tags when you post it here, the whitespace formatting will be preserved.)

KenWittlief
19-03-2004, 12:53
what does
break;
do? does it make the code stop?

WebWader125
19-03-2004, 13:21
Ken: the "break" statement tells the code to go to the end of the enclosing conditional block. In this case, break prevents the code from falling into the next case.

Alan: I assume that he commented out AUTO_SECOND_STATE for debugging.

jaywion: What behavior are you seeing that you don't like?

jaywion
19-03-2004, 14:04
What is it supposed to do? I noticed one odd thing right away:
if(tickCount >= SECS_TO_TICKS(1))
{
AUTO_STATE = AUTO_FINISHED; //AUTO_SECOND_STATE;
tickCount = 0;
}
Is it really supposed to go to the AUTO_FINISHED state after one second, or did you mean for it to go to AUTO_SECOND_STATE instead?

(If you surround your code with and tags when you post it here, the whitespace formatting will be preserved.)

I am trying to get it to go forward for so long then stop. The finish call in that area is to see if it goes through the loop but your right it shouldn't be their. Altho we did that the code is not being sent to the PWMs.

KenWittlief
19-03-2004, 14:17
do any of the printfs print out?

first thing I would try is get rid of the Tic-count stuff and just put numbers in - 38 per second

Alan Anderson
19-03-2004, 15:36
Oh! This is an old -- and solved -- problem. It doesn't have anything to do with what you wrote. The default code just fails to control the last four pwm outputs in the User_Autonomous_Code() function.
Insert the line "Generate_Pwms(pwm13,pwm14,pwm15,pwm16);" right before
"Putdata(&txdata);" in User_Autonomous_Code().

That should take care of it. (If you had said at the beginning that you weren't getting any response from the pwm outputs, we might have recognized it sooner.)

jaywion
20-03-2004, 11:09
Ken: the "break" statement tells the code to go to the end of the enclosing conditional block. In this case, break prevents the code from falling into the next case.

Alan: I assume that he commented out AUTO_SECOND_STATE for debugging.

jaywion: What behavior are you seeing that you don't like?

The behavior I dont like is the same I am sure others dont like and that is just sitting their in antonymous mode. It's really disappointing to see that and so I need to fix this code to get the antonymous to work.

Greg Ross
20-03-2004, 11:31
I suspect Alan's diagnosis (below) is correct. Have you tried it yet? (Or do you have to wait until the championships before you can try it?)

KenWittlief
20-03-2004, 11:32
What Alan Anderson said - that is exactly why your pwms dont change