Auf die Falle mit PORTx und LATx bin ich genauso reingefallen.
Die Erklärung ist leider nicht ganz einfach zu verstehen bzw. zu Beschreiben:
Das Problem liegt bei den "Read Modify Write" Befehlen.
Die ersten PICs hatten lediglich PORTx
Beim Zugriff auf PORTx wird der gerade aktuelle Pegel der Portpins
gelesen, NICHT das was vorher auf den Port geschrieben wurde.
Hier kann es passieren, daß man vorher ein beliebiges Ausgangsbit auf
High gesetzt hatte und beim Lesen ein Low zurückgeliefert wird.
Dies passiert z.B. dann, wenn der Ausgangspin stärker belastet wird.
Deshalb trennte man bei Microchip die "Inputs PORT"
von den "Outputs LAT".

Bei Bitbefehlen z.B. BSF PORTB,3 wird zunächst der GESAMTE Port,
also alle 8 Bits vom Prozessor gelesen, dann wird das Bit 3 gesetzt
und der komplette Port wieder zurückgeschrieben.
Unterliegt nun ein Ausgangsbit deines Ports einer stärkeren Belastung,
liest der Prozessor fälschlicherweise ein Low und beim Zurückschreiben
wird diese Bit dann ebenfalls fasch gesetzt.
Mit den getrennten Registern kann dies nicht mehr passieren.

mfg. Siro