No takze s tou konfiguraciou sa to ma takto.
Konfiguracne bity je mnozina bitov, ktore patra do FLASH pamati MCU. Tento kusok FLASH-ky nie je v priestore, z ktoreho sa da vykonavat program, ale v separatnom, ktory sluzi len na to, aby sa po resete MCU interna logika MCU “pozrela” na tieto hodnoty a podla toho nastavila to co treba - oscilator, BOR, WDT atd… Toto nastavenie je zakladnym nastavenim MCU, su to veci, ktore sa nemozu alebo nedaju menit programom - napriklad nastavenie oscilatoru.
Preto je treba tieto konfiguracne bity nejak specifikovat.
Najlepsie je to urobit tak, ze pri kompilacii zdrojoveho kodu bude mat assembler v zdrojovom kode aj toto nastavenie, toto sa uchova aj v binarnej podobe strojoveho kodu (.hex subor) a program na natiahnutie tejto binarnej podoby strojoveho kodu pri “vypalovani” do MCU rovno “vypali” aj konfiguracne bity.
Takze tolko pozadie problemu.
Pozrite sa do datasheetu PIC16F887. V kapitole 14.1, teda pokial mame ten isty datasheet, je uvedeny vyklad dvoch konfiguracnych slov, kazde ma 14 bitov - tak ako ma aj kazdy iny riadok FLASH pamate PIC16F.
Povedzme, ze chceme nastavit oscilator na typ INTOSC (vnutorny oscilator), WDT zakazat, PWRT povolit, MCLR nastavit ako externy reset a vsetko ostatne disablovat, resp. zakazat. Co znamena WDT, BOR atd je uvedene v datasheete a ak neviete, najprv sa pozrite tam.
Z toho vyplyva, ze je treba ako konfiguracne slovo 1 (CONFIG1) nastavit hodnotu 0bxx00000011100101 kde xx su nepodstatne hodnoty nepodsatnych bitov.
Bolo by dost nepohodlne specifikovat niekde v zdrojaku, aby assembler ulozit na tu a tu adresu toto konkretne slovo (0bxx00000011100101), hoci je to mozne. Assembler ponuka moznost zadat to trosku logickejsie - cez direktivu __CONFIG.
Tato dirketiva nerobi nic ine, nez len vezme argument a ulozi ho na spravnu adresu (adresu konfiguracneho slova).
Teda ked zadate __CONFIG CONFIG1, 0x0005 tak jednoducho do konfiguracneho slova CONFIG1 zada hondotu 0x0005 nech je to uz cokolvek.
Ak zadame __CONFIG _CONFIG1,0b0000000011100101 tak do CONFIG1 da hodnotu, ktora zodpoveda nasim nastaveniam tak, ako som ich specifikoval predtym.
Na zaciatku Vasho zdrojoveho kodu mate iste napisane #include “p16F887.inc” alebo nieco velmi podobne.
Je zahodno pozriet sa do tohto suboru. Pokial mate MPLAB instalovany tam kde sa ponuka, tak je ten subor tu C:\Program Files\Microchip\MPASM Suite a vola sa p16F887.inc.
Su v nom vsetky definicie, s ktorymi pracuje assembler. Pretoze on v zasade netusi, co znamena MOVWF PORTA, pretoze PORTA nie je ani nazov instrukcie, ani navestie ani nic podobne. Jedine z tohto suboru vycita, ze PORTA je to iste ako 0x0005, takze assembler to cele pochopi ako MOVWF 5 a je spokojny.
Na konci tohto suboru su vyznamy mnemonickych kodov pre konfiguracne bity. Napriklad _XT_OSC je H’3FF9’ (hexadecimalna hodnota) alebo _BOR_OFF je H’3CFF’.
Ak vyrobite logicky sucin (AND, znacka &, priklad 0x07 & 0x0E = 0x06) tychto dvoch hodnot, dostanete hodnotu konfiguracneho slova, ktore zodpoveda nastavenemu XT oscilatoru a vypnutemu BOD, s ostatnymi bitmi nastavenymi do hodonty 1.
Teda ak si dame dokopy
_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF, mali by sme dostat hodnotu 0bxx00000011100101. Nekontroloval som to, ale malo by to byt tak 
Cize ked napisete
__CONFIG _CONFIG1, _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
date dokopy dve veci, ktore som Vam vysvetlil uz predtym.
Takze, vzdy ked mam ist robit projekt, tak
1, si vezmem ceruzku a papier, otvorim si datasheet na konfiguracnych bitoch a podla datasheetu vypisem si hodnotu kazdeho jedneho parametra, ktory chcem nastavit.
Napriklad,
oscilator - vnutorny, RA6 a RA7 su IO piny (INTOSCIO)
WDT - vypnuty (OFF)
PWRT - zapnuty (ON)
…
…
2, vedla toho si vypisem mnemonicke kody konfiguracnych bitov podla .inc suboru, napriklad p16F887.inc
_INTRC_OSC_NOCLKOUT
_WDT_OFF
_PWRTE_ON
…
3, dam to vsetko dokopy
__CONFIG _CONFIG1, _INTRC_OSC_NOCLKOUT & _WDT_OFF & … …
V kroku 2 predpokladam, ze je zrejme, ze INTOSCIO je to, co je v .inc suobre pomenovane ako _INTRC_OSC_NOCLKOUT. Chce to trosku intuicie.
4, skuska spravnosti: stlacim F10, cim prebehne build. Ak nie je v zdrojaku nikde chyba, teda vysledok je BUILD SUCCEDED, tak idem na MPLAB -> Configure -> Configuration bits a vidim, ze v tomto okne si mozem overit spravnost svojho nastavenia.
Poznamka: configuracne bity sa v danom okienku nenastavia, ak neprebehne spravne assembler - teda ak je chyba niekde inde, alebo v konfiguracii samotnej, tak sa hodnoty neupdatuju.
Toto je najjednoduchsi zdrojak s kompletnou inicializaciou konfiguracneho slova CONFIG1
#include "p16F887.inc"
__CONFIG _CONFIG1,_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
nop
end
Ak vidite, nerobi to nic, iba ze to assembler “pozuje”.
Skuste si to zassemblovat a pozriet sa na okno konfiguracnych bitov.
Viac napovedy ku knofiguracnym slovam najdete na MPLAB -> Help -> Topics -> MPASM assembler -> Search a zadajte do hladania “__CONFIG”.
Domaca uloha:
1, Pochopte a dorobte konfiguraciu pre CONFIG2 PIC16F887
2, Najdite PIC, ktore ma len jedno konfiguracne slovo, skuste si urobit jednoduchy zdrojak pre taketo PIC s jeho konfiguraciou. Staci taky ako som tu ukazal ja, len konfiguracia, nop a end.
=============================================
EDIT:
Este k tym konfigurakom.
Ak pracujete len v MBLAB-e, teda mate napriklad PicKit2, ktory pouzivate ako programator, resp. debugger priamo z MPLAB-u (teda nie cez PicKit2 program), je mozna aj jednoduchsia cesta.
Ist na MPLAB -> Configure -> Configuration bits, odskrtnut volbu tu, ze su konfiguracne bity nastavene v zdrojovom kode a nastavit ich “rucne”.
Toto ma vsak jednu velku nevyhodu - toto nastavenie je len sucastou projektu, nie vsak .hex suboru.
Teda pokial programujete rovno PicKit-om z MPLAB-u. tak Vam to pojde, ale ak date niekomu .hex subor a on sa ho bude snazit napalit do svojho PIC akymkolvek programovadlom, tak tam nie konfiguracne bity nebudu obsiahnute.
Cize vy si to zjednodusite, ale takto je to principialne nie celkom spravne. Jediny “koser” sposob je ten komplikovanejsi, teda specifikovat konfiguracne bity cez __CONFIG direktivu v zdrojovom kode.