View Single Post
  #4   Spotlight this post!  
Unread 14-02-2007, 10:17
Jake M Jake M is offline
void* Jake;
FRC #1178 (DURT)
Team Role: Programmer
 
Join Date: Jan 2006
Rookie Year: 2005
Location: Missouri
Posts: 118
Jake M has a spectacular aura aboutJake M has a spectacular aura about
Re: Code for sensor still doesn't work

I think that you think the code is constantly making sure that pwm03 is equal to p3_y. In reality, it only does this once, at the beginning of your code,
Code:
	if((now2 == 1) && (last2 == 0)) //p3_sw_trig sets joystick 3 y-axis to forklift motor. Use after each level.
	{
		pwm03 = p3_y;
	}
Once you pass this statement, the value of pwm03 does not change, unless you change it yourself, by saying pwm03 = whatever; It may seem like the value of pwm03 is constantly being changed to fit p3_y, when you run the code in real time, on the RC, but that's only because that single statement pwm03 = p3_y is being executed about 256 times per second.

What I think you mean by the pwm03 != p3_y statements is "I don't want pwm03 to equal p3_y anymore. Instead, I want it to be 127." In C (in fact in most programming languages) this is completely unnecessary. All you have to do is say pwm03 = 127; and it will overwrite the previous value.

However, I don't think this is the problem with your code. My guess is this.....

That switch only triggers for a minute fraction of a second, when the tape passes in front of it. The only way your code will work is if at the exact moment that the switch triggers (when rc_dig_in04 is 1), your program has to be executing the exact line of code that assigns rc_dig_in04 to another variable. If this is not the case, which it won't be 99% of the time, rc_dig_in will be 0, and your other variable will be zero, even if the sensor detected the metal tape. What you need to do is trigger an interrupt when the sensor triggers. What this will do, is when the sensor triggers, it will stop all your other code, and go straight to the interrupt handler (which can be found in user_routines.c) and execute that code, while the sensor is still triggered. You can add your own code to the interrupt handler and it is there that you can set another variable to 1, saying that the sensor has triggered, and handle the stopping of the motor and all that, elsewhere (where it is now is fine).

Edit: Yes, static variables are also necessary. Remember, this code is not executing constantly, it is executing many times each second. Which means that Default_Routine() is being called and returning many times per second. Each time it does, all your now and last variables are being reset to zero.
__________________
Code:
void function(void)
 {
  function();
 }

Last edited by Jake M : 14-02-2007 at 10:20.