I finally found out what was happening in my program causing it to work correctly on emulators but not my NROM hardware.
I do all my background updating and processing in the NMI, but I do several variable changing operations in subroutines in main when a button is pressed. There is an infinite polling loop in main and when the down button is pressed, I just to a subroutine and do a lot of variable changes. Well what was happening was that you would hold the downkey down and the downkey subroutine would execute several times before the next NMI, thus causing the NMI's background updates to jump ahead to strange spots, and skip certain flags, etc.
That was easily fixed by waiting for vblank at the beginning of each downkey subroutine. I am not sure why the emulators did not have this problem, but I am just stoked to have fixed it and to be able to work on collision detection again.