MCU nakonfigurujeme prostredníctvom poistiek procesora. Pomocou poistiek sa nastavia vnútorné
jednotky a módy, v ktorých má MCU pracovať. Taktiež konfiguračnými bitmi nastavujeme obmedzenie, či
prípadné vypnutie modulov, ktoré v procesoru nevyužívame, tak ako aj zabezpečenie čítania, prístupu k pamäti
vrátanie možnosti dolaďovania SW vybavenia MCU.
Konfiguračné bity umožňuje programátor PRESTO definovať priamo v užívateľskom rozhraní programu, avšak umožňuje bitovú konfiguráciu načítavať priamo z hex súboru. Pri spustení kompilátora sa zdrojový kód preloží do hex súboru, s ktorým programátor pracuje.
Popisovanie všetkých možných variácií by bolo možno na celý deň. K jednotlivým konfiguráciám sa počas vývoja zariadení a projektom vrátim a jednotlivé nastavenia budú vysvetlené na príkladoch.
Príklad použitia
main.c |
_CONFIG1 (WDTPS_PS1 & FWPSA_PR32 & WINDIS_OFF & FWDTEN_OFF)
_CONFIG2 (POSCMOD_NONE & I2C1SEL_PRI & IOL1WAY_OFF) _CONFIG3 (WPFP_WPFP0 & SOSCSEL_IO) _CONFIG4 (DSWDTPS_DSWDTPS3 & DSWDTOSC_LPRC) int main( void) { ... } |
Pri pohľade na horný kód asi väčšine zostane rozum stáť alebo sa s podobnou konfiguráciou nikdy nestretla.
Konfiguračné bity patria do kategórie špeciálnych funkcií, ale v podstate ide o konfiguračné registre procesora, ktorých konfigurácia sa vykoná ako prvá pred samotným naprogramovaním flash pamäte.
Všetke môžné konfigurácie týchto registrov sú popísané v datasheetov každého druhu MCU v sekcií špeciálnych funkcií.
Otázkou zostáva, či je možné pracovať s procesorom aj bez konfigurácie konfiguračných bitov...
Áno, dá... avšak, veľmi obmedzene!
Konfiguračné bity nám ovládajú jednotlivé moduly MCU - vlastnosti jednotlivých pinov, prepínanie režimov, vnútorných časovačov, ochrany čítanie flash a veľa iného.
Pri programovaní MCU, bez konfigurácie konfiguračných bitov, sme schopný písať aplikácie využívajúce primitívne operácie vstupno-výstupných jednotiek - blikače, prepínače, riadenie krokových motorov napr.. Pri písaní kódu pre zariadenia v režime OTG, zariadenia využívajúce rôzne druhy oscilácie a rôzne režimy prenosu po zberniciach, by sme neuspeli.
Ako je z kódu zrejmé, konfiguračné bity alebo inak nazývané poistky, sa rozdeľujú do štyroch konfiguračných sekcií, nazývaných konfiguračné slová.
Nastavenie jedlotlivých bitov vykonávame prostredníctvom "_", napríklad názov-bit_.nastavenie.
Príklad:
názov_ON - poistku povolíme
názov_OFF - poistku zakážeme
názov_1 - nastavíme poistke hodnotu 1
názov_2 - nastavíme poistke hodnotu 2
Môžme použiť len hodnoty, ktoré umožňuje povoliť/nastaviť MCU.
Pri jednoduchosť si jednotlivé hodnoty zobrazíme v software UP programátora PRESTO.
*Aby sme vedeli s poistkami pracovať, vysvetlím ich popis, fungovanie a z nich vytvorím ucelený celok, o ktorý sa budeme neskôr odrážať a budeme ho používať.
Poistky označené "_x" sú poistky, ktorých nastavenia sa budú s najväčšou pravdepodobnosťou meniť pri rôznych zapojeniach a ich hodnota môže byť jedna z uvedených pri ich popise.
Ostatná konfigurácia je defaultná, doporučená alebo je nastavená v smere najväčšej flexibility MCU.
_CONFIG1 ( )
konfiguračnými bitmi v tejto sekcií nastavujeme moduly prístupu ku naprogramovanému kódu v
pamäti MCU - Code Protection, Debug Mode, nastavenia modulu Watch Dog Timer, nastavenia programovacích pinov pri programovaní cez ISP.
Watch Dog Timer
Ide o bezpečnostný časovací režim, ktorý MCU podporuje pri zložitých a presných systémoch. Princíp tochto režimu spočíva na časovacích razítkach.
V príkladu, predstavme si, že máme sofistikovanú bezpečnostnú ústredňu, ktorá beží v našej firme. Firma je 50 km. od nášho bytu a o tretej ráno dôjde ku zlyhaniu overenia prístupu pri 4. monitorovacom čidle - teda, dôjde ku zlyhaniu transakčného požiadavku na štvrtom monitorovacom bode...chyba môže byť spôsobená nízkou teplotou a pohybové čidlo nereaguje. Systém pri čidle zlyháva a povedzme, že zlyhanie čidla (neoverenie stavu) nedovoľuje čidlo preskočiť.
Systém zostane v pohotovosti na čidle, ktoré neodpovedá - buť je stav detekovaný ako kritický a systém vyhlási planý poplach alebo systém neurobí nič a do nášho manuálného resetu zostane v zamrznutom stave - ráno je celá firma vybielená.
Watch Dog je časovač, ktorý MCU v určitých intervaloch resetuje. Watch Dog je monitorovaný vnútornými jednotkami MCU. Pokiaľ dôjde k chybe, či už spôsobenou SW, alebo HW, tak sa časovač neresetuje.
Viacvrstvové riešenie MCU tento fakt nezávisle detekuje a na danú akciu vyvolá definovanú reakciu. "Pokiaľ dôjde ku neodpovedaní čidla, vytvor príznak, odpoj/zapoj napájanie na čidlách/sleduj hodnoty termostatu/... a resetuj sledovaciu slučku".
Nastavenia systému "watch dog" nastavujeme pri systémoch, u ktorých potrebujeme určitý režim sebestačnosti a ráta sa s tým, že kedykoľvek pri chybe nie sú v dosahu osoby, ktoré by systém manuálne resetovali.
Pri bežných systémoch tieto konfigurácie nepovoľujeme.
Code Protection
Nám umožňuje určitú bezpečnosť a ochranu kódu vo flash pamäti.
Podporuje zákaz preprogramovania MCU - zápis do flash, načítanie kódu z MCU.
Pri bežnom písaní tieto možnosti nevyužijeme.
Debugging Module
Toto nastavenie JTAGEN, pokiaľ je povolené, nám poskytuje prístup (zadné vrátka), na čip MCU pri bežaní programu, vo vnútri MCU, v reálnom čase.
Prostredníctvom tochto nastavenia, môžme sledovať kód a jeho chyby v reálnom čase.
Toto nastavenie nie je podporované u každého typu.
Nevyužívame ho.
Set ISP Pins
Touto konfiguráciou nastavujeme MCU piny, ktoré využívame pri ISP programovaní.
Podľa článku >> Programovanie << budeme využívať rozhranie ISP pre piny PGED/PGEC 3
konfigurácia _CONFIG1 () |
_CONFIG1(
FWDTEN_OFF // Watch Dog Timer (WDT) - zatial nepovolujeme & WINDIS_OFF // WDT je v rezime Non-Windows - je mozne ho povolit pri spustenom WDT & FWPSA_PR32 // WDT pre-scale 1:32 - nastavenie je aktualne pri zapnutom WDT & WDTPS_PS1 // WDT post-scale 1:1 - nastavenie je aktualne pri zapnutom WDT & ICS_PGx3 // Nastavenie ISP konektoru na piny PGEC/PGED 3 & GWRP_OFF // Write Protect (ochrana proti zápisu) - nepovolujeme & GCP_OFF // Code Protect (ochrana kódu proti čitaniu kódu) - nepovolujeme & JTAGEN_OFF // Debugging Mode (prístup k čipu za behu) - nepovolujeme )
|
_CONFIG2 ( )
Konfigurácia tejto sekcie je z princípu riadenia MCU najdôležitejšia.
Nastavujeme ňou Primárny Oscilátor, druhy oscilácie, hodinový prepínací režim, druh vybraného oscilátora, nastavenie frekvencie, ale aj IOLOCK Protection či IESO mode alebo nastavenia I2C1 pinov.
Nastavenie Oscilátorov a frekvencie
Výber oscilátoru a jeho frekvencie je dôležitým krokom pri komunikačnom rozhraní medzi MCU a iným zariadením po zberniciach.
MCU povoľuje použiť integrovaný interný oscilátor alebo externý tak, ako aj priviesť hodinové impulzy ako output na výstup MCU a riadiť nimi iné zariadenie.
Umožňuje výber druhu oscilátora a nastaviť vnútornu frekvenciu oscilácie.
Zlým výberom či nastavením tejto sekcie dochádza ku problémom komunikácií, napríklad na USB rozhraní.
POSCMOD - poistkou (Primary OSCilator MODe) nastavujeme režim primárneho oscilátora.
Režim primárneho oscilátora rozumieme rozsah frekvencie pripojeného externého oscilátora na pinoch OSCI, OSCO.
Môže byť úplne vypnutý (používame interný oscilátor), alebo mať nastavenú jednu z hodnôt: HS, XT, EC.
Režim primárneho oscilátora nastavujeme v prípade, že napájame externý oscilátor.
OSCIOFNC - táto poistka nadviazuje na poistku POSCMOD. Pokiaľ zvolíme režim primárneho oscilátora, tak externý oscilátor napojíme na piny OSCI, OSCO. Tieto piny sú v nastavení ako Oscilator Input - Oscilator Output. Ak však používame interný oscilátor, povolením tejto poistky OSCIOFNC_ON sa nám bude pin OSCO - RA3 správať ako klasický I/O port 3, registra PORTA. V opačnom prípade, bude port RA3 ako I/O neaktívny.
Túto poistku povoľujeme v prípade nepovolenia poistky POSCMOD
FNOSC - nastavuje vlastnosti primárneho oscilátora. Môže nadobúdať hodnoty, napríklad: FRCPPL (Fast RC Osc with PLL), FRC (Fast RC Osc), prípadne PRI (Primary Osc).
FRCPPL sa používa pri USB rozhraniach, FRC u klasických zariadeniach, PRI sa používa pri zapojení primárneho oscilátora v niektorom z režimoch POSCMOD - (XT, HS, EC).
PLLDIV - nastavujeme frekvenciu vnútorného oscilátora momocou delenia. PLLSDIV_NODIV je najnižšou frekvenciou 4MHz a využíva sa pri USB rozhraní.
Možnosti delenia a výslednej frekvencie je bližšie popísané v článku >>Časovania<<
PLL96MHZ - Phase Pock Poop je slučka fázovej synchronizácie, ktorá umožňuje procesory architektúry mips niekoľko-násobne zrýchliť. Zväčší sa počet spracovaných inštrukcií za jednotku času - 1s.
Táto možnosť použitia PPL sa zavádza v prípadoch, kedy chceme MCU nastaviť do vysokorýchlostného módu.
Povoľujeme ju pri použití, napríklad USB.
Poistka PLL96MHZ poskytuje dva režimy:
ON (režim PPL je spustený vždy aicky pri štarte MCU). MCU je v režime PPL stále - nastavujeme pri zariadeniach, ktoré vždy od spustenia na pozadí komunikujú, napr. prostredníctvom USB.
OFF (režim PPL je spustený manuálne softwarovo). MCU je v režime PPL len v niektorých prípadoch - nevyžadujeme, aby bol MCU v tomto režime stále. Použijeme ho napríklad pri zariadeniach, ktoré len niekedy (nie vždy), komunikujú prostredníctvom, napr. USB. Spustenie PPL sa vykoná prostredníctvom PPL bitu: CLKDIVbits.PLLEN = 1;
FCKSM - umožnuje nám prepínanie medzi viacerými hodinovými zdrojmi a monitorovanie hodinových zdrojov.
FCKSM môžme defaultne nastavovať ako FCKSM_CSDCMD
IOL1WAY - umožňuje viacnásobnú rekonfiguráciu I/O pinov. Defaultne je táto konfigurácia u MCU zakázaná hodnotou ON, preto ju budeme povoľovať hodnotou OFF.
IESO - (Internal External Switch Over) pri hodnote ON povoľuje dvoj-rýchlostný štart oscilátora (Two-Speed Oscillator startup).
Tento konfiguračný byt budeme povoľovať.
I2C1SEL - umožňuje premapovať piny pre I2C1 zbernicu.
U defaultného nastavenia (primárneho) I2C1SEL_PRI sú piny SCL1/SDA1 namapované na pinoch 17-18 (RB8, RB9). Premapovanie ich nastaví na piny 14-15 (RB5, RB6).
konfigurácia _CONFIG2 () |
_CONFIG2(
POSCMOD_x & IOL1WAY_OFF & OSCIOFNC_x & FCKSM_CSDCMD //Prepinanie hodinovych zdrojov je povolene, monitor zdrojov je vypnuty & FNOSC_x & PLL96MHZ_x & PLLDIV_x & IESO_ON //Rezim Two-Speed je povoleny & I2C1SEL_PRI //Zbernica ma defaultne nastavene piny )
|
_Config3 ( )
Touto konfiguráciou nastavujeme hlbšiu úroveň ochrany kódu - ochrana konfiguračného slova, segmentovanie ochranného kódu, ochrana zápisu do pamäte, nastavenie napäťového regulátoru, nastavenie sekundárneho oscilátoru.
Nastavenie Oscilátoru II
MCU umožňuje okrem primárneho oscilátora zapojenie sekundárneho oscilátora na
piny SOSCI/SOSCO - (RB4, RA4).
V prípade, že sekundárny oscilátor nezapojíme, tieto piny nastavíme ako piny I/O hodnotou SOSCSEL_IO.
konfigurácia _CONFIG3 () |
_CONFIG3(
SOSCSEL_IO //Piny sekundarneho oscilátoru sú ako I/O & WPFP_WPFP0 //Flash Write Protect - zapis do flash pamäte je obmedzený & WPDIS_WPDIS //Segmentovanie ochranneho kodu - zakazane & WPCFG_WPCFGDIS //Konfiguracne slovo je nechranene & WPEND_WPENDMEM) //Ochrana zapisu z WPFP do poslednej pametovej stranky & WUTSEL_LEG //Nastaveny napätovy regulator )
|
_Config4 ( )
V tejto konfigurácií konfigurujeme súčasti Watch Dog Timer (WDT) a nastavenia referenčného oscilátora.
RTCOSC - definuje nastavenie RTC referenčného oscilátora.
Môže nadobúdať hodnoty LPRC (Low Power RC), nastavuje referenčný oscilátor ako nízko-vykonový oscilátor RC, a SOSC, ktorá nastavuje ako referenčný oscilátor sekundárny oscilátor. Hodnota RTCOSC_SOSC sa využíva v prípade, že máme zapojený sekundárny oscilátor.
konfigurácia _CONFIG4 () |
_CONFIG4(
DSWDTPS_DSWDTPS3 //Deep Sleep Watchdog - nastavenie Postscale 1:128 (132 ms) & DSWDTOSC_LPRC //DSWTO - nastavenie nizko-vykonoveho RC oscilatora & DSBOREN_OFF //Deep Sleep BrownOut - vypnuty & DSWDTEN_OFF //Deep Sleep Watchdog Timer - zakazany & RTCOSC_x )
|
Aby som konfiguráciu MCU neako skĺbil a zjednoduhšil dokopy, vytvorím hlavičkový súbor >>config_words.h<< určený pre naše projekty. Hlavičkový súbor sa bude includovať ako posledný v poradí a zaktivizuje potrebné funkcie na základe makier.
Pri jednoduchých projektov alebo projektov, ktoré nepotrebujú meniť nastavenia než tie, ktoré sú tu popísané v defaultnom stave, použije túto defaultnú konfiguráciu.