18F26K80覚書

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


忘れないうちにメモします。
ここでの記載はMPLAB X V4.10
MPLAB(R) XC8 C Compiler Version 1.40を使用しての内容です。
データシートはこちら からダウンロードしましょう。
(ここで使用した18F26K80デバイスのシリコンリビジョンは"A6"です。)

特徴
・PIC18F26K80はECAN(CAN 2.0B)通信モジュールを内蔵した高性能8ビットMCUです。
・2個の内蔵電圧レギュレータ(CORE用3.3Vとスリープ用)
・色々とぉ、電力を抑える為の仕掛けが施されている様な感じぃ。
・電源は1.8V-5.5Vで、バッテリーアプリケーションに最適な超低電力スリープモード。

 「PIC18F26K80ファミリは、費用対効果の高い、高性能で堅牢な周辺機器を
  小型パッケージに収めた低消費電力CANソリューションに最適です」
 らしい。

18F26K22と18F26K80の比較

下記に比較データを記載、18F26K22と同じ様な操作では有るがぁ、全く別のデバイスと思った方が
良さげぇってぇ感じぃ。

PIC18F26K22と18F26K80の周辺モジュール違い
18F26K22と18F26K80の機能比較
ECCPはECCP1のみなので、Full/Halfの何方かが利用可能です。
18F26K22では10ビットだったADCが、12ビットになっている。
(18F26K80のアナログは差動入力が出来る様になっています)

※ ADCにはエラッタが有ります。
 「12-bltのA / D性能は、データシートのA/Dコンバータの仕様外です。
  12-bt A/Dとして使用する場合、考えられる問題は高オフセット誤差です。
  A/Dは最大225 LSBsまでの高いオフセット誤差を持つ事があります。
  12ビットA/D問題はこのパートの将来の改訂(A7レビジョン以降?)で修正される予定です。」

18F26K22ピン構成図
PIC18F26K22ピン構成図

18F26K80ピン構成図
18F26K80ピン構成図
緑色は18F26K22と同じ機能です、
水色はピン名称が異なるが同様のモジュールです。
その他は新機能かピン割り当て変更でしょう。
VCAP の6番ピンは、内蔵レギュレータ用に10uF(16V)のセラミック(タンタル)コンデンサーを
取り付けましょう。
(但し、18LF26K80時は0.1uFコンデンサーを取り付けます)
なので、6番ピン割り付けだったRA4は利用出来ません。
ULPWUの2番ピは、SLEEPから復帰する際に過度の電流消費を伴わずにウェイクアップさせる場合に
使用する様である。

内蔵発振回路
PICの内部に付いているクロック周波数回路は1/2/4/8/16MHz、32/64MHzを利用できる。
また、内部クロックで64(32)MHZにする場合は、16(8)MHzにして内蔵PLL回路を通す必要がある。
外部クロックは64MHzまでOKの様で、4xPLL使用する場合は4-16MHzのみOKです。

内部クロックを利用する場合
コンフィギュレーションを PLLCFG = OFF , FOSC = INTIO2 にして
OSCCONレジスターにて使用する周波数を設定します。
OSCCON = 0b01110010 ;
緑の数字部分が内部クロックを使用する時の設定です。
赤い数字部分を変更する事により周波数を変更できます。
それ以外の数字部分はそのまま使用する。
111 16MHz
110 8MHz
101 4MHz
100 2MHz
011 1MHz
その他 500KHz/250KHz/31KHz

内部クロック32MHzを利用する場合(4xPLLで動作)
コンフィギュレーションを PLLCFG = OFF , FOSC = INTIO67 にして
OSCTUNEレジスターのPLLEN = 1 とする。
OSCCON = 0b01100000 とし 8MHz x 4倍 で動作させます。

外部クロック(プライマリ外部オシレータ)を利用する場合
コンフィギュレーションを FOSC = HSMP(4-16MHz) か HSHP(16MHz以上) にして
OSCCON = 0b00000000 として動作させます。
(コンフィギュレーションの PRICLKEN=ON で OSCCON2レジスタの PRISD=1 となっていないと
だめですよ、尚、PLLCFG = ON とした場合は4xPLLが動作します)

また、プライマリとは別にセカンダリ外部オシレータとして、
外付けの32.768 kHz 水晶振動子を駆動出来ます、って事はRTC(リアルタイムクロック)が実現出来そう。

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

オレンジ色の文字(設定値)がデフォルト値です。
CONFIG1L
 RETEN   :超低電力レギュレータの有効/無効ビット
         超低電力レギュレータはデバイスがスリープモード時に使用されます。
         OFF = 超低電力レギュレータを無効にする(WDTCON[7]:REGSLPによって制御)
         ON = 超低電力レギュレータを有効にする(WDTCON[4]:SRETENによって制御)
 INTOSCSEL :LF-INTOSC低電力イネーブルビット
         HIGH = スリープ中の高電力モードでのLF-INTOSC
         LOW = スリープ中の低電力モードでのLF-INTOSC
 SOSCSEL  :セカンダリクロックの動作モードを選択するビット
         HIGH = 高電力SOSC回路モード
         LOW = 低電力SOSC回路モード
         DIG = SCLKIモードとRC0/RC1ピンをデジタルピンとする
 XINST    :拡張命令セットイネーブルビット
         ON = 命令セット拡張とインデックス付きアドレッシングモードが有効
           ("ON"オプションは"XC8 C Compiler Version 1.40"ではサポートされていない)
         OFF = 命令セット拡張およびインデックス付きアドレッシングモードは無効
           (レガシーモード)
CONFIG1H
 FOSC  :オシレータ選択ビット
       INTIO2 = 内部でCLKOUT使用しない  INTIO1 = 内部でCLKOUT出力有り
       HS1 = 外部で高い振動子(4-16MHz)を使用する
       HS2 = 外部で高い振動子(16MHz-25MHz)を使用する
       ほかにRCオシレータや外部クロック利用等有るが詳しくはデータシート参照
 PLLCFG :外部プライマリオシレータの周波数を4倍で使用するしないの設定
       ON = 使用する OFF = 使用しない(ソフト:PLLENで制御可能)
 FCMEN  :外部オシレータに障害が発生した場合に内部オシレータに切り替えるかモニターする
       ON = 有効にする OFF = 無効にする
 IESO   :内部オシレータで起動しその後外部オシレータで起動する2段階起動モードの使用許可
       ON = 有効にする OFF = 無効にする

CONFIG2L
 PWRTEN :パワーアップ タイマ有効無効(電源ONから後65.5msにプログラムを開始する)
       ON = 有効にする OFF = 無効にする
 BOREN :電源電圧が下がったらリセットを行うかの設定
       OFF = 無効(ソフトで制御不可) ON = 有効(ソフトで制御する)
       SBORDIS = 有効(ソフトで制御不可)
       NOSLP = 有効だがスリープ時は無効になる(ソフトで制御不可)
 BORV  :どの電圧まで電源が下がったらリセットするのぉ
       3(1.8V)、2(2.0V)、1(2.7V)、0(3.0V)
 BORPWR :電源監視時の電源モードを選択します。
       ZPBORMV = ゼロパワー電流(2.0Vで監視、リセットしない)
       HIGH = 高パワー電流(3mA)(BORVで監視、リセットする)
       MEDIUM = 中パワー電流(750nA)(BORVで監視、リセットする)
       LOW = 低パワー電流(200nA)(BORVで監視、リセットする)

※ BORENでON/NOSLPを利用する場合にエラッタが有ります。
 「ブラウンアウトリセットモジュール(BOR)がディスエーブルされてから再びイネーブルされると、
  予期せぬリセットが発生する事があります。」
  BORENを有効にしたい場合はSBORDISを使い、消費電力が問題な場合はエラッタ情報を見ましょう。

CONFIG2H
 WDTEN:ウォッチドッグタイマ使用許可
      ON = 有効(ソフトで制御する) OFF = 無効(ソフトで制御不可)
      SWDTDIS = 有効(ソフトで制御不可)
      NOSLP = 有効だがスリープ時は無効になる(ソフトで制御不可)
 WDTPS:ウォッチドッグタイマ有効時のタイマ値を設定する(設定値はデータシート参照)

CONFIG3H
 CANMX :ECANで使用するピンを選択する
       PORTB = RB2/RB3ピンを使用する
       PORTC = RC6/RC7ピンを使用する
 MSSPMSK:I2Cスレーブでアドレスの判定に使用するマスクデータのモードを選択する
       MSK7 = 7ビットモードでマスクを行う
       MSK5 = 5ビットモードでマスクを行う
 MCLRE  :MCLR ピンの有効無効を設定
       ON = 有効にする OFF = 無効にする(RE3入力ピンを有効にする)

CONFIG4L
 STVREN:スタックのアンダー・フルのオーバが発生した時にリセットを行うかの設定
       ON = リセットする OFF = リセットしない
 BBSIZ :ブートブロックのサイズを指定する
       BB2K = 2K word   BB1K = 1K word

CONFIG5L/CONFIG5H/CONFIG6L/CONFIG6H/CONFIG7L/CONFIG7H
 メモリエリアの読み書き保護を設定するビット群だがデフォルトは全て保護しないとなっている

その他の詳しい内容は [ C:\Program Files\Microchip\xc8\v1.40\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)
クロック64MHz __delay_us(12320) __delay_ms(12)

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

MCLR
 外部リセット信号を入力する場合のピンとして使用。
 リセット信号はLOW(0V:GND接続)でリセットが掛かります。
 リセットスイッチを付けない場合は、VDDに接続でも構わない。

RE3
 MCLRをDisable(禁止)にしI/OのRE3の入力端子とした方が良いでしょう。
 __CONFIG(MCLRE=OFF) を記述すればDisableに出来ます。

※ MCLRをDisableで利用する場合にエラッタが有ります。
 「PIC18F2XK80系でMCLREがオフに設定されていると、RE3ピンから読み出せません。
  MCLRピンはディセーブルされますが、入力データはRE3で使用できなくなります。」

I/Oポート

オープンドレイン制御
通常ポート出力ピンは電流のソースとシンクが可能な標準のプッシュプルドライバですが、
いくつかの周辺装置の出力ピンには、構成可能なオープンドレイン出力オプションも装備されています。
これにより、周辺装置は外部プルアップ電圧と通信する事が出来ます。
オープンドレインオプションは、データ及びクロック出力に関連するポートピンで実装されています。
実装されている周辺機器は、USART(TX1/TX2)、SPI(SDO/SCK)、CCP(CCP1/2/3/4)モジュールです。
オープンドレインを有効にするレジスタは、"ODCON"で行います。

スルーレート制御
PORTA/PORTBの出力スルーレートは、EMIを最小限に抑える為に、
標準トランジションレート又は標準トランジションタイムの10%のトランジションレートのいずれかを
選択する様にプログラムする事が出来ます。

SLRCONレジスタのスルーレート制御ビット
PORTAはSLRCON[0]ビットでPORTBはSLRCON[1]ビットに割り付けられています。
1 = ポートのすべての出力ピンが標準レートの0.1でスルーします
0 = ポートのすべての出力ピンが標準レートでスルーします


・ I/Oポートに入出力を行う際の注意点
  I/Oポートへ高速クロックで連続的に入出力を繰り返した場合に上手く入出力が出来ない場合が
  有ります、そんな時はPORTAレジスタで入力し、LATAレジスタで出力します。

・ 初期値のピン割り当てがアナログ入力となっています。
  ANCON0/1 レジスタの各ピンに該当するビットをクリアすればデジタル入力として使う事が
  出来ます。
  アナログの操作方法は、”可変抵抗のツマミを回してLEDの明るさを可変します”を参照下さい。

・ PIC内部プルアップ抵抗の使い方は?
  PORTBのピンで内蔵プルアップが使用出来ます。
  使用する場合は、下記のレジスターにて設定する必要があります。
  RBPU = 0 ;
  WPUB = 0b00000001 ; この設定でRB0のみ内部プルアップ抵抗を使うです
                右のビットから左へ RB0〜RB7 の順番です。

CCP機能(CAPTURE/COMPARE/PWM MODULES)
CCP機能は、キャプチャ/コンペア/PWMを行うモジュールです。
キャプチャモードでは、外部イベントの発生時間を計測する事が出来ます。
コンペアモードでは、予め設定した時間が経過した時点で外部イベントをトリガする事が出来ます。
PWMモードでは、各種周波数とデューティサイクルのパルス幅変調信号を生成出来ます。
CCP機能は、ECCP1/CCP2/CCP3/CCP4/CCP5で利用出来ます。

PWMモード
 PWM機能に付いては下記の方に記載しています。

キャプチャモード
 キャプチャモードの周波数発生源はTimer1/3です。
 キャプチャ機能の話は、PIC16F1829での記事ですがこちらを参考にして下さい。
 16F1829と18F26K80のCCPピン割当てが異なります、18F26K80ではCCP4ピンは"RC7"となります。

コンペアモード
 コンペアモードの周波数発生源はTimer1/3です。
 コンペア機能の話は、PIC16F18313での記事ですがこちらを参考にして下さい。
 18F26K80には、CCPxCONレジスタのCCPxMビットに”比較一致時に出力をトグルし、
 タイマ−カウンターもクリアする”モードが有りません、自分で割り込み処理内でクリアさせる必要が
 有ります。
 16F18313では”PPSでRA4ピンをCCP1出力に割当てる”ですが、18F26K80のCCP1には
 コンペアモードが無いので、代わりにCCP2〜CCP5の何れかを使用します。

CCP2/3/4/5(PWM)機能[標準CCP機能]
PIC18F26K80はCCP2-CCP5の4個からPWMを出力できます。
CCP2-CCP5にはそれぞれTimer2/4の何れかを使用する様にします。

CCP(PWM)の操作方法とサンプルプログラムは、
可変抵抗のツマミを回してLEDの明るさを可変します”を参照下さい。

ECCP1機能[拡張型CCP機能]
PIC18F26K80のECCP機能は、シングルPWM/ハーフブリッジPWM/フルブリッジPWM/相補出力PWMが
出来て、CCP1を使用します。

ECCP(PWM)の操作方法とサンプルプログラムは、
可変抵抗のツマミを回してLEDの明るさを可変します”を参照下さい。

TIMER0
タイマー動作機能は設定した時間毎に割込み処理を行うものです。
このタイマは8/16 ビットの切り替えが出来るタイマです。
外部クロック(T0CKI)と内部クロック(Fosc/4)が選択できます。
起動時設定は外部クロック(T0CKI)からの8ビットカウンタモードになっています。
又、T0CKIピンは18F25(26)K22では6番ピンでしたが、18F25(26)K80は26番ピンとなっています。

TIMER0の詳しい操作方法は、18F25(26)K22と同じなのでこちらを参照下さい。

TIMER0のサンプルプログラムはこちらからダウンロードして下さい。

TIMER1/3
Timer1/3 モジュールは 16 ビットのタイマ/カウンタで、タイマー動作の他に、CCPモジュールの
キャプチャ/コンペア機能でも使用されます。
外部クロック(TxCKI・SOSC)と内部クロック(Fosc・Fosc/4)が選択できます。
起動時設定は外部クロック(T0CKI)からの8ビットカウンタモードになっています。
又、T1CKIピンは18F25(26)K22では11番ピンでしたが、18F25(26)K80は7番ピンとなっています。

TIMER1/3の詳しい操作方法は、18F25(26)K22と同じなのでこちらを参照下さい。
尚、18F25(26)K22ではTIMER5が有りますが、18F25(26)K80には有りません。

TIMER1/3のサンプルプログラムはこちらからダウンロードして下さい。

※ TIMER1/3のゲート制御でエラッタが有ります。
 「タイマーのシステムクロックがFosc選択の場合、Foscの速度まで機能しません。
  結果は常にFosc/4の解像度で表示されますが、内部Foscがクロックソースとして選択されています」
  回避するには外部ピンかセカンダリクロックを使うらしい。

※ 非同期外部入力モードで動作している時エラッタが有ります。
 「TMRxH:TMRxLレジスタへの書込みが遅すぎて外部クロック・エッジが早すぎると、
  予期しない割り込みフラグが発生する事があります。」
  非同期モードを使用する必要がある場合は、問題を軽減する為にはエラッタ情報を読みましょう。

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

TIMER2/4の詳しい操作方法は、18F25(26)K22と同じなのでこちらを参照下さい。
尚、18F25(26)K22ではTIMER6が有りますが、18F25(26)K80には有りません。

TIMER2/4のサンプルプログラムはこちらからダウンロードして下さい。

SPI(MSSP)
18F26K80のMSSPモジュールは1個だけなので、SPIかI2Cの何れか一つのみ使用出来ます。

SPIについては、12F1822での記事ですがレジスタの使い方等は同じ様に利用出来ます、こちらを参考
にして下さい。(又は、16F1938用ですがこちらの日本語データシートが参考になります)

注意)12F1822と18F26K80はレジスター名が少し異なるので以下の様にプログラムを変更します。
12F1822 SSP1STAT SSP1CON1 SSP1BUF SSP1IE SSP1IF
18F26K80 SSPSTAT SSPCON1 SSPBUF SSPIE SSPIF

SPIピンは以下の様に利用します。
 SCK:14番ピン(RC3) SDI:15番ピン(RC4) SDO:16番ピン(RC5)を使用します。
 スレーブ時は SS:7番ピン(RA5)を使用します。
 SDIとSSにはデジタル入力とします。

I2C(MSSP)
18F26K80のMSSPモジュールは1個だけなので、SPIかI2Cの何れか一つのみ使用出来ます。

I2Cについては、12F1822での記事ですがレジスタの使い方等は同じ様に利用出来ます、こちらを参考
にして下さい。(又は、16F1938用ですがこちらの日本語データシートが参考になります)

注意)12F1822と18F26K80はレジスター名が少し異なるので以下の様にプログラムを変更します。
12F1822 SSP1STAT SSP1CON1 SSP1CON2 SSP1ADD SSP1MSK SSP1BUF SSP1IE SSP1IF BCL1IE BCL1IF
18F26K80 SSPSTAT SSPCON1 SSPCON2 SSPADD SSPMSK SSPBUF SSPIE SSPIF BCLIE BCLIF

I2Cピンは以下の様に利用します。
 SCL:14番ピン(RC3) SDA:15番ピン(RC4)を使用します。
 SCL/SDAはデジタル入力とします。

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

18F26K80(18FxxK80)にはUSARTが2個有ります、USARTピンは以下の様に利用します。
 TX1[送信]:17番ピン(RC6) RX1[受信]:18番ピン(RC7)を使用します。(USART1)
 TX2[送信]:27番ピン(RB6) RX2[受信]:28番ピン(RB7)を使用します。(USART2)
 RX1とRX2にはデジタル入力とします。

注意)USART1とUSART2はレジスター名が少し異なるので以下の様にプログラムを変更します。
USART1 TXSTA1 RCSTA1 SPBRG1
USART2 TXSTA2 RCSTA2 SPBRG2

SPBRGレジスタの設定値とボーレートの関係はデータシートを参照して下さい。
18F14K50のデータシートはこちらの196-198ページを見て下さい。
SYNC=0、BRGH=1、BRG16=0で16MHzのクロックで速度が9600ボーレートならSPBRG=103です。

※ USARTで同期送信モードを行う場合にエラッタが有ります。
 「同期送信モードでは、TXxlFビットを使用しTXREGxレジスタをロードするタイミングを決定すると、
  データが破壊される可能性があります。
  意図した送信メッセージの1つまたは複数が正しくない可能性があります。
  TXREGXをロードする前に固定遅延を追加しても、信頼できる回避策ではないかもしれません。
  TXREGxをロードする時は、TXxIFビットをチェックする代わりに、
  TXSTAxレジスタのTRMT blt insideがセットされていることを確認してください。
  次のコードを使用できます。
   while(!TXSTAxbits.TRM); 」
  影響を受けるシリコンリビジョン "A2"
  TXxIE/TXxIFを使用するとコンパイラー(XC8 V1.40)が、[非推奨][廃止]等のワーニングを
  出力します。


※ USARTの受信割り込みにもエラッタが有ります。
  なんだかぁ、呼び出された関数が2回実行されるらしいけどぉ、よくわかんないぉ。
  しっかりデバッグしましょう。

ECAN
ECAN(Enhanced Controller Area Network)は、"CAN 2.0B"規格準拠した通信モジュールです。
元々は、自動車内部の多重化電気配線用に設計された物なので耐ノイズ性の強化が考慮されています。

ECAN通信の記事はこちらを参照下さい。 *1)

CVREF
CVREF(comparator voltage reference)モジュール、コンパレータで使われる参照電圧ですがぁ
AN0ピンにも出力されているので従来のDACと同等の機能でしょう。


CTMU
CTMU(Charge Time Measurement Unit:充電時間計測ユニット)モジュールで、
このユニットは、定電流源を内蔵していて色々な制御が出来る様になっているので様々な
アプリケーションが開発出来ます。

18F26K80ではCTMUの比較は内部コンパレータの他に外部のコンパレータを使用出来る様に
改良されています。
その切り替えは、PADCFG1[0]ビットで行う様です。
CTMUDS:CTMUコンパレータデータ選択ビット
1 = CTMUの比較に外部コンパレータ(ピンCTDINの出力を使用)を使用します
0 = 内部コンパレータ(CMP2)はCTMUの比較に使用されます

尚、18F25K22での記事ですが、CTMUを使いタッチセンシングを行った実験はこちらを参照下さい。

その他



ECAN記事追記(*1) 2018/12/20


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