16F1786覚書

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


忘れないうちにメモします。
ここでの記載はMPLAB X V4.10
MPLAB(R) XC8 C Compiler Version 1.40を使用しての内容です。
マイクロチップのPIC16F1786のサイトはこちらです。
データシートはこちらです。
記述はPIC16F1786ですが、16F178x系で参考になると思います。

このPICは、高度なアナログフラッシュマイコンと呼びアナログ機能に特化されています
12ビットのA/Dモジュール(差動入力有り)、オペアンプ8ビットDACと、
分周したシステムクロックを出力するCLKR(Reference Clock Module)に、
PSMC(Programmablse Switch Mode Control)で高度なPWM機能な所が目新しいようです。
後ぉ、コンパレータに出力発振の抑制用"ゼロ遅延フィルター"が付いた様です。
それとぉ、全てのピンで割り込みが可能な様です。

内蔵発振回路
PICの内部に付いているクロック周波数回路は4MHz/8MHz/16MHz/32MHzを利用出来る。
また、32MHZにする場合は、内部・外部クロックとも8MHzにして内蔵PLL回路を通す必要がある。

内部クロックを利用する場合
コンフィギュレーションを
#pragma config PLLEN = OFF , FOSC = INTOSC
にして
OSCCONレジスターにて使用する周波数を設定します。
OSCCON = 0b01111010 ;
緑の数字部分が内部クロックを使用する時の設定です。
"01"にするとTimerOSCがFOSCとなります。
赤い数字部分を変更する事により周波数を変更できます。
それ以外の数字部分はそのまま使用する。
1111 16MHz
1110 8MHz
1101 4MHz
1100 2MHz
1011 1MHz
その他 500KHz/250KHz/125KHz 62.5KHz/31.25KHz/31KHz

内部クロック32MHzを利用する場合(4xPLLで動作)
コンフィギュレーションを PLLEN = ON , FOSC = INTOSC にして
OSCCON = 0b01110000 として 8MHz x 4倍 で動作させます。

外部クロック(プライマリ外部オシレータ)を利用する場合
MAX20MHzまでで、32MHzにしたい場合は4xPLLを通す。
コンフィギュレーションを FOSC = HS にして
OSCCON = 0b00000000 として動作させます。

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

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

CONFIG1
 FCMEN      :外部クロックの監視ビット
                    ON = 外部オシレータに障害が発生した場合に内部オシレータに切替えるか監視する
                    OFF= 外部クロックの監視はしない
 IESO         :内部・外部クロック切り換えビット(2段階起動モード)
                    ON = 内部から外部クロックへの切替えで起動を行う
                    OFF= 内部から外部クロックへの切替えでの起動はしない
 CLKOUTEN:クロック出力の有無設定ビット
                    ON = CLKOUTピンは有効とする
                    OFF= CLKOUTピンは無効、RA6ピンとして使用する
 BOREN      :電源電圧がBORVより下がったらリセットを行うかの設定ビット
                    ON = 電源電圧降下常時監視機能は有効とする
                    OFF= 電源電圧降下常時監視機能は無効とする
                    NSLEEP = 動作時に有効、スリープ中に無効にする
                    SBODEN= BORCONレジスタのSBORENビットで制御する
 CPD          :データメモリー保護の有無設定ビット
                    ON = データメモリーの保護を行う
                    OFF= データメモリーの保護はしない
 CP            :プログラムメモリー保護の有無設定ビット
                    ON = プログラムメモリーの保護を行う
                    OFF= プログラムメモリーの保護はしない
 MCLRE      :MCLR/VPP ピン機能選択ビット
                    ON = ピンはMCLR(外部リセットピン)として機能する
                    OFF= ピンはデジタル入力ピン(RE3)として機能する
                    LVP=ONの場合はこのビットは無視される。
 PWRTE      :パワーアップタイマの有無設定ビット
                    ON = 電源ONから64ms後にプログラムを開始する
                    OFF= パワーアップタイマは無効とする
 WDTE        :ウォッチドッグタイマの有無設定ビット
                    ON = ウォッチドッグタイマを有効にする
                    OFF= ウォッチドッグタイマを無効にする
                    NSLEEP = 動作時に有効、スリープ中に無効にする
                    SWDTEN= WDTCONレジスタのSWDTENビットで制御する
 FOSC        :オシレータ選択ビット
                    ECH      = 外部発振器(ECモード)で高い周波数(4-32MHz)を使用する
                    HS        = 外部振動子で高い周波数(MAX20MHz)を使用する
                    INTOSC = 内部クロックを使用し、CLKINピン(RA7)はデジタルピンとする
                    ほかにRCオシレータや外部クロック利用等有るが詳しくはデータシート参照。

CONFIG2
 LVP          :低電圧プログラミング機能の有無設定ビット
                    ON = 低電圧プログラミングを行う
                    OFF= 低電圧プログラミングは行わない
 LPBOR      :低消費電力ブラウンアウトリセットの有無設定ビット
                    ON = 電源電圧が一定の電圧(2.1V付近)より下がったらリセットを行う
                    OFF= 低消費電力ブラウンアウトリセットは無効とする
 BORV        :電源電圧降下常時監視の電圧設定ビット
                    HI = リセット電圧(VBOR)のトリップポイントを高(2.7V)に設定する
                    LO = リセット電圧(VBOR)のトリップポイントを低(2.45V)に設定する
 STVRENR  :スタックがオーバフローやアンダーフローしたらリセットを行うかの有無設定ビット
                    ON = リセットを行う
                    ON = リセットを行なわない
 PLLEN      :4xPLLを動作させるかの有無設定ビット
                    OFF= 動作させない
                    ON = 動作させる(クロックを32MHzで動作させる場合に使用)
                    OFFにして、OSCCONレジスタのSPLLENビットでも設定可能
 VCAPEN    :低ドロップアウト(LDO)電圧レギュレータ
                    OFF= VCAPピンで使用しない、RA6はデジタルピンとする
                    ON = RA6ピンをVCAPピンで使用する
 WRT        :8KWのフラッシュメモリ自己書き込み保護ビット
                    OFF   = 保護しない
                    BOOT= 000h-1FFhを書込み保護にし、200h-1FFFhをPMCON制御によって変更可能
                    HALF = 000h-FFFhを書込み保護にし、1000h-1FFFhをPMCON制御によって変更可能
                    ALL   = 000h-7FFhを書込み保護にし、PMCON制御によるアドレス変更を不可にする

CLKR(Reference Clock Module)
CLKOUTは"CLKOUTEN"のコンフィグレーションビットを"ON"にすればFosc/4のクロックを
[RA6]ピンから出力出来てどのPICにも付いている機能ですが、CLKRはシステムクロックを分周して
CLKRピン(RB2)から出力出来る機能で、デュティ比も設定可能です。
又、CLKOUTは外部のHSオシレーターモードではOSC2ピンとして使用する為に出力出来ませんでしたが
CLKRは"CLKR"ピン(RB2)が別に有るので、全てのオシレーターモードで出力可能です。

CLKRCONレジスタの構成
ビット








機能
CLKREN
CLKROE
CLKRSLR
CLKRDC
CLKRDIV

CLKREN[7]:リファレンスクロックモジュールイネーブルビット
 1=モジュールを有効にする(他の場所を設定後有効にする)
 0=モジュールを無効にする

CLKROE[6]:リファレンスクロック出力イネーブルビット
 1=CLKRピン(RB2)からクロックを出力する
 0=CLKRピン(RB2)からクロックの出力は無効

CLKRSLR[5]:リファレンスクロックのスルーレート制御のイネーブルビット
 1=スルーレート制限が有効
 0=スルーレート制限が無効

CLKRD[4:3]:リファレンスクロックデューティサイクルビット
 00=クロック出力デューティサイクル0%
 01=クロック出力デューティサイクル25%
 10=クロック出力デューティサイクル50%
 11=クロック出力デューティサイクル75%

CLKRDIV[3:0]:基準クロック分周器のビット
 000=基本クロック値(常にシステムクロックのデューティ・サイクルに等しくなります)
 001=1:2(25/75%のデューティサイクルの精度は、Foscのデューティサイクルに依存)
 010=1:4
 011=1:8
 100=1:16
 101=1:32
 110=1:64
 111=1:128
  デューティ比は50%で、分周は1:8だからFosc/8の出力例
  CLKRCON = 0b01010011 ;
  CLKREN  = 1 ;
※ ANSELB/TRISBレジスタでRB2ピンをデジタル出力と設定する必要が有ります。
※ 16MHz以上は出力出来ません、
  例えば、Fosc=32MHzで分周比Fosc/1(32MHz)はダメです、Fosc/2(16MHz)はOKとなります。

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

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

クロック 4MHz __delay_us(50462464) __delay_ms(50462)
クロック 8MHz __delay_us(25231232) __delay_ms(25231)
クロック16MHz __delay_us(12615616) __delay_ms(12615)
クロック32MHz __delay_us(6307808) __delay_ms(6307)

※ delayに付いての少し詳しい話はこちらを参照下さい。

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

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

RE3
 MCLRをDisable(禁止)にしI/OのRE3の入力端子とした方が良いでしょう。
 __CONFIG(MCLRE_OFF)、__CONFIG(LVP_OFF) を記述すればDisableに出来ます。
 但し、プルアップが無効になるので利用する場合は別途プルアップをONさせる必要が有ります。

I/Oポート
16F1786には新たなI/Oポートを制御するレジスタが追加されています。
以下?には "A" ・"B"・ "C" 文字が入ります。

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

スルーレート制御
 SLRCON?レジスタの各ピンに該当するビットをONにする事により、その対応するポートピンの
 駆動スルーレートを変更できます。
 立ち上がり時間の速い矩形波をオペアンプに入力し増幅すると出力波形は変化速度が追いつかず
 傾いた波形になる事が有るのでこのような時にスルーレートを変更出来る様になっている様です。
 デフォルトは制限が掛かっているので早い立ち上がりが欲しい場合は変更しないとダメかもね。
 1 = ポートピンのスルーレートを制限する(デフォルト値)
    (波形エッジの立上り/立下りが緩やかになります)
 0 = ポートピンのスルーレートを最大にする

入力しきい値制御
 INLVL?レジスタは入力ピンのON/OFF判断電圧値のしきい値を制御します。
 1 = ポートの読み出しと状態変化割り込みに使うST(ショットトリガ)入力(デフォルト値)
 0 = ポートの読み出しと状態変化割り込みに使うTTL入力

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

・ 初期値のピン割り当てがアナログ入力となっています。
  ANSELA/ANSELB/ANSELC レジスタの各ピンに該当するビットをクリアすればデジタル入力として
  使う事が出来ます。

・ PIC内部プルアップ抵抗の使い方は?
  16F1786では全てのピンで内蔵プルアップが使用出来ます。
  使用する場合は、下記のレジスターにて設定する必要があります。
  OPTION_REG = 0b00000000 ; 赤い所とするとプルアップを使用しないです。
  デフォルトは内蔵プルアップは使用しないです。 (nWPUEN = 0 と記述する事をお勧めします。)
  また、使用する場合は何れのピンをプルアップするのかを指定する必要が有ります。
  WPUA = 0b00000001 ; この設定でRA0のみ内部プルアップ抵抗を使うです
              右のビットから左へ RA0〜RA' の順番です。
  WPUB = 0b00000001 ; この設定でRB0のみ内部プルアップ抵抗を使うです
              右のビットから左へ RB0〜RB7 の順番です。
  WPUC = 0b00000001 ; この設定でRC0のみ内部プルアップ抵抗を使うです
              右のビットから左へ RC0〜RC7 の順番です。
  WPUE = 0b00001000 ; この設定でRE3(MCLR)のみ内部プルアップ抵抗を使うです
              (MCLRピン設定ならプルアップされています)

PIC16F1786ピン構成図

A/Dコンバーター
PIC16F1786のADCは、従来のシングルエンド入力と差動入力も出来る様になっていて12ビットADCです

差動信号を変換する場合、チャネルの負の入力はADCON2レジスタのCHSN [3:0]ビットで選択されます
ADCONOレジスタのCHS [4:0]ビットは、どの正のチャネルが選択されているかを決定します。
任意の正の入力を任意の負の入力とペアにして、差動チャンネルを決定する事が出来ます。
ADCのデフォルト動作は差動入力です、CHSN [3:0]=1111の時、シングルエンドADCコンバータです。

又、変換データのフォーマットは、2の補数フォーマット、絶対値と符号付きフォーマットです。

ADCのサンプルプログラムはシングルエンド入力ですが、こちらからダウンロードして下さい。

D/Aコンバーター
PIC16F1786のDACは、8ビットなので256レベルの電圧レンジとなります。

DAC(Digital-to-Analog Converter)モジュールの使い方はこちらを参照して下さい。

DAC1CON0レジスタの構成
ビット
機能 DAC1EN
DAC1OE1 DAC1OE2 DAC1PSS
DAC1NSS

DAC1EN[7]:DACモジュールの有効無効指定ビット
 1=モジュールを使用する
 0=モジュールを使用しない

DAC1OE1[5]:DAC電圧をピン1(RA2)に出力するのかを指定するビット
 1=DAC電圧レベルをDAC1OUT1 ピンにも出力する
 0=DAC電圧レベルをDAC1OUT1 ピンから切り離す

DAC1OE1[4]:DAC電圧をピン2(RB7)に出力するのかを指定するビット
 1=DAC電圧レベルをDAC1OUT2 ピンにも出力する
 0=DAC電圧レベルをDAC1OUT2 ピンから切り離す

DAC1PSS[3:2]:+側のソース電圧選択ビット(VSOURCE+)
 00=PIC接続の+電源(VDD)を選択する
 01=VREF+ ピン(RA3)
 10=PIC内蔵の固定電圧 FVR(1.024V/2.048V/4.096V)を選択する
 11=予約済み(使用不可)

DAC1NSS[0]:−側のソース電圧選択ビット(VSOURCE-)
 0=PIC接続の−電源(VDD)を選択する
 1=VREF- ピン(RA2)

※ DAC1OUT1とDAC1OUT2の出力は同じ電圧値が出力されます。

DAC1CON1に電圧リファレンス値を8ビット(0-255)で設定します。
このレジスタで256レベル(8ビット)の電圧レンジに切り替えます、なので0〜255を設定する。
出力する電圧の計算は、
 出力電圧 = ((VSOURCE+) - (VSOURCE-))*(DAC1CON1/(2^8)) + VSOURCE-
 VSOURCE+ = 5V  VSOURCE- = 0V  DACCON1 = 13 ならば 5V*(13/2^8)=0.25390V

OPA(オペアンプ)機能
16F1786は設定可能な2個のレールツーレールオペアンプが有ります。
このオペアンプモジュールは標準的な3端子デバイスで、動作には外部帰還が必要です。
I/Oポート経由での外部接続とFVR/DACからの接続が可能です。
DACから接続可能と言う事はバッファとして扱えると言う事になります、
その辺の記事は、セッピーナさんの「PIC/16F1705のオペアンプをDACのバッファとして使ってみた」を
参照下さい。
尚、このオペアンプはユニティゲインモードが無いので反転入力をOPAxINピンに内部で接続出来ません。

コンパレータ機能
コンパレータモジュールは4個有り、+ピンは各2ピン、−ピンは各4ピン有ります。
以下は、16F1786のコンパレータに新しく追加になったフィルターらしい。

20.9 ゼロ遅延フィルター
高速動作および適切な回路条件下では、コンパレータ出力が発振する可能性があります。
この振動は、この信号に依存するハードウェア及びソフトウェアに悪影響を及ぼす可能性があります。
したがって、コンパレータ出力にデジタルフィルタが追加され、コンパレータの出力発振が抑制されます。
コンパレータの出力が変化すると、公称20nsの間、出力が変化を逆転する事が防止されます。
これにより、他の依存デバイスに影響を与えずにコンパレータ出力を安定させる事が出来ます。
図20-3(データシートの191頁)を参照して下さい。

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

PWMモード
 PWMのサンプルプログラムは、Timer2とCCP1の例です。
 半固定抵抗でLEDの明るさを可変させるサンプルは、こちらからダウンロードして下さい。
 矩形波を発生させるサンプルは、こちらからダウンロードして下さい。

キャプチャモード
 キャプチャモードの周波数発生源はTimer1です。
 キャプチャ機能の話は、PIC16F1829での記事ですがこちらを参考にして下さい。

コンペアモード
 コンペアモードの周波数発生源はTimer1です。
 コンペア機能の話は、こちらを参考にして下さい。

CCP1SEL:CCP1ピンの選択
 0=RC2(デフォルト)
 1=RB0

CCP2SEL:CCP2ピンの選択
 0=RC1(デフォルト)
 1=RB3

CCP3SEL:CCP3ピンの選択
 0=RC0(デフォルト)
 1=RB5

TIMER0
Timer0 モジュールは 8 ビットのタイマ/カウンタです。
Timer0はTimer1のゲート制御にも使われます。

TIMER0のサンプルプログラムはこちらからダウンロードして下さい。
また、概要は12F675(4MHz)での記事ですが、こちらを参考にして下さい。

TIMER1
Timer1 モジュールは 16 ビットのタイマ/カウンタで、
タイマー動作の他に、CCPモジュールのキャプチャ/コンペア機能でも使用されます。
また、Timer0からのオーバフロー・外部ピン・コンパレータ出力からの信号によるゲート制御機能が
追加されています、これによりパルスカウントやサイクル時間の測定が可能と思われますが、
ここではこの機能には触れません。

TIMER1のサンプルプログラムはこちらからダウンロードして下さい。
また、概要は12F675(4MHz)での記事ですが、こちらを参考にして下さい。
ただ、T1CONの設定とワンカウントの時間計算が少し異なります。

T1CONの設定
 T1CON = 0b00000001 ;
 青数字部分でTimer1のクロックソースを選択します。
  00 = Fosc/4  01 = Fosc  10 = 外部入力(T1CKI)又は、セカンダリオシレータ
 緑数字部分でプリスケーラの設定を行います。
  00 = 1:1  01 = 1:2  10 = 1:4  11 = 1:8
 黄色数字部分でセカンダリオシレータ回路を有効無効に出来ます。
 紫色数字部分でTimer1をシステムクロックに同期させるか指定します。
 赤数字部分 1=TIMER1を動作させる 0=TIMER1を動作させない

ワンカウントの時間計算
システムクロックが8MHzとする場合での計算
・クロックソースが 00 = Fosc/4 でプリスケーラの設定が 11 = 1:8 なら
  ((1/8MHz)x 4)x8 = 4us
・クロックソースが 01 = Fosc でプリスケーラの設定が 11 = 1:8 なら
  (1/8MHz)x 8 = 1us

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

TIMER2のサンプルプログラムはこちらからダウンロードして下さい。
また、概要は16F1827での記事ですが、こちらを参考にして下さい。

T2CONの設定
 T2CON = 0b00000100 ;
 青数字部分でプリスケーラの設定を行います。
  00 = 1:1  01 = 1:4  10 = 1:16  11 = 1:64
 緑数字部分 1:TIMER2を動作させる 0:TIMER2を動作させない
 赤数字部分でポストスケーラの設定を行います。
1:1 1:2 1:3 1:4 1:5 1:6 1:7 1:8 1:9 1:10 1:11 1:12 1:13 1:14 1:15 1:16
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

PSMC機能(Programmablse Switch Mode Control)

PSMC機能は16ビットタイマーで、クロックはシステムクロックとは別に動作する64MHzを持っています
従来の8ビットPWMのECCPやCWG/COG機能と同じ様な感じですがぁ、
PSMCの方が高性能PWM生成器(30Hz-8MHz位までは生成可能)となります。
PSMCの記事はこちらを参照下さい。

C(MSSP)
I2Cについては、12F1822での記事ですが同じ様に利用出来ます、こちらを参考にして下さい。

16F1786はSCL(SCK)=RB7/RC3とSDA(SDI)=RB6/RC4のいづれかに割り当てる必要が有ります。
それにピンは必ずプルアップ抵抗(10KΩ)を取り付けます。(内部プルアップでもOK)
SCKSEL:1=RB7 0=RC3(デフォルト) // ピンは入力に割り付ける
SDISEL:1=RB6 0=RC4(デフォルト) // ピンは入力に割り付ける

※ MSSPモジュールは1個なので、I2Cを利用する場合SPIは使用出来ません。
※ 16F178xで動作するI2Cライブラリ(skI2Clib)はこちらのページに有ります。
  (RC3/4以外のピンを使う場合は、I2Cライブラリを呼ぶ前に割り付けを行う必要が有ります)

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

16F1786はSCK=RB7/RC3にSDI=RB6/RC4とSDO=RB5/RC5のいづれかに割り当てる必要が有ります。
SCKSEL:1=RB7 0=RC3(デフォルト) // ピンは出力に割り付ける
SDISEL:1=RB6 0=RC4(デフォルト) // ピンは入力に割り付ける
SD0SEL:1=RB5 0=RC5(デフォルト) // ピンは出力に割り付ける

※ MSSPモジュールは1個なので、SPIを利用する場合I2Cは使用出来ません。
※ 16F178xで動作するSPIライブラリ(skSPIlib)はこちらのページに有ります。
  (RC3/4/5以外のピンを使う場合は、SPIライブラリを呼ぶ前に割り付けを行う必要が有ります)

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

16F1786はTX=RB6/RC6とRX=RB7/RC7のいづれかに割り当てる必要が有ります。
TXSEL:1=RB6 0=RC6(デフォルト) // ピンは出力に割り付ける
RXSEL:1=RB7 0=RC7(デフォルト) // ピンは入力に割り付ける

SPBRGレジスタの設定値とボーレートの関係はデータシートを参照して下さい。
16F1786のデータシートはこちらの350ページを見て下さい。

※ 16F178xで動作するUARTライブラリ(skUARTlib)はこちらからダウンロード出来ます。
※ UARTライブラリ(skUARTlib)の関数説明はこちらのページに記載しています。

その他




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