Moin,
Ich habe dein File mal eben im Simulator von MPLAB angesehen, das ist sehr seltsam, denn dort funktioniert dein Code eigentlich. Ich habe brakepoints an den Punkten gesetzt, wo die Variablen zugegriffen werden, d.h. wenn das AD-Ergebnis vorliegt, hab dann Werte in ADRESH geschrieben und diese wurden auch richtig an bright und time, und danach auch richtig an CCPR1L und PORTB übergeben.

Du versuchst das direkt in ner fertigen Schaltung oder? Schonmal geprüft, ob vielleicht eine Verbindung zwischen den Pins exisitiert, ne kleine Brücke aus nem Spritzer Zinn oder Stück Litze? Ein bischen Schwankung ist bei nem AD-Wandler normal, aber eigentlich sollte es auf jeden Fall auf das niedrigste Bit genaus ein.
Hast du einen Schaltplan, wenn du es in Hardware testest?
In welchem Wertebereich ändern sich die Ausgangswerte? Wie lässt du sie dir anzeigen?