PIC Micro Controller C Input / Output Routine

Quadrature Encoder ISR

by David Kott

struct RotaryEncoderStruct {
      int unused:4;  // RB[0:3]
      int A:1;   // RB4
      int B:1;   // RB5
      int unused2:2;  // RB6-7
};

struct RotaryEncoderStruct RotaryEncoder;

#pragma BYTE PORTB = 0x06

#pragma BYTE RotaryEncoder = 0x06 // Place structure right over PORTB at
location 0x06


USHORT g_usEncoderCount = 0;

#pragma INT_RB
void
PortBInterrupt (void)
{

      static BYTE OldPortB;
      BYTE byTemp;
      static struct RotaryEncoderStruct OldEncoder;


      if (OldPortB != (byTemp=(PORTB & 0x30))) {


      OldPortB = byTemp;

      if (RotaryEncoder.A == OldEncoder.A) {
     if (RotaryEncoder.B == RotaryEncoder.A)
    --g_usEncoderCount;
     else
    ++g_usEncoderCount;
      } else {
     OldEncoder.A = RotaryEncoder.A;
     if (RotaryEncoder.B == RotaryEncoder.A)
    ++g_usEncoderCount;
     else
    --g_usEncoderCount;
      }



     }

   // Handle more PORTB stuff here, like a button, or something.


}

Interested:

Questions:

Comments: