Калибриране на INTOSC в PIC12F629 и PIC12F675
/kn34pc.com/конструкции/...

За непрецизни времеви отчети и функции мокроконтролерът PIC12F675/PIC12F629 разполага и с вътрешен RC генератор (INTOSC Internal Oscillator), който е фабрично калибриран до ±1% (UDD = 3.5V, 25°C). За точността отговаря последната клетка от флаш-паметта с адрес 0x3FF, където е записан калибрационен коефициент.

За конкретния мой екземпляр PIC12F675:
адрес 0x3FF -> калибрационен коефициент 0x344C.

Старшия байт винаги е 0x34.


При старт потребителската програма прочита съдържанието на клетката с адрес 0x3FF и със стойността й (младшия байт) зарежда регистър OSCCAL (Oscillator Calibration Register) с адрес 0x90 (в случая: OSCCAL = 0x4C), с което се коригира честотата на вътрешния клок. Стъпките на изменение са 64 [b7:b2] (двата най-младши бита не участват).

За конкретния PIC12F675 максималното изменение на честотата, което измерих на CLKOUT е:

При +UDD = 5V:
OSCCAL = 0x3400 -> Fintosc/4 = 815551 Hz
...
OSCCAL = 0x344C -> Fintosc/4 = 978338 Hz, factory calibrated
...
OSCCAL = 0x34FC -> Fintosc/4 = 1307916 Hz


Професионалните типове програматори (напр. PICKIT2/3), както и софтуерът им за поддръжка, предотвратяват случайното изтриване/модифициране на съдържанието на последната клетка, a някои типове поддържат автоматичното възстановяване на калибровъчния коефициент (PICKIT2).

В любителска среда, както често се случва, при невнимателно боравене при запис (и напр. с програматори тип JDM и с всевъзможния им софтуер за поддръжка) последната клетка от флаш-паметта бива затрита/променена, с което честотата се променя непредвидимо, с всички негативи за последващите събития от това изменение. Затова колеги съветват да се запише/архивира стойността на клетката някъде, преди каквато и да е манипулация с PIC12F629 / PIC12F675.

В миналото на първият ми използван МК PIC12F675 бях затрил последната клетка памет точно поради посочените причини. Следващите микроконтролери от този тип в кутийката вече си имат добавено листче хартийка с прилежно записана константа за евентуално бъдещо възстановяване .


Въпросната конструкция може да се използва за контрол и възстановяване на вече изгубен калибрационен коефициент, като предвид съществуването на многобройни подобни конструкции в интернет, целта ми е по-скоро да си изясня някои моменти от процесите за себе си. Използвам CCS за PIC.

pic12f6xx_osccal.zip [c,h,hex][3kb]

Два бутона управляват вътрешния генератор: FOSC- и FOSC+. За контрол на генераторната честота използвам изход CLKOUT (pin 3/GP4), като FCLKOUT = FOSC/4. Необходим е външен честотомер. Стъпката на изменение на честотата е голяма (64 стъпки: dF = 7..9 kHz), затова прецизността на показанията на честотомера не e определяща.

След получаване на максимално близко показание на честотата до 1000000 Hz, е необходимо да се натиснат двата бутона едновременно. OSCCAL се записва в нулевата клетка на EEPROM (адрес 0x00). Към нея да се добави 0x34. Напр. получено: 0x58 -> 0x3458, ръчен запис в последната клетка във флаш-паметта или за напр. PICKIT3 програматор и софтуер към него Tools -> ОSCCAL -> Set Manually -> OSCCAL value 3458 (hex).

Генераторната честота зависи от температурата и от приложеното захранващо напрежение. За конкретни приложения би било добре калибрирането да се извършва на работното напрежение (напр. UDD = 5V).

Свързването на схемата може да се изпълни и на експериментална платка, като монтажът дори върху пластмасовия breadboard е приложим. Така за операцията по калибрирането са необходими примерно 5 мин. Да не се пропуска свързване на филтриращ кондензатор 100..470 nF, разположен максимално близко до захранващите изводи (1 и 8) на микроконтролера!


Полезни препратки:
1. PIC12F629/675 Data Sheet, Microchip [pdf][1,4mb]
2. 12F675 OSCCAL Calibration
3. Internal Oscillator Recalibration Utility for PIC 12F629 & 12F675
 

LZ2WSG, KN34PC
1 януари 2023 година