Свежие обсуждения
Микроконтроллеры

Калибровочная константа

1 4

Проблема в следующем. Использую PIC с внутренним генератором. Когда прошивал сам, об этой калибровочной константе и знать ничего не знал. Потом потребовалось большое количество прошитых контроллеров, и я заказал прошивку в фирме, которая занимается их продажей, благо это стоит копейки. Переслал им hex, они прошили, приехал, купил. Решил проверить на всякий случай. Обнаружил отличия в самой последней ячейке. В моей прошивке там ничего нет, т. е. FFh, а в той, что сделали они, записано какое-то число. Позвонил им, сказали, что это калибровочная константа внутреннего генератора, которая закладывается еще на заводе.
Выходит дело при самостоятельной прошивке я затираю эту константу и мой генератор выдает частоту не с той точностью, которую можно было бы иметь? И однажды затерев ее, я теряю ее навсегда?
Отсюда вопрос, как осуществлять прошивку, чтобы эта константа работала?

 

По-моему эта константа должна располагаться в специальной области, не доступной, для памяти программ.

 

Я тоже так думал, что все это автоматом должно работать, а что же тогда записано в этой самой последней ячейке, о чем я написал выше? Причем в каждом прошитом МК эти цифры разные.

 

Укажите конкретно тип МК.

 

picmaniac: Укажите конкретно тип МК.
PIC16F630

 

п.2.2.2.7, п.9.2.5 даташита

 

Спасибо, прочитал. Правда не совсем понял.

bsf STATUS, RP0 ;Bank 1
call 3FFh ;Get the cal value
;Что такое подпрограмма 3FFh? Где она должна находиться? Где надо записывать RETLW XX? А потом, откуда я возьму ХХ? Или все это подразумевается, и мне достаточно написать call 3FFh, и дальше "голову не ломать"?
movwf OSCCAL ;Calibrate
bcf STATUS, RP0 ;Bank 0

Куда эти строчки вставлять? В инициализацию, или еще куда? А потом, я же ничего такого не писал, я в фирму давал только hex, asm не давал. Как же они смогли прошить тогда эту константу? И зачем?! Я ж не просил и по незнанию не ведал ничего о ней.

Erasing the device will also erase the preprogrammed internal calibration value for the internal oscillator. The calibration value must be saved prior to erasing part as specified in the PIC16F630/676 Programming specification.

Я так понял, что если я затер константу, то ее не восстановить? И ее надо предварительно сохранить? А где ее прочесть? И что за Programming specification? Это что, отдельный документ такой? На микрочипе искать? Поищу, почитаю.

 

call 3ffh - вызов подпрограммы по адресу 3ffh. Там калибровочная константа, вернее инструкция RETLW калибровочная константа. Их прошивают на заводе. Вставлять в инициализацию.
hex - файл это не bin - файл. В хексе пишется адрес и содержимое, то есть, если в хексе нет данных для адреса 3ffh, то нормальный программатор его не тронет. А совсем нормальный программатор - считает слово по адресу 3ffh, сотрёт м/сх, и запрограммирует прошивку и кал. константу. Видимо это и есть Programming specification

 

На заводе в последнюю ячейку памяти программ (адрес 3FFh) записывается команда:
retlw (значение калибровочной константы)
В самом начале программы следует перенести эту константу в регистр OSCCAL. Для этого и вызываем заводскую подпрограмму, расположенную по адресу 3FFh и состоящую из единственной команды retlw. Затем полученное число (заводское значение калибровочной константы) переносим в регистр OSCCAL. После этого контроллер "примет её к сведению".
Если стереть всю память программ на свежекупленном МК, то значение калибровочной константы будет потеряно. Поэтому следует сперва произвести чтение и сохранить где-либо прочитанное число.

Zandy: Выходит дело при самостоятельной прошивке я затираю эту константу и мой генератор выдает частоту не с той точностью, которую можно было бы иметь? И однажды затерев ее, я теряю ее навсегда?
Да. Поэтому фирмачи спрева прочитали память, сохранили эту константу, а затем при прошивке просто вернули её на место по адресу 3FFh. В программный код для этого лезть не нужно.

АНТОХА меня опередил.

 

Спасибо, понял и Programming specification прочитал.
AHTOXA: нормальный программатор его не тронет. А совсем нормальный программатор - считает слово по адресу 3ffh, сотрёт м/сх, и запрограммирует прошивку и кал. константу.
Вот именно, что нормальный программатор. А я пользуюсь icprog, и он видимо этого не умеет?
Теперь хочу уточнить. Беру новую микросхему, в asm вставляю строчки:

bsf STATUS, RP0 ;Bank 1
call 3FFh ;Get the cal value
movwf OSCCAL ;Calibrate
bcf STATUS, RP0 ;Bank 0

Ассемблирую, загружаю hex в icprog. Получаю калиброванный генератор (константа в OSCCAL прописывается?) или нет? Что будет при вторичной перепрошивке? Видимо уже потеряется, так?

picmaniac: Поэтому следует сперва произвести чтение и сохранить где-либо прочитанное число.
Если идти этим путем, то я должен сначала прочесть константу. icprog прочтет адрес 3FFh? Что там будет, код команды RETLW и само число ХХ?
А потом я просто должен:

bsf STATUS, RP0
movlw XX
movwf OSCCAL
bcf STATUS, RP0

Так?