При использовании внутреннего RC генератора необходимо использовать калибровочную константу для получения более точного значения частоты. Поэтому константа для каждого кристалла разная и записана на заводе в последней ячейке памяти: для 12C508 в ячейке 0x1FF, для 12C509 в 0x3FF. Но записана там не сама константа, а команда, заносящая эту константу во временный регистр WREG - MOVLW XX (где ХХ - калибровочная константа). При конфигурации с внутренним RC генератором выполнение программы начинается не с 0-го адреса, а с последнего, тоесть с этой самой команды, а только потом переходит на 0-ой. И вот, чтобы занести эту константу в нужный регистр OSCCAL, сама программа должна начинаться (по адресу 000) с команды MOVWF OSCCAL, которая переносит содержимое регистра WREG (калибровочную константу) в регистр OSCCAL. Конечно не принципиально, чтобы первой командой была именно MOVWF OSCCAL, это может быть и команда перехода, но только не команда, модифицирующая регистр WREG. Но такая команда обязательно должна быть.
При программировании однократных кристаллов в последнюю ячейку не должно ничего записываться, чтобы не нарушить команду и константу. При использовании отладочных кристаллов (с ультрафиолетовым стиранием) обязательно надо прочитать содержимое памяти и записать где-нибудь (лучше на самом корпусе) калибровочную константу. Потому, что при стирании сотрется и сама константа тоже. И в программе для отладочного кристалла должна быть записана команда MOVLW XX в последней ячейке. Например, так:
ORG 0x1FF ; это для 508, для 509 будет 0x3FF
MOVLW XX ; где ХХ - и есть прочитанная константа
Потом, при подготовки программы для однократного (OTP) кристалла эти строчки надо будет убрать (закомментировать).