16F1705覚書

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


忘れないうちにメモします。
ここでの記載はMPLAB X V2.15
MPLAB(R) XC8 C Compiler Version 1.32を使用しての内容です。
データシートはこちらです。 *3)
(こちらのデータシートは16F1703用ですが日本語なので何かと参考になるでしょう)

このPICは、インテリジェントアナログフラッシュマイコンと呼びアナログ機能が強化されています。
COG(相補出力ジェネレータ)CLC(ロジックセルモジュール)ZCD(ゼロクロス検出)
OPA(オペアンプ)/DAC1(8Bitに強化)等です。
また、MSSP/USART等の入出力機能が好きなピンに割り当て可能(PPSモジュール)な所が目新しい様です。

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

内部クロックを利用する場合
コンフィギュレーションを
#pragma config PLLEN = OFF , FOSC = INTOSC
にして
OSCCONレジスターにて使用する周波数を設定します。
OSCCON = 0b01111010 ;
緑の数字部分が内部クロックを使用する時の設定です。
赤い数字部分を変更する事により周波数を変更できます。
それ以外の数字部分はそのまま使用する。
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倍 で動作させます。

外部クロック(プライマリ外部オシレータ)を利用する場合
コンフィギュレーションを 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ピンは無効、RA4ピンとして使用する
 BOREN       :電源電圧がBORVより下がったらリセットを行うかの設定ビット
                    ON = 電源電圧降下常時監視機能は有効とする
                    OFF= 電源電圧降下常時監視機能は無効とする
                    NSLEEP = 動作時に有効、スリープ中に無効にする
                    SBODEN= BORCONレジスタのSBORENビットで制御する
 CP            :プログラムメモリー保護の有無設定ビット
                    ON = プログラムメモリーの保護を行う
                    OFF= プログラムメモリーの保護はしない
 MCLRE       :MCLR/VPP ピン機能選択ビット
                    ON = ピンはMCLR(外部リセットピン)として機能する
                    OFF= ピンはデジタル入力ピン(RA3)として機能する
                    LVP=ONの場合はこのビットは無視される。
 PWRTE       :パワーアップタイマの有無設定ビット
                    ON = 電源ONから64ms後にプログラムを開始する
                    OFF= パワーアップタイマは無効とする
 WDTE         :ウォッチドッグタイマの有無設定ビット
                    ON = ウォッチドッグタイマを有効にする
                    OFF= ウォッチドッグタイマを無効にする
                    NSLEEP = 動作時に有効、スリープ中に無効にする
                    SWDTEN= WDTCONレジスタのSWDTENビットで制御する
 FOSC         :オシレータ選択ビット
                    HS = 外部発振器で高い振動子を使用する
                    INTOSC= 内部クロックを使用し、CLKINピン(RA5)はデジタルピンとする
                    ほかにRCオシレータや外部クロック利用等有るが詳しくはデータシート(P-48)参照。

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で動作させる場合に使用)
 ZCDDIS     :ゼロクロス検出回路の有無設定ビット
                    ON = ゼロクロス検出回路は無効、、ZCDCONのZCDSENビットで変更可能
                    OFF= ゼロクロス検出回路は常時有効とする
 PPS1WAY   :PPSLOCKビット単方向セット イネーブルビット
                    ON = PPSLOCK ビットは、ロック解除シーケンスを実行後に一度のみセットできる
                            一度PPSLOCK がセットされると、その後PPS は変更できない
                    OFF= ロック解除シーケンスを実行すれば何度でもPPSLOCKをセット/クリアできる
 WRT          :8KWのフラッシュメモリ自己書き込み保護ビット
                    OFF= 保護しない
                    BOOT= 000h-1FFhを書込み保護にし、200h-FFFhをPMCON制御によって変更可能
                    HALF= 000h-FFFhを書込み保護にし、1000h-1FFFhをPMCON制御によって変更可能
                    ALL= 000h-1FFFhを書込み保護にし、PMCON制御によるアドレス変更を不可にする

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

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

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

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

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

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

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

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

・ 初期値のピン割り当てがアナログ入力となっています。
  アナログI/O時のANSELA/Cの使い方はこちらを参照して下さい。
  ANSELA/ANSELC レジスタの各ピンに該当するビットをクリアすればデジタル入力として使う事が
  出来ます。

・ PIC内部プルアップ抵抗の使い方は?
  16F1705では全てのピンで内蔵プルアップが使用出来ます。
  使用する場合は、下記のレジスターにて設定する必要があります。
  OPTION_REG = 0b00000000 ; 赤い所とするとプルアップを使用しないです。
  デフォルトは内蔵プルアップは使用しないです。
  また、使用する場合は何れのピンをプルアップするのかを指定する必要が有ります。
  WPUA = 0b00000001 ; この設定でRA0のみ内部プルアップ抵抗を使うです
                右のビットから左へ RA0〜RA5 の順番です。
  WPUC = 0b00000001 ; この設定でRC0のみ内部プルアップ抵抗を使うです
                右のビットから左へ RC0〜RC5 の順番です。

PPS機能(PERIPHERAL PIN SELECT MODULE)
周辺モジュールの入出力を好きなピンに割り当てる事が出来る機能です、
割り当てを変更できるのはデジタル信号のみで、アナログ入出力の割り当ては変更できません。
また、不用意に割り当てが変更出来ない様にロックする事が可能な様だが....試していません。

周辺モジュールの入力側設定レジスタ名
周辺機能ピン USART-RX USART-CK SPI-SDI SPI-SS SPI-SCK I2C-SDA
デフォルトピン RC5 RC4 RC1 RC3 RC0 RC1
設定レジスタ名 RXPPS CKPPS SSPDATPPS SSPSSPPS SSPCLKPPS SSPDATPPS
周辺機能ピン COGIN CLCIN0 CLCIN1 CLCIN2 CLCIN3    
デフォルトピン RA2 RC3 RC4 RC1 RA5  
設定レジスタ名 COGINPPS CLCIN0PPS CLCIN1PPS CLCIN2PPS CLCIN3PPS
例) USARTのRXをRA5ピンから入力する場合は、 RXPPS=5 ; とする。

周辺モジュールの出力側設定レジスタ名
周辺機能
ピン名称
USART-TX USART-DT SPI-SDO SPI-SCK/I2C-SCL I2C-SDA PWM3OUT PWM4OUT
CLC1OUT
CLC2OUT CLC3OUT COGA COGB   COGC  COGD C1OUT C2OUT CPP1 CPP2
RA3ピン以外好きなピンに割り付け可能です。
尚、デフォルト設定は無い様なので必ずピンの割り付けを行う必要が有ります。
設定レジスタ名は RxxPPS  xxにはピン名のA0-A5/C0-C5を適用
例) RA5ピンからCPP1を出力する場合は、 RA5PPS=12 ; とする。

入力と出力の双方向ピン時の注意点
I2C-SDAとUSART-RX/DT(同期モード時)の信号を利用する場合は、入力PPSと出力PPSのピンを
同じ番号に合わせる必要が有ります。
I2C-SDAで例えば、SSPDATPPS=RC1、RC1PPS=SDAと言うあんばいにです。

詳しい設定値はデータシートのP139-P142を参照下さい。 *3)

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

PWMモード
 この機能についての説明とサンプルプログラムは
 「可変抵抗のツマミを回してLEDの明るさを可変します」を参照して下さい。

キャプチャモード

コンペアモード

PWM機能(PULSE-WIDTH MODULATION)
16F1705では2つのPWM出力(PWM3/PWM4)を行う事が出来ます。
この機能はCCPからPWM機能を取り出した様なものです。
PWMの周波数発生源はTimer2/4/6から選択できます、デフォルトはTimer2です。
又、PWM出力はCLCの入力源になり、PWM3OUTのみCOGの入力源となります。

尚、ハーフブリッジ/フルブリッジ機能やステアリング制御(相補PWM出力)機能等は、
相補出力ジェネレータ(COG)モジュールで行うようです。

PWMのサンプルプログラムは「可変抵抗のツマミを回してLEDの明るさを可変します」を参照して下さい。

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

ZCD(ゼロクロス検出モジュール)機能
ZCDモジュールは、A/C 信号がグランド電位と交差するタイミングを検出(AC波形監視)します。

電子工作の実験室さんのこちらにこの機能を使って、ご家庭のAC100Vの周波数をカウントする例題が
掲載されています参考にして下さい。

COG(相補出力ジェネレータ)機能
COG機能は、12F1501でCWGと呼んでいた機能にブランキングおよび位相制御を追加し拡張を
行ったモジュールの様です。
又、12F1827でのECCPモジュールと同じ様な機能で、
フルブリッジPWM/ハーフブリッジPWM/ステアリングPWM(相補PWM出力)等の制御が行えます。
後ぉ、PWMの周期に合わせて交互に信号を出力する"プッシュプルモード"も有るようです。

16F1705では入力源がPWMだけでなく、コンパレータ・CCP・CLCの出力も利用出来るようです。
また、波形の立上がり/立下り時のデッドバンドも細かく設定可能な様です。

COGのサンプルプログラムは「COG機能を動作させて見ます」を参照して下さい。

CLC(ロジックセルモジュール:)機能
16F1705には3個の構成可能なロジックセルモジュールが有ります、
この機能によりソフトウエアではなくハード的にロジック(AND/OR等)が構成出来ます。
1つのモジュールあたり4つの入力が出来、32個の選択可能な入力源(PWM/OSC/TMR/外部PIN等)
が有ります。
ロジック機能はAND-OR/OR-XOR/4-InputAND/Dフロップ/Dラッチ/SR/JKなどです。

尚、CLC機能を設計する場合に便利かもなツールがMicrochip社のこちらからダウンロード出来ます。
(HPの下の方最後にダウンロードリンクが有ります)
また、ツールのマニュアルはこちらが日本語なので良いかもね。

現在は、MPLAB X IDEのMCC機能に統合されたので上記ツールは削除されています、
詳しくはこちらを参照下さい。 *2)

CLCのサンプルプログラムは「CLC機能を動作させて見ます」を参照して下さい。

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
 黄色数字部分でセカンダリオシレータ回路を有効無効に出来ます。
 赤数字部分 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/4/6
Timer2/4/6 モジュールは 8 ビットのタイマ/カウンタで、タイマー動作の他に、
CCP(PWMモード)モジュールとPULSE-WIDTH MODULATION時の動作のタイムベースとして
使用されます。

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

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

16F1705はSDA/SCLのピンが好きな場所に割り当て可能です、この機能をPPSと言います。
例) SDAピンをRC1とし、SCLピンをRC0にマスターとして割当てる場合は?
   RC0PPS   = 0b10000 ; // 出力(SCLを割当てる)
   // I2CはSDAピンは入出力両方機能するので両方割り当てる
   SSPDATPPS= 0b10001 ; // 入力(RC1を割当てる:デフォルト)
   RC1PPS   = 0b10001 ; // 出力(SDAを割当てる)
SPI(MSSP)
SPIについては、12F1822での記事ですが同じ様に利用出来ます、こちらを参考にして下さい。

16F1705はSCK/SDO/SDI/SSのピンが好きな場所に割り当て可能です、この機能をPPSと言います。
例) SDIピンをRC1とし、SCKピンをRC0とし、SDOピンをRC2にマスターとして割当てる場合は?
   RC0PPS   = 0b10000 ; // 出力(SCKを割当てる)
   RC2PPS   = 0b10010 ; // 出力(SDOを割当てる)
   SSPDATPPS= 0b10001 ; // 入力(RC1を割当てる:デフォルト)
USART(EUSART)(非同期モード)
USARTについては、12F1822/16F628Aでの記事ですが同じ様に利用出来ます、こちらを参考にして下さい。

16F1705はTX/RXのピンが好きな場所に割り当て可能です、この機能をPPSと言います。
例) TXピンをRC4とし、RXピンをRC5に割り当てる場合は?
   RC4PPS= 0b10100 ; // 出力(TXを割当てる)
   RXPPS = 0b10101 ; // 入力(RC5を割当てる:デフォルト)
SPBRGレジスタの設定値とボーレートの関係はデータシートを参照して下さい。
16F1705のデータシートはこちらの339ページを見て下さい。 *3)

その他



リンク切れ見直し(*3) 2020/03/22
記事一部追記(*2) 2016/12/01
記事変更(*1) 2015/06/30


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