18F26J50覚書

〔PICの動かせ方入門に戻る〕


忘れないうちにメモします。
ここでの記載はMPLAB X V2.15
MPLAB(R) XC8 C Compiler Version 1.32を使用しての内容です。
データシートはこちらです。18F46J50の英語だけどね

特徴:
・I2C/SPI/USARTは2回路有り、USB有り、RTCC(リアルタイムクロック)モジュール等が有る。
 (但し、18F2xJ50系統はSPIでSSP1/SSP2の2モジュール、I2CでSSP1の1モジュールとなります)
・周辺モジュールの入出力ピンはマッピング(PPS)をしないと使えない。
・周辺モジュール等の割り込みには、高低レベルの優先度が付けられる。
・EEPROM/HEFが無い。
・44ピンタイプには、通信周辺機器、液晶ディスプレイ、外部メモリデバイスと接続する為の
 8ビットインターフェイスモジュール(PMP)が有る。

電源電圧
電源電圧(VDD)は2.15V-3.6Vです。(因みに18LF26J50は2.0V-3.6V)
CORE自体の電圧(VDDCORE)は2.0V-2.75Vとなっています、ですのでVDDに2.75V-3.6Vを
使用する場合は内蔵レギュレータを使用(ON)
しないとダメです。
また、USB電源(VUSB)は3.0V-3.6Vを使用します。

内蔵レギュレータOFF
VDDCORE/VCAP端子をVDDに接続するとOFFです、この場合はVDDを2.15V-2.75Vに接続する
必要が有ります。

内蔵レギュレータON
VDDCORE/VCAP端子に、10uF/16V low-ESR capacitor を取付けVSSに落とすとONです。
但し、"18LF26J50"はレギュレータをONにしない様にと書いて有ります。

※ I2C1/SPI1/USART1等の通信用ピンは5.5Vトレラント入力になっています。

1番(リセット)ピンの使い方
Vpp
 PICチップにプログラムを書込む時の、書込み電圧を負荷するピンという意味なので、
 動作時には気にしなくて良い。

MCLR
 外部リセット信号を入力する場合のピンとして使用。
 リセット信号はLOW(0V:GND接続)でリセットが掛かります、だから
 外部リセットを使わない時は1K〜10KΩ抵抗を介してVddに接続しなければならない。
 又、MCLRピンにコンデンサーが接続されている場合に、PICKit3を接続するならコンデンサーを
 一旦取り外す(ジャンパーピン等で)方が良い様です。

発振回路(システムクロック)
PICに内蔵しているクロック周波数回路は4MHz/8MHz/16MHz/24MHz/48MHzを利用出来る。
内部クロックでの8MHz以上は、PLL回路を通す必要がある。
外部クロックは48MHzまでOKの様です。(外部クロックもPLL回路を通す事は可能)

また、USBクロック周波数はシステムクロックとは別で、48MHz(FullSpeed)/6MHz(LowSpeed)を使う、
尚、切替えはUCFGレジスターのFSENビット(1:48MHz 0:6MHz)で行う。

内部クロックを利用する場合(8MHz以下)
コンフィギュレーションを
 #pragma config OSC = INTOSC
にして
OSCCONレジスターにて使用する周波数を設定します。
 OSCCON = 0b01110011 ;
赤い数字部分を変更する事により周波数を変更できます。
赤い数字部分以外はそのまま使用する。
111 8MHz
110 4MHz
101 2MHz
100 1MHz
その他 500KHz/250KHz/125KHz/31KHz

内部クロックを利用する場合(8MHz以上)

16MHz/24MHz/48MHzを設定する場合は内部PLL回路を通す必要が有ります。
内部クロックでUSBを利用する場合は、ここの設定で48MHzとします。
コンフィギュレーションを
 #pragma config OSC = INTOSCPLL , PLLDIV = 2
 // PLL回路の周波数(48MHz)を分周する(以下の何れか)
 #pragma config CPUDIV = OSC1     // 48MHz/1 → 48MHz
 #pragma config CPUDIV = OSC2_PLL2  // 48MHz/2 → 24MHz
 #pragma config CPUDIV = OSC3_PLL3  // 48MHz/3 → 16MHz
にして
レジスターを
 PLLEN  = 1 ;   // クロックをPLLに通す(これで48MHzになります)
 OSCCON = 0b00000000 ;
に設定します。
外部クロック(プライマリ外部オシレータ)を利用する場合
コンフィギュレーションを
 #pragma config OSC = HS
 // 外部クロックを分周する(以下の何れか)
 #pragma config CPUDIV = OSC1     // osc/1
 #pragma config CPUDIV = OSC2_PLL2  // osc/2
 #pragma config CPUDIV = OSC3_PLL3  // osc/3
 #pragma config CPUDIV = OSC4_PLL6  // osc/6
にして
レジスターを
 PLLEN  = 0 ;   // クロックをPLLに通さない
 OSCCON = 0b00000000 ;
に設定します。
また、プライマリとは別にセカンダリ外部オシレータとして、 外付けの32.768 kHz 水晶振動子を駆動出来ます、って事はRTC(リアルタイムクロック)が実現出来そうですね。

コンフィギュレーション
#pragma config キーワード1 = 設定値 , キーワード2 = 設定値   の様に記述する。
#pragma config BOREN = NOSLP , BORV = 30 , PWRTEN = ON  // 記述の例

CONFIG1L
 WDTEN :ウォッチドッグタイマ使用許可
       ON = 有効 OFF = WDTCONレジスタで制御する(レジスタは無効がデフォルト)
 STVREN:スタックのアンダーフローやオーバが発生した時にリセットを行うかの設定
       ON = リセットする  OFF = リセットしない
 XINST  :拡張CPUの有効無効を設定
       有効(ON)にする場合はコンパイラが対応していないとダメです、通常はOFFです。
 PLLDIV :PLL回路へ入力する為の周波数のプレスケール値を設定
       (入力周波数は4/8/12/16/20/24/40/48MHzのみ、出力は4MHzに分周してPLLへ渡す)

CONFIG1H
 CPUDIV:システムクロックの分周を設定する(外部クロックとPLL回路のみ有効)
       (Osc/1,2,3,6と、USBへのクロック時はOsc/4,8)
 CP0   :プログラムメモリの保護
       ON = 保護する  OFF = 保護しない

CONFIG2L
 OSC   :オシレータ選択ビット
        INTOSC = 内部でRA6/7をI/Oで使用 INTOSCO = 内部でCLKOUT(RA6)/RA7(I/O)とする
        INTOSCPLL/INTOSCPLLO = 内部クロックをPLL回路に通して使用する
        HS = 外部からのクロックで高い振動子を使用する  HSPLL = 外部でPLL回路を通す
 T1DIG  :T1OSCENの実施ビット
        ON = セカンダリクロックを選択可能 OFF = T1OSCENで選択
 LPT1OSC:タイマー1オシレータを低消費電力で利用するのか設定を行う
        ON = 利用する(ノイズ等の影響を受けやすくなる)  OFF = 利用しない
 IESO   :内部オシレータで起動しその後外部オシレータで起動する2段階起動モードの使用許可
        ON = 有効にする  OFF = 無効にする
 FCMEN  :外部オシレータに障害が発生した場合に内部オシレータに切り替えるかモニターする
        ON = 有効にする  OFF = 無効にする

CONFIG2H
 WDTPS :ウォッチドッグタイマ有効時のタイマ値を設定する(設定値はデータシート参照)

CONFIG3L
 DSWDTOSC :ディープスリープウオッチドッグタイマーの基準クロック選択ビット
           INTOSCREF = INTRCを使用する  T1OSCREF = T1OSC/T1CKIを使用する
 RTCOSC   :RTCCの基準クロック選択ビット
           INTOSCREF = INTRCを使用する  T1OSCREF = T1OSC/T1CKIを使用する
 DSBOREN  :ディープスリープ電源電圧降下常時監視機能
           ON = ディープスリープ時に有効  OFF = 常に無効
 DSWDTEN  :ディープスリープウオッチドッグタイマーの使用有無を設定
           ON = 使用する OFF = 使用しない
 DSWDTPS  :ディープスリープウォッチドッグタイマ有効時のタイマ値を設定する
           (詳しい設定値はデータシート参照)

CONFIG3H
 IOL1WAY  :IOLOCKビット単方向セット イネーブルビット
          ON = IOLOCK ビットは、ロック解除シーケンスを実行後に一度のみセット出来る
          一度IOLOCK がセットされると、その後PPS は変更出来ない
          OFF= ロック解除シーケンスを実行すれば何度でもIOLOCKをセット/クリア出来る
 MSSP7B_EN:I2Cスレーブ時のアドレスマスクモードの選択ビット
          MSK5 = 5bitaddress masking mode  MSK7 =7bitaddress masking mode

CONFIG4L
 WPEND:書込み/消去の保護を行うFlashメモリの範囲を選択するビット
       PAGE_WPFP = WPFPのページを対象にする
       PAGE_0    = 0〜WPFPのページまでを対象にする
 WPFP :書込み/消去の保護を行うFlashメモリのページを設定(PAGE_0〜PAGE_63)
 WPCFG:WPEND/WPFPの指定場所は保護するだが、このビットで指定場所以外を保護と切替える
       ON  = WPEND/WPFPの指定場所は保護する
       OFF = WPEND/WPFPの指定場所は保護しない

CONFIG4H
 WPDIS:Flashメモリの書込み/消去のプロテクトをするしないの選択を行う
      ON = 保護する  OFF = 保護しない

その他の詳しい内容は [ C:\Program Files\Microchip\xc8\v1.32\docs\pic18_chipinfo.html ] の
ファイルを参照。

delay
delay関数を使用する場合は、
#define _XTAL_FREQ 4000000の行を追加するただしこれはクロックが4MHzの場合

__delay_us(197120) __delay_ms(197) クロック4MHzならこの値まで設定可能
ただし、( )の中は変数使用不可です、直接数値を入力、うんん...ちょっとぉいまいち!
197ms以上待たせたいなら、
for (i=0 ; i < 100 ; i++) __delay_ms(10) ; // 1秒待つ
という感じにします。

クロック 8MHz __delay_us(98560) __delay_ms(98)
クロック16MHz __delay_us(49280) __delay_ms(49)
クロック32MHz __delay_us(24640) __delay_ms(24)
クロック48MHz __delay_us(16426) __delay_ms(16)

I/Oポート
オープンドレイン制御
 通常ポート出力ピンは電流のソースとシンクが可能な標準のプッシュプルドライバですが、
 ODCON?レジスタの各ピンに該当するビットをONにすると、その対応するポート出力は電流のシンク
 のみ可能なオープンドレインドライバとなります。(ECCP/USART/SPI機能が対象)

PPS機能(PERIPHERAL PIN SELECT MODULE)
周辺モジュールの入出力を好きなピン(RP0〜RP18)に割り当てる事が出来る機能です、
割り当てを変更できるのはデジタル信号のみで、アナログ入出力の割り当ては変更できません。
また、不用意に割り当てが変更出来ない様にロックする事が可能な様だが....試していません。
尚、このPICは電源が3.3Vですが、5.5Vトレラント端子に割当てれば5Vデバイスとの通信が可能です。

18F26J50ピン概要(PPS)

周辺モジュールの入力
INT1/2/3 T0CKI/T3CKI CCP1/2 T1G/T3G USART2(RX2/CK2) MSSP2(SDI2/SCK2/SS2) FLT0
の周辺機器を使う場合は、RPINRxレジスタにRP0-RP18ピンのどれかを割り振らないとダメです。
例えば、RP1の3番ピンに割込みINT1を割付ける場合は、
INT1のレジスタ名がRPINR1ですので、RPINR1 = 1(RP1)となります。

周辺モジュールの出力
C1OUT/C2OUT USART2(TX2/DT2) MSSP2(SDO2/SCK2/SSDMA) ULPOUT CCP1/2 P1A/B/C/D
P2A/B/C/D の周辺機器を使う場合は、
RPORxレジスタに周辺機器番号(0-21)を設定します。
例えば、CCP1(PWM)出力をRP2の7番ピンに割付ける場合は、
RP2ピンのレジスタ名がRPOR2で、CCP1の機能番号が14、よって RPOR2 = 14 となります。

詳しくはデータシートを参照して下さい。

上記の周辺モジュールを使用する場合は必ず割り付けないと動作しません

ECCP1/2機能[拡張型CCP機能]
ECCP1/2の機能としてキャプチャ・コンペアとPWM機能が有ります。
PWM機能には更に、フルブリッジPWM機能・ハーフブリッジPWM機能・シングルPWM機能が有ります。
シングルPWM機能の使い方については18F14K50での説明ですが、こちらを参考にして下さい。

キャプチャ・コンペア機能では、タイマー1かタイマー3を使用します。
PWM機能にはタイマー2かタイマー4を使用します。
ですのでどのタイマーを利用するかレジスターで指定する必要が有ります。

TCLKCONの設定
  TCLKCON = 0b00000000 ;
  赤色数字部分で指定します。
   00:ECCP1/2=Timer1(Capture/Compare) Timer2(PWM)
   10:ECCP1/2=Timer3(Capture/Compare) Timer4(PWM)
   01:ECCP1=Timer1(Capture/Compare) Timer2(PWM)
      ECCP2=Timer3(Capture/Compare) Timer4(PWM)

※ キャプチャ・コンペア機能時のCCP1/2入力ピンは割り付け(マッピング)をRPINR7/8レジスターにて
  行う必要が有ります。
※ CCP1(P1A)/P1B/C/D と CCP2(P2A)/P2B/C/D の出力ピンもRPOR14-RPOR21レジスターにて
  設定を行う必要があります。

TIMER0
このタイマは8/16 ビットの切り替えが出来るタイマです。
外部クロックと内部クロック(Fosc/4)が選択できます。
16 ビット動作時に、TMR0L/TMR0Hへ書込む場合はTMR0HをセットしてからTMR0Lをセットする。
また、読込み時はTMR0Lを読込んでからTMR0Hを読み込む必要がある。

尚、タイマー0はカウント値がオバーフロー時にタイマー1/3のゲート制御へ信号を送る事も出来ます。

詳しい設定や概要は18F25K22での記事ですが、こちらを参考にして下さい。

※ 外部クロック(T0CKI)から入力する場合、ピンの割り付け(マッピング)をRPINR4レジスターにて
  設定を行う必要が有ります。

TIMER1/3
Timer1 モジュールは 16 ビットのタイマ/カウンタで、
外部からクロックを入力するか、外部のオシレータから入力するか、
それとも内部のシステム周波数クロック(Fosc又はFosc/4)を利用するのか選択出来ます、
タイマー動作の他に、ECCP1モジュールのキャプチャ/コンペア機能のクロック源でも使用されます。

詳しい設定や概要は18F25K22での記事ですが、こちらを参考にして下さい。

※ ゲート制御信号(T1G/T3G)を入力する場合、ピンの割り付け(マッピング)をRPINR12/13レジスター
  にて設定を行う必要が有ります。


TIMER2/4
Timer2 モジュールは 8 ビットのタイマ/カウンタで、タイマー動作の他に、CCP1モジュールの、PWMモード時の動作のタイム ベースとして使用されます。

詳しい設定や概要は18F25K22での記事ですが、こちらを参考にして下さい。

SPI(MSSP)
SPIについては、12F1822での記事ですがレジスタの使い方等は同じ様に利用出来ます、こちら
参考にして下さい。

18F26J50にはMSSP機能が2個(SSP1/2)有ります。
SSP1(SDI1:26番ピン/SDO1:18番ピン/SCK1:25番ピン)は、5.5Vトレラントになっています。
なので5.5Vデバイスと接続する場合はSSP1を利用します。
SSP2の入力ピン(SDI2/SCK2/SS2)の場合、ピンの割り付け(マッピング)をRPINR21-23レジスターに
設定を行い、出力ピン(SDO2/SCK2)は、RPOR9/10レジスターにて設定を行います。
又、SDIはデジタル入力、SDO/SCKはデジタル出力とピンの状態を設定します。

I2C(MSSP)
I2Cについては、12F1822での記事ですがレジスタの使い方等は同じ様に利用出来ます、こちら
参考にして下さい。

18F26J50にはMSSP機能が1個(SSP1)有ります。
SSP1(SDA1:26番ピン/SCL1:25番ピン)は、5.5Vトレラントになっています。
又、割り当てた2つのピン(SDA1/SCL1)はデジタル入力と設定して下さい。

USART(EUSART)(非同期モード)
USARTについては、12F1822/16F628Aでの記事ですがレジスタの使い方等は同じ様に利用出来ます、こちらを参考にして下さい。

18F26J50にはEUSART機能が2個(USART1/2)有ります。
USART1(TX1:17番ピン/RX1:18番ピン)は、5.5Vトレラントになっています。
なので5.5Vデバイスと接続する場合はUSART1を利用します。
USART2の入力ピン(RX2)は、ピンの割り付け(マッピング)をRPINR16レジスターに設定し、
出力ピン(TX2)は、RPOR5レジスターにて設定を行います。
又、RXはデジタル入力、TXはデジタル出力とピンの状態を設定します。

RTCC
リアルタイムクロック(日付時刻管理)を行う為のモジュールです、
こちらで記事にしています参照下さい。

USB
USBを使用する場合は、VUSB端子に電源3.0V-3.6Vを接続します。
また、USBクロック周波数はシステムクロックとは別で、48MHz(FullSpeed)/6MHz(LowSpeed)を使う、
尚、切替えはUCFGレジスターのFSENビット(1:48MHz 0:6MHz)で行う。

RC4(D-/VM)/RC5(D+/VP)ピンをUSB端子で使用しますが、デジタルでの使用は入力のみ可能で
出力は不可です。

USBの記事は、18F14K50での記事ですがこちらに有ります。
(その内に18F26J50でも記事にしたいとは思っていますがぁ...)


その他
全ての割り込みには、IPR1-IPR3レジスターにて高低レベルの割り込み順位優先度が付けられます。
初期デフォルトでは全ての割り込みが「高」に設定されています。




【きむ茶工房ガレージハウス】
Copyright (C) 2006-2015 Shigehiro Kimura All Rights Reserved.