Pullup Widerstände? ..
.. Brauch ich an der Stelle doch nicht, wenn ich die High Flanke auswerten möchte oder? Dann doch eher Pull Down oder? ..
Wenn Du das nicht brauchst, ists doch ok - da hatte Dir sicher das Datenblatt des Encoders Auskunft gegeben. Oder verlangt der Encoder (sprich: das Datenblatt) nen Pull Down?

Ich habe die Auswertung für die Encoder an meinem Selbstbau"Servo" mit Pullup gemacht. Die Auswertung wirst Du sicher anders machen, ist hier sehr speziell. Kann aber, wie erwähnt, für Deine Encoder anders verlangt werden, siehe zugehöriges Datenblatt. Belegt werden soll hier nur die Initialisierung der Pinne mit internem PullUp :
Initialisierungen der Controllerpinns im main
Code:
/* >>
  Stand  ...\C4\C4\SVbby2\SVbby1p.c
 =============================================================================== =
  Target MCU        : ATmega 328p QFM
  Target Hardware   : babyorangutan und Micromotor als Servo mit Standardfunktion
  Target cpu-frequ. : 20 MHz Resonator
 =============================================================================== =
. . . . Code gestrichen
 ============================================================================== */
. . . . Code gestrichen
// ============================================================================= =
// ===  HAUPTProgramm ========================================================== =
. . . . Code gestrichen
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// ===  Grundlegende Initialisierungen der Hardware, Portdefinition (PDIP !!)
//         PCINT14,/RESET,PC6   1       28   PC5,ADC5,SCL,PCINT13
//            PCINT16,RxD,PD0   2       27   PC4,ADC4,SDA,PCINT12
//            PCINT17,TxD,PD1   3       26   PC3,ADC3,PCINT11
//           PCINT18,INT0,PD2   4       25   PC2,ADC2,PCINT10
//      PCINT19,OC2B,INT1,PD3   5       24   PC1,ADC1,PCINT9
//         PCINT20,XCK,T0,PD4   6       23   PC0,ADC0,PCINT8
//                        VCC   7       22   GND
//                        GND   8       21   AREF
//     PCINT6,XTAL1,TOSC1,PB6   9       20   VCC
//     PCINT7,XTAL2,TOSC2,PB7  10       19   PB5,SCK,PCINT5
//        PCINT21,OC0B,T1,PD5  11       18   PB4,MISO,PCINT4
//      PCINT22,OC0A,AIN0,PD6  12       17   PB3,MOSI,OC2,OC2A,PCINT3
//           PCINT23,AIN1,PD7  13       16   PB2,/SS,OC1B,PCINT2
//       PCINT0,CLKO,ICP1,PB0  14       15   PB1,OC1A,PCINT1
// - - - - - - - - - - - - - - -
//  Initialisierung der BOARD!! Anschlüsse am babyorangutan mit mega328-TQFP:
//                /RESET, PC6   1 EU  A 28   PC5                ============
//              UART-RxD, PD0   2 EU  A 27   PC4                        ====
//   rtUserLED, UART-TxD, PD1___3 EU  A 26___PC3          
//     Encoder-1-A, INT0, PD2   4 EU  A 25   PC2, TASTEJ-GND
//    Motor2B, OC2B,      PD3   5 EU EU 24   PC1, TASTEJ-In = PCINT9
//  Encoder-1-B, PCINT20, PD4___6 EU  A 23___PC0          
//                    +++ VCC   7 +   - 22   GND  ---     
//                    --- GND   8 -   + 21   AREF ref     
//                 XTAL1  PB6___9 A     20___AVCC         
//                 XTAL2  PB7  10 A   A 19   PB5, SCK, PCINT5
//    Motor1B, OC0B,      PD5  11 EU  A 18   PB4, MISO, (GND)-blaue-LED
//    Motor1A, OC0A,      PD6__12 A   A 17___PB3, MOSI, OC2A, Motor2A
//          Taste rechts, PD7  13 A   A 16   PB2, (+)-blaue LED
//         (+)-heartbeat, PB0  14 A   A 15   PB1, (GND)-Heartbeat-LED
// Anmerkungen zu den Motoren: die Controllerpins sind NUR über
//      sind NUR über den Motortreiber (Wahrheitstabelle!!) zu erreichen
// - - - - - - - - - - - - - - -
// Ports als Ein- (0) oder Ausgänge (1) konfigurieren, Pins/Pull Ups (1) aktiv.
//   A = Ausgang, E = Eingang ohne , EU = Eingang MIT PullUp, Belegung siehe oben
  DDRB  = 0b11101111;   // Heartbeat auf B0(+)/(GND -) 
  PORTB = 0b00010000;   //  PB5: PCI für Servopuls
                        //
  DDRC  = 0b00111101;   // PC0, PC2-5, PC6+7-Pin  H I E R  bei babyorangutan (MLF)
  PORTC = 0b11000010;   // PC0, PC2-5 sind aktuell Ausgänge ##>> KEIN Pullup !!
                        // 
  DDRD  = 0b01101011;   // RX/TX-PD0/1, PD5/PD6 = M1B/M1A, PD7 = Taste: PullUP !
  PORTD = 0b10010100;   //   Pull Ups aktivieren, mit pololuMot AUCH bei INT0/~1
                        //
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
. . . . Code gestrichen
Build succeeded with 0 Warnings...
 ============================================================ */
Initialisierungen und Auswertung der Encodereingänge
Code:
/* >> 
  Stand  ...\C4\SVbby1p\Sbby1p_motij.c
 =============================================================================== =
. . . . Code gestrichen
 =============================================================================== =
  *** Versionsgeschichte:
 ====================
 x24 23Nov16 1450 Motor EINschalten erst nach Einstellung der "Hand auf für Geld"
. . . . Code gestrichen
 ============================================================================== */


// ============================================================================= =
// ===  Initialisierung externer Interrupts bei m328, doc 8271I
//      EXT_INT0 auf PORTD2  --  Encoder IencB0 auf PIND2
// ============================================================================= =
  void XTI0_int( void )            // Initialisiere Interrupt 0, PD2, auf ANY edge
 {                              //  => EICRA ISC00 + ~10 auf 1                 S71
// - - - - - - - - - - - - - - - -
//      Initialisiere PD2 als externen Interrupt, ANY edge
  EICRA   |=  (1<<ISC00);       // INT0 triggert auf jede Flanke (any edge)
  EIMSK   |=  (1<<INT0);        // erlaube INT0
// Initialisierung der Zeiten:   
  Iencdr0  =  Iz_diff0  =  Iz_yseci0  =  Iz_ysecv0  =  0;
  tmrE0    =  0;                // Timer für Drehzahlerfassung
                                //
  Iencdr0       =  Iencdef0;    // Initialisiere Startwert Encoder (vgl. main)
  IencB0        =  IenBdef0;    // Initialisiere Startwert Encoder
                                //
 }      // Ende von void XTI_0_1_init( void )
// ============================================================================= =


// ============================================================================= =
// ===  Nicht unterbrechbare ISR für EXT_INT0(any edge auf mega328      ======== =
//      Der Timer tmrE0 wird ausgelesen für Laufzeit des EXT_INT0 auf PD2.
//      Enc-zähler Iencdr0 wird mit jedem Tick hochgezählt, ohne Richtung=any edge
//      Encoder IencB0 wird richtungskonform hochgetickert => gesamte Fahrstrecke
//              seit Rücksetzen (irgendwo); Aussage über Drehrichtung ist gegeben
//      EXT_INT0 (Enc-spurA) triggert auf PORTD 2
//       PCINT20 (ENC-spurB) triggert auf PORTD 4
// ============================================================================= =
  ISR(INT0_vect)                // INT0-PD2 triggert ANY edge => lesen Iencdr0/A
 {                              //   => Bei Aufruf PORTD2 prüfen auf high/low
// - - - - - - - - - - - - - - - -
//251116  if ( Isecstrt ) return;       // Keine Messung in der Startphase
//  ToggleBit ( PBLED, LBb );   // blLED toggeln, PORTB, blLED auf PB2
  Iz_diff0  = tmrE0;    // Hier die Zeit (in x 50µs-tupsi) seit letztem ISR-Aufruf
  tmrE0     =     0;    // Timer für Encoderinterupts auf Null  
  Iencdr0 ++;                   // Incrementiere Encodercounter, NUR aufwärts
  if ((IsBitSet (PIND, 2)) == (IsBitClr (PIND, 4))) IencB0++;
                                // Rad treibt vorwärts,  math. negativ
  else                    IencB0--;     // Rad treibt rückwärts, math. positiv
 }      // Ende ISR(INT0_vect)
// ============================================================================= =


// ============================================================================= =
// ===  Initialisierung Pin Change Interrupt bei m328, doc 8271I
//      PCINT[23:16], PORT D4, any Edge <=> Für Zählung Encoderflanken Spur "B"
//      Die zugehörige ISR tickert Iencdr0 und IencB0 rauf bzw. runter
//              ==>>    Die Zeit-/Drehzahlerfassung bleibt NUR bei EXT_INT0/PB2
// ============================================================================= =
  void PCI2_int( void )         // Initialisiere PCI 20, PB4, any edge     doc  74
 {                              //
// - - - - - - - - - - - - - - - -
//251116  if ( Isecstrt ) return;       // Keine Messung in der Startphase
  PCICR     |=  ( 1<<PCIE2 );   // Auswahl PCINT[23:16] ; hier PD4; siehe PCMSK2
                                // PCI triggert auf jede Flanke (any edge)
  PCMSK2    |=  ( 1<<PCINT20 ); // Interrupt kommt von PB5
 }      // Ende von void XTI_0_1_init( void )
// ============================================================================= = 


// ============================================================================= =
// ===  Nicht unterbrechbare ISR für PCINT0 auf PB5; mega328
//      PCINT[7:0], PORTB5, any Edge <=> Für Pulszeitmessung Servopuls
//      Die zugehörige ISR misst die Pulszeit tPULS für einen Servo in [tupsi]
//              also die Zeit, in der der Servopuls auf high steht
//      Siehe dazu ISR(TIMER1_COMPA..
// ============================================================================= =
  ISR(PCINT2_vect)              // PCINT2 triggert ANY edge =>  lesen Iencdr0/B
 {                              //   prüfe ob PB5 = high, nur dann Wert übernehmen
// - - - - - - - - - - - - - - - -
//251116  if ( Isecstrt ) return;       // Keine Messung in der Startphase
// ToggleBit ( PBLED, LBb );    // blLED aus, PORTB, blLED auf PB2
  Iz_diff0  = tmrE0;    // Hier die Zeit (in x 50µs-tupsi) seit letztem ISR-Aufruf
  tmrE0     =     0;    // Timer für Encoderinterupts auf Null  
  Iencdr0 ++;                   // Incrementiere Encodercounter, NUR aufwärts
  if ((IsBitSet (PIND, 2)) == (IsBitClr (PIND, 4))) IencB0--;
                                // vgl. ISR(INT0_vect)
  else                    IencB0++;     // vgl. ISR(INT0_vect)
                                //
 }              // Ende ISR(PCINT2_vect)
// ============================================================================= =

. . . . Code gestrichen

// ============================================================================= =
// =====  ENDE    Subroutinen  ================================================= =
// ============================================================================= =
Der Wert tmrE0 enthält die Anzahl der Zeiteinheiten für die Drehzahlmessung - wird von einem Timer geliefert.