Problems with reading quadrature encoder using code from playground

Hello, at this point all I am trying to do is to read the quadrature encoder count. Ultimately I plan to use this encoder value as my input for PID position control of the motor (pololu item# 1447).

The code I originally used directly from the playground didn't work. It had

 volatile unsigned int encoder0Pos = 0;

I changed this to:

long int encoder0Pos=0;

now the code is as follows:

#define encoder0PinA  2
#define encoder0PinB  4

long int encoder0Pos = 0;

void setup() { 

  pinMode(encoder0PinA, INPUT); 
  digitalWrite(encoder0PinA, HIGH);       // turn on pullup resistor
  pinMode(encoder0PinB, INPUT); 
  digitalWrite(encoder0PinB, HIGH);       // turn on pullup resistor

  attachInterrupt(0, doEncoder, CHANGE);  // encoder pin on interrupt 0 - pin 2
  Serial.begin (9600);
  Serial.println("start");                // a personal quirk


void loop(){ 
// do some stuff here - the joy of interrupts is that they take care of themselves

void doEncoder() {
  /* If pinA and pinB are both high or both low, it is spinning
   * forward. If they're different, it's going backward.
   * For more information on speeding up this process, see
   * [Reference/PortManipulation], specifically the PIND register.
  if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB)) {
  } else {

  Serial.println (encoder0Pos, DEC);

/* See this expanded function to get a better understanding of the
 * meanings of the four possible (pinA, pinB) value pairs:
void doEncoder_Expanded(){
  if (digitalRead(encoder0PinA) == HIGH) {   // found a low-to-high on channel A
    if (digitalRead(encoder0PinB) == LOW) {  // check channel B to see which way
                                             // encoder is turning
      encoder0Pos = encoder0Pos - 1;         // CCW
    else {
      encoder0Pos = encoder0Pos + 1;         // CW
  else                                        // found a high-to-low on channel A
    if (digitalRead(encoder0PinB) == LOW) {   // check channel B to see which way
                                              // encoder is turning  
      encoder0Pos = encoder0Pos + 1;          // CW
    else {
      encoder0Pos = encoder0Pos - 1;          // CCW

  Serial.println (encoder0Pos, DEC);          // debug - remember to comment out
                                              // before final program run
  // you don't want serial slowing down your program if not needed

The serial monitor shows it to work perfectly at first, then quits printing a value. This usually occurs at around encoder0Pos=-38.

Any feedback here will be greatly appreciated.

Interrupts are automatically disabled when in an ISR Serial.println() uses an interrupt You have Serial.println() in your ISR

Variables that change in an ISR should be declared volatile You change a variable in your ISR that is not declared volatile

Fix both problems and see whether things improve.

Thank You! Fixed what you said to and it works perfectly!