thanks for the feedback. Faulty ground on optical switch is not the problem. Like I said I can take out a portion of the code and the optical switch works well..... I rewrote the code yet again and see the same issue. I realize it is not elegant, and it should dwell in each loop until the correct cadence....but what I see is it vectors outside of the loop and enables the start switch which is deliberated left out of the normal loop....it is only used once upon start up to kick start the checkleaf and checkopt loops. see below.

Code:
@ device pic16F877A, HS_OSC, LVP_OFF, WDT_OFF
; @ Device pic16F877A, HS_OSC, BOD_OFF, PWRT_ON, WDT_ON, PROTECT_OFF
		
		
DEFINE OSC 20


;set ports to output
TRISA = %00000000
TRISB = %00000111
TRISC = %00000000
TRISD = %00000000

; analog portA direction
ADCON1 = 7
CMCON = 7


;constants
brake  Con  %00000011
stmot  con  %00000000
runmot con  %00000001

;variables
timeout  var byte

;initialization
portc = stmot



HomeStart:
       if portb.0 = 0 then
          portc = runmot
          goto checkleaf
       endif
       goto homestart
       
checkleaf:       
       if portb.1 = 0 then
          portc = brake
          pause 500
          portc = stmot
          goto checkopt
       endif
       goto checkleaf

checkopt:
      if portb.2 = 1 then
         portc = runmot
         goto checkleaf
      endif
         goto checkopt