Aaantonnn15 писал(а):Чего тут думать??? Даже если стереть калибровочную константу, то-есть превратить её в 00 или в FF, то в регистр запишется это значение. И частота генератора скорректируется на неё.
Да ладна...
Калибровочная константа записана в виде КОМАНДЫ retlw XX, где ХХ и есть та самая константа.
То есть записанный в последней ячейке флеша код будет 0x34XX, а если его стереть, то будет ox3FFF, что означает NOP.
И вызов этого адреса флеша приведет не к возврату константы в аккумулятор и адреса возврата из стека в программный счетчик, а переход к СЛЕДУЮЩЕМУ АДРЕСУ ФЛЕША. И этот адрес будет НУЛЕВЫМ. Сиречь контроллер перезапустится.
Чтобы этого не произошло, нужно либо записать ту же retlw с любой константой, либо не вызывать этот адрес флеша в программе.
Aaantonnn15 писал(а):OSCCAL - это вообще регистр! В который можно поместить значение от 00 до FF. При чем здесь перезапуск мк.
Да, это регистр. Причем СПЕЦИАЛЬНЫЙ регистр. То есть ЧАСТЬ ОПЕРАТИВНОЙ ПАМЯТИ контроллера, которая используется для управления самим МК. Спецрегистры при старте инициализируются определенными в даташите значениями, если не указано иное.
Так вот OSCCAL инициализируется по даташиту ВСЕГДА одной и той же величиной 0х80, то есть ЦЕНТРАЛЬНОЙ ЧАСТОТОЙ.
А вопрос калибровки отнесен к ПРОГРАММЕ, где с помощью команды вызова подпрограммы
call адресуется переход на ПОСЛЕДНЮЮ ячейку флеша, где ПРОИЗВОДИТЕЛЬ записал команду ВОЗВРАТА ИЗ ПОДПРОГРАММЫ С ОДНОВРЕМЕННОЙ записью константы в аккумулятор. Это и есть команда
retlw <константа>. И лишь ПОТОМ эта константа из аккумулятора попадает в регистр OSCCAL.
Код: Выделить всё
bsf STATUS, RP0 ;Bank 1
call 3FFh ;вызов программного адреса 3FF
movwf OSCCAL ; W->OSCCAL
bcf STATUS, RP0 ;Bank 0
...............
...............
...............
ORG 0x3FFF
retlw <constant> ; возврат по адресу следующему за вызовом с WREG=constant