Encoder Problem

I am using four grayhill encoders for our robot that uses a mecanum drive system. I am using the frc_encoder code from kevin watson. When I download the code unmodified it works just fine and all the encoders give me a reading. When I copy and paste the mecanum drive code into the encoder code only one of the encoders gives me a reading. Any help is much appreciated.

Can you post the code that doesn’t work?

Attached to this message is the user routines file that doesn’t work.

user_routines.c (16.2 KB)

user_routines.c (16.2 KB)

At a quick glance I dont see anything wrong. To confirm, your sayng when you comment out/dont run Default_Routine() that all 4 encoders work but when you run it only 1 does?

The "
" part of your printf commands bothers me. Aren’t we supposed to use just “\r” and not "

How does this code differ from what does work?

It’s a carriage return and a line feed. He’s constructed it like a Windows text file, which would normally use that escape sequence to mark a new line.

I have tried commenting out the calll to default routine but it still only will read one encoder. The only difference between my code and the frc_encoder code ist that I have added some mecanum drive code for our robot.

Could you please post both copies of your code for us to look at.

Did you add code any where else besides user_routines?

The new user routines is the one from my earlier post and the old user routines is attached to this message and the only thing i edited between the two codes is the addition of the mecanum drive code.

user_routines.c (15.2 KB)

user_routines.c (15.2 KB)

Have you tried putting in the frc_encoders code again to see if all the encoders still work?

When I download the frc_encoders the encoders work great but when I add the mecanum drive code only one encoder will feed back values.

Try running the 2 through a diff tool to see the difrences in the 2 files. I didnt see anything when I did a quick look, ill check again when I have more time.

Where would I get a diff tool. I’ve never even heard of such a thing.

Not so:

From code that works:
/* SECOND: Set up the I/O pins you want to use as digital OUTPUTS. /
digital_io_17 = OUTPUT; /
Example - Not used in Default Code. */

/* THIRD: Initialize the values on the digital outputs. */
rc_dig_out17 = 0;

From modified code:
/* SECOND: Set up the I/O pins you want to use as digital OUTPUTS. /
digital_io_17 = INPUT; /
Example - Not used in Default Code. */

My mistake. Thanks for pointing that out but would that make a difference for the encoders.

If you don’t recall changing that, then maybe there’s others. Obviously, something’s different = one works, one dosen’t.

How about the fact that you’re getting the encoder count for #s 1…4 in one chunk of code, and for #s 1…6 in the other. Is encoder.h set up to use six(6) encoders?

PS: The call to Default_Routine() is commented out in both sets of code, so don’t expect any changes there to show up once you get encoders working.

I have tried it both ways. I have tried it with all six encoders enabled and I have tried it with 4 enabled. Other than that there are no changes between the encoder.h files. About the default routine I have tried commented and uncommented but it still will only read one encoder.

It could be that your interrupt handlers are set up wrong in user_routines_fast.c. Have you checked those?
You should be able to drop the user_routines_fast.c from Kevin’s code into your project, unless you are using custom timers, or have already written up some autonomous routine.

At the very least, check to see if InterruptHandlerLow is set up the same in both sets of code.

Hope this helps.

Grab a copy of WinMerge and check out your 2 files.