Hi Doug,
Perhaps another software detail to check: Are you using the command scheduler in WPILib? If your command scheduler is not killing the FWD command, even when the REV command is started, then you'll have conflicting calls to Motor.set() as Peter describes. It sounds like maybe the FWD command is only killed on the falling edge (rather than the rising edge) of the FWD limit switch signal.
Deploying a test project that checks a button or axis every loop iteration and sets the motor speed over CAN based on that (with only a single Motor.set() call, and without checking the limits at all) should confirm the hardware's behavior.
Congrats on your phenomenal win at Northern Lights! Looking forward to seeing more of it in the North Star webcast, and of course at Champs
