4章:PIC18F4553マイコンの初期設定コード

    作成2014.02.25

     PIC18F4553マイコンの初期設定コードについて調査したいと思います。

  1. #pragma config設定
    (1)#pragma config PLLDIV = 5
     #pragma config PLLDIV = 5と記述すると、ADDRESS 300000hに100が設定され、20MHzに設定されることになります。

    (2)#pragma config CPUDIV = OSC1_PLL2
    *#pragma config CPUDIV = OSC1_PLL2と記述すると「 主 発振 器 そのまま」「システム96MHzPLLソースを2 分 の 一 」

     
    (3)#pragma config USBDIV = 2 // Clock source from 96MHz PLL/2
    *#pragma config USBDIV = 2と記述するとADDRESS 300000hにbit5=1が設定され、USBのクロック 源を96 MHzを2分の1にするようです。

    (4)#pragma config FOSC = HSPLL_HS
    *#pragma config FOSC = HSPLL_HSと記述するとADDRESS 300001hにbit3=1bit2=1,bit1=1が設定され、外付け振動子利用の高速クロック発振で、PLLを 使 うようです。

    (5)#pragma config FCMEN = OFF
    *#pragma config FCMEN = OFFと記述するとADDRESS 300001hにbit6=0が設定され、フェイルセーフクロックモニターが無効になるようです。

    (6)#pragma config IESO = OFF
    *#pragma config IESO = OFFと記述するとADDRESS 300001hにbit7=0が設定され、発振 器 の 内部 外部 切 り 替 えをが無効になるようです。

    (7)#pragma config PWRT = OFF
    *#pragma config PWRT = OFFと記述するとADDRESS 300002hにbit0=0が設定され、電源オン時タイマーを使わないことになるようです。

    (8)#pragma config BOR = ON
    #pragma config BOR = ONと記述するとADDRESS=FD0hにbit0=0が設定され、ブラウンアウトリセット 機能 を使うことになるようです。

     
    (9)#pragma config BORV = 3
    *#pragma config BORV = 3と記述するとADDRESS 300002hにbit4=1bit3=1が設定され、最小電圧設定となる ようです。

    (10)#pragma config VREGEN = ON
    *#pragma config VREGEN = ONと記述するとADDRESS 300002hにbit5=1,bit3=1が設定され、USB電圧レギュレータが 有効になる ようです。

    (11)#pragma config WDT = OFF
    *#pragma config WDT = OFFと記述するとADDRESS 300003hにbit0=0が設定され、ウオッチドッグタイマを 無効 になる ようです。

    (12)#pragma config WDTPS = 32768
    *#pragma config WDTPS = 32768と記述するとADDRESS 300003hにbit1=1、bit2=1、bit3=1、bit3=1が設定され、ウォッチドッグタイマーのプリスケーラが1:32,768 になる ようです。

    (13)#pragma config MCLRE = ON
    *(13)#pragma config MCLRE = ONと記述するとADDRESS 300005hにbit7=1が設定され、MCLRを 有効 にしてRE3入力端子は 無効 になる ようです。

    (14)#pragma config LPT1OSC = OFF
    *#pragma config LPT1OSC = OFFと記述するとADDRESS 300005hにbit2=0が設定され、タイマー1 発振 器 を 高電力 モードになる ようです。

    (15)#pragma config PBADEN = OFF
    *#pragma config PBADEN = OFFと記述するとADDRESS 300005hにbit1=0が設定され、リセット 時 にPORTB0〜4をデジタル 入出力 に 選択 する ようです。

    (16)#pragma config CCP2MX = OFF
    *(16)#pragma config CCP2MX = OFFと記述するとADDRESS 300005hにbit0=0が設定され、CCP2の 入出力 をRB3にマルチプレックスしない ようです。

    (17)#pragma config STVREN = ON
    *#pragma config STVREN = ONと記述するとADDRESS 300006hにbit0=1が設定され、スタック満杯あるいはアンダーフロー時にリセットするようです。

    (18)#pragma config LVP = OFF
    *#pragma config LVP = OFFと記述するとADDRESS 300006hにbit2=0が設定され、ICSPモードでの単一書き込み電源は使 わないようです。

    (19)#pragma config ICPRT = OFF // Dedicated In-Circuit Debug/Programming = OFF
    *#pragma config ICPRT = OFFと記述するとADDRESS 300006hにbit5=0が設定され、Dedicated In-Circuit Debug/Programmingは使 わないようです。

    (20)#pragma config XINST = OFF // Extended Instruction Set = OFF
    *#pragma config XINST = OFFと記述するとADDRESS 300006hにbit6=0が設定され、拡張命令セットとインデックスアドレスは 使 わないようです。(旧モード使用)

    (21)#pragma config CP0 = OFF

    (22)#pragma config CP1 = OFF

    (23)#pragma config CP2 = OFF

    (24)#pragma config CP3 = OFF
    *Block 0〜3までコードを保護しない設定です。

    (25)#pragma config CPB = OFF
    * Boot block (000000-0007FFh)を保護しない設定です。

    (26)#pragma config CPD = OFF
    *Data EEPROMを保護しない設定です。

    (27)#pragma config WRT0 = OFF

    (28)#pragma config WRT1 = OFF

    (29)#pragma config WRT2 = OFF

    (30)#pragma config WRT3 = OFF

    (31)#pragma config WRTB = OFF // Boot Block Write Protection = OFF
    *Boot blockの書き込みを保護しない設定です。

    (31)#pragma config WRTC = OFF
    *Configuration registers (300000-3000FFh)の書き込みを保護しない設定です。

    (32)#pragma config WRTD = OFF
    *Data EEPROMの書き込みを保護しない設定です。

    (33)#pragma config EBTR0 = OFF

    (34)#pragma config EBTR1 = OFF

    (35)#pragma config EBTR2 = OFF

    (36)#pragma config EBTR3 = OFF
    * Block 0〜3まで他のブロックからのテーブル読み取りを保護しない


    (37)#pragma config EBTRB = OFF
    *Boot block (000000-0007FFh)を他のブロックからのテーブル読み取りを保護しない


    18F4553 Support Information

    #pragma config Usage

    #pragma config <setting>=<named value>

    For example:
    // System Clock Postscaler Selection bits: [Primary Oscillator Src: /2][96 MHz PLL Src: /3]
    // PLL Prescaler Selection bits: No prescale (4 MHz oscillator input drives PLL directly)
    // USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1): USB clock source comes directly from the primary oscillator block with no postscale
    #pragma config CPUDIV = OSC2_PLL3, PLLDIV = 1, USBDIV = 1

    #pragma config <setting>=<literal constant>

    For example:
    // System Clock Postscaler Selection bits: [Primary Oscillator Src: /2][96 MHz PLL Src: /3]
    // PLL Prescaler Selection bits: No prescale (4 MHz oscillator input drives PLL directly)
    // USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1): USB clock source comes directly from the primary oscillator block with no postscale
    #pragma config CPUDIV = 0x1, PLLDIV = 0x0, USBDIV = 0x0

    #pragma config <register>=<literal constant>

    For example:
    // System Clock Postscaler Selection bits: [Primary Oscillator Src: /2][96 MHz PLL Src: /3]
    // PLL Prescaler Selection bits: No prescale (4 MHz oscillator input drives PLL directly)
    // USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1): USB clock source comes directly from the primary oscillator block with no postscale
    #pragma config CONFIG1L = 0x8


    For example:
    // IDLOC @ 0x200000
    #pragma config IDLOC0 = 0xFF

    #pragma config Settings

    Register: CONFIG1L @ 0x300000

    CPUDIV =System Clock Postscaler Selection bits
    OSC2_PLL3[Primary Oscillator Src: /2][96 MHz PLL Src: /3]
    OSC4_PLL6[Primary Oscillator Src: /4][96 MHz PLL Src: /6]
    OSC3_PLL4[Primary Oscillator Src: /3][96 MHz PLL Src: /4]
    OSC1_PLL2[Primary Oscillator Src: /1][96 MHz PLL Src: /2]
    PLLDIV =PLL Prescaler Selection bits
    1No prescale (4 MHz oscillator input drives PLL directly)
    5Divide by 5 (20 MHz oscillator input)
    12Divide by 12 (48 MHz oscillator input)
    2Divide by 2 (8 MHz oscillator input)
    6Divide by 6 (24 MHz oscillator input)
    3Divide by 3 (12 MHz oscillator input)
    10Divide by 10 (40 MHz oscillator input)
    4Divide by 4 (16 MHz oscillator input)
    USBDIV =USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1)
    1USB clock source comes directly from the primary oscillator block with no postscale
    2USB clock source comes from the 96 MHz PLL divided by 2

    Register: CONFIG1H @ 0x300001

    IESO =Internal/External Oscillator Switchover bit
    OFFOscillator Switchover mode disabled
    ONOscillator Switchover mode enabled
    FOSC =Oscillator Selection bits
    INTOSC_ECInternal oscillator, CLKO function on RA6, EC used by USB (INTCKO)
    ECPLLIO_ECEC oscillator, PLL enabled, port function on RA6 (ECPIO)
    XT_XTXT oscillator (XT)
    INTOSC_HSInternal oscillator, HS oscillator used by USB (INTHS)
    ECPLL_ECEC oscillator, PLL enabled, CLKO function on RA6 (ECPLL)
    INTOSC_XTInternal oscillator, XT used by USB (INTXT)
    EC_ECEC oscillator, CLKO function on RA6 (EC)
    ECIO_ECEC oscillator, port function on RA6 (ECIO)
    XTPLL_XTXT oscillator, PLL enabled (XTPLL)
    HSPLL_HSHS oscillator, PLL enabled (HSPLL)
    HSHS oscillator (HS)
    INTOSCIO_ECInternal oscillator, port function on RA6, EC used by USB (INTIO)
    FCMEN =Fail-Safe Clock Monitor Enable bit
    OFFFail-Safe Clock Monitor disabled
    ONFail-Safe Clock Monitor enabled

    Register: CONFIG2L @ 0x300002

    VREGEN =USB Voltage Regulator Enable bit
    OFFUSB voltage regulator disabled
    ONUSB voltage regulator enabled
    BOR =Brown-out Reset Enable bits
    SOFTBrown-out Reset enabled and controlled by software (SBOREN is enabled)
    OFFBrown-out Reset disabled in hardware and software
    ONBrown-out Reset enabled in hardware only (SBOREN is disabled)
    ON_ACTIVEBrown-out Reset enabled in hardware only and disabled in Sleep mode (SBOREN is disabled)
    BORV =Brown-out Reset Voltage bits
    1
    2
    3Minimum setting
    0Maximum setting
    PWRT =Power-up Timer Enable bit
    OFFPWRT disabled
    ONPWRT enabled

    Register: CONFIG2H @ 0x300003

    WDTPS =Watchdog Timer Postscale Select bits
    81:8
    11:1
    327681:32768
    10241:1024
    21:2
    321:32
    161:16
    163841:16384
    1281:128
    40961:4096
    641:64
    81921:8192
    20481:2048
    5121:512
    2561:256
    41:4
    WDT =Watchdog Timer Enable bit
    OFFWDT disabled (control is placed on the SWDTEN bit)
    ONWDT enabled

    Register: CONFIG3H @ 0x300005

    CCP2MX =CCP2 MUX bit
    OFFCCP2 input/output is multiplexed with RB3
    ONCCP2 input/output is multiplexed with RC1
    PBADEN =PORTB A/D Enable bit
    OFFPORTB<4:0> pins are configured as digital I/O on Reset
    ONPORTB<4:0> pins are configured as analog input channels on Reset
    LPT1OSC =Low-Power Timer 1 Oscillator Enable bit
    OFFTimer1 configured for higher power operation
    ONTimer1 configured for low-power operation
    MCLRE =MCLR Pin Enable bit
    OFFRE3 input pin enabled; MCLR pin disabled
    ONMCLR pin enabled; RE3 input pin disabled

    Register: CONFIG4L @ 0x300006

    DEBUG =Background Debugger Enable bit
    OFFBackground debugger disabled, RB6 and RB7 configured as general purpose I/O pins
    ONBackground debugger enabled, RB6 and RB7 are dedicated to In-Circuit Debug
    STVREN =Stack Full/Underflow Reset Enable bit
    OFFStack full/underflow will not cause Reset
    ONStack full/underflow will cause Reset
    ICPRT =Dedicated In-Circuit Debug/Programming Port (ICPORT) Enable bit
    OFFICPORT disabled
    ONICPORT enabled
    XINST =Extended Instruction Set Enable bit
    OFFInstruction set extension and Indexed Addressing mode disabled (Legacy mode)
    ONInstruction set extension and Indexed Addressing mode enabled
    LVP =Single-Supply ICSP Enable bit
    OFFSingle-Supply ICSP disabled
    ONSingle-Supply ICSP enabled

    Register: CONFIG5L @ 0x300008

    CP0 =Code Protection bit
    OFFBlock 0 (000800-001FFFh) is not code-protected
    ONBlock 0 (000800-001FFFh) is code-protected
    CP1 =Code Protection bit
    OFFBlock 1 (002000-003FFFh) is not code-protected
    ONBlock 1 (002000-003FFFh) is code-protected
    CP2 =Code Protection bit
    OFFBlock 2 (004000-005FFFh) is not code-protected
    ONBlock 2 (004000-005FFFh) is code-protected
    CP3 =Code Protection bit
    OFFBlock 3 (006000-007FFFh) is not code-protected
    ONBlock 3 (006000-007FFFh) is code-protected

    Register: CONFIG5H @ 0x300009

    CPD =Data EEPROM Code Protection bit
    OFFData EEPROM is not code-protected
    ONData EEPROM is code-protected
    CPB =Boot Block Code Protection bit
    OFFBoot block (000000-0007FFh) is not code-protected
    ONBoot block (000000-0007FFh) is code-protected

    Register: CONFIG6L @ 0x30000A

    WRT0 =Write Protection bit
    OFFBlock 0 (000800-001FFFh) is not write-protected
    ONBlock 0 (000800-001FFFh) is write-protected
    WRT1 =Write Protection bit
    OFFBlock 1 (002000-003FFFh) is not write-protected
    ONBlock 1 (002000-003FFFh) is write-protected
    WRT2 =Write Protection bit
    OFFBlock 2 (004000-005FFFh) is not write-protected
    ONBlock 2 (004000-005FFFh) is write-protected
    WRT3 =Write Protection bit
    OFFBlock 3 (006000-007FFFh) is not write-protected
    ONBlock 3 (006000-007FFFh) is write-protected

    Register: CONFIG6H @ 0x30000B

    WRTB =Boot Block Write Protection bit
    OFFBoot block (000000-0007FFh) is not write-protected
    ONBoot block (000000-0007FFh) is write-protected
    WRTC =Configuration Register Write Protection bit
    OFFConfiguration registers (300000-3000FFh) are not write-protected
    ONConfiguration registers (300000-3000FFh) are write-protected
    WRTD =Data EEPROM Write Protection bit
    OFFData EEPROM is not write-protected
    ONData EEPROM is write-protected

    Register: CONFIG7L @ 0x30000C

    EBTR0 =Table Read Protection bit
    OFFBlock 0 (000800-001FFFh) is not protected from table reads executed in other blocks
    ONBlock 0 (000800-001FFFh) is protected from table reads executed in other blocks
    EBTR1 =Table Read Protection bit
    OFFBlock 1 (002000-003FFFh) is not protected from table reads executed in other blocks
    ONBlock 1 (002000-003FFFh) is protected from table reads executed in other blocks
    EBTR2 =Table Read Protection bit
    OFFBlock 2 (004000-005FFFh) is not protected from table reads executed in other blocks
    ONBlock 2 (004000-005FFFh) is protected from table reads executed in other blocks
    EBTR3 =Table Read Protection bit
    OFFBlock 3 (006000-007FFFh) is not protected from table reads executed in other blocks
    ONBlock 3 (006000-007FFFh) is protected from table reads executed in other blocks

    Register: CONFIG7H @ 0x30000D

    EBTRB =Boot Block Table Read Protection bit
    OFFBoot block (000000-0007FFh) is not protected from table reads executed in other blocks
    ONBoot block (000000-0007FFh) is protected from table reads executed in other blocks

    Register: IDLOC0 @ 0x200000

    Register: IDLOC1 @ 0x200001

    Register: IDLOC2 @ 0x200002

    Register: IDLOC3 @ 0x200003

    Register: IDLOC4 @ 0x200004

    Register: IDLOC5 @ 0x200005

    Register: IDLOC6 @ 0x200006

    Register: IDLOC7 @ 0x200007



  2. 初期設定
    (1)ADCON1 = 0b00001111;
    REGISTER 21-2: ADCON1:(BYTE ADDRESS FC1h):bit0,bit1,bit2,bit3
    bit設定AN12AN11AN10AN9AN8AN7AN6AN5AN4AN3AN2AN1AN0
    0000AAAAAAAAAAAAA
    0001AAAAAAAAAAAAA
    0010AAAAAAAAAAAAA
    0011DAAAAAAAAAAAA
    0100DDAAAAAAAAAAA
    0101DDDAAAAAAAAAA
    0110DDDDAAAAAAAAA
    0111DDDDDAAAAAAAA
    1000DDDDDDAAAAAAA
    1001DDDDDDDAAAAAA
    1010DDDDDDDDAAAAA
    1011DDDDDDDDDAAAA
    1100DDDDDDDDDDAAA
    1101DDDDDDDDDDDAA
    1110DDDDDDDDDDDDA
    1111DDDDDDDDDDDDD

    REGISTER 21-2: ADCON1::(BYTE ADDRESS FC1h):bit4
    VCFG0: Voltage Reference Configuration bit (VREF+ source)
    1 = VREF+ (AN3)
    0 = VDD

    REGISTER 21-2: ADCON1::(BYTE ADDRESS FC1h):bit5
    VCFG1: Voltage Reference Configuration bit (VREF- source)
    1 = VREF- (AN2)
    0 = VSS

    *全チャンネルがデジタルに設定され、VDDとVSSが選択されます。

    (2)TRISA =0b00000000;
    TRISA:(BYTE ADDRESS F92h):bit0〜bit6
    TRISA register controls the data direction of thecomparator pins for each mode.
    *ポートA:0=出力:1=入力:全て出力に設定

    (3)TRISB =0b00000000;
    TRISA:(BYTE ADDRESS F93h):bit0〜bit7
    *ポートB:0=出力:1=入力:全て出力に設定

    (4)TRISC =0b00110000; //D-,D+(USB用)
    TRISC:(BYTE ADDRESS F94h):bit0〜bit7
    *ポートC:0=出力:1=入力:RC4とRC5を入力に設定

    (5)TRISD =0b00000000;
    TRISD:(BYTE ADDRESS F95h):bit0〜bit7
    *ポートD:0=出力:1=入力:全て出力に設定

    (6)TRISE = 0b00000011; //SW1,2=INPUT LED=OUTPUT
    TRISE:(BYTE ADDRESS F96h):bit0〜bit7
    *ポートE:0=出力:1=入力:RE0とRE1を入力に設定

    (7) LATA =0b00000000;
    LATA:(BYTE ADDRESS F89h):bit0〜bit6
    LAT register (output latch)

    (8)LATB =0b00000000;
    LATB:(BYTE ADDRESS F8Ah):bit0〜bit7

    (9)LATC =0b00000000;
    LATC:(BYTE ADDRESS F8Bh):bit0〜bit2,bit6,bit7

    (10) LATD =0b00000000;
    LATD:(BYTE ADDRESS F8Ch):bit0〜bit7

    (11) LATE =0b00000000;
    LATE:(BYTE ADDRESS F8Dh):bit0〜bit2
    *全てのポートでoutput latchには0をセットしているようです。


  3. プリプロッセッサ#define
     プリプロッセッサとは、コンパイルの前に前処理を行うプログラムのことです。
    (1)#define _XTAL_FREQ 48000000 //__delay_ms
    *#include
    *プリプロセッサシンボル_XTAL_FREQはシステムが使用する発振周波数と同じである必要があります。「システム96MHzPLLソースを2 分 の 一 」
    *マクロ__ delay_ms(x)と__ delay_us(x)は時間ベースの遅れをみたすために設けられている。

    (2)#define SW1 PORTEbits.RE0//SW1にPORTEbits.RE0を設定
    (3)#define SW2 PORTEbits.RE1//SW2にPORTEbits.RE1を設定
    (4)#define LED PORTEbits.RE2//LEDにPORTEbits.RE2を設定


  4. SPECIAL FUNCTION REGISTERとconfiguration memoryのアドレス
    (1)SPECIAL FUNCTION REGISTERのアドレス:F60h〜FFFh
    (2)configuration memoryのアドレス:300000h-3FFFFFh(300000h〜30000Dhと3FFFFEh〜3FFFFFh)使用
    *SPECIAL FUNCTION REGISTERのアドレス領域が不足してconfiguration memoryのアドレスが追加されたと思われます。
    *非常に多くの設定があり、これらを完全に理解するのは大変です。


  5. 初期設定の検討
    (1)非常に多くの設定があり、これらを完全に理解するのは大変です。
    (2)動作するサンプルプログラムの初期設定をそのままコピーするのが効率的です。
    (3)一部の設定は理解可能ですので、理解可能な設定は、使用目的に応じて変更するのが良いと思います。
    (4)(19)#pragma config ICPRT = OFF // Dedicated In-Circuit Debug/Programming = OFFの設定をONにすると In-Circuit Debugが可能になるのか?
     試してみると、デバッグ機能が動作しなくなります。#pragma config ICPRT= OFFですとデバッグ機能が動作します。In-Circuit Debugが使えた方が便利と思いますが?良くわかりません。
    (5)使用目的によっては、初期設定の変更が必要になると思いますが、変更は慎重に行う必要があるようです。
    (6)PICマイコンの種類が異なれば、当然初期設定の変更が必要となりますが、厄介な作業になりそうです。


  6. 今後の予定
    (1)PIC18F4553マイコンは複雑な機能を持つため、入門用としては難しすぎる。
    (2)まずは比較的簡単な「新PIC入門・C言語編」(ADWIN)を学習したいと思います。
    (3)PIC18F4553マイコンは「新PIC入門・C言語編」(ADWIN)を学習後再トライしたいと思います。











5章:my_BinaryCounterに行く。

トップページに戻る。